web-dev-qa-db-ja.com

xmonadの起動時にxmobarがウィンドウスタックの一番上に表示されない

xmobarと入力した直後にxmonadの奇妙な動作が発生しています。 i xmonad(from .xinitrc、私はXDMを使用)のとき、私のxmobarは表示されますがウィンドウスタックの上部にも下部にもありません。アプリケーション(たとえば、Mod + Shift + Returnを押してターミナルエミュレーター)を起動すると、xmobarが一番下にあるかのように、アプリケーションは画面全体を使用します。次に、Mod + Bを押しても何も起こりません。Mod + Bをもう一度押すと、xmobarが一番上に表示され、アプリケーションウィンドウのサイズが小さくなります。

その後、Mod + Bxmonadセッションの残りの部分で正しく機能します。つまり、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を2回押す前の動作は変わりません。私はxmonadxmobarではなく何らかの方法で誤って設定したと思いますが、それは単なる推測です。

私の.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
17
grochmal

2か月後、私はそれを理解しました。問題は、statusBarHooks.manageDocksのイベントを適切に登録しないことです。 xmonadはすべてのウィンドウイベントでmanageDocksを更新できるため、Strutsが実行されると、すべて正常に動作します。しかし、xmonadが開始している瞬間に、最初のウィンドウをフルスクリーンにするイベントは、manageDocksからのイベントの前に発生します。最初にウィンドウを開いてxmobarの存在を無視するこのメイジ。

manageDocksには、mustを最後のイベントハンドラーとして設定するというイベントハンドラーがあるため、statusBarは使用できません。代わりに、xmonadxmobardynamicLogmanageHookを使用して、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内のすべてのケースで期待どおりに機能します。

26
grochmal

この点で正しく機能する私の単純な構成と構成を比較すると、何かを行う可能性のある1つの違いがあります。

私が持っているすべてのgeneral behaviourオプションから

lowerOnStart = True

hideOnStartoverrideRedirectなどの単一ではありません。

Xmobarをxmonad.hsに追加する方法は、私の知る限り、私のものと同じです。

この場合、できるだけ多くのデフォルト設定で試してみます。 .xmobarrcの名前を変更して、ピックアップされないようにし、xmonad.hsを次のように変更します。

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

それが機能するかどうかを確認します。後で少しずつ追加し、いつ壊れるかを確認します。

2
Torinthiel