Doskonałe pytanie.
Powód
Zwykle podczas uruchamiania aplikacji GUI z Unity Launcher, program uruchamiający czeka na pojawienie się okna. Podczas oczekiwania pokazuje „obracające się koło”. Nie będzie jednak czekać wiecznie; po około 20 sekundach program uruchamiający zakłada, że okno się nie pojawi i rezygnuje z czekania.
1. Główne polecenie programu uruchamiającego aplikację
W .desktop
pliku dotyczącym pierwszego Exec=
wiersza (polecenia głównego) możesz powiedzieć programowi uruchamiającemu, aby poczekał lub nie, w wierszu:
StartupNotify=true
aby poczekać, lub
StartupNotify=false
żeby nie czekać.
2. Skrócona lista elementów programu uruchamiającego
Jednak w przypadku możliwych szybkich pozycji (kliknięcie prawym przyciskiem) elementów uruchamiających domyślną wartością jest StartupNotify=true
. Niestety, ta wartość jest stała i nie może być zmieniona przez nic.
Oznacza to, że jeśli uruchomisz dowolne polecenie, klikając prawym przyciskiem myszy ikonę programu uruchamiającego w Unity Launcher, program uruchamiający oczekuje okna i czeka na niego, pokazując obracające się koło.
Najważniejsze jest to, że chociaż można to wyjaśnić, wydaje się, że obecnie nie ma rozwiązania tego problemu, oprócz stworzenia dedykowanego programu uruchamiającego dla skryptu i dodania wiersza StartupNotify=false
do pliku.
Dowód
Możesz sam sprawdzić zachowanie. Utwórz dwa wyrzutnie:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
i:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Zapisz je jako test1.desktop
i test2.desktop
przeciągnij oba programy uruchamiające do programu uruchamiającego Unity. Kliknij je i zobacz różnicę w zachowaniu.
Edytować; jeśli naprawdę Ci to przeszkadza, nakarm Unity fałszywym oknem
Jeśli masz wiele skryptów na krótkich listach i / lub naprawdę Ci to przeszkadza, istnieje inne rozwiązanie kosmetyczne; możemy sfałszować , niewidoczny (w pełni przezroczysty), aby pokazać okno, które zostanie uwzględnione w twoim skrypcie. Twój skrypt byłby wtedy (np.)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
gdzie polecenie fake_window
wywoła nasze (fałszywe) okno, sprawiając, że Unity zakończy wirujące koło.
Jak skonfigurować
- Utwórz, jeśli jeszcze nie istnieje, katalog
~/bin
Skopiuj poniższy skrypt do pustego pliku, zapisz go jako fake_window
(bez rozszerzenia) ~/bin
i włącz
#!/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()
Dodaj na samym końcu skryptu polecenie:
fake_window
Wyloguj się i zaloguj ponownie (lub uruchomsource ~/.profile
)
To wszystko, koło będzie się teraz obracać tylko tak długo, jak długo uruchomi się skrypt.
Wyjaśnienie
Skrypt ma stworzyć minimalistyczny okno. Okno jest jednak w pełni przezroczyste i ma rozmiar 0x0 pikseli i dlatego jest niewidoczne. Zniszczy się natychmiast, gdy będzie istniał.
Wywołując okno na końcu skryptu, spełnisz życzenie Unity dotyczące okna, zatrzymując koło.