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

17

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

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

Мод Кон
источник
Привет Мод. Мне понравился твой вопрос, и он привел к очень хорошему решению. Однако я не могу удержаться от того, чтобы упомянуть одну вещь, которую следует помнить для будущих вопросов: пожалуйста, не меняйте значение вопроса кардинально после публикации ответов. Он дает ответы, изначально адекватно размещенные в первой версии вопроса, на первый взгляд неуместные в отредактированной версии. Я думаю, что именно так и произошло с моим ответом. Я бы предложил вместо этого опубликовать новый вопрос, более конкретно на ваш реальный вопрос, если вы переосмыслите свой вопрос
Джейкоб Влейм
1
Я понимаю ваше мнение, и я, безусловно, сделаю это с будущими вопросами, поскольку я могу понять, как это может сбить людей с толку. Я конечно не недооцениваю ваш вклад в ветку, пусть это будет понятно. Я хотел, чтобы заголовок был более конкретным, поскольку исходный заголовок на самом деле не охватывал мой реальный вопрос и вызывал некоторую неуверенность в том, какова моя цель в этой теме. Спасибо за вашу помощь! :)
Мод Кон

Ответы:

21

Начальное имя обычно задается (кодом внутри) самого приложения. Однако вы можете изменить его, например, с помощью 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 search --name "Rhythmbox" set_window --name "Music" Я выполнил команду с открытым, закрытым приложением и перезапустил (alt + f2 + r), чтобы проверить, работает ли оно, но оно по-прежнему показывает тот же заголовок окна.
Мод Кон
Вот это да! На этот раз я действительно впечатлен! Я попробую первым делом утром. Должен сказать, это выглядит очень многообещающе :) спасибо за ваш тяжелый труд и публикацию этого, Джейкоб!
Мод Кон
Я попробовал сценарий именно так, как вы сказали, но он не работает. Возможно ли, что это не будет работать с GNOME 3.16 или это должно быть что-то в моей настройке? Я озадачен этим сейчас и надеюсь заставить его работать в моей системе. Если я найду причину, по которой он еще не работает, я свяжусь с вами как можно скорее.
Мод Кон
1
@MaudKon Вы, должно быть, отредактировали файл настроек и непреднамеренно добавили один или несколько белых списков, вероятно, в конце. Я «привил» сценарий для этого. Вы можете использовать столько
белых линий,
9

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


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

  • устанавливать 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
Helio
источник
Я попробовал оба способа (также один здесь), и ваш скрипт bash работает частично. Он запускает новое окно с новым именем, но если я запускаю его снова из обзора, он все еще имеет старую запись ... я делаю что-то не так?
Мод Кон
@MaudKon: какой обзор? Попробуйте скрипт сейчас. Если вы называете «Обзор» на панели инструментов (большая панель со многими приложениями), я скажу вам, что мой скрипт не вносит постоянных изменений.
Гелио
Я имею в виду обзор приложений, я уже спрятал саму черту, ха-ха. Хм, да, чем твой сценарий работает. Есть ли способ сделать изменение постоянным? Как редактирование исполняемого файла с помощью FX. GHex? Или смена исполняемого файла в файле .desktop?
Мод Кон
Попробуй сейчас. Используйте новый скрипт и следуйте методу в разделе Чтобы сделать изменение постоянным . Теперь я понял, что ты делаешь камуфляж своей Ubuntu ;-)
Helio
1
@ Helio Я обновил твой пост с шагами, которые работали для меня. Я также добавил процесс, чтобы заставить работать функцию «открыть с».
Мод Кон
2

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

Я столкнулся с этой самой проблемной задачей с Thunar: Это стало досадно , когда Compiz Scale отображается заголовок окна Thunar как «AnyFolder - файловый менеджер» и пространство с потребляются ненужной информацией.

Я попробовал вышеупомянутые способы с xdotoolи , wmctrlно они не являются постоянными , поскольку Thunar меняет заголовок окна каждый раз , когда я иду в другую папку. И было преувеличено иметь сценарий, сидящий на заднем плане, чтобы изменить название каждый раз, когда Тунар меняет его.

Более простым решением было использование файла перевода, который поставляется с каждым приложением. Вам просто нужно заново скомпилировать исходный файл перевода с помощью инструмента, msgfmtвключенного в gettextпакет. Я просто сделал это для gThumb - просто для удовольствия - и там это тоже работает.

1. Получить исходный код для соответствующего приложения.
Введите или перейдите по адресу http://packages.ubuntu.com , найдите источник и найдите папку с именем : она содержит файлы с открытым текстом. Ищите свой язык. Допустим, вы из Бразилии, этот файл будет$ sudo apt-get source APPLICATIONpopt_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

ronso0
источник
Только для записи; Я сомневаюсь, что вы на самом деле пробовали скрипт, так как он поддерживает имя, как указано в ответе.
Джейкоб Влейм
Вы правы, я не пробовал этот сценарий, но похожий (более простой) из другого, и трюки с xdotool и wmctrl. Как уже упоминалось, для меня это похоже на стрельбу по воробьям из пушки, по сравнению с изменением одной строки в исходном файле. Тем не менее, из сценариев можно многому научиться.
ronso0
Мне интересно, что произойдет, если приложение будет обновлено. Перезаписаны ли файлы * .desktop и файлы локализации?
ronso0
Как объяснено здесь askubuntu.com/a/703942/72216 , я не разделяю Fobia для фонового скрипта, если она хорошо написана и действительно добавить важные функции. О .desktopфайлах: опять же, вы должны перепутать мой ответ с другим, который вы, возможно, прочитали. Ответ не редактирует .desktopфайлы, и при переустановке приложения никаких действий не требуется.
Джейкоб Влейм
Это был общий вопрос, так как ответ № 2 изменяет .desktopфайлы, и я делаю это с файлами переводов. Ты знаешь это? И я могу дать ЛЮБОМУ решению сценария второй шанс, так как теперь я читаю, т.е. "mu__Incoming -", где у меня было "mu__Incoming - File Manager" . Для приложений, которые имеют статический заголовок окна без «пути / к / папке», мои решения работают нормально.
ronso0
1

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

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

Например, я люблю читать Some fancy websiteвместо Some fancy website - Mozilla Firefox. Плагин масштаба Compiz теперь намного понятнее, так как я также удалил - 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

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

ronso0
источник