diff options
| -rw-r--r-- | test/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | test/handle_events.cxx | 120 |
2 files changed, 121 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index be95c25c3..5128e08db 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -77,6 +77,7 @@ CREATE_EXAMPLE (file_chooser file_chooser.cxx "fltk_images;fltk") CREATE_EXAMPLE (fltk-versions fltk-versions.cxx fltk) CREATE_EXAMPLE (fonts fonts.cxx fltk) CREATE_EXAMPLE (forms forms.cxx "fltk_forms;fltk") +CREATE_EXAMPLE (handle_events handle_events.cxx "fltk_gl;fltk") # opt. Fl_Gl_Window CREATE_EXAMPLE (hello hello.cxx fltk) CREATE_EXAMPLE (help_dialog help_dialog.cxx "fltk_images;fltk") CREATE_EXAMPLE (icon icon.cxx fltk) diff --git a/test/handle_events.cxx b/test/handle_events.cxx new file mode 100644 index 000000000..be7a1a6e8 --- /dev/null +++ b/test/handle_events.cxx @@ -0,0 +1,120 @@ +// +// Event test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2021 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// +// compile as: fltk-config --compile handle_events.cxx + +#include <FL/Fl.H> +#include <FL/Fl_Double_Window.H> +#include <FL/Fl_Gl_Window.H> +#include <FL/Fl_Button.H> +#include <FL/names.h> +#include <stdio.h> + +// define WINDOW_TYPE as either "Fl_Gl_Window" or "Fl_Double_Window" +#define WINDOW_TYPE Fl_Double_Window + +// Class to handle events +class app : public WINDOW_TYPE { +protected: + int handle(int); +public: + // storage for the last event + int eventnum, ex, ey; + const char *eventname; + app(int X, int Y, int W, int H, const char *L = 0) + : WINDOW_TYPE(X, Y, W, H, L) { + eventname = NULL; + eventnum = 0; + } + // evaluates and prints the current event + void print_event(int ev) { + eventnum++; + ex = Fl::event_x(); + ey = Fl::event_y(); + int screen_num = Fl::screen_num(x(), y(), w(), h()); +#if defined(FL_API_VERSION) && FL_API_VERSION >= 10400 + int scale = int(Fl::screen_scale(screen_num) * 100. + 0.5); +#else + int scale = 100; +#endif + eventname = fl_eventnames[ev]; + fprintf(stderr, + "[%3d, win(%d,%d,%d,%d), screen %d, scale %3d%%] %-18.18s at (%4d, %4d)", + eventnum, x(), y(), w(), h(), screen_num, scale, eventname, ex, ey); + eventnum %= 999; + } +}; + +// Event handling +int app::handle(int ev) { + print_event(ev); // common for all events + int res = WINDOW_TYPE::handle(ev); + switch (ev) { + case FL_PUSH: + printf(", button %d down", Fl::event_button()); + res = 1; + break; + case FL_RELEASE: + printf(", button %d up", Fl::event_button()); + res = 1; + break; + case FL_MOUSEWHEEL: + printf(", dx = %d, dy = %d", Fl::event_dx(), Fl::event_dy()); + res = 1; + break; + case FL_ENTER: + case FL_LEAVE: + case FL_MOVE: + case FL_DRAG: + res = 1; + break; + case FL_KEYBOARD: + if (Fl::event_text()[0] >= 'a' && Fl::event_text()[0] <= 'z') { + printf(", Text = '%s'", Fl::event_text()); + res = 1; + } else { // "ignore" everything else + printf(", ignored '%s'", Fl::event_text()); + } + break; + case FL_KEYUP: + res = 1; + break; + case FL_FOCUS: + case FL_UNFOCUS: + res = 1; + break; + default: + break; + } + printf("\n"); fflush(stdout); + return res; +} /* end of handle() method */ + +// Quit button callback (closes the window) +void quit_cb(Fl_Button *b, void *) { + b->window()->hide(); +} + +// main program +int main(int argc, char **argv) { + app *win = new app(10, 10, 240, 240); + Fl_Button *quit = new Fl_Button(90, 100, 60, 40, "Quit"); + quit->box(FL_THIN_UP_BOX); + quit->callback((Fl_Callback *)quit_cb); + win->end(); + win->resizable(win); + win->show(argc, argv); + return Fl::run(); +} |
