diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-09-03 11:54:41 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-12-07 08:07:54 +1000 |
commit | 31ab9f8860848504df18a8be9d19b817b191e0df (patch) | |
tree | 13388f5ef6375c202637eb809de0966a67b36b09 /mi | |
parent | 5d31c3e705dfd9f38f0fffcd07a6d8d06644735c (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>
Diffstat (limited to 'mi')
-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: |