Merge pull request #6 from sgf-dma/master

X.A.Submap: establish pointer grab to avoid freezing X.
This commit is contained in:
Peter J. Jones
2016-12-09 08:34:47 -07:00
committed by GitHub
2 changed files with 18 additions and 6 deletions

View File

@@ -42,6 +42,12 @@
EWMH taskbars and pagers. Useful for `NamedScratchpad` windows, since EWMH taskbars and pagers. Useful for `NamedScratchpad` windows, since
you will usually be taken to the `NSP` workspace by them. you will usually be taken to the `NSP` workspace by them.
* `XMonad.Actions.Submap`
Establish pointer grab to avoid freezing X, when button press occurs after
submap key press. And terminate submap at button press in the same way,
as we do for wrong key press.
### Minor Changes ### Minor Changes
* `XMonad.Layout.LayoutBuilder` * `XMonad.Layout.LayoutBuilder`

View File

@@ -75,17 +75,23 @@ submapDefaultWithKey defAction keys = do
XConf { theRoot = root, display = d } <- ask XConf { theRoot = root, display = d } <- ask
io $ grabKeyboard d root False grabModeAsync grabModeAsync currentTime io $ grabKeyboard d root False grabModeAsync grabModeAsync currentTime
io $ grabPointer d root False buttonPressMask grabModeAsync grabModeAsync
none none currentTime
(m, s) <- io $ allocaXEvent $ \p -> fix $ \nextkey -> do (m, s) <- io $ allocaXEvent $ \p -> fix $ \nextkey -> do
maskEvent d keyPressMask p maskEvent d (keyPressMask .|. buttonPressMask) p
KeyEvent { ev_keycode = code, ev_state = m } <- getEvent p ev <- getEvent p
keysym <- keycodeToKeysym d code 0 case ev of
if isModifierKey keysym KeyEvent { ev_keycode = code, ev_state = m } -> do
then nextkey keysym <- keycodeToKeysym d code 0
else return (m, keysym) if isModifierKey keysym
then nextkey
else return (m, keysym)
_ -> return (0, 0)
-- Remove num lock mask and Xkb group state bits -- Remove num lock mask and Xkb group state bits
m' <- cleanMask $ m .&. ((1 `shiftL` 12) - 1) m' <- cleanMask $ m .&. ((1 `shiftL` 12) - 1)
io $ ungrabPointer d currentTime
io $ ungrabKeyboard d currentTime io $ ungrabKeyboard d currentTime
fromMaybe (defAction (m', s)) (M.lookup (m', s) keys) fromMaybe (defAction (m', s)) (M.lookup (m', s) keys)