Как навсегда изменить заголовки окон?

Какие файлы участвуют в создании заголовка окна? Например, если вы откроете Rhythmbox, вы увидите название программы в качестве заголовка окна. Но он не генерируется файлом .desktop. Какие файлы мне нужно отредактировать, чтобы добавить текст в заголовок приложения? Я хочу, чтобы изменения были постоянными

Я использую Ubuntu GNOME 15.04 с GNOME 3.16.

20
задан 22 May 2015 в 20:27

4 ответа

Первоначальное имя обычно задается (кодом внутри) самого приложения. Однако вы можете изменить его, например, используя xdotool, который сначала нужно установить:

sudo apt-get install xdotool

Затем, после установки, вы можете установить другое имя окна, например, командой:

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

Это изменит:

enter image description here

на:

enter image description here

Примечание

Как вы видите, команда существует из:

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:

enter image description here

enter image description here

Сделать изменения постоянными?

Как уже упоминалось, имя окна по умолчанию определено в коде приложения.

Для изменения заголовка окна по умолчанию необходимо изменить код. Это можно сделать , если код доступен, во многих случаях потребуется перекомпиляция и зависит, среди прочего, от используемого языка. Общая инструкция, на мой взгляд, была бы совершенно невозможна и выходила бы за рамки AU.


EDIT 2

Гибкое управление/установка пользовательских имен окон для каждого приложения из одного файла

В своем оригинальном вопросе вы задавались вопросом, есть ли какой-то файл для установки заголовка новых окон конкретного приложения. Как было объяснено, это не так, однако можно создать.

В приведенной ниже настройке вы можете очень легко определить в базе для каждого приложения , как будут именоваться новые окна. Просто создайте файл в ~ (ваш домашний каталог) с именем window_names.txt. Для каждого приложения, для которого Вы хотите задать конкретное имя, добавьте строку, подпоследовательность, приложение и желаемое имя окна:

Текстовый файл, определяющий имена окон для каждого приложения

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

enter image description here

Объяснение

Настройка существует в виде простого фонового скрипта. Сценарий очень легкий, поэтому он не будет иметь никакого заметного влияния на производительность.

Как только сценарий запускается, он считывает файл ~/window_names.txt и загружает настройки для каждого приложения. Затем он следит за новыми созданными окнами ~/window_names.txt. Если появляется окно, которое принадлежит одному из приложений, определённых в файле, то оно устанавливает имя окна соответственно.

Как настроить

  1. Скрипт использует как wmctrl, так и xdotool:

    sudo apt-get install wmctrl
    sudo apt-получить установку xdotool
    
  2. Скопируйте скрипт в пустой файл, сохраните его как setwindowname.py

  3. Создайте файл ~/window_names.txt (с точным названием window_names.txt), добавьте свои приложения в формате:

    <приложение> .
    

    например

     gedit Текстовый редактор
    

    Имя окна может содержать пробелы.

  4. Тестировать запуск скрипта из терминала командой:

    python3 /path/to/setwindowname.py.
    
  5. Если все работает так, как ожидается, добавьте его в приложения для запуска: 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.
  • Он не целых чисел с опцией правой кнопки мыши любого приложения .
  • Скрипт также "поддерживает" имя окна; если другой процесс изменяет имя окна после этого (открытие вкладок, изменение каталогов, например), скрипт видит окно как "новое окно" и поддерживает имя окна по вашему выбору.
21
ответ дан 22 May 2015 в 20:27

Заголовок генерируется исполняемым приложением, и редактировать его непросто.


Изменение заголовка приложения после его открытия:

  • Установка xdotool с помощью sudo apt-получить установку xdotool
  • Получить pid приложения с помощью 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=музыка)
    
  • Сохраните файл как новое пользовательское имя.desktop fx. music.desktop. Будьте осторожны, не перезаписывайте оригинальный файл!

Чтобы изменение вступило в силу для функции "открыть с"

  • Запустите gksudo gedit /usr/share/приложения/rhythmbox-device.desktop
  • Измените rhythmbox на имя, которое использовалось в предыдущем файле .desktop.
  • Сохраните файл.
  • Убейте активные процессы ритмбокса системным монитором или с помощью sudo kill rhythmbox
  • Подключите телефон/музыкальный плеер и нажмите "Открыть с (Музыкальное приложение)", чтобы посмотреть, работает ли оно.

(Итог) Обзор файлов, которые вы должны иметь

Для того, чтобы приложение стало полностью функциональным, у вас должно быть 3 . файлы рабочего стола в /usr/share/applications по завершению:

  1. music.desktop или имя, которое вы дали приложению

    с помощью Exec=music и Hidden=true (добавьте последний, если его нет)

  2. rhythmbox. desktop

    с Exec=ритмбокс %U и Hidden=true

  3. rhythmbox-device.desktop

    с Exec=музыкальный --select-source %U и БЕЗ скрытой записи

Это означает, что вы всегда открываете последний файл и заголовок всегда такой, какой должен быть. Единственный способ сброса - это когда вы обновляете сессию с помощью ALT+F2+R.

  1. И у вас должен быть скрипт bash в /usr/local/bin, конечно.

Заключительные замечания:

  • Когда я использую -название "\a\b\c", это чтобы исправить ошибку, не заменяйте на название приложения!
  • Если не комментировать последнюю строку скрипта, то скрипт не завершится до закрытия приложения.
  • Объяснение ${@:2} в коде, запрошенном @Maud Kon:

    1. $@ - это массив, в котором хранятся все параметры позиционирования.
    2. ${@:2} - это значит: Все параметры позиции, но первая
    3. Скажем так, я вызываю программу:

      awesome-program foo bar baz fooz
      
      • ${@:1} было бы foo bar baz fooz
      • ${@:2} было бы bar baz fooz
      • ${@@: 3} было бы baz fooz
      • ${@:4} было бы fooz
      • ${@:5} пустым, потому что нет больше позиционных параметров.
    4. $@, ${@} и ${@:1} - это одно и то же: все позиционные параметры.

    5. Узнайте больше об этой теме здесь: http://wiki.bash-hackers.org/scripting/posparams
10
ответ дан 22 May 2015 в 20:27

Замените (части) заголовки окон на wmctrl

Поскольку моего собственного ответа с использованием файла перевода приложения для меня было недостаточно для нескольких случаев, я опирался на решение Якоба Влайма и изменил свой сценарий, заменив определенные строки в заголовках окон. Надеюсь, можно опубликовать отдельный ответ. Авторы благодарны Джейкобу Влейму за идею и настройку скрипта!

Например, мне нравится читать Какой-то модный веб-сайт вместо Какой-то модный веб-сайт - Mozilla Firefox . Плагин Compiz scale стал намного понятнее, так как я также удалил - Диспетчер файлов и другие строки.

Внесенные мной изменения:

  1. использовать // в качестве разделителя в window_names .txt , чтобы разрешить пробелы
  2. , используйте wmctrl вместо xdotool для изменения заголовка окна (поскольку xdotool не очень хорошо обрабатывает символы, отличные от ASCII): wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. несколько дополнительных строк в скрипте для замены строки и т. Д.

Измененный 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

Опять же: за идею и настройку сценария заслуга Якоба Влайма!

1
ответ дан 23 May 2015 в 06:27
  • 1
    Вот то, что я получаю путем выполнения этого: jake@Bacon:~ $./Chemcraft.sh/home/jake/Chemcraft/Chemcraft: ошибка поиска символа:/home/jake/Chemcraft/Chemcraft: неопределенный символ: initPAnsiStrings – jnowat 21 August 2016 в 21:17

Просто используйте файл перевода!

Я столкнулся с этой проблемой с 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

2
ответ дан 23 May 2015 в 06:27
  • 1
    Ну, я управлял им для компиляции этого источника, но у меня есть только Ubuntu 16.04 с gcc 5.4, я должен был изменить следующие файлы: измененный: c ++/drivers/base/src/SickBufferMonitor.hh изменил: c ++/drivers/base/src/SickLIDAR.hh для добавления #include < unistd.h> – 0x0C4 24 August 2016 в 02:21

Другие вопросы по тегам:

Похожие вопросы: