Hervorragende Frage.
Die Ursache
Normalerweise wartet der Launcher beim Starten von GUI-Anwendungen über Unity Launcher darauf, dass ein Fenster angezeigt wird. Während des Wartens zeigt es das "Spinnrad". Es wird jedoch nicht ewig warten; Nach etwa 20 Sekunden geht der Launcher davon aus, dass das Fenster nicht angezeigt wird, und gibt das Warten auf.
1. Der Hauptbefehl des Startprogramms einer Anwendung
In einer .desktop
Datei, die die erste Exec=
Zeile (den Hauptbefehl) betrifft , können Sie den Launcher anweisen, in einer Zeile zu warten oder nicht:
StartupNotify=true
um es warten zu lassen, oder
StartupNotify=false
um es nicht warten zu lassen.
2. Quicklist Elemente eines Launchers
Für mögliche Quicklist-Elemente (Rechtsklick) eines Launchers ist der Standardwert jedoch StartupNotify=true
. Leider ist dieser Wert fest und kann durch nichts geändert werden.
Das heißt, wenn Sie einen Befehl durch Klicken mit der rechten Maustaste auf ein Starter-Symbol im Unity Launcher starten , erwartet der Launcher ein Fenster und wartet darauf, das sich drehende Rad zu sehen.
Die Quintessenz ist, dass, obwohl es erklärt werden kann, es im Moment keine Lösung für das Problem zu geben scheint, andere als einen dedizierten Launcher für Ihr Skript zu erstellen und die Zeile StartupNotify=false
der Datei hinzuzufügen .
Der Beweis
Sie können das Verhalten selbst testen. Erstellen Sie zwei Trägerraketen:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
und:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Speichern Sie sie als test1.desktop
und test2.desktop
ziehen Sie beide Starter auf den Unity-Starter. Klicken Sie darauf und sehen Sie den Unterschied im Verhalten.
Bearbeiten; Wenn es dich wirklich stört, füttere Unity ein falsches Fenster
Wenn Sie viele Skripte in Schnelllisten haben und / oder es Sie wirklich stört, gibt es eine andere kosmetische Lösung; Wir können fälschen , unsichtbar (vollständig transparent), um ein Fenster anzuzeigen, das in Ihr Skript aufgenommen werden soll. Ihr Skript wäre dann (zB)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
Hier fake_window
ruft der Befehl unser (Fake-) Fenster auf, wodurch Unity das Rad zum Stillstand bringt.
Wie stellt man das ein
- Erstellen Sie das Verzeichnis, falls es noch nicht existiert
~/bin
Kopieren Sie das folgende Skript in eine leere Datei, speichern Sie es als fake_window
(keine Erweiterung) in ~/bin
und machen Sie es ausführbar
#!/usr/bin/env python3
from gi.repository import Gtk
from threading import Thread
import time
import subprocess
"""
This is a self-destroying window, to "feed" Unity a fake-window, preventing
the launcher to show a spinning wheel, waiting for a window to appear.
Include the command to run this script at the end of the (your) script.
"""
class FakeWin(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="1526closeme")
Thread(target = self.close).start()
def close(self):
t = 0
while t < 150:
time.sleep(0.2)
try:
pid = subprocess.check_output(["pgrep", "-f", "fake_window"])\
.decode("utf-8").strip()
subprocess.Popen(["kill", pid])
break
except subprocess.CalledProcessError:
pass
t += 1
def fakewindow():
window = FakeWin()
# make our window transparent
window.set_opacity(0)
window.set_default_size(0,0)
window.show_all()
Gtk.main()
fakewindow()
Fügen Sie ganz am Ende Ihres Skripts den folgenden Befehl hinzu:
fake_window
Abmelden und wieder anmelden (oder ausführensource ~/.profile
)
Das Rad dreht sich jetzt nur so lange, wie das Skript ausgeführt wird.
Erläuterung
Das Skript hat ein minimalistisches Fenster erstellen. Das Fenster ist jedoch vollständig transparent und hat eine Größe von 0x0 Pixel und ist somit unsichtbar. Es wird sich sofort selbst zerstören, sobald es existiert.
Wenn Sie das Fenster am Ende Ihres Skripts aufrufen, werden Sie Unitys Wunsch nach einem Fenster erfüllen und das Rad anhalten, um sich zu drehen.