Hi list,

since some time, XkbSetDetectableAutoRepeat is broken.
XkbSetDetectableAutoRepeat works by filtering in XkbFilterEvent all
events that are equal to the previously stored XkbLastRepeatEvent(in
AccessXKeyboardEvent). This is done by comparing the memory location. In
current xservers, events get translated after they are created in
AccessXKeyboardEvent and before XkbFilterEvent sees them, so this test
does not work. For now, comparing time fixes this, but i don't know if
that is sufficient. Attached patch does just this, and works here.

Regards,
  Pierre
commit fe9c299342c5d96750160992f66231a4044d0463
Author: Pierre Willenbrock <[email protected]>
Date:   Fri Jun 5 13:13:37 2009 +0200

    Bandaid fix to repair XkbSetDetectableAutoRepeat

diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index e56694d..b3e3703 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -938,14 +938,14 @@ XkbSrvInfoPtr	xkbi;
 	    DebugF("[xkb]    Event state= 0x%04x\n",xE[0].u.keyButtonPointer.state);
 	    DebugF("[xkb]    XkbLastRepeatEvent!=xE (0x%p!=0x%p) %s\n",
 			XkbLastRepeatEvent,xE,
-			((XkbLastRepeatEvent!=(pointer)xE)?"True":"False"));
+		   ((XkbLastRepeatEvent!=NULL && ((DeviceEvent*)XkbLastRepeatEvent)->time == xE->u.keyButtonPointer.time)?"True":"False"));
 	    DebugF("[xkb]   (xkbClientEventsFlags&XWDA)==0 (0x%x) %s\n",
 		pClient->xkbClientFlags,
 		(_XkbWantsDetectableAutoRepeat(pClient)?"True":"False"));
 	    DebugF("[xkb]   !IsRelease(%d) %s\n",xE[0].u.u.type,
 			(!_XkbIsReleaseEvent(xE[0].u.u.type))?"True":"False");
 	}
-	if (	(XkbLastRepeatEvent==(pointer)xE) &&
+	if (	(XkbLastRepeatEvent!=NULL && ((DeviceEvent*)XkbLastRepeatEvent)->time == xE->u.keyButtonPointer.time) &&
 	     	(_XkbWantsDetectableAutoRepeat(pClient)) &&
 	     	(_XkbIsReleaseEvent(xE[0].u.u.type)) ) {
 	    return False;
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to