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