Dois meses depois, descobri. O problema é que statusBar
não registra os eventos de Hooks.manageDocks
corretamente. Quando xmonad
estiver executando todas as obras, porque manageDocks
é capaz de atualizar o Struts
em cada evento de janela. Mas no momento em que xmonad
está iniciando o evento de fazer com que as primeiras janelas fullscreen aconteçam antes dos eventos de manageDocks
. Este magos que primeiro abrir janela para ignorar a existência de xmobar
.
manageDocks
tem seu manipulador de eventos que deve ser definido como o último manipulador de eventos; portanto, statusBar
não pode ser usado. Em vez disso, é necessário fazer xmonad
call e configurar xmobar
manualmente por meio de dynamicLog
, manageHook
, layoutHook
e handleEventHook
. Uma configuração minimalista para isso seria:
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) ]
Isso faz com que todos os eventos sejam processados por docsEventHook
e garante que as alterações de layout feitas por docsEventHook
sejam as últimas aplicadas. Agora
lowerOnStart = False
(ou True
) funciona como esperado em todos os casos dentro de xmobarrc
.