# [Fensterverwaltung] xmonad installieren

## Knieper

Da sich bei xmonad [1] in letzter Zeit einiges getan hat, habe ich mich als dwm-Nutzer entschieden, doch mal ueber den Tellerrand zu schauen. xmonad reiht sich in die Reihe der kachelnden Fensterverwalter  :Wink:  (tiling window manager, zB. ion [2], wmii [3], dwm [4], larswm [5], stumpw [6]) ein und gehoert somit zur Klasse derer, die den Namen auch verdient haben. Anders, als zB. die Standardvertreter der Bloatdesktops (Gnome, KDE, XFCE) oder zB. Fluxbox, werden Fenster automatisch nach bestimmten Vorlieben angeordnet und der Nutzer muss nicht unnoetigerweise mit der Maus durch die Gegend schubsen.

xmonad wurde in Haskell geschrieben und basiert weitestgehend auf den Ideen von dwm. Durch den hohen Abstraktionsgrad benötigt es allerdings nur ~500 Zeilen Quelltext (Haskell), statt 2000 Zeilen in C, und bietet doch mehr Funktionen und leichtere Anpassungen.

Fuer die, die ihren Basteltrieb an einer vielversprechenden Fensterverwaltung ausleben wollen, hier eine knappe Anleitung. Auf die entspr. Rechte sollte man achten, saemtliche sudos habe ich weggelassen.

Installation

Neben der Versionsverwaltung Darcs [7]:

```

emerge darcs

```

benötigt man auch noch layman [8], um auf das Haskell-Overlay [9] zugreifen zu koennen:

```

emerge layman

layman -a haskell

```

Nach dem Hinzufuegen folgender Zeilen zur /etc/make.conf:

```

PORTDIR_OVERLAY="/usr/portage/local/layman/haskell"

source /usr/portage/local/layman/make.conf

```

hat man das Overlay auch schon konfiguriert und kann die noetigen use-Flags in der /etc/portage/package.use:

```

x11-wm/xmonad-darcs savedconfig extensions

dev-lang/ghc binary

```

und die noetigen keywords in der /etc/portage/package.keywords setzen:

```

dev-haskell/cabal ~x86

dev-haskell/mtl ~x86

dev-haskell/x11 ~x86

dev-haskell/x11-extras-darcs ~x86

dev-lang/ghc ~x86

x11-wm/xmonad-darcs ~x86

```

Das binary-use-flag bei ghc verhindert das elende Kompilieren und "elend" trifft's beim ghc wirklich. "extensions" sorgt dafuer, dass man auch mit den optionalen Erweiterungen [11] spielen kann.

Da wir oben das use-Flag savedconfig gewaehlt haben, bricht die Installation von xmonad-darcs:

```

emerge xmonad-darcs

env-update && source /etc/profile

```

wahrscheinlich ab. Allerdings liegen jetzt die Quelltexte auf dem Rechner und man kann die individuelle Konfiguration durchfuehren. Ob man die "Konfigurationsdatei" von der Netzseite holt, aus dem darcs-Verzeichnis oder aus dem tmp-Verzeichnis ist dabei egal:

```

cd /etc/portage/

mkdir -p savedconfig/x11-wm/

cd savedconfig/x11-wm/

cp /var/tmp/portage/x11-wm/xmonad-darcs-0/work/xmonad-darcs-0/Config.hs xmonad-darcs-0

nano xmonad-darcs-0

```

Ein moeglicher Diff zur Originaldatei koennte wie folgt aussehen:

```

/etc/portage/savedconfig/x11-wm>diff xmonad-darcs-0.org xmonad-darcs-0

29a30

> import XMonadContrib.DynamicLog

44c45

< modMask = mod1Mask

---

> modMask = mod4Mask

55c56

< defaultGaps = [(0,0,0,0)] -- 15 for default dzen

---

> defaultGaps = [(15,0,0,0)] -- 15 for default dzen

97c98

<      ratio   = 1%2

---

>      ratio   = 9%13

109c110,111

< logHook = return ()

---

> logHook = dynamicLog

> -- logHook = return ()

111d112

< -- |

120,122c121,127

<     [ ((modMask .|. shiftMask, xK_Return), spawn "xterm") -- @@ Launch an xterm

<     , ((modMask,               xK_p     ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") -- @

@ Launch dmenu

<     , ((modMask .|. shiftMask, xK_p     ), spawn "gmrun") -- @@ Launch gmrun

---

>     [ ((modMask .|. shiftMask, xK_Return), spawn "xterm +sb -e zsh") -- @@ Launch an xterm

>     -- , ((modMask,               xK_p     ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") -

- @@ Launch dmenu

>     , ((modMask,               xK_e     ), spawn "claws-mail") -- @@ Launch claws-mail

>     , ((modMask,               xK_f     ), spawn "gftp") -- @@ Launch gftp

>     , ((modMask,               xK_g     ), spawn "gqview") -- @@ Launch gqview

>     , ((modMask,               xK_o     ), spawn "opera") -- @@ Launch opera

>     , ((modMask,               xK_v     ), spawn "gvim") -- @@ Launch gvim

165,168c170,173

<     ++

<     [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust f)

<         | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]

<         , (f, m) <- [(view, 0), (shift, shiftMask)]]

---

>     -- ++

>     -- [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust f)

>     --     | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]

>     --     , (f, m) <- [(view, 0), (shift, shiftMask)]]

```

Jetzt noch kompilieren:

```

emerge xmonad-darcs

```

dzen [10] installieren

Wie man oben an zB. folgender Zeile sehen kann,

```

import XMonadContrib.DynamicLog

```

nutze ich hier die logHooks mit dem dynamischen Logger, der einfache (oder auch komplexe) Statusmeldungen ausgibt. Damit die auch angezeigt werden, habe ich am oberen Rand etwas Platz gelassen:

```

defaultGaps = [(15,0,0,0)] -- 15 for default dzen

```

und werde dort dzen einblenden, das die Nachrichten dann ausgibt.

Da dzen in Portage nicht allzu aktuell ist, habe ich mich entschieden, die subversion-Variante zu nutzen (hier beispielsweise in /opt):

```

emerge subversion

cd /opt

svn checkout http://dzen.googlecode.com/svn/trunk/ dzen

cd dzen

nano confik.mk

make clean install

```

Starten von dzen und xmonad

Um die Ausgaben von xmonad und dzen zu verbinden, kann man folgendes Skript (~/dzen_xmonad.sh) nutzen:

```

#!/bin/sh

FG='white'

BG='steelblue'

FONT='-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*'

# create a pipe for xmonad to talk to

PIPE=$HOME/.xmonad-status

rm -f $PIPE

/usr/bin/mkfifo -m 600 $PIPE

[ -p $PIPE ] || exit

/usr/local/bin/dzen2 -e '' -ta l -fg $FG -bg $BG -fn $FONT < $PIPE &

xmonad-darcs > $PIPE &

wait $!

pkill -HUP dzen2

wait

```

und in der ~/.xinitrc aufrufen:

```

exec ~/dzen_xmonad.sh

```

Als Alternative koennte man zB. auch dmenu [12] nutzen oder es einfach weglassen.

Das Ergebnis

Der Ressourcenverbrauch ist zwar hoeher:

```

dwm:

----

PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

15   0  2636 1196 1008 S  0.0  0.2   0:00.02 dwm

xmonad + dzen:

--------------

PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

21   0  2704 1084  928 S  0.0  0.2   0:00.00 dzen_xmonad.sh

15   0  2548 1004  844 S  0.0  0.2   0:00.00 dzen2

18   0  5428 2528 1700 S  0.0  0.5   0:00.01 xmonad-darcs

```

aber immer noch im akzeptablen Bereich. Die Bedienung ist nicht viel anders als bei dwm, unterscheidet sich aber zB. bei Fokuswechseln oder beim Austausch von Fenstern. Leider funktionierte die Maus nicht optimal. Schaltflaechen musste man zT. zweimal anklicken oder falsche Mauszeiger wurden angezeigt. Vielversprechend sind die vorhanden Moeglichkeiten, zB. den Kachelalgorithmus zu aendern, die Statuszeile beliebig anzupassen oder verschiedene Kachelmechanismen auf versch. Arbeitsoberflaechen zu nutzen.

Viel Spass beim Spielen.

[edit]Ganz vergessen, so sieht's aus: http://img527.imageshack.us/img527/6232/xmonadhh8.jpg[/edit]

[01] http://xmonad.org/

[02] http://modeemi.fi/~tuomov/ion/

[03] http://www.suckless.org/wiki/wmii

[04] http://www.suckless.org/wiki/dwm

[05] http://www.lab1702.net/fnurt/larswm/

[06] http://www.nongnu.org/stumpwm/

[07] http://darcs.net/

[08] http://projects.gunnarwrobel.de/scripts/wiki/layman

[09] http://www.haskell.org/~gentoo/gentoo-haskell/

[10] http://gotmor.googlepages.com/dzen

[11] http://xmonad.org/contrib.html

[12] http://www.suckless.org/wiki/tools/xlib

----------

## wudmx

Hi Knieper,

sehr schöne Anleitung. Habe auch vor kurzem xmonad installiert, allerdings nicht die darcs-Version, sondern xmonad-0.3, welches im September erschienen ist und auch im Haskell Overlay drin ist. 

Hier noch ein paar Anmerkungen meinerseits, die ich bei meiner Installation anders gemacht: 

Anstatt als ersten Schritt darcs über Portage zu installieren, habe ich mir ein vorkompiliertes Binary gezogen und dieses genutzt, bis ghc später über Portage dann installiert worden ist. Vorteil: das langwierige emerge darcs kann man sich sparen, zumal da ein altes ghc (6.4.2 oder so) installiert wird... 

```
wget http://www.pps.jussieu.fr/~jch/software/files/darcs-1.0.7-i386-linux.gz

gunzip darcs-1.0.7-i386-linux.gz

mv darcs-1.0.7-i386-linux /usr/bin/darcs

chmod +x /usr/bin/darcs

```

Nachdem man den Haskell Overlay hinzugefügt hat, sollte man das darcs Binary wieder löschen:

```
rm /usr/bin/darcs
```

Wie gesagt, anstatt die unstable darcs Version habe ich xmonad-0.3 installiert. Hier meine Gentoo-spezifischen Dateien:

/etc/portage/package.use

```
x11-wm/xmonad extensions savedconfig
```

/etc/portage/package.keywords

```
=dev-lang/ghc-6.6.1

dev-haskell/mtl

dev-haskell/regex-base

dev-haskell/regex-compat

dev-haskell/regex-posix

=dev-haskell/cabal-1.1.6.2

dev-haskell/filepath

dev-util/darcs

dev-haskell/quickcheck

dev-haskell/html

net-im/centerim

x11-wm/xmonad

dev-haskell/x11

dev-haskell/x11-extras

x11-misc/dzen

x11-misc/xmobar
```

Es gibt mittlerweile ghc-6.8.0.20070921 im Overlay, man hat mir aber geraten ghc-6.6.1 zu nutzen, deshalb =dev-lang/ghc-6.6.1 .

Ansonsten bleibt noch zu sagen, dass ich wohl xmonad so installieren werde, wie es auf der xmonad Homepage beschrieben ist: ich finde es persönlich komisch und nicht gerade nützlich, wenn die Konfigurationseinstellungen in /etc/portage/savedconfig/... liegen. Die Konfigurationsdateien sollten im Home-Verzeichnis eines jeden Users liegen.

Gruß

wudmx

P.S.: @moderator: wäre schön, wenn man Kniepers HowTo in den sticky Thread eintragen würde!

----------

