2017-10-13 15 views
0

ラップトップでXMonadを実行していますが、必ずしもそうとは限りませんが、追加のモニタが接続されていることがあります。私はxmonad.hsのスクリーンの数をスクリーンごとにXMobarのインスタンスを検出したいと思います。XMonadの各画面にXMobarのインスタンスを配置する方法は?

私はthis question and answerを見てきましたが、私は本当にモナド変圧器の周りに私の頭を持っていませんでしたし、どのタイプX [Rectangle]の値を使用するように。

今、私は、大体、このている:

import XMonad 
import XMonad.Config.Desktop 
import XMonad.Hooks.DynamicLog 
import XMonad.Hooks.ManageDocks 
import XMonad.Util.Run(spawnPipe) 
import XMonad.Core (X ,withDisplay ,io) 
import Graphics.X11.Xinerama (getScreenInfo) 
import Graphics.X11.Xlib.Types (Rectangle) 
import System.IO 

xdisplays :: X [Rectangle] 
xdisplays = withDisplay $ io . getScreenInfo 

main = do 
    xmproc <- spawnPipe "/usr/bin/xmobar /home/liam/.xmobarrc" 
    xmonad $ desktopConfig 
     { layoutHook = avoidStruts $ layoutHook defaultConfig, 
      manageHook = manageHook defaultConfig <+> manageDocks, 
      logHook = dynamicLogWithPP xmobarPP 
      { ppOutput = hPutStrLn xmproc 
      } 
     } 

単純に、私は、私のDOブロックの開始時にrects <- xdisplaysを入れたいのですが、その後、適切xmobarインスタンスを起動が、明らかにこれはしていませんタイプがX [Rectangle]でないためIO [Rectangle]です。どういうわけかrunXを使用する必要があるのだろうかと思いましたか?

答えて

1

xmonadを呼び出すたびにXアクションを実行するには、startupHookを使用します。あなたがxmonadの再起動ごとにxmobarの余分なコピーを取得しないように、あなたが実際に気にすべてがあるどのように多くの画面で、spawnOnceたとえば、

main = xmonad $ desktopConfig 
    { startupHook = do 
     rects <- xdisplays 
     {- spawn xmobar -} 
    } 

はまたcountScreens好むかもしれません。

関連する問題