Der Fenstermanager TWM

TWM gehört zu den recht einfachen Fenstermanagern. Im Vergleich zu anderen Desktopumgebungen erscheint die Bedienung hakelig, umständlich und gewöhnungsbedürftig. TWM bringt keine eigenen Panel mit. Mehrere Arbeitsflächen werden nicht unterstützt.

Aber dafür ist TWM selbst anspruchslos. Er funktioniert praktisch immer solange das X Window System läuft, und das macht ihn insbesondere bei dynamischen Distributionen wie Debian Unstable als Rückfallebene für die Systemverwaltung mit grafischen Programmen interessant.

su -
apt update
apt install twm
exit

Es wird empfohlen die mit installierte Konfigurationsdatei anzupassen bzw. neu zu erstellen. Hier ist eine Beispiel-Konfiguration mit Schwerpunkt auf textbasierte Programme und kleine nützliche grafische Apps für die Systemverwaltung.

# ~/.twmrc

NoGrabServer
RestartPreviousState
DecorateTransients
TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"
IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*"
#ClientBorderWidth

Color
{
    BorderColor "slategrey"
    DefaultBackground "rgb:2/a/9"
    DefaultForeground "gray85"
    TitleBackground "rgb:2/a/9"
    TitleForeground "gray85"
    MenuBackground "rgb:2/a/9"
    MenuForeground "gray85"
    MenuBorderColor "slategrey"
    MenuTitleBackground "gray70"
    MenuTitleForeground "rgb:2/a/9"
    IconBackground "rgb:2/a/9"
    IconForeground "gray85"
    IconBorderColor "gray85"
    IconManagerBackground "rgb:2/a/9"
    IconManagerForeground "gray85"
}

#
# Define some useful functions for motion-based actions.
#
MoveDelta 3
Function "move-or-lower" { f.move f.deltastop f.lower }
Function "move-or-raise" { f.move f.deltastop f.raise }
Function "move-or-iconify" { f.move f.deltastop f.iconify }

#
# Set some useful bindings.  Sort of uwm-ish, sort of simple-button-ish
#
Button1 = : root : f.menu "main"
Button3 = : root : f.menu "windowops"

Button1 = m : window|icon : f.function "move-or-lower"
Button2 = m : window|icon : f.iconify
Button3 = m : window|icon : f.function "move-or-raise"

Button1 = : title : f.function "move-or-raise"
Button2 = : title : f.raiselower

Button1 = : icon : f.function "move-or-iconify"
Button2 = : icon : f.iconify

Button1 = : iconmgr : f.iconify
Button2 = : iconmgr : f.iconify

# Haupt-Menüs

menu "main"
{
 "TWM" f.title
 "Xterm" f.exec "xterm -geometry 80x50+0+0 -name login &"
 "Info" f.exec "echo \"$(date +'%A %d.%m.%Y %R')\n$(acpi)\n$(/usr/sbin/iwgetid)\" | \
     xmessage -geometry -1+150 -title Info -timeout 10 -file - &"
 "Lautstärkeregler" f.exec "pavucontrol &"
 "Uhr" f.exec "xclock -geometry 100x100-1+1 &"
 "" f.nop
 "Firefox" f.exec "firefox-esr &"
 "KeePassX" f.exec "keepassx &"
 "Midnight Commander" f.exec "x-terminal-emulator -e \"mc\" &"
 "Synaptic-Paketverwaltung" f.exec "synaptic-pkexec &"
 "Vim" f.exec "x-terminal-emulator -e \"vim\" &"
 "Internet" f.menu "/Internet"
 "System" f.menu "/System"
 "Zubehör" f.menu "/Accessories"
 "" f.nop
 "Fenstermanager" f.menu "/Windowmanager"
 "" f.nop
 "Show Icon Manager" f.showiconmgr
 "Hide Icon Manager" f.hideiconmgr
 "" f.nop
 "Sitzung" f.menu "/Session"
 "Abmelden" f.quit
}

menu "windowops"
{
 "Fenster ..." f.title
 "" f.nop
 "ausblenden" f.iconify
 "einblenden" f.raise
 "Größe ändern" f.resize
 "verkleinern" f.lower
 "verschieben" f.move
 "schließen" f.delete
 "" f.nop
 "Fokus setzen" f.focus
 "Kein Fokus" f.unfocus
 "" f.nop
 "Prozess beenden" f.destroy
}

# Unter-Menüs

menu "/Internet"
{
 "W3M Browser" f.exec "x-terminal-emulator -T \"w3m\" -e sh -c \"/usr/bin/w3m /usr/share/doc/w3m/MANUAL.html\" &"
 "Lynx Browser" f.exec "x-terminal-emulator -T \"Lynx\" -e sh -c \"lynx\" &"
 "Falkon Browser" f.exec "falkon &"
 "Mutt Mail-Client" f.exec "x-terminal-emulator -e \"mutt\" &"
 "Thunderbird Mail" f.exec "thunderbird &"
 "NetworkManager Einstellungen" f.exec "nm-connection-editor &"
}

menu "/System/Daemon"
{
 "Desktop Benachrichtigungen" f.exec "/usr/lib/notification-daemon/notification-daemon &"
 "Desktop Icons" f.exec "idesk &"
 "GNOME Keyring" f.exec "/usr/bin/gnome-keyring-daemon -s &"
 "PolicyKit Auth Agent" f.exec "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1 &"
 "X Screensaver" f.exec "/usr/bin/xscreensaver -no-splash &"
}

menu "/System"
{
 "Dienste starten" f.menu "/System/Daemon"
 "Thunar Dateiverwaltung" f.exec "thunar &"
 "GParted" f.exec "/usr/sbin/gparted &"
 "LightDM" f.exec "lightdm-gtk-greeter-settings-pkexec &"
 "Seahorse Passwörter" f.exec "seahorse &"
 "Rxvt Terminal" f.exec "urxvt &"
 "Xfce Termial" f.exec "xfce4-terminal &"
 "X ScreenSaver Einstellungen" f.exec "/usr/bin/xscreensaver-command -prefs &"
}

menu "/Accessories"
{
 "Bildschirmfoto" f.exec "xfce4-screenshooter &"
 "Brasero CD/DVD Brenner" f.exec "brasero &"
 "Cheese" f.exec "cheese &"
 "XSane" f.exec "xsane &"
 "Rechner" f.exec "xcalc &"
 "X Manpages" f.exec "xman &"
}

menu "/Windowmanager"
{
 "Fluxbox" f.startwm "pkill xclock ; startfluxbox"
 "FVWM" f.startwm "pkill xclock ; fvwm"
 "IceWM" f.startwm "pkill xclock ; icewm-session"
 "Openbox" f.startwm "pkill xclock ; openbox-session"
 "TWM" f.restart
}

menu "/Session"
{
 "Herunterfahren" f.exec "/sbin/shutdown -h now &"
 "Neustart" f.exec "/sbin/shutdown -r now &"
 "Sperren" f.exec "/usr/bin/xscreensaver-command -lock &"
 "Abmelden" f.quit
}

# Ende Menüs

Zum Öffnen des Hauptmenüs die Maus auf einen freien Bereich bewegen und die linke Maustaste gedrückt halten. Zum Öffnen eines Untermenüs die Maus innerhalb des Menüeintrags nach rechts bewegen. Loslassen der linken Maustaste ruft den angewählten Menüeintrag auf. Der obere Teil des Menüs enthält an Panels anderer Desktopumgebungen angelehnte Einträge. Unter „System - Dienste starten“ lassen sich bei Bedarf Dienste starten, die sonst normalerweise von einem Session-Manager automatisch gestartet würden. Auch der Wechsel zu einem anderen Fenstermanager wurde berücksichtigt.

Die mangelnde Unterstützung mehrerer Arbeitsflächen lässt sich mit dem folgenden Programm wett machen.

Die Anwendung ist einfach: Auf eine freie Textkonsole wechseln, als (möglicherweise wieder gleicher) Benutzer anmelden, und das Programm starten.

#!/usr/bin/sh
#
# ~/.local/bin/starttwm

TTYnr=$(tty | awk -F "y" -- '{ print($2) }')

cat> ~/.xinitrc$TTYnr <<"EOF"
setxkbmap -model evdev -layout de
/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1 &
xclock -geometry 100x100-1+1 &
~/.fehbg
twm
EOF

startx ~/.xinitrc$TTYnr -- ":$TTYnr"

rm ~/.xinitrc$TTYnr

Es wurden bewusst Unix-Werkzeuge verwendet um das Programm auch für andere Shells portabel zu halten.

Die erste Zeile mit dem AWK-Programm ermittelt aus der angemeldeten Textkonsole /dev/tty1/dev/tty6 die Nummer 1 … 6. Das Programm cat legt temporär eine Textdatei ~/.xinitrc1~/.xinitrc6 an. Dieses wird dann von startx mit Display-Nr. :1:6 aufgerufen.

Dieses Programm funktioniert natürlich auch mit anderen Fenstermanagern. Für produktiveres Arbeiten mit einem Fenstermanager ohne eigenes Panel könnte Openbox besser geeignet sein.

  • rudi/x_twm.txt
  • Zuletzt geändert: 2021/07/11 16:17
  • von Rudi