Это продолжение до этого вопроса .
В попытке выяснить, сколько у меня было физических мониторов, я придумал
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, PipeReader для верхних XMobars (на обоих экранах) на некоторое время просто показывает updating
, а затем исчезает и отказывается возвращаться при перезагрузке. Нижние совершенно счастливы.
Ранее я просто использовал для своего ppOutput:
ppOutput = \x -> hPutStrLn xmobarTopScreen0 x >> hPutStrLn xmobarTopScreen1 x
, который работал отлично.
Я предполагаю, что допустил некоторую ошибку в моем понимании IO, а не в самом коде, который сам по себе плохой, но я действительно не уверен.