From ce9409acebd994cf1809050f2cc8e1db66130f12 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 13 Mar 2007 19:16:56 +1030 Subject: [PATCH] dix: Get the state from the paired device and the real device to fill the state field in the event, rather than using the virtual devices. ProcessPointerEvent: name argument "device" instead of "other". Add GetPairedKeyboard(). --- Xi/exevents.c | 89 +++++++++++++++++++++++++++++-------------------- dix/devices.c | 17 ++++++++++ dix/events.c | 14 +++----- include/input.h | 1 + 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 6cedafb50..bc2618968 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -113,29 +113,46 @@ RegisterOtherDevice(DeviceIntPtr device) } /*ARGSUSED*/ void -ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) +ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count) { BYTE *kptr; int i; CARD16 modifiers; CARD16 mask; - GrabPtr grab = other->deviceGrab.grab; + GrabPtr grab = device->deviceGrab.grab; Bool deactivateDeviceGrab = FALSE; int key = 0, bit = 0, rootX, rootY; - ButtonClassPtr b = other->button; - KeyClassPtr k = other->key; - ValuatorClassPtr v = other->valuator; + ButtonClassPtr b = device->button; + KeyClassPtr k = device->key; + ValuatorClassPtr v = device->valuator; deviceValuator *xV = (deviceValuator *) xE; - if (xE->u.u.type != DeviceValuator) { - GetSpritePosition(other, &rootX, &rootY); + DeviceIntPtr mouse = NULL, kbd = NULL; + GetSpritePosition(device, &rootX, &rootY); xE->u.keyButtonPointer.rootX = rootX; xE->u.keyButtonPointer.rootY = rootY; key = xE->u.u.detail; NoticeEventTime(xE); - xE->u.keyButtonPointer.state = inputInfo.keyboard->key->state | - inputInfo.pointer->button->state; /* FIXME: change for MPX */ + + /* If 'device' is a pointer device, we need to get the paired keyboard + * for the state. If there is none, the kbd bits of state are 0. + * If 'device' is a keyboard device, get the paired pointer and use the + * pointer's state for the button bits. + */ + if (IsPointerDevice(device)) + { + kbd = GetPairedKeyboard(device); + mouse = device; + } + else + { + mouse = GetPairedPointer(device); + kbd = device; + } + xE->u.keyButtonPointer.state = (kbd) ? (kbd->key->state) : 0; + xE->u.keyButtonPointer.state |= (mouse) ? (mouse->button->state) : 0; + bit = 1 << (key & 7); } if (DeviceEventCallback) { @@ -155,7 +172,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) || (xV->num_valuators && (first + xV->num_valuators > v->numAxes)))) FatalError("Bad valuators reported for device %s\n", - other->name); + device->name); xV->device_state = 0; if (k) xV->device_state |= k->state; @@ -192,15 +209,15 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) if (*kptr & bit) { /* allow ddx to generate multiple downs */ if (!modifiers) { xE->u.u.type = DeviceKeyRelease; - ProcessOtherEvent(xE, other, count); + ProcessOtherEvent(xE, device, count); xE->u.u.type = DeviceKeyPress; /* release can have side effects, don't fall through */ - ProcessOtherEvent(xE, other, count); + ProcessOtherEvent(xE, device, count); } return; } - if (other->valuator) - other->valuator->motionHintWindow = NullWindow; + if (device->valuator) + device->valuator->motionHintWindow = NullWindow; *kptr |= bit; k->prev_state = k->state; for (i = 0, mask = 1; modifiers; i++, mask <<= 1) { @@ -211,8 +228,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) modifiers &= ~mask; } } - if (!grab && CheckDeviceGrabs(other, xE, 0, count)) { - other->deviceGrab.activatingKey = key; + if (!grab && CheckDeviceGrabs(device, xE, 0, count)) { + device->deviceGrab.activatingKey = key; return; } } else if (xE->u.u.type == DeviceKeyRelease) { @@ -223,8 +240,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) if (!(*kptr & bit)) /* guard against duplicates */ return; modifiers = k->modifierMap[key]; - if (other->valuator) - other->valuator->motionHintWindow = NullWindow; + if (device->valuator) + device->valuator->motionHintWindow = NullWindow; *kptr &= ~bit; k->prev_state = k->state; for (i = 0, mask = 1; modifiers; i++, mask <<= 1) { @@ -238,9 +255,9 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) } } - if (other->deviceGrab.fromPassiveGrab && - !other->deviceGrab.grab->coreGrab && - (key == other->deviceGrab.activatingKey)) + if (device->deviceGrab.fromPassiveGrab && + !device->deviceGrab.grab->coreGrab && + (key == device->deviceGrab.activatingKey)) deactivateDeviceGrab = TRUE; } else if (xE->u.u.type == DeviceButtonPress) { if (!b) @@ -248,8 +265,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) kptr = &b->down[key >> 3]; *kptr |= bit; - if (other->valuator) - other->valuator->motionHintWindow = NullWindow; + if (device->valuator) + device->valuator->motionHintWindow = NullWindow; b->buttonsDown++; b->motionMask = DeviceButtonMotionMask; xE->u.u.detail = b->map[key]; @@ -259,7 +276,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) b->state |= (Button1Mask >> 1) << xE->u.u.detail; SetMaskForEvent(Motion_Filter(b), DeviceMotionNotify); if (!grab) - if (CheckDeviceGrabs(other, xE, 0, count)) + if (CheckDeviceGrabs(device, xE, 0, count)) return; } else if (xE->u.u.type == DeviceButtonRelease) { @@ -268,8 +285,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) kptr = &b->down[key >> 3]; *kptr &= ~bit; - if (other->valuator) - other->valuator->motionHintWindow = NullWindow; + if (device->valuator) + device->valuator->motionHintWindow = NullWindow; if (!--b->buttonsDown) b->motionMask = 0; xE->u.u.detail = b->map[key]; @@ -279,24 +296,24 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) b->state &= ~((Button1Mask >> 1) << xE->u.u.detail); SetMaskForEvent(Motion_Filter(b), DeviceMotionNotify); if (!b->state - && other->deviceGrab.fromPassiveGrab - && !other->deviceGrab.grab->coreGrab) + && device->deviceGrab.fromPassiveGrab + && !device->deviceGrab.grab->coreGrab) deactivateDeviceGrab = TRUE; } else if (xE->u.u.type == ProximityIn) - other->valuator->mode &= ~OutOfProximity; + device->valuator->mode &= ~OutOfProximity; else if (xE->u.u.type == ProximityOut) - other->valuator->mode |= OutOfProximity; + device->valuator->mode |= OutOfProximity; if (grab) - DeliverGrabbedEvent(xE, other, deactivateDeviceGrab, count); - else if (other->focus) - DeliverFocusedEvent(other, xE, GetSpriteWindow(other), count); + DeliverGrabbedEvent(xE, device, deactivateDeviceGrab, count); + else if (device->focus) + DeliverFocusedEvent(device, xE, GetSpriteWindow(device), count); else - DeliverDeviceEvents(GetSpriteWindow(other), xE, NullGrab, NullWindow, - other, count); + DeliverDeviceEvents(GetSpriteWindow(device), xE, NullGrab, NullWindow, + device, count); if (deactivateDeviceGrab == TRUE) - (*other->deviceGrab.DeactivateGrab) (other); + (*device->deviceGrab.DeactivateGrab) (device); } _X_EXPORT int diff --git a/dix/devices.c b/dix/devices.c index 05a03b572..6c177863c 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -2030,6 +2030,23 @@ GetPairedPointer(DeviceIntPtr kbd) return inputInfo.pointer; } +/* Find the keyboard device that is paired with the given pointer. If none is + * found, return NULL. + */ +_X_EXPORT DeviceIntPtr +GetPairedKeyboard(DeviceIntPtr ptr) +{ + DeviceIntPtr dev = inputInfo.devices; + + while(dev) + { + if (ptr->pSprite == dev->pSprite) + return dev; + dev = dev->next; + } + return dev; +} + /* * Register a client to be able to pair devices. */ diff --git a/dix/events.c b/dix/events.c index b4b929f6c..fbbae1de9 100644 --- a/dix/events.c +++ b/dix/events.c @@ -4913,18 +4913,12 @@ PickPointer(ClientPtr client) _X_EXPORT DeviceIntPtr PickKeyboard(ClientPtr client) { - DeviceIntPtr ptr; - DeviceIntPtr dev = inputInfo.devices; - ptr = PickPointer(client); + DeviceIntPtr ptr = PickPointer(client); + DeviceIntPtr kbd; - while(dev) - { - if (ptr->pSprite == dev->pSprite) - return dev; - dev = dev->next; - } + kbd = GetPairedKeyboard(ptr); - return inputInfo.keyboard; + return (kbd) ? kbd : inputInfo.keyboard; } /* A client that has one or more core grabs does not get core events from diff --git a/include/input.h b/include/input.h index 2d72f838b..765d71dc3 100644 --- a/include/input.h +++ b/include/input.h @@ -451,6 +451,7 @@ extern int PairDevices(ClientPtr client, DeviceIntPtr keyboard); extern DeviceIntPtr GetPairedPointer(DeviceIntPtr kbd); +extern DeviceIntPtr GetPairedKeyboard(DeviceIntPtr ptr); extern Bool RegisterPairingClient(ClientPtr client); extern Bool UnregisterPairingClient(ClientPtr client);