Como posso dar a um script seu próprio ícone no iniciador do Unity?

5

Com o Ubuntu 16.04, se você criar um lançador (arquivo de desktop em ~/.local/share/applications ) com um ícone personalizado para um aplicativo de terminal (assim com Terminal=true ), quando ele for iniciado, ele gerará um novo ícone de terminal padrão e o seu ícone personalizado irá pulsar e desaparecer dentro de alguns segundos.

Em 14.04, funcionou como esperado. (não iniciaria um novo ícone de terminal padrão).

Alguma ideia do que fazer para mudar esse comportamento? Eu tenho alguns aplicativos de terminal que eu quero lançar da unidade e o novo comportamento é problemático (eu perco o rastro de qual é qual, já que todos eles acabam com o ícone do terminal padrão) ...

    
por Se6 20.06.2016 / 11:44

3 respostas

5

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 de . Este tem sido sempre o caso.

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:

Portanto,oquefuncionounopassadoemsuaconfiguração,bastacriaruminiciador,iniciarseuscript,nãoenganarmaisoUnityeescolherognome-terminallauncherexistentepararepresentarsuajanela.

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áexecutadodentrodeumajanelagnome-terminalrecé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.pngExecutandoocomando:

    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

  1. Oscriptprecisadewmctrl

    sudoapt-getinstallwmctrl
  2. Crie,seaindanãoexistir,odiretório~/bin

  3. Copieoscriptabaixoemumarquivovazio,salve-ocomoshowicon(semextensão)em~/binetorne-oexecutável
  4. Façalogoutevolte,suaconfiguraçãodevefuncionar.Testecomocomando

    showicon</path/to/script.sh></path/to/icon.png>

    paraquescript.shsejaexecutadoemumterminal,exibindoicon.pngnoiniciadordoUnity.

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>
      
  • 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 de showicon executará seu script em uma janela gnome-terminal , semelhante a Terminal=true .
  • Posteriormente, showicon aguarda a exibição da nova janela gnome-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 executar showicon é definido automaticamente como ícone desse ativador temporário (definido na linha Icon= ).

    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ância showicon é finalizada.
por Jacob Vlijm 21.06.2016 / 12:47
1

Outra não é resposta, mas solução.

Eu uso listas rápidas para criar lançadores para minhas sessões de terminal mais usadas, então eu faço perfis para cada um no gnome-terminal para fazer coisas como mudar suas cores, isso torna realmente fácil saber qual servidor você está usando.

Você pode fazer isso editando o arquivo gnome-terminal.desktop em ~ / .local / share / applications / gnome-terminal.desktop.

minha parece com isso

[Desktop Entry]
Name=Terminal
Comment=Use the command line
Keywords=shell;prompt;command;commandline;
TryExec=gnome-terminal
Exec=gnome-terminal
Icon=utilities-terminal
Type=Application
X-GNOME-DocPath=gnome-terminal/index.html
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-terminal
X-GNOME-Bugzilla-Component=BugBuddyBugs
X-GNOME-Bugzilla-Version=3.16.2
Categories=GNOME;GTK;System;TerminalEmulator;
StartupNotify=true
X-GNOME-SingleWindow=false
OnlyShowIn=GNOME;Unity;
Actions=New;Item1;Item2
X-Ubuntu-Gettext-Domain=gnome-terminal

[Desktop Action New]
Name=New Terminal
Exec=gnome-terminal
OnlyShowIn=Unity

[Desktop Action Item1]
Name=SSH Shell type 1
Exec=gnome-terminal -e 'ssh item1' --profile 'Item1'
OnlyShowIn=Unity


[Desktop Action Item2]
Name=SSH Shell type 2
Exec=gnome-terminal -e 'ssh item2' --profile 'Item2'
OnlyShowIn=Unity

Eu também escrevi um script há um tempo atrás para automatizar a adição de entradas à sua lista rápida a partir do arquivo hosts para que qualquer comando ssh obtenha uma entrada de lista rápida. Escrevi quando as listas rápidas não foram atualizadas automaticamente e desisti porque isso tornava desajeitado, agora elas são instantâneas e poderiam ser executadas por meio de um cron job.

link

    
por Amias 21.06.2016 / 13:04
0

Uma correção única seria escrever um pequeno programa executável que executasse seu script e atribuir um ícone de iniciador exclusivo ao executável.

    
por Michael Clayton 28.06.2016 / 03:06