XMobar умирает из-за проблемы в моей конфигурации Xmonad, связанной с IO - PullRequest
2 голосов
/ 10 апреля 2011

Это продолжение до этого вопроса .
В попытке выяснить, сколько у меня было физических мониторов, я придумал

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, а не в самом коде, который сам по себе плохой, но я действительно не уверен.

1 Ответ

4 голосов
/ 10 июня 2011

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

...