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.
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.
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.
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:
~/bin
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()
Agregue al final de su script el comando:
fake_window
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.