2011-04-09 34 views
2

這是跟進到this question
在追求試圖找到我多少物理監測員,我想出了XMobar由於我的Xmonad配置中的問題而死亡,與IO相關

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的理解發生了一些錯誤,而不是代碼本身本身就是壞的,但我真的不確定。

回答

3

我懷疑你想要使用map show [0 .. n-1]而不是map show [0 .. n]。我還建議你在main中產生xmobar實例,而不是在logHook中,因爲後者會在每次執行任何xmonad操作(如更改焦點)時產生xmobar的全新副本。至於screenCount,我可以從IndependentScreens模塊建議countScreens嗎?