diff --git a/src/lib/platform/EiScreen.cpp b/src/lib/platform/EiScreen.cpp index ce42a2f5e..57b3e1ece 100644 --- a/src/lib/platform/EiScreen.cpp +++ b/src/lib/platform/EiScreen.cpp @@ -621,18 +621,26 @@ void EiScreen::onKeyEvent(ei_event *event) bool pressed = ei_event_keyboard_get_key_is_press(event); KeyID keyid = m_keyState->mapKeyFromKeyval(keyval); auto keybutton = static_cast(keyval); + bool repeat; m_keyState->updateXkbState(keyval, pressed); KeyModifierMask mask = m_keyState->pollActiveModifiers(); - LOG_DEBUG1("event: key %s keycode=%d keyid=%d mask=0x%x", pressed ? "press" : "release", keycode, keyid, mask); + repeat = pressed && m_lastPressed == keyid && keyid != kKeyNone; + + m_lastPressed = pressed ? keyid : kKeyNone; + + LOG_DEBUG1( + "event: key %s%s keycode=%d keyid=%d mask=0x%x", pressed ? "press" : "release", repeat ? " (repeat)" : "", + keycode, keyid, mask + ); if (m_isPrimary && onHotkey(keyid, pressed, mask)) { return; } if (keyid != kKeyNone) { - m_keyState->sendKeyEvent(getEventTarget(), pressed, false, keyid, mask, 1, keybutton); + m_keyState->sendKeyEvent(getEventTarget(), pressed, repeat, keyid, mask, 1, keybutton); } } diff --git a/src/lib/platform/EiScreen.h b/src/lib/platform/EiScreen.h index e75108db0..3d84aff32 100644 --- a/src/lib/platform/EiScreen.h +++ b/src/lib/platform/EiScreen.h @@ -122,6 +122,8 @@ private: // keyboard stuff EiKeyState *m_keyState = nullptr; + KeyID m_lastPressed = kKeyNone; + // clipboard stuff WlClipboardCollection *m_clipboard = nullptr;