diff options
author | Keith Packard <keithp@keithp.com> | 2010-07-06 23:54:54 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2010-07-06 23:54:54 -0400 |
commit | 2307ab5bc9365ebbe04568edb7c7620a23689b70 (patch) | |
tree | 1f57e8d8ff0c6ad0f3663eec0caf07ede501f5c2 | |
parent | c65280ce8df4836bd7424a90482e8aa00ab6f447 (diff) | |
parent | fd4f5059f08165a726071dc9f1ca877038292f6f (diff) |
Merge remote branch 'whot/for-keith'
-rw-r--r-- | Xi/exevents.c | 27 | ||||
-rw-r--r-- | dix/events.c | 12 | ||||
-rw-r--r-- | dix/getevents.c | 49 | ||||
-rw-r--r-- | hw/dmx/input/atKeynames.h | 2 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyr.c | 8 | ||||
-rw-r--r-- | hw/xfree86/common/xf86Events.c | 4 | ||||
-rw-r--r-- | hw/xnest/Keyboard.c | 8 | ||||
-rw-r--r-- | hw/xwin/winkeynames.h | 1 | ||||
-rw-r--r-- | include/input.h | 9 | ||||
-rw-r--r-- | mi/mipointer.c | 24 |
10 files changed, 70 insertions, 74 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index de24b4cc1..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 @@ -814,32 +813,31 @@ 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) 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]) @@ -859,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; @@ -875,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/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/dix/getevents.c b/dix/getevents.c index f9d65e970..a9b6e82c3 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -91,21 +91,52 @@ GetMotionHistorySize(void) } 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) { 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 +145,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))); - else if (type & KEY_POSTED) - ret |= !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7))); + ret |= !!BitIsOn(pDev->key->down, key_code); + if (type & KEY_POSTED) + ret |= !!BitIsOn(pDev->key->postdown, key_code); return ret; } @@ -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/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)) /* 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); diff --git a/mi/mipointer.c b/mi/mipointer.c index 9936a01f4..d8aaf8c51 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 miPointerMoveNoEvent (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; - } + 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. @@ -470,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; @@ -546,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 @@ -568,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; |