Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Extras / CDTestFramework / AntTweakBar / src / TwEventX11.c
1 //  ---------------------------------------------------------------------------\r
2 //\r
3 //  @file       TwEventX11.c\r
4 //  @brief      Helper: \r
5 //              translate and forward mouse and keyboard events \r
6 //              from X11 to AntTweakBar\r
7 //  \r
8 //  @contrib    Greg Popovitch\r
9 //  @license    This file is part of the AntTweakBar library.\r
10 //              For conditions of distribution and use, see License.txt\r
11 //\r
12 //  ---------------------------------------------------------------------------\r
13 \r
14 #include <X11/Xlib.h>\r
15 #include <X11/keysym.h>\r
16 #include <X11/Xutil.h>\r
17 #include <AntTweakBar.h>\r
18 \r
19 static int s_KMod = 0;\r
20 const int buff_sz = 80;\r
21 \r
22 // ----------------------------------------------------------------------\r
23 // ----------------------------------------------------------------------\r
24 static int _XKeyRelease(XEvent *event)\r
25 {\r
26     KeySym keysym;\r
27     char buffer[buff_sz];\r
28         \r
29     XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);\r
30 \r
31     switch (keysym)\r
32     {\r
33     case XK_Control_L:\r
34     case XK_Control_R: s_KMod  &= ~TW_KMOD_CTRL;  break;\r
35 \r
36     case XK_Shift_L:\r
37     case XK_Shift_R:   s_KMod &= ~TW_KMOD_SHIFT;  break;\r
38 \r
39     case XK_Alt_L:\r
40     case XK_Alt_R:     s_KMod &= ~TW_KMOD_ALT;    break;\r
41     }\r
42     return 0;\r
43 }\r
44 \r
45 // ----------------------------------------------------------------------\r
46 // ----------------------------------------------------------------------\r
47 static int _XKeyPress(XEvent *event)\r
48 {\r
49     int modifiers = 0;  // modifiers sent to AntTweakBar\r
50     int k = 0;          // key sent to AntTweakBar\r
51     KeySym keysym;\r
52     char buffer[buff_sz];\r
53         \r
54     int num_char = XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);\r
55 \r
56     if (event->xkey.state & ControlMask)\r
57         modifiers |= TW_KMOD_CTRL;\r
58     if (event->xkey.state & ShiftMask)\r
59         modifiers |= TW_KMOD_SHIFT;\r
60     if (event->xkey.state & Mod1Mask)\r
61         modifiers |= TW_KMOD_ALT;\r
62 \r
63     switch (keysym)\r
64     {\r
65     case XK_Control_L:\r
66     case XK_Control_R: s_KMod |= TW_KMOD_CTRL;  break;\r
67 \r
68     case XK_Shift_L:\r
69     case XK_Shift_R:   s_KMod |= TW_KMOD_SHIFT; break;\r
70 \r
71     case XK_Alt_L:\r
72     case XK_Alt_R:     s_KMod |= TW_KMOD_ALT;   break;\r
73 \r
74     case XK_Escape:    k = TW_KEY_ESCAPE;    break;\r
75     case XK_Help:      k = TW_KEY_F1;        break;\r
76     case XK_F1:        k = TW_KEY_F1;        break;\r
77     case XK_F2:        k = TW_KEY_F2;        break;\r
78     case XK_F3:        k = TW_KEY_F3;        break;\r
79     case XK_F4:        k = TW_KEY_F4;        break;\r
80     case XK_F5:        k = TW_KEY_F5;        break;\r
81     case XK_F6:        k = TW_KEY_F6;        break;\r
82     case XK_F7:        k = TW_KEY_F7;        break;\r
83     case XK_F8:        k = TW_KEY_F8;        break;\r
84     case XK_F9:        k = TW_KEY_F9;        break;\r
85     case XK_F10:       k = TW_KEY_F10;       break;\r
86     case XK_F11:       k = TW_KEY_F11;       break;\r
87     case XK_F12:       k = TW_KEY_F12;       break;\r
88     case XK_Up:        k = TW_KEY_UP;        break;\r
89     case XK_Down:      k = TW_KEY_DOWN;      break;\r
90     case XK_Right:     k = TW_KEY_RIGHT;     break;\r
91     case XK_Left:      k = TW_KEY_LEFT;      break;\r
92     case XK_Return:    k = TW_KEY_RETURN;    break;\r
93     case XK_Insert:    k = TW_KEY_INSERT;    break;\r
94     case XK_Delete:    k = TW_KEY_DELETE;    break;\r
95     case XK_BackSpace: k = TW_KEY_BACKSPACE; break;\r
96     case XK_Home:      k = TW_KEY_HOME;      break;\r
97     case XK_Tab:       k = TW_KEY_TAB;       break;\r
98     case XK_End:       k = TW_KEY_END;       break;\r
99 \r
100 #ifdef XK_Enter\r
101     case XK_Enter:     k = TW_KEY_RETURN;    break;\r
102 #endif\r
103 \r
104 #ifdef XK_KP_Home\r
105     case XK_KP_Home:   k = TW_KEY_HOME;      break;\r
106     case XK_KP_End:    k = TW_KEY_END;       break;\r
107     case XK_KP_Delete: k = TW_KEY_DELETE;    break;\r
108 #endif\r
109 \r
110 #ifdef XK_KP_Up\r
111     case XK_KP_Up:     k = TW_KEY_UP;        break;\r
112     case XK_KP_Down:   k = TW_KEY_DOWN;      break;\r
113     case XK_KP_Right:  k = TW_KEY_RIGHT;     break;\r
114     case XK_KP_Left:   k = TW_KEY_LEFT;      break;\r
115 #endif\r
116 \r
117 #ifdef XK_KP_Page_Up\r
118     case XK_KP_Page_Up:   k = TW_KEY_PAGE_UP;    break;\r
119     case XK_KP_Page_Down: k = TW_KEY_PAGE_DOWN;  break;\r
120 #endif\r
121 \r
122 #ifdef XK_KP_Tab\r
123     case XK_KP_Tab:    k = TW_KEY_TAB;       break;\r
124 #endif\r
125 \r
126     default:\r
127         if (0)\r
128         {\r
129             // should we do that, or rely on the buffer (see code below)\r
130             if (keysym > 12 && keysym < 127) \r
131                 k = keysym;\r
132         }\r
133         break;\r
134     }  \r
135         \r
136     if (k == 0 && num_char)\r
137     {\r
138         int i, handled = 0;\r
139         for (i=0; i<num_char; ++i)\r
140             if (TwKeyPressed(buffer[i], modifiers))\r
141                 handled = 1;\r
142         return handled;\r
143     }\r
144 \r
145     // if we have a valid key, send to AntTweakBar\r
146     // -------------------------------------------\r
147     return (k > 0) ? TwKeyPressed(k, modifiers) : 0;\r
148 }\r
149 \r
150 // ----------------------------------------------------------------------\r
151 // ----------------------------------------------------------------------\r
152 static int _XButtonEvent(XEvent *event)\r
153 {\r
154     TwMouseAction action = (event->type == ButtonPress) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED;\r
155     XButtonEvent *xbe = (XButtonEvent *)event;\r
156     return TwMouseButton(action, xbe->button);\r
157 }\r
158     \r
159 // ----------------------------------------------------------------------\r
160 // ----------------------------------------------------------------------\r
161 static int _XConfigureEvent(XEvent *event)\r
162 {\r
163     XConfigureEvent *xce = (XConfigureEvent *)event;\r
164     TwWindowSize(xce->width, xce->height);\r
165     return 0;\r
166 }\r
167 \r
168 // ----------------------------------------------------------------------\r
169 // ----------------------------------------------------------------------\r
170 static int _XMotionEvent(XEvent *event)\r
171 {\r
172     XMotionEvent *xme = (XMotionEvent *)event;\r
173     return TwMouseMotion(xme->x, xme->y);\r
174 }\r
175 \r
176 // ----------------------------------------------------------------------\r
177 // ----------------------------------------------------------------------\r
178 TW_API int TW_CDECL_CALL TwEventX11(void *xevent)\r
179 {\r
180     XEvent *event = (XEvent *)xevent;\r
181     \r
182     switch (event->type)\r
183     {\r
184     case KeyPress:    \r
185         return _XKeyPress(xevent);\r
186 \r
187     case KeyRelease:  \r
188         return 0; // _XKeyRelease(xevent);\r
189 \r
190     case ButtonPress: \r
191     case ButtonRelease: \r
192         return _XButtonEvent(xevent);\r
193 \r
194     case MotionNotify:\r
195         return _XMotionEvent(xevent);\r
196 \r
197     case ConfigureNotify:\r
198         return _XConfigureEvent(xevent);\r
199 \r
200     default:  \r
201         break;\r
202     }\r
203     return 0;\r
204 }\r
205         \r