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
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