diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-07-06 09:16:42 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-07-07 13:29:46 +1000 |
commit | a1afe172559aff010e886cfc2a7a922d4a06c697 (patch) | |
tree | 70027358759d780fb8b94f6bf689e864fe0aa879 /dix/getevents.c | |
parent | 32473d6bf38c95b2d6d5ddbf583a1e801c6605e4 (diff) |
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 <peter.hutterer@who-t.net>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Diffstat (limited to 'dix/getevents.c')
-rw-r--r-- | dix/getevents.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/dix/getevents.c b/dix/getevents.c index 1d505e536..a9b6e82c3 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -91,6 +91,37 @@ 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) @@ -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; } |