O ícone do Launcher (para iniciar um script) continua piscando e não responde por sete segundos, como posso resolvê-lo?

3

Eu tenho um script, que eu inicio no Unity Launcher. Quando clico no ícone, meu script é iniciado com sucesso.

Enquanto o script leva apenas uma fração de segundo para ser executado, o ícone do lançador pisca por cerca de 7-8 segundos, durante os quais o lançador fica ocupado e não responde a cliques adicionais.

Posso personalizar meu script bash de modo que o ícone piscando não bloqueie o script por sete segundos?

Eu uso o Ubuntu 15.10.

    
por klpu39 11.03.2016 / 12:41

1 resposta

1

Não é um dupe

Muito relacionado este , mas um pouco diferente, já que o ícone intermitente e não-responsivo é um problema diferente, não resolvido adicionando:

StartupNotify=false

para o lançador; o ícone continuará piscando por aprox. sete segundos. Embora os problemas em ambas as perguntas tenham o mesmo histórico, os sintomas e a possível solução são ligeiramente diferentes.

A causa

Após iniciar os aplicativos da interface gráfica do Unity Launcher (clicando no ícone), o ativador aguarda a exibição de uma janela. Enquanto espera, o cursor pisca. Leva o lançador um tempo antes que chegue à conclusão de que sua "data" (a janela) não aparecerá. Enquanto espera, no entanto, o lançador não aceita novos cliques para executar o script (novamente).

A solução na pergunta vinculada acima, adicionando

StartupNotify=false

faz resolver a roda giratória do cursor do mouse, mas não faz o ícone responder novamente.

Então, o que funciona?

A outra solução na resposta vinculada, no entanto (abrir uma janela invisível falsa ao iniciar um script não-GUI a partir do iniciador Unity) também resolverá o problema do ícone piscante.

Da resposta vinculada:

  1. Crie, se ainda não existir, o diretório ~/bin
  2. Copie o script abaixo em um arquivo vazio, salve-o como fake_window (sem extensão) em ~/bin e torne-o executável

    #!/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. Adicione ao final do seu script o comando:

    fake_window
    
  4. Faça logout e volte em (ou execute source ~/.profile )

Agora, o ícone não piscará por sete segundos se você executar o script no Iniciador Unity.

    
por Jacob Vlijm 11.03.2016 / 13:09