xmobar nie pojawia się na górze stosu okien, gdy uruchamia się xmonad


16

Mam dziwne zachowanie xmobarzaraz po wejściu xmonad. Kiedy i xmonad(z .xinitrc, używam XDM) mój xmobarpojawia się, ale nie jest ani na górze, ani na dole stosu okien . Po uruchomieniu aplikacji (np. Emulatora terminala przez naciśnięcie Mod + Shift + Return) aplikacja wykorzystuje cały ekran, jakby xmobarznajdował się na dole. Następnie naciskam Mod + Bi nic się nie dzieje, gdy naciskam Mod + Bdrugi raz, xmobarjest podnoszony do góry, zmniejszając rozmiar okna aplikacji.

Następnie Mod + Bdziała poprawnie przez pozostałą część xmonadsesji, tj. Obniża / podnosi (ukrywa / pokazuje) xmobar.

Jestem pewien, że coś źle skonfigurowałem. Mój xmonad.hswygląda jak:

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
  ]

Początek mojego .xmobarrcwyglądu wygląda następująco:

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

Wypróbowałem kilka kombinacji:

, lowerOnStart =
, hideOnStart =

(Prawda / prawda, prawda / fałsz, fałsz / prawda i fałsz / fałsz, jak pokazano teraz). Ale zachowanie przed Mod + Bdwukrotnym naciśnięciem nie zmienia się. Wierzę, że mam źle skonfigurowane xmonadw jakiś sposób nie xmobarale to tylko przypuszczenie.

My .xinitrcmoże być pomocne:

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

Odpowiedzi:


24

Dwa miesiące później to rozgryzłem. Problem polega na tym, statusBarże nie rejestruje Hooks.manageDockspoprawnie zdarzeń . Po xmonaduruchomieniu wszystko działa dobrze, ponieważ manageDocksjest w stanie zaktualizować Strutszdarzenie w każdym oknie. Ale w momencie, w którym xmonadzaczyna się wydarzenie, aby pierwsze okna były pełnoekranowe, następuje przed nimi manageDocks. Magowie, którzy jako pierwsi otwierają okno, aby zignorować istnienie xmobar.

manageDocksma procedurę obsługi zdarzeń, która musi być ustawiona jako ostatnia procedura obsługi zdarzeń, dlatego statusBarnie można jej użyć. Zamiast tego, jest konieczne, aby xmonadpołączenia i konfigurować xmobarręcznie za pomocą dynamicLog, manageHook, layoutHooki handleEventHook. Minimalistyczna konfiguracja to:

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

To sprawia, że ​​wszystkie zdarzenia są przetwarzane przez docsEventHooki zapewnia, że ​​wprowadzone zmiany w układzie docsEventHooksą ostatnimi zastosowanymi. Teraz

lowerOnStart = False

(lub True) działa zgodnie z oczekiwaniami we wszystkich przypadkach w ramach xmobarrc.


1
Równie dobrze możesz użyć statusBari po prostu nadpisać, handleEventHook = handleEventHook defaultConfig <+> docksEventHookdopóki pakiet DynamicLog nie zostanie naprawiony.
timakro

2

Porównując twoją konfigurację, do mojej prostszej, która działa poprawnie pod tym względem, widzę jedną różnicę, która może coś zrobić:

ze wszystkich general behaviourdostępnych opcji mam tylko

lowerOnStart = True

i ani jednego hideOnStart, overrideRedirectitp.

Sposób, w jaki dodajesz xmobar, xmonad.hsjest, o ile mogę przeczytać, taki sam jak mój.

W takim przypadku spróbuję zastosować jak najwięcej ustawień domyślnych, np. .xmobarrcZmień nazwę, aby nie została odebrana, i zmień xmonad.hsna np

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

i zobacz, czy to działa. Później dodaj krok po kroku i zobacz, kiedy się zepsuje.


Dzięki, twoja odpowiedź przypomniała mi, że powinienem debugować, zaczynając od pustego xmonad.hs. To sprawiło, że znalazłem rzeczywisty problem :)
grochmal,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.