diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-09-03 11:54:41 +1000 |
---|---|---|
committer | Julien Cristau <jcristau@debian.org> | 2011-01-12 10:17:46 +0100 |
commit | 5549d99acbc38c8a1f12d649c42f044392ec7af0 (patch) | |
tree | 77998bea5384ae460a921e36bb44980b23af4e30 | |
parent | 2fd67c34549f1703e8ca522f92be518b18f90e81 (diff) |
mi: handle DGA subtypes when determining the master device.
The subtype in the DGA event is the core type and all ET_ event types (where
applicable) are identical to the core types. Thus the switch statement below
will work as required and assign the right master device.
Fixes a crasher bug on keyboard devices with valuators. If a device sends a
motion event while grabbed and a DGA client is active (but has not selected
input through DGA), the valuator event is posted through the VCK and
eventually results in a NULL-pointer dereference on dev->valuator.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 31ab9f8860848504df18a8be9d19b817b191e0df)
(cherry picked from commit faecab3b13bbaecf4f35f49b833d1b79a5fb647d)
-rw-r--r-- | mi/mieq.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -320,6 +320,7 @@ CopyGetMasterEvent(DeviceIntPtr sdev, { DeviceIntPtr mdev; int len = original->any.length; + int type = original->any.type; CHECKEVENT(original); @@ -327,7 +328,12 @@ CopyGetMasterEvent(DeviceIntPtr sdev, if (!sdev || !sdev->u.master) return NULL; - switch(original->any.type) +#if XFreeXDGA + if (type == ET_DGAEvent) + type = original->dga_event.subtype; +#endif + + switch(type) { case ET_KeyPress: case ET_KeyRelease: |