Як я можу постійно змінювати заголовки вікон?


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:

введіть тут опис зображення

введіть тут опис зображення

Зробити зміни постійними?

Як згадувалося, ім'я вікна за замовчуванням визначається в коді програми.

Змінивши заголовок вікна за замовчуванням , потрібно змінити код. Це може бути зроблено, якщо код доступний, у багатьох випадках знадобиться перекомпіляція і, крім іншого, залежить від використовуваної мови. Загальна інструкція була б неможливою і поза межами (поза) сферою АС, на мою думку.


EDIT 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
  • Отримати додаток програми 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)
    
  • Збережіть файл як нове користувацьке-name.desktop fx. music.desktop. Будьте уважні, щоб не перезаписати оригінальний файл!

Щоб зміни були ефективними для функції "відкрити з"

  • Біжи gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Перейдіть rhythmboxдо імені, використовуваного в попередньому .desktop-файлі.
  • Збережіть файл.
  • Вбийте активні процеси ритмбокса за допомогою монітора системи чи за допомогою sudo kill rhythmbox
  • Підключіть телефон / музичний плеєр і натисніть "Відкрити за допомогою (Музична програма)", щоб перевірити, чи працює він.

(Резюме) Огляд файлів, які ви повинні мати

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

  1. music.desktop або ім'я, яке ви дали заяві

    з Exec=musicі Hidden=true(додати останнього, якщо немає)

  2. ritbox.desktop

    з Exec=rhythmbox %UіHidden=true

  3. ritbox-device.desktop

    з Exec=music --select-source %Uта БЕЗ прихованого запису

Це означає, що ви завжди відкриваєте останній файл, а заголовок завжди як слід. Єдиний спосіб самозавантажити - це коли ви оновите сеанс за допомогою ALT + F2 + R.

  1. І ви, /usr/local/binзвичайно, повинні мати сценарій bash .

Заключні записки:

  • Коли я використовую --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

Я спробував обидві манери (також та, яка тут внизу), і ваш скрипт bash працює частково. Він запускає нове вікно з новою назвою, але якщо я запускаю його знову з огляду, у нього все ще є старий запис ... чи я щось роблю не так?
Мод Кон

@MaudKon: Що таке огляд? Спробуйте сценарій зараз. Якщо ви зателефонуєте "Огляд" на тире (велика панель з багатьма програмами), я скажу вам, що мій сценарій не змінює постійних змін.
Геліо

Я маю на увазі огляд програм, я вже приховав тире, ха-ха. Хм, так, ніж працює ваш сценарій. Чи є можливість зробити зміни постійними? Як і редагування виконуваного файлу за допомогою fx. GHex? Або зміна виконуваного файлу у файлі .desktop?
Мод Кон

Спробуємо зараз. Скористайтеся новим сценарієм та дотримуйтесь методу в розділі Щоб зміни були постійними . Тепер я зрозумів, що ти робиш камуфляж для свого Ubuntu ;-)
Геліо

1
@Helio Я оновив вашу публікацію кроками, які працювали для мене. Я також додав процес змусити функцію "відкрити з".
Мод Кон

2

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

Я зіткнувся з цією проблемою з Thunar: Це стало прикро, коли Compiz Scale відображала заголовок вікна Thunar як "AnyFolder - File Manager" і використовувала простори з непотрібною інформацією.

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

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

1. Отримайте вихідний код для відповідної програми.
Введіть або перейдіть на сторінку http://packages.ubuntu.com , знайдіть джерело та шукайте папку під назвою : вона містить файли мови простого тексту. Шукайте свою мову. Скажімо, ви з Бразилії, цей файл був би$ sudo apt-get source APPLICATIONpopt_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 / та розмістіть там свій файл. Якщо його немає в обох місцях, покладіть його в одне з них і трохи експериментуйте з назвою файлу: малі, маленькі, чи то подібні, наприклад, 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


Просто для запису; Я сумніваюся, що ви насправді спробували сценарій, оскільки він підтримує ім'я, про що йдеться у відповіді.
Яків Влійм

Ви маєте рацію, я не пробував цього сценарію, але подібний (простіший) з іншого місця та хитрощі з 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

Знову: Кредити йдуть до Якова Влійма за ідеєю та налаштуванням сценарію!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.