2011年07月17日のツイート
20日振りくらいにPCを再起動したら、再起動前にカーネルのアップデートとxorg-serverのアップデートがかかっていたため、ある程度予想通りに苦戦しましたorz
一番苦戦したのは、xorg-sever-1.10.2 で、xv -rootがsegfaultしていたことでした。調べると色んなところで言われている(よう)ですので、これをやらなきゃいい、と・・・おかげで背景がslimの背景画像のままですが。まぁどうせいつもEmacsとかfirefoxとかmltermとかしか表示されていない画面なので。
さて、この過程で何を間違ったか、xmobarが0.13にアップデートされてしまいました。xmobar-0.13は、どうも今迄大活躍してくれていたStdinReaderが使えなくなってしまっており、タイトルを表示した瞬間落ちてしまっておりました。
悩んだ挙句、xmonadを利用する上でのもう一つのデファクトであるdzen2を利用することにしました。ついでに名前だけは聞いたことがあるConkyもついでに。
結論としては、ほぼxmobarで表示していた内容とほぼ同等の内容までいけたのですが、色々ありましたのでログを残しておきます。
やったこと
当方はGentoo + XMonadですので、その前提で記述します。環境としては以下のような形です。
- Xmonad 0.9.2
- dzen 0.8.5
- Conky 1.8.1
まずはdzenとconkyをemerge。
% sudo emerge dzen % sudo emerge conky % emerge -pv conky [ebuild R ] app-admin/conky-1.8.1-r2 USE="X ncurses portmon truetype* -apcupsd -audacious -curl -debug -eve -hddtemp -imlib -iostats -lua -lua-cairo -lua-imlib -math -moc -mpd -nano-syntax -nvidia -rss -thinkpad -vim-syntax -weather-metar -weather-xoap -wifi -xmms2" 0 kB
conkyは色々USEフラグが設定されていますので、利用したい機能に併せて適宜package.useなんかに記述しておくとよろしいかと。色々サンプルを見たところ、曲の内容とかを表示することもできるようですが、ステータスバーに出すにはスペースが足りないような・・・いい方法があるのかもしれません。自分は今現在もmlterm上でmplayerを直接起動している状況だったりしますので、機を見て変えていきたいところ。
閑話休題。
次に、Conkyの設定を作成します。指定しない場合は、~/.conkyrcが利用されるようですが、ここではひとまず以下の内容で ~/.conky_barとしておきます。
background no double_buffer yes own_window no out_to_console yes text_buffer_size 2048 update_interval 1.0 TEXT ^fg(red)Temp: ${hwmon temp 1}C \ ^fg(green)^i(/home/derui/.icons/dzen_bitmaps/cpu.xpm)${cpu cpu1}% \ ^fg(green)^i(/home/derui/.icons/dzen_bitmaps/cpu.xpm)${cpu cpu2}% \ ^fg(green)^i(/home/derui/.icons/dzen_bitmaps/cpu.xpm)${cpu cpu3}% \ ^fg(green)^i(/home/derui/.icons/dzen_bitmaps/cpu.xpm)${cpu cpu4}% \ ^fg(ffffff)Mem:$memperc% \ ^fg(ffffff)^i(/home/derui/.icons/dzen_bitmaps/down.xpm)${downspeedf eth0}KiB \ / ^fg(ffffff)^i(/home/derui/.icons/dzen_bitmaps/up.xpm)${upspeedf eth0}KiB \ ^fg(orange)${time %b %e %H:%M:%S}
ここで表示させようとしているものは以下のものです。
- CPUの温度
- CPUコアの利用状況(1〜4コア)
- メモリの残量
- eth0のdown/up状況。(KiB単位)
- 現在時刻
ちなみにこの設定ファイルでは、ウィンドウは表示されませんが、なんでかルートウィンドウに↑の文字列が出力されます。どうせ隠れるからどうでもいいとは思いますが・・・。
dzen_bitmapsは、portageから入れると取得できないため、ここから取得して展開してください。
後は、dzen2を利用するように、xmonad.hs を書き換えるだけです。とりあえず現状は以下のような形になっています。全体はやたらと長いことになっていますので、とりあえず抜粋ということで・・・。
--{{{ Helper Functions stripIM s = if ("IM " `isPrefixOf` s) then drop (length "IM ") s else s wrapIcon icon = "^p(5)^i(" ++ icons ++ icon ++ ")^p(5)" -- support for per-screen xmobar support -- Some parts of this should be merged into contrib sometime -- 現在のスクリーンの数を取得する。 getScreens :: IO [Int] getScreens = openDisplay "" >>= liftA2 (<*) f closeDisplay where f = fmap (zipWith const [0..]) . getScreenInfo --}}} --{{{ Path variables icons = "/home/derui/.icons/" --}}} main = do myStatusBarPipes <- mapM dzenScreen [1] conkyBar <- spawnPipe myConkyBar xmonad $ defaultConfig { logHook = do mapM (\p -> dynamicLogWithPP $ myDzenPP p) (myStatusBarPipes) -- multiPP' (mergePPOutputs [dynamicLogString]) -- myPP -- myPP { ppTitle = const "" } -- s -- フォーカスの更新の際に、pointerを更新する。 updatePointer (TowardsCentre 0.2 0.2) , modMask = mod4Mask -- Rebind Mod to the Windows key } --{{{ dzen及びconky全体を通して利用するテーマ --Font myFont = "-misc-ipamonagothic-medium-r-normal--16-*-*-*-*-*-iso10646-1" -- Colors --- Main Colours myFgColor = "#DCDCCC" myBgColor = "#3f3f3f" myHighlightedFgColor = myFgColor myHighlightedBgColor = "#7F9F7F" --- Ws Stuff myCurrentWsFgColor = myHighlightedFgColor myCurrentWsBgColor = myHighlightedBgColor myVisibleWsFgColor = myBgColor myVisibleWsBgColor = "#CCDC90" myHiddenWsFgColor = myHighlightedFgColor myHiddenEmptyWsFgColor = "#8F8F8F" myUrgentWsBgColor = "#DCA3A3" myTitleFgColor = myFgColor --- Urgency myUrgencyHintFgColor = "red" myUrgencyHintBgColor = "blue" -- }}} -- Conky Bar myConkyBar = "/usr/bin/conky -c /home/derui/.conky_bar | /usr/bin/dzen2 -x 800 -w 800 -ta r " ++ myDzenGenOpts -- Status Bar myStatusBar = "/usr/bin/dzen2 -w 800 -ta l " ++ myDzenGenOpts myDzenGenOpts = "-fg '" ++ myFgColor ++ "' -bg '" ++ myBgColor ++ "' -h '16'" ++ " -fn '" ++ myFont ++ "'" ---{{{ Dzen Config myDzenPP h = defaultPP { ppOutput = hPutStrLn h, ppSep = (wrapFg myHighlightedBgColor "|"), ppCurrent = wrapFgBg myCurrentWsFgColor myCurrentWsBgColor, ppVisible = wrapFgBg myVisibleWsFgColor myVisibleWsBgColor, ppHidden = wrapFg myHiddenWsFgColor, ppHiddenNoWindows = wrapFg myHiddenEmptyWsFgColor, ppUrgent = wrapBg myUrgentWsBgColor, ppTitle = (\x -> " " ++ wrapFg myTitleFgColor x) -- ppLayout = dzenColor myFgColor "" . -- (\x -> case x of -- "ResizableTall" -> wrapIcon "dzen_bitmaps/tall.xbm" -- "Mirror ResizableTall" -> wrapIcon "dzen_bitmaps/mtall.xbm" -- "Full" -> wrapIcon "dzen_bitmaps/full.xbm" -- ) . stripIM } where wrapFgBg fgColor bgColor content= wrap ("^fg(" ++ fgColor ++ ")^bg(" ++ bgColor ++ ")") "^fg()^bg()" content wrapFg color content = wrap ("^fg(" ++ color ++ ")") "^fg()" content wrapBg color content = wrap ("^bg(" ++ color ++ ")") "^bg()" content -- 各スクリーン毎にdzenを生成する。 dzenScreen :: Int -> IO Handle dzenScreen s = spawnPipe myStatusBar -- ++ " -xs " ++ (show s) --}}}
記述内容を見てもらえばわかるかと思いますが、dzenをスクリーン単位で出そうとして失敗していますorz
どうもxineramaを使っているなら上手くいくようなのですが、私の環境はtwinviewを利用しているため、うまく認識してくれないようです。まぁサブディスプレイは8インチのやつなので、とりあえずいいか、ということでこうしてます。
それと、portageから入れたdzenはxftを表示できないようですので、xlsfontsから好きなものを選ぶ必要があります。自分はIPAモナーゴシックにしています。
ちなみに、上記の設定ですが、このサイトを超参考にしています。というか90%コピペです。ここのxmonad.hsはかなり高度で使えるものも多いですので、一回見ておくとよろしいかと思います。自分は理解できない部分も多いですが・・・。
久々の環境設定ということで、ログでした。dzenには設定次第で、プログレスバー的なものも表示できるようで、いじりがいがありそうです。
暑いというか熱い夏の一夜、設定を弄ってみてはいかがでしょうか。
(うちのXMonad、C-qを押下してもxmonad.hsをコンパイルしてくれないのは何か理由があるんでしょうか・・・)