xmobar
と入力した直後にxmonad
の奇妙な動作が発生しています。 i xmonad
(from .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
を2回押す前の動作は変わりません。私は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
2か月後、私はそれを理解しました。問題は、statusBar
がHooks.manageDocks
のイベントを適切に登録しないことです。 xmonad
はすべてのウィンドウイベントでmanageDocks
を更新できるため、Struts
が実行されると、すべて正常に動作します。しかし、xmonad
が開始している瞬間に、最初のウィンドウをフルスクリーンにするイベントは、manageDocks
からのイベントの前に発生します。最初にウィンドウを開いてxmobar
の存在を無視するこのメイジ。
manageDocks
には、mustを最後のイベントハンドラーとして設定するというイベントハンドラーがあるため、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つの違いがあります。
私が持っているすべての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)
それが機能するかどうかを確認します。後で少しずつ追加し、いつ壊れるかを確認します。