2017-10-13 10 views
0

Je cours XMonad sur un ordinateur portable que j'ai parfois, mais pas toujours, un moniteur supplémentaire attaché. Je voudrais détecter le nombre d'écrans dans mon xmonad.hs avoir une instance de XMobar par écran.Comment mettre une instance de XMobar sur chaque écran de XMonad?

J'ai vu this question and answer, mais je n'ai pas vraiment eu la tête autour des transformateurs monad et comment faire usage d'une valeur de type X [Rectangle].

En ce moment, j'ai, à peu près, ceci:

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 
      } 
     } 

Naïvement, j'aimerais mettre rects <- xdisplays au début de mon bloc do, puis frayer xmobar cas de façon appropriée, mais évidemment, cela ne fonctionne pas travailler parce que le type est X [Rectangle] pas IO [Rectangle]. Je me demandais si je devais utiliser runX en quelque sorte?

Répondre

1

Utilisez le startupHook pour exécuter une action X à chaque invocation de xmonad. Par exemple,

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

Vous aimerez également countScreens si tout ce que vous souciez réellement est de savoir comment le nombre d'écrans et spawnOnce afin que vous ne recevez pas une copie supplémentaire de xmobar sur chaque redémarrage de xmonad.