Как разместить экземпляр 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.

Другие вопросы по тегам