diff --git a/src/popup_input_filter.cpp b/src/popup_input_filter.cpp index 828a7cc851..cd1a0fbb37 100644 --- a/src/popup_input_filter.cpp +++ b/src/popup_input_filter.cpp @@ -8,8 +8,11 @@ #include "abstract_client.h" #include "deleted.h" #include "internal_client.h" +#include "wayland_server.h" #include "workspace.h" +#include +#include #include namespace KWin @@ -65,6 +68,34 @@ bool PopupInputFilter::pointerEvent(QMouseEvent *event, quint32 nativeButton) return false; } +bool PopupInputFilter::keyEvent(QKeyEvent *event) +{ + if (m_popupClients.isEmpty()) { + return false; + } + + auto seat = waylandServer()->seat(); + + auto last = m_popupClients.last(); + if (last->surface() == nullptr) { + return false; + } + + seat->setFocusedKeyboardSurface(last->surface()); + switch (event->type()) { + case QEvent::KeyPress: + seat->keyboard()->keyPressed(event->nativeScanCode()); + break; + case QEvent::KeyRelease: + seat->keyboard()->keyReleased(event->nativeScanCode()); + break; + default: + break; + } + + return true; +} + void PopupInputFilter::cancelPopups() { while (!m_popupClients.isEmpty()) { diff --git a/src/popup_input_filter.h b/src/popup_input_filter.h index fdd05d5f52..a0a95446d2 100644 --- a/src/popup_input_filter.h +++ b/src/popup_input_filter.h @@ -22,6 +22,7 @@ class PopupInputFilter : public QObject, public InputEventFilter public: explicit PopupInputFilter(); bool pointerEvent(QMouseEvent *event, quint32 nativeButton) override; + bool keyEvent(QKeyEvent *event) override; private: void handleClientAdded(Toplevel *client); void handleClientRemoved(Toplevel *client);