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, PipeReader для верхних XMobars (на обоих экранах) просто показывает updating некоторое время, а затем исчезает и отказывается возвращаться при перезагрузке. Нижние вполне довольны.

Раньше я просто использовал для своего ppOutput:

 ppOutput = \x -> hPutStrLn xmobarTopScreen0 x >> hPutStrLn xmobarTopScreen1 x

который отлично работал.

Я предполагаю, что допустил некоторую ошибку в своем понимании ввода-вывода, а не сам код плохой сам по себе, но я действительно не уверен.


person Squidly    schedule 09.04.2011    source источник


Ответы (1)


Я подозреваю, что вы хотите использовать map show [0 .. n-1], а не map show [0 .. n]. Я также предлагаю вам создавать экземпляры xmobar в main, а не в logHook, так как последний будет создавать новые копии xmobar каждый раз, когда вы выполняете какое-либо действие xmonad (например, изменение фокуса). Что касается screenCount, могу ли я предложить countScreens из модуля IndependentScreens?

person Daniel Wagner    schedule 09.06.2011