Como altero permanentemente os títulos das janelas?

17

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 .desktoparquivo. Quais arquivos 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.

Maud Kon
fonte
Oi Maud. Adorei sua pergunta e ela levou a uma solução muito boa. No entanto, não consigo resistir a mencionar uma coisa a ter em mente para perguntas futuras: por favor, não mude drasticamente o significado da pergunta depois que as respostas forem postadas. Faz respostas, originalmente postadas adequadamente na primeira versão da pergunta, aparentemente fora de lugar na versão editada. Eu acho que foi o que realmente aconteceu com a minha resposta. Em vez disso, sugiro que você publique uma nova pergunta, mais especificamente na sua pergunta real, se repensar sua pergunta.
Jacob Vlijm
1
Entendo sua opinião e certamente o farei com perguntas futuras, pois posso ver como isso pode ser bastante confuso para as pessoas. Certamente não subestimo sua contribuição para o tópico, deixe isso claro. Eu queria que o título fosse mais específico, pois o título original não cobre minha pergunta real e suscita um pouco de incerteza sobre qual era meu objetivo com esse tópico. Obrigado pela ajuda! :)
Maud Kon

Respostas:

21

O nome inicial é geralmente definido pelo (código dentro) do próprio aplicativo. No entanto, você pode alterá-lo, por exemplo, usando o xdotoolque você precisaria instalar primeiro:

sudo apt-get install xdotool

Então, uma vez instalado, você pode definir outro nome de janela (por exemplo) pelo comando:

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

Isso vai mudar:

insira a descrição da imagem aqui

para dentro:

insira a descrição da imagem aqui

Nota

Como você pode ver, o comando existe de:

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

O <current_name>tem que corresponder exatamente.


Editar alternativamente

Pelo seu comentário, entendo que o comando acima não funcionou. Testei-o com diferentes aplicações e funcionou ...

Mas por uma razão que 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:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

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 alterar o código. Isso pode ser feito se o código estiver disponível, precisaria recompilar em muitos casos e depender do idioma usado, entre outras coisas. Uma instrução geral seria bastante impossível e além (fora) do escopo da UA na minha opinião.


EDIT 2

Gerenciar / definir com flexibilidade nomes de janelas personalizadas por aplicativo a partir de um único arquivo

Na sua pergunta original, você estava se perguntando se havia algum tipo de arquivo para definir o título das novas janelas de um aplicativo específico. Conforme explicado, esse não é o caso, no entanto, ele pode ser criado.

Na configuração abaixo, você pode definir muito facilmente em uma base por aplicativo como as novas janelas são nomeadas. Basta criar um arquivo em ~(seu diretório inicial), chamado window_names.txt. Para cada um dos aplicativos para os quais você deseja definir um nome de vento específico, adicione uma linha do subseqüente, o aplicativo 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

insira a descrição da imagem aqui

Explicação

A configuração existe de um script em segundo plano simples. O script é muito leve, portanto, não terá nenhum efeito perceptível no desempenho.

Depois que o script é iniciado, ele lê o arquivo ~/window_names.txte carrega as configurações por aplicativo. Em seguida, fica de olho nas janelas recém- criadas. Se aparecer uma janela que pertence a um dos aplicativos, definida no arquivo, ela define o nome da janela de acordo.

Como configurar

  1. O script usa ambos wmctrle xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como setwindowname.py

  3. Crie o arquivo ~/window_names.txt(exatamente nomeado window_names.txt), adicione seus aplicativos no formato:

    <application> <window_name>
    

    por exemplo

    gedit Text editor
    

    O nome da janela pode incluir espaços.

  4. Teste o script a partir do terminal, executando o comando:

    python3 /path/to/setwindowname.py
    
  5. Se tudo funcionar como esperado, adicione-o aos aplicativos de inicialização: Dash> Startup Applications> Add

    Observe que, em alguns casos, um script pode ser interrompido se iniciar quando a área de trabalho ainda não estiver totalmente carregada. Se esse for o caso, o comando a ser adicionado aos aplicativos de inicialização seria:

    /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.txtfor editado, o script precisará ser reiniciado.
  • Funciona não importa como um aplicativo é iniciado; também funciona quando aplicativos são executados a partir do terminal / e / ou com sudo.
  • Não interfere com a opção do botão direito de 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 vê a janela como uma "nova janela" e mantém o nome da janela de sua escolha.
Jacob Vlijm
fonte
Sinto muito, isso não funcionou para mim.
Maud Kon
xdotool search --name "Rhythmbox" set_window --name "Music" Fiz o comando com o aplicativo aberto, fechado e reiniciei (alt + f2 + r) para verificar se funcionava, mas ainda mostra o mesmo título da janela.
Maud Kon
Uau! Desta vez, estou realmente impressionado! Vou experimentá-lo logo de manhã. Devo dizer, isso parece muito promissor :) obrigado por seu trabalho duro e postar isso, Jacob!
Maud Kon
Eu tentei o script exatamente como você disse, mas não funciona. É possível que isso não funcione com o GNOME 3.16 ou deve ser algo na minha configuração? Estou intrigado com isso agora e espero fazê-lo funcionar no meu sistema. Se eu descobrir o motivo pelo qual ele ainda não funciona, retornarei o mais rápido possível.
Maud Kon
1
@MaudKon Você deve ter editado o arquivo de configurações e adicionado acidentalmente uma ou mais linhas brancas, provavelmente no final. Eu "imunizei" o roteiro para isso. Você pode usar como muitos Whitelines que quiser agora :)
Jacob Vlijm
9

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


Alterando o título de um aplicativo, uma vez aberto:

  • Instale xdotoolcomsudo apt-get install xdotool
  • Obtenha o pid da aplicação com pgrep myapp(ie pgrep rythmbox)
  • Altere o título da janela (substituindo HERE_THE_PIDpela identificação 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-titlecom 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 executável com chmod a+x change-title

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

Para tornar a alteração permanente:

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

    Exec=rhythmbox %U
    
  • Substitua-o por este pelo nome do arquivo criado:

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

Para efetivar a alteração na função "abrir com"

  • Corre gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Mude rhythmboxpara o nome usado no arquivo .desktop anterior.
  • Salve o arquivo.
  • Mate 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 /usr/share/applicationsao concluir:

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

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

  2. rhythmbox.desktop

    com Exec=rhythmbox %UeHidden=true

  3. rhythmbox-device.desktop

    com Exec=music --select-source %Ue SEM a entrada Oculta

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

  1. E você deve ter o script bash, é /usr/local/binclaro.

Notas finais:

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

    1. $@ é uma matriz que armazena todos os parâmetros posicionais.
    2. ${@:2}significa: Todos os parâmetros posicionais, exceto o primeiro
    3. Digamos que chamo um programa dessa maneira:

      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: http://wiki.bash-hackers.org/scripting/posparams
Helio
fonte
Eu tentei as duas maneiras (também a aqui embaixo) e seu script bash funciona parcialmente. Ele lança uma nova janela com o novo nome, mas se eu o iniciar novamente da visão geral, ele ainda terá a entrada antiga ... estou fazendo algo errado?
Maud Kon
@MaudKon: Qual é a visão geral? Experimente o script agora. Se você chamar "Visão geral" no painel (painel grande com muitos aplicativos), direi que meu script não faz uma alteração permanente.
Helio
Quero dizer a visão geral dos aplicativos, eu já escondi o próprio traço, haha. Hmm, sim, o seu script funciona. Existe alguma maneira de tornar a mudança permanente? Como editar um arquivo executável com fx. GHex? Ou alterando o executável no arquivo .desktop?
Maud Kon
Tente agora. Use o novo script e siga o método na seção Para tornar a alteração permanente . Agora eu entendi que você está fazendo uma camuflagem do seu Ubuntu ;-)
Helio
1
@Helio Atualizei sua postagem com as etapas que funcionaram para mim. Também adicionei o processo para fazer a função "abrir com" funcionar.
Maud Kon
2

Basta usar o arquivo de tradução!

Corri para este mesmo problema desafio com Thunar: Tornou-se irritante quando Compiz Escala exibido o título da janela Thunar como "AnyFolder - Gerenciador de Arquivos" e espaço consumida com informações desnecessárias.

Tentei as maneiras acima mencionadas com xdotoole wmctrlmas elas não eram permanentes, pois Thunar altera o título da janela toda vez que vou para outra pasta. E parecia exagerado ter um script em segundo plano para mudar o título de volta toda vez que Thunar o altera.

Uma solução mais fácil foi usar o arquivo de tradução que acompanha todos os aplicativos. Você simplesmente precisa recompilar o arquivo de origem da tradução com uma ferramenta chamada msgfmtincluída no gettextpacote. Eu apenas fiz isso pelo gThumb - apenas por diversão - e também funciona.

1. Obtenha o código fonte do aplicativo em questão.
Digite ou vá para http://packages.ubuntu.com , obtenha a fonte e procure uma pasta chamada : ela contém arquivos de linguagem em texto sem formatação. Procure seu idioma. Digamos que você é do Brasil, esse arquivo seria$ sudo apt-get source APPLICATIONpopt_BR.po

2. Altere o arquivo de acordo com suas necessidades
Procure o exato! título da janela que você deseja remover ou alterar. No caso do Thunar foi "Gerenciador de Arquivos" e pt_BR.poeu achei

:. 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 msgidestá o sinal que o aplicativo envia e para msgstronde o langpack o traduz.
Mude msgstrpara o que quiser, ou seja msgstr "o_-".
Aprendi que, se você deixar a tradução vazia dessa maneira, msgstr ""o aplicativo voltará para msgid. Se você quiser que esteja "vazio", use espaço em branco. Ou um ponto. Ou qualquer símbolo ASCII descolado.

3. Obtenha o compilador
Conforme mencionado, você precisa msgfmtdo gettextpacote, então precisa digitar
$ sudo apt-get install gettext

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

5. Coloque o arquivo Veja
como a tradução original em / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / ou / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / é nomeada e coloque seu arquivo lá. Se não existir nos dois lugares, coloque-o em um deles e experimente um pouco com o nome do arquivo: minúsculo, Camelcase ou algo do tipo, gthumb.moou seja, ou YOUR-APP.mo.
Faça um backup do original primeiro: depois copie sua nova tradução para lá
$ sudo cp /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo.BAK

$ sudo cp pt_BR.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo

Se o YOUR_APP estiver em execução, feche todas as instâncias.
Teste-o!

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

Fontes:
http://wiki.xfce.org/translations/translation_guidance_in_xfce

ronso0
fonte
Apenas para o registro; Duvido que você tenha tentado o script, pois ele mantém o nome, conforme mencionado na resposta.
27675 Jacob Vlijm
Você está certo, eu não tentei esse script, mas um semelhante (mais simples) de outro lugar, e os truques com xdotool e wmctrl. Como mencionado, para mim parece disparar pardais com um canhão, em comparação com a alteração de uma linha em um arquivo de origem. No entanto, pode-se aprender muito com os scripts.
perfil completo de ronso
Estou curioso para saber o que acontece se o aplicativo for atualizado. Os arquivos * .desktop e os arquivos de localização são substituídos?
perfil completo de ronso
Como explicado aqui askubuntu.com/a/703942/72216 , eu não compartilham a fobia para um script de fundo, se ele é bem escrito e não adicionar funcionalidade importante. Sobre .desktoparquivos: novamente, você deve confundir minha resposta com outra que possa ter lido. A resposta não edita .desktoparquivos e nenhuma ação é necessária quando um aplicativo é reinstalado.
27675 Jacob Vlijm
Essa foi uma pergunta geral, pois a resposta nº 2 modifica os .desktoparquivos e faço isso com os arquivos de tradução. Você conhece isso? E eu posso dar a QUALQUER solução de script uma segunda chance, já que agora li "mu__Incoming -", onde eu tinha "mu__Incoming - File Manager" . Para aplicativos que possuem um título estático de janela sem nenhum "caminho / para / pasta", minhas soluções funcionam bem.
ronso0
1

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

Como minha própria resposta usando o arquivo de tradução do aplicativo não foi suficiente para vários casos, desenvolvi a solução de Jacob Vlijm e modifiquei seu script para substituir certas strings nos títulos das janelas. Espero que esteja tudo bem em postar uma resposta separada. Os créditos vão para Jacob Vlijm pela idéia e pela configuração do script!

Por exemplo, eu gosto de ler em Some fancy websitevez de Some fancy website - Mozilla Firefox. O plug-in de escala do Compiz está muito mais claro agora, como também removi - File managere outras strings.

Alterações que fiz:

  1. use //como separador window_names.txtpara permitir espaços em branco
  2. use em wmctrlvez de xdotoolmodificar o título da janela (já que o xdotool não lida com 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 modificado window_names.txtestá estruturado da seguinte forma:
[process name]//[exact text to replace]//[replacement text]

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

O script aprimorado:

#!/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 idéia e configuração do script!

ronso0
fonte