2011年4月24日日曜日

ubuntu10.10でのxmonadの設定

xmonadとはタイル型ウィンドウマネージャの一つ。
画面いっぱいにウィンドウを敷き詰めるイメージかな。
キーボードショートカットで配置変更やリサイズなどができる。
他にもawesomeなど色々なタイル型ウィンドウマネージャがあるけど、xmonadは拡張性が高いことが特徴。
特にXineramaに対応しているので、デフォルトでデュアルディスプレイに対応している点が強み。
これがxmonadを選択した決め手となった。

今回、ubuntu10.10にてxmonadを導入したので、そのときのメモ。
ちなみに、Gnomeはないと色々不便なので、Gnomeとxmonadの共存環境にしている。

% sudo apt-get install xmonad

デフォルトウィンドウマネージャはgnome-wmなので、

% gconftool-2 -s /desktop/gnome/session/required_components/windowmanager xmonad --type string

でxmonadに変えておく。
あとは、~/.xmonad以下にあるxmonad.hsを編集して、
~/以下に(ホームディレクトリ以下に).xmonadというディレクトリを作って、そこにxmonad.hsというファイルを作る。

% xmonad --recompile

でリコンパイルしてログインしなおせばOK。

以下はxmonad.hsの一例。
デフォルトではxmonadは縦リサイズに対応してないけど、ゴニョゴニョして対応させてる。
あと、Gnomeとの共存の設定もゴニョゴニョしている。

import XMonad
import XMonad.Config.Gnome
import System.IO
import XMonad.Actions.WithAll
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.LayoutHints
import XMonad.Layout.ResizableTile
import XMonad.Layout.ToggleLayouts
import XMonad.Util.EZConfig (additionalKeys,removeKeys)
import qualified XMonad.StackSet as W

-- define some general settings
-- --------------------------------------------
--myTerminal      = "urxvt"
myModMask       = mod4Mask -- Windows key

-- make layout respect hints, use smart borders and add vertical resize
-- -------------------------------------------------
myLayout = layoutHints $ avoidStruts $ smartBorders $ toggleLayouts Full $ tiled ||| Full
where
tiled = ResizableTall nmaster delta ratio []
nmaster = 1
delta   = 3/100
ratio   = 1/2



-- use the settings
-- ---------------------------------------------------
main = do
xmonad $ withUrgencyHookC NoUrgencyHook urgencyConfig { suppressWhen = Focused } 
  $ gnomeConfig
{ --terminal           = myTerminal
--, borderWidth         = myBorderWidth
--, focusFollowsMouse = False
modMask             = myModMask
--, normalBorderColor   = myNormalBorderColor
--, focusedBorderColor = myFocusedBorderColor
--, manageHook = myManageHook
, layoutHook = myLayout
}

-- define keys
-- ---------------------------------------------------
`additionalKeys`
-- lower all floating windows
[
-- additional resize keys for ResizableTile
 ((myModMask , xK_o), sendMessage MirrorShrink )
, ((myModMask , xK_i), sendMessage MirrorExpand )
]