Comment modifier définitivement les titres des fenêtres?


17

Quels fichiers sont impliqués dans la génération du titre de la fenêtre? Par exemple, si vous ouvrez Rhythmbox, vous voyez le nom du programme comme le titre de la fenêtre. Mais il n'est pas généré par le .desktopfichier. Quel (s) fichier (s) dois-je modifier pour ajouter du texte au titre d'une application? Je veux que les changements soient permanents

J'utilise Ubuntu GNOME 15.04 avec GNOME 3.16.


Salut Maud. J'ai adoré votre question, et elle a conduit à une très belle solution. Je ne peux cependant pas résister à mentionner une chose à garder à l'esprit pour les questions futures: veuillez ne pas changer radicalement le sens de la question après que les réponses ont été postées. Il rend les réponses, initialement correctement affichées sur la première version de la question, apparemment mal placées sur la version éditée. Je pense que c'est ce qui s'est réellement passé avec ma réponse. Je suggérerais plutôt de poster une nouvelle question, plus spécifiquement à votre vraie question si repensez votre question.
Jacob Vlijm

1
Je comprends votre opinion et je le ferai certainement avec les questions futures car je peux voir comment cela peut être assez déroutant pour les gens. Je ne sous-estime certainement pas votre contribution au fil, que ce soit clair. Je voulais que le titre soit plus précis car le titre original ne couvrait pas réellement ma vraie question et soulevait un peu d'incertitude quant à mon objectif avec ce fil. Merci de votre aide! :)
Maud Kon

Réponses:


21

Le nom initial est généralement défini par le (code dans) l'application elle-même. Vous pouvez cependant le modifier, par exemple en utilisant xdotool, que vous devrez d'abord installer:

sudo apt-get install xdotool

Ensuite, une fois installé, vous pouvez définir un autre nom de fenêtre par (par exemple) la commande:

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

Cela va changer:

entrez la description de l'image ici

dans:

entrez la description de l'image ici

Remarque

Comme vous pouvez le voir, la commande existe de:

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

Le <current_name>doit correspondre exactement.


Modifier alternativement

D'après votre commentaire, je comprends que la commande ci-dessus n'a pas fonctionné. Je l'ai testé avec différentes applications, et cela a fonctionné ...

Mais pour une raison que je ne comprends pas, PAS avec Rhytmbox(!! pourrait être un bug)

Une alternative est d'utiliser wmctrl, que vous devrez également installer:

sudo apt-get install wmctrl

Utilisez ensuite la commande:

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

Je l'ai testé avec succès sur Rhythmbox:

entrez la description de l'image ici

entrez la description de l'image ici

Rendre les changements permanents?

Comme mentionné, le nom de fenêtre par défaut est défini dans le code de l'application.

Changer le titre de la fenêtre par défaut devrait changer le code. Cela peut être fait si le code est disponible, aurait besoin d'être recompilé dans de nombreux cas et dépend, entre autres, de la langue utilisée. Une instruction générale serait tout à fait impossible et dépasserait (en dehors) la portée de l'UA à mon avis.


EDIT 2

Gérez / définissez de manière flexible les noms de fenêtre personnalisés par application à partir d'un seul fichier

Dans votre question d'origine, vous vous demandiez s'il existait une sorte de fichier pour définir le titre des nouvelles fenêtres d'une application spécifique. Comme expliqué, ce n'est pas le cas, cependant, il peut être créé.

Dans la configuration ci-dessous, vous pouvez très facilement définir sur une base par application comment les nouvelles fenêtres sont nommées. Créez simplement un fichier dans ~(votre répertoire personnel), nommé window_names.txt. Pour chacune des applications pour lesquelles vous souhaitez définir un nom de domaine spécifique, ajoutez une ligne, par la suite, l'application et le nom de fenêtre souhaité:

Un fichier texte, définissant les noms de fenêtres par application

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

entrez la description de l'image ici

Explication

La configuration existe d'un simple script d'arrière-plan. Le script est très léger, il n'aura donc aucun effet notable sur les performances.

Une fois que le script démarre, il lit le fichier ~/window_names.txtet charge les paramètres par application. Ensuite, il garde un œil sur les fenêtres nouvellement créées. Si une fenêtre apparaît qui appartient à l'une des applications, définie dans le fichier, elle définit le nom de la fenêtre en conséquence.

Comment installer

  1. Le script utilise à la fois wmctrlet xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous setwindowname.py

  3. Créez le fichier ~/window_names.txt(exactement nommé window_names.txt), ajoutez vos applications au format:

    <application> <window_name>
    

    par exemple

    gedit Text editor
    

    Le nom de la fenêtre peut inclure des espaces.

  4. Testez le script à partir du terminal par la commande:

    python3 /path/to/setwindowname.py
    
  5. Si tout fonctionne comme prévu, ajoutez-le aux applications de démarrage: Dash> Startup Applications> Add

    Notez que dans certains cas, un script peut se casser s'il démarre alors que le bureau n'est pas encore complètement chargé. Si cela pouvait être le cas, la commande à ajouter aux applications de démarrage serait:

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

Le 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

Remarques

  • Si le fichier ~/window_names.txtest modifié, le script doit être redémarré.
  • Cela fonctionne quelle que soit la façon dont une application est lancée; il fonctionne également lorsque les applications sont exécutées à partir du terminal / et ou avec sudo.
  • Il n'interfère pas avec l'option de clic droit de n'importe quelle application.
  • Le script "maintient" également le nom de la fenêtre; si un autre processus change le nom de la fenêtre par la suite (ouverture des onglets, modification des répertoires par exemple), le script voit la fenêtre comme une "nouvelle fenêtre" et conserve le nom de la fenêtre de votre choix.

Je suis désolé, cela n'a pas fonctionné pour moi.
Maud Kon

xdotool search --name "Rhythmbox" set_window --name "Music" J'ai fait la commande avec l'application ouverte, fermée et fait un redémarrage (alt + f2 + r) pour vérifier si cela fonctionnait, mais il montre toujours le même titre de fenêtre.
Maud Kon

Hou la la! Cette fois, je suis vraiment impressionné! Je vais essayer la première chose le matin. Je dois dire que cela a l'air très prometteur :) merci pour votre travail acharné et pour ce message, Jacob!
Maud Kon

J'ai essayé le script exactement comme vous l'avez dit, mais cela ne fonctionne pas. Est-il possible que cela ne fonctionne pas avec GNOME 3.16 ou devrait-il être quelque chose dans ma configuration? Je suis perplexe avec cela maintenant et j'espère que cela fonctionnera sur mon système. Si je trouve la raison pour laquelle il ne fonctionne pas encore, je vous répondrai dès que possible.
Maud Kon

1
@MaudKon Vous devez avoir édité le fichier de paramètres et ajouté une ou plusieurs lignes blanches sans le vouloir, probablement à la fin. J'ai "immunisé" le script pour ça. Vous pouvez utiliser autant de lignes blanches que vous le souhaitez maintenant :)
Jacob Vlijm

9

Le titre est généré par l'exécutable de l'application et il n'est pas facile de le modifier.


Changer le titre d'une application une fois ouverte:

  • Installer xdotoolavecsudo apt-get install xdotool
  • Obtenez le pid de l'application avec pgrep myapp(ie pgrep rythmbox)
  • Modifiez le titre de la fenêtre (en le remplaçant HERE_THE_PIDpar l'ID de processus de l'application):

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

Créer un script pour lancer une application avec un titre personnalisé:

  • Créez un script bash appelé change-titleavec ces contenus:

    #!/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
    
  • Rendez-le exécutable avec chmod a+x change-title

  • Exécutez-le avec ./change-title "NewTitle" theapp --its-arguments

Pour rendre le changement permanent:

  • Exécuter gksudo gedit /usr/local/bin/custom-title(fx. Utilisateur / local / bin / musique)
  • Dans l'éditeur de texte, collez le script ci-dessus et enregistrez-le.
  • Courir sudo chmod a+x /usr/local/bin/custom-title
  • Courir gksudo gedit /usr/share/applications/rhythmbox.desktop
  • Sur ce fichier, il y a une ligne (le numéro de ligne est 35 sur la mienne) qui dit:

    Exec=rhythmbox %U
    
  • Remplacez-le par ceci par le nom du fichier créé:

    Exec=custom title (fx. Exec=music)
    
  • Enregistrez le fichier sous un nouveau nom personnalisé.desktop fx. music.desktop. Attention à ne pas écraser le fichier d'origine!

Pour rendre le changement effectif pour la fonction "ouvrir avec"

  • Courir gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Modifiez rhythmboxle nom utilisé dans le fichier .desktop précédent.
  • Enregistrez le fichier.
  • Tuez les processus actifs de rhythmbox avec le moniteur système ou avec sudo kill rhythmbox
  • Branchez votre téléphone / lecteur de musique et appuyez sur "Ouvrir avec (application Musique)" pour voir si cela a fonctionné.

(Résumé) Aperçu des fichiers que vous devriez avoir

Pour rendre l'application entièrement fonctionnelle, vous devez avoir 3 fichiers .desktop une /usr/share/applicationsfois terminé:

  1. music.desktop ou le nom que vous avez donné à la demande

    avec Exec=musicet Hidden=true(ajouter le dernier s'il n'est pas présent)

  2. rhythmbox.desktop

    avec Exec=rhythmbox %UetHidden=true

  3. rhythmbox-device.desktop

    avec Exec=music --select-source %Uet SANS l'entrée cachée

Cela signifie que vous ouvrez toujours le dernier fichier et que le titre est toujours comme il se doit. La seule façon de se réinitialiser est lorsque vous actualisez votre session avec ALT + F2 + R.

  1. Et vous devriez avoir le script bash en cours /usr/local/bin.

Notes finales:

  • Lorsque j'utilise --name "\a\b\c"pour corriger un bogue , ne le remplacez pas par le nom de l'application!
  • Si vous décommentez la dernière ligne du script, le script ne se terminera pas tant que l'application ne sera pas fermée.
  • Explication de ${@:2}dans le code demandé par @Maud Kon :

    1. $@ est un tableau qui stocke tous les paramètres positionnels.
    2. ${@:2}signifie: Tous les paramètres de position sauf le premier
    3. Disons que j'appelle un programme de cette façon:

      awesome-program foo bar baz fooz
      
      • ${@:1} serait foo bar baz fooz
      • ${@:2} serait bar baz fooz
      • ${@:3} serait baz fooz
      • ${@:4} serait fooz
      • ${@:5} est vide car il n'y a plus de paramètres de position.
    4. $@, ${@}et ${@:1}sont la même chose: tous les paramètres de position.

    5. En savoir plus sur ce sujet ici: http://wiki.bash-hackers.org/scripting/posparams

J'ai essayé les deux manières (également celle ci-dessous) et votre script bash fonctionne partiellement. Il ouvre une nouvelle fenêtre avec le nouveau nom, mais si je le relance depuis l'aperçu, il a toujours l'ancienne entrée ... est-ce que je fais quelque chose de mal?
Maud Kon

@MaudKon: Quel est l'aperçu? Essayez le script maintenant. Si vous appelez «Aperçu» au tableau de bord (grand panneau avec de nombreuses applications), je vous dirai que mon script ne fait pas de changement permanent.
Helio

Je veux dire l'aperçu des applications, j'ai déjà caché le tiret lui-même, haha. Hmm, oui, votre script fonctionne. Est-il possible de rendre le changement permanent? Comme éditer un fichier exécutable avec fx. GHex? Ou changer l'exécutable dans le fichier .desktop?
Maud Kon

Essayez maintenant. Utilisez le nouveau script et suivez la méthode décrite dans la section Pour rendre la modification permanente . Maintenant j'ai compris que tu fais un camouflage de ton Ubuntu ;-)
Helio

1
@Helio J'ai mis à jour votre message avec les étapes qui ont fonctionné pour moi. J'ai également ajouté le processus pour faire fonctionner la fonction "Ouvrir avec".
Maud Kon

2

Utilisez simplement le fichier de traduction!

Je suis tombé sur ce problème très problématique avec Thunar: Cela est devenu ennuyeux lorsque Compiz Scale a affiché le titre de la fenêtre Thunar comme "AnyFolder - Gestionnaire de fichiers" et a consommé de l'espace avec des informations inutiles.

J'ai essayé les moyens mentionnés ci-dessus avec xdotoolet wmctrlmais ils n'étaient pas permanents car Thunar change le titre de sa fenêtre chaque fois que je vais dans un autre dossier. Et c'était exagéré d'avoir un script assis en arrière-plan pour changer le titre à chaque fois que Thunar le modifie.

Une solution plus simple a été d'utiliser le fichier de traduction fourni avec chaque application. Il vous suffit de recompiler le fichier source de traduction avec un outil appelé msgfmtinclus dans le gettextpackage. Je viens de le faire pour gThumb -juste pour le plaisir- et là ça marche aussi.

1. Obtenez le code source de l'application concernée.
Tapez ou rendez-vous sur http://packages.ubuntu.com , récupérez la source et recherchez un dossier appelé : il contient des fichiers en texte brut. Recherchez votre langue. Disons que vous êtes du Brésil, ce fichier serait$ sudo apt-get source APPLICATIONpopt_BR.po

2. Modifiez le fichier selon vos besoins
Recherchez l'exact! titre de la fenêtre que vous souhaitez supprimer ou modifier. Dans le cas de Thunar, c'était "File Manager" et pt_BR.poj'ai trouvé

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

msgidest le signal msgstrenvoyé par l'application et à quoi le langpack le traduit.
Changez msgstrpour ce que vous voulez, c'est-à-dire msgstr "o_-".
J'ai appris que si vous laissez la traduction vide comme celle-ci, msgstr ""l'application retombera msgid. Si vous voulez qu'il soit "vide", utilisez des espaces. Ou un point. Ou tout symbole ASCII génial.

3. Obtenez le compilateur
Comme mentionné, vous avez besoin msgfmtdu gettextpackage, vous devez donc taper
$ sudo apt-get install gettext

4. Compiler
Ouvrez un terminal, allez dans le dossier avec votre modification pt_BR.poet laissez msgfmt vérifier le fichier pour les erreurs:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Si ça va, allez-y et compilez-le:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Placer le fichier
Regardez comment la traduction originale dans / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / ou / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / est nommée et placez-y votre fichier. S'il n'existe pas aux deux endroits, mettez-le dans l'un d'eux et expérimentez un peu avec le nom du fichier: minuscule, Camelcase ou quelque chose comme, c'est gthumb.mo-à- dire ou YOUR-APP.mo.
Faites d'abord une copie de sauvegarde de l'original: copiez ensuite votre nouvelle traduction
$ 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 est en cours d'exécution, fermez-en toutes les instances.
Essaye-le!

Astuce Si vous utilisez Ubuntu avec la localisation EN comme je le suis, utilisez simplement n'importe quel * .po, supprimez ou commentez tous les couples msgid / msgstr inchangés et placez-le dans / usr / share / locale / en / LC_MESSAGES / .

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


Juste pour info; Je doute que vous ayez réellement essayé le script, car il conserve le nom, comme mentionné dans la réponse.
Jacob Vlijm

Vous avez raison, je n'ai pas essayé ce script mais un similaire (plus simple) d'ailleurs, et les astuces avec xdotool et wmctrl. Comme mentionné, pour moi, cela ressemble à tirer sur des moineaux avec un canon, par rapport à changer une ligne dans un fichier source. Néanmoins, on peut apprendre beaucoup des scripts.
ronso0

Je suis curieux de savoir ce qui se passe si l'application est mise à niveau. Les fichiers * .desktop et les fichiers de localisation sont-ils remplacés?
ronso0

Comme expliqué ici askubuntu.com/a/703942/72216 , je ne partage pas le fobia pour un script d'arrière - plan, s'il est bien écrit et n'ajouter des fonctionnalités importantes. À propos des fichiers: encore une fois, vous devez confondre ma réponse avec une autre que vous avez pu lire. La réponse ne modifie pas les fichiers et aucune action n'est nécessaire lors de la réinstallation d'une application. .desktop.desktop
Jacob Vlijm

C'était une question générale car la réponse # 2 modifie les .desktopfichiers et je le fais avec les fichiers de traduction. Le savez-vous? Et je peux donner à N'IMPORTE QUELLE solution de script une seconde chance depuis que je lis maintenant ie "mu__Incoming -" où j'avais "mu__Incoming - File Manager" . Pour les applications qui ont un titre de fenêtre statique sans "chemin / vers / dossier", mes solutions fonctionnent bien.
ronso0

1

Remplacer (parties de) les titres de fenêtre par wmctrl

Étant donné que ma propre réponse en utilisant le fichier de traduction de l'application n'était pas suffisante pour plusieurs cas pour moi, j'ai construit sur la solution de Jacob Vlijm et modifié son script pour remplacer certaines chaînes dans les titres des fenêtres. J'espère que vous pouvez publier cette réponse séparément. Les crédits vont à Jacob Vlijm pour l'idée et la mise en place du script!

Par exemple, j'aime lire Some fancy websiteau lieu de Some fancy website - Mozilla Firefox. Le plugin d'échelle Compiz est beaucoup plus clair maintenant, car j'ai également supprimé - File manageret d'autres chaînes.

Modifications que j'ai apportées:

  1. utiliser //comme séparateur window_names.txtpour permettre les espaces blancs
  2. utilisez wmctrlau lieu de xdotoolpour modifier le titre de la fenêtre (car xdotool ne gère pas très bien les caractères non ASCII):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. quelques lignes supplémentaires dans le script pour faire le remplacement de chaîne, etc.

Le modifié window_names.txtest structuré comme ceci:
[process name]//[exact text to replace]//[replacement text]

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

Le 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

Encore une fois: les crédits vont à Jacob Vlijm pour l'idée et la mise en place du script!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.