如何在XMonad的每个屏幕上放置XMobar的实例?

时间:2017-10-13 18:40:28

标签: haskell xmonad xmobar

我在笔记本电脑上运行XMonad,我有时(但并不总是)附加了一台额外的显示器。我想检测xmonad.hs每个屏幕上有一个XMobar实例的屏幕数。

我见过this question and answer,但我并没有真正了解monad变换器,以及如何使用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]而不是{{1 }}。我想知道我是否需要以某种方式使用runX

1 个答案:

答案 0 :(得分:3)

使用startupHook在每次调用xmonad时运行X操作。例如,

main = xmonad $ desktopConfig
    { startupHook = do
        rects <- xdisplays
        {- spawn xmobar -}
    }

如果您真正关心的是屏幕数量和countScreens,您可能还需要spawnOnce,以便在每次重启xmonad时都不会获得额外的xmobar副本。