Fenster steuern von der Shell aus

Veröffentlicht am

Die aktuelle Funktion „Desktop anzeigen“ (über Strg-Alt-D) funktioniert etwas anders, als man das vielleicht erwartet. Die Fenster werden nicht minimiert sondern nur ausgeblendet. Stellt man eines der Fenster dann wieder her, kommt das zwar in den Vordergrund – alle anderen Fenster (die vorher sichtbar waren), werden aber dabei auch wiederhergestellt. In einem Forums-Thread auf ubuntuusers.de wurde genau das bemängelt und nach einer Lösung gesucht, die Fenster stattdessen zu minimieren (die Idee zu diesem Artikel kam über diesen Thread, deshalb wollte ich ihn hier auch nennen).

Eine Lösung dafür bieten eine Hand voll Kommandozeilen-Tools. Welche das sind und wie man sie einsetzen kann, möchte ich in diesem Artikel zeigen. Zudem stelle ich ein Beispiel-Skript vor, das noch einen Schritt weitergeht: es lässt bestimmte Fenster sichtbar…

Tools installieren

Um alle Beispiele ausführen zu können, benötigt ihr drei Pakete, die ihr mit folgenden Befehlen installieren könnt:

sudo apt-get install wmctrl
sudo apt-get install xwit
sudo apt-get install x11-utils

Das zuletzt genannte Paket (das die Tools xprop und xwininfo beinhaltet) sollte ohnehin schon standardmäßig installiert sein.

Ihr braucht außerdem nicht für alle Aufgaben jedes Tool bzw. jedes Paket. Schaut euch einfach die folgenden Beispiele an, entscheidet was ihr davon braucht, und prüft dann welche der Tools ihr dazu installieren müsst.

Interessante Code-Schnipsel

Alle vorhandenen Fenster ermitteln

Das folgende Kommando zeit eine Liste aller gerade vorhandenen Fenster an. Dabei ist es egal, ob die Fenster gerade sichtbar sind oder nicht.

wmctrl -l -x

Das Argument -x kann je nach Bedarf auch weggelassen werden – es sorgt nur dafür, dass erweiterte Informationen pro Fenster ausgegeben werden.

Das aktuelle (fokussierte) Fenster ermitteln

Um das gerade aktive bzw. fokussierte Fenster zu ermitteln, kann man den folgenden Befehl verwenden:

xprop -root|grep _NET_ACTIVE_WINDOW\(WINDOW\)|cut -c41-

Er gibt die ID des aktiven Fensters aus – eine hexadezimale Nummer. Man muss dabei beachten, dass zwischen den Fenster-IDs, wie sie von wmctrl ausgegeben werden ein Unterschied zur hier ausgegebenen ID besteht. Die Stellenanzahl stimmt nicht überein – bei dieser ID hier fehlen führende Nullen (nach dem 0x natürlich).

Status eines Fensters ermitteln

Der Fenster-Status (minimiert oder nicht) wird etwas komplizierter ermittelt.

xwininfo -id $wnd -all | grep -q "Hidden"
if [ $? == 1 ]; then
    echo "NICHT minimiert"
else
    echo "minimiert"
fi

Über das Tool xwininfo werden zunächst alle Informationen zum angegebenen Fenster ausgegeben. Die Ausgabe wird dann per grep nach dem Schlüsselwort Hidden durchsucht. Ist der Text auffindbar, ist das Fenster minimiert.

Alle Fenster minimieren

Um alle Fenster auf einmal zu minimieren, braucht man sich nicht die Mühe machen, zuerst alle Fenster-IDs zu ermitteln. Es genügt das einfache Kommando:

xwit -iconify -all

Ein bestimmtes Fenster minimieren

Ein bestimmtes Fenster lässt sich mit dem selben Tool minimieren – unter Verwendung anderer Argumente:

xwit -iconify -id FENSTERID

Dabei muss FENSTERID natürlich durch die ID des Fensters ersetzt werden.

Ein bestimmtes Fenster wiederherstellen

wmctrl -i -a FENSTERID

Dabei muss FENSTERID natürlich durch die ID des Fensters ersetzt werden.

Ein komplettes Anwendungsbeispiel

Mit Hilfe der o.g. Komponenten habe ich mir ein Skript gebastelt, das verschiedene Fenster-Minimierungs-Funktionen bietet. Ihr könnt das Skript aus dem Download-Bereich hier herunterladen.

Das Shellskript hat drei Funktionen:

  1. Alle Fenster minimieren. Ähnlich der Funktion „Desktop anzeigen“. Allerdings werden die Fenster nacheinander einzeln minimiert und können daher auch einzeln wiederhergestellt werden. Wer Unity verwendet wird vielleicht schon gemerkt haben, dass das bei „Desktop anzeigen“ mittlerweile anders läuft: möchte man ein Fenster wieder holen, werden alle Fenster wiederhergestellt.
    Aufruf:   window_minimizer.sh minimize all
  2. Alle Fenster außer dem gerade fokussierten minimieren.
    Aufruf:   window_minimizer.sh minimize id
  3. Alle Fenster minimieren, die eine andere Klasse als das gerade fokussierte haben. Soll heißen: ist gerade ein Terminal fokussiert, werden alle „Nicht-Terminal-Fenster“ minimiert.
    Aufruf:   window_minimizer.sh minimize class
  4. Minimierte Fenster wiederherstellen. Es werden die Fenster wiederhergestellt, die mit dem letzten Minimieren-Aufruf minimiert wurden.
    Aufruf:   window_minimizer.sh restore

Die verschiedenen Funktionen sollten dann natürlich mit Tastenkombinationen verknüpft werden, weil das Skript sonst nicht sinnvoll gestartet werden kann.

Startet dazu die Anwendung Systemeinstellungen (über diesen Namen im Unity-Dash zu finden). Darin findet ihr ein Icon für das Einstellungs-Fenster Tastatur. Startet das und wechselt darin auf den Reiter Tastaturkürzel.

Auf der linken Seite findet ihr dann ein Abteil namens Eigene Tastenkombinationen. Hier könnt ihr nun einen Befehl einfügen und diesem eine Tastenkombination zuweisen. Achtet darauf, dass ihr keine Doppelbelegung bekommt.

Andere Ideen?

Ich hoffe natürlich, dass euch mein Beispiel-Skript etwas nützlich sein kann. Andererseits würde es mich natürlich auch freuen, wenn ich euch zu eigenen Skript-Ideen anregen konnte.

» Habt ihr denn welche?

» Habt ihr sie vielleicht sogar schon umgesetzt?

Falls ja würde ich mich über ein Kommentar von euch freuen (natürlich auch sonst :) ).


Dieser Artikel wurde in der/den Kategorie(n) Planet-U, Praxis, Programmierung und Skripting veröffentlicht und mit den Tags , , , versehen.

12 Kommentare zu Fenster steuern von der Shell aus

  1. Kommentar von Leszek
    11. Dezember 2011, 12:47 Uhr.

    Mit folgendem kann man das aktuell fokussierte Fenster schließen:
    xprop -root|grep _NET_ACTIVE_WINDOW\(WINDOW\)|cut -c41- | xargs wmctrl -i -r { } -c

    • Kommentar von Gerald
      12. Dezember 2011, 17:48 Uhr.

      Danke dir für deinen Beitrag. Hast du das bei dir mit einer Tastenkombination verknüpft? Falls ja: in welchen Situationen verwendest du das?

  2. Kommentar von Markus
    11. Dezember 2011, 19:14 Uhr.

    Was ich mir schon mal gefragt habe: gibt es eine Möglichkeit den Bildschirm über die Konsole schwarz zu machen und wieder „anzuschalten“?

    Am besten mit einem Dimm-Effekt. Gibt es dafür ein Programm oder eine andere Möglichkeit?

    • Kommentar von Gerald
      12. Dezember 2011, 17:50 Uhr.

      Wüsste jedenfalls nicht, wie man das anstellen könnte. Wofür brauchst du das denn? Vielleicht kann man ja irgendwie den Bildschirmschoner per Tastendruck starten (und den halt entsprechend konfigurieren)?!

  3. Kommentar von Michael
    12. Dezember 2011, 16:59 Uhr.

    Ich sag mal danke zu dem Artikel, kann einige der Sachen demnächst gut brauchen und erspart mir einiges an Suchzeit.

    • Kommentar von Gerald
      12. Dezember 2011, 17:50 Uhr.

      Bitte! :) Und dir schönen Dank für dein Feedback!

  4. Kommentar von Andy Spiegl
    13. Dezember 2011, 17:09 Uhr.

    @Markus:
    Klar geht das, z.B. so:
    xset dpms force on

    • Kommentar von Gerald
      13. Dezember 2011, 17:49 Uhr.

      Cool. Dank für den Hinweis – wenn auch ohne Dimmen :). Aber du meinst wohl xset dpms force off, oder?

  5. Kommentar von clara
    13. Dezember 2011, 20:05 Uhr.

    das aktuelle fenster kann man auch mit alt+f4 schliessen 😉

    • Kommentar von Gerald
      13. Dezember 2011, 20:47 Uhr.

      :) Ich nehme mal an der Kommentar geht @Leszek?! Ja, deshalb macht es ja zumindest wenig Sinn, das auf eine (weitere) Taste zu legen… Darum die Rückfrage, in welchem Zusammenhang er das benutzen würde…

  6. Kommentar von Hoschi
    8. Januar 2012, 11:48 Uhr.

    Ich hab wmctrl benutzt um verschiedene Kombinationen von virtuellen Desktops auf meinen beiden Monitoren anzuzeigen. Ich hab für jedes Thema/Projekt einen Desktop für den linken und den rechten Monitor und will zum Beispiel die Kombination „dashboard – dashboard2″, „movie – dashboard2″ und „dashboard – calendar“ schnell aufrufen können. Danach hab ich dann aber rausgefunden das Xmonad das auch ohne wmctrl kann 😀

    Um mit den Fenstern dann zu interagieren bietet sich übrigens xdotool an oder screen (damit steuer ich zB shell-fm fern) an. Darüber hab ich hier mal kurz geblogt:
    http://vollekannehoschi.wordpress.com/2010/06/26/xdotool-to-automate-your-linux-desktop/

  7. Kommentar von KM
    10. November 2012, 16:28 Uhr.

    Falls ein Programm gestartet ist, anzeigen, falls nicht, starten:

    #!/bin/bash
    x=`wmctrl -l | grep Krusader | wc -l`

    if [ $x -eq 0 ]; then
    nohup /usr/bin/krusader 1>/dev/null 2>/dev/null &
    else
    wmctrl -a Krusader
    fi

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>