xmobar не отображается поверх стека окон при запуске xmonad

16

Я испытываю странное поведение xmobarсразу после того, как я вхожу xmonad. Когда я xmonad(из .xinitrc, я использую XDM), мое xmobarпоявляется, но это не в верхней или нижней части стека окна . Как только я запускаю приложение (например, эмулятор терминала нажатием Mod + Shift + Return), приложение использует весь экран, как если бы оно xmobarбыло внизу. Затем я нажимаю, Mod + Bи ничего не происходит, как только я нажимаю Mod + Bвторой раз xmobar, поднимается наверх, уменьшая размер окна приложения.

После этого Mod + Bработает корректно до конца xmonadсеанса, то есть он понижает / повышает (скрывает / показывает) xmobar.

Я уверен, что что-то неправильно настроил. Моя xmonad.hsвыглядит так:

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
  ]

Хотя начало моего .xmobarrcвыглядит следующим образом:

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

Я попробовал несколько комбинаций:

, lowerOnStart =
, hideOnStart =

(True / True, True / False, False / True и False / False, как показано сейчас). Но поведение, прежде чем я нажму Mod + Bдва раза, не изменится. Я считаю, что я xmonadкаким-то образом неправильно настроен, xmobarно это только предположение.

Я .xinitrcмогу помочь:

#!/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
источник

Ответы:

24

Через два месяца я понял это. Проблема в том, что statusBarне регистрирует события Hooks.manageDocksдолжным образом. После xmonadзапуска все работает хорошо, потому что manageDocksможет обновлять Strutsкаждое событие окна. Но в тот момент, когда xmonadзапускается событие, создание первого полноэкранного окна происходит до событий из manageDocks. Это открывает первое открытое окно, чтобы игнорировать существование xmobar.

manageDocksимеет свой обработчик событий, который должен быть установлен как последний обработчик событий, поэтому statusBarне может использоваться. Вместо этого необходимо сделать xmonadвызов и настроить xmobarвручную с помощью dynamicLog, manageHook, layoutHookи handleEventHook. Минималистическая конфигурация для этого будет:

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

Это заставляет все события обрабатываться docsEventHookи гарантирует, что сделанные изменения макета docsEventHookприменяются последними. Сейчас

lowerOnStart = False

(или True) работает как положено во всех случаях в течение xmobarrc.

grochmal
источник
1
Вы также можете использовать statusBarи просто перезаписать, handleEventHook = handleEventHook defaultConfig <+> docksEventHookпока пакет DynamicLog не будет исправлен.
Тимакро
2

Сравнивая ваш конфиг с моим более простым, который работает правильно в этом отношении, я вижу одно отличие, которое может что-то сделать:

из всех general behaviourимеющихся у меня вариантов есть только

lowerOnStart = True

и ни одного из hideOnStartи overrideRedirectт. д.

Способ, которым вы добавляете xmobar xmonad.hs, насколько я могу прочитать, такой же, как и мой.

В этом случае я бы попытался использовать как можно больше настроек по умолчанию, например, переименовать, .xmobarrcчтобы оно не поднялось, и изменить xmonad.hsна

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

и посмотреть, если это работает. Позже добавлю понемногу и посмотрим, когда оно сломается.

Torinthiel
источник
Спасибо, ваш ответ напомнил мне, что я должен отлаживать его, начиная с пустого xmonad.hs. Это заставило меня найти актуальную проблему :)
grochmal