[PATCH xserver] XKB: Redirect actions defunct with Gtk3 (XInput?)

Andreas Wettstein wettstein509 at solnet.ch
Sun Feb 19 02:18:19 PST 2012


When redirect actions are used with Gtk3, Gtk3 complains about
events not holding a GdkDevice.  This is caused by device IDs not
being set for redirect actions. The patch below sets them, but I
am not quite sure that the values are correct.  Anyway, the
warnings from Gtk3 warnings are gone.

More seriously, Gtk3 does not receive state changes redirect
actions might specify.  This is because event_set_state in
dix/inpututils.c accesses the prev_state field, but the changes
for the redirect action are only put into the state field.

Signed-off-by: Andreas Wettstein <wettstein509 at solnet.ch>
---
 xkb/xkbActions.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index da0bdea..da874f0 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -795,7 +795,7 @@ _XkbFilterRedirectKey(	XkbSrvInfoPtr	xkbi,
 {
 DeviceEvent	ev;
 int		x,y;
-XkbStateRec	old;
+XkbStateRec	old, old_prev;
 unsigned	mods,mask;
 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
 ProcessInputProc backupproc;
@@ -803,6 +803,7 @@ ProcessInputProc backupproc;
     /* never actually used uninitialised, but gcc isn't smart enough
      * to work that out. */
     memset(&old, 0, sizeof(old));
+    memset(&old_prev, 0, sizeof(old_prev));
     memset(&ev, 0, sizeof(ev));
 
     if ((filter->keycode!=0)&&(filter->keycode!=keycode))
@@ -814,6 +815,7 @@ ProcessInputProc backupproc;
     ev.time = GetTimeInMillis();
     ev.root_x = x;
     ev.root_y = y;
+    ev.deviceid = ev.sourceid = xkbi->device->id;
 
     if (filter->keycode==0) {		/* initial press */
 	if ((pAction->redirect.new_key<xkbi->desc->min_key_code)||
@@ -839,6 +841,7 @@ ProcessInputProc backupproc;
 
 	if ( mask || mods ) {
 	    old= xkbi->state;
+	    old_prev= xkbi->prev_state;
 	    xkbi->state.base_mods&= ~mask;
 	    xkbi->state.base_mods|= (mods&mask);
 	    xkbi->state.latched_mods&= ~mask;
@@ -846,15 +849,18 @@ ProcessInputProc backupproc;
 	    xkbi->state.locked_mods&= ~mask;
 	    xkbi->state.locked_mods|= (mods&mask);
 	    XkbComputeDerivedState(xkbi);
+	    xkbi->prev_state= xkbi->state;
 	}
 
 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
 	xkbi->device->public.processInputProc((InternalEvent*)&ev, xkbi->device);
 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
 				     backupproc,xkbUnwrapProc);
-	
-	if ( mask || mods )
+
+	if ( mask || mods ) {
 	    xkbi->state= old;
+	    xkbi->prev_state= old_prev;
+	}
     }
     else if (filter->keycode==keycode) {
 
@@ -870,6 +876,7 @@ ProcessInputProc backupproc;
 
 	if ( mask || mods ) {
 	    old= xkbi->state;
+	    old_prev= xkbi->prev_state;
 	    xkbi->state.base_mods&= ~mask;
 	    xkbi->state.base_mods|= (mods&mask);
 	    xkbi->state.latched_mods&= ~mask;
@@ -877,6 +884,7 @@ ProcessInputProc backupproc;
 	    xkbi->state.locked_mods&= ~mask;
 	    xkbi->state.locked_mods|= (mods&mask);
 	    XkbComputeDerivedState(xkbi);
+	    xkbi->prev_state= xkbi->state;
 	}
 
 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
@@ -884,8 +892,10 @@ ProcessInputProc backupproc;
 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
 				     backupproc,xkbUnwrapProc);
 
-	if ( mask || mods )
+	if ( mask || mods ) {
 	    xkbi->state= old;
+	    xkbi->prev_state= old_prev;
+	}
 
 	filter->keycode= 0;
 	filter->active= 0;
-- 
1.7.6



More information about the xorg-devel mailing list