From 68c967ec0c87b946476487e7f57124ecde854a60 Mon Sep 17 00:00:00 2001 From: Nikolay Yakimov Date: Thu, 12 Aug 2021 11:30:23 +0300 Subject: [PATCH] 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 --- XMonad/Actions/GridSelect.hs | 5 +++-- XMonad/Actions/TreeSelect.hs | 4 ++-- XMonad/Prompt.hs | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/XMonad/Actions/GridSelect.hs b/XMonad/Actions/GridSelect.hs index 1ba0aa63..b4e297d1 100644 --- a/XMonad/Actions/GridSelect.hs +++ b/XMonad/Actions/GridSelect.hs @@ -407,10 +407,11 @@ makeXEventhandler keyhandler = fix $ \me -> join $ liftX $ withDisplay $ \d -> l ev <- getEvent e if ev_event_type ev == keyPress then do - (ks,s) <- lookupString $ asKeyEvent e + (_, s) <- lookupString $ asKeyEvent e + ks <- keycodeToKeysym d (ev_keycode ev) 0 return $ do mask <- liftX $ cleanKeyMask <*> pure (ev_state ev) - keyhandler (fromMaybe xK_VoidSymbol ks, s, mask) + keyhandler (ks, s, mask) else return $ stdHandle ev me diff --git a/XMonad/Actions/TreeSelect.hs b/XMonad/Actions/TreeSelect.hs index 8727634e..43ef6e79 100644 --- a/XMonad/Actions/TreeSelect.hs +++ b/XMonad/Actions/TreeSelect.hs @@ -533,11 +533,11 @@ navigate = gets tss_display >>= \d -> join . liftIO . allocaXEvent $ \e -> do ev <- getEvent e if | ev_event_type ev == keyPress -> do - (ks, _) <- lookupString $ asKeyEvent e + ks <- keycodeToKeysym d (ev_keycode ev) 0 return $ do mask <- liftX $ cleanKeyMask <*> pure (ev_state ev) 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 -- See XMonad.Prompt Note [Allow ButtonEvents] allowEvents d replayPointer currentTime diff --git a/XMonad/Prompt.hs b/XMonad/Prompt.hs index 8513f6d6..ce29663d 100644 --- a/XMonad/Prompt.hs +++ b/XMonad/Prompt.hs @@ -637,10 +637,11 @@ eventLoop handle stopAction = do -- Also capture @buttonPressMask@, see Note [Allow ButtonEvents] maskEvent d (exposureMask .|. keyPressMask .|. buttonPressMask) e ev <- getEvent e - (ks,s) <- if ev_event_type ev == keyPress - then lookupString $ asKeyEvent e - else return (Nothing, "") - return (fromMaybe xK_VoidSymbol ks,s,ev) + if ev_event_type ev == keyPress + then do (_, s) <- lookupString $ asKeyEvent e + ks <- keycodeToKeysym d (ev_keycode ev) 0 + return (ks, s, ev) + else return (noSymbol, "", ev) l -> do modify $ \s -> s { eventBuffer = tail l } return $ head l