Какие файлы участвуют в создании заголовка окна? Например, если вы откроете Rhythmbox, вы увидите название программы в качестве заголовка окна. Но он не генерируется файлом .desktop
. Какие файлы мне нужно отредактировать, чтобы добавить текст в заголовок приложения? Я хочу, чтобы изменения были постоянными
Я использую Ubuntu GNOME 15.04 с GNOME 3.16.
Первоначальное имя обычно задается (кодом внутри) самого приложения. Однако вы можете изменить его, например, используя 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>"
Команда
должна точно совпадать.
Как я понял из вашего комментария, вышеприведенная команда не сработала. Я тестировал ее с разными приложениями, и она работала...
Но по непонятной мне причине, а не с Rhytmbox
(!!)! может быть ошибкой)
Альтернативой является использование wmctrl
, которую также нужно будет установить:
sudo apt-get install wmctrl
Тогда используйте команду:
xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"
Я успешно протестировал ее на Rhythmbox
:
Как уже упоминалось, имя окна по умолчанию определено в коде приложения.
Для изменения заголовка окна по умолчанию необходимо изменить код. Это можно сделать , если код доступен, во многих случаях потребуется перекомпиляция и зависит, среди прочего, от используемого языка. Общая инструкция, на мой взгляд, была бы совершенно невозможна и выходила бы за рамки AU.
В своем оригинальном вопросе вы задавались вопросом, есть ли какой-то файл для установки заголовка новых окон конкретного приложения. Как было объяснено, это не так, однако можно создать.
В приведенной ниже настройке вы можете очень легко определить в базе для каждого приложения , как будут именоваться новые окна. Просто создайте файл в ~
(ваш домашний каталог) с именем window_names.txt
. Для каждого приложения, для которого Вы хотите задать конкретное имя, добавьте строку, подпоследовательность, приложение и желаемое имя окна:
Текстовый файл, определяющий имена окон для каждого приложения
gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts
Настройка существует в виде простого фонового скрипта. Сценарий очень легкий, поэтому он не будет иметь никакого заметного влияния на производительность.
Как только сценарий запускается, он считывает файл ~/window_names.txt
и загружает настройки для каждого приложения. Затем он следит за новыми созданными окнами ~/window_names.txt. Если появляется окно, которое принадлежит одному из приложений, определённых в файле, то оно устанавливает имя окна соответственно.
Скрипт использует как wmctrl
, так и xdotool
:
sudo apt-get install wmctrl
sudo apt-получить установку xdotool
Скопируйте скрипт в пустой файл, сохраните его как setwindowname.py
Создайте файл ~/window_names.txt
(с точным названием window_names.txt
), добавьте свои приложения в формате:
<приложение> .
например
gedit Текстовый редактор
Имя окна может содержать пробелы.
Тестировать запуск скрипта из терминала командой:
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-получить установку xdotool
pgrep myapp
(i. e. pgrep rythmbox
)Смена заголовка окна (замена HERE_THE_PID
на идентификатор процесса приложения):
xdotool search --onlyvisible --pid HERE_THE_PID - имя "\a\b\c" set_window - имя "$new_name".
Создание скрипта для запуска любого приложения с пользовательским названием:
Создание бэш-скрипта под названием изменение названия
с содержимым:
#!/бин/бэш
## Новое имя окна - это первый аргумент, переданный скрипту:
new_name="${1}"
## приложение - это все аргументы, кроме первого (заголовка).
приложение=${@:2}
## Запустите приложение в фоновом и тихом режиме:
$application &> /dev/null &
## Возьми пидорок приложения. ##
app_pid=$!
## Подождите, пока не появится окно:
пока не появится xdotool search --onlyvisible --pid $app_pid &> /dev/null; do sleep 0.01; done
## Измените имя окна:
xdotool \
поиск \
- только для просмотра \
--pid $app_pid \
- имя "\a\b\c" \
set_window \
--имя "$new_name"
## Прокомментируйте эту строку, чтобы запустить приложение в фоновом режиме:
wait $app_pid
Сделать его исполняемым с помощью chmod a+x 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=заголовок (fx. Exec=музыка)
Чтобы изменение вступило в силу для функции "открыть с"
gksudo gedit /usr/share/приложения/rhythmbox-device.desktop
rhythmbox
на имя, которое использовалось в предыдущем файле .desktop.sudo kill rhythmbox
(Итог) Обзор файлов, которые вы должны иметь
Для того, чтобы приложение стало полностью функциональным, у вас должно быть 3 . файлы рабочего стола в /usr/share/applications
по завершению:
music.desktop
или имя, которое вы дали приложению
с помощью Exec=music
и Hidden=true
(добавьте последний, если его нет)
rhythmbox. desktop
с Exec=ритмбокс %U
и Hidden=true
rhythmbox-device.desktop
с Exec=музыкальный --select-source %U
и БЕЗ скрытой записи
Это означает, что вы всегда открываете последний файл и заголовок всегда такой, какой должен быть. Единственный способ сброса - это когда вы обновляете сессию с помощью ALT+F2+R.
/usr/local/bin
, конечно.Заключительные замечания:
-название "\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}
- это одно и то же: все позиционные параметры.
Поскольку моего собственного ответа с использованием файла перевода приложения для меня было недостаточно для нескольких случаев, я опирался на решение Якоба Влайма и изменил свой сценарий, заменив определенные строки в заголовках окон. Надеюсь, можно опубликовать отдельный ответ. Авторы благодарны Джейкобу Влейму за идею и настройку скрипта!
Например, мне нравится читать Какой-то модный веб-сайт
вместо Какой-то модный веб-сайт - Mozilla Firefox
. Плагин Compiz scale стал намного понятнее, так как я также удалил - Диспетчер файлов
и другие строки.
Внесенные мной изменения:
//
в качестве разделителя в window_names .txt
, чтобы разрешить пробелы wmctrl
вместо xdotool
для изменения заголовка окна (поскольку xdotool не очень хорошо обрабатывает символы, отличные от ASCII): wmctrl -i -r [WindowIdentifier] -N 'new Title'
Измененный window_names.txt
структурирован как это:
[имя процесса] // [точный текст для замены] // [текст замены]
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
Опять же: за идею и настройку сценария заслуга Якоба Влайма!
Я столкнулся с этой проблемой с Thunar: это стало раздражать, когда Compiz Scale отображал заголовок окна Thunar как «AnyFolder - File Manager »и занял место ненужной информацией.
Я попробовал вышеупомянутые способы с xdotool
и wmctrl
, но они не были постоянными, поскольку Thunar меняет заголовок окна каждый раз, когда я иду в другую папку. И было преувеличением иметь скрипт, сидящий на заднем плане, чтобы возвращать заголовок каждый раз, когда Thunar изменяет его.
Более простым решением было использование файла перевода , который поставляется с каждым приложением. Вам просто нужно перекомпилировать исходный файл перевода с помощью инструмента под названием msgfmt
, включенного в пакет gettext
. Я сделал это для gThumb - просто для развлечения - и там тоже работает.
1. Получите исходный код соответствующего приложения.
Введите
$ sudo apt-get source APPLICATION
или перейдите на http://packages.ubuntu.com , получите исходный код и найдите папку с именем po
: он содержит файлы с открытым текстом. Ищите свой язык. Допустим, вы из Бразилии, этот файл будет pt_BR.po
2. Измените файл по своему усмотрению
Ищите точный! заголовок окна, от которого вы хотите избавиться или изменить.
В случае Thunar это был "Файловый менеджер" , а в 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. мес
.
Сначала сделайте резервную копию оригинала:
$ sudo cp /usr/share/locale/[1126902 providedYOUR_LANGUAGE[1126903 sizes/LC_MESSAGES/ Your-APP.mo / usr / share / locale / ВАШ_ЯЗЫК / LC_MESSAGES / ВАШ-APP.mo.BAK
затем скопируйте туда свой новый перевод
$ sudo cp pt_BR.mo / usr / share / locale / ВАШ_ЯЗЫК /LC_MESSAGES/YOUR-APP.mo
Если YOUR_APP работает, закройте все его экземпляры.
Test It!
Подсказка Если вы используете Ubuntu с локализацией EN, как и я, просто используйте любой * .po, удалите или закомментируйте все неизмененные пары msgid / msgstr из него и поместите его в / usr / share / locale / en / LC_MESSAGES / .
Источники:
http://wiki.xfce.org/translations/translation_guidance_in_xfce