From dbd621705a5211540b353af81c4af83c297b74dc Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 2 Jul 2010 14:22:03 +1000 Subject: [PATCH 1/7] mi: De-duplicate some code in mipointer.c miPointerMoved already has the same code. Signed-off-by: Peter Hutterer Reviewed-by: Keith Packard --- mi/mipointer.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/mi/mipointer.c b/mi/mipointer.c index 9936a01f4..7efcebb7c 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -73,6 +73,7 @@ static void miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen, static Bool miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen); static void miPointerDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen); +static void miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y); static EventList* events; /* for WarpPointer MotionNotifies */ @@ -305,24 +306,9 @@ miPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) } if (GenerateEvent) - { miPointerMove (pDev, pScreen, x, y); - } else - { - /* everything from miPointerMove except the event and history */ - - if (!pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen) - { - pPointer->devx = x; - pPointer->devy = y; - if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask) - (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); - } - pPointer->x = x; - pPointer->y = y; - pPointer->pScreen = pScreen; - } + miPointerMoved(pDev, pScreen, x, y); /* Don't call USFS if we use Xinerama, otherwise the root window is * updated to the second screen, and we never receive any events. From b46ffd25d3f211e91c67bc618ecbd58257939388 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 2 Jul 2010 15:25:14 +1000 Subject: [PATCH 2/7] mi: rename miPointerMoved to miPointerMoveNoEvent. Having miPointerMove and miPointerMoved is confusing, especially since both do the same thing bar the event delivery. Also, miPointerMove calls miPointerMoved which indicates some confusion in the temporal alignment of cause and effect. Signed-off-by: Peter Hutterer Acked-by: Tiago Vignatti Reviewed-by: Keith Packard --- mi/mipointer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mi/mipointer.c b/mi/mipointer.c index 7efcebb7c..d8aaf8c51 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -73,7 +73,7 @@ static void miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen, static Bool miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen); static void miPointerDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen); -static void miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y); +static void miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y); static EventList* events; /* for WarpPointer MotionNotifies */ @@ -308,7 +308,7 @@ miPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) if (GenerateEvent) miPointerMove (pDev, pScreen, x, y); else - miPointerMoved(pDev, pScreen, x, y); + miPointerMoveNoEvent(pDev, pScreen, x, y); /* Don't call USFS if we use Xinerama, otherwise the root window is * updated to the second screen, and we never receive any events. @@ -456,7 +456,7 @@ miPointerSetWaitForUpdate(ScreenPtr pScreen, Bool wait) /* Move the pointer on the current screen, and update the sprite. */ static void -miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, +miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) { miPointerPtr pPointer; @@ -532,7 +532,7 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y) pPointer->pScreen == pScreen) return; - miPointerMoved(pDev, pScreen, *x, *y); + miPointerMoveNoEvent(pDev, pScreen, *x, *y); } void @@ -554,7 +554,7 @@ miPointerMove (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) int i, nevents; int valuators[2]; - miPointerMoved(pDev, pScreen, x, y); + miPointerMoveNoEvent(pDev, pScreen, x, y); /* generate motion notify */ valuators[0] = x; From 10442ce02b5be7f82b373bee1939e2b523e291d9 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 5 Jul 2010 16:54:48 +1000 Subject: [PATCH 3/7] dix: treat flags as flags, not as value in key_is_down. Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- dix/getevents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dix/getevents.c b/dix/getevents.c index f9d65e970..2eacdfed4 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -115,7 +115,7 @@ key_is_down(DeviceIntPtr pDev, int key_code, int type) if (type & KEY_PROCESSED) ret |= !!(pDev->key->down[key_code >> 3] & (1 << (key_code & 7))); - else if (type & KEY_POSTED) + if (type & KEY_POSTED) ret |= !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7))); return ret; From c18442908080c9833dfd6bb2ff367945d1892421 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 5 Jul 2010 16:47:57 +1000 Subject: [PATCH 4/7] Xi: use set_key_up/down instead of manual bit handling. We have the wrappers, use them. Signed-off-by: Peter Hutterer --- Xi/exevents.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index de24b4cc1..df13190a8 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -814,23 +814,22 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) if (!k) return DONT_PROCESS; - kptr = &k->down[key >> 3]; - /* don't allow ddx to generate multiple downs, but repeats are okay */ - if ((*kptr & bit) && !event->key_repeat) + /* don't allow ddx to generate multiple downs, but repeats are okay */ + if (key_is_down(device, key, KEY_PROCESSED) && !event->key_repeat) return DONT_PROCESS; + if (device->valuator) device->valuator->motionHintWindow = NullWindow; - *kptr |= bit; + set_key_down(device, key, KEY_PROCESSED); } else if (event->type == ET_KeyRelease) { if (!k) return DONT_PROCESS; - kptr = &k->down[key >> 3]; - if (!(*kptr & bit)) /* guard against duplicates */ + if (!key_is_down(device, key, KEY_PROCESSED)) /* guard against duplicates */ return DONT_PROCESS; if (device->valuator) device->valuator->motionHintWindow = NullWindow; - *kptr &= ~bit; + set_key_up(device, key, KEY_PROCESSED); } else if (event->type == ET_ButtonPress) { Mask mask; if (!b) From 32473d6bf38c95b2d6d5ddbf583a1e801c6605e4 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 6 Jul 2010 08:56:12 +1000 Subject: [PATCH 5/7] dix: use BitIsOn/SetBit/ClearBit macros for set_key_down helpers. Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- dix/getevents.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index 2eacdfed4..1d505e536 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -94,18 +94,18 @@ void set_key_down(DeviceIntPtr pDev, int key_code, int type) { if (type == KEY_PROCESSED) - pDev->key->down[key_code >> 3] |= (1 << (key_code & 7)); + SetBit(pDev->key->down, key_code); else - pDev->key->postdown[key_code >> 3] |= (1 << (key_code & 7)); + SetBit(pDev->key->postdown, key_code); } void set_key_up(DeviceIntPtr pDev, int key_code, int type) { if (type == KEY_PROCESSED) - pDev->key->down[key_code >> 3] &= ~(1 << (key_code & 7)); + ClearBit(pDev->key->down, key_code); else - pDev->key->postdown[key_code >> 3] &= ~(1 << (key_code & 7)); + ClearBit(pDev->key->postdown, key_code); } Bool @@ -114,9 +114,9 @@ key_is_down(DeviceIntPtr pDev, int key_code, int type) int ret = 0; if (type & KEY_PROCESSED) - ret |= !!(pDev->key->down[key_code >> 3] & (1 << (key_code & 7))); + ret |= !!BitIsOn(pDev->key->down, key_code); if (type & KEY_POSTED) - ret |= !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7))); + ret |= !!BitIsOn(pDev->key->postdown, key_code); return ret; } From a1afe172559aff010e886cfc2a7a922d4a06c697 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 6 Jul 2010 09:16:42 +1000 Subject: [PATCH 6/7] dix: add aux. functions for button_is_down, set_button_down, set_button_up. Same as the matching key functions. Buttons, like keys, can have two states for down/up - one posted, one processed. Posted is set during event generation (usually in the signal handler). Processed is set during event processing when the event queue is emptied and events are being delivered to the client. Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- Xi/exevents.c | 14 ++++++-------- dix/getevents.c | 35 +++++++++++++++++++++++++++++++++-- include/input.h | 9 +++++++-- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index df13190a8..e990aeb7e 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -747,7 +747,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) KeyClassPtr k = NULL; ButtonClassPtr b = NULL; ValuatorClassPtr v = NULL; - BYTE *kptr = NULL; /* This event is always the first we get, before the actual events with * the data. However, the way how the DDX is set up, "device" will @@ -835,10 +834,10 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) if (!b) return DONT_PROCESS; - kptr = &b->down[key >> 3]; - if ((*kptr & bit) != 0) + if (button_is_down(device, key, BUTTON_PROCESSED)) return DONT_PROCESS; - *kptr |= bit; + + set_button_down(device, key, BUTTON_PROCESSED); if (device->valuator) device->valuator->motionHintWindow = NullWindow; if (!b->map[key]) @@ -858,8 +857,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) if (!b) return DONT_PROCESS; - kptr = &b->down[key>>3]; - if (!(*kptr & bit)) + if (!button_is_down(device, key, BUTTON_PROCESSED)) return DONT_PROCESS; if (IsMaster(device)) { DeviceIntPtr sd; @@ -874,11 +872,11 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event) continue; if (!sd->button) continue; - if ((sd->button->down[key>>3] & bit) != 0) + if (button_is_down(sd, key, BUTTON_PROCESSED)) return DONT_PROCESS; } } - *kptr &= ~bit; + set_button_up(device, key, BUTTON_PROCESSED); if (device->valuator) device->valuator->motionHintWindow = NullWindow; if (!b->map[key]) diff --git a/dix/getevents.c b/dix/getevents.c index 1d505e536..a9b6e82c3 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -90,6 +90,37 @@ GetMotionHistorySize(void) return MOTION_HISTORY_SIZE; } +void +set_button_down(DeviceIntPtr pDev, int button, int type) +{ + if (type == BUTTON_PROCESSED) + SetBit(pDev->button->down, button); + else + SetBit(pDev->button->postdown, button); +} + +void +set_button_up(DeviceIntPtr pDev, int button, int type) +{ + if (type == BUTTON_PROCESSED) + ClearBit(pDev->button->down, button); + else + ClearBit(pDev->button->postdown, button); +} + +Bool +button_is_down(DeviceIntPtr pDev, int button, int type) +{ + int ret = 0; + + if (type & BUTTON_PROCESSED) + ret |= !!BitIsOn(pDev->button->down, button); + if (type & BUTTON_POSTED) + ret |= !!BitIsOn(pDev->button->postdown, button); + + return ret; +} + void set_key_down(DeviceIntPtr pDev, int key_code, int type) { @@ -1123,11 +1154,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, else { if (type == ButtonPress) { event->type = ET_ButtonPress; - pDev->button->postdown[buttons >> 3] |= (1 << (buttons & 7)); + set_button_down(pDev, buttons, BUTTON_POSTED); } else if (type == ButtonRelease) { event->type = ET_ButtonRelease; - pDev->button->postdown[buttons >> 3] &= ~(1 << (buttons & 7)); + set_button_up(pDev, buttons, BUTTON_POSTED); } event->detail.button = buttons; } diff --git a/include/input.h b/include/input.h index 0a08ea425..55b1537f6 100644 --- a/include/input.h +++ b/include/input.h @@ -228,14 +228,19 @@ typedef struct _InputAttributes { #define ATTR_TOUCHPAD (1<<4) #define ATTR_TOUCHSCREEN (1<<5) -/* Key has been run through all input processing and events sent to clients. */ +/* Key/Button has been run through all input processing and events sent to clients. */ #define KEY_PROCESSED 1 -/* Key has not been fully processed, no events have been sent. */ +#define BUTTON_PROCESSED 1 +/* Key/Button has not been fully processed, no events have been sent. */ #define KEY_POSTED 2 +#define BUTTON_POSTED 2 extern void set_key_down(DeviceIntPtr pDev, int key_code, int type); extern void set_key_up(DeviceIntPtr pDev, int key_code, int type); extern int key_is_down(DeviceIntPtr pDev, int key_code, int type); +extern void set_button_down(DeviceIntPtr pDev, int button, int type); +extern void set_button_up(DeviceIntPtr pDev, int button, int type); +extern int button_is_down(DeviceIntPtr pDev, int button, int type); extern void InitCoreDevices(void); extern void InitXTestDevices(void); From fd4f5059f08165a726071dc9f1ca877038292f6f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 6 Jul 2010 09:19:09 +1000 Subject: [PATCH 7/7] dix: purge leftover manual key down bit setting. Signed-off-by: Peter Hutterer Reviewed-by: Daniel Stone --- dix/events.c | 12 +++--------- hw/dmx/input/atKeynames.h | 2 -- hw/kdrive/ephyr/ephyr.c | 8 +------- hw/xfree86/common/xf86Events.c | 4 +--- hw/xnest/Keyboard.c | 8 +------- hw/xwin/winkeynames.h | 1 - 6 files changed, 6 insertions(+), 29 deletions(-) diff --git a/dix/events.c b/dix/events.c index e1c3d0a02..07f7b1f6b 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3937,13 +3937,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev, void FixKeyState (DeviceEvent *event, DeviceIntPtr keybd) { - int key, bit; - BYTE *kptr; - KeyClassPtr keyc = keybd->key; - - key = event->detail.key; - kptr = &keyc->down[key >> 3]; - bit = 1 << (key & 7); + int key = event->detail.key; if (event->type == ET_KeyPress) { DebugF("FixKeyState: Key %d %s\n",key, @@ -3951,9 +3945,9 @@ FixKeyState (DeviceEvent *event, DeviceIntPtr keybd) } if (event->type == ET_KeyPress) - *kptr |= bit; + set_key_down(keybd, key, KEY_PROCESSED); else if (event->type == ET_KeyRelease) - *kptr &= ~bit; + set_key_up(keybd, key, KEY_PROCESSED); else FatalError("Impossible keyboard event"); } diff --git a/hw/dmx/input/atKeynames.h b/hw/dmx/input/atKeynames.h index e632ca27c..6aea1edec 100644 --- a/hw/dmx/input/atKeynames.h +++ b/hw/dmx/input/atKeynames.h @@ -66,8 +66,6 @@ #define KanaMask Mod4Mask #define ScrollLockMask Mod5Mask -#define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7))) - /* * NOTE: The AT/MF keyboards can generate (via the 8042) two (MF: three) * sets of scancodes. Set3 can only be generated by a MF keyboard. diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index bd7deedad..8096a24cc 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -776,13 +776,7 @@ ephyrUpdateModifierState(unsigned int state) for (key = 0; key < MAP_LENGTH; key++) if (keyc->xkbInfo->desc->map->modmap[key] & mask) { - int bit; - BYTE *kptr; - - kptr = &keyc->down[key >> 3]; - bit = 1 << (key & 7); - - if (*kptr & bit) + if (key_is_down(pDev, key, KEY_PROCESSED)) KdEnqueueKeyboardEvent (ephyrKbd, key, TRUE); if (--count == 0) diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c index 2ff77c61d..2e82848ce 100644 --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c @@ -372,8 +372,6 @@ xf86PrintBacktrace(void) xorg_backtrace(); } -#define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7))) - static void xf86ReleaseKeys(DeviceIntPtr pDev) { @@ -399,7 +397,7 @@ xf86ReleaseKeys(DeviceIntPtr pDev) for (i = keyc->xkbInfo->desc->min_key_code; i < keyc->xkbInfo->desc->max_key_code; i++) { - if (KeyPressed(i)) { + if (key_is_down(pDev, i, KEY_POSTED)) { sigstate = xf86BlockSIGIO (); nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i); for (j = 0; j < nevents; j++) diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c index 570866bc4..ec629dcaf 100644 --- a/hw/xnest/Keyboard.c +++ b/hw/xnest/Keyboard.c @@ -231,13 +231,7 @@ xnestUpdateModifierState(unsigned int state) for (key = 0; key < MAP_LENGTH; key++) if (keyc->xkbInfo->desc->map->modmap[key] & mask) { - int bit; - BYTE *kptr; - - kptr = &keyc->down[key >> 3]; - bit = 1 << (key & 7); - - if (*kptr & bit) + if (key_is_down(pDev, key, KEY_PROCESSED)) xnestQueueKeyEvent(KeyRelease, key); if (--count == 0) diff --git a/hw/xwin/winkeynames.h b/hw/xwin/winkeynames.h index 7c16337de..3d5938348 100644 --- a/hw/xwin/winkeynames.h +++ b/hw/xwin/winkeynames.h @@ -38,7 +38,6 @@ #define KanaMask Mod4Mask #define ScrollLockMask Mod5Mask -#define KeyPressed(k) (keyc->down[k >> 3] & (1 << (k & 7))) #define ModifierDown(k) ((keyc->state & (k)) == (k)) /*