Por que não funciona como você faz
Como mencionado no comentário, um aplicativo, em princípio, só pode ser representado por um ícone no
O que você está se referindo é provavelmente que o Unity se tornou "mais inteligente" ao determinar qual dos arquivos .desktop
é o melhor representante para a janela do aplicativo. Portanto, seu script, executando uma janela de terminal, será representado pelo gnome-terminal
-icon:
gnome-terminal
launcherexistentepararepresentarsuajanela.Asoluçãoruim
...éparaanularaescolhadaUnity,adicionandoumalinhaaoseulançador(para16.04):
StartupWMClass=gnome-terminal-server
...masdepoistodasasjanelasdoterminal,independentementedeteremounãooseuscript,estãoagrupadassobesteícone.
Alémdisso,emgeral,terváriosarquivos.desktop
,chamaromesmoaplicativoemseucomandoprincipaléumapráticaruimeimpura.
EDITAR
Comoter(a)ícone(s)separado(s)paraumscriptemexecução
Éprecisoumpoucodetruqueeengano,masépossívelterumíconeseparadoparaváriosscripts,sendoexecutadoemdiferentesjanelasdeterminal.
Comofuncionanaprática
- Digamosquevocêtenhaumscript,
somscript.sh
,quedesejaexecutaremumajaneladeterminal,mostrandoseuíconededicadonoIniciadorUnityenquantoéexecutado. Executeocomando:
showiconsomescript.shsomeicon.png
eoscriptseráexecutadodentrodeumajanela
gnome-terminal
recém-aberta,mostrandooícone:someicon.png
- Seajanelaforfechada,oíconeseráremovidodoiniciadornovamente.
Umexemplo
Euqueroumscript,
/home/jacob/Bureaublad/script.sh
,executado,exibidonoiniciadordoUnitycomoícone:/home/jacob/Thema/icon/ubu.png
Executandoocomando:showicon'/home/jacob/Bureaublad/script.sh''/home/jacob/Thema/icon/ubu.png'
faráisso:
Agoravamosadicionaroutro:
showicon'/home/jacob/Bureaublad/script2.sh''/home/jacob/Thema/icon/banaan.png'
Oresultado:
Quandoasjanelassãofechadas,osíconessãoremovidosnovamente.
Comoconfigurar
Oscriptprecisade
wmctrl
sudoapt-getinstallwmctrl
Crie,seaindanãoexistir,odiretório
~/bin
- Copieoscriptabaixoemumarquivovazio,salve-ocomo
showicon
(semextensão)em~/bin
etorne-oexecutável Façalogoutevolte,suaconfiguraçãodevefuncionar.Testecomocomando
showicon</path/to/script.sh></path/to/icon.png>
paraque
script.sh
sejaexecutadoemumterminal,exibindoicon.png
noiniciadordoUnity.
Oscript
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
terminal = "gnome-terminal"
key = "com.canonical.Unity.Launcher"
script = sys.argv[1]
icon = sys.argv[2]
curr = os.path.dirname(os.path.realpath(__file__))
scriptname = script.split("/")[-1]
def get(command):
try:
return subprocess.check_output(command).decode("utf-8")
except subprocess.CalledProcessError:
pass
# --- edit Unity launcher section
def current_launcher():
return eval(get(["gsettings", "get", key, "favorites"]))
def set_launcher(desktopfile, arg):
curr_launcher = current_launcher()
last = [i for i, x in enumerate(curr_launcher) if x.startswith("application://")][-1]
new_icon = "application://"+desktopfile
if arg == "a":
if not new_icon in curr_launcher:
curr_launcher.insert(0, new_icon)
subprocess.Popen(["gsettings", "set", key,"favorites",str(curr_launcher)])
elif arg == "r":
curr_launcher.remove(new_icon)
subprocess.Popen(["gsettings", "set", key,"favorites",str(curr_launcher)])
# --- end section
def create_launcher(w, scriptname, icon):
launcher = ["[Desktop Entry]", "Type=Application",
"Exec=wmctrl -ia "+w, "Name="+scriptname, "Icon="+icon,
"StartupNotify=False"]
with open(l_name, "wt") as newlauncher:
for l in launcher:
newlauncher.write(l+"\n")
def getname():
# create unique launcher name
n = 1
while True:
nm = os.path.join(curr, "scriptlauncher_"+str(n)+".desktop")
if os.path.exists(nm):
n += 1
else:
break
return nm
wlist1 = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines()]
subprocess.Popen(["gnome-terminal", "-e", script])
while True:
time.sleep(1)
wdata = get(["wmctrl", "-l"]).splitlines()
if wdata:
try:
wlist2 = [l.split()[0] for l in wdata]
w = [w for w in wlist2 if not w in wlist1][0]
except IndexError:
pass
else:
# check if the new window belongs to the terminal
if terminal in get(["xprop", "-id", w]):
# create launcher
l_name = getname()
create_launcher(w, scriptname, icon)
set_launcher(l_name, "a")
break
wlist1 = wlist2
while True:
time.sleep(2)
wdata = get(["wmctrl", "-l"])
if wdata:
if not w in wdata:
os.remove(l_name)
set_launcher(l_name, "r")
break
Nota
-
O que o ícone faz:
- Ele representa a janela
gnome-terminal
, executando seu script -
Ao clicar nele, ele aumenta a janela, como de costume. O comando para fazer isso é automaticamente adicionado ao lançador temporário:
wmctrl -ia <window_id>
- Ele representa a janela
-
O que ele faz não :
- A única desvantagem dessa solução é que o ícone não mostra a seta normal à esquerda para executar aplicativos, pois a representação é indireta.
Explicação
Sem entrar muito em detalhes:
- O script é um wrapper. Se você iniciar seu script via
showicon
, uma instância deshowicon
executará seu script em uma janelagnome-terminal
, semelhante aTerminal=true
. - Posteriormente,
showicon
aguarda a exibição da nova janelagnome-terminal
e lê seu ID de janela. -
Em seguida, um lançador temporário é criado, usando o id da janela para criar o comando para elevar a janela em sua linha
Exec=
. O ícone definido como argumento no comando para executarshowicon
é definido automaticamente como ícone desse ativador temporário (definido na linhaIcon=
).um exemplo de um lançador criado automaticamente (temporário):
[Desktop Entry] Type=Application Exec=wmctrl -ia 0x04400b7f Name=script2.sh Icon=/home/jacob/Thema/icon/ubu.png StartupNotify=False
-
Usando o mesmo procedimento de esta resposta , o lançador temporário é adicionado ao Unity Launcher, na posição superior, para representar seu script em execução.
- Enquanto isso,
showicon
verifica se a janela existe. Se não (mais), o lançador temporário é removido do iniciador Unity e removido da existência de todo , e a instânciashowicon
é finalizada.