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
답변
두 달 후 나는 그것을 알아 냈습니다. 문제는 올바르게 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.
답변
이와 관련하여 올바르게 작동하는 더 간단한 구성과 구성을 비교하면 무언가를 할 수있는 한 가지 차이점이 있습니다.
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)
작동하는지 확인하십시오. 나중에 비트 단위로 추가하고 중단되는시기를 확인하십시오.