diff --git a/input.cpp b/input.cpp --- a/input.cpp +++ b/input.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include //screenlocker @@ -788,7 +789,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,12 +21,17 @@ #include "input_event.h" #include "options.h" #include "screenlockerwatcher.h" +#include "wayland_server.h" #include "workspace.h" #include #include #include +#include +#include +#include + namespace KWin { @@ -63,13 +68,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, @@ -97,34 +99,47 @@ bool init(const QByteArray &socketName = QByteArray(), InitializationFlags flags = InitializationFlag::NoOptions); void terminateClientConnections(); - KWaylandServer::Display *display() { + KWaylandServer::Display *display() const + { return m_display; } - KWaylandServer::CompositorInterface *compositor() { + KWaylandServer::CompositorInterface *compositor() const + { return m_compositor; } - KWaylandServer::SeatInterface *seat() { + KWaylandServer::SeatInterface *seat() const + { return m_seat; } - KWaylandServer::TabletManagerInterface *tabletManager() + KWaylandServer::TabletManagerInterface *tabletManager() const { return m_tabletManager; } - KWaylandServer::DataDeviceManagerInterface *dataDeviceManager() { + KWaylandServer::DataDeviceManagerInterface *dataDeviceManager() const + { return m_dataDeviceManager; } - KWaylandServer::PlasmaVirtualDesktopManagementInterface *virtualDesktopManagement() { + KWaylandServer::PlasmaVirtualDesktopManagementInterface *virtualDesktopManagement() const + { return m_virtualDesktopManagement; } - KWaylandServer::PlasmaWindowManagementInterface *windowManagement() { + KWaylandServer::PlasmaWindowManagementInterface *windowManagement() const + { return m_windowManagement; } KWaylandServer::ServerSideDecorationManagerInterface *decorationManager() const { return m_decorationManager; } KWaylandServer::XdgOutputManagerInterface *xdgOutputManager() const { return m_xdgOutputManager; } + KWaylandServer::KeyboardShortcutsInhibitManagerInterface *keyboardShortcutsInhibitManager() const + { + return m_keyboardShortcutsInhibitManager; + } + + bool isKeyboardShortcutsInhibited() const; + KWaylandServer::LinuxDmabufUnstableV1Interface *linuxDmabuf(); QList clients() const { @@ -266,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 @@ -315,7 +316,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); @@ -832,4 +833,15 @@ m_keyState->setState(KeyStateInterface::Key::ScrollLock, leds & KWin::Xkb::LED::ScrollLock ? KeyStateInterface::State::Locked : KeyStateInterface::State::Unlocked); } +bool WaylandServer::isKeyboardShortcutsInhibited() const +{ + SeatInterface *current_seat = seat(); + auto surface = current_seat->focusedKeyboardSurface(); + if (surface) { + auto inhibitor = waylandServer()->keyboardShortcutsInhibitManager()->getShortcutsInhibitor(surface, current_seat); + return inhibitor && inhibitor->isActive(); + } + return false; +} + }