Это продолжение этого вопроса.
Пытаясь выяснить, сколько у меня физических мониторов, я придумал
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
который отлично работал.
Я предполагаю, что допустил некоторую ошибку в своем понимании ввода-вывода, а не сам код плохой сам по себе, но я действительно не уверен.