summaryrefslogtreecommitdiffstats
path: root/fltk/fltk/events.h
blob: d1412f0ec8d876ccd1fd9d0e0d9e61d7890d12de (plain) (blame)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
//
// "$Id: events.h 6514 2008-11-10 21:10:13Z spitzak $"
//
// Event types and data. A Widget::handle() method needs this.
//
// Copyright 1998-2006 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to "fltk-bugs@fltk.org".

#ifndef fltk_events_h
#define fltk_events_h

#include "FL_API.h"

namespace fltk {

/// \name fltk/events.h
//@{

/*! Numbers passed to Widget::handle() and returned by event(). */
enum {
  NO_EVENT	= 0,
  PUSH		= 1,
  RELEASE	= 2,
  ENTER		= 3,
  LEAVE		= 4,
  DRAG		= 5,
  FOCUS		= 6,
  UNFOCUS	= 7,
  KEY		= 8,
  KEYUP		= 9,
  FOCUS_CHANGE	= 10,
  MOVE		= 11,
  SHORTCUT	= 12,
  DEACTIVATE	= 13,
  ACTIVATE	= 14,
  HIDE		= 15,
  SHOW		= 16,
  PASTE		= 17,
  TIMEOUT	= 18,
  MOUSEWHEEL	= 19,
  DND_ENTER	= 20,
  DND_DRAG	= 21,
  DND_LEAVE	= 22,
  DND_RELEASE	= 23,
  TOOLTIP	= 24
};

/*! Values returned by event_key(), passed to event_key_state() and
  get_key_state(), and used for the low 16 bits of add_shortcut().

  The actual values returned are based on X11 keysym values, though
  fltk always returns "unshifted" values much like Windows does. A
  given key always returns the same value no matter what shift keys
  are held down. Use event_text() to see the results of any shift
  keys.

  The lowercase letters 'a' through 'z' and the ascii symbols
  '`', '-', '=', '[', ']', '\\', ',', '.', '/', ';', '\'' and space
  are used to identify the keys in the main keyboard.

  On X systems unrecognized keys are returned unchanged as their
  X keysym value. If they have no keysym it uses the scan code
  or'd with 0x8000, this is what all those blue buttons on a
  Microsoft keyboard will do. I don't know how to get those
  buttons on Windows.
*/
enum {
  LeftButton	= 1,		/*!< PUSH/RELEASE set event_key to this */
  MiddleButton	= 2,		/*!< PUSH/RELEASE set event_key to this */
  RightButton	= 3,		/*!< PUSH/RELEASE set event_key to this */
  SpaceKey	= 32,		/*!< Same as ' ' or 32 */
  // 'a'-'z', and all punctuation go here in numerical order
  BackSpaceKey	= 0xff08,	/*!< Backspace */
  TabKey	= 0xff09,	/*!< Tab */
  ClearKey	= 0xff0b,	/*!< On some systems with NumLock off '5' produces this */
  ReturnKey	= 0xff0d,	/*!< Main Enter key, Windows and X documentation calls this "Return" */
  PauseKey	= 0xff13,	/*!< Pause + Break button */
  ScrollLockKey	= 0xff14,	/*!< Scroll Lock button */
  EscapeKey	= 0xff1b,	/*!< Esc */
  HomeKey	= 0xff50,	/*!< Home */
  LeftKey	= 0xff51,	/*!< Left */
  UpKey		= 0xff52,	/*!< Up arrow */
  RightKey	= 0xff53,	/*!< Right arrow */
  DownKey	= 0xff54,	/*!< Down arrow */
  PageUpKey	= 0xff55,	/*!< Page Up */
  PageDownKey	= 0xff56,	/*!< Page Down */
  EndKey	= 0xff57,	/*!< End */
  PrintKey	= 0xff61,	/*!< Print Scrn key + SysRq key */
  InsertKey	= 0xff63,	/*!< Insert */
  MenuKey	= 0xff67,	/*!< Key in lower-right with picture of popup menu */
  HelpKey	= 0xff68,	/*!< Help key on Macintosh keyboards */
  NumLockKey	= 0xff7f,	/*!< NumLock key */
  Keypad	= 0xff80,	/*!< Add ASCII to get keypad keys */
  KeypadEnter	= Keypad+'\r',	/*!< Keypad+'\\r' */
  MultiplyKey	= Keypad+'*',	/*!< Keypad+'*' */
  AddKey	= Keypad+'+',	/*!< Keypad+'+' */
  SubtractKey	= Keypad+'-',	/*!< Keypad+'-' */
  DecimalKey	= Keypad+'.',	/*!< Keypad+'.' */
  DivideKey	= Keypad+'/',	/*!< Keypad+'/' */
  Keypad0	= Keypad+'0',	/*!< Keypad+'0' */
  Keypad1	= Keypad+'1',	/*!< Keypad+'1' */
  Keypad2	= Keypad+'2',	/*!< Keypad+'2' */
  Keypad3	= Keypad+'3',	/*!< Keypad+'3' */
  Keypad4	= Keypad+'4',	/*!< Keypad+'4' */
  Keypad5	= Keypad+'5',	/*!< Keypad+'5' */
  Keypad6	= Keypad+'6',	/*!< Keypad+'6' */
  Keypad7	= Keypad+'7',	/*!< Keypad+'7' */
  Keypad8	= Keypad+'8',	/*!< Keypad+'8' */
  Keypad9	= Keypad+'9',	/*!< Keypad+'9' */
  KeypadLast	= 0xffbd,	/*!< Keypad+'=', largest legal keypad key */
  F0Key		= 0xffbd,	/*!< Add a number to get function key */
  F1Key		= F0Key+1,	/*!< F0Key+1 */
  F2Key		= F0Key+2,	/*!< F0Key+2 */
  F3Key		= F0Key+3,	/*!< F0Key+3 */
  F4Key		= F0Key+4,	/*!< F0Key+4 */
  F5Key		= F0Key+5,	/*!< F0Key+5 */
  F6Key		= F0Key+6,	/*!< F0Key+6 */
  F7Key		= F0Key+7,	/*!< F0Key+7 */
  F8Key		= F0Key+8,	/*!< F0Key+8 */
  F9Key		= F0Key+9,	/*!< F0Key+9 */
  F10Key	= F0Key+10,	/*!< F0Key+10 */
  F11Key	= F0Key+11,	/*!< F0Key+11 */
  F12Key	= F0Key+12,	/*!< F0Key+12 */
  // use F0Key+n to get function key n
  LastFunctionKey = F0Key+35,	/*!< F0Key+35, largest legal function key */
  LeftShiftKey	= 0xffe1,	/*!< Left-hand Shift */
  RightShiftKey	= 0xffe2,	/*!< Right-hand Shift */
  LeftCtrlKey	= 0xffe3,	/*!< Left-hand Ctrl */
  RightCtrlKey	= 0xffe4,	/*!< Right-hand Ctrl */
  CapsLockKey	= 0xffe5,	/*!< Caps Lock */
  LeftMetaKey	= 0xffe7,	/*!< The left "Windows" or "Apple" key */
  RightMetaKey	= 0xffe8,	/*!< The right "Windows" or "Apple" key */
  LeftAltKey	= 0xffe9,	/*!< Left-hand Alt (option on Mac) */
  RightAltKey	= 0xffea,	/*!< Right-hand Alt (option on Mac) */
  DeleteKey	= 0xffff,	/*!< Delete */
#if  defined(__APPLE__)
  LeftAccKey	= LeftCtrlKey,
  RightAccKey	= RightCtrlKey,
  LeftCmdKey	= LeftMetaKey,
  RightCmdKey	= RightMetaKey
#else
  LeftAccKey	= LeftAltKey,
  RightAccKey	= RightAltKey,
  LeftCmdKey	= LeftCtrlKey,
  RightCmdKey	= RightCtrlKey
#endif
};

/*! Flags returned by event_state(), and used as the high 16 bits
  of Widget::add_shortcut() values (the low 16 bits are all zero, so these
  may be or'd with key values).

  The inline function BUTTON(n) will turn n (1-8) into the flag for a
  mouse button.
*/
enum {
  SHIFT		= 0x00010000,	/*!< Either shift key held down */
  CAPSLOCK	= 0x00020000,	/*!< Caps lock is toggled on */
  CTRL		= 0x00040000,	/*!< Either ctrl key held down */
  ALT		= 0x00080000,	/*!< Either alt key held down */
  NUMLOCK	= 0x00100000,	/*!< Num Lock turned on */
  META		= 0x00400000,	/*!< "Windows" or the "Apple" keys held down */
  SCROLLLOCK	= 0x00800000,	/*!< Scroll Lock turned on */
  BUTTON1	= 0x01000000,	/*!< Left mouse button held down */
  BUTTON2	= 0x02000000,	/*!< Middle mouse button held down */
  BUTTON3	= 0x04000000,	/*!< Right mouse button held down */
  ANY_BUTTON	= 0x7f000000, /*!< Any mouse button (up to 8) */
#if defined(__APPLE__)
  ACCELERATOR	= CTRL,
  OPTION	= ALT,
  COMMAND	= META
#else
  ACCELERATOR	= ALT, //!< ALT on Windows/Linux, CTRL on OS/X, use for menu accelerators
  COMMAND	= CTRL,	//!< CTRL on Windows/Linux, META on OS/X, use for menu shortcuts
  OPTION	= ALT|META //!< ALT|META on Windows/Linux, just ALT on OS/X, use as a drag modifier
#endif
};

inline unsigned BUTTON(int n) {return 0x00800000 << n;}

/*! Device identifier returned by event_device(). This enumeration
  is useful to get the device type that caused a PUSH, RELEASE,
  DRAG or MOVE event 
*/
enum {
  DEVICE_MOUSE    = 0, /*!< Event triggered by the system mouse */
  DEVICE_STYLUS   = 1, /*!< Event triggered by a pen on a tablet, givin pressure and tilt information */
  DEVICE_ERASER   = 2, /*!< Event triggered by an eraser on a tablet, givin pressure and tilt information */
  DEVICE_CURSOR   = 3, /*!< Event triggered by a puck style device on a tablet */
  DEVICE_AIRBRUSH = 4, /*!< Event triggered by an airbrush on a tablet, giving pressure and tilt information */
  DEVICE_TOUCH    = 5  /*!< Event triggered by touch a touch screen device */
};

class Rectangle;
class Widget;
class Window;

#ifndef DOXYGEN

////////////////////////////////////////////////////////////////
// Do not use these variables, they may not exist in future versions:

extern FL_API int e_type;
extern FL_API int e_x;
extern FL_API int e_y;
extern FL_API int e_dx;
extern FL_API int e_dy;
extern FL_API int e_x_root;
extern FL_API int e_y_root;
extern FL_API unsigned e_state;
extern FL_API int e_clicks;
extern FL_API unsigned e_is_click;
extern FL_API unsigned e_keysym;
extern FL_API unsigned e_length;
extern FL_API const char* e_text;
extern FL_API unsigned e_key_repeated;
extern FL_API float e_pressure;
extern FL_API float e_x_tilt;
extern FL_API float e_y_tilt;
extern FL_API int e_device;
extern FL_API int compose_state;
extern FL_API Widget* belowmouse_;
extern FL_API Widget* pushed_;
extern FL_API Widget* focus_;
extern FL_API Widget* modal_;
extern FL_API bool grab_;
extern FL_API bool exit_modal_;

////////////////////////////////////////////////////////////////
#endif

inline int  event()			{return e_type;}
inline int  event_x()			{return e_x;}
inline int  event_y()			{return e_y;}
inline int  event_dx()			{return e_dx;}
inline int  event_dy()			{return e_dy;}
inline int  event_x_root()		{return e_x_root;}
inline int  event_y_root()		{return e_y_root;}
inline int  event_clicks()		{return e_clicks;}
inline void event_clicks(int i)		{e_clicks = i;}
inline bool event_is_click()		{return e_is_click != 0;}
inline void event_is_click(bool)	{e_is_click = 0;} // only false works!
inline unsigned event_state()		{return e_state;}
inline bool event_state(unsigned i)	{return (e_state&i) != 0;}
inline unsigned event_key()		{return e_keysym;}
inline unsigned event_button()		{return e_keysym;}
FL_API bool event_key_state(unsigned);
inline const char* event_text() 	{return e_text;}
inline unsigned event_length() 		{return e_length;}
inline unsigned event_key_repeated()	{return e_key_repeated;}
inline float event_pressure()	 	{return e_pressure;}
inline float event_x_tilt()     	{return e_x_tilt;}
inline float event_y_tilt()     	{return e_y_tilt;}
inline int  event_device()      	{return e_device;}

// tests on current event:
FL_API bool event_inside(const Rectangle&);
FL_API bool compose(int &del);
inline void compose_reset()		{compose_state = 0;}

// shortcuts:
FL_API bool try_shortcut();
FL_API const char* key_name(unsigned key);
FL_API unsigned key(const char* name);

class FL_API ShortcutFunctor {
 public:
  virtual bool handle(const Widget*, unsigned key) = 0;
};
FL_API unsigned foreachShortcut(const Widget*, ShortcutFunctor&);
inline unsigned foreachShortcut(ShortcutFunctor& f) { return foreachShortcut(0,f); }

// get current information, not info from last event:
FL_API bool get_key_state(unsigned);
FL_API void get_mouse(int &,int &);
FL_API bool warp_mouse(int, int);

// event destinations:
FL_API bool handle(int, Window*);
FL_API void add_event_handler(int (*h)(int, Window*));
inline Widget* belowmouse() 		{return belowmouse_;}
FL_API void belowmouse(Widget*);
inline void belowmouse(Widget& w)	{belowmouse(&w);}
inline Widget* pushed()			{return pushed_;}
FL_API void pushed(Widget*);
inline void pushed(Widget& w)		{pushed(&w);}
inline Widget* focus()			{return focus_;}
FL_API void focus(Widget*);
inline void focus(Widget& w)		{focus(&w);}

// cut/paste/dnd:
FL_API void copy(const char* stuff, int len, bool clipboard = false);
FL_API void paste(Widget &receiver, bool clipboard = false);
FL_API bool dnd();

// Modal widgets (block events going to any other widgets):
FL_API void modal(Widget*, bool grab = false);
inline Widget* modal()			{return modal_;}
inline bool grab()			{return grab_;}
inline void exit_modal()		{exit_modal_ = true;}
inline bool exit_modal_flag()		{return exit_modal_;}

// for debugging purpose : 
const char  *event_name(int event); /// see STR #508

//@}

}

#endif

//
// $Id: events.h 6514 2008-11-10 21:10:13Z spitzak $
//