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

Какие файлы участвуют в создании заголовка окна? Например, если вы откроете 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 и загружает настройки для каждого приложения. Затем он следит за вновь созданными окнами. Если появляется окно, которое принадлежит одному из приложений, определенных в файле, оно соответственно устанавливает имя окна.

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

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

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

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

    <application> <window_name>
    

    например

    gedit Text editor
    

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

  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,
  • Это не влияет на параметр правой кнопки мыши любого приложения.
  • Скрипт также "поддерживает" имя окна; если другой процесс впоследствии изменяет имя окна (например, открывая вкладки, меняя каталоги), сценарий видит окно как "новое окно" и сохраняет имя окна по вашему выбору.

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


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

  • устанавливать 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 когда закончено:

  1. music.desktop или имя, которое вы дали заявку

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

  2. rhythmbox.desktop

    с Exec=rhythmbox %U а также Hidden=true

  3. Rhythmbox-device.desktop

    с Exec=music --select-source %U и без скрытой записи

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

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

Финальные заметки:

  • Когда я использую --name "\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

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

Я столкнулся с этой очень сложной задачей с 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 и другие строки.

Изменения, которые я сделал:

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

Модифицированный 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

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

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