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 #pragma once
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 /* customdata type */
33 enum {
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 /**
47  * #wmEvent.type
48  *
49  * \note Also used for #wmKeyMapItem.type which is saved in key-map files,
50  * do not change the values of existing values which can be used in key-maps.
51  */
52 enum {
53   /* non-event, for example disabled timer */
54   EVENT_NONE = 0x0000,
55 
56   /* ********** Start of Input devices. ********** */
57 
58   /* MOUSE : 0x000x, 0x001x */
59   LEFTMOUSE = 0x0001,
60   MIDDLEMOUSE = 0x0002,
61   RIGHTMOUSE = 0x0003,
62   MOUSEMOVE = 0x0004,
63   /* Extra mouse buttons */
64   BUTTON4MOUSE = 0x0007,
65   BUTTON5MOUSE = 0x0008,
66   /* More mouse buttons - can't use 9 and 10 here (wheel) */
67   BUTTON6MOUSE = 0x0012,
68   BUTTON7MOUSE = 0x0013,
69   /* Extra trackpad gestures */
70   MOUSEPAN = 0x000e,
71   MOUSEZOOM = 0x000f,
72   MOUSEROTATE = 0x0010,
73   MOUSESMARTZOOM = 0x0017,
74 
75   /* defaults from ghost */
76   WHEELUPMOUSE = 0x000a,
77   WHEELDOWNMOUSE = 0x000b,
78   /* mapped with userdef */
79   WHEELINMOUSE = 0x000c,
80   WHEELOUTMOUSE = 0x000d,
81   /* Successive MOUSEMOVE's are converted to this, so we can easily
82    * ignore all but the most recent MOUSEMOVE (for better performance),
83    * paint and drawing tools however will want to handle these. */
84   INBETWEEN_MOUSEMOVE = 0x0011,
85 
86   /* IME event, GHOST_kEventImeCompositionStart in ghost */
87   WM_IME_COMPOSITE_START = 0x0014,
88   /* IME event, GHOST_kEventImeComposition in ghost */
89   WM_IME_COMPOSITE_EVENT = 0x0015,
90   /* IME event, GHOST_kEventImeCompositionEnd in ghost */
91   WM_IME_COMPOSITE_END = 0x0016,
92 
93   /* Tablet/Pen Specific Events */
94   TABLET_STYLUS = 0x001a,
95   TABLET_ERASER = 0x001b,
96 
97   /* *** Start of keyboard codes. *** */
98 
99   /* Standard keyboard.
100    * From 0x0020 to 0x00ff, and 0x012c to 0x0143 for function keys! */
101 
102   EVT_ZEROKEY = 0x0030,  /* '0' (48). */
103   EVT_ONEKEY = 0x0031,   /* '1' (49). */
104   EVT_TWOKEY = 0x0032,   /* '2' (50). */
105   EVT_THREEKEY = 0x0033, /* '3' (51). */
106   EVT_FOURKEY = 0x0034,  /* '4' (52). */
107   EVT_FIVEKEY = 0x0035,  /* '5' (53). */
108   EVT_SIXKEY = 0x0036,   /* '6' (54). */
109   EVT_SEVENKEY = 0x0037, /* '7' (55). */
110   EVT_EIGHTKEY = 0x0038, /* '8' (56). */
111   EVT_NINEKEY = 0x0039,  /* '9' (57). */
112 
113   EVT_AKEY = 0x0061, /* 'a' (97). */
114   EVT_BKEY = 0x0062, /* 'b' (98). */
115   EVT_CKEY = 0x0063, /* 'c' (99). */
116   EVT_DKEY = 0x0064, /* 'd' (100). */
117   EVT_EKEY = 0x0065, /* 'e' (101). */
118   EVT_FKEY = 0x0066, /* 'f' (102). */
119   EVT_GKEY = 0x0067, /* 'g' (103). */
120   EVT_HKEY = 0x0068, /* 'h' (104). */
121   EVT_IKEY = 0x0069, /* 'i' (105). */
122   EVT_JKEY = 0x006a, /* 'j' (106). */
123   EVT_KKEY = 0x006b, /* 'k' (107). */
124   EVT_LKEY = 0x006c, /* 'l' (108). */
125   EVT_MKEY = 0x006d, /* 'm' (109). */
126   EVT_NKEY = 0x006e, /* 'n' (110). */
127   EVT_OKEY = 0x006f, /* 'o' (111). */
128   EVT_PKEY = 0x0070, /* 'p' (112). */
129   EVT_QKEY = 0x0071, /* 'q' (113). */
130   EVT_RKEY = 0x0072, /* 'r' (114). */
131   EVT_SKEY = 0x0073, /* 's' (115). */
132   EVT_TKEY = 0x0074, /* 't' (116). */
133   EVT_UKEY = 0x0075, /* 'u' (117). */
134   EVT_VKEY = 0x0076, /* 'v' (118). */
135   EVT_WKEY = 0x0077, /* 'w' (119). */
136   EVT_XKEY = 0x0078, /* 'x' (120). */
137   EVT_YKEY = 0x0079, /* 'y' (121). */
138   EVT_ZKEY = 0x007a, /* 'z' (122). */
139 
140   EVT_LEFTARROWKEY = 0x0089,  /* 137 */
141   EVT_DOWNARROWKEY = 0x008a,  /* 138 */
142   EVT_RIGHTARROWKEY = 0x008b, /* 139 */
143   EVT_UPARROWKEY = 0x008c,    /* 140 */
144 
145   EVT_PAD0 = 0x0096, /* 150 */
146   EVT_PAD1 = 0x0097, /* 151 */
147   EVT_PAD2 = 0x0098, /* 152 */
148   EVT_PAD3 = 0x0099, /* 153 */
149   EVT_PAD4 = 0x009a, /* 154 */
150   EVT_PAD5 = 0x009b, /* 155 */
151   EVT_PAD6 = 0x009c, /* 156 */
152   EVT_PAD7 = 0x009d, /* 157 */
153   EVT_PAD8 = 0x009e, /* 158 */
154   EVT_PAD9 = 0x009f, /* 159 */
155   /* Key-pad keys. */
156   EVT_PADASTERKEY = 0x00a0, /* 160 */
157   EVT_PADSLASHKEY = 0x00a1, /* 161 */
158   EVT_PADMINUS = 0x00a2,    /* 162 */
159   EVT_PADENTER = 0x00a3,    /* 163 */
160   EVT_PADPLUSKEY = 0x00a4,  /* 164 */
161 
162   EVT_PAUSEKEY = 0x00a5,    /* 165 */
163   EVT_INSERTKEY = 0x00a6,   /* 166 */
164   EVT_HOMEKEY = 0x00a7,     /* 167 */
165   EVT_PAGEUPKEY = 0x00a8,   /* 168 */
166   EVT_PAGEDOWNKEY = 0x00a9, /* 169 */
167   EVT_ENDKEY = 0x00aa,      /* 170 */
168   /* Note that 'PADPERIOD' is defined out-of-order. */
169   EVT_UNKNOWNKEY = 0x00ab, /* 171 */
170   EVT_OSKEY = 0x00ac,      /* 172 */
171   EVT_GRLESSKEY = 0x00ad,  /* 173 */
172   /* Media keys. */
173   EVT_MEDIAPLAY = 0x00ae,  /* 174 */
174   EVT_MEDIASTOP = 0x00af,  /* 175 */
175   EVT_MEDIAFIRST = 0x00b0, /* 176 */
176   EVT_MEDIALAST = 0x00b1,  /* 177 */
177   /* Menu/App key. */
178   EVT_APPKEY = 0x00b2, /* 178 */
179 
180   EVT_PADPERIOD = 0x00c7, /* 199 */
181 
182   EVT_CAPSLOCKKEY = 0x00d3, /* 211 */
183 
184   /* Modifier keys. */
185   EVT_LEFTCTRLKEY = 0x00d4,   /* 212 */
186   EVT_LEFTALTKEY = 0x00d5,    /* 213 */
187   EVT_RIGHTALTKEY = 0x00d6,   /* 214 */
188   EVT_RIGHTCTRLKEY = 0x00d7,  /* 215 */
189   EVT_RIGHTSHIFTKEY = 0x00d8, /* 216 */
190   EVT_LEFTSHIFTKEY = 0x00d9,  /* 217 */
191   /* Special characters. */
192   EVT_ESCKEY = 0x00da,          /* 218 */
193   EVT_TABKEY = 0x00db,          /* 219 */
194   EVT_RETKEY = 0x00dc,          /* 220 */
195   EVT_SPACEKEY = 0x00dd,        /* 221 */
196   EVT_LINEFEEDKEY = 0x00de,     /* 222 */
197   EVT_BACKSPACEKEY = 0x00df,    /* 223 */
198   EVT_DELKEY = 0x00e0,          /* 224 */
199   EVT_SEMICOLONKEY = 0x00e1,    /* 225 */
200   EVT_PERIODKEY = 0x00e2,       /* 226 */
201   EVT_COMMAKEY = 0x00e3,        /* 227 */
202   EVT_QUOTEKEY = 0x00e4,        /* 228 */
203   EVT_ACCENTGRAVEKEY = 0x00e5,  /* 229 */
204   EVT_MINUSKEY = 0x00e6,        /* 230 */
205   EVT_PLUSKEY = 0x00e7,         /* 231 */
206   EVT_SLASHKEY = 0x00e8,        /* 232 */
207   EVT_BACKSLASHKEY = 0x00e9,    /* 233 */
208   EVT_EQUALKEY = 0x00ea,        /* 234 */
209   EVT_LEFTBRACKETKEY = 0x00eb,  /* 235 */
210   EVT_RIGHTBRACKETKEY = 0x00ec, /* 236 */
211 
212   EVT_F1KEY = 0x012c,  /* 300 */
213   EVT_F2KEY = 0x012d,  /* 301 */
214   EVT_F3KEY = 0x012e,  /* 302 */
215   EVT_F4KEY = 0x012f,  /* 303 */
216   EVT_F5KEY = 0x0130,  /* 304 */
217   EVT_F6KEY = 0x0131,  /* 305 */
218   EVT_F7KEY = 0x0132,  /* 306 */
219   EVT_F8KEY = 0x0133,  /* 307 */
220   EVT_F9KEY = 0x0134,  /* 308 */
221   EVT_F10KEY = 0x0135, /* 309 */
222   EVT_F11KEY = 0x0136, /* 310 */
223   EVT_F12KEY = 0x0137, /* 311 */
224   EVT_F13KEY = 0x0138, /* 312 */
225   EVT_F14KEY = 0x0139, /* 313 */
226   EVT_F15KEY = 0x013a, /* 314 */
227   EVT_F16KEY = 0x013b, /* 315 */
228   EVT_F17KEY = 0x013c, /* 316 */
229   EVT_F18KEY = 0x013d, /* 317 */
230   EVT_F19KEY = 0x013e, /* 318 */
231   EVT_F20KEY = 0x013f, /* 319 */
232   EVT_F21KEY = 0x0140, /* 320 */
233   EVT_F22KEY = 0x0141, /* 321 */
234   EVT_F23KEY = 0x0142, /* 322 */
235   EVT_F24KEY = 0x0143, /* 323 */
236 
237   /* *** End of keyboard codes. *** */
238 
239   /* NDOF (from SpaceNavigator & friends)
240    * These should be kept in sync with GHOST_NDOFManager.h
241    * Ordering matters, exact values do not. */
242   NDOF_MOTION = 0x0190, /* 400 */
243   /* used internally, never sent */
244   NDOF_BUTTON_NONE = NDOF_MOTION,
245   /* these two are available from any 3Dconnexion device */
246   NDOF_BUTTON_MENU,
247   NDOF_BUTTON_FIT,
248   /* standard views */
249   NDOF_BUTTON_TOP,
250   NDOF_BUTTON_BOTTOM,
251   NDOF_BUTTON_LEFT,
252   NDOF_BUTTON_RIGHT,
253   NDOF_BUTTON_FRONT,
254   NDOF_BUTTON_BACK,
255   /* more views */
256   NDOF_BUTTON_ISO1,
257   NDOF_BUTTON_ISO2,
258   /* 90 degree rotations */
259   NDOF_BUTTON_ROLL_CW,
260   NDOF_BUTTON_ROLL_CCW,
261   NDOF_BUTTON_SPIN_CW,
262   NDOF_BUTTON_SPIN_CCW,
263   NDOF_BUTTON_TILT_CW,
264   NDOF_BUTTON_TILT_CCW,
265   /* device control */
266   NDOF_BUTTON_ROTATE,
267   NDOF_BUTTON_PANZOOM,
268   NDOF_BUTTON_DOMINANT,
269   NDOF_BUTTON_PLUS,
270   NDOF_BUTTON_MINUS,
271   /* keyboard emulation */
272   NDOF_BUTTON_ESC,
273   NDOF_BUTTON_ALT,
274   NDOF_BUTTON_SHIFT,
275   NDOF_BUTTON_CTRL,
276   /* general-purpose buttons */
277   NDOF_BUTTON_1,
278   NDOF_BUTTON_2,
279   NDOF_BUTTON_3,
280   NDOF_BUTTON_4,
281   NDOF_BUTTON_5,
282   NDOF_BUTTON_6,
283   NDOF_BUTTON_7,
284   NDOF_BUTTON_8,
285   NDOF_BUTTON_9,
286   NDOF_BUTTON_10,
287   /* more general-purpose buttons */
288   NDOF_BUTTON_A,
289   NDOF_BUTTON_B,
290   NDOF_BUTTON_C,
291   /* the end */
292   NDOF_LAST,
293 
294   /* ********** End of Input devices. ********** */
295 
296   /* ********** Start of Blender internal events. ********** */
297 
298   /* XXX Those are mixed inside keyboard 'area'! */
299   /* System: 0x010x */
300   INPUTCHANGE = 0x0103,   /* Input connected or disconnected, (259). */
301   WINDEACTIVATE = 0x0104, /* Window is deactivated, focus lost, (260). */
302   /* Timer: 0x011x */
303   TIMER = 0x0110,         /* Timer event, passed on to all queues (272). */
304   TIMER0 = 0x0111,        /* Timer event, slot for internal use (273). */
305   TIMER1 = 0x0112,        /* Timer event, slot for internal use (274). */
306   TIMER2 = 0x0113,        /* Timer event, slot for internal use (275). */
307   TIMERJOBS = 0x0114,     /* Timer event, jobs system (276). */
308   TIMERAUTOSAVE = 0x0115, /* Timer event, autosave (277). */
309   TIMERREPORT = 0x0116,   /* Timer event, reports (278). */
310   TIMERREGION = 0x0117,   /* Timer event, region slide in/out (279). */
311   TIMERNOTIFIER = 0x0118, /* Timer event, notifier sender (280). */
312   TIMERF = 0x011F,        /* Last timer (287). */
313 
314   /* Actionzones, tweak, gestures: 0x500x, 0x501x */
315   /* Keep in sync with IS_EVENT_ACTIONZONE(...). */
316   EVT_ACTIONZONE_AREA = 0x5000,       /* 20480 */
317   EVT_ACTIONZONE_REGION = 0x5001,     /* 20481 */
318   EVT_ACTIONZONE_FULLSCREEN = 0x5011, /* 20497 */
319 
320   /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
321 
322   /* Tweak events:
323    * Sent as additional event with the mouse coordinates
324    * from where the initial click was placed. */
325 
326   /* tweak events for L M R mousebuttons */
327   EVT_TWEAK_L = 0x5002, /* 20482 */
328   EVT_TWEAK_M = 0x5003, /* 20483 */
329   EVT_TWEAK_R = 0x5004, /* 20484 */
330   /* 0x5010 (and lower) should be left to add other tweak types in the future. */
331 
332   /* 0x5011 is taken, see EVT_ACTIONZONE_FULLSCREEN */
333 
334   /* Misc Blender internals: 0x502x */
335   EVT_FILESELECT = 0x5020, /* 20512 */
336   EVT_BUT_OPEN = 0x5021,   /* 20513 */
337   EVT_MODAL_MAP = 0x5022,  /* 20514 */
338   EVT_DROP = 0x5023,       /* 20515 */
339   /* When value is 0, re-activate, when 1, don't re-activate the button under the cursor. */
340   EVT_BUT_CANCEL = 0x5024, /* 20516 */
341 
342   /* could become gizmo callback */
343   EVT_GIZMO_UPDATE = 0x5025, /* 20517 */
344   /* ********** End of Blender internal events. ********** */
345 };
346 
347 /* *********** wmEvent.type helpers. ********** */
348 
349 /* test whether the event is timer event */
350 #define ISTIMER(event_type) ((event_type) >= TIMER && (event_type) <= TIMERF)
351 
352 /* for event checks */
353 /* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */
354 /* UNUSED - see wm_eventmatch - BUG T30479. */
355 /* #define ISTEXTINPUT(event_type)  ((event_type) >= ' ' && (event_type) <= 255) */
356 /* note, an alternative could be to check 'event->utf8_buf' */
357 
358 /* test whether the event is a key on the keyboard */
359 #define ISKEYBOARD(event_type) \
360   (((event_type) >= 0x0020 && (event_type) <= 0x00ff) || \
361    ((event_type) >= 0x012c && (event_type) <= 0x0143))
362 
363 /* test whether the event is a modifier key */
364 #define ISKEYMODIFIER(event_type) \
365   (((event_type) >= EVT_LEFTCTRLKEY && (event_type) <= EVT_LEFTSHIFTKEY) || \
366    (event_type) == EVT_OSKEY)
367 
368 /* test whether the event is a mouse button */
369 #define ISMOUSE(event_type) \
370   (((event_type) >= LEFTMOUSE && (event_type) <= BUTTON7MOUSE) || (event_type) == MOUSESMARTZOOM)
371 
372 #define ISMOUSE_WHEEL(event_type) ((event_type) >= WHEELUPMOUSE && (event_type) <= WHEELOUTMOUSE)
373 #define ISMOUSE_GESTURE(event_type) ((event_type) >= MOUSEPAN && (event_type) <= MOUSEROTATE)
374 #define ISMOUSE_BUTTON(event_type) \
375   (ELEM(event_type, \
376         LEFTMOUSE, \
377         MIDDLEMOUSE, \
378         RIGHTMOUSE, \
379         BUTTON4MOUSE, \
380         BUTTON5MOUSE, \
381         BUTTON6MOUSE, \
382         BUTTON7MOUSE))
383 
384 /* test whether the event is tweak event */
385 #define ISTWEAK(event_type) ((event_type) >= EVT_TWEAK_L && (event_type) <= EVT_TWEAK_R)
386 
387 /* test whether the event is a NDOF event */
388 #define ISNDOF(event_type) ((event_type) >= NDOF_MOTION && (event_type) < NDOF_LAST)
389 
390 #define IS_EVENT_ACTIONZONE(event_type) \
391   ELEM(event_type, EVT_ACTIONZONE_AREA, EVT_ACTIONZONE_REGION, EVT_ACTIONZONE_FULLSCREEN)
392 
393 /* test whether event type is acceptable as hotkey, excluding modifiers */
394 #define ISHOTKEY(event_type) \
395   ((ISKEYBOARD(event_type) || ISMOUSE(event_type) || ISNDOF(event_type)) && \
396    (ISKEYMODIFIER(event_type) == false))
397 
398 /* internal helpers*/
399 #define _VA_IS_EVENT_MOD2(v, a) (CHECK_TYPE_INLINE(v, wmEvent *), ((v)->a))
400 #define _VA_IS_EVENT_MOD3(v, a, b) (_VA_IS_EVENT_MOD2(v, a) || ((v)->b))
401 #define _VA_IS_EVENT_MOD4(v, a, b, c) (_VA_IS_EVENT_MOD3(v, a, b) || ((v)->c))
402 #define _VA_IS_EVENT_MOD5(v, a, b, c, d) (_VA_IS_EVENT_MOD4(v, a, b, c) || ((v)->d))
403 
404 /* reusable IS_EVENT_MOD(event, shift, ctrl, alt, oskey), macro */
405 #define IS_EVENT_MOD(...) VA_NARGS_CALL_OVERLOAD(_VA_IS_EVENT_MOD, __VA_ARGS__)
406 
407 enum eEventType_Mask {
408   /* ISKEYMODIFIER */
409   EVT_TYPE_MASK_KEYBOARD_MODIFIER = (1 << 0),
410   /* ISKEYBOARD */
411   EVT_TYPE_MASK_KEYBOARD = (1 << 1),
412   /* ISMOUSE_WHEEL */
413   EVT_TYPE_MASK_MOUSE_WHEEL = (1 << 2),
414   /* ISMOUSE_BUTTON */
415   EVT_TYPE_MASK_MOUSE_GESTURE = (1 << 3),
416   /* ISMOUSE_GESTURE */
417   EVT_TYPE_MASK_MOUSE_BUTTON = (1 << 4),
418   /* ISMOUSE */
419   EVT_TYPE_MASK_MOUSE = (1 << 5),
420   /* ISNDOF */
421   EVT_TYPE_MASK_NDOF = (1 << 6),
422   /* ISTWEAK */
423   EVT_TYPE_MASK_TWEAK = (1 << 7),
424   /* IS_EVENT_ACTIONZONE */
425   EVT_TYPE_MASK_ACTIONZONE = (1 << 8),
426 };
427 #define EVT_TYPE_MASK_ALL \
428   (EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF | EVT_TYPE_MASK_TWEAK | \
429    EVT_TYPE_MASK_ACTIONZONE)
430 
431 #define EVT_TYPE_MASK_HOTKEY_INCLUDE \
432   (EVT_TYPE_MASK_KEYBOARD | EVT_TYPE_MASK_MOUSE | EVT_TYPE_MASK_NDOF)
433 #define EVT_TYPE_MASK_HOTKEY_EXCLUDE EVT_TYPE_MASK_KEYBOARD_MODIFIER
434 
435 bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask mask);
436 
437 /* ********** wmEvent.val ********** */
438 
439 /* Gestures */
440 /* NOTE: these values are saved in keymap files, do not change them but just add new ones */
441 enum {
442   /* value of tweaks and line gestures, note, KM_ANY (-1) works for this case too */
443   EVT_GESTURE_N = 1,
444   EVT_GESTURE_NE = 2,
445   EVT_GESTURE_E = 3,
446   EVT_GESTURE_SE = 4,
447   EVT_GESTURE_S = 5,
448   EVT_GESTURE_SW = 6,
449   EVT_GESTURE_W = 7,
450   EVT_GESTURE_NW = 8,
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 /**
462  * Gesture
463  * Used in #wmEvent.val
464  *
465  * \note These values are saved in keymap files,
466  * do not change them but just add new ones.
467  */
468 enum {
469   GESTURE_MODAL_CANCEL = 1,
470   GESTURE_MODAL_CONFIRM = 2,
471 
472   /** Uses 'deselect' operator property. */
473   GESTURE_MODAL_SELECT = 3,
474   GESTURE_MODAL_DESELECT = 4,
475 
476   /** Circle select: when no mouse button is pressed */
477   GESTURE_MODAL_NOP = 5,
478 
479   /** Circle select: larger brush. */
480   GESTURE_MODAL_CIRCLE_ADD = 6,
481   /** Circle select: smaller brush. */
482   GESTURE_MODAL_CIRCLE_SUB = 7,
483 
484   /** Box select/straight line, activate, use release to detect which button. */
485   GESTURE_MODAL_BEGIN = 8,
486 
487   /** Uses 'zoom_out' operator property. */
488   GESTURE_MODAL_IN = 9,
489   GESTURE_MODAL_OUT = 10,
490 
491   /** circle select: size brush (for trackpad event). */
492   GESTURE_MODAL_CIRCLE_SIZE = 11,
493 
494   /** Move selection area. */
495   GESTURE_MODAL_MOVE = 12,
496 
497   /** Toggle to activate snapping (angle snapping for straight line). */
498   GESTURE_MODAL_SNAP = 13,
499 
500   /** Toggle to activate flip (flip the active side of a straight line). */
501   GESTURE_MODAL_FLIP = 14,
502 };
503 
504 #ifdef __cplusplus
505 }
506 #endif
507