¿Cómo cambio permanentemente los títulos de las ventanas?

17

¿Qué archivos están involucrados en la generación del título de la ventana? Por ejemplo, si abre Rhythmbox, verá el nombre del programa como el título de la ventana. Pero no es generado por el .desktoparchivo. ¿Qué archivo (s) necesito editar para agregar texto al título de una aplicación? Quiero que los cambios sean permanentes.

Yo uso Ubuntu GNOME 15.04 con GNOME 3.16.

Maud Kon
fuente
Hola maud Me encantó tu pregunta, y ha llevado a una solución muy agradable. Sin embargo, no puedo resistirme a mencionar una cosa a tener en cuenta para futuras preguntas: por favor, no cambie drásticamente el significado de la pregunta después de que se hayan publicado las respuestas. Hace respuestas, originalmente publicadas adecuadamente en la primera versión de la pregunta, aparentemente fuera de lugar en la versión editada. Creo que eso es lo que realmente sucedió con mi respuesta. En su lugar, sugeriría publicar una nueva pregunta, más específicamente a su pregunta real si reconsidera su pregunta.
Jacob Vlijm
1
Entiendo su opinión y ciertamente lo haré con futuras preguntas, ya que puedo ver cómo puede ser bastante confuso para las personas. Ciertamente no subestimo su contribución al hilo, que quede claro. Quería que el título fuera más específico ya que el título original en realidad no cubría mi pregunta real y generaba un poco de incertidumbre sobre cuál era mi objetivo con este hilo. ¡Gracias por tu ayuda! :)
Maud Kon

Respuestas:

21

El nombre inicial generalmente lo establece el (código dentro) de la propia aplicación. Sin embargo, puede cambiarlo, por ejemplo, mediante el uso xdotool, que primero deberá instalar:

sudo apt-get install xdotool

Luego, una vez que está instalado, puede configurar otro nombre de ventana mediante (por ejemplo) el comando:

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

Esto cambiará:

ingrese la descripción de la imagen aquí

dentro:

ingrese la descripción de la imagen aquí

Nota

Como puede ver, el comando existe de:

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

El <current_name>tiene que coincidir exactamente.


Editar alternativamente

Por su comentario, entiendo que el comando anterior no funcionó. Lo probé con diferentes aplicaciones, y funcionó ...

Pero por una razón que no entiendo, NO con Rhytmbox(¡podría ser un error!)

Una alternativa es usarla wmctrl, que también deberías instalar:

sudo apt-get install wmctrl

Luego usa el comando:

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

Lo probé con éxito en Rhythmbox:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

¿Hacer los cambios permanentes?

Como se mencionó, el nombre de la ventana predeterminada se define en el código de la aplicación.

Cambiar el título predeterminado de la ventana necesitaría cambiar el código. Eso se puede hacer si el código está disponible, sería necesario volver a compilar en muchos casos y depende del idioma utilizado, entre otras cosas. Una instrucción general sería bastante imposible y más allá (fuera) del alcance de AU en mi opinión.


EDITAR 2

Administre / configure de manera flexible nombres de ventanas personalizados por aplicación desde un solo archivo

En su pregunta original, se preguntaba si había algún tipo de archivo para establecer el título de nuevas ventanas de una aplicación específica. Como se explicó, ese no es el caso, sin embargo, se puede crear.

En la configuración a continuación, puede definir fácilmente en una base por aplicación cómo se nombran las nuevas ventanas. Simplemente cree un archivo en ~(su directorio de inicio), llamado window_names.txt. Para cada una de las aplicaciones para las que desea establecer un nombre de ventana específico, agregue una línea de subsecuencia, la aplicación y el nombre de ventana deseado:

Un archivo de texto que define los nombres de las ventanas por aplicación.

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

ingrese la descripción de la imagen aquí

Explicación

La configuración existe de un script de fondo simple. El guión es muy ligero, por lo que no tendrá ningún efecto notable en el rendimiento.

Una vez que se inicia el script, lee el archivo ~/window_names.txty carga la configuración por aplicación. Luego vigila las ventanas recién creadas. Si aparece una ventana que pertenece a una de las aplicaciones, definida en el archivo, establece el nombre de la ventana en consecuencia.

Como instalar

  1. El script usa ambos wmctrly xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Copie el script en un archivo vacío guárdelo como setwindowname.py

  3. Cree el archivo ~/window_names.txt(exactamente nombrado window_names.txt), agregue sus aplicaciones en el formato:

    <application> <window_name>
    

    p.ej

    gedit Text editor
    

    El nombre de la ventana puede incluir espacios.

  4. Pruebe y ejecute el script desde la terminal con el comando:

    python3 /path/to/setwindowname.py
    
  5. Si todo funciona como se esperaba, agréguelo a las aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregar

    Tenga en cuenta que, en algunos casos, un script puede romperse si se inicia cuando el escritorio aún no está completamente cargado. Si ese fuera el caso, el comando para agregar a las aplicaciones de inicio sería:

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

La secuencia de comandos

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

  • Si el archivo ~/window_names.txtse edita, la secuencia de comandos debe reiniciarse.
  • Funciona sin importar cómo se inicie una aplicación; También funciona cuando las aplicaciones se ejecutan desde el terminal / o con sudo.
  • No interfiere con la opción de clic derecho de ninguna aplicación.
  • El script también "mantiene" el nombre de la ventana; Si otro proceso cambia el nombre de la ventana después (abrir pestañas, cambiar directorios, por ejemplo), el script ve la ventana como una "nueva ventana" y mantiene el nombre de la ventana que usted elija.
Jacob Vlijm
fuente
Lo siento, esto no funcionó para mí.
Maud Kon
xdotool search --name "Rhythmbox" set_window --name "Music" Hice el comando con la aplicación abierta, cerrada e hice un reinicio (alt + f2 + r) para verificar si funcionaba, pero aún muestra el mismo título de ventana.
Maud Kon
¡Guauu! ¡Esta vez estoy realmente impresionado! Lo intentaré a primera hora de la mañana. Debo decir que esto parece muy prometedor :) ¡gracias por tu arduo trabajo y por publicar esto, Jacob!
Maud Kon
Probé el guión exactamente como dijiste, pero no funciona. ¿Es posible que esto no funcione con GNOME 3.16 o debería ser algo en mi configuración? Ahora estoy desconcertando y espero que funcione en mi sistema. Si encuentro la razón por la que aún no funciona, me pondré en contacto con usted lo antes posible.
Maud Kon
1
@MaudKon Debe haber editado el archivo de configuración y haber agregado involuntariamente una o más líneas blancas, probablemente al final. "Inmunicé" el guión para eso. Puede usar tantas líneas blancas como desee ahora :)
Jacob Vlijm
9

El título es generado por el ejecutable de la aplicación y no hay una manera fácil de editarlo.


Cambiar el título de una aplicación una vez abierta:

  • Instalar xdotoolconsudo apt-get install xdotool
  • Obtenga el pid de la aplicación con pgrep myapp(es decir pgrep rythmbox)
  • Cambie el título de la ventana (reemplazando HERE_THE_PIDcon la identificación del proceso de la aplicación):

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

Hacer un script para iniciar cualquier aplicación con un título personalizado:

  • Cree un script bash llamado change-titlecon estos contenidos:

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

  • Ejecútalo con ./change-title "NewTitle" theapp --its-arguments

Para hacer el cambio permanente:

  • Ejecutar gksudo gedit /usr/local/bin/custom-title(fx. Usuario / local / bin / music)
  • En el editor de texto, pegue el script anterior y guárdelo.
  • correr sudo chmod a+x /usr/local/bin/custom-title
  • correr gksudo gedit /usr/share/applications/rhythmbox.desktop
  • En este archivo, hay una línea (el número de línea es 35 en la mía) que dice:

    Exec=rhythmbox %U
    
  • Reemplácelo con esto con el nombre del archivo creado:

    Exec=custom title (fx. Exec=music)
    
  • Guarde el archivo como un nuevo nombre personalizado.desktop fx. music.desktop. ¡Tenga cuidado de no sobrescribir el archivo original!

Para que el cambio sea efectivo para la función "abrir con"

  • correr gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Cambie rhythmboxal nombre utilizado en el archivo .desktop anterior.
  • Guarda el archivo.
  • Mata los procesos activos de rhythmbox con el monitor del sistema o con sudo kill rhythmbox
  • Conecte su teléfono / reproductor de música y presione "Abrir con (aplicación de música)" para ver si funciona.

(Resumen) Descripción general de los archivos que debe tener

Para que la aplicación sea completamente funcional, debe tener 3 archivos .desktop /usr/share/applicationscuando haya terminado:

  1. music.desktop o el nombre que le diste a la aplicación

    con Exec=musicy Hidden=true(agregue el último si no está presente)

  2. rhythmbox.desktop

    con Exec=rhythmbox %UyHidden=true

  3. rhythmbox-device.desktop

    con Exec=music --select-source %Uy SIN la entrada oculta

Esto significa que siempre abre el último archivo y el título es siempre como debería. La única forma en que se restablece es cuando actualiza su sesión con ALT + F2 + R.

  1. Y deberías tener el script bash por /usr/local/binsupuesto.

Notas finales

  • Cuando lo estoy usando --name "\a\b\c"es para corregir un error , ¡no lo reemplace con el nombre de la aplicación!
  • Si descomenta la última línea del script, el script no finalizará hasta que se cierre la aplicación.
  • Explicación del ${@:2}código solicitado por @Maud Kon :

    1. $@ es una matriz que almacena todos los parámetros posicionales.
    2. ${@:2}significa: todos los parámetros posicionales excepto el primero
    3. Digamos que llamo a un programa de esta manera:

      awesome-program foo bar baz fooz
      
      • ${@:1} sería foo bar baz fooz
      • ${@:2} sería bar baz fooz
      • ${@:3} sería baz fooz
      • ${@:4} sería fooz
      • ${@:5} está vacío porque no hay más parámetros posicionales.
    4. $@, ${@}y ${@:1}son lo mismo: todos los parámetros posicionales.

    5. Obtenga más información sobre este tema aquí: http://wiki.bash-hackers.org/scripting/posparams
Helio
fuente
He intentado ambos modales (también el de aquí abajo) y su script bash funciona parcialmente. Abre una nueva ventana con el nuevo nombre, pero si lo vuelvo a abrir desde la vista general, todavía tiene la entrada anterior ... ¿Estoy haciendo algo mal?
Maud Kon
@MaudKon: ¿Cuál es el resumen? Prueba el guión ahora. Si llama "Descripción general" al tablero (panel grande con muchas aplicaciones), le diré que mi script no hace un cambio permanente.
Helio
Me refiero a la descripción general de las aplicaciones, ya he ocultado el tablero, jaja. Hmm, sí, tu guión funciona. ¿Hay alguna forma de hacer que el cambio sea permanente? Como editar un archivo ejecutable con fx. GHex? ¿O cambiar el ejecutable en el archivo .desktop?
Maud Kon
Probar ahora. Use el nuevo script y siga el método en la sección Para hacer que el cambio sea permanente . Ahora entendí que estás haciendo un camuflaje de tu Ubuntu ;-)
Helio
1
@Helio Actualicé tu publicación con los pasos que me funcionaron. También agregué el proceso para hacer que la función "abrir con" funcione.
Maud Kon
2

¡Solo usa el archivo de traducción!

Me encontré con este problema muy problemático con Thunar: se volvió molesto cuando Compiz Scale mostraba el título de la ventana de Thunar como "AnyFolder - File Manager" y consumía espacio con información innecesaria.

Probé las formas mencionadas anteriormente con xdotooly wmctrlpero no fueron permanentes ya que Thunar cambia el título de su ventana cada vez que voy a otra carpeta. Y se sintió exagerado tener un guión sentado en el fondo para cambiar el título cada vez que Thunar lo altera.

Una solución más fácil fue usar el archivo de traducción que viene con cada aplicación. Simplemente necesita volver a compilar el archivo fuente de traducción con una herramienta llamada msgfmtincluida en el gettextpaquete. Acabo de hacer esto para gThumb -solo por diversión- y allí también funciona.

1. Obtenga el código fuente de la aplicación en cuestión.
Escriba o diríjase a http://packages.ubuntu.com , obtenga la fuente y busque una carpeta llamada : contiene archivos de texto sin formato. Busca tu idioma. Digamos que eres de Brasil, ese archivo sería$ sudo apt-get source APPLICATIONpopt_BR.po

2. Modifique el archivo según sus necesidades
¡Busque el exacto! título de la ventana que desea eliminar o cambiar. En el caso de Thunar fue "Administrador de archivos" y pt_BR.poencontré

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

dónde msgidestá la señal que envía la aplicación y a msgstrqué se traduce el langpack.
Cambia msgstra lo que quieras, es decir msgstr "o_-".
Aprendí que si dejas la traducción vacía así, msgstr ""la aplicación volverá a msgid. Si quiere que esté "vacío" use espacios en blanco. O un punto O cualquier símbolo funky ASCII.

3. Obtenga el compilador
Como se mencionó que necesita msgfmtdel gettextpaquete, por lo que debe escribir
$ sudo apt-get install gettext

4. Compilar
Abra una terminal, vaya a la carpeta con su alterado pt_BR.poy deje que msgfmt verifique si hay errores en el archivo:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Si está bien, continúe y compílelo:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Coloque el archivo Vea cómo se nombra
la traducción original en / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / o / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / y coloque su archivo allí. Si no existe en ambos lugares, colóquelo en uno de ellos y experimente un poco con el nombre del archivo: minúsculas, Camelcase o algo así, es decir, gthumb.moo YOUR-APP.mo.
Primero haga una copia de seguridad del original: luego copie su nueva traducción allí
$ 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

Si YOUR_APP se está ejecutando, cierre todas las instancias.
¡Pruébalo!

Sugerencia Si está ejecutando Ubuntu con la localización EN como yo, simplemente use cualquier * .po, elimine o comente todas las parejas msgid / msgstr que no hayan cambiado y póngalo en / usr / share / locale / en / LC_MESSAGES / .

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

ronso0
fuente
Para que conste; Dudo que haya probado el script, ya que mantiene el nombre, como se menciona en la respuesta.
Jacob Vlijm
Tienes razón, no probé este script sino uno similar (más simple) de otro lugar, y los trucos con xdotool y wmctrl. Como se mencionó, para mí se siente como disparar gorriones con un cañón, en comparación con cambiar una línea en un archivo fuente. Sin embargo, uno puede aprender mucho de los guiones.
ronso0
Tengo curiosidad por saber qué sucede si la aplicación se actualiza. ¿Se sobrescriben los archivos * .desktop y los archivos de localización?
ronso0
Como se explica aquí askubuntu.com/a/703942/72216 , no comparto la fobia de un guión de fondo, si está bien escrito y no añadir funcionalidad importante. Acerca de los .desktoparchivos: nuevamente, debe confundir mi respuesta con otra que haya leído. La respuesta no edita .desktoparchivos y no se necesita ninguna acción cuando se reinstala una aplicación.
Jacob Vlijm
Esta fue una pregunta general ya que la respuesta # 2 modifica los .desktoparchivos y lo hago con los archivos de traducción. ¿Lo sabes? Y puedo darle a CUALQUIER solución de script una segunda oportunidad ya que ahora leí, por ejemplo, "mu__Incoming -" donde tenía "mu__Incoming - File Manager" . Para las aplicaciones que tienen un título de ventana estática sin ninguna "ruta / a / carpeta", mis soluciones funcionan bien.
ronso0
1

Reemplazar (partes de) títulos de ventanas con wmctrl

Dado que mi propia respuesta usando el archivo de traducción de la aplicación no fue suficiente para varios casos, desarrollé la solución de Jacob Vlijm y modifiqué su script para reemplazar ciertas cadenas en los títulos de las ventanas. Espero que esté bien publicar esta respuesta por separado. ¡Los créditos van a Jacob Vlijm por la idea y la configuración del guión!

Por ejemplo, me gusta leer en Some fancy websitelugar de Some fancy website - Mozilla Firefox. El complemento de escala Compiz es mucho más claro ahora, ya que también eliminé - File managery otras cadenas.

Cambios que hice:

  1. utilizar //como separador window_names.txtpara permitir espacios en blanco
  2. use en wmctrllugar de xdotoolmodificar el título de la ventana (ya que xdotool no maneja muy bien los caracteres no ASCII):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. algunas líneas adicionales en el script para hacer el reemplazo de la cadena, etc.

El modificado window_names.txtestá estructurado así:
[process name]//[exact text to replace]//[replacement text]

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

El guión proxeneta:

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

De nuevo: ¡Los créditos van a Jacob Vlijm por la idea y la configuración del guión!

ronso0
fuente