xmobar no aparece en la parte superior de la pila de la ventana cuando se inicia xmonad

16

Estoy experimentando un comportamiento extraño xmobarjusto después de entrar xmonad. Cuando aparece xmonad(desde .xinitrc, uso XDM) mi xmobarpero no está en la parte superior o inferior de la pila de la ventana . Una vez que inicio una aplicación (p. Ej., Emulador de terminal presionando Mod + Shift + Return), la aplicación usa toda la pantalla, como si xmobarestuviera en la parte inferior. Luego presiono Mod + By no pasa nada, una Mod + Bvez xmobarque presiono se levanta por segunda vez y se reduce el tamaño de la ventana de la aplicación.

Después de eso Mod + Bfunciona correctamente durante el resto de la xmonadsesión, es decir, baja / sube (oculta / muestra) el xmobar.

Estoy seguro de que configuré mal algo. Mi se xmonad.hsparece a:

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
  ]

Mientras que el comienzo de mi .xmobarrcapariencia es la siguiente:

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

Probé varias combinaciones de:

, lowerOnStart =
, hideOnStart =

(Verdadero / verdadero, verdadero / falso, falso / verdadero y falso / falso como se muestra ahora). Pero el comportamiento antes de presionar Mod + Bdos veces no cambia. Creo que he configurado mal xmonadde alguna manera, xmobarpero eso es solo una suposición.

Mi .xinitrcpodría ser de ayuda:

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

Respuestas:

24

Dos meses después lo descubrí. El problema es que statusBarno registra los eventos de forma Hooks.manageDocksadecuada. Una vez que se xmonadestá ejecutando, todo funciona bien porque manageDockspuede actualizar el Strutsevento en cada ventana. Pero en el momento en que xmonadse inicia el evento de hacer que las primeras ventanas en pantalla completa ocurran antes de los eventos manageDocks. Esto maga esa primera ventana abierta para ignorar la existencia de xmobar.

manageDockstiene su controlador de eventos que debe establecerse como el último controlador de eventos, por statusBarlo tanto, no se puede usar. En su lugar, es necesario hacer xmonadla llamada y configurar xmobarmanualmente a través de dynamicLog, manageHook, layoutHooky handleEventHook. Una configuración minimalista para esto sería:

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

Esto hace que todos los eventos sean procesados ​​por docsEventHooky garantiza que los cambios de diseño realizados por docsEventHooksean los últimos aplicados. Ahora

lowerOnStart = False

(o True) funciona como se espera en todos los casos dentro xmobarrc.

grochmal
fuente
1
También puede usar statusBary sobrescribir handleEventHook = handleEventHook defaultConfig <+> docksEventHookhasta que se repare el paquete DynamicLog.
timakro
2

Al comparar su configuración con la más simple, que funciona correctamente a este respecto, veo una diferencia que podría hacer algo:

de todas las general behaviouropciones que tienes solo tengo

lowerOnStart = True

y ni uno solo hideOnStart, overrideRedirectetc.

La forma en que agrega xmobar xmonad.hses, hasta donde puedo leer, la misma que la mía.

En este caso, trataría con la mayor cantidad de configuraciones predeterminadas posibles, por ejemplo, cambiar el nombre .xmobarrcpara que no se seleccione, y cambiar xmonad.hsa, por ejemplo,

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

y ver si funciona. Luego agregue poco a poco y vea cuándo se rompe.

Torinthiel
fuente
Gracias, su respuesta me recordó que debería depurarlo a partir de un vacío xmonad.hs. Eso me hizo encontrar el problema real :)
grochmal