web-dev-qa-db-fra.com

Comment changer en permanence les titres de fenêtre?

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 titre de la fenêtre. Mais il n’est pas généré par le fichier .desktop. 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.

17
Maud Kon

Le nom initial est généralement défini par le (code au sein de) l'application elle-même. Vous pouvez cependant le changer, par exemple en utilisant xdotool, que vous devez installer en premier:

Sudo apt-get install xdotool

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

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

Cela va changer:

enter image description here

dans:

enter image description here

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 consiste à utiliser wmctrl, que vous devez également installer:

Sudo apt-get install wmctrl

Ensuite, utilisez la commande:

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

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

enter image description here

enter image description here

Rendre les changements permanents?

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

Changer le titre de la fenêtre par défaut nécessiterait de changer le code. Cela peut être fait si le code est disponible, nécessite souvent une recompilation et dépend de la langue utilisée, entre autres choses. Une instruction générale serait tout à fait impossible et, au-delà de la portée de l'UA, à mon avis.


EDIT 2

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

Dans votre question initiale, vous vous demandiez s'il existait une sorte de fichier permettant de 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 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 voulez définir un nom de fichier spécifique, ajoutez une ligne, l'application et le nom de la fenêtre suivante:

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

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

enter image description here

Explication

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

Une fois que le script a démarré, il lit le fichier ~/window_names.txt et charge les paramètres par application. Ensuite, il surveille les fenêtres nouvellement créées . Si une fenêtre apparaissant qui appartient à l'une des applications, définie dans le fichier, définit le nom de la fenêtre en conséquence.

Comment mettre en place

  1. Le script utilise à la fois wmctrl et xdotool:

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

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

    <application> <window_name>
    

    par exemple.

    gedit Text editor
    

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

  4. Testez le script depuis le terminal à l'aide de la commande:

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

    Notez que dans certains cas, un script peut être interrompu s’il démarre lorsque le poste de travail n’est pas encore entièrement chargé. Si tel est le cas, la commande à ajouter aux applications de démarrage serait:

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

Le scénario

#!/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.txt est modifié, le script doit être redémarré.
  • Cela fonctionne quelle que soit la manière dont une application est lancée. cela fonctionne également lorsque les applications sont exécutées à partir du terminal/et ou avec Sudo.
  • Cela n'interfère pas avec l'option de clic droit de toute application .
  • Le script "maintient" également le nom de la fenêtre; si un autre processus modifie le nom de la fenêtre par la suite (onglets d'ouverture, change de répertoire, par exemple), le script voit la fenêtre comme une "nouvelle fenêtre" et conserve le nom de la fenêtre de votre choix.
21
Jacob Vlijm

Le titre est généré par l'exécutable de l'application et il n'existe pas de moyen facile de l'éditer.


Modification du titre d'une application une fois celle-ci ouverte:

  • Installez xdotool avec Sudo apt-get install xdotool
  • Obtenez le pid de l'application avec pgrep myapp (i.e. pgrep rythmbox)
  • Changez le titre de la fenêtre (en remplaçant HERE_THE_PID par l'ID de processus de l'application):

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

Création d'un script pour lancer une application avec un titre personnalisé:

  • Créez un script bash appelé change-title avec le contenu suivant:

    #!/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 la modification permanente:

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

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

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

Pour rendre la modification effective pour la fonction "Ouvrir avec"

  • Exécutez gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Remplacez rhythmbox par le nom utilisé dans le fichier .desktop précédent.
  • Enregistrez le fichier.
  • Éliminez 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é) Vue d'ensemble des fichiers que vous devriez avoir

Pour rendre l'application entièrement fonctionnelle, vous devez avoir 3 fichiers .desktop dans /usr/share/applications lorsque vous avez terminé:

  1. music.desktop ou le nom que vous avez donné à l'application

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

  2. rhythmbox.desktop

    avec Exec=rhythmbox %U et Hidden=true

  3. rhythmbox-device.desktop

    avec Exec=music --select-source %U et SANS l'entrée masquée

Cela signifie que vous ouvrez toujours le dernier fichier et que le titre est toujours comme il se doit. Le seul moyen de se réinitialiser lui-même est lorsque vous actualisez votre session avec ALT + F2 + R.

  1. Et vous devriez avoir le script bash dans /usr/local/bin ofcourse.

Notes finales:

  • Lorsque j'utilise --name "\a\b\c", il faut corriger n bogue , ne 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 de position.
    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 pas 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
9
Helio

Remplacer (une partie de) les titres de fenêtre par wmctrl

Puisque ma propre réponse , utiliser le fichier de traduction de l'application ne suffisait pas dans plusieurs cas, j'ai donc utilisé solution de Jacob Vlijm et modifié son script pour remplacer certaines chaînes dans les titres de fenêtre. . J'espère que ça ira pour poster une réponse séparée. Crédits vont à Jacob Vlijm pour l'idée et la mise en place du script!

Par exemple, j'aime bien lire Some fancy website au lieu de Some fancy website - Mozilla Firefox. Le plugin scale Compiz est beaucoup plus clair maintenant que j'ai également supprimé - File manager et d'autres chaînes.

Changements apportés:

  1. utilisez // comme séparateur dans window_names.txt pour autoriser les espaces
  2. utilisez wmctrl au lieu de xdotool pour 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 remplacer la chaîne, etc.

Le window_names.txt modifié est structuré comme suit:
[process name]//[exact text to replace]//[replacement text]

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

Le script maquereau:

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

1
ronso0