这是this question的后续行动 为了试图找到我有多少个物理监视器,我提出了
screenCount :: X Int
screenCount = withDisplay (io.fmap length.getScreenInfo)
makeXMobars :: X [Handle] -- loads two xmobars per screen, one top & one bottom
makeXMobars = screenCount >>= (io.mapM spawnPipe.commandHandles )
where
commandHandles n = map ((\x -> "xmobar -x " ++ x).unwords) $ commandNames n
commandNames n = sequence [map show [0..n], map (\x -> "~/.xmobarrc" ++ x) ["Top", "Bottom"]]
myLogHook :: X ()
myLogHook = do
handles <- makeXMobars
dynamicLogWithPP $ defaultPP
{
ppOutput = \x -> mapM_ (`hPutStrLn` x) handles
}
myLogHook刚刚进入xmonad $ DefaultConfig
。但是,当我加载XMonad时,顶级XMobars的PipeReader(在两个屏幕上)只显示updating
一段时间,然后消失,并在我重新加载时拒绝返回。最底层的人非常高兴。
以前,我只是用于我的ppOutput:
ppOutput = \x -> hPutStrLn xmobarTopScreen0 x >> hPutStrLn xmobarTopScreen1 x
完美无缺。
我认为我对IO的理解犯了一些错误,而不是代码本身本身不好,但我真的不确定。
答案 0 :(得分:4)
我怀疑您要使用map show [0 .. n-1]
而不是map show [0 .. n]
。我还建议您在main
而不是logHook
中生成xmobar实例,因为后者每次执行任何xmonad操作(如更改焦点)时都会生成xmobar的全新副本。至于screenCount
,我可以从IndependentScreens
模块推荐countScreens吗?