xserver: Branch 'master' - 3 commits

Keith Packard keithp at kemper.freedesktop.org
Fri Jan 16 10:46:00 PST 2015


 Xi/exevents.c           |    5 +++--
 hw/kdrive/ephyr/ephyr.c |    8 +++++++-
 hw/xnest/Keyboard.c     |    9 ++++++++-
 3 files changed, 18 insertions(+), 4 deletions(-)

New commits:
commit 5f2e8ac51ccbf7c02f25c8cb7617df0238418cd1
Merge: 4e12d7b 4301479
Author: Keith Packard <keithp at keithp.com>
Date:   Sat Jan 10 14:51:57 2015 +1300

    Merge remote-tracking branch 'whot/for-keith'

commit 43014795087a0a8774dd9687f5967329b15f06a2
Author: Olivier Fourdan <ofourdan at redhat.com>
Date:   Mon Jan 5 16:44:22 2015 +0100

    Synchronize capslock in Xnest and Xephyr
    
    In Xnest or Xephyr, pressing CapsLock when focus is on another
    window does not update the state in the nested X server.
    
    This is because when synchronizing the lock modifier, sending a
    keypress or a key release only is not sufficient to toggle the state,
    unlike regular modifiers, one has to emulate a full press/release
    to lock or unlock the modifier.
    
    Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 907bbeb..164ebdc 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -806,7 +806,11 @@ ephyrUpdateModifierState(unsigned int state)
 
             for (key = 0; key < MAP_LENGTH; key++)
                 if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
-                    if (key_is_down(pDev, key, KEY_PROCESSED))
+                    if (mask == XCB_MOD_MASK_LOCK) {
+                        KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE);
+                        KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE);
+                    }
+                    else if (key_is_down(pDev, key, KEY_PROCESSED))
                         KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE);
 
                     if (--count == 0)
@@ -820,6 +824,8 @@ ephyrUpdateModifierState(unsigned int state)
             for (key = 0; key < MAP_LENGTH; key++)
                 if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
                     KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE);
+                    if (mask == XCB_MOD_MASK_LOCK)
+                        KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE);
                     break;
                 }
     }
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index 2cf1624..ee3f68e 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -18,6 +18,7 @@ is" without express or implied warranty.
 
 #include <X11/X.h>
 #include <X11/Xproto.h>
+#include <xcb/xcb_keysyms.h>
 #include <X11/keysym.h>
 #include "screenint.h"
 #include "inputstr.h"
@@ -247,7 +248,11 @@ xnestUpdateModifierState(unsigned int state)
 
             for (key = 0; key < MAP_LENGTH; key++)
                 if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
-                    if (key_is_down(pDev, key, KEY_PROCESSED))
+                    if (mask == XCB_MOD_MASK_LOCK) {
+                        xnestQueueKeyEvent(KeyPress, key);
+                        xnestQueueKeyEvent(KeyRelease, key);
+                    }
+                    else if (key_is_down(pDev, key, KEY_PROCESSED))
                         xnestQueueKeyEvent(KeyRelease, key);
 
                     if (--count == 0)
@@ -261,6 +266,8 @@ xnestUpdateModifierState(unsigned int state)
             for (key = 0; key < MAP_LENGTH; key++)
                 if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
                     xnestQueueKeyEvent(KeyPress, key);
+                    if (mask == XCB_MOD_MASK_LOCK)
+                        xnestQueueKeyEvent(KeyRelease, key);
                     break;
                 }
     }
commit 24b943132f90bc72ce8b5dc954fe9ee8484edfc2
Author: Olivier Fourdan <fourdan at xfce.org>
Date:   Fri Jan 2 18:50:17 2015 +0100

    Fix subwindow in Xi emulated events
    
    Bug: 70790
    
    Signed-off-by: Olivier Fourdan <fourdan at xfce.org>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index b0bc47e..0857bce 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1403,7 +1403,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
 
             if (grab->ownerEvents) {
                 WindowPtr focus = NullWindow;
-                WindowPtr sprite_win = dev->spriteInfo->sprite->win;
+                WindowPtr sprite_win = DeepestSpriteWin(dev->spriteInfo->sprite);
 
                 deliveries = DeliverDeviceEvents(sprite_win, ptrev, grab, focus, dev);
             }
@@ -1429,8 +1429,9 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
     }
     else {
         GrabPtr devgrab = dev->deviceGrab.grab;
+        WindowPtr sprite_win = DeepestSpriteWin(dev->spriteInfo->sprite);
 
-        DeliverDeviceEvents(win, ptrev, grab, win, dev);
+        DeliverDeviceEvents(sprite_win, ptrev, grab, win, dev);
         /* FIXME: bad hack
          * Implicit passive grab activated in response to this event. Store
          * the event.


More information about the xorg-commit mailing list