cb269dd415a40905e05612b6ca7cb611701096c9
[blender.git] / source / blender / windowmanager / wm_event_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup wm
19  */
20
21 /*
22  * These define have its origin at sgi, where all device defines were written down in device.h.
23  * Blender copied the conventions quite some, and expanded it with internal new defines (ton)
24  */
25
26 #ifndef __WM_EVENT_TYPES_H__
27 #define __WM_EVENT_TYPES_H__
28
29 /* customdata type */
30 enum {
31   EVT_DATA_GESTURE = 1,
32   EVT_DATA_TIMER = 2,
33   EVT_DATA_DRAGDROP = 3,
34   EVT_DATA_NDOF_MOTION = 4,
35 };
36
37 /* tablet active, matches GHOST_TTabletMode */
38 enum {
39   EVT_TABLET_NONE = 0,
40   EVT_TABLET_STYLUS = 1,
41   EVT_TABLET_ERASER = 2,
42 };
43
44 /* ********** wmEvent.type ********** */
45 enum {
46   /* non-event, for example disabled timer */
47   EVENT_NONE = 0x0000,
48
49   /* ********** Start of Input devices. ********** */
50
51   /* MOUSE : 0x000x, 0x001x */
52   LEFTMOUSE = 0x0001,
53   MIDDLEMOUSE = 0x0002,
54   RIGHTMOUSE = 0x0003,
55   MOUSEMOVE = 0x0004,
56   /* Extra mouse buttons */
57   BUTTON4MOUSE = 0x0007,
58   BUTTON5MOUSE = 0x0008,
59   /* More mouse buttons - can't use 9 and 10 here (wheel) */
60   BUTTON6MOUSE = 0x0012,
61   BUTTON7MOUSE = 0x0013,
62   /* Extra trackpad gestures */
63   MOUSEPAN = 0x000e,
64   MOUSEZOOM = 0x000f,
65   MOUSEROTATE = 0x0010,
66   /* defaults from ghost */
67   WHEELUPMOUSE = 0x000a,
68   WHEELDOWNMOUSE = 0x000b,
69   /* mapped with userdef */
70   WHEELINMOUSE = 0x000c,
71   WHEELOUTMOUSE = 0x000d,
72   /* Successive MOUSEMOVE's are converted to this, so we can easily
73    * ignore all but the most recent MOUSEMOVE (for better performance),
74    * paint and drawing tools however will want to handle these. */
75   INBETWEEN_MOUSEMOVE = 0x0011,
76
77   /* IME event, GHOST_kEventImeCompositionStart in ghost */
78   WM_IME_COMPOSITE_START = 0x0014,
79   /* IME event, GHOST_kEventImeComposition in ghost */
80   WM_IME_COMPOSITE_EVENT = 0x0015,
81   /* IME event, GHOST_kEventImeCompositionEnd in ghost */
82   WM_IME_COMPOSITE_END = 0x0016,
83
84   /* Tablet/Pen Specific Events */
85   TABLET_STYLUS = 0x001a,
86   TABLET_ERASER = 0x001b,
87
88   /* *** Start of keyboard codes. *** */
89
90   /* standard keyboard.
91    * XXX from 0x0020 to 0x00ff, and 0x012c to 0x013f for function keys! */
92
93   /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
94   AKEY = 0x0061, /* 'a' */
95   BKEY = 0x0062, /* 'b' */
96   CKEY = 0x0063, /* 'c' */
97   DKEY = 0x0064, /* 'd' */
98   EKEY = 0x0065, /* 'e' */
99   FKEY = 0x0066, /* 'f' */
100   GKEY = 0x0067, /* 'g' */
101 #ifndef WIN32
102   HKEY = 0x0068, /* 'h' */
103 #else
104 #  define HKEY 0x0068
105 #endif
106   IKEY = 0x0069, /* 'i' */
107   JKEY = 0x006a, /* 'j' */
108   KKEY = 0x006b, /* 'k' */
109   LKEY = 0x006c, /* 'l' */
110   MKEY = 0x006d, /* 'm' */
111   NKEY = 0x006e, /* 'n' */
112   OKEY = 0x006f, /* 'o' */
113   PKEY = 0x0070, /* 'p' */
114   QKEY = 0x0071, /* 'q' */
115   RKEY = 0x0072, /* 'r' */
116   SKEY = 0x0073, /* 's' */
117   TKEY = 0x0074, /* 't' */
118   UKEY = 0x0075, /* 'u' */
119   VKEY = 0x0076, /* 'v' */
120   WKEY = 0x0077, /* 'w' */
121   XKEY = 0x0078, /* 'x' */
122   YKEY = 0x0079, /* 'y' */
123   ZKEY = 0x007a, /* 'z' */
124
125   ZEROKEY = 0x0030,  /* '0' */
126   ONEKEY = 0x0031,   /* '1' */
127   TWOKEY = 0x0032,   /* '2' */
128   THREEKEY = 0x0033, /* '3' */
129   FOURKEY = 0x0034,  /* '4' */
130   FIVEKEY = 0x0035,  /* '5' */
131   SIXKEY = 0x0036,   /* '6' */
132   SEVENKEY = 0x0037, /* '7' */
133   EIGHTKEY = 0x0038, /* '8' */
134   NINEKEY = 0x0039,  /* '9' */
135
136   CAPSLOCKKEY = 0x00d3, /* 211 */
137
138   LEFTCTRLKEY = 0x00d4,   /* 212 */
139   LEFTALTKEY = 0x00d5,    /* 213 */
140   RIGHTALTKEY = 0x00d6,   /* 214 */
141   RIGHTCTRLKEY = 0x00d7,  /* 215 */
142   RIGHTSHIFTKEY = 0x00d8, /* 216 */
143   LEFTSHIFTKEY = 0x00d9,  /* 217 */
144
145   ESCKEY = 0x00da,          /* 218 */
146   TABKEY = 0x00db,          /* 219 */
147   RETKEY = 0x00dc,          /* 220 */
148   SPACEKEY = 0x00dd,        /* 221 */
149   LINEFEEDKEY = 0x00de,     /* 222 */
150   BACKSPACEKEY = 0x00df,    /* 223 */
151   DELKEY = 0x00e0,          /* 224 */
152   SEMICOLONKEY = 0x00e1,    /* 225 */
153   PERIODKEY = 0x00e2,       /* 226 */
154   COMMAKEY = 0x00e3,        /* 227 */
155   QUOTEKEY = 0x00e4,        /* 228 */
156   ACCENTGRAVEKEY = 0x00e5,  /* 229 */
157   MINUSKEY = 0x00e6,        /* 230 */
158   PLUSKEY = 0x00e7,         /* 231 */
159   SLASHKEY = 0x00e8,        /* 232 */
160   BACKSLASHKEY = 0x00e9,    /* 233 */
161   EQUALKEY = 0x00ea,        /* 234 */
162   LEFTBRACKETKEY = 0x00eb,  /* 235 */
163   RIGHTBRACKETKEY = 0x00ec, /* 236 */
164
165   LEFTARROWKEY = 0x0089,  /* 137 */
166   DOWNARROWKEY = 0x008a,  /* 138 */
167   RIGHTARROWKEY = 0x008b, /* 139 */
168   UPARROWKEY = 0x008c,    /* 140 */
169
170   PAD0 = 0x0096, /* 150 */
171   PAD1 = 0x0097, /* 151 */
172   PAD2 = 0x0098, /* 152 */
173   PAD3 = 0x0099, /* 153 */
174   PAD4 = 0x009a, /* 154 */
175   PAD5 = 0x009b, /* 155 */
176   PAD6 = 0x009c, /* 156 */
177   PAD7 = 0x009d, /* 157 */
178   PAD8 = 0x009e, /* 158 */
179   PAD9 = 0x009f, /* 159 */
180
181   PADPERIOD = 0x00c7,   /* 199 */
182   PADASTERKEY = 0x00a0, /* 160 */
183   PADSLASHKEY = 0x00a1, /* 161 */
184   PADMINUS = 0x00a2,    /* 162 */
185   PADENTER = 0x00a3,    /* 163 */
186   PADPLUSKEY = 0x00a4,  /* 164 */
187
188   PAUSEKEY = 0x00a5,    /* 165 */
189   INSERTKEY = 0x00a6,   /* 166 */
190   HOMEKEY = 0x00a7,     /* 167 */
191   PAGEUPKEY = 0x00a8,   /* 168 */
192   PAGEDOWNKEY = 0x00a9, /* 169 */
193   ENDKEY = 0x00aa,      /* 170 */
194
195   UNKNOWNKEY = 0x00ab, /* 171 */
196   OSKEY = 0x00ac,      /* 172 */
197   GRLESSKEY = 0x00ad,  /* 173 */
198
199   /* XXX: are these codes ok? */
200   MEDIAPLAY = 0x00ae,  /* 174 */
201   MEDIASTOP = 0x00af,  /* 175 */
202   MEDIAFIRST = 0x00b0, /* 176 */
203   MEDIALAST = 0x00b1,  /* 177 */
204
205   F1KEY = 0x012c,  /* 300 */
206   F2KEY = 0x012d,  /* 301 */
207   F3KEY = 0x012e,  /* 302 */
208   F4KEY = 0x012f,  /* 303 */
209   F5KEY = 0x0130,  /* 304 */
210   F6KEY = 0x0131,  /* 305 */
211   F7KEY = 0x0132,  /* 306 */
212   F8KEY = 0x0133,  /* 307 */
213   F9KEY = 0x0134,  /* 308 */
214   F10KEY = 0x0135, /* 309 */
215   F11KEY = 0x0136, /* 310 */
216   F12KEY = 0x0137, /* 311 */
217   F13KEY = 0x0138, /* 312 */
218   F14KEY = 0x0139, /* 313 */
219   F15KEY = 0x013a, /* 314 */
220   F16KEY = 0x013b, /* 315 */
221   F17KEY = 0x013c, /* 316 */
222   F18KEY = 0x013d, /* 317 */
223   F19KEY = 0x013e, /* 318 */
224
225   /* *** End of keyboard codes. *** */
226
227   /* NDOF (from SpaceNavigator & friends)
228    * These should be kept in sync with GHOST_NDOFManager.h
229    * Ordering matters, exact values do not. */
230   NDOF_MOTION = 0x0190,
231   /* used internally, never sent */
232   NDOF_BUTTON_NONE = NDOF_MOTION,
233   /* these two are available from any 3Dconnexion device */
234   NDOF_BUTTON_MENU,
235   NDOF_BUTTON_FIT,
236   /* standard views */
237   NDOF_BUTTON_TOP,
238   NDOF_BUTTON_BOTTOM,
239   NDOF_BUTTON_LEFT,
240   NDOF_BUTTON_RIGHT,
241   NDOF_BUTTON_FRONT,
242   NDOF_BUTTON_BACK,
243   /* more views */
244   NDOF_BUTTON_ISO1,
245   NDOF_BUTTON_ISO2,
246   /* 90 degree rotations */
247   NDOF_BUTTON_ROLL_CW,
248   NDOF_BUTTON_ROLL_CCW,
249   NDOF_BUTTON_SPIN_CW,
250   NDOF_BUTTON_SPIN_CCW,
251   NDOF_BUTTON_TILT_CW,
252   NDOF_BUTTON_TILT_CCW,
253   /* device control */
254   NDOF_BUTTON_ROTATE,
255   NDOF_BUTTON_PANZOOM,
256   NDOF_BUTTON_DOMINANT,
257   NDOF_BUTTON_PLUS,
258   NDOF_BUTTON_MINUS,
259   /* keyboard emulation */
260   NDOF_BUTTON_ESC,
261   NDOF_BUTTON_ALT,
262   NDOF_BUTTON_SHIFT,
263   NDOF_BUTTON_CTRL,
264   /* general-purpose buttons */
265   NDOF_BUTTON_1,
266   NDOF_BUTTON_2,
267   NDOF_BUTTON_3,
268   NDOF_BUTTON_4,
269   NDOF_BUTTON_5,
270   NDOF_BUTTON_6,
271   NDOF_BUTTON_7,
272   NDOF_BUTTON_8,
273   NDOF_BUTTON_9,
274   NDOF_BUTTON_10,
275   /* more general-purpose buttons */
276   NDOF_BUTTON_A,
277   NDOF_BUTTON_B,
278   NDOF_BUTTON_C,
279   /* the end */
280   NDOF_LAST,
281
282   /* ********** End of Input devices. ********** */
283
284   /* ********** Start of Blender internal events. ********** */
285
286   /* XXX Those are mixed inside keyboard 'area'! */
287   /* System: 0x010x */
288   INPUTCHANGE = 0x0103,   /* input connected or disconnected */
289   WINDEACTIVATE = 0x0104, /* window is deactivated, focus lost */
290   /* Timer: 0x011x */
291   TIMER = 0x0110,         /* timer event, passed on to all queues */
292   TIMER0 = 0x0111,        /* timer event, slot for internal use */
293   TIMER1 = 0x0112,        /* timer event, slot for internal use */
294   TIMER2 = 0x0113,        /* timer event, slot for internal use */
295   TIMERJOBS = 0x0114,     /* timer event, jobs system */
296   TIMERAUTOSAVE = 0x0115, /* timer event, autosave */
297   TIMERREPORT = 0x0116,   /* timer event, reports */
298   TIMERREGION = 0x0117,   /* timer event, region slide in/out */
299   TIMERNOTIFIER = 0x0118, /* timer event, notifier sender */
300   TIMERF = 0x011F,        /* last timer */
301
302   /* Actionzones, tweak, gestures: 0x500x, 0x501x */
303   /* Keep in sync with IS_EVENT_ACTIONZONE(...). */
304   EVT_ACTIONZONE_AREA = 0x5000,
305   EVT_ACTIONZONE_REGION = 0x5001,
306   EVT_ACTIONZONE_FULLSCREEN = 0x5011,
307
308   /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
309
310   /* Tweak events:
311    * Sent as additional event with the mouse coordinates from where the initial click was placed. */
312
313   /* tweak events for L M R mousebuttons */
314   EVT_TWEAK_L = 0x5002,
315   EVT_TWEAK_M = 0x5003,
316   EVT_TWEAK_R = 0x5004,
317   EVT_GESTURE = 0x5010,
318
319   /* 0x5011 is taken, see EVT_ACTIONZONE_FULLSCREEN */
320
321   /* Misc Blender internals: 0x502x */
322   EVT_FILESELECT = 0x5020,
323   EVT_BUT_OPEN = 0x5021,
324   EVT_MODAL_MAP = 0x5022,
325   EVT_DROP = 0x5023,
326   EVT_BUT_CANCEL = 0x5024,
327
328   /* could become gizmo callback */
329   EVT_GIZMO_UPDATE = 0x5025,
330   /* ********** End of Blender internal events. ********** */
331 };
332
333 /* *********** wmEvent.type helpers. ********** */
334
335 /* test whether the event is timer event */
336 #define ISTIMER(event_type) ((event_type) >= TIMER && (event_type) <= TIMERF)
337
338 /* for event checks */
339 /* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */
340 /* UNUSED - see wm_eventmatch - BUG [#30479] */
341 /* #define ISTEXTINPUT(event_type)  ((event_type) >= ' ' && (event_type) <= 255) */
342 /* note, an alternative could be to check 'event->utf8_buf' */
343
344 /* test whether the event is a key on the keyboard */
345 #define ISKEYBOARD(event_type) \
346   (((event_type) >= 0x0020 && (event_type) <= 0x00ff) || \
347    ((event_type) >= 0x012c && (event_type) <= 0x013f))
348
349 /* test whether the event is a modifier key */
350 #define ISKEYMODIFIER(event_type) \
351   (((event_type) >= LEFTCTRLKEY && (event_type) <= LEFTSHIFTKEY) || (event_type) == OSKEY)
352
353 /* test whether the event is a mouse button */
354 #define ISMOUSE(event_type) ((event_type) >= LEFTMOUSE && (event_type) <= BUTTON7MOUSE)
355
356 #define ISMOUSE_WHEEL(event_type) ((event_type) >= WHEELUPMOUSE && (event_type) <= WHEELOUTMOUSE)
357 #define ISMOUSE_GESTURE(event_type) ((event_type) >= MOUSEPAN && (event_type) <= MOUSEROTATE)
358 #define ISMOUSE_BUTTON(event_type) \
359   (ELEM(event_type, \
360         LEFTMOUSE, \
361         MIDDLEMOUSE, \
362         RIGHTMOUSE, \
363         BUTTON4MOUSE, \
364         BUTTON5MOUSE, \
365         BUTTON6MOUSE, \
366         BUTTON7MOUSE))
367
368 /* test whether the event is tweak event */
369 #define ISTWEAK(event_type) ((event_type) >= EVT_TWEAK_L && (event_type) <= EVT_GESTURE)
370
371 /* test whether the event is a NDOF event */
372 #define ISNDOF(event_type) ((event_type) >= NDOF_MOTION && (event_type) < NDOF_LAST)
373
374 #define IS_EVENT_ACTIONZONE(event_type) \
375   ELEM(event_type, EVT_ACTIONZONE_AREA, EVT_ACTIONZONE_REGION, EVT_ACTIONZONE_FULLSCREEN)
376
377 /* test whether event type is acceptable as hotkey, excluding modifiers */
378 #define ISHOTKEY(event_type) \
379   ((ISKEYBOARD(event_type) || ISMOUSE(event_type) || ISNDOF(event_type)) && \
380    (ISKEYMODIFIER(event_type) == false))
381
382 /* internal helpers*/
383 #define _VA_IS_EVENT_MOD2(v, a) (CHECK_TYPE_INLINE(v, wmEvent *), ((v)->a))
384 #define _VA_IS_EVENT_MOD3(v, a, b) (_VA_IS_EVENT_MOD2(v, a) || ((v)->b))
385 #define _VA_IS_EVENT_MOD4(v, a, b, c) (_VA_IS_EVENT_MOD3(v, a, b) || ((v)->c))
386 #define _VA_IS_EVENT_MOD5(v, a, b, c, d) (_VA_IS_EVENT_MOD4(v, a, b, c) || ((v)->d))
387
388 /* reusable IS_EVENT_MOD(event, shift, ctrl, alt, oskey), macro */
389 #define IS_EVENT_MOD(...) VA_NARGS_CALL_OVERLOAD(_VA_IS_EVENT_MOD, __VA_ARGS__)
390
391 enum eEventType_Mask {
392   /* ISKEYMODIFIER */
393   EVT_TYPE_MASK_KEYBOARD_MODIFIER = (1 << 0),
394   /* ISKEYBOARD */
395   EVT_TYPE_MASK_KEYBOARD = (1 << 1),
396   /* ISMOUSE_WHEEL */
397   EVT_TYPE_MASK_MOUSE_WHEEL = (1 << 2),
398   /* ISMOUSE_BUTTON */
399   EVT_TYPE_MASK_MOUSE_GESTURE = (1 << 3),
400   /* ISMOUSE_GESTURE */
401   EVT_TYPE_MASK_MOUSE_BUTTON = (1 << 4),
402   /* ISMOUSE */
403   EVT_TYPE_MASK_MOUSE = (1 << 5),
404   /* ISNDOF */
405   EVT_TYPE_MASK_NDOF = (1 << 6),
406   /* ISTWEAK */
407   EVT_TYPE_MASK_TWEAK = (1 << 7),
408   /* IS_EVENT_ACTIONZONE */
409   EVT_TYPE_MASK_ACTIONZONE = (1 << 8),
410 };
411 #define EVT_TYPE_MASK_ALL \
412   (EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF | EVT_TYPE_MASK_TWEAK | \
413    EVT_TYPE_MASK_ACTIONZONE)
414
415 #define EVT_TYPE_MASK_HOTKEY_INCLUDE \
416   (EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF)
417 #define EVT_TYPE_MASK_HOTKEY_EXCLUDE EVT_TYPE_MASK_KEYBOARD_MODIFIER
418
419 bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask mask);
420
421 /* ********** wmEvent.val ********** */
422
423 /* Gestures */
424 /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
425 enum {
426   /* value of tweaks and line gestures, note, KM_ANY (-1) works for this case too */
427   EVT_GESTURE_N = 1,
428   EVT_GESTURE_NE = 2,
429   EVT_GESTURE_E = 3,
430   EVT_GESTURE_SE = 4,
431   EVT_GESTURE_S = 5,
432   EVT_GESTURE_SW = 6,
433   EVT_GESTURE_W = 7,
434   EVT_GESTURE_NW = 8,
435   /* value of corner gestures */
436   EVT_GESTURE_N_E = 9,
437   EVT_GESTURE_N_W = 10,
438   EVT_GESTURE_E_N = 11,
439   EVT_GESTURE_E_S = 12,
440   EVT_GESTURE_S_E = 13,
441   EVT_GESTURE_S_W = 14,
442   EVT_GESTURE_W_S = 15,
443   EVT_GESTURE_W_N = 16,
444 };
445
446 /* File select */
447 enum {
448   EVT_FILESELECT_FULL_OPEN = 1,
449   EVT_FILESELECT_EXEC = 2,
450   EVT_FILESELECT_CANCEL = 3,
451   EVT_FILESELECT_EXTERNAL_CANCEL = 4,
452 };
453
454 /* Gesture */
455 /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
456 enum {
457   GESTURE_MODAL_CANCEL = 1,
458   GESTURE_MODAL_CONFIRM = 2,
459
460   /* Uses 'deselect' operator property. */
461   GESTURE_MODAL_SELECT = 3,
462   GESTURE_MODAL_DESELECT = 4,
463
464   GESTURE_MODAL_NOP = 5, /* circle select when no mouse button is pressed */
465
466   GESTURE_MODAL_CIRCLE_ADD = 6, /* circle sel: larger brush */
467   GESTURE_MODAL_CIRCLE_SUB = 7, /* circle sel: smaller brush */
468
469   GESTURE_MODAL_BEGIN =
470       8, /* box select/straight line, activate, use release to detect which button */
471
472   /* Uses 'zoom_out' operator property. */
473   GESTURE_MODAL_IN = 9,
474   GESTURE_MODAL_OUT = 10,
475
476   GESTURE_MODAL_CIRCLE_SIZE = 11, /* circle sel: size brush (for trackpad event) */
477 };
478
479 #endif /* __WM_EVENT_TYPES_H__ */