fix: handle const (0,0) from passing def as keybinding action

Before https://github.com/xmonad/xmonad/commit/383ffb7 this would
bind all unbound keys to toggle struts; after it, it would bind no
keys at all. With this commit, it will check for this case and use
the default keybinding instead.

Users who intend no key to be bound should probably use `withSB`
instead, especially in light of aforementioned commit.
This commit is contained in:
brandon s allbery kf8nh
2021-07-21 15:30:29 -04:00
parent 8a0a84f1d5
commit 58e2b803a4
2 changed files with 24 additions and 7 deletions

View File

@@ -156,7 +156,8 @@ import XMonad.Hooks.StatusBar
-- You should use this function only when the default 'dzen' function does not
-- serve your purpose.
--
dzenWithFlags :: LayoutClass l Window
dzenWithFlags :: (LayoutClass l Window
,Read (l Window))
=> String -- ^ Flags to give to @dzen@
-> XConfig l -- ^ The base config
-> IO (XConfig (ModifiedLayout AvoidStruts l))
@@ -170,7 +171,8 @@ dzenWithFlags flags = statusBar ("dzen2 " ++ flags) dzenPP toggleStrutsKey
--
-- This works pretty much the same as the 'xmobar' function.
--
dzen :: LayoutClass l Window
dzen :: (LayoutClass l Window
,Read (l Window))
=> XConfig l -- ^ The base config
-> IO (XConfig (ModifiedLayout AvoidStruts l))
dzen = dzenWithFlags flags
@@ -181,7 +183,8 @@ dzen = dzenWithFlags flags
-- | This function works like 'xmobarProp', but uses pipes instead of
-- property-based logging.
xmobar :: LayoutClass l Window
xmobar :: (LayoutClass l Window
,Read (l Window))
=> XConfig l -- ^ The base config
-> IO (XConfig (ModifiedLayout AvoidStruts l))
xmobar = statusBar "xmobar" xmobarPP toggleStrutsKey
@@ -189,7 +192,8 @@ xmobar = statusBar "xmobar" xmobarPP toggleStrutsKey
-- | Like 'statusBarProp', but uses pipes instead of property-based logging.
-- Only use this function if your status bar does not support reading from a
-- property of the root window.
statusBar :: LayoutClass l Window
statusBar :: (LayoutClass l Window
,Read (l Window))
=> String -- ^ The command line to launch the status bar
-> PP -- ^ The pretty printing options
-> (XConfig Layout -> (KeyMask, KeySym))
@@ -258,7 +262,8 @@ dynamicLogXinerama = withWindowSet $ io . putStrLn . pprWindowSetXinerama
-- The binding uses the "XMonad.Hooks.ManageDocks" module to automatically
-- handle screen placement for xmobar, and enables 'mod-b' for toggling
-- the menu bar.
xmobarProp :: LayoutClass l Window
xmobarProp :: (LayoutClass l Window
,Read (l Window))
=> XConfig l -- ^ The base config
-> XConfig (ModifiedLayout AvoidStruts l)
xmobarProp =

View File

@@ -275,7 +275,8 @@ withSB (StatusBarConfig lh sh ch) conf = conf
-- Using this function multiple times to combine status bars may result in
-- only one status bar working properly. See the section on using multiple
-- status bars for more details.
withEasySB :: LayoutClass l Window
withEasySB :: (LayoutClass l Window
,Read (l Window))
=> StatusBarConfig -- ^ The status bar config
-> (XConfig Layout -> (KeyMask, KeySym))
-- ^ The key binding
@@ -285,7 +286,18 @@ withEasySB sb k conf = docks . withSB sb $ conf
{ layoutHook = avoidStruts (layoutHook conf)
, keys = (<>) <$> keys' <*> keys conf
}
where keys' = (`M.singleton` sendMessage ToggleStruts) . k
where
-- This usually means the user passed 'def' for the keybinding
-- function, and is otherwise meaningless to harmful depending on
-- whether 383ffb7 has been applied to xmonad or not. So do what
-- they probably intend.
--
-- A user who wants no keybinding function should probably use
-- 'withSB' instead, especially since NoSymbol didn't do anything
-- sane before 383ffb7. ++bsa
k' | k conf {layoutHook = Layout (layoutHook conf)} == (0,0) = defToggleStrutsKey
| otherwise = k
keys' = (`M.singleton` sendMessage ToggleStruts) . k'
-- | Default @mod-b@ key binding for 'withEasySB'
defToggleStrutsKey :: XConfig t -> (KeyMask, KeySym)