summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2008-04-29 14:40:44 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2008-04-29 14:53:20 +0930
commitec2fca7e6f7ce8fdf33d959b7adeaae935ec4b37 (patch)
tree8e406f122ec65e228329b5d029b13bdabbc81368
parent8208b842b7dd3b30bafdd74147bdfa63bc00cc40 (diff)
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.
-rw-r--r--hw/xfree86/common/xf86DGA.c153
1 files changed, 33 insertions, 120 deletions
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 89fdec6f5..9c79505f4 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -46,6 +46,7 @@
#include <xkbsrv.h>
#endif
#include "xf86Xinput.h"
+#include "exglobals.h"
#include "mi.h"
@@ -1025,17 +1026,12 @@ 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);
-
+
coreEquiv = de->u.u.type - *XDGAEventBase;
/*
@@ -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
- {
-
- 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;
- }
+ de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
+ UpdateDeviceState(keybd, de);
+ de->u.u.type = *XDGAEventBase + coreEquiv; /* change back */
+
/*
* 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);
}
}
}
@@ -1132,9 +1078,9 @@ static void
DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
{
ButtonClassPtr butc = mouse->button;
- int coreEquiv;
+ 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);
}
}
}