xmonad가 시작될 때 xmobar가 창 스택 상단에 나타나지 않습니다.

xmonad가 시작될 때 xmobar가 창 스택 상단에 나타나지 않습니다.

xmobar들어가자마자 이상한 행동이 나타났습니다 xmonad. 내가 xmonad(from .xinitrc, XDM을 사용하면서) xmobar등장하지만창 스택의 상단이나 하단에 있지 않습니다.. 애플리케이션을 실행하자마자(예를 들어 터미널 에뮬레이터를 눌러 Mod + Shift + Return) 애플리케이션은 xmobar하단에 있는 것처럼 전체 화면을 사용합니다. 그런 다음 를 누르면 아무 일도 일어나지 않습니다. 두 번째로 Mod + B누르면 맨 위로 올라가서 응용 프로그램 창의 크기가 줄어듭니다.Mod + Bxmobar

그 후에 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

답변1

두 달 뒤에 나는 그 사실을 깨달았다. 문제는 statusBar이벤트가 올바르게 등록되지 않았다는 것입니다 Hooks.manageDocks. 일단 실행하면 모든 창 이벤트 가 업데이트될 수 있으므로 xmonad모든 것이 잘 작동합니다 . 하지만 처음에는 첫 번째 창을 전체 화면으로 만드는 이벤트가 의 이벤트보다 먼저 발생합니다 . 이로 인해 처음 열린 창이 해당 창의 존재를 무시하게 됩니다 .manageDocksStrutsxmonadmanageDocksxmobar

manageDocks이벤트 핸들러가 있습니다~ 해야 하다마지막 이벤트 핸들러로 설정되어 있으므로 statusBar사용할 수 없습니다. 대신 , , 를 통해 수동으로 xmonad호출하고 구성 해야 합니다. 간단한 구성은 다음과 같습니다.xmobardynamicLogmanageHooklayoutHookhandleEventHook

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.

답변2

귀하의 구성을 저의 더 간단한 구성(이 점에서 잘 작동함)과 비교하여 차이를 만들 수 있는 한 가지 차이점을 발견했습니다.

당신의 모든 선택 중에서 general behaviour나는 오직

lowerOnStart = True

hideOnStart그리고 하나도 없습니다 overrideRedirect.

xmonad.hs내가 아는 한, xmobar를 추가하는 방법은 나와 동일하다.

.xmobarrc이 경우에는 선택되지 않도록 이름을 바꾸는 등 가능한 한 많은 기본 설정을 사용하려고 노력한 다음 예를 들어 xmonad.hs다음과 같이 변경합니다.

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

작동하는지 확인하세요. 나중에 조금씩 추가하여 언제 깨지는지 확인하세요.

관련 정보