xmobar không xuất hiện trên đầu ngăn xếp cửa sổ khi xmonad bắt đầu


16

Tôi đang trải qua một hành vi kỳ lạ xmobarngay sau khi tôi bước vào xmonad. Khi tôi xmonad(từ .xinitrc, tôi sử dụng XDM) xmobarxuất hiện nhưng nó không ở trên cùng hoặc dưới cùng của ngăn xếp cửa sổ . Khi tôi khởi động một ứng dụng (ví dụ: trình giả lập thiết bị đầu cuối bằng cách nhấn Mod + Shift + Return), ứng dụng sẽ sử dụng toàn bộ màn hình, như thể xmobarnó ở phía dưới. Sau đó tôi nhấn Mod + Bvà không có gì xảy ra, một khi tôi nhấn Mod + Blần thứ hai xmobarđược nâng lên trên cùng làm giảm kích thước cửa sổ ứng dụng.

Sau đó, Mod + Bhoạt động chính xác cho phần còn lại của xmonadphiên, tức là nó giảm / tăng (ẩn / hiển thị) xmobar.

Tôi tự tin rằng tôi đã cấu hình sai một cái gì đó. Hình của tôi xmonad.hsnhư:

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
  ]

Trong khi bắt đầu .xmobarrcngoại hình của tôi như sau:

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

Tôi đã thử một số kết hợp:

, lowerOnStart =
, hideOnStart =

(Đúng / Đúng, Đúng / Sai, Sai / Đúng và Sai / Sai như hiển thị bây giờ). Nhưng hành vi trước khi tôi nhấn Mod + Bhai lần không thay đổi. Tôi tin rằng tôi đã cấu hình sai xmonadtheo một cách nào đó không xmobarnhưng đó chỉ là một phỏng đoán.

Tôi .xinitrccó thể giúp đỡ:

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

Câu trả lời:


24

Hai tháng sau tôi đã hiểu ra. Vấn đề là statusBarkhông đăng ký các sự kiện Hooks.manageDocksđúng. Một khi xmonadđang chạy tất cả hoạt động tốt bởi vì manageDockscó thể cập nhật Strutstrên mọi sự kiện cửa sổ. Nhưng trong thời điểm xmonadbắt đầu sự kiện làm cho toàn màn hình windows đầu tiên xảy ra trước các sự kiện từ đó manageDocks. Pháp sư này mở cửa sổ đầu tiên để bỏ qua sự tồn tại của xmobar.

manageDockscó trình xử lý sự kiện của nó phải được đặt làm trình xử lý sự kiện cuối cùng, do đó statusBarkhông thể được sử dụng. Thay vào đó, nó là cần thiết để làm cho xmonadcuộc gọi và cấu hình xmobarbằng tay thông qua dynamicLog, manageHook, layoutHookhandleEventHook. Một cấu hình tối giản cho điều này sẽ là:

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

Điều này làm cho tất cả các sự kiện được xử lý bởi docsEventHookvà đảm bảo rằng các thay đổi bố cục được thực hiện bởi docsEventHooknhững sự kiện cuối cùng được áp dụng. Hiện nay

lowerOnStart = False

(hoặc True) hoạt động như mong đợi trong mọi trường hợp trong xmobarrc.


1
Bạn cũng có thể sử dụng statusBarvà chỉ ghi đè lên handleEventHook = handleEventHook defaultConfig <+> docksEventHookcho đến khi gói DynamicLog được sửa.
timakro

2

So sánh cấu hình của bạn, với cấu hình đơn giản hơn của tôi, hoạt động chính xác trong vấn đề này, tôi thấy một sự khác biệt có thể làm một cái gì đó:

từ tất cả các general behaviourtùy chọn bạn có tôi chỉ có

lowerOnStart = True

và không phải là một đơn hideOnStart, overrideRedirectvv

Cách bạn thêm xmobar vào xmonad.hs, theo như tôi có thể đọc, giống như của tôi.

Trong trường hợp này, tôi sẽ thử với càng nhiều cài đặt mặc định càng tốt, ví dụ như đổi tên .xmobarrcđể nó không được chọn và thay đổi xmonad.hsthành vd

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

và xem nếu nó hoạt động. Sau đó thêm từng chút một, và xem khi nó phá vỡ.


Cảm ơn, câu trả lời của bạn nhắc nhở tôi rằng tôi nên gỡ lỗi nó bắt đầu từ một sản phẩm nào xmonad.hs. Điều đó khiến tôi thấy vấn đề thực tế :)
grochmal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.