1 // ---------------------------------------------------------------------------
\r
3 // @file TwEventX11.c
\r
5 // translate and forward mouse and keyboard events
\r
6 // from X11 to AntTweakBar
\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
12 // ---------------------------------------------------------------------------
\r
14 #include <X11/Xlib.h>
\r
15 #include <X11/keysym.h>
\r
16 #include <X11/Xutil.h>
\r
17 #include <AntTweakBar.h>
\r
19 static int s_KMod = 0;
\r
20 const int buff_sz = 80;
\r
22 // ----------------------------------------------------------------------
\r
23 // ----------------------------------------------------------------------
\r
24 static int _XKeyRelease(XEvent *event)
\r
27 char buffer[buff_sz];
\r
29 XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);
\r
34 case XK_Control_R: s_KMod &= ~TW_KMOD_CTRL; break;
\r
37 case XK_Shift_R: s_KMod &= ~TW_KMOD_SHIFT; break;
\r
40 case XK_Alt_R: s_KMod &= ~TW_KMOD_ALT; break;
\r
45 // ----------------------------------------------------------------------
\r
46 // ----------------------------------------------------------------------
\r
47 static int _XKeyPress(XEvent *event)
\r
49 int modifiers = 0; // modifiers sent to AntTweakBar
\r
50 int k = 0; // key sent to AntTweakBar
\r
52 char buffer[buff_sz];
\r
54 int num_char = XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);
\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
66 case XK_Control_R: s_KMod |= TW_KMOD_CTRL; break;
\r
69 case XK_Shift_R: s_KMod |= TW_KMOD_SHIFT; break;
\r
72 case XK_Alt_R: s_KMod |= TW_KMOD_ALT; break;
\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
101 case XK_Enter: k = TW_KEY_RETURN; break;
\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
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
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
123 case XK_KP_Tab: k = TW_KEY_TAB; break;
\r
129 // should we do that, or rely on the buffer (see code below)
\r
130 if (keysym > 12 && keysym < 127)
\r
136 if (k == 0 && num_char)
\r
138 int i, handled = 0;
\r
139 for (i=0; i<num_char; ++i)
\r
140 if (TwKeyPressed(buffer[i], modifiers))
\r
145 // if we have a valid key, send to AntTweakBar
\r
146 // -------------------------------------------
\r
147 return (k > 0) ? TwKeyPressed(k, modifiers) : 0;
\r
150 // ----------------------------------------------------------------------
\r
151 // ----------------------------------------------------------------------
\r
152 static int _XButtonEvent(XEvent *event)
\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
159 // ----------------------------------------------------------------------
\r
160 // ----------------------------------------------------------------------
\r
161 static int _XConfigureEvent(XEvent *event)
\r
163 XConfigureEvent *xce = (XConfigureEvent *)event;
\r
164 TwWindowSize(xce->width, xce->height);
\r
168 // ----------------------------------------------------------------------
\r
169 // ----------------------------------------------------------------------
\r
170 static int _XMotionEvent(XEvent *event)
\r
172 XMotionEvent *xme = (XMotionEvent *)event;
\r
173 return TwMouseMotion(xme->x, xme->y);
\r
176 // ----------------------------------------------------------------------
\r
177 // ----------------------------------------------------------------------
\r
178 TW_API int TW_CDECL_CALL TwEventX11(void *xevent)
\r
180 XEvent *event = (XEvent *)xevent;
\r
182 switch (event->type)
\r
185 return _XKeyPress(xevent);
\r
188 return 0; // _XKeyRelease(xevent);
\r
191 case ButtonRelease:
\r
192 return _XButtonEvent(xevent);
\r
195 return _XMotionEvent(xevent);
\r
197 case ConfigureNotify:
\r
198 return _XConfigureEvent(xevent);
\r