evdev: Flush event queue before removing an input device

libinput_suspend() will trigger the removal of input devices, but also
the emission of button/key releases pairing everything that is pressed
at that moment. These events are queued, but the ClutterInputDevice
pointers in these will point to invalid memory at the time these are
processed.

Fix this by flushing the event queue, in order to ensure there are no
unprocessed input events after libinput_suspend().

https://bugzilla.gnome.org/show_bug.cgi?id=738520
This commit is contained in:
Carlos Garnacho 2014-10-14 12:41:10 +02:00
parent 084dc49a0c
commit 7764fd2079

View File

@ -1017,6 +1017,18 @@ clutter_seat_evdev_sync_leds (ClutterSeatEvdev *seat)
} }
} }
static void
flush_event_queue (void)
{
ClutterEvent *event;
while ((event = clutter_event_get ()) != NULL)
{
_clutter_process_event (event);
clutter_event_free (event);
}
}
static gboolean static gboolean
process_base_event (ClutterDeviceManagerEvdev *manager_evdev, process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
struct libinput_event *event) struct libinput_event *event)
@ -1034,6 +1046,11 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
break; break;
case LIBINPUT_EVENT_DEVICE_REMOVED: case LIBINPUT_EVENT_DEVICE_REMOVED:
/* Flush all queued events, there
* might be some from this device.
*/
flush_event_queue ();
libinput_device = libinput_event_get_device (event); libinput_device = libinput_event_get_device (event);
device = libinput_device_get_user_data (libinput_device); device = libinput_device_get_user_data (libinput_device);