J'ai un script, que je commence à partir du lanceur d'Unity. Lorsque je clique sur l'icône, mon script démarre avec succès.
Bien que le script ne prenne qu'une fraction de seconde à exécuter, l'icône du lanceur clignote pendant environ 7 à 8 secondes, période pendant laquelle le lanceur est occupé et ne répond pas aux clics supplémentaires.
Puis-je personnaliser mon script bash de telle sorte que l'icône clignotante ne bloque pas le script pendant sept secondes?
J'utilise Ubuntu 15.10.
Beaucoup lié celui-ci , mais légèrement différent, car le clignotement , l'icône non réactif est un problème différent, et non résolu en ajoutant:
StartupNotify=false
au lanceur; l'icône continue à clignoter pendant env. sept secondes. Bien que les problèmes des deux questions aient le même contexte, les symptômes et la solution possible sont légèrement différents.
Après avoir démarré les applications GUI à partir du lanceur Unity (en cliquant sur l'icône), le lanceur attend qu'une fenêtre apparaisse. En attendant, le curseur clignote. Il faut un certain temps au lanceur pour en venir à la conclusion que sa "date" (la fenêtre) n’apparaîtra pas. En attendant , le programme de lancement n'accepte pas les nouveaux clics pour exécuter le script (à nouveau).
La solution dans la question liée ci-dessus, en ajoutant
StartupNotify=false
résout la roue tournante du curseur de la souris, mais ne rend pas l'icône réactif.
Cependant, l’autre solution de la réponse liée (ouvrir une fausse fenêtre invisible lors du démarrage d’un script non graphique à partir du lanceur Unity) résoudra également le problème de l’icône clignotante.
À partir de la réponse liée:
~/bin
Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom fake_window
(sans extension) dans ~/bin
et rendez-le exécutable
#!/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()
Ajoutez à la toute fin de votre script la commande:
fake_window
Déconnectez-vous et reconnectez-vous (ou exécutez source ~/.profile
)
Maintenant, l'icône ne clignotera pas pendant sept secondes si vous exécutez votre script à partir du programme de lancement d'Unity.