Как навсегда изменить заголовки окон?
Какие файлы участвуют в создании заголовка окна? Например, если вы откроете Rhythmbox, вы увидите название программы в качестве заголовка окна. Но это не генерируется .desktop
файл. Какие файлы мне нужно отредактировать, чтобы добавить текст в заголовок приложения? Я хочу, чтобы изменения были постоянными
Я использую Ubuntu GNOME 15.04 с GNOME 3.16.
4 ответа
Начальное имя обычно задается (кодом внутри) самого приложения. Однако вы можете изменить его, например, используя xdotool
, который вы должны будете установить в первую очередь:
sudo apt-get install xdotool
Затем, после его установки, вы можете установить другое имя окна с помощью (например) команды:
xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"
Это изменится:
в:
Заметка
Как видите, команда существует из:
xdotool search --name "<current_name>" set_window --name "<new_name>"
<current_name>
должен точно соответствовать.
Изменить альтернативно
Из вашего комментария я понимаю, что приведенная выше команда не сработала. Я проверил это с различными приложениями, и это сработало...
Но по причине, которую я не понимаю, НЕ с Rhytmbox
(!! может быть ошибка)
Альтернативой является использование wmctrl
, который вы также должны были бы установить:
sudo apt-get install wmctrl
Затем используйте команду:
xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"
Я успешно проверил это на Rhythmbox
:
Сделать изменения постоянными?
Как уже упоминалось, имя окна по умолчанию определяется в коде приложения.
Изменение заголовка окна по умолчанию должно изменить код. Это может быть сделано, если код доступен, во многих случаях потребуется перекомпиляция и, помимо прочего, это зависит от используемого языка. По моему мнению, общая инструкция была бы совершенно невозможной и выходящей за рамки AU.
РЕДАКТИРОВАТЬ 2
Гибкое управление / установка пользовательских имен окон для приложения из одного файла
В исходном вопросе вам было интересно, существует ли какой-нибудь файл для установки заголовка новых окон определенного приложения. Как объяснено, это не тот случай, однако, он может быть создан.
В приведенной ниже настройке вы можете очень легко определить для каждого приложения, как называются новые окна. Просто создайте файл в ~
(ваш домашний каталог), по имени window_names.txt
, Для каждого из приложений, для которого вы хотите задать определенное имя ветра, добавьте строку, затем, приложение и желаемое имя окна:
Текстовый файл, определяющий имена окон для приложения
gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts
объяснение
Установка существует из простого фонового скрипта. Сценарий очень легкий, поэтому он не окажет заметного влияния на производительность.
Как только скрипт запускается, он читает файл ~/window_names.txt
и загружает настройки для каждого приложения. Затем он следит за вновь созданными окнами. Если появляется окно, которое принадлежит одному из приложений, определенных в файле, оно соответственно устанавливает имя окна.
Как настроить
Скрипт использует оба
wmctrl
а такжеxdotool
:sudo apt-get install wmctrl sudo apt-get install xdotool
Скопируйте скрипт в пустой файл и сохраните его как
setwindowname.py
Создать файл
~/window_names.txt
(точно названныйwindow_names.txt
), добавьте ваши заявки в формате:<application> <window_name>
например
gedit Text editor
Имя окна может содержать пробелы.
Протестируйте скрипт из терминала командой:
python3 /path/to/setwindowname.py
Если все работает как положено, добавьте его в автозагрузку приложений: Dash > Startup Applications > Add
Обратите внимание, что в некоторых случаях сценарий может сломаться, если он запускается, когда рабочий стол еще не загружен полностью. Если это так, команда для добавления в автозагрузку приложений будет выглядеть так:
/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
отредактировано, скрипт необходимо перезапустить. - Это работает независимо от того, как приложение запускается; это также работает, когда приложения запускаются из терминала / и / или с
sudo
, - Это не влияет на параметр правой кнопки мыши любого приложения.
- Скрипт также "поддерживает" имя окна; если другой процесс впоследствии изменяет имя окна (например, открывая вкладки, меняя каталоги), сценарий видит окно как "новое окно" и сохраняет имя окна по вашему выбору.
Заголовок генерируется исполняемым файлом приложения, и его нелегко отредактировать.
Изменение названия приложения после его открытия:
- устанавливать
xdotool
сsudo apt-get install xdotool
- Получить pid приложения с
pgrep myapp
(т.е.pgrep rythmbox
) Изменить заголовок окна (замена
HERE_THE_PID
с идентификатором процесса приложения):xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
Создание скрипта для запуска любого приложения с произвольным заголовком:
Создайте скрипт bash с именем
change-title
с этим содержанием:#!/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
Сделайте его исполняемым с
chmod a+x change-title
- Запустить его с
./change-title "NewTitle" theapp --its-arguments
Чтобы сделать изменение постоянным:
- Бежать
gksudo gedit /usr/local/bin/custom-title
(fx. user/local/bin/music) - В текстовом редакторе вставьте вышеуказанный скрипт и сохраните его.
- Бежать
sudo chmod a+x /usr/local/bin/custom-title
- Бежать
gksudo gedit /usr/share/applications/rhythmbox.desktop
В этом файле есть строка (номер строки 35 у меня), которая говорит:
Exec=rhythmbox %U
Замените его на имя созданного файла:
Exec=custom title (fx. Exec=music)
- Сохраните файл как новый custom-name.desktop fx. music.desktop. Будьте осторожны, чтобы не перезаписать оригинальный файл!
Чтобы изменение вступило в силу для функции "открыть с"
- Бежать
gksudo gedit /usr/share/applications/rhythmbox-device.desktop
- + Изменить
rhythmbox
имя, использованное в предыдущем файле.desktop. - Сохраните файл.
- Убить активные процессы ритмбокса с системного монитора или с
sudo kill rhythmbox
- Подключите телефон / музыкальный проигрыватель и нажмите "Открыть с помощью (Музыкальное приложение)", чтобы увидеть, работает ли он.
(Резюме) Обзор файлов, которые вы должны иметь
Чтобы приложение полностью работало, у вас должно быть 3 файла.desktop в /usr/share/applications
когда закончено:
music.desktop
или имя, которое вы дали заявкус
Exec=music
а такжеHidden=true
(добавить последний, если его нет)rhythmbox.desktop
с
Exec=rhythmbox %U
а такжеHidden=true
Rhythmbox-device.desktop
с
Exec=music --select-source %U
и без скрытой записи
Это означает, что вы всегда открываете последний файл, а заголовок всегда такой, каким он должен быть. Единственный способ перезагрузить себя - это когда вы обновляете сессию ALT+F2+R.
- И вы должны иметь скрипт bash в
/usr/local/bin
конечно.
Финальные заметки:
- Когда я использую
--name "\a\b\c"
это исправить ошибку, а не заменять ее именем приложения! - Если вы раскомментируете последнюю строку скрипта, скрипт не завершится, пока приложение не будет закрыто.
Объяснение
${@:2}
в коде, запрошенном Maud Kon:$@
массив, в котором хранятся все позиционные параметры${@:2}
означает: все позиционные параметры, кроме первогоДопустим, я называю программу так:
awesome-program foo bar baz fooz
${@:1}
было быfoo bar baz fooz
${@:2}
было быbar baz fooz
${@:3}
было быbaz fooz
${@:4}
было быfooz
${@:5}
пусто, потому что нет больше позиционных параметров.
$@
,${@}
а также${@:1}
это одно и то же: все позиционные параметры.- Узнайте больше об этой теме здесь: http://wiki.bash-hackers.org/scripting/posparams
Просто используйте файл перевода!
Я столкнулся с этой очень сложной задачей с Thunar: это стало раздражать, когда Compiz Scale отображал заголовок окна Thunar как "AnyFolder - File Manager" и занимал место ненужной информацией.
Я пробовал вышеупомянутые способы сxdotool
а такжеwmctrl
но они не были постоянными, так как Thunar меняет заголовок окна каждый раз, когда я перехожу в другую папку. И было преувеличено иметь сценарий, сидящий на заднем плане, чтобы изменить название каждый раз, когда Тунар меняет его.
Более простым решением было использованиефайла перевода, который поставляется с каждым приложением. Вам просто нужно заново скомпилировать исходный файл перевода с помощью инструмента под названиемmsgfmt
включены вgettext
пакет. Я просто сделал это для gThumb - просто для удовольствия - и там это тоже работает.
1. Получить исходный код для соответствующего приложения.
Тип$ sudo apt-get source APPLICATION
или зайдите на http://packages.ubuntu.com/, найдите источник и найдите папку с именем po
: он содержит файлы с открытым текстом. Ищите свой язык. Допустим, вы из Бразилии, этот файл будетpt_BR.po
2. Измените файл в соответствии с вашими потребностями
Ищите точное! заголовок окна, от которого вы хотите избавиться или изменить. В случае с Тунаром это был"Файловый менеджер", а в pt_BR.po
я нашел
:. 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"
где
msgid
это сигнал, который приложение отправляет и msgstr
что переводит его в langpack. + Изменить
msgstr
на что угодно, т.е. msgstr "o_-"
, Я узнал, что если вы оставите перевод пустым, как это
msgstr ""
приложение вернется к msgid
, Если вы хотите, чтобы он был "пустым", используйте пробел. Или точка. Или любой символ в стиле фанк ASCII.3. Получить компилятор
Как уже упоминалось, вам нужно msgfmt
от gettext
пакет, поэтому вам нужно набрать$ sudo apt-get install gettext
4. Компилировать
Откройте терминал, перейдите в папку с вашими измененными pt_BR.po
и пусть msgfmt проверит файл на наличие ошибок:$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Если все хорошо, продолжайте и скомпилируйте это:$ msgfmt -c -o pt_BR.mo pt_BR.po
5. Поместите файл
Посмотрите, как назван оригинальный перевод в /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/ или /usr/share/locale-langpack/YOUR_LANGUAGE/LC_MESSAGES/, и разместите там свой файл. Если он не существует в обоих местах, поместите его в одно из них и немного поэкспериментируйте с именем файла: нижний регистр, Camelcase или что-то подобное, т.е. gthumb.mo
или же YOUR-APP.mo
,
Сначала сделайте резервную копию оригинала:$ 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
Если YOUR_APP запущен, закройте все его экземпляры.
Попробуй это!
Подсказка Если вы используете Ubuntu с EN-локализацией, как я, просто используйте любые *.po, удалите или закомментируйте все неизмененные пары msgid / msgstr из него и поместите в / usr / share / locale / en / LC_MESSAGES /.
Источники:
http://wiki.xfce.org/translations/translation_guidance_in_xfce
Заменить (части) заголовков окон на wmctrl
Так как моего собственного ответа с использованием файла перевода приложения было недостаточно для нескольких случаев, я опирался на решение Якоба Влиима и модифицировал его скрипт, чтобы заменить определенные строки в заголовках окон. Я надеюсь, что это нормально, чтобы опубликовать этот отдельный ответ. Кредиты идут к Якобу Влиму за идею и настройку сценария!
Например, я люблю читать Some fancy website
вместо Some fancy website - Mozilla Firefox
, Плагин Compiz Scale теперь намного понятнее, так как я также удалил - File manager
и другие строки.
Изменения, которые я сделал:
- использование
//
в качестве разделителя вwindow_names.txt
разрешить пробелы - использование
wmctrl
вместоxdotool
чтобы изменить заголовок окна (поскольку xdotool не очень хорошо обрабатывает символы, отличные от ASCII):wmctrl -i -r [WindowIdentifier] -N 'new Title'
- некоторые дополнительные строки в скрипте для замены строк и т. д.
Модифицированный window_names.txt
имеет следующую структуру:[process name]//[exact text to replace]//[replacement text]
firefox// - Mozilla Firefox// (whitespace!)
thunar// - File Manager// ° xyz
gedit// - gedit// - 123
Свернутый скрипт:
#!/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
Опять же: кредиты идут к Якобу Влейму за идею и настройку сценария!