it-swarm.com.de

Warum hebt mein Befehl wmctrl -a mein minimiertes Rhythmbox-Fenster nicht an?

Das Problem

Momentan füge ich ein paar benutzerdefinierte Verknüpfungen hinzu.

Ich kann ein minimiertes Rhythmbox-Fenster nicht anzeigen. Ich verwende wmctrl in einem Shell-Skript (siehe unten) für diese Aufgabe. Wenn ich die Tastenkombination drücke, passiert nichts (visuell). Das Anzeigen von Firefox zum Beispiel mithilfe einer angepassten Version des folgenden Shell-Skripts funktioniert problemlos. warum verhält sich rhythmbox nicht gleich

Said Shell script:

sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"

Wichtige Änderung:

Anscheinend funktioniert mein Skript jetzt - ohne etwas daran geändert zu haben. Ich habe jedoch killall rhythmbox Ausgeführt. Danach funktionierte mein Shell-Skript wie erwartet. Ich denke, indem ich nur das Update hinzufüge, anstatt die Frage zu löschen, kann ich vielleicht jemandem helfen, über dasselbe Problem zu stolpern. Wenn Sie glauben zu wissen, warum dies passiert ist, können Sie uns gerne Ihre Meinung mitteilen.

Noch eine Änderung:

Wow, okay ... Sekunden nach dem Hinzufügen der letzten Änderung habe ich versucht, die Verknüpfung erneut zu verwenden, und es hat nicht funktioniert. Ich habe den Prozess abgebrochen und alles hat wieder funktioniert - der then UND der else Körper. Nach dem Klicken in und aus ein paar anderen Fenstern funktionierte es wieder nicht mehr. Nachdem ich killall rhythmbox Ausgeführt hatte und sah, dass es wieder einwandfrei funktionierte, kam ich zu dem Schluss, dass es sich um einen zufälligen Fehler handelte, obwohl ich den Fehler nicht reproduzieren konnte. Na ja, natürlich Pseudozufall. Wenn Sie es selbst ausprobieren möchten, wissen Sie, wie es geht. Sie können wmctrl erhalten, indem Sie Sudo apt install wmctrl Ausführen. Ich benutze Version 1.07 davon auf Ubuntu 16.04 LTS und bin sehr verwirrt.

Letzte Änderung (nie zuletzt sagen):

Ich habe Firefox tatsächlich dazu gebracht, sich beim Drücken der Tastenkombination zu zeigen. Das ist cool, nur nicht was ich will. Ich werde jetzt eine große Tasse Kaffee trinken und etwas anderes tun, wow.

3
Reum12

Das Problem: Rhythmbox ändert den Fensternamen

Das Problem ist, dass Sie das Fenster anhand seines Namens mit wmctrl -a Identifizieren. Von man wmctrl:

-a <WIN>
    Switch to the desktop containing the window <WIN>, raise the window, and give it focus. 

<WIN> Ist eine identifizierende Zeichenfolge im Fensternamen.

Insbesondere in Ihrem Fall kann dies zu Fehlern führen, da Rhythmbox den Fensternamen je nach Song ändert. Sie müssen das Fenster entweder anhand seiner Fensterklasse oder anhand seines id identifizieren.

Letzteres kann erfolgen mit:

wmctrl -ia

dabei steht die Option -i für die Fenster-ID:

   -i     Interpret window arguments (<WIN>) as  a  numeric  value  rather
          than  a  string name for the window. If the numeric value starts
          with the prefix '0x' it is assumed to be a hexadecimal number.

Sowohl die Fenster-ID als auch die PID, zu der ein Fenster gehört, können aus der Fensterliste abgerufen werden, die mit dem folgenden Befehl aufgerufen wird:

wmctrl -lp 

Ein zuverlässiger Befehl zum Anheben des neuesten Fensters von z.B. Rhythmbox ist dann:

wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Erläuterung:

wmctrl -lp

listet alle Fenster einschließlich ihrer Pids auf. Eine wichtige Eigenschaft des Befehls ist, dass die Fenster in der Reihenfolge aufgelistet werden, in der sie erstellt wurden .

Deshalb:

wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }'

werden:

  • liste alle Fenster + Pids auf, zu denen sie gehören:

    wmctrl -lp
    
  • finde diejenigen, die zu rhythmbox gehören:

    grep "$(pgrep rhythmbox)"
    
  • finde den letzten (der auch der zuletzt erstellte ist):

    tail -1
    
  • extrahiere die erste Zeichenkette in der Zeile (das ist die Fenster-ID):

    awk '{ print $1 }'
    

Der Befehl:

wmctrl -ia

ruft dann das neueste Rhythmbox-Fenster anhand seiner ID auf.

Skript

Aus Bequemlichkeitsgründen und um Probleme mit Anführungszeichen zu vermeiden, würde ich mit dem Befehl ein winziges Skript daraus erstellen und es über eine Verknüpfung ausführen:

#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Machen Sie es ausführbar und Tastenkürzel hinzufügen: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkürzel"> "Benutzerdefinierte Tastenkürzel" . Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

/path/to/script.sh

Zusätzlich

Anscheinend verwenden Sie den Befehl/das Skript für mehrere Anwendungen. Anstatt separate Skripte für jede einzelne Anwendung zu erstellen, können Sie das Argument für die Anwendung für das Skript eingeben:

#!/bin/bash
app=$(pgrep $1)
wmctrl -ia "$(wmctrl -lp | grep "$app" | tail -1 | awk '{ print $1 }')"

Dann

 /path/to/script.sh gedit

wird das zuletzt erstellte gedit Fenster öffnen, während

/path/to/script.sh rhythmbox

öffnet das zuletzt erstellte Fenster rhythmbox und so weiter.

2
Jacob Vlijm