it-swarm-es.tech

El ícono del iniciador (para iniciar un script) sigue parpadeando y no responde durante siete segundos, ¿cómo puedo resolverlo?

Tengo un script, que empiezo desde Unity Launcher. Cuando hago clic en el icono, mi script comienza con éxito.

Si bien el script solo tarda una fracción de segundo en ejecutarse, el ícono del iniciador parpadea durante aproximadamente 7-8 segundos, durante los cuales el iniciador está ocupado y no responde a clics adicionales.

¿Puedo personalizar mi script bash de tal manera que el ícono parpadeante no bloquee el script durante siete segundos?

Yo uso Ubuntu 15.10.

3
klpu39

No un tonto

Mucho relacionado este , pero ligeramente diferente, ya que el parpadeo , el ícono que no responde es un problema diferente, no se resuelve agregando:

StartupNotify=false

al lanzador; el ícono seguirá parpadeando durante appr. siete segundos Aunque los problemas en ambas preguntas tienen los mismos antecedentes, tanto los síntomas como la posible solución son ligeramente diferentes.

La causa

Después de iniciar las aplicaciones GUI desde Unity Launcher (haciendo clic en el icono), el iniciador espera a que aparezca una ventana. Mientras espera, el cursor parpadea. El iniciador tarda un tiempo antes de llegar a la conclusión de que su "fecha" (la ventana) no aparecerá. Mientras espera, sin embargo, el iniciador no acepta nuevos clics para ejecutar el script (nuevamente).

La solución en la pregunta vinculada anterior, agregando

StartupNotify=false

resuelve la rueda giratoria del cursor del mouse, pero no hace que el ícono responda nuevamente.

Entonces, ¿qué funciona?

Sin embargo, la otra solución en la respuesta vinculada (abrir una ventana falsa e invisible al iniciar un script que no sea GUI desde el iniciador de Unity) también resolverá el problema del icono parpadeante.

De la respuesta vinculada:

  1. Cree, si aún no existe, el directorio ~/bin
  2. Copie el script a continuación en un archivo vacío, guárdelo como fake_window (sin extensión) en ~/bin y hágalo ejecutable

    #!/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. Agregue al final de su script el comando:

    fake_window
    
  4. Cerrar sesión y volver a iniciarla (o ejecutar source ~/.profile)

Ahora el ícono no parpadeará durante siete segundos si ejecuta su script desde el Lanzador de Unity.

1
Jacob Vlijm