私がXmonadの常用に踏み切れたのは、XmonadがGNOMEと共に違和感無く使えたことによるところが大きいと言えます。
いくらタイル型ウィンドウマネージャが便利といえども、いきなり極端にシンプルな世界に飛び込むことには抵抗を感じる人も多いのではないでしょうか。
既存の環境からゆるやかにタイル型ウィンドウマネージャの導入を進めるには、XmonadとGNOMEの併用が最適です。
gnome-sessionとXmonadの起動
今回は以下の様な環境を構築するまでの手順について紹介します。
GNOME側の設定
まず、gnome-session内で指定されているウィンドウマネージャを確認してみましょう。(gconftool-2はGNOME設定用コマンド)
$ gconftool-2 -g /desktop/gnome/session/required_components/windowmanager
gnome-wm
この設定をgnome-wmからxmonadに変更しておきます。(不具合を避けるために必要とのこと)
$ gconftool-2 -s /desktop/gnome/session/required_components/windowmanager xmonad --type string
また、必須ではありませんが、Nautilusデスクトップを無効化するのが通のようです。
$ gconftool-2 --type boolean --set /apps/nautilus/preferences/show_desktop false
Xmonadセッションの設定
次に、GDMのセッション選択で「Xmonad」を選択した際にgnome-sessionとxmonadを両方起動するよう設定します。
以下のように実行コマンド名部分を独自コマンド名(xmonad.start)に変更する方法で実現できます。
$ sudo vim /usr/share/xsessions/xmonad.desktop
Exec=xmonad.start
xmonad.startというコマンドは元々存在しないので、シェルスクリプトとして作成し、実行可能にします。
$ sudo vim /usr/local/bin/xmonad.start
#!/bin/bash
xrdb -merge .Xresources
export WINDOW_MANAGER="/path/to/xmonad"
exec gnome-session
exec xmonad
$ sudo chmod +x /usr/local/bin/xmonad.start
XmonadのGNOME最適化設定
Xmonad側でもGNOMEに合わせた設定を行います。
以下の設定でGNOMEパネルが正しい位置に配置され、ワークスペース一覧が有効になります。
import XMonad
import XMonad.Config.Gnome
main = xmonad $ gnomeConfig
{ manageHook = manageHook gnomeConfig
, logHook = logHook gnomeConfig
}
xmonad-log-appletの導入
xmobarの場合と異なり、GNOMEパネルでは標準でXmonadのlogHookで指定した情報(ワークスペース名、レイアウト名、ウィンドウタイトルなど)を直接表示することはできません。
そこで、GNOMEアプレットとして作られたxmonad-log-appletを導入することでXmonadの情報表示に対応させます。
xmonad-log-appletはXmonadのlogHookからの情報をDBusを介して受信し、表示する仕組みになっています。
セットアップが少々面倒なので順を追って説明します。(表示例は冒頭スクリーンショットの左下参照)
xmonad-log-appletのインストール
アプレットのコンパイルに必要なパッケージをインストールします。
$ apt-get install libglib2.0-dev libdbus-glib-1 libpanel-applet2-dev
アプレットのソースコードはリポジトリのsnapshotリンクから最新版を取得してください。(1.0.tar.gzは正しく動作しませんでした)
$ wget http://git.uhsure.com/?p=xmonad-log-applet.git;a=snapshot;h=6e0af2378655ee1a2ca4fbdbffbafd56bf320ea3;sf=tgz
$ tar zxvf xmonad-log-applet-6e0af2378655ee1a2ca4fbdbffbafd56bf320ea3.tar.gz
$ cd xmonad-log-applet
$ ./configure
$ make
$ sudo make install
インストールが完了したらGNOMEパネルの右クリックメニュー「パネルに追加」から選べるようになっています。
DBusライブラリのインストール
HaskellのDBusライブラリをインストールするため、ライブラリ管理ツールであるcabal-installをインストールします。
$ apt-get install libghc6-parsec3-dev libghc6-network-dev
$ wget http://hackage.haskell.org/packages/archive/cabal-install/0.6.2/cabal-install-0.6.2.tar.gz
$ tar -zxf cabal-install-0.6.2.tar.gz
$ cd cabal-install-0.6.2
$ ./bootstrap.sh
※"~/.cabal/bin"をPATHに追加してください
$ cabal update
目的のDBusライブラリをインストールします。
$ cabal install dbus
xmonad.hsのlog-applet用設定
アプレット配布ページのxmonad.hsを参考に設定を行いますが、そのままですとsanitize関数で日本語ウィンドウタイルが文字化けしてしまいます。
ふつうのHaskellに掲載されていたescape関数を使って適当に対策してみました。
import Control.OldException
import Control.Monad
import DBus
import DBus.Connection
import DBus.Message
import XMonad
import XMonad.Config.Gnome
import XMonad.Hooks.DynamicLog
getWellKnownName :: Connection -> IO ()
getWellKnownName dbus = tryGetName `catchDyn` (\ (DBus.Error _ _) -> getWellKnownName dbus)
where
tryGetName = do
namereq <- newMethodCall serviceDBus pathDBus interfaceDBus "RequestName"
addArgs namereq [String "org.xmonad.Log", Word32 5]
sendWithReplyAndBlock dbus namereq 0
return ()
main :: IO ()
main = withConnection Session $ \ dbus -> do
putStrLn "Getting well-known name."
getWellKnownName dbus
putStrLn "Got name, starting XMonad."
xmonad $ gnomeConfig {
, logHook = do
logHook gnomeConfig
dynamicLogWithPP $ defaultPP {
ppOutput = \ str -> do
let str' = "<span font=\"UmePlus P Gothic\" weight=\"bold\">" ++ str ++ "</span>"
msg <- newSignal "/org/xmonad/Log" "org.xmonad.Log" "Update"
addArgs msg [String str']
-- If the send fails, ignore it.
send dbus msg 0 `catchDyn` (\ (DBus.Error _name _msg) -> return 0)
return ()
, ppTitle = pangoColor "#003366" . shorten 60 . escape
, ppCurrent = pangoColor "#003366" . wrap "[" "]"
, ppVisible = pangoColor "#006666" . wrap "_" ""
, ppHidden = wrap "" ""
, ppUrgent = pangoColor "red"
}
}
pangoColor :: String -> String -> String
pangoColor fg = wrap left right
where
left = "<span foreground=\"" ++ fg ++ "\">"
right = "</span>"
escape :: String -> String
escape = concatMap escapeChar
escapeChar :: Char -> String
escapeChar '<' = "<"
escapeChar '>' = ">"
escapeChar '&' = "&"
escapeChar '"' = """
escapeChar c = [c]
設定追加してXmonad再起動後、アプレットに正しく情報が表示されれば成功です。
ログアウトに関する注意
なお、gnome-session起動中にmod-shift-qでXmonadを終了した場合、画面はGDMのログイン画面に戻りますが、この時ログインセッション自体は終了していません。(ウィンドウマネージャであるXmonadだけが終了した状態)
正しくGNOMEからログアウトするにはターミナルで以下のコマンドを実行します。
$ gnome-session-save --logout-dialog --gui
おわりに
Xmonadはマウスも普通に使えるので、GNOMEが動いていればウィンドウ管理方法以外は従来の環境となんら変わりません。
タイル型ウィンドウマネージャ、恐るるに足らずです。
次回は、現在の私のxmonad.hsの全容(たいしたものではないですが)と、一部のcontribモジュールについて紹介します。
参考ページ
Xmonad/Using xmonad in Gnome - HaskellWiki
今回の内容はだいたいこのページを元に調べました。
XMonad, Gnome Panel, and xmonad-log-applet
このアプレットが無かったらXmonadを使っていなかったかもしれません。ありがたや。
連載一覧
- タイル型ウィンドウマネージャ awesomeとXmonadの比較
- UbuntuにおけるXmonadのインストールと使い方
- Xmonadの設定 1/3 「基本」編
- Xmonadの設定 2/3 「with GNOME」編
- Xmonadの設定 3/3 「応用」編
追記@2011-03-15
からっぽの日記(2011-02-18) Xmonad + GNOME
当記事を参考に実践していただいた結果を掲載されています。
Comments»
no comments yet