Como faço para alterar permanentemente os títulos das janelas?

14

Quais arquivos estão envolvidos na geração do título da janela? Por exemplo, se você abrir o Rhythmbox, verá o nome do programa como o título da janela. Mas não é gerado pelo arquivo .desktop . Que arquivo (s) eu preciso editar para adicionar texto ao título de um aplicativo? Eu quero que as mudanças sejam permanentes

Eu uso o Ubuntu GNOME 15.04 com o GNOME 3.16.

    
por Maud Kon 21.05.2015 / 13:35

4 respostas

18

O nome inicial geralmente é definido pelo (código dentro) do próprio aplicativo. Você pode, no entanto, alterá-lo, por exemplo usando xdotool , que você teria que instalar primeiro:

sudo apt-get install xdotool

Depois de instalado, você pode definir outro nome de janela por (por exemplo) o comando:

xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"

Isso mudará:

para:

Nota

Como você pode ver, o comando existe de:

xdotool search --name "<current_name>" set_window --name "<new_name>"

O <current_name> precisa corresponder exatamente.

Editar alternativamente

Do seu comentário, eu entendo que o comando acima não funcionou. Eu testei com diferentes aplicações e funcionou ...

Mas por alguma razão eu não entendo, NÃO com Rhytmbox (!! pode ser um bug)

Uma alternativa é usar wmctrl , que você também teria que instalar:

sudo apt-get install wmctrl

Em seguida, use o comando:

xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"

Eu testei com sucesso em Rhythmbox :

Tornar as alterações permanentes?

Como mencionado, o nome da janela padrão é definido no código do aplicativo.

Alterar o título da janela padrão precisaria mudar o código. Isso pode ser feito se o código estiver disponível, precisaria ser recompilado em muitos casos e depende da linguagem usada, entre outras coisas. Uma instrução geral seria completamente impossível e além (fora) do âmbito da UA na minha opinião.

EDIT 2

Gerencie / defina de forma flexível os nomes das janelas personalizadas por aplicativo a partir de um único arquivo

Em sua pergunta original, você queria saber se havia algum tipo de arquivo para definir o título de novas janelas de um aplicativo específico. Como explicado, esse não é o caso, no entanto, pode ser criado.

Na configuração abaixo, você pode definir facilmente em uma base por aplicativo como as novas janelas são nomeadas. Simplesmente crie um arquivo em ~ (seu diretório pessoal), chamado window_names.txt . Para cada uma das aplicações para as quais você deseja definir um nome de usuário específico, adicione uma linha de, subsequenty, a aplicação e o nome da janela desejada:

Um arquivo de texto, definindo nomes de janelas por aplicativo

gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts

Explicação

Aconfiguraçãoexistedeumscriptdeplanodefundosimples.Oroteiroémuitoleve,entãonãoteránenhumefeitoperceptívelnodesempenho.

Quandooscriptéiniciado,elelêoarquivo~/window_names.txtecarregaasconfiguraçõesporaplicativo.Emseguida,eleficadeolhonasjanelasrecém-criadas.Seaparecerumajanelapertencenteaumadasaplicações,definidanoarquivo,eladefineonomedajaneladeacordo.

Comoconfigurar

  1. Oscriptusawmctrlexdotool:

    sudoapt-getinstallwmctrlsudoapt-getinstallxdotool
  2. Copieoscriptemumarquivovaziosalve-ocomosetwindowname.py

  3. Crieoarquivo~/window_names.txt(exatamentedenominadowindow_names.txt),adicioneseusaplicativosnoformato:

    <application><window_name>

    porexemplo,

    geditTexteditor

    Onomedajanelapodeincluirespaços.

  4. Testeoscriptapartirdoterminalpelocomando:

    python3/path/to/setwindowname.py
  5. Setudofuncionarconformeoesperado,adicione-oaosaplicativosdeinicialização:Dash>Aplicativosdeinicialização>Adicionar

    Observeque,emalgunscasos,umscriptpodeserinterrompidoseiniciadoquandoaáreadetrabalhoaindanãoestátotalmentecarregada.Seesseforocaso,ocomandoparaadicionaraosaplicativosdeinicializaçãoseria:

    /bin/bash-c"sleep 15&&python3 /path/to/setwindowname.py"
    

O script

#!/usr/bin/env python3
import subprocess
import time
import os

f = os.environ["HOME"]+"/"+"window_names.txt"

change = []
lines = open(f).read().splitlines()
for l in lines:
    try:
        change.append([l.split()[0], (" ").join(l.split()[1:])])
    except IndexError:
        pass

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
curr_1 = []

while True:
    try:
        curr_2 = get(["wmctrl", "-lp"]).splitlines()
        new = [w for w in curr_2 if not w in curr_1]
        for item in new:
            line = item.split(); pid = line[2]
            procs = get(["ps", "-e"]).splitlines()
            match = [l for l in procs if pid in l][0]
            for app in [app for app in change if app[0] in match]:
                subprocess.Popen(["xdotool", "set_window", "--name", app[1], line[0]])
        curr_1 = curr_2
        time.sleep(0.3)
    except:
        pass

Notas

  • Se o arquivo ~/window_names.txt for editado, o script precisará ser reiniciado.
  • Funciona independentemente de como um aplicativo é iniciado; também funciona quando as aplicações são executadas a partir do terminal / e ou com sudo .
  • Ele não interfere com a opção de clique com o botão direito do mouse em qualquer aplicativo.
  • O script também "mantém" o nome da janela; se outro processo alterar o nome da janela posteriormente (abrir guias, alterar diretórios, por exemplo), o script verá a janela como uma "nova janela" e manterá o nome da janela de sua escolha.
por Jacob Vlijm 21.05.2015 / 14:26
9

O título é gerado pelo executável do aplicativo e não há uma maneira fácil de editá-lo.

Alterando o título de um aplicativo depois de aberto:

  • Instale xdotool com sudo apt-get install xdotool
  • Obtenha o pid do aplicativo com pgrep myapp (por exemplo, pgrep rythmbox )
  • Altere o título da janela (substituindo HERE_THE_PID pelo id do processo do aplicativo):

    xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
    

Criando um script para iniciar qualquer aplicativo com um título personalizado:

  • Crie um script bash chamado change-title com este conteúdo:

    #!/bin/bash
    
    ## The new name of the window is the first argument passed to the script:
    new_name="${1}"
    
    ## application is all arguments but the first (the title)
    application=${@:2}
    
    ## Run the app in background and in quiet mode:
    $application &> /dev/null &
    
    ## Get the pid of the app:
    app_pid=$!
    
    ## Wait until the window appears:
    until xdotool search --onlyvisible --pid $app_pid &> /dev/null; do sleep 0.01; done
    
    ## Change the window name:
    xdotool \
             search \
                    --onlyvisible \
                    --pid $app_pid \
                    --name "\a\b\c" \
             set_window \
                    --name "$new_name"
    
    ## Comment this line to run the app in background:
    wait $app_pid
    
  • Torne-o executável com chmod a+x change-title

  • Executar com ./change-title "NewTitle" theapp --its-arguments

Para tornar a alteração permanente:

  • Executar gksudo gedit /usr/local/bin/custom-title (fx. usuário / local / bin / music)
  • No editor de texto, cole o script acima e salve-o.
  • Executar sudo chmod a+x /usr/local/bin/custom-title
  • Executar gksudo gedit /usr/share/applications/rhythmbox.desktop
  • Neste arquivo, há uma linha (o número da linha é 35 no meu) que diz:

    Exec=rhythmbox %U
    
  • Substitua por isso com o nome do arquivo criado:

    Exec=custom title (fx. Exec=music)
    
  • Salve o arquivo como um novo nome personalizado.desktop fx. music.desktop. Tenha cuidado para não sobrescrever o arquivo original!

Para tornar a alteração efetiva para a função "abrir com"

  • Executar gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Altere rhythmbox para o nome usado no arquivo .desktop anterior.
  • Salve o arquivo.
  • Mate os processos ativos do rhythmbox com o monitor do sistema ou com sudo kill rhythmbox
  • Conecte seu telefone / music player e pressione "Abrir com (aplicativo de música)" para ver se funcionou.

(Resumo) Visão geral dos arquivos que você deve ter

Para tornar o aplicativo totalmente funcional, você deve ter 3 arquivos .desktop em /usr/share/applications quando terminar:

  1. music.desktop ou o nome que você deu ao aplicativo

    com Exec=music e Hidden=true (adicione o último se não estiver presente)

  2. rhythmbox.desktop

    com Exec=rhythmbox %U e Hidden=true

  3. rhythmbox-device.desktop

    com Exec=music --select-source %U e SEM a entrada oculta

Isso significa que você sempre abre o último arquivo e o título é sempre como deveria. A única maneira de redefinir é quando você atualiza sua sessão com ALT + F2 + R.

  1. E você deve ter o script bash em /usr/local/bin ofcourse.

Notas finais:

  • Quando estou usando --name "\a\b\c" para corrigir um erro , não substitua o aplicativo nome!
  • Se você descomentar a última linha do script, o script não terminará até que o aplicativo seja fechado.
  • Explicação de ${@:2} no código solicitado por @Maud Kon :

    1. $@ é uma matriz que armazena todos os parâmetros posicionais.
    2. ${@:2} significa: Todos os parâmetros posicionais, mas o primeiro
    3. Digamos que eu chame um programa assim:

      awesome-program foo bar baz fooz
      
      • ${@:1} seria foo bar baz fooz
      • ${@:2} seria bar baz fooz
      • ${@:3} seria baz fooz
      • ${@:4} seria fooz
      • ${@:5} está vazio porque não há mais parâmetros posicionais.
    4. $@ , ${@} e ${@:1} são a mesma coisa: todos os parâmetros posicionais.

    5. Saiba mais sobre este tópico aqui: link
por Helio 13.04.2017 / 14:23
2

Apenas use o arquivo de tradução!

Eu me deparei com este desafio problem com Thunar: Ele ficou chato quando o Compiz Scale exibiu o título da janela Thunar como "AnyFolder - File Manager" e consumiu espaço com informações desnecessárias.

Eu tentei as formas mencionadas acima com xdotool e wmctrl , mas elas não eram permanentes, pois o Thunar muda o título da janela toda vez que eu vou para outra pasta. E parecia exagerado ter um roteiro em volta do fundo para mudar o título toda vez que Thunar o alterasse.

Uma solução mais fácil era usar o arquivo de tradução que acompanha cada aplicativo. Você simplesmente precisa recompilar o arquivo de origem da tradução com uma ferramenta chamada msgfmt incluída no pacote gettext . Eu só fiz isso por gThumb - apenas por diversão - e lá funciona também.

1. Obtenha o código fonte para o aplicativo em questão.
$ sudo apt-get source APPLICATION ou vá até o link , obtenha a fonte e procure por uma pasta chamada po : ela contém arquivos em linguagem de texto simples . Procure pela sua lingua. Vamos dizer que você é do Brasil, esse arquivo seria pt_BR.po

2. Altere o arquivo para suas necessidades
Procure o exato! título da janela que você quer se livrar ou mudar. No caso do Thunar, era "Gerenciador de Arquivos" e em pt_BR.po eu encontrei o

:. set window title
: ../thunar/thunar-window.c:3154 ../Thunar.desktop.in.in.h:3
: ../thunar/thunar-settings.desktop.in.h:1
msgid "File Manager"
msgstr "Gerenciador de arquivos"

onde msgid é o sinal que o aplicativo envia e msgstr do que o langpack traduz para. Altere msgstr para o que quiser, ou seja, msgstr "o_-" .
Aprendi que se você deixar a tradução vazia assim msgstr "" , o aplicativo voltará para msgid . Se você quiser que ele fique "vazio", use os espaços em branco. Ou um ponto Ou qualquer símbolo ASCII.

3. Obtenha o compilador
Como mencionado, você precisa de msgfmt de gettext package, então você precisa digitar $ sudo apt-get install gettext

4. Compilar
Abra um terminal, vá para a pasta com seu pt_BR.po alterado e deixe o msgfmt verificar o arquivo em busca de erros:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Se estiver tudo bem, vá em frente e compile:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Coloque arquivo
Veja como a tradução original em / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / ou / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / é denominada e coloque seu arquivo lá. Se ele não existir nos dois lugares, coloque-o em um deles e experimente um pouco com o nome do arquivo: letras minúsculas, pasta do Camel ou algo parecido, por exemplo, gthumb.mo ou YOUR-APP.mo .
Faça um backup do primeiro original:
$ sudo cp /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo.BAK
então copie sua nova tradução para lá $ sudo cp pt_BR.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo

Se o YOUR_APP estiver sendo executado, feche todas as instâncias dele.
Teste isso!

Dica Se você estiver executando o Ubuntu com localização EN como eu, apenas use qualquer * .po, exclua ou comente todos os pares de msgid / msgstr inalterados e coloque-os em / usr / share / locale / en / LC_MESSAGES / .

Fontes: link

    
por ronso0 19.12.2015 / 05:24
1

Substituir (partes de) títulos de janelas por wmctrl

Desde minha própria resposta usando o arquivo de tradução do aplicativo não foi suficiente para vários casos para mim, eu construí em < um href="https://askubuntu.com/a/626524/224347"> a solução de Jacob Vlijm e modificou seu script para substituir certas strings em títulos de janela. Espero que seja correto postar isso como uma resposta separada. Créditos vão para Jacob Vlijm pela ideia e configuração do roteiro!

Por exemplo, gosto de ler Some fancy website em vez de Some fancy website - Mozilla Firefox . O plugin de escala Compiz é muito mais claro agora, pois eu também removi - File manager e outras strings.

Alterações que fiz:

  1. use // como separador em window_names.txt para permitir espaços em branco
  2. use wmctrl em vez de xdotool para modificar o título da janela (já que o xdotool não manipula caracteres não-ASCII muito bem): wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. algumas linhas extras no script para fazer a substituição da string etc.

O window_names.txt modificado é estruturado assim:
[process name]//[exact text to replace]//[replacement text]

firefox// - Mozilla Firefox// (whitespace!)
thunar// - File Manager// ° xyz
gedit// - gedit// - 123

O roteiro pimped:

#!/usr/bin/env python3
import subprocess
import time
import os

f = os.environ["HOME"]+"window_names.txt"

change = []
lines = open(f).read().splitlines()
for l in lines:
    try:
        change.append(l.split("//"))
    except IndexError:
        pass

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
curr_1 = []

while True:
    try:
        curr_2 = get(["wmctrl", "-lp"]).splitlines()
        new = [w for w in curr_2 if not w in curr_1]

        for item in new:
            line = item.split(None, 4)
            winID = line[0] ; pid = line[2] ; currentTitle = line[4]
            procs = get(["ps", "-e"]).splitlines()
            match = [l for l in procs if pid in l][0]
            for app in [app for app in change if app[0] in match]:
                newTitle = str.replace(currentTitle, app[1], app[2])
                subprocess.Popen(["wmctrl", "-i", "-r", winID, "-N", newTitle])
        curr_1 = curr_2
        time.sleep(0.3)
    except:
        pass

Novamente: Os créditos vão para Jacob Vlijm pela ideia e pela criação do roteiro!

    
por ronso0 14.01.2016 / 20:46