Update 7. April: Eine andere Version hinzugefügt und Albert gefunden, siehe Update und Bonus unten !!!
Bezüglich der Dash-Funktionalität : Sie haben gefragt, ob Sie das Standardverhalten des Launchers ändern möchten, um dies zu überprüfen, bevor Sie ein neues Fenster öffnen . 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 geben würde, der bereit wäre, dies umzusetzen, 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-Skripte und das verfügbare grafische Front-End für die Skripte als Workaround.
Verwandte Informationen
Ursprünglicher Beitrag:
Ich habe ein Skript geschrieben, das Zenity-Dialog und wmctrl verwendet, um das zu erreichen, wonach Sie gefragt haben. Beachten Sie, dass dies ein grafisches Skript ist, das heißt, es funktioniert nur mit Windows in der GUI und nicht, wenn Sie versuchen, etwas in tty zu starten. Soweit ich weiß, macht Alfred genau das Gleiche. Sie können eine Desktop-Verknüpfung oder eine Starter-Verknüpfung erstellen, wie hier und hier beschrieben .
Das Drehbuch:
#!/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 /ubuntu//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
Nebenbemerkungen: In der vorherigen Version verwendete das Skript echo $?, Um zu testen, ob frühere Ausdrücke erfolgreich beendet wurden. Gemäß Murus Vorschlag (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 Version ansehen.
Außerdem hat wmctrl -a $MYPROG
das Testen von Google-Chrome oder Chrom-Browser bisher nicht funktioniert. Aus irgendeinem dummen Grund haben einige Programme die WM_CLASS-Eigenschaft des Fensters in Großbuchstaben geschrieben, während das von aufgeführte Programm in dpkg --get-selections
Kleinbuchstaben geschrieben ist (Sie müssen nur lesen man wmctrl
und ausführen wmctrl -lx
, Sie werden es wissen). Das Hinzufügen von -ax sollte sich darum kümmern. Das Skript ruft das bereits geöffnete Chromfenster wie gewünscht auf
Eine andere Sache - wmctlr ist insofern etwas seltsam, als es manchmal eine Verzögerung braucht (ich hatte Erfahrung damit in einem anderen Skript), also musste ich sleep 1
Zeile hinzufügen . Früher war es mit Firefox ein und aus, aber jetzt funktioniert es schwimmend.
Das Skript in Aktion
In der folgenden Animation sehen Sie, dass beim ersten Ausführen des Skripts eine Instanz von Firefox geöffnet ist und der Fokus des Skripts auf dieses Fenster wechselt. Beim zweiten Test öffne ich eine neue Instanz von Google-Chrome, die zuvor noch nicht geöffnet war. (Randnotiz: Wenn Sie über den Desktop neugierig sind, ist das übrigens Openbox mit Cairo Dock)
Per Vorschlag in den Kommentaren, eingebettete Animation entfernt, nur Link gepostet. Bitte melden, wenn es kaputt ist!
http://i.stack.imgur.com/puuPZ.gif
Update, 7. April
Ich habe das Skript etwas verbessert, damit alle Programme im Dropdown-Eingabefeld von zenity aufgelistet werden. Jetzt muss sich der Benutzer nicht mehr jedes Programm merken, sondern kann mit den Pfeiltasten durch eine Liste blättern oder einfach das Dropdown-Menü öffnen. Diese verbesserte Version erhöht Fenster nicht nach Namen, sondern nach Fenster-ID, wodurch die Leistung erheblich verbessert wird. Beachten Sie, dass die Art und Weise, wie ich .desktop-Dateien durchsuche, redundant ist, wenn 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 /ubuntu//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, habe es aber selbst nicht ausprobiert. Ein Besuch lohnt sich jedoch. Wie Jacob jedoch bereits bemerkte, ist es immer noch fehlerhaft.
Es gibt eine App namens Gnome-Do, die Alfred grafisch ähnelt, jedoch nicht die gleiche Funktionalität wie dieses Skript hat.
Lassen Sie mich wissen, ob Ihnen dieses Skript gefällt, ob es Probleme gibt, die behoben werden müssen, und vergessen Sie nicht, die Antwort zu aktualisieren, wenn Sie sie nützlich finden