Excelente pergunta.
A causa
Normalmente, ao iniciar aplicativos da GUI a partir do Unity Launcher, o iniciador espera uma janela aparecer. Enquanto aguarda, mostra a "roda giratória". No entanto, não vai esperar para sempre; Após cerca de 20 segundos, o iniciador assume que a janela não aparecerá e deixa de esperar.
1. O comando principal do iniciador de um aplicativo
Em um .desktop
arquivo, referente à primeira Exec=
linha (o comando principal), você pode dizer ao iniciador para aguardar ou não, em uma linha:
StartupNotify=true
para esperar, ou
StartupNotify=false
para não esperar.
2. Itens da lista rápida de um iniciador
Para possíveis itens da lista rápida (clique com o botão direito do mouse) de um iniciador, no entanto, 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 do mouse em um ícone do lançador no Unity Launcher, o lançador estará esperando uma janela e aguardará, mostrando a roda giratória.
A linha inferior é que, embora possa ser explicado, parece não haver solução para o problema no momento, além de criar um iniciador dedicado para o seu script e adicionar a linha StartupNotify=false
ao arquivo.
A prova
Você pode testar o comportamento você mesmo. 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 lançadores para o iniciador do Unity. Clique neles e veja a diferença de comportamento.
Editar; se realmente o incomoda, alimente o Unity com uma janela falsa
Se você possui muitos scripts em listas rápidas e / ou realmente o incomoda, há outra solução cosmética; podemos fingir , invisíveis (totalmente transparentes) para mostrar uma janela, a 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 janela (falsa), fazendo o Unity terminar a roda giratória.
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) ~/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
Sair e voltar (ou executarsource ~/.profile
)
É isso aí, agora a roda gira apenas 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 se destruirá instantaneamente quando existir.
Chamando a janela no final do seu script, você satisfará o desejo da Unity por uma janela, parando a roda para girar.