xfree86: DGA needs to call into Xi.
Two steps: first use UpdateDeviceState() instead of replicating the device changing code. And emulate XI events instead of core events.
This commit is contained in:
parent
8208b842b7
commit
ec2fca7e6f
|
@ -46,6 +46,7 @@
|
|||
#include <xkbsrv.h>
|
||||
#endif
|
||||
#include "xf86Xinput.h"
|
||||
#include "exglobals.h"
|
||||
|
||||
#include "mi.h"
|
||||
|
||||
|
@ -1025,13 +1026,8 @@ static Mask filters[] =
|
|||
static void
|
||||
DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
|
||||
{
|
||||
int key, bit;
|
||||
register BYTE *kptr;
|
||||
register int i;
|
||||
register CARD8 modifiers;
|
||||
register CARD16 mask;
|
||||
int coreEquiv;
|
||||
xEvent core;
|
||||
xEvent xi;
|
||||
KeyClassPtr keyc = keybd->key;
|
||||
DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
|
||||
DeviceIntPtr pointer = GetPairedDevice(keybd);
|
||||
|
@ -1046,59 +1042,10 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
|
|||
de->u.event.screen = pScreen->myNum;
|
||||
de->u.event.state = keyc->state | pointer->button->state;
|
||||
|
||||
/*
|
||||
* Keep the core state in sync by duplicating what
|
||||
* CoreProcessKeyboardEvent does
|
||||
*/
|
||||
key = de->u.u.detail;
|
||||
kptr = &keyc->down[key >> 3];
|
||||
bit = 1 << (key & 7);
|
||||
modifiers = keyc->modifierMap[key];
|
||||
switch (coreEquiv)
|
||||
{
|
||||
case KeyPress:
|
||||
pointer->valuator->motionHintWindow = NullWindow;
|
||||
*kptr |= bit;
|
||||
keyc->prev_state = keyc->state;
|
||||
#ifdef XKB
|
||||
if (noXkbExtension)
|
||||
#endif
|
||||
{
|
||||
de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
|
||||
UpdateDeviceState(keybd, de);
|
||||
de->u.u.type = *XDGAEventBase + coreEquiv; /* change back */
|
||||
|
||||
for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
|
||||
{
|
||||
if (mask & modifiers)
|
||||
{
|
||||
/* This key affects modifier "i" */
|
||||
keyc->modifierKeyCount[i]++;
|
||||
keyc->state |= mask;
|
||||
modifiers &= ~mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KeyRelease:
|
||||
pointer->valuator->motionHintWindow = NullWindow;
|
||||
*kptr &= ~bit;
|
||||
keyc->prev_state = keyc->state;
|
||||
#ifdef XKB
|
||||
if (noXkbExtension)
|
||||
#endif
|
||||
{
|
||||
for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
|
||||
{
|
||||
if (mask & modifiers) {
|
||||
/* This key affects modifier "i" */
|
||||
if (--keyc->modifierKeyCount[i] <= 0) {
|
||||
keyc->state &= ~mask;
|
||||
keyc->modifierKeyCount[i] = 0;
|
||||
}
|
||||
modifiers &= ~mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Deliver the DGA event
|
||||
*/
|
||||
|
@ -1113,17 +1060,16 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
|
|||
/* If the keyboard is actively grabbed, deliver a grabbed core event */
|
||||
if (keybd->deviceGrab.grab && !keybd->deviceGrab.fromPassiveGrab)
|
||||
{
|
||||
/* I've got no clue if that is correct but only working on core
|
||||
* grabs seems the right thing here. (whot) */
|
||||
core.u.u.type = coreEquiv;
|
||||
core.u.u.detail = de->u.u.detail;
|
||||
core.u.keyButtonPointer.time = de->u.event.time;
|
||||
core.u.keyButtonPointer.eventX = de->u.event.dx;
|
||||
core.u.keyButtonPointer.eventY = de->u.event.dy;
|
||||
core.u.keyButtonPointer.rootX = de->u.event.dx;
|
||||
core.u.keyButtonPointer.rootY = de->u.event.dy;
|
||||
core.u.keyButtonPointer.state = de->u.event.state;
|
||||
DeliverGrabbedEvent (&core, keybd, FALSE, 1);
|
||||
xi.u.u.type = (IEventBase - 1) + coreEquiv;
|
||||
xi.u.u.detail = de->u.u.detail;
|
||||
xi.u.keyButtonPointer.time = de->u.event.time;
|
||||
xi.u.keyButtonPointer.eventX = de->u.event.dx;
|
||||
xi.u.keyButtonPointer.eventY = de->u.event.dy;
|
||||
xi.u.keyButtonPointer.rootX = de->u.event.dx;
|
||||
xi.u.keyButtonPointer.rootY = de->u.event.dy;
|
||||
xi.u.keyButtonPointer.state = de->u.event.state;
|
||||
((deviceKeyButtonPointer*)&xi)->deviceid = keybd->id;
|
||||
DeliverGrabbedEvent (&xi, keybd, FALSE, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1134,7 +1080,7 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
|
|||
ButtonClassPtr butc = mouse->button;
|
||||
int coreEquiv;
|
||||
DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
|
||||
xEvent core;
|
||||
xEvent xi;
|
||||
|
||||
coreEquiv = de->u.u.type - *XDGAEventBase;
|
||||
/*
|
||||
|
@ -1142,44 +1088,11 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
|
|||
*/
|
||||
de->u.event.screen = pScreen->myNum;
|
||||
de->u.event.state = butc->state | GetPairedDevice(mouse)->key->state;
|
||||
/*
|
||||
* Keep the core state in sync by duplicating what
|
||||
* CoreProcessPointerEvent does
|
||||
*/
|
||||
if (coreEquiv != MotionNotify)
|
||||
{
|
||||
int key;
|
||||
BYTE *kptr;
|
||||
int bit;
|
||||
|
||||
key = de->u.u.detail;
|
||||
kptr = &butc->down[key >> 3];
|
||||
bit = 1 << (key & 7);
|
||||
switch (coreEquiv)
|
||||
{
|
||||
case ButtonPress:
|
||||
mouse->valuator->motionHintWindow = NullWindow;
|
||||
if (!(*kptr & bit))
|
||||
butc->buttonsDown++;
|
||||
butc->motionMask = ButtonMotionMask;
|
||||
*kptr |= bit;
|
||||
if (key <= 5)
|
||||
butc->state |= (Button1Mask >> 1) << key;
|
||||
break;
|
||||
case ButtonRelease:
|
||||
mouse->valuator->motionHintWindow = NullWindow;
|
||||
if (*kptr & bit)
|
||||
--butc->buttonsDown;
|
||||
if (!butc->buttonsDown)
|
||||
butc->motionMask = 0;
|
||||
*kptr &= ~bit;
|
||||
if (key == 0)
|
||||
return;
|
||||
if (key <= 5)
|
||||
butc->state &= ~((Button1Mask >> 1) << key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
|
||||
UpdateDeviceState(mouse, de);
|
||||
de->u.u.type = *XDGAEventBase + coreEquiv; /* change back */
|
||||
|
||||
/*
|
||||
* Deliver the DGA event
|
||||
*/
|
||||
|
@ -1194,15 +1107,15 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
|
|||
/* If the pointer is actively grabbed, deliver a grabbed core event */
|
||||
if (mouse->deviceGrab.grab && !mouse->deviceGrab.fromPassiveGrab)
|
||||
{
|
||||
core.u.u.type = coreEquiv;
|
||||
core.u.u.detail = de->u.u.detail;
|
||||
core.u.keyButtonPointer.time = de->u.event.time;
|
||||
core.u.keyButtonPointer.eventX = de->u.event.dx;
|
||||
core.u.keyButtonPointer.eventY = de->u.event.dy;
|
||||
core.u.keyButtonPointer.rootX = de->u.event.dx;
|
||||
core.u.keyButtonPointer.rootY = de->u.event.dy;
|
||||
core.u.keyButtonPointer.state = de->u.event.state;
|
||||
DeliverGrabbedEvent (&core, mouse, FALSE, 1);
|
||||
xi.u.u.type = (IEventBase - 1 ) + coreEquiv;
|
||||
xi.u.u.detail = de->u.u.detail;
|
||||
xi.u.keyButtonPointer.time = de->u.event.time;
|
||||
xi.u.keyButtonPointer.eventX = de->u.event.dx;
|
||||
xi.u.keyButtonPointer.eventY = de->u.event.dy;
|
||||
xi.u.keyButtonPointer.rootX = de->u.event.dx;
|
||||
xi.u.keyButtonPointer.rootY = de->u.event.dy;
|
||||
xi.u.keyButtonPointer.state = de->u.event.state;
|
||||
DeliverGrabbedEvent (&xi, mouse, FALSE, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user