xmobar non appare in cima allo stack di finestre all'avvio di xmonad


16

Sto sperimentando uno strano comportamento xmobarsubito dopo l'entrata xmonad. Quando io xmonad(da .xinitrc, io uso XDM) il mio xmobarappare ma non è né in cima né in fondo allo stack di finestre . Una volta avviata un'applicazione (ad es. Emulatore di terminale premendo Mod + Shift + Return) l'applicazione utilizza l'intero schermo, come se xmobarfosse in fondo. Quindi premo Mod + Be non succede nulla, una volta che premo Mod + Buna seconda volta xmobarviene sollevato in alto riducendo la dimensione della finestra dell'applicazione.

Dopodiché Mod + Bfunziona correttamente per il resto della xmonadsessione, ovvero abbassa / alza (nasconde / mostra) il file xmobar.

Sono fiducioso di aver configurato male qualcosa. Il mio xmonad.hsaspetto è:

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
  ]

Mentre l'inizio del mio .xmobarrcaspetto è il seguente:

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

Ho provato diverse combinazioni di:

, lowerOnStart =
, hideOnStart =

(Vero / Vero, Vero / Falso, Falso / Vero e Falso / Falso come mostrato ora). Ma il comportamento prima di premere Mod + Bdue volte non cambia. Credo di aver configurato xmonadin modo errato in qualche modo non xmobarma è solo una supposizione.

Il mio .xinitrcpotrebbe essere di aiuto:

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

Risposte:


24

Due mesi dopo l'ho capito. Il problema è che statusBarnon registra Hooks.manageDockscorrettamente gli eventi . Una volta xmonadeseguito tutto funziona bene perché manageDocksè in grado di aggiornare l' Strutsevento su ogni finestra. Ma nel momento in cui xmonadinizia l'evento di rendere le prime finestre a schermo intero accade prima degli eventi manageDocks. Questo mago apre per prima la finestra per ignorare l'esistenza di xmobar.

manageDocksha il suo gestore eventi che deve essere impostato come ultimo gestore eventi, quindi statusBarnon può essere utilizzato. Invece, è necessario effettuare xmonadchiamate e configurare xmobarmanualmente tramite dynamicLog, manageHook, layoutHooke handleEventHook. Una configurazione minimalista per questo sarebbe:

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

In questo modo tutti gli eventi devono essere elaborati docsEventHooke garantisce che le modifiche al layout apportate docsEventHooksiano le ultime applicate. Adesso

lowerOnStart = False

(o True) funziona come previsto in tutti i casi all'interno xmobarrc.


1
È inoltre possibile utilizzare statusBare sovrascrivere il handleEventHook = handleEventHook defaultConfig <+> docksEventHookfino a quando il pacchetto DynamicLog è stato risolto.
timakro,

2

Confrontando la tua configurazione, con la mia più semplice, che funziona correttamente in questo senso, vedo una differenza che potrebbe fare qualcosa:

da tutte le general behaviouropzioni che ho ho solo

lowerOnStart = True

e non uno solo hideOnStart, overrideRedirectecc.

Il modo in cui aggiungi xmobar xmonad.hsè, per quanto posso leggere, lo stesso del mio.

In questo caso, proverei con il maggior numero possibile di impostazioni predefinite, ad esempio rinominare in .xmobarrcmodo che non venga rilevato e passare xmonad.hsad es

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

e vedere se funziona. Successivamente aggiungi poco a poco e vedi quando si rompe.


Grazie, la tua risposta mi ha ricordato che avrei dovuto eseguire il debug a partire da un vuoto xmonad.hs. Questo mi ha fatto trovare il vero problema :)
grochmal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.