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 <[email protected]> --- The current behaviour has been there for years and such a change has a potential for breaking things. I doubt that there's more than a handful of clients out there that care about slow keys masks and I don't think it'll affect those either, especially since now we're providing information that we didn't in the past. xkb/xkbAccessX.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c index fe28e12..4d91762 100644 --- a/xkb/xkbAccessX.c +++ b/xkb/xkbAccessX.c @@ -278,10 +278,16 @@ AccessXStickyKeysTurnOff(DeviceIntPtr dev, xkbControlsNotify * pCN) return; } /* AccessXStickyKeysTurnOff */ +struct slow_keys_enable_t { + DeviceIntPtr keybd; + KeyCode key; +}; + static CARD32 AccessXKRGExpire(OsTimerPtr timer, CARD32 now, pointer arg) { - XkbSrvInfoPtr xkbi = ((DeviceIntPtr) arg)->key->xkbInfo; + struct slow_keys_enable_t *ske = arg; + XkbSrvInfoPtr xkbi = ske->keybd->key->xkbInfo; xkbControlsNotify cn; if (xkbi->krgTimerActive == _KRG_WARN_TIMER) { @@ -291,19 +297,20 @@ AccessXKRGExpire(OsTimerPtr timer, CARD32 now, pointer arg) return 4000; } xkbi->krgTimerActive = _OFF_TIMER; - cn.keycode = 0; - cn.eventType = 0; + cn.keycode = ske->key; + cn.eventType = KeyPress; cn.requestMajor = 0; cn.requestMinor = 0; if (xkbi->desc->ctrls->enabled_ctrls & XkbSlowKeysMask) { - AccessXKRGTurnOff((DeviceIntPtr) arg, &cn); + AccessXKRGTurnOff(ske->keybd, &cn); LogMessage(X_INFO, "XKB SlowKeys are disabled.\n"); } else { - AccessXKRGTurnOn((DeviceIntPtr) arg, XkbSlowKeysMask, &cn); + AccessXKRGTurnOn(ske->keybd, XkbSlowKeysMask, &cn); LogMessage(X_INFO, "XKB SlowKeys are now enabled. Hold shift to disable.\n"); } + free(ske); return 0; } @@ -462,15 +469,18 @@ 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)) { + struct slow_keys_enable_t *ske = malloc(sizeof(*ske)); + ske->keybd = keybd; + ske->key = key; if (XkbAX_NeedFeedback(ctrls, XkbAX_SlowWarnFBMask)) { xkbi->krgTimerActive = _KRG_WARN_TIMER; xkbi->krgTimer = TimerSet(xkbi->krgTimer, 0, 4000, - AccessXKRGExpire, (pointer) keybd); + AccessXKRGExpire, ske); } else { xkbi->krgTimerActive = _KRG_TIMER; xkbi->krgTimer = TimerSet(xkbi->krgTimer, 0, 8000, - AccessXKRGExpire, (pointer) keybd); + AccessXKRGExpire, ske); } if (!(ctrls->enabled_ctrls & XkbSlowKeysMask)) { CARD32 now = GetTimeInMillis(); -- 1.7.10.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
