Excelente pergunta.
A causa
Normalmente, ao iniciar aplicativos GUI a partir do Unity Launcher, o ativador aguarda a exibição de uma janela. Enquanto espera, mostra a "roda de fiar". Não vai esperar para sempre no entanto; depois de cerca de 20 segundos, o lançador assume que a janela não aparecerá e desiste de esperar.
1. O principal comando do lançador de um aplicativo
Em um arquivo .desktop
, referente à primeira linha Exec=
(o comando principal), você pode informar ao que o lançador espere ou não, em uma linha:
StartupNotify=true
para esperar ou
StartupNotify=false
para que não aguarde.
2. Itens da lista rápida de um iniciador
Para possíveis itens de lista rápida (clique com o botão direito) de um lançador, o valor padrão é StartupNotify=true
. Infelizmente, esse valor é fixo e não pode ser alterado por nada.
Isso significa que se você iniciar qualquer comando clicando com o botão direito no ícone de um lançador no Unity Launcher, o lançador está esperando uma janela e espera por ela, mostrando a roda girando.
O resultado é que, embora possa ser explicado, parece não haver solução para o problema no momento, além de criar um lançador dedicado para o seu script e adicionar a linha StartupNotify=false
ao arquivo.
A prova
Você pode testar o comportamento sozinho. Crie dois lançadores:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
e:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Salve-os como test1.desktop
e test2.desktop
, arraste os dois ativadores para o iniciador do Unity. Clique neles e veja a diferença de comportamento.
Editar; se isso realmente o incomoda, dê uma janela falsa ao Unity
Se você tem muitos scripts em listas rápidas, e / ou realmente incomoda você, há outra solução cosmética; podemos fingir , invisível (totalmente transparente) para mostrar uma janela, para ser incluída no seu script. seu script seria então (por exemplo)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
onde o comando fake_window
chamará nossa (falsa) janela, fazendo com que Unity termine a roda de fiar.
Como configurar
- Crie, se ainda não existir, o diretório
~/bin
-
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()
-
Adicione ao final do seu script o comando:
fake_window
-
Faça logout e volte em (ou execute
source ~/.profile
)
É isso, a roda girará somente enquanto o script for executado.
Explicação
O script faz criar uma janela minimalista. A janela, no entanto, é totalmente transparente e tem um tamanho de 0x0 pixels e, portanto, é invisível. Ele irá se destruir instantaneamente quando existir.
Chamando a janela no final do seu roteiro, você irá satisfazer o desejo de Unity por uma janela, parando a roda girar.