2014-02-21 21:49:29 +01:00

206 lines
6.5 KiB
C

// ---------------------------------------------------------------------------
//
// @file TwEventX11.c
// @brief Helper:
// translate and forward mouse and keyboard events
// from X11 to AntTweakBar
//
// @contrib Greg Popovitch
// @license This file is part of the AntTweakBar library.
// For conditions of distribution and use, see License.txt
//
// ---------------------------------------------------------------------------
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xutil.h>
#include <AntTweakBar.h>
static int s_KMod = 0;
const int buff_sz = 80;
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
static int _XKeyRelease(XEvent *event)
{
KeySym keysym;
char buffer[buff_sz];
XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);
switch (keysym)
{
case XK_Control_L:
case XK_Control_R: s_KMod &= ~TW_KMOD_CTRL; break;
case XK_Shift_L:
case XK_Shift_R: s_KMod &= ~TW_KMOD_SHIFT; break;
case XK_Alt_L:
case XK_Alt_R: s_KMod &= ~TW_KMOD_ALT; break;
}
return 0;
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
static int _XKeyPress(XEvent *event)
{
int modifiers = 0; // modifiers sent to AntTweakBar
int k = 0; // key sent to AntTweakBar
KeySym keysym;
char buffer[buff_sz];
int num_char = XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0);
if (event->xkey.state & ControlMask)
modifiers |= TW_KMOD_CTRL;
if (event->xkey.state & ShiftMask)
modifiers |= TW_KMOD_SHIFT;
if (event->xkey.state & Mod1Mask)
modifiers |= TW_KMOD_ALT;
switch (keysym)
{
case XK_Control_L:
case XK_Control_R: s_KMod |= TW_KMOD_CTRL; break;
case XK_Shift_L:
case XK_Shift_R: s_KMod |= TW_KMOD_SHIFT; break;
case XK_Alt_L:
case XK_Alt_R: s_KMod |= TW_KMOD_ALT; break;
case XK_Escape: k = TW_KEY_ESCAPE; break;
case XK_Help: k = TW_KEY_F1; break;
case XK_F1: k = TW_KEY_F1; break;
case XK_F2: k = TW_KEY_F2; break;
case XK_F3: k = TW_KEY_F3; break;
case XK_F4: k = TW_KEY_F4; break;
case XK_F5: k = TW_KEY_F5; break;
case XK_F6: k = TW_KEY_F6; break;
case XK_F7: k = TW_KEY_F7; break;
case XK_F8: k = TW_KEY_F8; break;
case XK_F9: k = TW_KEY_F9; break;
case XK_F10: k = TW_KEY_F10; break;
case XK_F11: k = TW_KEY_F11; break;
case XK_F12: k = TW_KEY_F12; break;
case XK_Up: k = TW_KEY_UP; break;
case XK_Down: k = TW_KEY_DOWN; break;
case XK_Right: k = TW_KEY_RIGHT; break;
case XK_Left: k = TW_KEY_LEFT; break;
case XK_Return: k = TW_KEY_RETURN; break;
case XK_Insert: k = TW_KEY_INSERT; break;
case XK_Delete: k = TW_KEY_DELETE; break;
case XK_BackSpace: k = TW_KEY_BACKSPACE; break;
case XK_Home: k = TW_KEY_HOME; break;
case XK_Tab: k = TW_KEY_TAB; break;
case XK_End: k = TW_KEY_END; break;
#ifdef XK_Enter
case XK_Enter: k = TW_KEY_RETURN; break;
#endif
#ifdef XK_KP_Home
case XK_KP_Home: k = TW_KEY_HOME; break;
case XK_KP_End: k = TW_KEY_END; break;
case XK_KP_Delete: k = TW_KEY_DELETE; break;
#endif
#ifdef XK_KP_Up
case XK_KP_Up: k = TW_KEY_UP; break;
case XK_KP_Down: k = TW_KEY_DOWN; break;
case XK_KP_Right: k = TW_KEY_RIGHT; break;
case XK_KP_Left: k = TW_KEY_LEFT; break;
#endif
#ifdef XK_KP_Page_Up
case XK_KP_Page_Up: k = TW_KEY_PAGE_UP; break;
case XK_KP_Page_Down: k = TW_KEY_PAGE_DOWN; break;
#endif
#ifdef XK_KP_Tab
case XK_KP_Tab: k = TW_KEY_TAB; break;
#endif
default:
if (0)
{
// should we do that, or rely on the buffer (see code below)
if (keysym > 12 && keysym < 127)
k = keysym;
}
break;
}
if (k == 0 && num_char)
{
int i, handled = 0;
for (i=0; i<num_char; ++i)
if (TwKeyPressed(buffer[i], modifiers))
handled = 1;
return handled;
}
// if we have a valid key, send to AntTweakBar
// -------------------------------------------
return (k > 0) ? TwKeyPressed(k, modifiers) : 0;
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
static int _XButtonEvent(XEvent *event)
{
TwMouseAction action = (event->type == ButtonPress) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED;
XButtonEvent *xbe = (XButtonEvent *)event;
return TwMouseButton(action, xbe->button);
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
static int _XConfigureEvent(XEvent *event)
{
XConfigureEvent *xce = (XConfigureEvent *)event;
TwWindowSize(xce->width, xce->height);
return 0;
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
static int _XMotionEvent(XEvent *event)
{
XMotionEvent *xme = (XMotionEvent *)event;
return TwMouseMotion(xme->x, xme->y);
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
TW_API int TW_CDECL_CALL TwEventX11(void *xevent)
{
XEvent *event = (XEvent *)xevent;
switch (event->type)
{
case KeyPress:
return _XKeyPress(xevent);
case KeyRelease:
return 0; // _XKeyRelease(xevent);
case ButtonPress:
case ButtonRelease:
return _XButtonEvent(xevent);
case MotionNotify:
return _XMotionEvent(xevent);
case ConfigureNotify:
return _XConfigureEvent(xevent);
default:
break;
}
return 0;
}