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をコンパイルしてくれないのは何か理由があるんでしょうか・・・)