summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-10-14 12:41:10 +0200
committerCarlos Garnacho <carlosg@gnome.org>2014-10-14 13:43:17 +0200
commit7764fd2079318fede95b4b96c72d18bd31699270 (patch)
treecf37a7a7cb6b9e35f5b9b5a80573d6a3b115399d
parent084dc49a0cdadeed7de896df81e9af536f2ab678 (diff)
downloadclutter-7764fd2079318fede95b4b96c72d18bd31699270.tar.gz
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
-rw-r--r--clutter/evdev/clutter-device-manager-evdev.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
index 77a8ec673..7b4848182 100644
--- a/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/evdev/clutter-device-manager-evdev.c
@@ -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);