xmobar tidak muncul di atas tumpukan jendela saat xmonad dimulai


16

Saya mengalami perilaku aneh xmobarsetelah saya masuk xmonad. Ketika saya xmonad(dari .xinitrc, saya menggunakan XDM) saya xmobarmuncul tetapi tidak baik di bagian atas atau bawah tumpukan jendela . Setelah saya memulai aplikasi (mis. Terminal emulator dengan menekan Mod + Shift + Return) aplikasi menggunakan seluruh layar, seolah-olah xmobarberada di bagian bawah. Lalu saya tekan Mod + Bdan tidak ada yang terjadi, setelah saya menekan Mod + Bkedua kalinya xmobardiangkat ke atas mengurangi ukuran jendela aplikasi.

Setelah itu Mod + Bbekerja dengan benar untuk sisa xmonadsesi, yaitu menurunkan / memunculkan (menyembunyikan / menampilkan) xmobar.

Saya yakin saya salah mengonfigurasi sesuatu. xmonad.hsPenampilan saya seperti:

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
  ]

Sedangkan awal .xmobarrcpenampilan saya sebagai berikut:

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

Saya mencoba beberapa kombinasi:

, lowerOnStart =
, hideOnStart =

(Benar / Benar, Benar / Salah, Salah / Benar dan Salah / Salah seperti yang ditunjukkan sekarang). Tetapi perilaku sebelum saya tekan Mod + Bdua kali tidak berubah. Saya percaya bahwa saya telah salah mengonfigurasi xmonaddalam beberapa cara tidak xmobartapi itu hanya dugaan.

Saya .xinitrcmungkin bisa membantu:

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

Jawaban:


24

Dua bulan kemudian saya menemukan jawabannya. Masalahnya adalah bahwa statusBaracara tidak terdaftar dengan Hooks.manageDocksbenar. Setelah xmonadberjalan semua berfungsi dengan baik karena manageDocksdapat memperbarui acara Strutsdi setiap jendela. Tetapi pada saat itulah xmonaddimulainya acara membuat windows fullscreen pertama terjadi sebelum acara dimulai manageDocks. Ini penyihir yang membuka jendela pertama untuk mengabaikan keberadaan xmobar.

manageDocksmemiliki pengendali event yang harus ditetapkan sebagai pengendali event terakhir, oleh karena itu statusBartidak dapat digunakan. Sebaliknya, perlu untuk membuat xmonadpanggilan dan configure xmobarsecara manual melalui dynamicLog, manageHook, layoutHookdan handleEventHook. Konfigurasi minimalis untuk ini adalah:

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

Ini membuat semua acara diproses oleh docsEventHookdan memastikan bahwa perubahan tata letak yang dibuat docsEventHookadalah yang terakhir diterapkan. Sekarang

lowerOnStart = False

(atau True) berfungsi seperti yang diharapkan dalam semua kasus di dalam xmobarrc.


1
Anda juga dapat menggunakan statusBardan hanya menimpa handleEventHook = handleEventHook defaultConfig <+> docksEventHookpaket DynamicLog diperbaiki.
timakro

2

Membandingkan konfigurasi Anda, dengan konfigurasi saya yang lebih sederhana, yang berfungsi dengan benar dalam hal ini, saya melihat satu perbedaan yang mungkin melakukan sesuatu:

dari semua general behaviouropsi yang Anda miliki saya hanya punya

lowerOnStart = True

dan tidak satu pun hideOnStart, overrideRedirectdll.

Cara Anda menambahkan xmobar xmonad.hsadalah, sejauh yang saya bisa baca, sama seperti saya.

Dalam hal ini saya akan mencoba dengan pengaturan default sebanyak mungkin, mis. .xmobarrcGanti nama sehingga tidak diambil, dan ubah xmonad.hske misalnya

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

dan lihat apakah itu berfungsi. Kemudian tambahkan sedikit demi sedikit, dan lihat kapan rusak.


Terima kasih, jawaban Anda mengingatkan saya bahwa saya harus men-debug mulai dari yang kosong xmonad.hs. Itu membuat saya menemukan masalah sebenarnya :)
grochmal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.