Alternative Fensterverwaltung unter Linux

Ich gehöre zu denen, die die Feststelltaste so einstellen, dass sie das Layout wechselt, weil ich zu faul bin, zwei Tasten zu drücken, wenn ich eine drücken kann. Ich hätte sogar gerne zwei unnötige Tasten: Eine würde ich zum Einschalten des englischen Layouts und die zweite für Russisch verwenden. Die zweite unnötige Taste ist jedoch der Aufruf des Kontextmenüs, das so unnötig ist, dass viele Laptop-Hersteller darauf verzichten. Man muss also mit dem zufrieden sein, was man hat.

Und ich möchte auch nicht nach ihren Symbolen in der Taskleiste suchen, wenn ich zwischen Fenstern wechsle, oder die Namen beim Scrollen auffangen Alt + Tab, durch Desktops scrollen usw. Ich möchte eine Tastenkombination drücken (idealerweise nur eine, aber es gibt keine freien unnötigen Tasten mehr) und sofort zu dem Fenster gelangen, das ich brauche. Zum Beispiel so:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privates Surfen)
  • Alt+T: Terminal
  • Alt+M: Rechner
  • Alt+E: IntelliJ-Idee
  • usw.

Darüber hinaus, indem Sie beispielsweise auf drücken Alt + M Ich möchte den Rechner sehen, unabhängig davon, ob dieses Programm gerade läuft. Wenn es ausgeführt wird, muss sein Fenster den Fokus erhalten. Wenn nicht, führen Sie das gewünschte Programm aus und übertragen Sie den Fokus, wenn es geladen wird.

Für Fälle, die im vorherigen Skript nicht abgedeckt sind, möchte ich universelle Tastenkombinationen haben, die sich problemlos jedem der geöffneten Fenster zuweisen lassen. Ich habe zum Beispiel 10 Kombinationen aus zugewiesen Alt + 1 auf Alt + 0, die an keine Programme gebunden sind. Ich kann einfach klicken Alt + 1 und das Fenster, das gerade im Fokus ist, wird fokussiert, wenn darauf geklickt wird Alt + 1.

Unterhalb des Ausschnitts finden Sie eine Beschreibung einiger weiterer Funktionen und eine Antwort, wie dies bewerkstelligt werden kann. Aber ich möchte Sie sofort warnen, dass eine solche Anpassung „für Sie selbst“ zu schwerer Abhängigkeit und sogar zum Entzug führen kann, wenn Sie Windows, Mac OS oder sogar den Computer einer anderen Person mit Linux verwenden müssen.

Wenn Sie darüber nachdenken, verwenden wir tatsächlich nicht so viele Programme täglich. Ein Browser, ein Terminal, eine IDE, eine Art Messenger, ein Dateimanager, ein Taschenrechner und vielleicht ist das fast alles. Für 95 % der alltäglichen Aufgaben sind nicht viele Tastenkombinationen erforderlich.

Bei Programmen mit mehreren geöffneten Fenstern kann eines davon als Hauptfenster festgelegt werden. Beispielsweise sind mehrere IntelliJ Idea-Fenster geöffnet und zugewiesen Alt + E. Unter normalen Bedingungen, wenn Sie drücken Alt + E Es öffnet sich ein Fenster dieses Programms, höchstwahrscheinlich das, das zuerst geöffnet wurde. Wenn Sie jedoch auf klicken Alt + E Wenn eines der Fenster dieses Programms bereits im Fokus ist, wird dieses bestimmte Fenster als Hauptfenster zugewiesen und erhält den Fokus, wenn nachfolgende Kombinationen gedrückt werden.

Das Hauptfenster kann neu zugewiesen werden. Dazu müssen Sie zunächst die Kombination zurücksetzen und ihr dann ein anderes Fenster als Hauptfenster zuweisen. Um eine Kombination zurückzusetzen, müssen Sie die Kombination selbst drücken und dann eine spezielle Reset-Kombination, der ich sie zugewiesen habe Alt+Rücktaste. Dadurch wird ein Skript aufgerufen, das die Zuweisung des Hauptfensters für die vorherige Kombination aufhebt. Und dann können Sie wie im vorherigen Absatz beschrieben ein neues Hauptfenster zuweisen. Das Zurücksetzen eines verknüpften Fensters auf universelle Kombinationen erfolgt auf die gleiche Weise.

Die Einführung erwies sich als langwierig, aber ich wollte zunächst erklären, was wir tun werden, und dann erklären, wie es geht.

Für diejenigen, die das Lesen satt haben

Kurz gesagt, der Link zu den Skripten befindet sich am Ende des Artikels.

Sie können es jedoch immer noch nicht sofort installieren und verwenden. Sie müssen zunächst herausfinden, wie das Skript das gewünschte Fenster findet. Ohne dies ist es nicht möglich, dem Skript mitzuteilen, wohin genau der Fokus verschoben werden muss. Und Sie müssen verstehen, was zu tun ist, wenn plötzlich kein passendes Fenster gefunden wird.

Und ich werde mich nicht darauf konzentrieren, wie man die Ausführung von Skripten durch Drücken von Tastenkombinationen konfiguriert. In KDE befindet es sich beispielsweise unter Systemeinstellungen → Verknüpfungen → Benutzerdefinierte Verknüpfungen. Dies sollte auch bei anderen Fenstermanagern der Fall sein.

Wir stellen wmctrl vor

Wmctrl — Konsolendienstprogramm für die Interaktion mit X Window Manager. Dies ist das Schlüsselprogramm für das Skript. Werfen wir einen kurzen Blick darauf, wie Sie es verwenden können.

Lassen Sie uns zunächst eine Liste der geöffneten Fenster anzeigen:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

Option -l zeigt eine Liste aller geöffneten Fenster an und -x hängt den Klassennamen an die Ausgabe an (Skype Skype, Navigator.Firefox usw). Hier benötigen wir die Fenster-ID (Spalte 1), den Klassennamen (Spalte 3) und den Fensternamen (letzte Spalte).

Sie können versuchen, mit der Option ein Fenster zu aktivieren -a:

$ wmctrl -a skype.Skype -x

Wenn alles nach Plan gelaufen ist, sollte das Skype-Fenster auf dem Bildschirm erscheinen. Wenn anstelle der Option -x Option nutzen -i, dann können Sie anstelle des Klassennamens die Fenster-ID angeben. Das Problem mit der ID besteht darin, dass sich die Fenster-ID bei jedem Start der Anwendung ändert und wir sie nicht im Voraus wissen können. Andererseits identifiziert dieses Attribut ein Fenster eindeutig, was wichtig sein kann, wenn eine Anwendung mehr als ein Fenster öffnet. Mehr dazu etwas weiter unten.

In diesem Stadium müssen wir bedenken, dass wir mithilfe der Regex-Ausgabe nach dem gewünschten Fenster suchen wmctrl -lx. Das heißt aber nicht, dass wir etwas Kompliziertes verwenden müssen. Normalerweise reicht der Klassenname oder Fenstername aus.

Grundsätzlich sollte die Grundidee bereits klar sein. Konfigurieren Sie in den globalen Hotkeys/Shortcuts-Einstellungen Ihres Fenstermanagers die erforderliche Kombination zum Ausführen des Skripts.

So verwenden Sie Skripte

Zuerst müssen Sie die Konsolendienstprogramme installieren wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Als nächstes müssen Sie die Skripte herunterladen und hinzufügen $ PATH. Normalerweise stecke ich sie ein ~/bin:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Wenn das Verzeichnis ~/bin nicht vorhanden war, müssen Sie es andernfalls erstellen und neu starten (oder sich erneut anmelden). ~/bin wird nicht treffen $ PATH. Wenn alles richtig gemacht wurde, sollten die Skripte über die Konsole zugänglich sein und die Tab-Vervollständigung sollte funktionieren.

Hauptskript Showwin benötigt zwei Parameter: Der erste ist ein regulärer Ausdruck, mit dem wir nach dem erforderlichen Fenster suchen, und der zweite Parameter ist ein Befehl, der ausgeführt werden muss, wenn das erforderliche Fenster nicht gefunden wird.

Sie können versuchen, ein Skript auszuführen, zum Beispiel:

$ showwin "Mozilla Firefox$" firefox

Wenn Firefox installiert ist, sollte dessen Fenster den Fokus erhalten. Auch wenn Firefox nicht lief, hätte es starten sollen.

Wenn es funktioniert, können Sie versuchen, die Ausführung von Befehlen für Kombinationen zu konfigurieren. Fügen Sie in den globalen Hotkeys/Shortcuts-Einstellungen Folgendes hinzu:

  • Alt+F: showwin „Mozilla Firefox$“ Firefox
  • Alt+D: showwin „Mozilla Firefox (Privates Surfen)$“ „firefox -private-window“
  • Alt+C: showwin „chromium-browser.Chromium-browser N*“ chromium-browser
  • Alt+X: showwin „chromium-browser.Chromium-browser I*“ „chromium-browser -incognito“
  • Alt+S: showwin „skype.Skype“ skypeforlinux
  • Alt+E: showwin „jetbrains-idea“ idea.sh

Usw. Jeder kann Tastenkombinationen und Software so konfigurieren, wie er es für richtig hält.
Wenn alles richtig geklappt hat, können wir mit den oben genannten Kombinationen durch einfaches Drücken der Tasten zwischen den Fenstern wechseln.

Ich werde Chrome-Liebhaber enttäuschen: Es kann ein normales Fenster inkognito anhand seiner Ausgabe unterscheiden wmctrl Das ist nicht möglich, da sie dieselben Klassennamen und Fenstertitel haben. Im vorgeschlagenen Regex werden die Zeichen N* und I* nur benötigt, damit sich diese regulären Ausdrücke voneinander unterscheiden und sie als Hauptfenster zugewiesen werden können.

Um das Hauptfenster der vorherigen Kombination zurückzusetzen (tatsächlich für Regex, was Showwin (das letzte Mal aufgerufen wurde) müssen Sie das Skript aufrufen showwinDetach. Ich habe diesem Skript eine Tastenkombination zugewiesen Alt+Rücktaste.

Beim Drehbuch Showwin Es gibt noch eine weitere Funktion. Wenn es mit einem Parameter aufgerufen wird (in diesem Fall ist der Parameter nur ein Bezeichner), prüft es den regulären Ausdruck überhaupt nicht, sondern betrachtet alle Fenster als geeignet. Das erscheint an sich sinnlos, aber auf diese Weise können wir jedes Fenster als Hauptfenster festlegen und schnell zu diesem bestimmten Fenster wechseln.

Ich habe folgende Kombinationen konfiguriert:

  • Alt+1: showwin „CustomKey1“
  • Alt+2: showwin „CustomKey2“
  • ...
  • Alt+0: showwin „CustomKey0“
  • Alt+Rücktaste: showwinDetach

Auf diese Weise kann ich beliebige Fenster an Kombinationen binden Alt + 1...Alt + 0. Einfach per Klick Alt + 1 Ich binde das aktuelle Fenster an diese Kombination. Durch Anklicken kann ich die Bindung aufheben Alt + 1und Drop Alt+Rücktaste. Oder schließen Sie das Fenster, das funktioniert auch.

Als nächstes werde ich Ihnen einige technische Details erzählen. Sie müssen sie nicht lesen, aber versuchen Sie einfach, sie einzurichten und zu sehen. Aber ich würde trotzdem empfehlen, die Skripte anderer Leute zu verstehen, bevor Sie sie auf Ihrem Computer ausführen :).

So unterscheiden Sie zwischen verschiedenen Fenstern derselben Anwendung

Im Prinzip hat das allererste Beispiel „wmctrl -a skype.Skype -x“ funktioniert und kann verwendet werden. Schauen wir uns aber noch einmal das Beispiel mit Firefox an, bei dem 2 Fenster geöffnet sind:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

Das erste Fenster ist der normale Modus und das zweite ist der private Modus. Ich möchte diese Fenster als unterschiedliche Anwendungen betrachten und mit unterschiedlichen Tastenkombinationen zu ihnen wechseln.

Es ist notwendig, das Skript zum Wechseln der Fenster zu komplizieren. Ich habe diese Lösung verwendet: Zeigen Sie eine Liste aller Fenster an grep von Regex, nimm die erste Zeile mit ganzer, rufen Sie die erste Spalte (dies wird die Fenster-ID sein) mit ab Ausschneiden, wechseln Sie zum Fenster nach ID.

Es sollte einen Witz über reguläre Ausdrücke und zwei Probleme geben, aber tatsächlich verwende ich nichts Kompliziertes. Ich benötige reguläre Ausdrücke, damit ich das Ende der Zeile (das „$“-Symbol) angeben und „Mozilla Firefox$“ von „Mozilla Firefox (Private Browsing)$“ unterscheiden kann.

Der Befehl sieht etwa so aus:

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

Hier können Sie bereits die zweite Funktion des Skripts erraten: Wenn grep nichts zurückgibt, ist die gewünschte Anwendung nicht geöffnet und Sie müssen sie starten, indem Sie den Befehl über den zweiten Parameter ausführen. Überprüfen Sie dann regelmäßig, ob sich das gewünschte Fenster geöffnet hat, um den Fokus darauf zu übertragen. Ich werde mich nicht darauf konzentrieren; jeder, der es braucht, wird sich die Quellen ansehen.

Wenn Anwendungsfenster nicht unterscheidbar sind

Wir haben also gelernt, wie man den Fokus auf das Fenster der gewünschten Anwendung verlagert. Was aber, wenn in einer Anwendung mehr als ein Fenster geöffnet ist? Auf welches soll ich mich konzentrieren? Das obige Skript wird höchstwahrscheinlich auf das erste geöffnete Fenster übertragen. Allerdings wünschen wir uns mehr Flexibilität. Ich würde gerne in der Lage sein, mich daran zu erinnern, welches Fenster wir benötigen, und zu diesem bestimmten Fenster wechseln zu können.

Die Idee war folgende: Wenn wir uns ein bestimmtes Fenster für eine Tastenkombination merken möchten, müssen wir diese Kombination drücken, wenn das gewünschte Fenster im Fokus ist. Wenn Sie in Zukunft diese Kombination drücken, wird der Fokus auf dieses Fenster gelegt. Bis sich das Fenster schließt oder wir einen Reset für diese Skriptkombination durchführen showwinDetach.

Skriptalgorithmus Showwin etwas wie das:

  • Überprüfen Sie, ob wir uns zuvor an die ID des Fensters erinnert haben, auf das der Fokus übertragen werden soll.
    Wenn Sie sich erinnern und ein solches Fenster noch existiert, verschieben wir den Fokus darauf und beenden es.
  • Wir schauen uns an, welches Fenster gerade im Fokus ist, und wenn es unserer Anfrage entspricht, merken wir uns seine ID, um in Zukunft dorthin zu gehen und es zu beenden.
  • Wir gehen zumindest zu einem geeigneten Fenster, falls vorhanden, oder öffnen die gewünschte Anwendung.

Mit dem Konsolendienstprogramm xdotool können Sie herausfinden, welches Fenster gerade im Fokus ist, indem Sie dessen Ausgabe in das Hexadezimalformat konvertieren:

$ printf "0x%08x" `xdotool getwindowfocus`

Der einfachste Weg, sich etwas in der Bash zu merken, besteht darin, Dateien in einem virtuellen Dateisystem im Speicher zu erstellen. In Ubuntu ist dies standardmäßig aktiviert /dev/shm/. Zu anderen Distributionen kann ich nichts sagen, ich hoffe, dass es auch etwas Ähnliches gibt. Sie können mit dem Befehl nachschauen:

$ mount -l | grep tmpfs

Das Skript erstellt in diesem Ordner leere Verzeichnisse, etwa so: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Darüber hinaus wird bei jedem Aufruf ein Symlink erstellt /dev/shm/$USER/showwin/showwin_last auf /dev/shm/$USER/showwin/$SEARCH_REGEX. Dies wird benötigt, um ggf. die Fenster-ID für eine bestimmte Kombination per Skript zu entfernen showwinDetach.

Was kann verbessert werden

Zunächst müssen die Skripte manuell konfiguriert werden. Sicherlich werden viele von Ihnen nicht einmal versuchen, das System zu konfigurieren, weil Sie sich damit befassen und viel mit Ihren Händen tun müssen. Wenn es möglich wäre, das Paket einfach zu installieren und alles einfacher zu konfigurieren, würde es vielleicht an Popularität gewinnen. Und dann würde die Anwendung in Standarddistributionen veröffentlicht.

Und vielleicht geht es auch einfacher. Wenn Sie anhand der ID eines Fensters die ID des Prozesses herausfinden können, der es erstellt hat, und anhand der ID des Prozesses herausfinden können, welcher Befehl es erstellt hat, wäre es möglich, die Einrichtung zu automatisieren. Tatsächlich habe ich nicht verstanden, ob das, was ich in diesem Absatz geschrieben habe, möglich ist. Fakt ist, dass ich persönlich mit der jetzigen Funktionsweise zufrieden bin. Aber wenn jemand anderes als ich den gesamten Ansatz praktisch findet und jemand ihn verbessert, dann werde ich gerne eine bessere Lösung verwenden.

Ein weiteres Problem besteht, wie ich bereits geschrieben habe, darin, dass die Fenster teilweise nicht voneinander zu unterscheiden sind. Bisher habe ich das nur bei Inkognito in Chrom/Chrom beobachtet, aber vielleicht gibt es irgendwo anders etwas Ähnliches. Als letzten Ausweg gibt es immer die Möglichkeit universeller Kombinationen Alt + 1...Alt + 0. Auch hier verwende ich Firefox und für mich persönlich ist dieses Problem nicht von Bedeutung.

Das wesentliche Problem für mich ist jedoch, dass ich beruflich Mac OS verwende und dort so etwas nicht konfigurieren konnte. Dienstprogramm wmctrl Ich glaube, ich konnte es installieren, aber unter Mac OS funktioniert es nicht wirklich. Mit der Bewerbung lässt sich etwas machen Automator, aber es ist so langsam, dass es nicht bequem zu verwenden ist, selbst wenn es funktioniert. Außerdem konnte ich die Tastenkombinationen nicht so einrichten, dass sie in allen Programmen funktionieren. Wenn jemand plötzlich eine Lösung hat, nutze ich sie gerne.

Statt einer Schlussfolgerung

Es stellte sich heraus, dass es für eine so scheinbar einfache Funktionalität unerwartet viele Wörter waren. Ich wollte die Idee vermitteln und den Text nicht überladen, aber ich habe noch nicht herausgefunden, wie ich es einfacher erzählen könnte. Vielleicht wäre es im Videoformat besser, aber so gefällt es den Leuten hier nicht.

Ich habe ein wenig darüber gesprochen, was sich unter der Haube des Skripts verbirgt und wie man es konfiguriert. Ich bin nicht näher auf das Skript selbst eingegangen, aber es umfasst nur 50 Zeilen und ist daher nicht schwer zu verstehen.

Ich hoffe, dass jemand anderes diese Idee ausprobiert und sie vielleicht sogar zu schätzen weiß. Ich kann von mir selbst sagen, dass das Drehbuch vor etwa 3 Jahren geschrieben wurde und es für mich SEHR praktisch ist. So praktisch, dass es bei der Arbeit mit den Computern anderer Leute zu ernsthaften Beschwerden führt. Und mit einem funktionierenden MacBook.

Link zu Skripten

Source: habr.com

Kommentar hinzufügen