GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

App nur starten, wenn sie noch nicht geöffnet ist?

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.

Verwandte:Bluetooth auf Ubuntu 16.04?

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


Ubuntu
  1. Cl in Intel öffnen?

  2. Apache 2 konnte nicht gebunden werden, Adresse bereits verwendet?

  3. Keepassx 0.4.3 auf 11.10 (Unity) nicht sichtbar im Task Switcher (Alt-Tab)?

  4. Xubuntu Libre Office Calc kann Netzwerkdatei nicht öffnen?

  5. Wie kann man Alt-w dazu bringen, die aktuelle Registerkarte und nicht das aktuelle Fenster in der Gnome-Shell zu schließen?

Öffnen Sie Ordner in einer beliebigen Terminal-App von Nautilus

So öffnen Sie ein Linux-Terminalfenster

5 Möglichkeiten zum Öffnen oder Starten einer Anwendung in Debian

18.04:Color Emoji wird in Chrome überhaupt nicht angezeigt, in Firefox nur teilweise?

Nicht fokussiertes Windows reagiert nicht auf Mausklicks?

Gedit in 16.04:Registerkarte mit Dateinamen anzeigen, wenn nur eine Datei geöffnet ist?