xmobar n'apparaît pas en haut de la pile de fenêtres au démarrage de xmonad

16

J'éprouve un comportement étrange xmobarjuste après mon entrée xmonad. Lorsque i xmonad(de .xinitrc, j'utilise XDM) mon xmobarapparaît, mais il n'est ni en haut ni en bas de la pile de fenêtres . Une fois que j'ai démarré une application (par exemple, l'émulateur de terminal en appuyant sur Mod + Shift + Return), l'application utilise tout l'écran, comme si elle xmobarétait en bas. Ensuite, j'appuie sur Mod + Bet rien ne se passe, une fois que j'appuie Mod + Bune deuxième fois xmobarest levé vers le haut réduisant la taille de la fenêtre d'application.

Après cela Mod + Bfonctionne correctement pour le reste de la xmonadsession, c'est-à-dire qu'il abaisse / soulève (masque / affiche) le xmobar.

Je suis confiant d'avoir mal configuré quelque chose. Mes xmonad.hslooks:

import XMonad
import XMonad.Hooks.SetWMName
import XMonad.Hooks.DynamicLog

main = do
  xmonad =<< statusBar "xmobar" myPP toggleStrutsKey defaultConfig
    { terminal           = "urxvt"
    , focusFollowsMouse  = True
    , clickJustFocuses   = False
    , borderWidth        = 1
    , modMask            = mod4Mask
    , workspaces         = myworkspaces
    , normalBorderColor  = "#dddddd"
    , focusedBorderColor = "#00dd00"
    , manageHook         = mymanager
    , startupHook        = setWMName "LG3D"
    }

myPP = xmobarPP { ppOutput          = putStrLn
                , ppCurrent         = xmobarColor "#336433" "" . wrap "[" "]"
                --, ppHiddenNoWindows = xmobarColor "grey" ""
                , ppTitle           = xmobarColor "darkgreen"  "" . shorten 20
                , ppLayout          = shorten 6
                --, ppVisible         = wrap "(" ")"
                , ppUrgent          = xmobarColor "red" "yellow"
                }

toggleStrutsKey XConfig { XMonad.modMask = modMask } = (modMask, xK_b)

myworkspaces = [ "code"
               , "web"
               , "media"
               , "irc"
               , "random"
               , "mail"
               , "docs"
               , "music"
               , "root"
               ]

mymanager = composeAll
  [ className =? "gimp" --> doFloat
  , className =? "vlc"  --> doFloat
  ]

Alors que le début de mes .xmobarrclooks est le suivant:

Config {
  -- appearance
    font =         "xft:Bitstream Vera Sans Mono:size=9:bold:antialias=true"
  , bgColor =      "black"
  , fgColor =      "#646464"
  , position =     Top
  , border =       BottomB
  , borderColor =  "#646464"

  -- layout
  , sepChar =  "%"   -- delineator between plugin names and straight text
  , alignSep = "}{"  -- separator between left-right alignment
  , template = "%battery% | %multicpu% | %coretemp% | %memory% | %dynnetwork% | %StdinReader% }{ %date% || %kbd% "

  -- general behavior
  , lowerOnStart =     False   -- send to bottom of window stack on start
  , hideOnStart =      False   -- start with window unmapped (hidden)
  , allDesktops =      True    -- show on all desktops
  , overrideRedirect = True    -- set the Override Redirect flag (Xlib)
  , pickBroadest =     False   -- choose widest display (multi-monitor)
  , persistent =       True    -- enable/disable hiding (True = disabled)

  -- plugins (i do not use any)

  , commands = [  -- actually several commands are in here
  ]
}

J'ai essayé plusieurs combinaisons de:

, lowerOnStart =
, hideOnStart =

(Vrai / Vrai, Vrai / Faux, Faux / Vrai et Faux / Faux comme indiqué maintenant). Mais le comportement avant d'appuyer Mod + Bdeux fois ne change pas. Je crois que je me suis mal configuré xmonadd'une manière ou d'une autre, xmobarmais ce n'est qu'une supposition.

Mon .xinitrcpourrait être utile:

#!/bin/sh

if test -d /etc/X11/xinit/xinitrc.d
then
    # /etc/X11/xinit/xinitrc.d is actually empty
    for f in /etc/X11/xinit/xinitrc.d/*
    do
        [ -x "$f" ] && source "$f"
    done
    unset f
fi

# uk keyboard
setxkbmap gb

xrdb .Xresources
xscreensaver -no-splash &

# java behaves badly in non-reparenting window managers (e.g. xmonad)
export _JAVA_AWT_WM_NONREPARENTING=1

# set the background (again, because qiv uses a different buffer)
/usr/bin/feh --bg-scale --no-fehbg -z /usr/share/archlinux/wallpaper/a*.jpg

# pulse audio for alsa
then
    /usr/bin/start-pulseaudio-x11
fi

exec xmonad
grochmal
la source

Réponses:

24

Deux mois plus tard, je l'ai compris. Le problème est qu'il statusBarn'enregistre pas Hooks.manageDockscorrectement les événements . Une fois xmonadexécuté, tout fonctionne bien car il manageDocksest capable de mettre à jour l' Strutsévénement à chaque fenêtre. Mais au moment où xmonadcommence l'événement de rendre les premières fenêtres en plein écran se produit avant les événements manageDocks. Cela mage cette première fenêtre ouverte pour ignorer l'existence de xmobar.

manageDocksa son gestionnaire d'événements qui doit être défini comme dernier gestionnaire d'événements, ne statusBarpeut donc pas être utilisé. Au lieu de cela, il est nécessaire de faire xmonadappel et configurer xmobarmanuellement via dynamicLog, manageHook, layoutHooket handleEventHook. Une configuration minimaliste pour cela serait:

main = do
    xmproc <- spawnPipe "xmobar"
    xmonad $ defaultConfig
      { modMask            = mod4Mask
      , manageHook         = manageDocks <+> manageHook defaultConfig
      , layoutHook         = avoidStruts  $ layoutHook defaultConfig
      -- this must be in this order, docksEventHook must be last
      , handleEventHook    = handleEventHook defaultConfig <+> docksEventHook
      , logHook            = dynamicLogWithPP xmobarPP
          { ppOutput          = hPutStrLn xmproc
          , ppTitle           = xmobarColor "darkgreen"  "" . shorten 20
          , ppHiddenNoWindows = xmobarColor "grey" ""
          }
      , startupHook        = setWMName "LG3D"
      } `additionalKeys`
      [ ((mod4Mask, xK_b), sendMessage ToggleStruts) ]

Cela rend tous les événements à traiter docsEventHooket garantit que les modifications de mise en page effectuées par docsEventHooksont les dernières appliquées. Maintenant

lowerOnStart = False

(ou True) fonctionne comme prévu dans tous les cas au sein xmobarrc.

grochmal
la source
1
Vous pouvez également utiliser statusBaret simplement remplacer le handleEventHook = handleEventHook defaultConfig <+> docksEventHookjusqu'à ce que le package DynamicLog soit corrigé.
timakro
2

En comparant votre configuration, à ma plus simple, qui fonctionne correctement à cet égard, je vois une différence qui pourrait faire quelque chose:

de toutes les general behaviouroptions que vous avez, je n'ai que

lowerOnStart = True

et pas un seul hideOnStart, overrideRedirectetc.

La façon dont vous ajoutez xmobar xmonad.hsest, autant que je sache , la même que la mienne.

Dans ce cas, j'essaierais avec autant de paramètres par défaut que possible, par exemple renommer .xmobarrcafin qu'il ne soit pas repris, et changer xmonad.hspar exemple

main = xmonad =<< statusBar "xmobar" xmobarPP toggleStrutsKey defaultConfig
toggleStrutsKey XConfig { XMonad.modMask = modMask } = (modMask, xK_b)

et voyez si cela fonctionne. Plus tard, ajoutez petit à petit et voyez quand il se casse.

Torinthiel
la source
Merci, votre réponse m'a rappelé que je devais le déboguer à partir d'un vide xmonad.hs. Cela m'a fait trouver le vrai problème :)
grochmal