Ottima domanda
La causa
Normalmente, quando si avviano le applicazioni della GUI da Unity Launcher, il launcher attende che appaia una finestra. Durante l'attesa, mostra la "ruota che gira". Non aspetterà per sempre comunque; dopo circa 20 secondi, il programma di avvio presuppone che la finestra non venga visualizzata e smette di aspettare.
1. Il comando principale del programma di avvio di un'applicazione
In un .desktop
file, relativo alla prima Exec=
riga (il comando principale), puoi dire al programma di avvio di attendere o meno, in una riga:
StartupNotify=true
per farlo aspettare, o
StartupNotify=false
per non aspettare.
2. Elementi della Quicklist di un lanciatore
Per possibili elementi della lista rapida (clic con il tasto destro) di un programma di avvio, tuttavia, il valore predefinito è StartupNotify=true
. Sfortunatamente, questo valore è fisso e non può essere modificato da nulla.
Ciò significa che se si avvia un comando facendo clic con il tasto destro sull'icona di un launcher in Unity Launcher, il launcher si aspetta una finestra e la attende, mostrando la ruota che gira.
La linea di fondo è che, sebbene possa essere spiegato, al momento non sembra esserci alcuna soluzione al problema, a parte la creazione di un launcher dedicato per lo script e l'aggiunta della riga StartupNotify=false
al file.
La prova
Puoi testare il comportamento da solo. Crea due lanciatori:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
e:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Salvali come test1.desktop
e test2.desktop
, trascina entrambi i lanciatori su Unity Launcher. Fare clic su di essi e vedere la differenza di comportamento.
Modificare; se ti dà davvero fastidio, dai a Unity una finta finestra
Se hai molti script nelle liste di scelta rapida e / o ti disturba davvero, c'è un'altra soluzione cosmetica; possiamo fingere , invisibile (completamente trasparente) per mostrare una finestra, da includere nella tua sceneggiatura. la tua sceneggiatura sarebbe quindi (ad es.)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
dove il comando fake_window
chiamerà la nostra finestra (falsa), facendo finire Unity alla ruota che gira.
Come impostare
- Creare, se non esiste ancora, la directory
~/bin
Copia lo script seguente in un file vuoto, salvalo come fake_window
(senza estensione) ~/bin
e rendilo eseguibile
#!/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()
Aggiungi alla fine del tuo script il comando:
fake_window
Esci e rientra (o eseguisource ~/.profile
)
Ecco fatto, la ruota ora gira solo per tutto il tempo in cui lo script è in esecuzione.
Spiegazione
Lo script fa creare una finestra minimalista. La finestra tuttavia è completamente trasparente e ha una dimensione di 0x0 pixel ed è quindi invisibile. Si distruggerà all'istante una volta che esiste.
Chiamando la finestra alla fine della sceneggiatura, soddisferai il desiderio di Unity di una finestra, fermando la ruota.