summaryrefslogtreecommitdiff
path: root/test/handle_events.cxx
blob: 9db0f53789d37d4d41c2fb5994a88a010a981ba2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//
// 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 standalone 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_Window::screen_num();
#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:
      fprintf(stderr, ", button %d down", Fl::event_button());
      res = 1;
      break;
    case FL_RELEASE:
      fprintf(stderr, ", button %d up", Fl::event_button());
      res = 1;
      break;
    case FL_MOUSEWHEEL:
      fprintf(stderr, ", 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') {
        fprintf(stderr, ", Text = '%s'", Fl::event_text());
        res = 1;
      } else { // "ignore" everything else
        fprintf(stderr, ", ignored '%s'", Fl::event_text());
      }
      break;
    case FL_KEYUP:
      res = 1;
      break;
    case FL_FOCUS:
    case FL_UNFOCUS:
      res = 1;
      break;
    default:
      break;
  }
  fprintf(stderr, "\n"); fflush(stderr);
  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();
}