1 /*
2  * Copyright (c) 2011-2021, The DART development contributors
3  * All rights reserved.
4  *
5  * The list of contributors can be found at:
6  *   https://github.com/dartsim/dart/blob/master/LICENSE
7  *
8  * This file is provided under the following "BSD-style" License:
9  *   Redistribution and use in source and binary forms, with or
10  *   without modification, are permitted provided that the following
11  *   conditions are met:
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *   * Redistributions in binary form must reproduce the above
15  *     copyright notice, this list of conditions and the following
16  *     disclaimer in the documentation and/or other materials provided
17  *     with the distribution.
18  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  *   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  *   POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <dart/dart.hpp>
34 #include <dart/gui/osg/osg.hpp>
35 #include <pybind11/eigen.h>
36 #include <pybind11/pybind11.h>
37 
38 PYBIND11_DECLARE_HOLDER_TYPE(T, ::osg::ref_ptr<T>, true);
39 
40 namespace py = pybind11;
41 
42 namespace dart {
43 namespace python {
44 
45 class GUIEventHandlerNoRef : public osgGA::GUIEventHandler
46 {
47 public:
48   using GUIEventHandler::handle;
49 
handle(const osgGA::GUIEventAdapter *,osgGA::GUIActionAdapter *)50   virtual bool handle(
51       const osgGA::GUIEventAdapter* /*ea*/, osgGA::GUIActionAdapter* /*aa*/)
52   {
53     return true;
54   }
55 
56 protected:
handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter & aa)57   bool handle(
58       const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override
59   {
60     return handle(&ea, &aa);
61   }
62 };
63 
64 class PyGUIEventHandler final : public GUIEventHandlerNoRef
65 {
66 public:
67   // Inherit the constructors
68   using GUIEventHandlerNoRef::GUIEventHandler;
69 
70   // Trampoline for virtual function
handle(const osgGA::GUIEventAdapter * ea,osgGA::GUIActionAdapter * aa)71   bool handle(
72       const osgGA::GUIEventAdapter* ea, osgGA::GUIActionAdapter* aa) override
73   {
74     PYBIND11_OVERLOAD(
75         bool,                 // Return type
76         GUIEventHandlerNoRef, // Parent class
77         handle, // Name of function in C++ (must match Python name)
78         ea,
79         aa);
80   }
81 };
82 
GUIEventHandler(py::module & m)83 void GUIEventHandler(py::module& m)
84 {
85   auto ea = ::py::class_<
86                 osgGA::GUIEventAdapter,
87                 ::osg::ref_ptr<osgGA::GUIEventAdapter>>(m, "GUIEventAdapter")
88                 .def(py::init<>())
89                 .def(
90                     "getEventType",
91                     +[](const osgGA::GUIEventAdapter* self)
92                         -> osgGA::GUIEventAdapter::EventType {
93                       return self->getEventType();
94                     })
95                 .def("getKey", +[](const osgGA::GUIEventAdapter* self) -> int {
96                   return self->getKey();
97                 });
98 
99 #define DARTPY_DEFINE_ENUM_MOUSE_BUTTON_MASK(val)                              \
100   .value(#val, osgGA::GUIEventAdapter::MouseButtonMask::val)
101 
102   // clang-format off
103   ::py::enum_<osgGA::GUIEventAdapter::MouseButtonMask>(ea, "MouseButtonMask")
104       DARTPY_DEFINE_ENUM_MOUSE_BUTTON_MASK(LEFT_MOUSE_BUTTON)
105       DARTPY_DEFINE_ENUM_MOUSE_BUTTON_MASK(MIDDLE_MOUSE_BUTTON)
106       DARTPY_DEFINE_ENUM_MOUSE_BUTTON_MASK(RIGHT_MOUSE_BUTTON)
107       .export_values();
108   // clang-format on
109 
110 #define DARTPY_DEFINE_ENUM_EVENT_TYPE(val)                                     \
111   .value(#val, osgGA::GUIEventAdapter::EventType::val)
112 
113   // clang-format off
114   ::py::enum_<osgGA::GUIEventAdapter::EventType>(ea, "EventType")
115       DARTPY_DEFINE_ENUM_EVENT_TYPE(NONE)
116       DARTPY_DEFINE_ENUM_EVENT_TYPE(PUSH)
117       DARTPY_DEFINE_ENUM_EVENT_TYPE(RELEASE)
118       DARTPY_DEFINE_ENUM_EVENT_TYPE(DOUBLECLICK)
119       DARTPY_DEFINE_ENUM_EVENT_TYPE(DRAG)
120       DARTPY_DEFINE_ENUM_EVENT_TYPE(MOVE)
121       DARTPY_DEFINE_ENUM_EVENT_TYPE(KEYDOWN)
122       DARTPY_DEFINE_ENUM_EVENT_TYPE(KEYUP)
123       DARTPY_DEFINE_ENUM_EVENT_TYPE(FRAME)
124       DARTPY_DEFINE_ENUM_EVENT_TYPE(RESIZE)
125       DARTPY_DEFINE_ENUM_EVENT_TYPE(SCROLL)
126       DARTPY_DEFINE_ENUM_EVENT_TYPE(PEN_PRESSURE)
127       DARTPY_DEFINE_ENUM_EVENT_TYPE(PEN_ORIENTATION)
128       DARTPY_DEFINE_ENUM_EVENT_TYPE(PEN_PROXIMITY_ENTER)
129       DARTPY_DEFINE_ENUM_EVENT_TYPE(PEN_PROXIMITY_LEAVE)
130       DARTPY_DEFINE_ENUM_EVENT_TYPE(CLOSE_WINDOW)
131       DARTPY_DEFINE_ENUM_EVENT_TYPE(QUIT_APPLICATION)
132       DARTPY_DEFINE_ENUM_EVENT_TYPE(USER)
133       .export_values();
134   // clang-format on
135 
136 #define DARTPY_DEFINE_ENUM_KEY_SYMBOL(val)                                     \
137   .value(#val, osgGA::GUIEventAdapter::KeySymbol::val)
138 
139   // clang-format off
140   ::py::enum_<osgGA::GUIEventAdapter::KeySymbol>(ea, "KeySymbol")
141       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Space)
142 
143       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_0)
144       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_1)
145       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_2)
146       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_3)
147       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_4)
148       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_5)
149       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_6)
150       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_7)
151       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_8)
152       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_9)
153       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_A)
154       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_B)
155       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_C)
156       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_D)
157       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_E)
158       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F)
159       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_G)
160       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_H)
161       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_I)
162       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_J)
163       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_K)
164       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_L)
165       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_M)
166       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_N)
167       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_O)
168       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_P)
169       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Q)
170       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_R)
171       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_S)
172       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_T)
173       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_U)
174       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_V)
175       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_W)
176       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_X)
177       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Y)
178       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Z)
179 
180       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Exclaim     )
181       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Quotedbl    )
182       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Hash        )
183       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Dollar      )
184       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Ampersand   )
185       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Quote       )
186       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Leftparen   )
187       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Rightparen  )
188       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Asterisk    )
189       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Plus        )
190       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Comma       )
191       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Minus       )
192       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Period      )
193       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Slash       )
194       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Colon       )
195       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Semicolon   )
196       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Less        )
197       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Equals      )
198       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Greater     )
199       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Question    )
200       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_At          )
201       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Leftbracket )
202       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Backslash   )
203       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Rightbracket)
204       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Caret       )
205       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Underscore  )
206       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Backquote   )
207 
208       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_BackSpace   )
209       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Tab         )
210       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Linefeed    )
211       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Clear       )
212       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Return      )
213       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Pause       )
214       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Scroll_Lock )
215       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Sys_Req     )
216       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Escape      )
217       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Delete      )
218 
219       /* Cursor control & motion */
220       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Home     )
221       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Left     )
222       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Up       )
223       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Right    )
224       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Down     )
225       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Prior    )
226       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Page_Up  )
227       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Next     )
228       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Page_Down)
229       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_End      )
230       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Begin    )
231 
232       /* Misc Functions */
233       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Select       )
234       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Print        )
235       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Execute      )
236       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Insert       )
237       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Undo         )
238       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Redo         )
239       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Menu         )
240       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Find         )
241       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Cancel       )
242       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Help         )
243       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Break        )
244       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Mode_switch  )
245       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Script_switch)
246       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Num_Lock     )
247 
248       /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
249       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Space    )
250       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Tab      )
251       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Enter    )
252       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_F1       )
253       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_F2       )
254       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_F3       )
255       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_F4       )
256       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Home     )
257       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Left     )
258       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Up       )
259       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Right    )
260       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Down     )
261       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Prior    )
262       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Page_Up  )
263       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Next     )
264       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Page_Down)
265       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_End      )
266       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Begin    )
267       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Insert   )
268       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Delete   )
269       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Equal    )
270       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Multiply )
271       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Add      )
272       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Separator)
273       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Subtract )
274       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Decimal  )
275       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_Divide   )
276 
277       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_0)
278       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_1)
279       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_2)
280       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_3)
281       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_4)
282       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_5)
283       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_6)
284       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_7)
285       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_8)
286       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_KP_9)
287 
288       /*
289        * Auxiliary Functions; note the duplicate definitions for left and right
290        * function keys;  Sun keyboards and a few other manufactures have such
291        * function key groups on the left and/or right sides of the keyboard.
292        * We've not found a keyboard with more than 35 function keys total.
293        */
294       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F1 )
295       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F2 )
296       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F3 )
297       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F4 )
298       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F5 )
299       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F6 )
300       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F7 )
301       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F8 )
302       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F9 )
303       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F10)
304       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F11)
305       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F12)
306       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F13)
307       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F14)
308       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F15)
309       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F16)
310       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F17)
311       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F18)
312       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F19)
313       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F20)
314       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F21)
315       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F22)
316       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F23)
317       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F24)
318       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F25)
319       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F26)
320       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F27)
321       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F28)
322       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F29)
323       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F30)
324       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F31)
325       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F32)
326       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F33)
327       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F34)
328       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_F35)
329 
330       /* Modifiers */
331       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Shift_L)
332       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Shift_R)
333       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Control_L)
334       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Control_R)
335       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Caps_Lock)
336       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Shift_Lock)
337 
338       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Meta_L)
339       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Meta_R)
340       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Alt_L)
341       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Alt_R)
342       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Super_L)
343       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Super_R)
344       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Hyper_L)
345       DARTPY_DEFINE_ENUM_KEY_SYMBOL(KEY_Hyper_R)
346       .export_values();
347   // clang-format on
348 
349 #define DARTPY_DEFINE_ENUM_MOD_KEY_MASK(val)                                   \
350   .value(#val, osgGA::GUIEventAdapter::ModKeyMask::val)
351 
352   // clang-format off
353   ::py::enum_<osgGA::GUIEventAdapter::ModKeyMask>(ea, "ModKeyMask")
354       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_SHIFT)
355       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_SHIFT)
356       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_CTRL  )
357       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_CTRL )
358       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_ALT   )
359       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_ALT  )
360       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_META  )
361       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_META )
362       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_SUPER )
363       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_SUPER)
364       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_LEFT_HYPER )
365       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_RIGHT_HYPER)
366       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_NUM_LOCK   )
367       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_CAPS_LOCK  )
368       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_CTRL       )
369       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_SHIFT      )
370       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_ALT        )
371       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_META       )
372       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_SUPER      )
373       DARTPY_DEFINE_ENUM_MOD_KEY_MASK(MODKEY_HYPER      )
374       .export_values();
375   // clang-format on
376 
377 #define DARTPY_DEFINE_ENUM_MOUSE_Y_ORIENTATION(val)                            \
378   .value(#val, osgGA::GUIEventAdapter::MouseYOrientation::val)
379 
380   // clang-format off
381   ::py::enum_<osgGA::GUIEventAdapter::MouseYOrientation>(
382       ea, "MouseYOrientation")
383       DARTPY_DEFINE_ENUM_MOUSE_Y_ORIENTATION(Y_INCREASING_UPWARDS)
384       DARTPY_DEFINE_ENUM_MOUSE_Y_ORIENTATION(Y_INCREASING_DOWNWARDS)
385       .export_values();
386   // clang-format on
387 
388 #define DARTPY_DEFINE_ENUM_SCROLLING_MOTION(val)                               \
389   .value(#val, osgGA::GUIEventAdapter::ScrollingMotion::val)
390 
391   // clang-format off
392   ::py::enum_<osgGA::GUIEventAdapter::ScrollingMotion>(ea, "ScrollingMotion")
393       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_NONE)
394       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_LEFT)
395       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_RIGHT)
396       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_UP)
397       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_DOWN)
398       DARTPY_DEFINE_ENUM_SCROLLING_MOTION(SCROLL_2D)
399       .export_values();
400   // clang-format on
401 
402 #define DARTPY_DEFINE_ENUM_TABLET_POINTER_TYPE(val)                            \
403   .value(#val, osgGA::GUIEventAdapter::TabletPointerType::val)
404 
405   // clang-format off
406   ::py::enum_<osgGA::GUIEventAdapter::TabletPointerType>(
407       ea, "TabletPointerType") DARTPY_DEFINE_ENUM_TABLET_POINTER_TYPE(UNKNOWN)
408       DARTPY_DEFINE_ENUM_TABLET_POINTER_TYPE(PEN)
409       DARTPY_DEFINE_ENUM_TABLET_POINTER_TYPE(PUCK)
410       DARTPY_DEFINE_ENUM_TABLET_POINTER_TYPE(ERASER)
411       .export_values();
412   // clang-format on
413 
414 #define DARTPY_DEFINE_ENUM_TOUCH_PHASE(val)                                    \
415   .value(#val, osgGA::GUIEventAdapter::TouchPhase::val)
416 
417   // clang-format off
418   ::py::enum_<osgGA::GUIEventAdapter::TouchPhase>(ea, "TouchPhase")
419       DARTPY_DEFINE_ENUM_TOUCH_PHASE(TOUCH_UNKNOWN)
420       DARTPY_DEFINE_ENUM_TOUCH_PHASE(TOUCH_BEGAN)
421       DARTPY_DEFINE_ENUM_TOUCH_PHASE(TOUCH_MOVED)
422       DARTPY_DEFINE_ENUM_TOUCH_PHASE(TOUCH_STATIONERY)
423       DARTPY_DEFINE_ENUM_TOUCH_PHASE(TOUCH_ENDED)
424       .export_values();
425   // clang-format on
426 
427   ::py::class_<osgGA::GUIActionAdapter>(m, "GUIActionAdapter");
428 
429   ::py::class_<osgGA::GUIEventHandler, ::osg::ref_ptr<osgGA::GUIEventHandler>>(
430       m, "__GUIEventHandler__")
431       .def(py::init<>());
432 
433   ::py::class_<
434       GUIEventHandlerNoRef,
435       osgGA::GUIEventHandler,
436       PyGUIEventHandler,
437       ::osg::ref_ptr<GUIEventHandlerNoRef>>(m, "GUIEventHandler")
438       .def(py::init<>());
439 }
440 
441 } // namespace python
442 } // namespace dart
443