我在笔记本电脑上运行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?
答案 0 :(得分:3)
使用startupHook
在每次调用xmonad时运行X
操作。例如,
main = xmonad $ desktopConfig
{ startupHook = do
rects <- xdisplays
{- spawn xmobar -}
}
如果您真正关心的是屏幕数量和countScreens
,您可能还需要spawnOnce
,以便在每次重启xmonad时都不会获得额外的xmobar副本。