OSDN Git Service

check if X11 auto repeat is enabled in QKeyMapperPrivate::translateKeyEvent()
authorIvailo Monev <xakepa10@gmail.com>
Sun, 27 Dec 2020 20:58:50 +0000 (20:58 +0000)
committerIvailo Monev <xakepa10@gmail.com>
Sun, 27 Dec 2020 21:02:26 +0000 (21:02 +0000)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/gui/kernel/qkeymapper_x11.cpp

index a739c07..f4c3df5 100644 (file)
@@ -177,6 +177,23 @@ static int translateKeySym(const uint key)
     return key;
 }
 
+static bool getX11AutoRepeat() {
+    XKeyboardState state;
+    XGetKeyboardControl(qt_x11Data->display, &state);
+    if (state.global_auto_repeat) {
+        // NOTE: according to `xset -q` the delay is 250,
+        // QApplication::keyboardInputInterval() is set to 400 but it does not
+        // have the same meaning nor is it clear if the events are delayed by
+        // the delay value X11 holds or they appear in the range of the value
+        // so the time-window for auto repeat events that are registered is
+        // likely incorrect. there are two ways to query the actual X11 value,
+        // either via XkbGetControls() or XF86MiscGetKbdSettings() but the
+        // second is deprecated
+        return QApplication::keyboardInputInterval();
+    }
+    return -1;
+}
+
 struct qt_auto_repeat_data
 {
     // simulated auto-repeat X11 events have the same serial
@@ -204,23 +221,26 @@ bool QKeyMapperPrivate::translateKeyEvent(QWidget *keyWidget, const XEvent *even
     QString text = QString::fromLatin1(lookupbuff, count);
 
     bool autorepeat = false;
-    static qt_auto_repeat_data curr_autorep = { 0, 0, 0, 0 };
-    static int interval = QApplication::keyboardInputInterval() + 10;
-    if (curr_autorep.serial == event->xkey.serial ||
-        (event->xkey.window == curr_autorep.window &&
-        event->xkey.keycode == curr_autorep.keycode &&
-        event->xkey.time - curr_autorep.time < interval)) {
-        autorepeat = true;
+    static const int qt_x11_autorepeat = getX11AutoRepeat();
+    // auto repeat is on by default
+    if (Q_LIKELY(qt_x11_autorepeat)) {
+        static qt_auto_repeat_data curr_autorep = { 0, 0, 0, 0 };
+        if (curr_autorep.serial == event->xkey.serial ||
+            (event->xkey.window == curr_autorep.window &&
+            event->xkey.keycode == curr_autorep.keycode &&
+            event->xkey.time - curr_autorep.time < qt_x11_autorepeat)) {
+            autorepeat = true;
+        }
+        curr_autorep = {
+            event->xkey.serial,
+            event->xkey.window,
+            event->xkey.keycode,
+            event->xkey.time
+        };
     }
-    curr_autorep = {
-        event->xkey.serial,
-        event->xkey.window,
-        event->xkey.keycode,
-        event->xkey.time
-    };
 
 #if 0
-    qDebug() << "translateKeyEvent" << modifiers << count << text << autorepeat;
+    qDebug() << "translateKeyEvent" << modifiers << count << text << autorepeat << qt_x11_autorepeat;
 #endif
 
     // try the menu key first