由于我的Xmonad配置中存在与IO相关的问题,XMobar正在死亡

时间:2011-04-09 22:38:03

标签: haskell configuration xmonad

这是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的理解犯了一些错误,而不是代码本身本身不好,但我真的不确定。

1 个答案:

答案 0 :(得分:4)

我怀疑您要使用map show [0 .. n-1]而不是map show [0 .. n]。我还建议您在main而不是logHook中生成xmobar实例,因为后者每次执行任何xmonad操作(如更改焦点)时都会生成xmobar的全新副本。至于screenCount,我可以从IndependentScreens模块推荐countScreens吗?