Ein individuelles dmenu erstellen

Das gute dmenu wurde zwar primär für die Verwendung mit dem Fenstermanager dwm entwickelt, es lässt sich aber auch mit anderen kombinieren. Zum ersten Mal habe ich das dieses Jahr bei Crunchbang beobachtet, das auf Debian Squeeze und den Openbox-Fenstermanager setzt.

Doch zuerst einmal, so sieht dmenu für gewöhnlich aus.


Indem man die Anfangsbuchstaben des gesuchten Programms eintippt und das Ganze mit Tab vervollständigt, bewegt man sich in rasender Geschwindigkeit durch alle installierten Anwendungen, die im eigenen $PATH installiert sind. Programme werden danach durch Enter gestartet, fertig. Kein Warten, sehr effizient, Gnome-Do oder gar Unity und die Gnome-Shell werden dadurch zum Ausführen von Programmen überflüssig.

Normalerweise benötige ich bei Openbox und vergleichbaren Fenstermanagern nur das Rechtsklickmenü und ein paar Tastenkürzel. Mit dem Skript dmenu-bind.sh von Gatti Paolo lässt sich aus dmenu aber ganz leicht eine übersichtliche Menüstruktur erstellen.

Der Aufbau ist einfach und leicht nachzuvollziehen. Unter die Menüpunkte wie z.B. web werden der Name des Menüpunkts und der auszuführende Befehl geschrieben.

chromium "chromium"

oder

vim "urxvtcd -e vim"

In dem Menü kann man danach wie gehabt mit den Pfeiltasten und der Enter-Taste navigieren. Das Skript lässt sich z.B. in ~/.config/dmenu/dmenu-bind.sh abspeichern und in ~/.config/openbox/rc.xml oder mit Hilfe von obmenu an eine Taste binden.

<keybind key="A-F3">
  <action name="Execute">
    <startupnotify>
      <enabled>true</enabled>
        <name>dmenu-bind</name>
    </startupnotify>
        <command>~/.config/dmenu/dmenu-bind.sh</command>
  </action>
</keybind>

Das angepasste dmenu kann nun mit Alt+F3 aufgerufen werden.

Das gesamte dmenu-bind.sh Skript sieht so aus.

#!/bin/bash

#       Custom dmenu-bind.sh
#
#       Copyright 2009, Gatti Paolo (lordkrandel at gmail dot com)
#       Distributed as public domain.

#       09.28.2009 -- First release
#       09.29.2009 -- Submenu support added

if [ "$1" == "" ]; then
    title="MainMenu"
    menu=( 
#               labels            commands
#           Main =========================================
                web               "$0 web"
                system            "$0 system"
                tools             "$0 tools"
                settings          "$0 settings"
    )
else
    case $1 in
    web)
        title="web"
        menu=( 
#           Web ==========================================
                firefox           "firefox" 
                lostirc           "lostirc" 
         )
    ;;
    tools)
        title="tools"
        menu=( 
#           Tools ========================================
                gedit             "gedit" 
                geditsudo         "gksudo gedit" 
         )
    ;;
    system)
        title="system"
        menu=( 
#           System =======================================
                home              "pcmanfm" 
                tilda             "tilda" 
                synaptic          "gksudo synaptic" 
         )
    ;;
    settings)
        title="settings"
        menu=( 
#           Settings =====================================
                volume            "$0 volume" 
                dmenu             "gedit $0" 
                obconf            "obconf" 
         )
    ;;
    volume)
        title="Volume"
        menu=( 
#           Volume controls ==============================
                0%                "amixer sset Master 0" 
                50%               "amixer sset Master 50" 
                70%               "amixer sset Master 70" 
                100%              "amixer sset Master 100" 
         )
    ;;

    esac
fi

for (( count = 0 ; count < ${#menu[*]}; count++ )); do

#   build two arrays, one for labels, the other for commands
    temp=${menu[$count]}
    if (( $count < ${#menu[*]}-2 )); then
        temp+="n"
    fi
    if (( "$count" % 2 == "0" )); then
        menu_labels+=$temp
    else
        menu_commands+=$temp
    fi

done

select=`echo -e $menu_labels | dmenu -p $title -nb black -nf white -sb darkblue -sf white`

if [ "$select" != "" ]; then

#   fetch and clean the index of the selected label
    index=`echo -e "${menu_labels[*]}" | grep -xnm1 $select | sed 's/:.*//'`

#   get the command which has the same index
    part=`echo -e ${menu_commands[*]} | head -$index`
    exe=`echo -e "$part" | tail -1`

#   execute
    $exe &
fi

Elitäre Fenstermanager sind vielleicht doch einfacher zu bedienen als gedacht

Das Problem bei kachelnden Fenstermanagern ist, dass sie zum einen mit ihren Namen schon einen sonderbaren Eindruck hervorrufen und sie sich zum anderen selbst als ein Werkzeug für Poweruser oder die technische Elite empfehlen. Was auch immer das genau bedeuten mag.

Ich hatte letztes Jahr Awesome und später auch ratpoison auf dem Portégé 3110CT ausprobiert und an beiden Gefallen gefunden, da sie nach kurzer Eingewöhnungsphase äußerst sparsam mit den begrenzten Ressourcen umgingen und mit Hilfe der voreingestellten Tastenkürzel sich der kleine Laptop auch effizienter bedienen ließ.

Für den Thinkpad 600 habe ich zusätzlich zu all den Konsolenanwendungen neben dem Xorg-Server und Qingy zum Login nun auch DWM, den Dynamic Window Manager, installiert. DWM treibt es zwar mit dem elitären Dünkel, nicht aber mit dem Ressourcenverbrauch auf die Spitze. Im Gegenteil zeigt mir htop an, dass DWM sich gerade einmal mit 0.6% von 128 MB RAM begnügt.

DWM ist deshalb so besonders, da der Fenstermanager in einer einzigen Binärdatei ausgeliefert wird und sich aus nur 2000 Zeilen Code zusammensetzt. Die Konfiguration erfolgt über das Editieren einer Headerdatei der Programmiersprache C, wodurch DWM den Ruf weg hat nur etwas für Profis zu sein. Die Entwickler bringen das so auf den Punkt:

Because dwm is customized through editing its source code, it’s pointless to make binary packages of it. This keeps its userbase small and elitist. No novices asking stupid questions. There are some distributions that provide binary packages though.

Eine dieser Distributionen, die Binärpakete von dwm bereitstellt, heißt natürlich Debian. Für einen Test, ob einem DWM gefällt oder nicht, genügt wie immer:

aptitude install dwm

Bei meiner Konfiguration konnte ich danach im Loginmanager Qingy DWM als neue Session auswählen und landete nur wenige Sekunden später genau dort.

Das Bedienungsprinzip von DWM ist ziemlich einfach und es gibt sogar ein kurzes offizielles Tutorial dazu.

Am oberen Bildschirmrand befindet sich das Panel mit den sogenannten Tags, die sich zwar aus Benutzersicht ähnlich zu Arbeitsflächen verhalten, aber dennoch nicht das Selbe sind. Jede neue Anwendung erscheint zuerst im Master-Fenster und existierende werden nach rechts auf den sogenannten Stack verschoben. Wie der Screenshot zeigt habe ich vier Terminals geöffnet (Shift+ALT+Enter), wovon drei Terminals rechts im Stack angeordnet sind und das Hauptfenster die restliche Hälfte einnimmt.

Mit Hilfe von Alt+j/Alt+k lässt sich der Reihe nach der Fokus auf ein anderes Fenster wechseln. Mit Alt+h/Alt+l lassen sich die Fenster des Stacks horizontal verbreitern oder verkleinern. Zwischen einem ausgewählten Stackfenster und dem Hauptfenster lässt sich mit Alt+Enter wechseln.

DWM bietet standardmäßig drei verschiedene Modi. Alle Fenster werden automatisch im Tiling Modus (Alt+t), also kachelnd, angeordnet. Möchte man ein Fenster im Vollbild betrachten, muss man mit Alt+m in den Monokelmodus wechseln.

Um die Fenster frei zu bewegen und mit der Maus in der Größe anpassen zu können, gibt es den Schwebemodus alias Floating. (Alt+f) Wenn man die Alt-Taste gedrückt hält, kann man mit einem Druck auf die linke Maustaste das Fenster verschieben und mit der rechten Maustaste es vergrößern oder verkleinern.

Warum die Tags sehr nützlich sein können, erkennt man schnell am obigen Bildschirmfoto. So lässt sich zum Beispiel der ausgewählte Browser mit Shift+Alt+3 auf Tag Nr. 3 verschieben und mit Alt+1 und Alt+3 zwischen Tag 1 und 3 wechseln. Doch wenn man sich auf Tag 1 befindet und Tag 3 mit einem Rechtsklick sozusagen „zuschaltet“, erscheinen alle Fenster dieses Tags auch auf dem aktuellen. Da sich DWMs Modi „on-the-fly“ anpassen lassen, kann das Browserfenster dann schwebend über allen anderen positioniert werden.

Noch nützlich zu wissen ist das Kommando Shift+Alt+c, mit dem Fenster und darin laufende Anwendungen beendet werden und Shift+Alt+q, womit man sich von DWM abmeldet und wieder zurück zum Loginmanager gelangt.

Wer nicht alle Applikationen aus einem Terminal ausführen will, sollte sich noch die suckless-tools installieren, in denen sich unter anderem dmenu und slock zum Bildschirm sperren befinden. Dmenu lässt sich dann mit Alt+p aufrufen. Dmenu funktioniert in etwa wie die Gnome-Shell…nur viel, viel effizienter und schneller. 🙂

Ein paar kleine Details möchte ich bei DWM später noch ändern, aber zum schnellen Ausprobieren oder als Lösung für eine leichtgewichtige Desktopumgebung ist das Binärpaket bei Debian schon gut geeignet.