diff options
-rw-r--r-- | qxt-mini/qxtglobalshortcut_x11.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/qxt-mini/qxtglobalshortcut_x11.cpp b/qxt-mini/qxtglobalshortcut_x11.cpp index a2e47ade..0db1ece5 100644 --- a/qxt-mini/qxtglobalshortcut_x11.cpp +++ b/qxt-mini/qxtglobalshortcut_x11.cpp @@ -206,19 +206,45 @@ public: return DefaultRootWindow(display()); } - bool grabKey(quint32 keycode, Window window) + bool grabKey(quint32 keycode, quint32 modifiers, Window window) { + //TODO: search keybinding by code and modifiers, so keys can be assigned multiple times using different modifiers if (keybinding::incf(keycode)) { QxtX11ErrorHandler errorHandler; + bool error = false; - XGrabKey(display(), keycode, AnyModifier, window, True, + XGrabKey(display(), keycode, modifiers, window, True, GrabModeAsync, GrabModeAsync); + if (errorHandler.error) { + error=true; + } + //Also grab key with num lock = on + XGrabKey(display(), keycode, modifiers | Mod2Mask, window, True, + GrabModeAsync, GrabModeAsync); + if (errorHandler.error) { + error=true; + } + //...and with scroll lock = on + XGrabKey(display(), keycode, modifiers | Mod5Mask, window, True, + GrabModeAsync, GrabModeAsync); if (errorHandler.error) { + error=true; + } + + //...and with bot = on + XGrabKey(display(), keycode, modifiers | Mod2Mask | Mod5Mask, window, True, + GrabModeAsync, GrabModeAsync); + if (errorHandler.error) { + error=true; + } + + if(error){ ungrabKey(keycode, window); return false; } + } return true; @@ -262,8 +288,6 @@ bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, keystate |= Mod4Mask; if(kev->state & XCB_MOD_MASK_SHIFT) //shift keystate |= ShiftMask; - if(kev->state & XCB_MOD_MASK_2) //numlock - keystate |= Mod2Mask; #if 0 if(key->state & XCB_MOD_MASK_3) // alt gr aka right-alt or ctrl+left-alt -- what mask is it? keystate |= AltGrMask; @@ -323,7 +347,7 @@ quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key) bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, unused(quint32, nativeMods)) { QxtX11Data x11; - return x11.isValid() && x11.grabKey(nativeKey, x11.rootWindow()); + return x11.isValid() && x11.grabKey(nativeKey, nativeMods, x11.rootWindow()); } bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, unused(quint32, nativeMods)) |