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:
parent
084dc49a0c
commit
7764fd2079
@ -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
|
||||
process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
struct libinput_event *event)
|
||||
@ -1034,6 +1046,11 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
break;
|
||||
|
||||
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);
|
||||
|
||||
device = libinput_device_get_user_data (libinput_device);
|
||||
|
Loading…
Reference in New Issue
Block a user