[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