xmobar wird beim Start von xmonad nicht über dem Fensterstapel angezeigt

16

Ich erlebe ein seltsames Verhalten, xmobargleich nachdem ich eintrete xmonad. Wenn ich xmonad(von .xinitrc, verwende ich XDM), wird mein xmobarangezeigt, aber es befindet sich weder oben noch unten im Fensterstapel . Sobald ich eine Anwendung starte (z. B. Terminalemulator durch Drücken von Mod + Shift + Return), verwendet die Anwendung den gesamten Bildschirm, als wäre xmobarder unten. Dann drücke ich Mod + Bund nichts passiert, sobald ich Mod + Bein zweites Mal drücke, xmobarwird es nach oben gehoben, um die Größe des Anwendungsfensters zu verringern.

Danach Mod + Bfunktioniert es für den Rest der xmonadSitzung korrekt , dh es senkt / erhöht (verbirgt / zeigt) das xmobar.

Ich bin zuversichtlich, dass ich etwas falsch konfiguriert habe. Meine xmonad.hssieht aus wie:

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
  ]

Dabei .xmobarrcsieht mein Anfang wie folgt aus:

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

Ich habe verschiedene Kombinationen ausprobiert:

, lowerOnStart =
, hideOnStart =

(Richtig / Richtig, Richtig / Falsch, Falsch / Richtig und Falsch / Falsch, wie jetzt gezeigt). Aber das Verhalten, bevor ich Mod + Bzweimal drücke, ändert sich nicht. Ich glaube, dass ich irgendwie xmonadnicht falsch konfiguriert habe , xmobaraber das ist nur eine Vermutung.

Meine .xinitrcHilfe könnte sein:

#!/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
quelle

Antworten:

24

Zwei Monate später fand ich es heraus. Das Problem ist, dass statusBardie Ereignisse von nicht Hooks.manageDocksrichtig registriert werden. Sobald xmonadalles läuft, funktioniert es gut, da manageDockses in der Lage ist, das StrutsEreignis bei jedem Fenster zu aktualisieren . Aber in dem Moment, in dem xmonaddas Ereignis gestartet wird, geschieht das Vollbild des ersten Fensters vor dem Ereignis von manageDocks. Dies mag das erste geöffnete Fenster, um die Existenz von zu ignorieren xmobar.

manageDocksDer Ereignishandler, der als letzter Ereignishandler festgelegt werden muss , statusBarkann daher nicht verwendet werden. Stattdessen ist es notwendig zu machen xmonadAnruf und configure xmobarmanuell durch dynamicLog, manageHook, layoutHookund handleEventHook. Eine minimalistische Konfiguration hierfür wäre:

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) ]

Dies docsEventHookbewirkt, dass alle Ereignisse von verarbeitet werden, und stellt sicher, dass die von vorgenommenen docsEventHookLayoutänderungen die letzten sind, die angewendet werden. Jetzt

lowerOnStart = False

(oder True) funktioniert erwartungsgemäß in allen Fällen innerhalb von xmobarrc.

grochmal
quelle
1
Sie können das auch verwenden statusBarund einfach überschreiben, handleEventHook = handleEventHook defaultConfig <+> docksEventHookbis das DynamicLog-Paket repariert ist.
Timakro
2

Wenn ich deine Konfiguration mit meiner einfacheren vergleiche, die in dieser Hinsicht korrekt funktioniert, sehe ich einen Unterschied, der etwas bewirken könnte:

Von all den general behaviourMöglichkeiten, die Sie haben, habe ich nur

lowerOnStart = True

und kein einziger von hideOnStart, overrideRedirectusw.

Die Art und Weise, wie Sie xmobar hinzufügen, ist meines Erachtens xmonad.hsdie gleiche wie meine.

In diesem Fall würde ich versuchen, so viele Standardeinstellungen wie möglich zu verwenden, z. B. umzubenennen, .xmobarrcdamit sie nicht übernommen werden, und xmonad.hszu z

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

und sehen, ob es funktioniert. Fügen Sie später Stück für Stück hinzu und sehen Sie, wann es kaputt geht.

Torinthiel
quelle
Vielen Dank, Ihre Antwort hat mich daran erinnert, dass ich es ausgehend von einem leeren debuggen sollte xmonad.hs. Das hat mich dazu gebracht, das eigentliche Problem zu finden :)
grochmal