jump to navigation

Xmonadの設定 2/3「with GNOME」編

2010-02-18 00:53 Posted by
nase
in : ソフトウェア
flow2.jpg

私がXmonadの常用に踏み切れたのは、XmonadがGNOMEと共に違和感無く使えたことによるところが大きいと言えます。

いくらタイル型ウィンドウマネージャが便利といえども、いきなり極端にシンプルな世界に飛び込むことには抵抗を感じる人も多いのではないでしょうか。

既存の環境からゆるやかにタイル型ウィンドウマネージャの導入を進めるには、XmonadとGNOMEの併用が最適です。

gnome-sessionとXmonadの起動

今回は以下の様な環境を構築するまでの手順について紹介します。

xmonad_gnome_ss_s.png
Xmonad/GNOME併用環境

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 '<' = "&lt;"
escapeChar '>' = "&gt;"
escapeChar '&' = "&amp;"
escapeChar '"' = "&quot;"
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を使っていなかったかもしれません。ありがたや。

連載一覧

追記@2011-03-15

からっぽの日記(2011-02-18) Xmonad + GNOME
当記事を参考に実践していただいた結果を掲載されています。

Comments»

no comments yet


*Comments and trackbacks will appear after it is approved by the administrator.