Update StatusBar library to use the X monad instead of IO.

This change allows dynamic status bars to pull information out of the
X monad, which can be really useful for status bars. For instance, you
can now query the screen width in order to set the width of status
bars appropriately.

Existing configurations may need to be updated in order to lift an
`IO StatusBarConfig` to an `X StatusBarConfig`. This can be done using
either the `io` function provided by `XMonad.Core`, or `liftIO` from
`base` in `Control.Monad.IO.Class`

- https://hackage.haskell.org/package/xmonad-0.18.0/docs/XMonad-Core.html#v:io
- https://hackage.haskell.org/package/base-4.19.1.0/docs/Control-Monad-IO-Class.html#v:liftIO
This commit is contained in:
Calvin Beck 2024-03-09 10:29:35 -05:00
parent de5ef6cabd
commit e735339b75
2 changed files with 13 additions and 4 deletions

View File

@ -4,6 +4,15 @@
### Breaking Changes ### Breaking Changes
* `XMonad.Hooks.StatusBars`
- Move status bar functions from the `IO` to the `X` monad to
allow them to look up information from `X`, like the screen
width. Existing configurations may need to use `io` from
`XMonad.Core` or `liftIO` from `Control.Monad.IO.Class` in
order to lift any existing `IO StatusBarConfig` values into
`X StatusBarConfig` values.
### New Modules ### New Modules
* `XMonad.Actions.Profiles`. * `XMonad.Actions.Profiles`.

View File

@ -452,7 +452,7 @@ instance ExtensionClass ActiveSBs where
-- 'avoidStruts', check 'dynamicEasySBs'. -- 'avoidStruts', check 'dynamicEasySBs'.
-- --
-- Heavily inspired by "XMonad.Hooks.DynamicBars" -- Heavily inspired by "XMonad.Hooks.DynamicBars"
dynamicSBs :: (ScreenId -> IO StatusBarConfig) -> XConfig l -> XConfig l dynamicSBs :: (ScreenId -> X StatusBarConfig) -> XConfig l -> XConfig l
dynamicSBs f conf = addAfterRescreenHook (updateSBs f) $ conf dynamicSBs f conf = addAfterRescreenHook (updateSBs f) $ conf
{ startupHook = startupHook conf >> killAllStatusBars >> updateSBs f { startupHook = startupHook conf >> killAllStatusBars >> updateSBs f
, logHook = logHook conf >> logSBs , logHook = logHook conf >> logSBs
@ -462,7 +462,7 @@ dynamicSBs f conf = addAfterRescreenHook (updateSBs f) $ conf
-- resulting config and adds 'avoidStruts' to the -- resulting config and adds 'avoidStruts' to the
-- layout. -- layout.
dynamicEasySBs :: LayoutClass l Window dynamicEasySBs :: LayoutClass l Window
=> (ScreenId -> IO StatusBarConfig) => (ScreenId -> X StatusBarConfig)
-> XConfig l -> XConfig l
-> XConfig (ModifiedLayout AvoidStruts l) -> XConfig (ModifiedLayout AvoidStruts l)
dynamicEasySBs f conf = dynamicEasySBs f conf =
@ -471,7 +471,7 @@ dynamicEasySBs f conf =
-- | Given the function to create status bars, update -- | Given the function to create status bars, update
-- the status bars by killing those that shouldn't be -- the status bars by killing those that shouldn't be
-- visible anymore and creates any missing status bars -- visible anymore and creates any missing status bars
updateSBs :: (ScreenId -> IO StatusBarConfig) -> X () updateSBs :: (ScreenId -> X StatusBarConfig) -> X ()
updateSBs f = do updateSBs f = do
actualScreens <- withWindowSet $ return . map W.screen . W.screens actualScreens <- withWindowSet $ return . map W.screen . W.screens
(toKeep, toKill) <- (toKeep, toKill) <-
@ -480,7 +480,7 @@ updateSBs f = do
cleanSBs (map snd toKill) cleanSBs (map snd toKill)
-- Create new status bars if needed -- Create new status bars if needed
let missing = actualScreens \\ map fst toKeep let missing = actualScreens \\ map fst toKeep
added <- io $ traverse (\s -> (s,) <$> f s) missing added <- traverse (\s -> (s,) <$> f s) missing
traverse_ (sbStartupHook . snd) added traverse_ (sbStartupHook . snd) added
XS.put (ASB (toKeep ++ added)) XS.put (ASB (toKeep ++ added))