web-dev-qa-db-fra.com

L'icône du lanceur (pour démarrer un script) continue de clignoter et ne répond pas pendant sept secondes. Comment puis-je le résoudre?

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.

3
klpu39

Pas dupe

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.

La cause

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.

Alors qu'est-ce qui fonctionne?

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:

  1. Créez, s'il n'existe pas encore, le répertoire ~/bin
  2. 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()
    
  3. Ajoutez à la toute fin de votre script la commande:

    fake_window
    
  4. 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.

1
Jacob Vlijm