From 24b943132f90bc72ce8b5dc954fe9ee8484edfc2 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Fri, 2 Jan 2015 18:50:17 +0100 Subject: [PATCH 1/2] Fix subwindow in Xi emulated events Bug: 70790 Signed-off-by: Olivier Fourdan --- Xi/exevents.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index b0bc47e6d..0857bcee6 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. From 43014795087a0a8774dd9687f5967329b15f06a2 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Mon, 5 Jan 2015 16:44:22 +0100 Subject: [PATCH 2/2] 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- hw/kdrive/ephyr/ephyr.c | 8 +++++++- hw/xnest/Keyboard.c | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index 907bbebae..164ebdcba 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 2cf16246b..ee3f68e3f 100644 --- a/hw/xnest/Keyboard.c +++ b/hw/xnest/Keyboard.c @@ -18,6 +18,7 @@ is" without express or implied warranty. #include #include +#include #include #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; } }