mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
X.A.{Grid,Tree}Select, X.Prompt: Fix keybindings like Shift-Tab and similar
This changes KeyPress handling in these modules to behave much closer to how xmonad core itself handles keypresses. The primary difference lies in that xmonad reads raw KeyCode and then converts it to unmodified KeySym, while these modules used `lookupString` to find the actual keysyms. As a consequence, key definitions like `(shiftMap, xK_Tab)` didn't work on many layouts because an actual KeySym for `Shift-Tab` is commonly `ISO_LEFT_TAB`, and not `Tab`. Closes: https://github.com/xmonad/xmonad-contrib/pull/590 Co-authored-by: Tomas Janousek <tomi@nomi.cz>
This commit is contained in:
parent
12c5518852
commit
68c967ec0c
@ -407,10 +407,11 @@ makeXEventhandler keyhandler = fix $ \me -> join $ liftX $ withDisplay $ \d -> l
|
|||||||
ev <- getEvent e
|
ev <- getEvent e
|
||||||
if ev_event_type ev == keyPress
|
if ev_event_type ev == keyPress
|
||||||
then do
|
then do
|
||||||
(ks,s) <- lookupString $ asKeyEvent e
|
(_, s) <- lookupString $ asKeyEvent e
|
||||||
|
ks <- keycodeToKeysym d (ev_keycode ev) 0
|
||||||
return $ do
|
return $ do
|
||||||
mask <- liftX $ cleanKeyMask <*> pure (ev_state ev)
|
mask <- liftX $ cleanKeyMask <*> pure (ev_state ev)
|
||||||
keyhandler (fromMaybe xK_VoidSymbol ks, s, mask)
|
keyhandler (ks, s, mask)
|
||||||
else
|
else
|
||||||
return $ stdHandle ev me
|
return $ stdHandle ev me
|
||||||
|
|
||||||
|
@ -533,11 +533,11 @@ navigate = gets tss_display >>= \d -> join . liftIO . allocaXEvent $ \e -> do
|
|||||||
ev <- getEvent e
|
ev <- getEvent e
|
||||||
|
|
||||||
if | ev_event_type ev == keyPress -> do
|
if | ev_event_type ev == keyPress -> do
|
||||||
(ks, _) <- lookupString $ asKeyEvent e
|
ks <- keycodeToKeysym d (ev_keycode ev) 0
|
||||||
return $ do
|
return $ do
|
||||||
mask <- liftX $ cleanKeyMask <*> pure (ev_state ev)
|
mask <- liftX $ cleanKeyMask <*> pure (ev_state ev)
|
||||||
f <- asks ts_navigate
|
f <- asks ts_navigate
|
||||||
fromMaybe navigate $ M.lookup (mask, fromMaybe xK_VoidSymbol ks) f
|
fromMaybe navigate $ M.lookup (mask, ks) f
|
||||||
| ev_event_type ev == buttonPress -> do
|
| ev_event_type ev == buttonPress -> do
|
||||||
-- See XMonad.Prompt Note [Allow ButtonEvents]
|
-- See XMonad.Prompt Note [Allow ButtonEvents]
|
||||||
allowEvents d replayPointer currentTime
|
allowEvents d replayPointer currentTime
|
||||||
|
@ -637,10 +637,11 @@ eventLoop handle stopAction = do
|
|||||||
-- Also capture @buttonPressMask@, see Note [Allow ButtonEvents]
|
-- Also capture @buttonPressMask@, see Note [Allow ButtonEvents]
|
||||||
maskEvent d (exposureMask .|. keyPressMask .|. buttonPressMask) e
|
maskEvent d (exposureMask .|. keyPressMask .|. buttonPressMask) e
|
||||||
ev <- getEvent e
|
ev <- getEvent e
|
||||||
(ks,s) <- if ev_event_type ev == keyPress
|
if ev_event_type ev == keyPress
|
||||||
then lookupString $ asKeyEvent e
|
then do (_, s) <- lookupString $ asKeyEvent e
|
||||||
else return (Nothing, "")
|
ks <- keycodeToKeysym d (ev_keycode ev) 0
|
||||||
return (fromMaybe xK_VoidSymbol ks,s,ev)
|
return (ks, s, ev)
|
||||||
|
else return (noSymbol, "", ev)
|
||||||
l -> do
|
l -> do
|
||||||
modify $ \s -> s { eventBuffer = tail l }
|
modify $ \s -> s { eventBuffer = tail l }
|
||||||
return $ head l
|
return $ head l
|
||||||
|
Loading…
x
Reference in New Issue
Block a user