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 =

(จริง / จริงจริง / เท็จเท็จ / จริงและเท็จ / เท็จดังที่แสดงในขณะนี้) แต่พฤติกรรมก่อนที่ฉันจะกด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

คำตอบ:


24

สองเดือนต่อมาฉันก็คิดออก ปัญหาคือstatusBarไม่ลงทะเบียนเหตุการณ์Hooks.manageDocksอย่างถูกต้อง เมื่อxmonadใช้งานได้ผลดีเพราะmanageDocksสามารถอัปเดตStrutsในทุกหน้าต่างเหตุการณ์ แต่ในช่วงเวลาที่จะเริ่มต้นในกรณีที่มีการทำครั้งแรกแบบเต็มหน้าจอหน้าต่างที่เกิดขึ้นก่อนเหตุการณ์จากxmonad ผู้วิเศษที่หน้าต่างที่เปิดเป็นครั้งแรกที่จะเพิกเฉยต่อการดำรงอยู่ของmanageDocksxmobar

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ภายใน


1
คุณอาจใช้statusBarและเขียนทับhandleEventHook = handleEventHook defaultConfig <+> docksEventHookจนกว่าแพ็คเกจ DynamicLog จะได้รับการแก้ไข
timakro

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)

และดูว่ามันใช้งานได้หรือไม่ ต่อมาเพิ่มทีละนิดและดูว่ามันแตก


xmonad.hsขอบคุณคำตอบของคุณทำให้ผมนึกถึงว่าผมควรจะแก้ปัญหามันเริ่มต้นจากที่ว่างเปล่า นั่นทำให้ฉันพบปัญหาจริง :)
grochmal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.