From: Ivailo Monev Date: Sun, 27 Dec 2020 20:58:50 +0000 (+0000) Subject: check if X11 auto repeat is enabled in QKeyMapperPrivate::translateKeyEvent() X-Git-Tag: 4.12.0~2929 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=98c7d2f06f27c88ea81ac26ceb42a90decd0ffcc;p=kde%2FKatie.git check if X11 auto repeat is enabled in QKeyMapperPrivate::translateKeyEvent() Signed-off-by: Ivailo Monev --- diff --git a/src/gui/kernel/qkeymapper_x11.cpp b/src/gui/kernel/qkeymapper_x11.cpp index a739c07af..f4c3df548 100644 --- a/src/gui/kernel/qkeymapper_x11.cpp +++ b/src/gui/kernel/qkeymapper_x11.cpp @@ -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