grillparzer
Anmeldungsdatum: 7. März 2010
Beiträge: 873
|
Hallo, kann man einen Starter auf dem Desktop so anlegen, dass dieser, falls die Anwendung bereits geöffnet ist, zur Anwendung wechselt? Es soll also die Anwendung nicht ein weiteres Mal geöffnet werden. Zum Beispiel ein Starter für Firefox: | [Desktop Entry]
Name=Firefox Web Browser
Comment=Im Internet surfen
Exec=firefox
Icon=/usr/share/pixmaps/firefox.png
Terminal=false
Type=Application
Categories=Application;
StartupNotify=false
|
Oder muss man da an einer ganz anderen Stelle ansetzen? Gruß, grillparzer
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Interessante Frage. Ist das nicht von Programm zu Programm unterschiedlich, bzw. hängt das Gelingen damit zusammen, ob das Programm mehrere Instanzen zulässt? Firefox zB öffnet per default ein zweites Fenster, keine zweite Instanz. Mit firefox -new-tab "https://www.google.de" (also mit einer URL-Angabe) ließe sich ein Tab statt Fenster öffnen. Wenn es keine speziellen Optionen gibt, bieten sich vllt Scriptlösungen mit wmctrl oder xdotool an. Vllt könnte man auch beim Fenstermanager (bei dir wohl Openbox) ansetzen?!
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
D630 schrieb: bieten sich vllt Scriptlösungen mit wmctrl oder xdotool an.
Ja, das ließe sich über ein Skript sicher regeln. Mit wmctrl -l werden alle Fenster aufgeführt (auch minimierte). Mit wmctrl -R NAME werden sie auf den aktuellen Desktop und in den Vordergrund geholt. Näheres in man wmctrl . Also muss das Skript abfragen, ob eine Instanz des gewünschten Programms schon läuft > falls ja, heranholen > falls nein, Programm starten. xdotool ist zwar ein Supertool 😀, aber hier m.E. nicht nötig. Bevor ich nun an einem Skript bastle (was ich nicht gut kann), weise ich dich noch auf Kupfer hin (die Screenshots im Wikiartikel sind leider veraltet, es sieht aktuell echt besser aus). Dieser Launcher überprüft automatisch, ob schon eine Instanz läuft, oder ob ein Programm neu gestartet werden muss. Gruß, HaCeMei
|
grillparzer
(Themenstarter)
Anmeldungsdatum: 7. März 2010
Beiträge: 873
|
HaCeMei schrieb: Bevor ich nun an einem Skript bastle (was ich nicht gut kann), weise ich dich noch auf Kupfer hin (die Screenshots im Wikiartikel sind leider veraltet, es sieht aktuell echt besser aus). Dieser Launcher überprüft automatisch, ob schon eine Instanz läuft, oder ob ein Programm neu gestartet werden muss.
Danke erstmal für Eure Vorschläge. Der Rechner ist für eine ältere Dame, die Kupfer leider nicht verstehen wird 😉 (tolles Programm, nutze selber Kupfer und Gnome-Do schon länger). Mir ist folgendes aufgefallen: Thunderbird ist eines der Programme, das gerade nicht neu geöffnet wird. Ist also TB offen und ich öffne über das LXDE-Menü erneut den TB, dann wird zum geöffneten TB gewechselt. Bei allen anderen Programmen wird eine neue Anwendung geöffnet... Hab leider wenig Erfahrung mit Skripten. Mal sehen... Gruß, grillparzer
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Hier ein kleines Script, das für den Anfang genügen sollte.
Aus irgendeinem Grund funktioniert wmctrl -a leider nicht deswegen muss ich außerdem xdotool benutzen. Wenn ich es hinbekomme, dann geb ich Dir ein Update. | #!/bin/bash
#focus.sh
#requires wmctrl, xdotool
if [[ $(pgrep dwb | wc -l) != 0 ]]
then
$(xdotool windowactivate "$(wmctrl -lx | awk '/dwb/ {print $1}')")
else
exec dwb
fi
|
Einfach dwb durch Firefox ersetzen, oder eine Variable benutzen, dann ist es später einfacher es auch für andere Anwendungen zu benutzen.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Vllt geht auch sowas hier mit dmenu: Starter > dmenu > Eingabe oder Auswahl aus definierter Liste > go . Dann müsste nur ein Starter erstellt werden. Aber wahrscheinlich ist das für eine alte Dame auch schon zu viel. Vllt ließe sich auch zenity mit Icon-Abbildung/Auswahl benutzen?! 1
2
3
4
5
6
7
8
9
10
11
12 | LIST="firefox thunar thunderbird"
NUMBER=$(echo "$LIST" | wc -w)
WINDOW=$(echo "$LIST" | cut -d' ' -f1-"$NUMBER" --output-delimiter=$'\n' | dmenu -i -b -p "RUN" -l 15 -nf "#DCDCCC" -nb "#2C2C2C" -sf "#2C2C2C" -sb "#DCDCCC" -fn 'Droid Sans Mono-9' | sed -re 's#^(\<.)#\L\1#g')
_WINDOW=$(echo "$WINDOW" | sed -re 's#^(\<.)#\U\1#g')
if [[ -n $(pgrep "$WINDOW") ]] || [[ -n $(pgrep "$_WINDOW") ]]
#if [[ $(pgrep "$WINDOW" | wc -l) != 0 ]] || [[ $(pgrep "$_WINDOW" | wc -l) != 0 ]]
then
$(xdotool windowactivate "$(wmctrl -lx | grep -i "$WINDOW" | awk '{print $1}')")
else
exec "$WINDOW" || exec "$_WINDOW" || exit 1
fi
|
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
Neuromatic schrieb: Hier ein kleines Script, das für den Anfang genügen sollte.
Aus irgendeinem Grund funktioniert wmctrl -a leider nicht deswegen muss ich außerdem xdotool benutzen. Wenn ich es hinbekomme, dann geb ich Dir ein Update. | #!/bin/bash
#focus.sh
#requires wmctrl, xdotool
if [[ $(pgrep dwb | wc -l) != 0 ]]
then
$(xdotool windowactivate "$(wmctrl -lx | awk '/dwb/ {print $1}')")
else
exec dwb
fi
|
Einfach dwb durch Firefox ersetzen, oder eine Variable benutzen, dann ist es später einfacher es auch für andere Anwendungen zu benutzen.
Super, bei mir tut's ☺. Also für Firefox (oder andere Anwendungen) anpassen 1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
#focusfirefox.sh
#requires wmctrl, xdotool
if [[ $(pgrep firefox | wc -l) != 0 ]]
then
$(xdotool windowactivate "$(wmctrl -lx | awk '/Firefox/ {print $1}')")
else
exec firefox
fi
|
Dabei in Zeile 8 Großschreibung von Firefox beachten. Und dieses Skript per Desktopdatei firefox.desktop starten [Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Firefox
Name[de_DE]=Firefox
Exec=/pfad/zum/skript/focusfirefox.sh
Comment[de_DE]=Zugang zum Internet mit Firefox
Icon=firefox
Categories=Network;WebBrowser;
Wenn man diese Datei in ~/.local/share/applications ablegt, wird firefox auch im Menü über das Skript gestartet (und Doppelinstanzen vermieden).
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Schön wenn es funktioniert ☺ Allerdings brachte mich D630 darauf, dass es schöner ist die if-Zeile gegen diese hier auszutauschen [update]
wmctrl -ax Firefox
Funktioniert. Aus irgend einem Grun mag die -a Option nicht mit ID's umgehen, mit Klassen jedoch sehr gern. Momentan versuche ich noch auszuglügeln was passiert wenn mehr als eine Instanz (möglicherweise absichtlich) geöffnet ist; denn bis jetzt gibt es dann nur einen Error und mit der -ax Option wird die zuletzt gestartete Instanz einfach ignoriert. Schönes Error-Handling sieht anders aus 😀
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Neuromatic schrieb:
Allerdings brachte mich D630 darauf, dass es schöner ist die if-Zeile gegen diese hier auszutauschen
👍 [PS] Oben wird übrigens eine gepatchte Version von dmenu gebraucht, die es hier gibt oder als dmenu-Fork hier.
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
Ich habe auch noch mal etwas probiert. #!/bin/bash
#focusfirefox.sh
#requires wmctrl
if [[ $(pgrep firefox | wc -l) != 0 ]]
then
wmctrl -a Firefox
else
exec firefox
fi Geht also auch ohne xdotool. Edit: Neuromatic hat's auch schon.
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
Um Verwirrung zu vermeiden hier einmal das Script so wie es mir bis jetzt vor schwebt: | #!/bin/bash
#focus.sh
#requires: wmctrl
APP="Firefox"
if [[ -n $(pgrep "$APP") ]]
then
$(wmctrl -ax "$APP")
else
exec "$APP"
|
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
Neuromatic schrieb:
| ...
APP="Firefox"
if [[ -n $(pgrep "$APP") ]]
...
|
Geht leider nicht, weil pgrep Groß- u. Kleinschreibung nicht ignoriert
|
HaCeMei
Anmeldungsdatum: 2. August 2010
Beiträge: 2262
|
Neuromatic schrieb:
Momentan versuche ich noch auszuglügeln was passiert wenn mehr als eine Instanz (möglicherweise absichtlich) geöffnet ist; denn bis jetzt gibt es dann nur einen Error und mit der -ax Option wird die zuletzt gestartete Instanz einfach ignoriert.
wmctrl -a ruft bei mir die zuerst gestartete Instanz in den Vordergrund (und ignoriert die weiteren).
|
Neuromatic
Anmeldungsdatum: 2. April 2012
Beiträge: 291
Wohnort: Rendsburg, SH
|
@HaCeMei Ich beschäftige mich zunächst nur mit zwei Instanzen, deswegen die einenartige Ausdrucksweise. ☺ [update] 1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
#focus.sh
#requires: wmctrl
#app > 1=prog name; 2=Window Class
app=( firefox Firefox )
if [[ -n $(pgrep ${app[0]}) ]]
then
$(wmctrl -ax ${app[1]})
else
exec ${app[0]}
fi
|
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
HaCeMei schrieb: Neuromatic schrieb:
| ...
APP="Firefox"
if [[ -n $(pgrep "$APP") ]]
> ...
|
Geht leider nicht, weil pgrep Groß- u. Kleinschreibung nicht ignoriert
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
#focus.sh
#requires: wmctrl
APP=$(echo "Firefox" | sed -re 's#^(\<.)#\L\1#g') # App kleinschreiben
_APP=$(echo "$APP" | sed -re 's#^(\<.)#\U\1#g') # App großschreiben
if [[ -n $(pgrep "$APP") ]] || [[ -n $(pgrep "$_APP") ]]
then
$(wmctrl -ax "$APP") # hier wird die Schreibung wohl ignoriert
else
exec "$APP" || exec "$_APP" || exit 0
fi
|
Wenn an der APP-Definition und pgrep festgehalten werden soll, ließe sich vllt auch ein Array benutzen und in einer while-Schleife abfragen?! Edit1: Ok. Schon übernommen das Array... Edit2: Tzz, wie komme ich denn darauf, dass pgrep hier zweimal testen muss. Na ja.
|