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 <wettstein...@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

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to