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.
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:
dans:
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.
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
:
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.
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
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.
Le script utilise à la fois wmctrl
et xdotool
:
Sudo apt-get install wmctrl
Sudo apt-get install xdotool
Copiez le script dans un fichier vide, enregistrez-le sous le nom setwindowname.py
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.
Testez le script depuis le terminal à l'aide de la commande:
python3 /path/to/setwindowname.py
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"
#!/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
~/window_names.txt
est modifié, le script doit être redémarré.Sudo
.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:
xdotool
avec Sudo apt-get install xdotool
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
./change-title "NewTitle" theapp --its-arguments
Pour rendre la modification permanente:
gksudo gedit /usr/local/bin/custom-title
(fx. Utilisateur/local/bin/music)Sudo chmod a+x /usr/local/bin/custom-title
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)
Pour rendre la modification effective pour la fonction "Ouvrir avec"
gksudo gedit /usr/share/applications/rhythmbox-device.desktop
rhythmbox
par le nom utilisé dans le fichier .desktop précédent.Sudo kill rhythmbox
(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é:
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)
rhythmbox.desktop
avec Exec=rhythmbox %U
et Hidden=true
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.
/usr/local/bin
ofcourse.Notes finales:
--name "\a\b\c"
, il faut corriger n bogue , ne remplacez pas par le nom de l'application!Explication de ${@:2}
dans le code demandé par @ Maud Kon :
$@
est un tableau qui stocke tous les paramètres de position.${@:2}
signifie: Tous les paramètres de position sauf le premier 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.$@
, ${@}
et ${@:1}
sont la même chose: tous les paramètres de position.
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:
//
comme séparateur dans window_names.txt
pour autoriser les espaceswmctrl
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'
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!