|
|
|
#include <Wt/WApplication>
|
|
#include <Wt/WObject>
|
|
#include <Wt/WSignal>
|
|
#include <Wt/WContainerWidget>
|
|
#include <Wt/WText>
|
|
|
|
#include <csignal>
|
|
|
|
|
|
extern "C" {
|
|
void interrupt_func(int signum);
|
|
}
|
|
|
|
class CallbackWrapper;
|
|
static CallbackWrapper * device;
|
|
|
|
class CallbackWrapper : public Wt::WObject {
|
|
public:
|
|
CallbackWrapper(Wt::WObject *parent=0)
|
|
: Wt::WObject(parent),
|
|
sig(this)
|
|
{
|
|
device=this;
|
|
signal(SIGUSR1, interrupt_func);
|
|
}
|
|
|
|
Wt::Signal<>& intReceived() { return sig; }
|
|
void interrupt() { sig.emit(); }
|
|
|
|
private:
|
|
Wt::Signal<> sig;
|
|
};
|
|
|
|
void interrupt_func(int signum) {
|
|
device->interrupt();
|
|
}
|
|
|
|
|
|
|
|
class MyWidget : public Wt::WContainerWidget {
|
|
public:
|
|
MyWidget(Wt::WContainerWidget * parent=0)
|
|
: Wt::WContainerWidget(parent),
|
|
callback_wrapper(new CallbackWrapper()),
|
|
int_nr(0)
|
|
{
|
|
int_nr_text=new Wt::WText("interrupts: 0");
|
|
addWidget(int_nr_text);
|
|
addWidget(new Wt::WBreak());
|
|
|
|
callback_wrapper->intReceived().connect(this, &MyWidget::increment_int_nr);
|
|
}
|
|
|
|
void increment_int_nr() {
|
|
int_nr_text->setText(Wt::WString::fromUTF8("interrupts: {1}").arg(++int_nr));
|
|
}
|
|
|
|
private:
|
|
CallbackWrapper * callback_wrapper;
|
|
int int_nr;
|
|
Wt::WText * int_nr_text;
|
|
};
|
|
|
|
|
|
|
|
class DisplayApplication : public Wt::WApplication {
|
|
public:
|
|
DisplayApplication(const Wt::WEnvironment& env)
|
|
: Wt::WApplication(env)
|
|
{
|
|
root()->addWidget(new MyWidget());
|
|
}
|
|
};
|
|
|
|
Wt::WApplication *createApplication(const Wt::WEnvironment& env) {
|
|
|
|
return new DisplayApplication(env);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
return Wt::WRun(argc, argv, &createApplication);
|
|
}
|
|
|