From 4a957c9e81233344da0b5b9388ca2d97eedde7d5 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 15 Nov 2012 14:00:57 +1000 Subject: [PATCH 1/5] When resetting device idle time, reset XIAll(Master)Devices too (#56649) When the screen saver is forcibly deactivated, the idle time counter is reset for all devices but not for the fake XIAllDevices and XIAllMasterDevices. XScreenSaverQueryInfo uses XIAlldevices to fill the "idle" field, thus returning the wrong value. Regression introduced in commit 6aef209ebc2e54f5465da505a780f7b4cc273ee0 Author: Peter Hutterer Date: Mon Mar 12 13:51:02 2012 +1000 Change lastDeviceIdleTime to be per-device X.Org Bug 56649 Signed-off-by: Peter Hutterer Tested-by: Giacomo Perale Reviewed-by: Keith Packard (cherry picked from commit 2dc6d9228456cbc274a1fcea478258e5ae4dc629) --- Xext/saver.c | 2 ++ dix/window.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Xext/saver.c b/Xext/saver.c index ac4a633e7..f73e2a21f 100644 --- a/Xext/saver.c +++ b/Xext/saver.c @@ -393,6 +393,8 @@ ScreenSaverFreeSuspend(pointer value, XID id) UpdateCurrentTimeIf(); nt_list_for_each_entry(dev, inputInfo.devices, next) lastDeviceEventTime[dev->id] = currentTime; + lastDeviceEventTime[XIAllDevices] = currentTime; + lastDeviceEventTime[XIAllMasterDevices] = currentTime; SetScreenSaverTimer(); } } diff --git a/dix/window.c b/dix/window.c index cdd12dca6..49ef4a081 100644 --- a/dix/window.c +++ b/dix/window.c @@ -3132,6 +3132,8 @@ dixSaveScreens(ClientPtr client, int on, int mode) UpdateCurrentTimeIf(); nt_list_for_each_entry(dev, inputInfo.devices, next) lastDeviceEventTime[dev->id] = currentTime; + lastDeviceEventTime[XIAllDevices] = currentTime; + lastDeviceEventTime[XIAllMasterDevices] = currentTime; } SetScreenSaverTimer(); } From 2def985466683cf3746c03f9ac318e5941d22f86 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 20 Nov 2012 14:50:41 -0500 Subject: [PATCH 2/5] cursor: Revise edge cases for the pointer moving towards barriers Since barriers block the invisible line between pixels, that means that we need to explicitly check the boundaries, or else we'll have a potential off-by-one error. This fixes issues when trying to move down or right across a barrier and having the pointer visibly bounce. Signed-off-by: Jasper St. Pierre Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer (cherry picked from commit a51b2c3913fc8556f6bd1c76805d045fc424c4bb) --- xfixes/cursor.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xfixes/cursor.c b/xfixes/cursor.c index 4eee59246..4d4a75e3e 100644 --- a/xfixes/cursor.c +++ b/xfixes/cursor.c @@ -1090,7 +1090,11 @@ barrier_is_blocking(const struct PointerBarrier * barrier, if (dir & BarrierNegativeX && x1 == (barrier->x1 - 1)) return FALSE; /* startpoint adjacent to barrier, moving towards -> block */ - if (x1 == barrier->x1 && y1 >= barrier->y1 && y1 <= barrier->y2) { + if (dir & BarrierPositiveX && x1 == (barrier->x1 - 1) && y1 >= barrier->y1 && y1 <= barrier->y2) { + *distance = 0; + return TRUE; + } + if (dir & BarrierNegativeX && x1 == barrier->x1 && y1 >= barrier->y1 && y1 <= barrier->y2) { *distance = 0; return TRUE; } @@ -1102,7 +1106,11 @@ barrier_is_blocking(const struct PointerBarrier * barrier, if (dir & BarrierNegativeY && y1 == (barrier->y1 - 1)) return FALSE; /* startpoint adjacent to barrier, moving towards -> block */ - if (y1 == barrier->y1 && x1 >= barrier->x1 && x1 <= barrier->x2) { + if (dir & BarrierPositiveY && y1 == (barrier->y1 - 1) && x1 >= barrier->x1 && x1 <= barrier->x2) { + *distance = 0; + return TRUE; + } + if (dir & BarrierNegativeY && y1 == barrier->y1 && x1 >= barrier->x1 && x1 <= barrier->x2) { *distance = 0; return TRUE; } From 73bd33b4d4e3df4a8097826695a8dbdc2fb5c920 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 26 Jun 2012 10:30:35 +1000 Subject: [PATCH 3/5] xkb: fill in keycode and event type for slow keys enablement eventType is set for the type that triggered a XkbControlsNotify event. Technically, SlowKeys is triggered by a timer which doesn't have a matching core event type. So we used to use 0 here. Practically, the timer is triggered by a key press + hold and cancelled when the key is released before the timeout expires. So we might as well set KeyPress (keycode) in the ControlsNotify to give clients a chance to differ between timer-triggered SlowKeys and client-triggered ones. This is a chance in behaviour, though I suspect with little impact. Signed-off-by: Peter Hutterer Acked-by: Daniel Stone (cherry picked from commit 2c4388a00ec308bc2d48ba751ff510cd5c1b2384) --- include/xkbsrv.h | 1 + xkb/xkbAccessX.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/xkbsrv.h b/include/xkbsrv.h index d58478543..78b8f5abe 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -171,6 +171,7 @@ typedef struct _XkbSrvInfo { KeyCode mouseKey; KeyCode inactiveKey; KeyCode slowKey; + KeyCode slowKeyEnableKey; KeyCode repeatKey; CARD8 krgTimerActive; CARD8 beepType; diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c index c1af32eb9..21df85d94 100644 --- a/xkb/xkbAccessX.c +++ b/xkb/xkbAccessX.c @@ -291,8 +291,8 @@ AccessXKRGExpire(OsTimerPtr timer, CARD32 now, pointer arg) return 4000; } xkbi->krgTimerActive = _OFF_TIMER; - cn.keycode = 0; - cn.eventType = 0; + cn.keycode = xkbi->slowKeyEnableKey; + cn.eventType = KeyPress; cn.requestMajor = 0; cn.requestMinor = 0; if (xkbi->desc->ctrls->enabled_ctrls & XkbSlowKeysMask) { @@ -304,6 +304,7 @@ AccessXKRGExpire(OsTimerPtr timer, CARD32 now, pointer arg) LogMessage(X_INFO, "XKB SlowKeys are now enabled. Hold shift to disable.\n"); } + xkbi->slowKeyEnableKey = 0; return 0; } @@ -462,6 +463,7 @@ AccessXFilterPressEvent(DeviceEvent *event, DeviceIntPtr keybd) if (ctrls->enabled_ctrls & XkbAccessXKeysMask) { /* check for magic sequences */ if ((sym[0] == XK_Shift_R) || (sym[0] == XK_Shift_L)) { + xkbi->slowKeyEnableKey = key; if (XkbAX_NeedFeedback(ctrls, XkbAX_SlowWarnFBMask)) { xkbi->krgTimerActive = _KRG_WARN_TIMER; xkbi->krgTimer = TimerSet(xkbi->krgTimer, 0, 4000, From 521f3fb566e67330a486874928a21ce201dba02b Mon Sep 17 00:00:00 2001 From: Sybren van Elderen Date: Tue, 27 Nov 2012 19:27:10 +0100 Subject: [PATCH 4/5] hw/dmx: add update_desktop_dimensions() call The Xdmx server did not update the desktop dimensions when computing screen origins. Signed-off-by: Sybren van Elderen Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer (cherry picked from commit 6e18599d691036eca6ff082c17727d9ffb926984) --- hw/dmx/dmxcursor.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/dmx/dmxcursor.c b/hw/dmx/dmxcursor.c index 1a77c7d78..35aca81b4 100644 --- a/hw/dmx/dmxcursor.c +++ b/hw/dmx/dmxcursor.c @@ -346,6 +346,8 @@ dmxComputeScreenOrigins(void) screenInfo.screens[i]->y -= minY; } } + + update_desktop_dimensions(); } /** Recompute origin information in the #dmxScreens list. This is From 79220f4390127d9971cbcf378530bf36172ef35a Mon Sep 17 00:00:00 2001 From: Daniel Martin Date: Wed, 7 Nov 2012 11:31:01 +0100 Subject: [PATCH 5/5] Xi: Fix modifier swapping in XIPassiveGrabDevice XIPassiveGrabDevice uses a list of uint32_t as modifier sets. The ModifierInfo struct represents the current modifier states and is therefor used in XIQueryPointer and various events. Signed-off-by: Daniel Martin Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer (cherry picked from commit aa9a9ad08b8a6e7e95de7c2bf45d93dd50f9ca87) --- Xi/xipassivegrab.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c index ddab53dec..62a3a469f 100644 --- a/Xi/xipassivegrab.c +++ b/Xi/xipassivegrab.c @@ -50,7 +50,7 @@ int SProcXIPassiveGrabDevice(ClientPtr client) { int i; - xXIModifierInfo *mods; + uint32_t *mods; REQUEST(xXIPassiveGrabDeviceReq); @@ -63,12 +63,10 @@ SProcXIPassiveGrabDevice(ClientPtr client) swaps(&stuff->mask_len); swaps(&stuff->num_modifiers); - mods = (xXIModifierInfo *) &stuff[1]; + mods = (uint32_t *) &stuff[1]; for (i = 0; i < stuff->num_modifiers; i++, mods++) { - swapl(&mods->base_mods); - swapl(&mods->latched_mods); - swapl(&mods->locked_mods); + swapl(mods); } return ProcXIPassiveGrabDevice(client);