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.
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.
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
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.
Moderne Desktop-Umgebungen sind keine Leichtgewichte, aber mit ihnen lassen wir nicht einfach nur Ballast hinter uns:
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? "
PRO
CON
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.
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.
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.")
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.
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 &
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.
!!!!!!!!!!!!! ! .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' ! [...]
Seltsames verschieben/vergroessern von Fenstern: man klickt auf die Statuszeile und dann
Das macht aber Sinn, wenn man sich an Fitt's Law erinnert.
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.
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
Durch den uebersichtlichen Code wuerde dwm Basis fuer weitere WMs: awesome, echinus, scrotwm. Ausserdem hat er folgende Projekte inspiriert:
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:
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)
PRO
CON
Zusammenspiel mit Gnome (EWMH)
Ein Fork von dwm Bedienung analog zu dwm, aber weniger minimalistisch:
Viele Abhaengigkeiten, vergleichsweise hoher Speicherverbrauch
Extensions fuer Firefox:
Oder man nimmt gleich Conkeror, Vimperator oder emacs-w3m.
Fragt sich: auf wieviel "Ubuntu" will man verzichten? Einfache Bedienung bekommt man nur mit einem Gnome-Desktop. Es gibt verschiedene Abstufungen: