Как разместить экземпляр XMobar на каждом экране в XMonad?
Я запускаю XMonad на ноутбуке, к которому иногда, но не всегда, подключается дополнительный монитор. Я хотел бы определить количество экранов в моем xmonad.hs
есть экземпляр XMobar на экран.
Я видел этот вопрос и ответ, но я действительно не разбираюсь в монадных трансформаторах и в том, как использовать значение типа X [Rectangle]
,
Прямо сейчас у меня есть, примерно, это:
import XMonad
import XMonad.Config.Desktop
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import XMonad.Core (X ,withDisplay ,io)
import Graphics.X11.Xinerama (getScreenInfo)
import Graphics.X11.Xlib.Types (Rectangle)
import System.IO
xdisplays :: X [Rectangle]
xdisplays = withDisplay $ io . getScreenInfo
main = do
xmproc <- spawnPipe "/usr/bin/xmobar /home/liam/.xmobarrc"
xmonad $ desktopConfig
{ layoutHook = avoidStruts $ layoutHook defaultConfig,
manageHook = manageHook defaultConfig <+> manageDocks,
logHook = dynamicLogWithPP xmobarPP
{ ppOutput = hPutStrLn xmproc
}
}
Наивно хотелось бы поставить rects <- xdisplays
в начале моего блока do, затем соответствующим образом порождает экземпляры xmobar, но, очевидно, это не работает, потому что тип X [Rectangle]
не IO [Rectangle]
, Я задавался вопросом, нужно ли мне использовать runX как-то?
1 ответ
Использовать startupHook
запустить X
действие при каждом вызове xmonad. Например,
main = xmonad $ desktopConfig
{ startupHook = do
rects <- xdisplays
{- spawn xmobar -}
}
Вам также может понравиться countScreens
если все, что вас на самом деле волнует, это количество экранов и spawnOnce
так что вы не получите дополнительную копию xmobar при каждом перезапуске xmonad.