[mutter] clutter/evdev: Dispatch libinput before generating key repeat events



commit 1597b357a1b660f5fd2053dfd67ae87d465cf3dd
Author: Rui Matos <tiagomatos gmail com>
Date:   Fri Nov 25 12:44:56 2016 +0100

    clutter/evdev: Dispatch libinput before generating key repeat events
    
    Since both the libinput event source and the key repeat timer have the
    same priority, the order in which both handlers are called is
    arbitrary if both sources are ready on the same poll return. This
    means that sometimes we generate key repeats when there's already a
    real key event queued on libinput that would cancel the repeat timer
    if only it was processed before.
    
    One solution would be lowering the repeat timer source priority a
    notch lower than the libinput source but that would mean that a steady
    stream of events from libinput (e.g. pointer device motion) would
    prevent any key repeats to happen.
    
    Instead, we can fix this problem by trying to dispatch libinput from
    the key repeat timer and checking if the timer source has been
    destroyed before generating more key repeats.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=774989

 .../clutter/evdev/clutter-device-manager-evdev.c   |    6 ++++++
 .../clutter/evdev/clutter-device-manager-evdev.h   |    2 ++
 clutter/clutter/evdev/clutter-seat-evdev.c         |    6 ++++++
 3 files changed, 14 insertions(+), 0 deletions(-)
---
diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c 
b/clutter/clutter/evdev/clutter-device-manager-evdev.c
index 732f0a3..ab1b21a 100644
--- a/clutter/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c
@@ -2278,6 +2278,12 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
   return next_id;
 }
 
+void
+_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
+{
+  dispatch_libinput (manager_evdev);
+}
+
 static int
 compare_ids (gconstpointer a,
              gconstpointer b)
diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.h 
b/clutter/clutter/evdev/clutter-device-manager-evdev.h
index 1b01b8d..c2dbe31 100644
--- a/clutter/clutter/evdev/clutter-device-manager-evdev.h
+++ b/clutter/clutter/evdev/clutter-device-manager-evdev.h
@@ -76,6 +76,8 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
                                                       float                     *new_x,
                                                       float                     *new_y);
 
+void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
+
 static inline guint64
 us (guint64 us)
 {
diff --git a/clutter/clutter/evdev/clutter-seat-evdev.c b/clutter/clutter/evdev/clutter-seat-evdev.c
index 255c219..a15f17c 100644
--- a/clutter/clutter/evdev/clutter-seat-evdev.c
+++ b/clutter/clutter/evdev/clutter-seat-evdev.c
@@ -187,6 +187,12 @@ keyboard_repeat (gpointer data)
   ClutterSeatEvdev *seat = data;
   GSource *source;
 
+  /* There might be events queued in libinput that could cancel the
+     repeat timer. */
+  _clutter_device_manager_evdev_dispatch (seat->manager_evdev);
+  if (!seat->repeat_timer)
+    return G_SOURCE_REMOVE;
+
   g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
   source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]