
Ich habe lirc
meinen PC mit einer Fernbedienung gesteuert. Um zwischen verschiedenen Modi zu wechseln, habe ich.lircrcwie folgt:
begin vlc
include ~/.lirc/vlc
end vlc
begin gnome
include ~/.lirc/gnome
end gnome
begin firefox
include ~/.lirc/firefox
end firefox
begin me-tv
include ~/.lirc/me-tv
end me-tv
begin
prog = irexec
button = KEY_YELLOW
config = if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
mode = vlc
end
begin
prog = irexec
button = KEY_GREEN
mode = gnome
end
begin
prog = irexec
button = KEY_RED
config = if [ -n $(pgrep -x firefox) ]; then (firefox &); fi
mode = firefox
end
begin
prog = irexec
button = KEY_BLUE
config = if [ -n $(pgrep -x me-tv) ]; then (me-tv &); fi
mode = me-tv
end
Damit funktioniert alles einwandfrei - außer der Wechsel zu Firefox: Wenn Firefox läuft und ich den roten Knopf drücke, wechselt er den Modus (wie es sein sollte)Und öffnet ein zweites Fenster/eine zweite Instanz von Firefox (was nicht der Fall sein sollte).
Das Problem tritt nur bei Firefox auf.
Edit
→ Preferences
→ Tabs
→ Open new windows in a new tab instead
ist bereits aktiviert:
Was geschiehtwenn Firefox läuftund ich starte firefox
in einem Terminal?
firefox
- ein zweites Fenster öffnet sichfirefox about:startpage
- es öffnet sich ein neuer Tab in Firefox mit der vorkonfigurierten Startseite- (!)
firefox about:blank
- es öffnet sich ein neuer Tab in Firefox mit meiner persönlichen Startseite (Kurzwahl) firefox chrome://speeddial/content/speeddial.xul
(das ist die Adresse der Speeddial-Startseite)- nichts passiert
Was geschiehtwenn Firefox nicht läuftund ich starte firefox
in einem Terminal?
firefox
- Firefox öffnet sich wie inPreferences
(Show my windows and tabs from last time
) konfiguriertfirefox about:startpage
- Firefox öffnet sich mit einem zusätzlichen neuen Tab mit der vorkonfigurierten Startseite- (!)
firefox about:blank
- Firefox öffnet sich mit einem zusätzlichen neuen, leeren Tab firefox chrome://speeddial/content/speeddial.xul
- Firefox öffnet sich nicht:*** Preventing external load of chrome: URI into browser window.
Use -chrome <uri> instead
Wenn ich also den Befehl im Skript ändere ( config = ...
) und eine Adresse hinzufüge, about:blank
löst das das Problem teilweise. Das Problem bleibt, dass essetzt Firefox nicht in den Vordergrundwenn es bereits läuft. Dies geschieht nurManchmal.
Kann mir jemand helfen, dieses Skript zu bearbeiten, um dieses Fehlverhalten zu beheben?(Quelledes Skripts, das ich geändert habe.)
Antwort1
Ein Teil des Shell-Codes davonQuellehält nicht, was es verspricht; vor allem nicht die Art, die so geht:
if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
Dies wird vlc &
in zwei Fällen ausgeführt. Wenn es keine Prozesse gibt, die mit „vlc“ übereinstimmen, und wenn es genau einen Prozess gibt, der mit „vlc“ übereinstimmt. Wenn es mehr als einen Prozess gibt, der mit „vlc“ übereinstimmt, vlc &
wird es nicht ausgeführt. Daher sind diese if-Blöcke ziemlich nutzlos. vlc &
Stattdessen einfach auszuführen wäre wahrscheinlich korrekter.
Schlechte Shell-Ratschläge sind im Internet leider an der Tagesordnung.
Aus Ihrer Problembeschreibung geht hervor, dass das gewünschte Ergebnis darin besteht, dass das Programm ausgeführt wird, wenn es nicht bereits ausgeführt wird, und dass das Fenster, wenn es ausgeführt wird, in den Vordergrund gebracht und fokussiert wird. Zu diesem Zweck wmctrl
könnte verwendet werden.
wmctrl -a 'Mozilla Firefox'
findet ein Fenster mit „Mozilla Firefox“ im Titel und „aktiviert“ es. Das heißt, es wechselt in den Arbeitsbereich, in dem es sich befindet, bringt es in den Vordergrund und gibt ihm den Fokus. Zweitens, wenn keine Fenster übereinstimmen, tut wmctrl nichts und beendet das Programm mit einem Exit-Status ungleich Null (falsch). In diesem Fall können wir davon ausgehen, dass das Programm nicht ausgeführt wird, und es stattdessen starten.
wmctrl -a 'Mozilla Firefox' || firefox &
Es ist jedoch immer noch nicht perfekt. Auch andere Fenster als Firefox-Fenster könnten diese Zeichenfolge möglicherweise in ihrem Titel enthalten, daher sollten wir in diesem Fall einen zuverlässigeren Weg finden, das richtige Fenster zu identifizieren.
Mit -x wird wmctrl auf der VM_CLASS eines Fensters arbeiten, die normalerweise einen eindeutigen Wert pro Programm hat. Alle Firefox-Fenster haben die VM_CLASS „Navigator.Firefox“, wie man sehen kann, wenn man es ausführt, wmctrl -lx
während Firefox läuft.
$ wmctrl -lx
...
0x03ba3d43 3 gnome-terminal.Gnome-terminal pilot Terminal
0x04c000bc 0 Navigator.Firefox pilot Group #1 - Speed Dial - Mozilla Firefox
Damit können wir das Fenster auswählen, das genau "Navigator.Firefox" als VM_CLASS hat
wmctrl -Fxa Navigator.Firefox || firefox &
Gleiches dürfte hoffentlich auch für die anderen Programme gelten.