Ich möchte die Verwendung von Alfred unter Mac OS X nachahmen, wo, wenn Sie versuchen, eine App zu öffnen, nachdem Sie danach gesucht haben, es nur ein neues Fenster öffnet, wenn das Programm nicht bereits läuft, andernfalls wird es den Fokus auf setzen aktuell ausgeführte Instanz dieser Anwendung. Gibt es eine Möglichkeit, das Standardverhalten des Launchers zu ändern, um dies zu überprüfen, bevor ein neues Fenster geöffnet wird?
Beste Antwort
Update 7. April:Eine andere Version hinzugefügt und Albert gefunden, siehe Update und Bonus unten !!!
Bezüglich Dash-Funktionalität :
Sie haben gefragt:” Gibt es überhaupt eine Möglichkeit, das Standardverhalten des Launchers zu ändern, um dies zu überprüfen, bevor ein neues Fenster geöffnet wird “. Die grundlegende Antwort lautet:Nein, als normaler Benutzer haben Sie keine Möglichkeit, dieses Verhalten zu Dash hinzuzufügen. Wenn es jedoch einen Unity-Scope-Entwickler gibt, der bereit wäre, dies zu implementieren, könnten Sie sich an ihn wenden oder selbst einen entwickeln, wenn Sie entschlossen und lernbereit sind. Meine Programmierkenntnisse sind sehr bescheiden, daher verwende ich Shell-Skripting und das verfügbare grafische Frontend für die Skripte als Workaround.
Verwandte Informationen
Ursprünglicher Beitrag:
Ich habe ein Skript geschrieben, das den Zenity-Dialog und wmctrl verwendet, um das zu erreichen, wonach Sie gefragt haben. Beachten Sie, dass dies ein grafisches Skript ist, was bedeutet, dass es nur mit Windows in der GUI funktioniert und nicht funktioniert, wenn Sie versuchen, etwas in tty zu starten. Außerdem macht Alfred, soweit ich weiß, genau dasselbe. Sie können eine Desktop-Verknüpfung oder eine Launcher-Verknüpfung erstellen, wie hier und hier beschrieben.
Das Skript:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
Randnotizen: In der vorherigen Version verwendete das Skript echo $?, um zu testen, ob vorherige Ausdrücke erfolgreich beendet wurden. Gemäß dem Vorschlag von Muru (aus der Bearbeitung) habe ich den Code in eine etwas kompaktere Version geändert, daher schlage ich vor, dass Sie sich die vorherige Version und die aktuelle ansehen.
Auch vorher wmctrl -a $MYPROG
funktionierte nicht mit dem Testen von Google-Chrome oder Chromium-Browser; Aus irgendeinem dummen Grund haben einige Programme die WM_CLASS-Eigenschaft des Fensters großgeschrieben, während das Programm von dpkg --get-selections
aufgelistet wird ist Kleinbuchstaben (lesen Sie einfach man wmctrl
und führen Sie wmctrl -lx
aus , du wirst es wissen). Das Hinzufügen von -ax sollte dies erledigen. Das Skript öffnet das bereits geöffnete Chromium-Fenster so, wie es sollte
Eine andere Sache – wmctlr ist etwas seltsam, da es manchmal eine Verzögerung benötigt (hatte Erfahrung damit in einem anderen Skript), also musste ich sleep 1
hinzufügen Linie. Früher war es ein bisschen ein und aus mit Firefox, aber jetzt funktioniert es wie am Schnürchen.
Das Skript in Aktion
In der Animation unten können Sie sehen, dass bei der ersten Ausführung des Skripts eine Instanz von Firefox geöffnet ist und das Skript den Fokus auf dieses Fenster wechselt; Beim zweiten Test öffne ich eine neue Instanz von Google-Chrome, die vorher nicht geöffnet war.
(Nebenbemerkung:Wenn Sie neugierig auf den Desktop sind, ist das übrigens Openbox mit Kairo Dock)
Per Vorschlag in den Kommentaren, eingebettete Animation entfernt, nur Link gepostet. Bei Defekt bitte melden! http://i.stack.imgur.com/puuPZ.gif
Aktualisierung, 7. April
Ich habe das Skript etwas verbessert, um alle Programme in das Dropdown-Eingabefeld von zenity aufzunehmen. Jetzt muss sich der Benutzer nicht jedes Programm merken, sondern kann einfach mit den Pfeiltasten durch eine Liste blättern oder einfach das Dropdown-Menü öffnen. Außerdem ruft diese verbesserte Version Fenster nicht nach Namen, sondern nach Fenster-ID auf, was zu einer viel besseren Leistung führt. Beachten Sie, dass die Art und Weise, wie ich .desktop-Dateien durchgehe, irgendwie überflüssig ist, indem ich den Befehl cut zweimal verwende, aber da mein Skript-Fu bisher nicht so gut ist, ist dies alles, was ich tun kann. Verbesserungsvorschläge sind willkommen!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi
Bonus:
Ich habe tatsächlich Albert gefunden, die Linux-Version von Alfred, aber ich habe es nicht selbst ausprobiert. Ausprobieren lohnt sich aber. Wie Jacob bereits bemerkt hat, ist es jedoch immer noch fehlerhaft.
Es gibt eine App namens Gnome-Do, die Alfred grafisch ähnlich sieht, jedoch nicht die gleiche Funktionalität wie dieses Skript hat.
Lassen Sie mich wissen, ob Ihnen dieses Skript gefällt, wenn etwas behoben werden muss, und vergessen Sie nicht, die Antwort positiv zu bewerten, wenn Sie sie nützlich finden