[teklib-general] teklib: Added proper detection of keyup events; added TITYPE_KEY...
Timm S. Mueller
tmueller at neoscientists.org
Sat Mar 15 02:43:36 CET 2008
details: http://hg.teklib.org/teklib/rev/5c814177c18b
changeset: 163:5c814177c18b
user: Timm S. Mueller <tmueller at neoscientists.org>
date: Sat Mar 15 02:42:54 2008 +0100
description:
Added proper detection of keyup events; added TITYPE_KEYDOWN and
TITYPE_KEYUP, TITYPE_COOKEDKEY is now an alias for TITYPE_KEYDOWN
diffs (truncated from 461 to 100 lines):
diff -r 9c2af9553e02 -r 5c814177c18b src/display_x11/display_x11_api.c
--- a/src/display_x11/display_x11_api.c Thu Mar 13 23:21:07 2008 +0100
+++ b/src/display_x11/display_x11_api.c Sat Mar 15 02:42:54 2008 +0100
@@ -211,7 +211,9 @@ x11_setinput(TMOD_X11 *mod, struct TVReq
x11_mask |= FocusChangeMask;
if (eventmask & TITYPE_NEWSIZE)
x11_mask |= StructureNotifyMask;
- if (eventmask & TITYPE_COOKEDKEY)
+ if (eventmask & TITYPE_KEYDOWN)
+ x11_mask |= KeyPressMask | KeyReleaseMask;
+ if (eventmask & TITYPE_KEYUP)
x11_mask |= KeyPressMask | KeyReleaseMask;
if (eventmask & TITYPE_MOUSEMOVE)
x11_mask |= PointerMotionMask | OwnerGrabButtonMask |
diff -r 9c2af9553e02 -r 5c814177c18b src/display_x11/display_x11_inst.c
--- a/src/display_x11/display_x11_inst.c Thu Mar 13 23:21:07 2008 +0100
+++ b/src/display_x11/display_x11_inst.c Sat Mar 15 02:42:54 2008 +0100
@@ -173,6 +173,8 @@ x11_initinstance(TAPTR task)
if (inst->x11_Display == TNULL)
break;
+ XkbSetDetectableAutoRepeat(inst->x11_Display, TTRUE, TNULL);
+
inst->x11_fd_display = ConnectionNumber(inst->x11_Display);
inst->x11_Screen = DefaultScreen(inst->x11_Display);
inst->x11_Visual = DefaultVisual(inst->x11_Display, inst->x11_Screen);
@@ -528,13 +530,192 @@ static TBOOL getimsg(TMOD_X11 *mod, VISU
return TFALSE;
}
-static TBOOL
-x11_processvisualevent(TMOD_X11 *mod, VISUAL *v, TAPTR msgstate, XEvent *ev)
-{
- TIMSG *imsg;
+static TBOOL processkey(TMOD_X11 *mod, VISUAL *v, XKeyEvent *ev, TBOOL keydown)
+{
KeySym keysym;
XComposeStatus compose;
char buffer[10];
+
+ TIMSG *imsg;
+ TUINT evtype = 0;
+ TUINT newqual;
+ TUINT evmask = v->eventmask;
+ TBOOL newkey = TFALSE;
+
+ v->mousex = (TINT) ev->x;
+ v->mousey = (TINT) ev->y;
+
+ XLookupString(ev, buffer, 10, &keysym, &compose);
+
+ switch (keysym)
+ {
+ case XK_Shift_L:
+ newqual = TKEYQ_LSHIFT;
+ break;
+ case XK_Shift_R:
+ newqual = TKEYQ_RSHIFT;
+ break;
+ case XK_Control_L:
+ newqual = TKEYQ_LCTRL;
+ break;
+ case XK_Control_R:
+ newqual = TKEYQ_RCTRL;
+ break;
+ case XK_Alt_L:
+ newqual = TKEYQ_LALT;
+ break;
+ case XK_Alt_R:
+ newqual = TKEYQ_RALT;
+ break;
+ default:
+ newqual = 0;
+ }
+
+ if (newqual != 0)
+ {
+ if (keydown)
+ v->keyqual |= newqual;
+ else
+ v->keyqual &= ~newqual;
+ }
+
+ if (keydown && (evmask & TITYPE_KEYDOWN))
+ evtype = TITYPE_KEYDOWN;
+ else if (!keydown && (evmask & TITYPE_KEYUP))
+ evtype = TITYPE_KEYUP;
+
+ if (evtype && getimsg(mod, v, &imsg, evtype))
+ {
+ imsg->timsg_Qualifier = v->keyqual;
+
+ if (keysym >= XK_F1 && keysym <= XK_F12)
+ {
+ imsg->timsg_Code = (TUINT) (keysym - XK_F1) + TKEYC_F1;
+ newkey = TTRUE;
+ }
+ else if (keysym < 256)
+ {
+ imsg->timsg_Code = keysym; /* cooked ASCII code */
More information about the teklib-general
mailing list