Come posso cambiare in modo permanente i titoli delle finestre?


17

Quali file sono coinvolti nella generazione del titolo della finestra? Ad esempio, se apri Rhythmbox, vedi il nome del programma come titolo della finestra. Ma non è generato dal .desktopfile. Quali file devo modificare per aggiungere testo al titolo di un'applicazione? Voglio che le modifiche siano permanenti

Uso Ubuntu GNOME 15.04 con GNOME 3.16.


Ciao Maud. Ho adorato la tua domanda e ha portato a una soluzione molto bella. Non posso resistere tuttavia a menzionare una cosa da tenere a mente per le domande future: per favore non cambiare drasticamente il significato della domanda dopo che le risposte sono state pubblicate. Fornisce risposte, originariamente adeguatamente pubblicate sulla prima versione della domanda, apparentemente fuori posto sulla versione modificata. Penso che sia quello che è realmente successo con la mia risposta. Suggerirei invece di pubblicare una nuova domanda, più specificamente alla tua vera domanda se ripensi alla tua domanda.
Jacob Vlijm,

1
Capisco la tua opinione e certamente lo farò con domande future, in quanto posso vedere come può essere abbastanza confuso per le persone. Certamente non sottovaluto il tuo contributo alla discussione, sia chiaro. Volevo che il titolo fosse più specifico in quanto il titolo originale in realtà non copriva la mia vera domanda e sollevava un po 'di incertezza su quale fosse il mio obiettivo con questa discussione. Grazie per l'aiuto! :)
Maud Kon,

Risposte:


21

Il nome iniziale viene generalmente impostato dal (codice all'interno) dell'applicazione stessa. Puoi comunque modificarlo, ad esempio utilizzando xdotool, che dovresti prima installare:

sudo apt-get install xdotool

Quindi, una volta installato, è possibile impostare un altro nome di finestra tramite (ad esempio) il comando:

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

Questo cambierà:

inserisci qui la descrizione dell'immagine

in:

inserisci qui la descrizione dell'immagine

Nota

Come puoi vedere, esiste il comando di:

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

La <current_name>deve corrispondere esattamente.


Modifica in alternativa

Dal tuo commento, capisco che il comando sopra non ha funzionato. L'ho testato con diverse applicazioni e ha funzionato ...

Ma per un motivo che non capisco, NON con Rhytmbox(!! potrebbe essere un bug)

Un'alternativa è usare wmctrl, che dovresti anche installare:

sudo apt-get install wmctrl

Quindi utilizzare il comando:

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

L'ho testato con successo su Rhythmbox:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Rendere permanenti le modifiche?

Come accennato, il nome della finestra predefinito è definito nel codice dell'applicazione.

La modifica del titolo della finestra predefinita dovrebbe modificare il codice. Ciò può essere fatto se il codice è disponibile, dovrebbe essere ricompilato in molti casi e dipende, tra le altre cose, dalla lingua utilizzata. A mio avviso, un'istruzione generale sarebbe del tutto impossibile e al di là (al di fuori) dell'ambito di UA.


MODIFICA 2

Gestisci / imposta in modo flessibile nomi di finestre personalizzati per applicazione da un singolo file

Nella tua domanda originale, ti stavi chiedendo se esistesse una sorta di file per impostare il titolo di nuove finestre di un'applicazione specifica. Come spiegato, non è così, tuttavia, può essere creato.

Nell'impostazione di seguito, è possibile definire molto facilmente in base all'applicazione il nome di nuove finestre. Basta creare un file nella ~(directory home), denominato window_names.txt. Per ciascuna delle applicazioni per cui si desidera impostare un nome specifico del vento, aggiungere una riga, in seguito, l'applicazione e il nome della finestra desiderata:

Un file di testo che definisce i nomi delle finestre per applicazione

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

inserisci qui la descrizione dell'immagine

Spiegazione

L'installazione esiste di un semplice script in background. La sceneggiatura è molto leggera, quindi non avrà alcun effetto evidente sulla performance.

Una volta avviato, lo script legge il file ~/window_names.txte carica le impostazioni per applicazione. Quindi tiene d'occhio le finestre appena create. Se viene visualizzata una finestra che appartiene a una delle applicazioni, definita nel file, imposta di conseguenza il nome della finestra.

Come impostare

  1. Lo script utilizza sia wmctrle xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Copia lo script in un file vuoto salvalo come setwindowname.py

  3. Crea il file ~/window_names.txt(con il nome esatto window_names.txt), aggiungi le tue applicazioni nel formato:

    <application> <window_name>
    

    per esempio

    gedit Text editor
    

    Il nome della finestra può includere spazi.

  4. Esegui il test dello script dal terminale con il comando:

    python3 /path/to/setwindowname.py
    
  5. Se tutto funziona come previsto, aggiungilo alle applicazioni di avvio: Dash> Applicazioni di avvio> Aggiungi

    Si noti che in alcuni casi, uno script potrebbe interrompersi se si avvia quando il desktop non è ancora completamente caricato. In tal caso, il comando da aggiungere alle applicazioni di avvio sarebbe:

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

Il copione

#!/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

Appunti

  • Se il file ~/window_names.txtviene modificato, è necessario riavviare lo script.
  • Funziona indipendentemente da come viene avviata un'applicazione; funziona anche quando le applicazioni vengono eseguite dal terminale / e o con sudo.
  • Non interferisce con l'opzione di scelta rapida di qualsiasi applicazione.
  • Lo script "mantiene" anche il nome della finestra; se in seguito un altro processo modifica il nome della finestra (apertura delle schede, modifica delle directory, ad esempio) lo script vede la finestra come una "nuova finestra" e mantiene il nome della finestra desiderato.

Mi dispiace, questo non ha funzionato per me.
Maud Kon,

xdotool search --name "Rhythmbox" set_window --name "Music" Ho eseguito il comando con l'applicazione aperta, chiusa e ho fatto un riavvio (alt + f2 + r) per verificare se funzionava, ma mostra ancora lo stesso titolo della finestra.
Maud Kon,

Wow! Questa volta sono davvero impressionato! Ci proverò prima cosa al mattino. Devo dire che sembra molto promettente :) grazie per il tuo duro lavoro e per aver pubblicato questo, Jacob!
Maud Kon,

Ho provato la sceneggiatura esattamente come hai detto, ma non funziona. È possibile che non funzioni con GNOME 3.16 o dovrebbe essere qualcosa nella mia configurazione? Ci sto scervellando ora e spero che funzioni sul mio sistema. Se trovo il motivo per cui non funziona ancora, ti ricontatterò al più presto.
Maud Kon,

1
@MaudKon Devi aver modificato il file delle impostazioni e aggiunto involontariamente una o più linee bianche, probabilmente alla fine. Ho "immunizzato" la sceneggiatura per quello. Puoi usare tutte le linee bianche che vuoi ora :)
Jacob Vlijm,

9

Il titolo è generato dall'eseguibile dell'applicazione e non esiste un modo semplice per modificarlo.


Modifica del titolo di un'applicazione una volta aperta:

  • Installa xdotoolconsudo apt-get install xdotool
  • Ottieni il pid dell'applicazione con pgrep myapp(es. pgrep rythmbox)
  • Cambia il titolo della finestra (sostituendolo HERE_THE_PIDcon l'id di processo dell'applicazione):

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

Realizzare uno script per avviare qualsiasi applicazione con un titolo personalizzato:

  • Crea uno script bash chiamato change-titlecon questi contenuti:

    #!/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
    
  • Renderlo eseguibile con chmod a+x change-title

  • Eseguilo con ./change-title "NewTitle" theapp --its-arguments

Per rendere permanente la modifica:

  • Esegui gksudo gedit /usr/local/bin/custom-title(fx. Utente / locale / bin / musica)
  • Nell'editor di testo incollare lo script sopra e salvarlo.
  • Correre sudo chmod a+x /usr/local/bin/custom-title
  • Correre gksudo gedit /usr/share/applications/rhythmbox.desktop
  • In questo file, c'è una riga (il mio numero di riga è 35 sul mio) che dice:

    Exec=rhythmbox %U
    
  • Sostituiscilo con questo con il nome del file creato:

    Exec=custom title (fx. Exec=music)
    
  • Salvare il file come nuovo custom-name.desktop fx. music.desktop. Fai attenzione a non sovrascrivere il file originale!

Per rendere effettiva la modifica per la funzione "Apri con"

  • Correre gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Passa rhythmboxal nome usato nel precedente file .desktop.
  • Salva il file.
  • Uccidi i processi attivi di rhythmbox con il monitor di sistema o con sudo kill rhythmbox
  • Collega il tuo telefono / lettore musicale e premi "Apri con (Applicazione musica)" per vedere se ha funzionato.

(Riepilogo) Panoramica dei file che dovresti avere

Per rendere l'applicazione completamente funzionale, dovresti avere 3 file .desktop al /usr/share/applicationstermine:

  1. music.desktop o il nome che hai dato alla domanda

    con Exec=musice Hidden=true(aggiungi l'ultimo se non presente)

  2. rhythmbox.desktop

    con Exec=rhythmbox %UeHidden=true

  3. rhythmbox-device.desktop

    con Exec=music --select-source %Ue SENZA la voce Nascosta

Ciò significa che si apre sempre l'ultimo file e il titolo è sempre come dovrebbe. L'unico modo per ripristinare è se stesso è quando si aggiorna la sessione con ALT + F2 + R.

  1. E dovresti avere lo script bash /usr/local/binovviamente.

Note finali:

  • Quando sto usando --name "\a\b\c"è per correggere un bug , non sostituirlo con il nome dell'applicazione!
  • Se si decommenta l'ultima riga dello script, lo script non terminerà fino alla chiusura dell'app.
  • Spiegazione ${@:2}nel codice richiesto da @Maud Kon :

    1. $@ è un array che memorizza tutti i parametri posizionali.
    2. ${@:2}significa: tutti i parametri posizionali tranne il primo
    3. Diciamo che chiamo un programma in questo modo:

      awesome-program foo bar baz fooz
      
      • ${@:1} sarebbe foo bar baz fooz
      • ${@:2} sarebbe bar baz fooz
      • ${@:3} sarebbe baz fooz
      • ${@:4} sarebbe fooz
      • ${@:5} è vuoto perché non ci sono più parametri posizionali.
    4. $@, ${@}E ${@:1}sono la stessa cosa: Tutti i parametri posizionali.

    5. Ulteriori informazioni su questo argomento qui: http://wiki.bash-hackers.org/scripting/posparams

Ho provato entrambi i modi (anche quello qui sotto) e il tuo script bash funziona parzialmente. Avvia una nuova finestra con il nuovo nome, ma se lo riavvio dalla panoramica, ha ancora la vecchia voce ... sto facendo qualcosa di sbagliato?
Maud Kon,

@MaudKon: qual è la panoramica? Prova subito lo script. Se chiami "Panoramica" sul trattino (pannello grande con molte app), ti dirò che il mio script non apporta modifiche permanenti.
Helio,

Intendo la panoramica delle applicazioni, ho già nascosto il trattino stesso, ahah. Hmm, sì, la tua sceneggiatura funziona. Esiste un modo per rendere permanente la modifica? Come modificare un file eseguibile con FX. GHex? O cambiando l'eseguibile nel file .desktop?
Maud Kon,

Prova ora. Utilizzare il nuovo script e seguire il metodo nella sezione Per rendere permanente la modifica . Ora ho capito che stai mimetizzando il tuo Ubuntu ;-)
Helio,

1
@Helio ho aggiornato il tuo post con i passaggi che hanno funzionato per me. Ho anche aggiunto il processo per far funzionare la funzione "Apri con".
Maud Kon,

2

Usa il file di traduzione!

Ho incontrato questa problematica sfida con Thunar: è diventato fastidioso quando Compiz Scale ha visualizzato il titolo della finestra di Thunar come "AnyFolder - File Manager" e ha raccolto spazio con informazioni non necessarie.

Ho provato i modi sopra menzionati con xdotoole wmctrlma non erano permanenti poiché Thunar cambia il titolo della finestra ogni volta che vado in un'altra cartella. Ed è stato esagerato avere una sceneggiatura in background per cambiare il titolo ogni volta che Thunar lo modifica.

Una soluzione più semplice era quella di utilizzare il file di traduzione fornito con ogni applicazione. Devi semplicemente ricompilare il file di origine della traduzione con uno strumento chiamato msgfmtincluso nel gettextpacchetto. L'ho appena fatto per gThumb -solo per divertimento- e anche lì funziona.

1. Ottieni il codice sorgente per l'applicazione interessata.
Digita o vai su http://packages.ubuntu.com , ottieni il sorgente e cerca una cartella chiamata : contiene file in linguaggio semplice. Cerca la tua lingua. Diciamo che sei brasiliano, quel file sarebbe$ sudo apt-get source APPLICATIONpopt_BR.po

2. Modifica il file in base alle tue esigenze
Cerca l'esatto! titolo della finestra che si desidera eliminare o modificare. Nel caso di Thunar era "File Manager" e pt_BR.poho trovato

:. 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"

dov'è msgidil segnale inviato dall'applicazione e in msgstrche cosa lo traduce langpack.
Passa msgstra quello che preferisci, ad es msgstr "o_-".
Ho imparato che se lasci la traduzione vuota in questo modo msgstr ""l'applicazione tornerà a msgid. Se vuoi che sia "vuoto" usa gli spazi bianchi. O un punto. O qualsiasi simbolo ASCII funky.

3. Ottieni il compilatore
Come indicato, è necessario msgfmtdal gettextpacchetto, quindi è necessario digitare
$ sudo apt-get install gettext

4. Compila
Apri un terminale, vai nella cartella con il tuo alterato pt_BR.poe lascia che msgfmt controlli il file per errori:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Se va bene, vai avanti e compila:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Posiziona il file
Guarda come viene tradotta la traduzione originale in / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / o / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / e inserisci il tuo file. Se non esiste in entrambi i posti, inseriscilo in uno di essi e sperimenta un po 'il nome del file: minuscolo, Camelcase o qualcosa del genere, ovvero gthumb.moo YOUR-APP.mo.
Prima fai un backup dell'originale: poi copia lì la tua nuova traduzione
$ 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 YOUR_APP è in esecuzione, chiuderne tutte le istanze.
Provalo!

Suggerimento Se stai eseguendo Ubuntu con la localizzazione EN come me, usa semplicemente * .po, elimina o commenta tutte le coppie di msgid / msgstr invariate e inseriscilo in / usr / share / locale / it / LC_MESSAGES / .

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


Solo per la cronaca; Dubito che tu abbia effettivamente provato la sceneggiatura, poiché mantiene il nome, come indicato nella risposta.
Jacob Vlijm,

Hai ragione, non ho provato questo script ma uno simile (più semplice) da qualche altra parte, e i trucchi con xdotool e wmctrl. Come accennato, per me è come sparare passeri con un cannone, rispetto al cambio di una riga in un file sorgente. Tuttavia, si può imparare molto dagli script.
ronso0

Sono curioso di sapere cosa succede se l'applicazione viene aggiornata. I file * .desktop e i file di localizzazione vengono sovrascritti?
ronso0

Come spiegato qui askubuntu.com/a/703942/72216 , non condivido la fobia per uno script di fondo, se è ben scritto e non aggiungere funzionalità importante. Informazioni sui .desktopfile: di nuovo, devi confondere la mia risposta con un'altra che potresti aver letto. La risposta non modifica i .desktopfile e non è necessaria alcuna azione quando viene reinstallata un'applicazione.
Jacob Vlijm,

Questa era una domanda generale poiché la risposta n. 2 modifica i .desktopfile e lo faccio con i file di traduzione. Lo sai? E potrei dare a QUALSIASI soluzione di script una seconda possibilità da quando ho letto, ad esempio, "mu__Incoming -" dove avevo "mu__Incoming - File Manager" . Per le applicazioni che hanno un titolo di finestra statico senza "percorso / cartella /" le mie soluzioni funzionano bene.
ronso0,

1

Sostituisci (parti di) i titoli delle finestre con wmctrl

Poiché la mia risposta usando il file di traduzione dell'applicazione non era sufficiente per diversi casi, ho sviluppato la soluzione di Jacob Vlijm e modificato la sua sceneggiatura per sostituire alcune stringhe nei titoli delle finestre. Spero che sia giusto pubblicare una risposta separata. I crediti vanno a Jacob Vlijm per l'idea e l'impostazione della sceneggiatura!

Ad esempio, mi piace leggere Some fancy websiteinvece di Some fancy website - Mozilla Firefox. Il plug-in di scala Compiz ora è molto più chiaro poiché ho rimosso anche - File manageraltre stringhe.

Modifiche che ho apportato:

  1. utilizzare //come separatore window_names.txtper consentire spazi bianchi
  2. usare wmctrlinvece di xdotoolmodificare il titolo della finestra (poiché xdotool non gestisce molto bene i caratteri non ASCII):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. alcune righe extra nello script per eseguire la sostituzione di stringhe ecc.

Il modificato window_names.txtè strutturato in questo modo:
[process name]//[exact text to replace]//[replacement text]

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

Lo script 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

Di nuovo: i crediti vanno a Jacob Vlijm per l'idea e l'impostazione della sceneggiatura!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.