Kachelnde Fenstermanager

Inhaltsverzeichnis

1 Zusammenfassung

Viele Linux-Nutzer arbeiten zum grossen Teil textorientiert und greifen deswegen nicht gern zur Maus. Die ueblichen grafischen Oberflaechen wie Gnome oder KDE lassen sich jedoch nur eingeschraenkt ueber die Tastatur steuern - und in der Tat eignen sich frei bewegliche, ueberlappende Fenster nicht gut fuer die mauslose Bedienung. In diesem Vortrag stelle ich alternative Fenster-Manager vor, die den Bildschirm ueberlappungsfrei ausnutzen, sich komplett ueber die Tastatur bedienen lassen und teilweise extrem konfigurierbar sind.

2 Motivation

Wer primaer mit der Tastatur arbeitet, greift nicht gern zur Maus; vor allem das staendige Wechseln zwischen den beiden Eingabemethoden ist ein Aergernis. Was kann man da tun?

Man kann komplett auf GUI-Anwendungen verzichten und nur noch auf der Konsole und ohne X arbeiten. Fuer die meisten Aufgaben gibt es rein textorientierte Alternativen (CLI oder Text-UI), z.B.

Wenn man ganz auf X verzichtet, ist der der Konsum von visuellen Medien allerdings nur stark eingeschraenkt moeglich:

Wir koennen und wollen also nicht ganz auf X verzichten. Die offene Frage: wie kann ich mauslos effizient mit Fenstern arbeiten? Das Modell mit frei beweglichen, sich ueberlappenden Fenstern kann hier nicht funktionieren.

3 Die Geschichte der Kachel…

3.1 Kachelnde WMs unter X11

  • Siemens RTL WM (1988) (siehe Video)
  • seit 2000 gibt es larswm, ion und ratpoison

4 Was macht ein WM?

Es geht im Prinzip auch ohne, das war in der Anfangszeit von X11 auch so.

Ein WM macht

Ich starte mein X mit der Session "XClient script", und habe in meinem Heimverzeichnis diese .xsession zu liegen:

# US-Layout setzen und "CAPS" zu einer zusaetzlichen "Control"-Taste machen
setxkbmap 'en_US' -option ctrl:nocaps
# setzt den bildschirmhintergrund
qiv --root -m -o '#ffffff' /home/anselm/projects/talks/tiling-wm/ratpoison.png
# gibt die gedrueckten tasten auf dem bildschirm aus
key-status &
# ein Terminal wird gestartet
urxvt
# wenn sich das terminal beendet, dann wartet das skript in einer
# endlosschleife
while true; do
  sleep 60
done

5 Anforderungen

Normale Fenstermanager waelzen das Problem, wie Programmfenster effektiv angeordnet werden sollen, auf den Benutzer ab. Wir wollen einen Fenstermanager, dem wir mit wenigen Kommandos sagen koennen, wo wir unsere Programme haben wollen.

Fuer X11 gibt es einige Fenstermanager, die versuchen, immer den kompletten Bildschirm auszunutzen. Ich stelle euch jetzt einige vor.

5.1 Meine Anforderungen an die Tastenbindungen

  • Moeglichst wenig Ueberschneidungen mit anderen Programmen (z.B. Emacs)
  • Sollten Zehnfinger-freundlich sein, also:
    • keine Funktionstasten, Ziffernblock, "Windows"-Taste.

5.2 Automatische Platzierung von Fenstern:

  • Feinabstimmung mit der Maus entfaellt.
  • Es kann aber auch mal nicht das sein, was man will.
  • Positionierung ist einfach, wenn man sowieso immer im Vollbildmodus arbeitet.
  • Es ist auch nicht schwer, wenn man nur terminal-fenster hat - deren Groesse ist fast egal.
    • Aber: z.B. Man-Pages werden nicht neu formatiert, wenn das Terminal schmaler wird.
    • Curses-Programme brauchen eine Mindestgroesse, um zu funktionieren.
  • Schwierig wird es, wenn ein Programm mehrere Fenster aufmacht, wie z.B. der GIMP.
    • Daher ist es gut, wenn man noch einen "Floating"-Modus hat, fuer alle Faelle.

5.3 Abschied von Gnome und KDE

Moderne Desktop-Umgebungen sind keine Leichtgewichte, aber mit ihnen lassen wir nicht einfach nur Ballast hinter uns:

  • Fuer Laptops ist der NetworkManager schon praktisch,
    • dafuer braucht man aber einen "System Tray", wie ihn das Gnome-Panel bietet
  • Power-, Bluetooth-, Volumemanager, Desktopsuche, Menues, … alles kein Problem, wenn man die noetigen Programme mit Namen kennt.

6 Statische Fenstermanager

6.1 ratpoison

  • ist inspiriert von "screen"
  • ratpoison ist sogar kleiner als "screen"

6.1.1 Demo

  • Hilfefunktion (C-t ?)
  • Zwei Fenster aufmachen (C-t c, C-t !)
  • Splits (C-t s, C-t S, C-t Q)
  • schieben mit (C-t C-Cursortaste)
  • Gimp starten (das geht gar nicht!)
  • Fensterliste (C-t C-w)

Einfache Kommandos koennen ueber Prompt (C-t :) oder Kommandozeile (ratpoison -c) abgesetzt werden.

 C-t : getenv PATH
 ratpoison -c "echo Hallo, liebe Freunde der gepflegten Donnerstagabendunterhaltung"
 ratpoison -c "prompt Na? "

6.1.2 Fazit

PRO

  • wenig Interferenz mit anderen Tastenbindungen

CON

  • kein "floating" Layout (wichtig fuer Gimp, Popups)
  • kein "System Tray", keine Dockapps, keine Statuszeile, kein "Launcher"
  • Splits sind zu kurzlebig
  • Gruppen (Workspaces) sind umstaendlich zu handhaben, das macht es schwierig, viele Fenster sinnvoll anzuordnen.
    • Ein moeglicher Workaround: screen benutzen, Puffer-Verwaltung im Emacs, Tabs in Firefox

Wenn man nur Programme benutzt, die sowieso im Vollbildmodus am besten funktionieren und nicht zu viele Fenster offen hat, kann man mit ratpoison allerdings gut arbeiten.

6.2 Stumpwm

Stumpwm ist der Nachfolger von ratpoison, vom selben Autor.

Stumpwm fuehlt sich ganz aehnlich an, ist aber "hackbarer", da in Common Lisp geschrieben - damit verbraucht er aber auch jede Menge Speicher fuer die Lisp-Umgebung.

6.2.1 Demo

 M-x slime-connect

(in-package :stumpwm)

;; prompt the user for an interactive command. The first arg is an
;; optional initial contents.
(defcommand colon1 (&optional (initial "")) (:rest)
  (let ((cmd (read-one-line (current-screen) ": " initial)))
    (when cmd
      (eval-command cmd t))))

;; Browse somewhere
(define-key *root-map* (kbd "b") "colon1 exec x-www-browser http://www.")

6.3 Ion

Ion ist seit 2000 in der Entwicklung, die aktuelle Version ist ion3. Ion kennt Workspaces, Frames (entstehen durch explizites Splitten) und Tabs. Ein Fenster im Fullscreen-Modus wird wie ein Workspace umgeschaltet, dadurch kann die Nummerierung durcheinander kommen. Man kann ion in Lua konfigurieren und skripten.

6.3.1 Demo

  • Alt-N: Workspace umschalten
  • Alt-Return: Fullscreen umschalten
  • F9 neuer Workspace
  • F2 neue Shell
  • Alt-M: Kontextmenue mit TAB-Vervollstaendigung
  • Alt-F3: Lua-Konsole
  • Alt-K N: Tabs umschalten
  • Alt-S/Alt-K S/X: Frame splitten/loeschen
  • Alt-N/P/TAB/Shift-TAB: zwischen Frames bewegen
  • Alt-C: Fenster schliessen

Nota bene: Splits sind explizit!

Leider gibt es Lizenzprobleme wegen "veralteten" oder gepatchten Versionen, ion ist aus Arch Linux und BSD Ports herausgeflogen. Allerdings kann man sicher viel Spass mit Lua haben. Es gibt keine Unterstuetzung fuer den "system tray", aber fuer WindowMaker Dock-Apps, und so kann man z.B. "stalonetray -w" nutzen.

Um diese Unterstuetztung einzuschalten: Alt-F3 und dann

 dopath("mod_dock")
eingeben. Dann schaltet Alt-D das Dock an oder aus.
 stalonetray -w &
 nm-applet &

7 Dynamische Fenstermanager

7.1 Larswm

  • erste Version von Jun 3, 2000
  • basiert auf Code von 9wm (Unix-Port des Plan9-WMs "8 1/2")
  • inspiriert von Plan9/acme

Larswm unterstuetzt mehrere Bildschirme und virtuelle Desktops. Auf jedem Desktop gibt es zwei "Subdesktops": floating / tiling. Der "tiling subdesktop" hat zwei Spalten oder "Tracks".

Nur ausgewaehlte Programmfenster werden "gekachelt" ("Whitelisting") bzw. kann man explizit umschalten mit Alt-Shift-SPACE.

  • Konfiguration ueber eine Datei im Xresources-Format file:/home/anselm/.larswmrc]]
    !!!!!!!!!!!!!
    ! .larswmrc !
    !!!!!!!!!!!!!
    
    ! These are the windows I want tiled
    !
    larswm.dotileclass.0: XTerm~xterm
    larswm.dotileclass.1: navigator:browser~Mozilla
    larswm.dotileclass.2: Mozilla-bin
    larswm.dotileclass.3: URxvt~urxvt
    larswm.dotileclass.4: Emacs~emacs
    
    ! Some tool windows
    !
    larswm.toolclass.0: XLoad~xload
    larswm.toolclass.1: XBiff~xbiff
    larswm.toolclass.2: XClock~xclock
    
    ! Windows that should always stay above other windows
    !
    larswm.floatclass.0: XCalc~xcalc
    larswm.floatclass.1: Gaim
    larswm.floatclass.2: larsmenu~larsmenu
    
    ! Windows that should be visible on all virtual desktops
    !
    larswm.stickyclass.0: larsmenu~larsmenu
    
    ! Assign all new web browser windows to the WWW desktop
    !
    larswm.dtclass.0: navigator:browser~Mozilla
    larswm.dtnum.0: 1
    larswm.dtclass.1: Mozilla-bin
    larswm.dtnum.1: 1
    
    ! Use a wider left track on the WWW desktop
    !
    larswm.?.1.left_track_width: 80
    
    ! Do not resize windows on the WWW desktop
    !
    larswm.?.1.tile_resize: False
    
    ! Automatically shift focused window to the left track on WWW desktop
    !
    larswm.?.1.skip_focus: False
    
    ! larswm Menu - Middle Mousebutton
    !
    larswm.button2.application: larsmenu -popup '*  LARSWM  *:exit' 'R E S T A R T:larsremote restart' 'E X I T:larsremote exit' '*  Exit Menu  *:exit'
    
    ! [...]
    
    • etwas umstaendlich und nicht besonders flexibel
    • nicht alles ist konfigurierbar
    • kann aber z.B. unterschiedliche Konfigurationen pro Desktop auswerten
    • Programme koennen virtuellen Desktops zugeordnet werden
  • Statuszeile ist eingebaut
    • setzen des Textes ueber `larsremote message "text"'
    • "larsremote" kann sonst nur noch exit und restart ausloesen

7.1.1 Demo

  • Shift-Ctrl-Return neues terminal
  • Alt-Shift-Space schaltet tiling pro fenster um
  • Ctrl-Shift-left/right workspaces
  • Shift-Ctrl-BS floating/tiling subdesktop

Seltsames verschieben/vergroessern von Fenstern: man klickt auf die Statuszeile und dann

  • Alt-Shift+Click1: verschieben
  • Alt-Ctrl-Shift: vergroessern/verkleinern
  • Ctrl-Shift-Click1: verkleinern
  • Ctrl-Shift-Click3: vergroessern
  • Alt-Shift+Rad: horizontal verschieben
  • Alt-Ctrl-Shift+Rad: vertikal verschieben
  • Ctrl-Shift+Rad: vergroessern/verkleinern

Das macht aber Sinn, wenn man sich an Fitt's Law erinnert.

7.2 wmii

Konfiguration/Interaktion/Fernsteuerung geschieht ueber das 9p-Dateisystem (von plan9 portiert) bzw. wmiir. Jede Programmiersprache kann zur Konfiguration benutzt werden, man bekommt Kontrolle ueber den "event loop" => "wmiirc". "wmiirc" ist standardmaessig ein Shell-Skript (urspruenglich rc), es gibt aber auch eines in Ruby und in Emacs Lisp.

  • Spaltenweises Layout + "floating layer"
  • Spalten: default/max/stacked
  • Vertikale Splits sind explizit, horizontale passieren automatisch
  • Stacked-Layout statt "tabs"
  • "Tags" entsprechen Workspaces, lassen sich aber flexibler verschalten

7.2.1 Demo

  • Alt-Enter neues Terminal
  • Alt-F Fullscreen
  • Alt-s/m/d Spalten-Layouts
  • Alt-Shift-hjkl: Fenster bewegen, neue Spalten werden automatisch erzeugt
  • Alt-hjkl: zwischen Fenstern springen
  • Alt-Shift-space: Kacheln fuer das aktive fenster umschalten

7.3 dwm

dwm ist der "kleine Bruder" von wmii. Das Fenstermodell aehnelt dem von larswm, eine Statuszeile ist eingebaut. Die Konfiguration geschieht direkt ueber C-Headerdatei und anschliessendes neu kompilieren. Das ist sicher und effizient, aber wenn man Binaerpakete nutzt hat man keine Konfigurationsmoeglichkeit mehr. Der Text fuer die Statuszeile wird aus dem Namen des Root-fensters ausgelesen. dwm ist sehr klein, nur 28k als ausfuehrbare Datei mit unter 2000 Zeilen Quellcode. Hier ein Verzeichnislisting mit einem fertig kompilierten dwm:

   -rw-r--r--  1 anselm anselm  5468 2009-03-21 14:59 config.def.h
   -rw-r--r--  1 anselm anselm  5468 2009-03-21 14:59 config.h
   -rw-r--r--  1 anselm anselm   650 2009-03-21 14:59 config.mk
   -rwxr-xr-x  1 anselm anselm 27748 2009-03-21 14:59 dwm
   -rw-r--r--  1 anselm anselm  4663 2009-03-21 14:59 dwm.1
   -rw-r--r--  1 anselm anselm 41576 2009-03-21 14:59 dwm.c
   -rw-r--r--  1 anselm anselm   373 2008-07-17 17:07 dwm.png
   -rw-r--r--  1 anselm anselm  1593 2009-03-21 14:59 LICENSE
   -rw-r--r--  1 anselm anselm  1462 2008-07-17 17:07 Makefile
   -rw-r--r--  1 anselm anselm  1259 2009-03-21 14:59 README

7.3.1 Demo

  • Rechtsklick auf Tags schaltet sie einzeln zu
  • Alt-<N>: zu Tag gehen
  • Alt-Shift-<N>: Tag vergeben
  • Alt-Ctrl-Shift-<N>: Tag umschalten
  • Alt-t/f/m: Tiled/Float/Monocle (fullscreen) Layouts
  • Alt-P: ruft dmenu auf

7.3.2 Forks

Durch den uebersichtlichen Code wuerde dwm Basis fuer weitere WMs: awesome, echinus, scrotwm. Ausserdem hat er folgende Projekte inspiriert:

  • XMonad ist in Haskell geschrieben und bietet viele Erweiterungen.
  • dvtm setzt das Konzept von dwm auf der Konsole um.
  • bug.n ist eine aehnliche Software fuer Windows.

7.4 XMonad

XMonad ist ein Klon von dwm in Haskell. Im Geiste von "dwm" ist die Konfigurationsdatei ebenfalls in Haskell zu schreiben. Neukompilieren geschieht aber "auf Knopfdruck" - man braucht jedoch eine komplette Haskell-Entwicklungsumgebung mit Compiler und den noetigen Bibliotheken. XMonad bietet gute Unterstuetzung fuer Xinerama und EWMH.

XMonad hat keine eigene Statuszeile, dafuer kann man eines dieser Programme benutzen:

  • dzen2
  • xmobar
  • Gnome Panel
  • KDE Kicker

Ein Beispiel fuer eine .xsession-Datei mit dzen2-Konfiguration

xsetroot -solid black
[ -r ~/.$(hostname -s).png ] && qiv -x ~/.$(hostname -s).png
setxkbmap 'en_US,de' -variant ',nodeadkeys' -option ctrl:nocaps -option grp:ctrls_toggle 
export PATH=/var/lib/gems/1.8/bin:${PATH}:${HOME}/.local/bin

mocp_info() {
    if ps -C mocp > /dev/null && mocp -i | grep -q 'State: PLAY'; then
        title=$(mocp -i | grep '^Title: ')
        echo ${title#*: } \|
    fi
}
 
load() {
    while read f s t r; do
        echo $f $s $t
    done < /proc/loadavg
}

disk() {
    df -h / | { \
        read rest
        read mount size used avail rest
        echo $avail/$size
    }
}

cpu_temp() {
  local t=$(cat /sys/class/hwmon/hwmon0/device/temp2_input)
  echo $(expr $t / 1000)"°C"
}

xscreensaver -no-splash &

while true; do
    echo '^fg(#222222)^bg(#eeeeee)' $(mocp_info) $(cpu_temp) \| $(disk) \| $(load) \| $(date '+%Y-%m-%d %a | %R') '^fg()^bg()'
    sleep 5
done | dzen2 -fn fixed -x 600 -w 1080 -ta r -fg '#ffffff' -bg '#006699' -e '' & 

xmonad | dzen2 -fn fixed -w 600 -ta l -fg '#ffffff' -bg '#006699' -e '' 

Zahlreiche Zusatzmodule (XmonadContrib)

  • Actions
  • Prompts
  • Layouts (alles, was die Anordnung von Fenstern bestimmt)
  • Hooks (geben Informationen ueber den Status nach aussen)

PRO

  • hohe Modularitaet, viele Module verfuegbar
  • gute Xinerama-Unterstuetzung, EWMH => man kann Komponenten von Gnome/Ubuntu nutzen
  • Haskell - wenn man Haskell mag, lernen, hacken moechte

CON

  • Haskell - wenn man es nicht mag
  • vergleichsweise grosses Executable (GHC kann noch keine DLLs => 1,8 MB)

7.4.1 Demo

Zusammenspiel mit Gnome (EWMH)

  • arbeitet mit dem Workspace Switcher zusammen
    • ewmhDesktopsLayout (ein LayoutHook) erlaubt das Verschieben von Fenstern im Workspace Switcher
    • EwmhLogHook teilt dem Workspace Switcher die aktuelle Position der Fenster mit
  • laesst automatisch Platz fuer die Task Bar
    • die Task Bar laesst sich auch verschieben
  • mit wmctrl lassen sich EWMH-kompatible WMs skripten
    • z.B. "wmctrl -a emacs"

7.5 awesome

Ein Fork von dwm Bedienung analog zu dwm, aber weniger minimalistisch:

  • implementiert Xinerama, EWMH, System Tray etc.
  • benutzt statt Xlib die modernere libxcb => schneller
  • konfigurierbar in Lua
  • Fernsteuerung mit awesome-control
  • Statuszeile kennt "widgets", Text, Bilder, Tray…

Viele Abhaengigkeiten, vergleichsweise hoher Speicherverbrauch

7.5.1 Demo

  • Bedienung ist wie dwm, nur dass statt der Alt-Taste die Windows-Taste standard ist.
  • Konfiguration zeigen

8 Kleine Hilfsprogramme

Extensions fuer Firefox:

Oder man nimmt gleich Conkeror, Vimperator oder emacs-w3m.

9 Lohnt sich der Aufwand?

Fragt sich: auf wieviel "Ubuntu" will man verzichten? Einfache Bedienung bekommt man nur mit einem Gnome-Desktop. Es gibt verschiedene Abstufungen: