mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-07-31 20:21:51 -07:00
X.A.{Grid,Tree}Select: Fix keybindings in secondary kbd layouts
We didn't clean XKB group bits out of the KeyPress events' state so key bindings only worked in the primary keyboard layout (first XKB group). To fix this, this adds a `cleanKeyMask` function to X.Prelude which is analogous to `cleanMask` but aimed at cleaning regular KeyPress states (as opposed to just KeyPresses from passive key grabs), and this is then used instead of `cleanMask`. Related: https://github.com/xmonad/xmonad-contrib/issues/290 Related: https://github.com/xmonad/xmonad-contrib/pull/590
This commit is contained in:
@@ -24,6 +24,7 @@ module XMonad.Prelude (
|
||||
safeGetWindowAttributes,
|
||||
keyToString,
|
||||
keymaskToString,
|
||||
cleanKeyMask,
|
||||
) where
|
||||
|
||||
import Foreign (alloca, peek)
|
||||
@@ -116,3 +117,18 @@ keymaskToString numLockMask msk =
|
||||
-- pair, into a string.
|
||||
keyToString :: (KeyMask, KeySym) -> [Char]
|
||||
keyToString = uncurry (++) . bimap (keymaskToString 0) keysymToString
|
||||
|
||||
-- | Strip numlock, capslock, mouse buttons and XKB group from a 'KeyMask',
|
||||
-- leaving only modifier keys like Shift, Control, Super, Hyper in the mask
|
||||
-- (hence the \"Key\" in \"cleanKeyMask\").
|
||||
--
|
||||
-- Core's 'cleanMask' only strips the first two because key events from
|
||||
-- passive grabs (key bindings) are stripped of mouse buttons and XKB group by
|
||||
-- the X server already for compatibility reasons. For more info, see:
|
||||
-- <https://www.x.org/releases/X11R7.7/doc/kbproto/xkbproto.html#Delivering_a_Key_or_Button_Event_to_a_Client>
|
||||
cleanKeyMask :: X (KeyMask -> KeyMask)
|
||||
cleanKeyMask = cleanKeyMask' <$> gets numberlockMask
|
||||
|
||||
cleanKeyMask' :: KeyMask -> KeyMask -> KeyMask
|
||||
cleanKeyMask' numLockMask mask =
|
||||
mask .&. complement (numLockMask .|. lockMask) .&. (button1Mask - 1)
|
||||
|
Reference in New Issue
Block a user