diff --git a/input.cpp b/input.cpp --- a/input.cpp +++ b/input.cpp @@ -788,7 +788,9 @@ return ret; } } else if (event->type() == QEvent::KeyPress) { - return input()->shortcuts()->processKey(static_cast(event)->modifiersRelevantForGlobalShortcuts(), event->key()); + if (!waylandServer()->isKeyboardShortcutsInhibited()) { + return input()->shortcuts()->processKey(static_cast(event)->modifiersRelevantForGlobalShortcuts(), event->key()); + } } return false; } diff --git a/modifier_only_shortcuts.cpp b/modifier_only_shortcuts.cpp --- a/modifier_only_shortcuts.cpp +++ b/modifier_only_shortcuts.cpp @@ -21,6 +21,7 @@ #include "input_event.h" #include "options.h" #include "screenlockerwatcher.h" +#include "wayland_server.h" #include "workspace.h" #include @@ -63,13 +64,15 @@ if (m_modifier != Qt::NoModifier) { const auto list = options->modifierOnlyDBusShortcut(m_modifier); if (list.size() >= 4) { - auto call = QDBusMessage::createMethodCall(list.at(0), list.at(1), list.at(2), list.at(3)); - QVariantList args; - for (int i = 4; i < list.size(); ++i) { - args << list.at(i); + if (!waylandServer() || !waylandServer()->isKeyboardShortcutsInhibited()) { + auto call = QDBusMessage::createMethodCall(list.at(0), list.at(1), list.at(2), list.at(3)); + QVariantList args; + for (int i = 4; i < list.size(); ++i) { + args << list.at(i); + } + call.setArguments(args); + QDBusConnection::sessionBus().asyncCall(call); } - call.setArguments(args); - QDBusConnection::sessionBus().asyncCall(call); } } } diff --git a/wayland_server.h b/wayland_server.h --- a/wayland_server.h +++ b/wayland_server.h @@ -70,6 +70,7 @@ class LinuxDmabufUnstableV1Interface; class LinuxDmabufUnstableV1Buffer; class TabletManagerInterface; +class KeyboardShortcutsInhibitManagerInterface; } @@ -83,6 +84,7 @@ class KWIN_EXPORT WaylandServer : public QObject { Q_OBJECT + public: enum class InitializationFlag { NoOptions = 0x0, @@ -131,6 +133,13 @@ KWaylandServer::XdgOutputManagerInterface *xdgOutputManager() const { return m_xdgOutputManager; } + KWaylandServer::KeyboardShortcutsInhibitManagerInterface *keyboardShortcutsInhibitManager() const + { + return m_keyboardShortcutsInhibitManager; + } + + bool isKeyboardShortcutsInhibited() const; + KWaylandServer::LinuxDmabufUnstableV1Interface *linuxDmabuf(); QList clients() const { @@ -272,6 +281,7 @@ KWaylandServer::XdgOutputManagerInterface *m_xdgOutputManager = nullptr; KWaylandServer::XdgDecorationManagerInterface *m_xdgDecorationManager = nullptr; KWaylandServer::LinuxDmabufUnstableV1Interface *m_linuxDmabuf = nullptr; + KWaylandServer::KeyboardShortcutsInhibitManagerInterface *m_keyboardShortcutsInhibitManager = nullptr; QSet m_linuxDmabufBuffers; struct { KWaylandServer::ClientConnection *client = nullptr; diff --git a/wayland_server.cpp b/wayland_server.cpp --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -65,6 +65,7 @@ #include #include #include +#include // KF #include @@ -322,7 +323,7 @@ ); m_tabletManager = m_display->createTabletManagerInterface(m_display); - + m_keyboardShortcutsInhibitManager = m_display->createKeyboardShortcutsInhibitManager(m_display); m_xdgShell = m_display->createXdgShell(XdgShellInterfaceVersion::Stable, m_display); m_xdgShell->create(); connect(m_xdgShell, &XdgShellInterface::surfaceCreated, this, &WaylandServer::createSurface); @@ -840,4 +841,14 @@ m_keyState->setState(KeyStateInterface::Key::ScrollLock, leds & KWin::Xkb::LED::ScrollLock ? KeyStateInterface::State::Locked : KeyStateInterface::State::Unlocked); } +bool WaylandServer::isKeyboardShortcutsInhibited() const +{ + auto surface = seat()->focusedKeyboardSurface(); + if (surface) { + auto inhibitor = keyboardShortcutsInhibitManager()->findInhibitor(surface, seat()); + return inhibitor && inhibitor->isActive(); + } + return false; +} + }