1

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

我已经看过这个问题和答案,但我并没有真正了解 monad 转换器以及如何使用 type 的值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

4

1 回答 1

3

使用对 xmonad 的每次调用startupHook运行一个X操作。例如,

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

countScreens如果您真正关心的只是有多少个屏幕,那么您可能还喜欢spawnOnce这样,这样您就不会在每次重新启动 xmonad 时获得额外的 xmobar 副本。

于 2017-10-13T20:42:02.540 回答