Differences
This shows you the differences between two versions of the page.
handlingevents [2015/10/03 14:54] |
handlingevents [2015/10/03 14:54] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Handling Events ====== | ||
+ | |||
+ | Handling events in FLTK is done via [[http://en.wikipedia.org/wiki/Callback_(computer_science)|callbacks]]. Unlike other alternatives, probably more suitable for C++ object oriented approach, like [[http://en.wikipedia.org/wiki/Signals_and_slots|signals and slots]], implemented in Qt, FLTK callback mechanism is fairly simple, but no less powerfull. | ||
+ | |||
+ | FLTK callbacks are one of the reasons why FLTK is so fast and has small core so edelib explores this property extensively. For example, when you receive a D-BUS message via [[http://equinox-project.org/api/edelib/classedelib_1_1EdbusConnection.html|EdbusConnection]], it will be reported via callback. The same applies when something was changed in directory, monitored with [[http://equinox-project.org/api/edelib/classedelib_1_1DirWatch.html|DirWatch]]. | ||
+ | |||
+ | ===== Example Application ===== | ||
+ | To demonstrate FLTK callbacks, here will be presented a simple application with ''Close'' button, where pressing the button will close the window. Application will use ''Window'' class from edelib. | ||
+ | |||
+ | <code cpp> | ||
+ | /* event.cpp */ | ||
+ | |||
+ | #include <FL/FL.H> | ||
+ | #include <FL/Fl_Button.H> | ||
+ | #include <edelib/Window.h> | ||
+ | |||
+ | EDELIB_NS_USING_AS(Window, MainWindow) | ||
+ | |||
+ | /* called when button is pressed */ | ||
+ | static void close_cb(Fl_Widget*, void *w) { | ||
+ | MainWindow *win = (MainWindow*)w; | ||
+ | win->hide(); | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
+ | MainWindow *win = new MainWindow(115, 60, "Demo"); | ||
+ | Fl_Button *button = new Fl_Button(15, 15, 90, 25, "&Close"); | ||
+ | |||
+ | /* register our callback */ | ||
+ | button->callback(close_cb, win); | ||
+ | |||
+ | win->end(); | ||
+ | w->show(argc, argv); | ||
+ | return Fl::run(); | ||
+ | } | ||
+ | </code> | ||
+ | As you can see, ''callback()'' function, besides a pointer to function, accepts additional parameter called ''user data''; in this case is our window object, so we can call it's memeber ''hide()'' that will close the window. | ||
+ | |||
+ | FLTK uses callbacks in many places; you can get events when window is closed, when text is modified, etc. [[http://www.fltk.org/doc-1.1/editor.html|Designing a Simple Text Editor]] chapter in FLTK documentation gives some example how to monitor changes when text is changed in editor widget. | ||
+ | |||
+ | ===== More from callbacks ===== | ||
+ | Sometimes you want to send more data to callback, other than single object. For example, callback function needs to access object who owns callbacks with additional data; you can use struct or class to pack them, but FLTK already solves named problem. | ||
+ | |||
+ | If you look carefully at above example, '''callback()''' receives two parameters: some'' Fl_Widget*'' and ''void*''; ''void*'' is used to send win object, but ''Fl_Widget*'' can be used to (implicitly) send button object. Here is how it works: | ||
+ | |||
+ | <code cpp> | ||
+ | /* event.cpp */ | ||
+ | ... | ||
+ | /* called when button is pressed */ | ||
+ | static void close_cb(Fl_Button *button, void *w) { | ||
+ | /* we can access button object too */ | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
+ | ... | ||
+ | /* register our callback */ | ||
+ | button->callback((Fl_Callback*)close_cb, win); | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||
+ | The main difference from original example is how we explicitly cast-ed callback function to '''Fl_Callback*''' and our callback function ''close_cb'' is now able to accept any Fl_Widget inherited object. If you try without that, the compiler will complain. | ||