summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-08-30 13:37:31 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-10-04 13:00:21 +1000
commit9537afb13f2750d22350b7441570332ae60e4860 (patch)
tree20f5aaa37500e6705aeed96ca9dfac8f09afcbc3 /dix
parent6378d0233d21088b6429755627b4253859892c72 (diff)
dix: fill out root_x/y for keyboard events
Switching screens relies on rootx/y to be set to the correct value. Note: though we technically take a mask for GetKeyboardEvents we don't actually handle it properly to move the pointer as required (and generate motion events if needed). Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Diffstat (limited to 'dix')
-rw-r--r--dix/getevents.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/dix/getevents.c b/dix/getevents.c
index c42971592..b81562a86 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -859,6 +859,15 @@ queueEventList(DeviceIntPtr device, InternalEvent *events, int nevents)
mieqEnqueue(device, &events[i]);
}
+static void
+event_set_root_coordinates(DeviceEvent* event, double x, double y)
+{
+ event->root_x = trunc(x);
+ event->root_y = trunc(y);
+ event->root_x_frac = x - trunc(x);
+ event->root_y_frac = y - trunc(y);
+}
+
/**
* Generate internal events representing this keyboard event and enqueue
* them on the event queue.
@@ -956,6 +965,13 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
set_valuators(pDev, event, &mask);
+ if (!IsFloating(pDev)) {
+ DeviceIntPtr master = GetMaster(pDev, MASTER_POINTER);
+ event_set_root_coordinates(event,
+ master->last.valuators[0],
+ master->last.valuators[1]);
+ }
+
return num_events;
}
@@ -1158,10 +1174,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
}
/* root_x and root_y must be in screen co-ordinates */
- event->root_x = trunc(screenx);
- event->root_y = trunc(screeny);
- event->root_x_frac = screenx - trunc(screenx);
- event->root_y_frac = screeny - trunc(screeny);
+ event_set_root_coordinates(event, screenx, screeny);
if (flags & POINTER_EMULATED) {
raw->flags = XIPointerEmulated;