Jak trwale zmienić tytuły okien?

17

Które pliki są zaangażowane w generowanie tytułu okna? Na przykład, jeśli otworzysz Rhythmbox, zobaczysz nazwę programu jako tytuł okna. Ale nie jest generowany przez .desktopplik. Które pliki muszę edytować, aby dodać tekst do tytułu aplikacji? Chcę, aby zmiany były trwałe

Używam Ubuntu GNOME 15.04 z GNOME 3.16.

Maud Kon
źródło
Cześć Maud. Podobało mi się twoje pytanie, które doprowadziło do bardzo fajnego rozwiązania. Nie mogę się jednak oprzeć, aby wspomnieć o jednej rzeczy na przyszłe pytania: proszę nie zmieniaj drastycznie znaczenia pytania po opublikowaniu odpowiedzi. Sprawia, że ​​odpowiedzi, pierwotnie odpowiednio zamieszczone w pierwszej wersji pytania, wydają się niewłaściwie umieszczone w edytowanej wersji. Myślę, że tak właśnie się stało z moją odpowiedzią. Proponuję zamiast tego zamieścić nowe pytanie, a dokładniej do twojego prawdziwego pytania, jeśli ponownie przemyślisz swoje pytanie.
Jacob Vlijm
1
Rozumiem twoją opinię i na pewno zrobię to z przyszłymi pytaniami, ponieważ widzę, że może to być dość mylące dla ludzi. Z pewnością nie doceniam waszego wkładu w wątek, niech to będzie jasne. Chciałem, aby tytuł był bardziej konkretny, ponieważ oryginalny tytuł tak naprawdę nie obejmował mojego prawdziwego pytania i wzbudził trochę niepewności co do tego, jaki był mój cel w tym wątku. Dzięki za pomoc! :)
Maud Kon

Odpowiedzi:

21

Początkowa nazwa jest zwykle ustawiana przez (kod) samej aplikacji. Możesz go jednak zmienić, np. Za pomocą xdotool, który musiałbyś najpierw zainstalować:

sudo apt-get install xdotool

Następnie po zainstalowaniu możesz ustawić inną nazwę okna (np.) Za pomocą polecenia:

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

To zmieni:

wprowadź opis zdjęcia tutaj

w:

wprowadź opis zdjęcia tutaj

Uwaga

Jak widać, istnieje polecenie:

xdotool search --name "<current_name>" set_window --name "<new_name>"

<current_name>Musi dokładnie pasować.


Edytuj alternatywnie

Z twojego komentarza rozumiem, że powyższe polecenie nie działało. Testowałem to z różnymi aplikacjami i działało ...

Ale z powodu, którego nie rozumiem, NIE z Rhytmbox(może być błąd)

Alternatywą jest użycie wmctrl, które również musiałbyś zainstalować:

sudo apt-get install wmctrl

Następnie użyj polecenia:

xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"

Z powodzeniem przetestowałem to na Rhythmbox:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Czy zmiany są trwałe?

Jak wspomniano, domyślna nazwa okna jest zdefiniowana w kodzie aplikacji.

Zmiana domyślnego tytułu okna wymaga zmiany kodu. Można to zrobić, jeśli kod jest dostępny, w wielu przypadkach wymagałby ponownej kompilacji i zależy między innymi od używanego języka. Ogólna instrukcja byłaby moim zdaniem niemożliwa i poza (poza) zakresem UA.


EDYCJA 2

Elastycznie zarządzaj / ustaw niestandardowe nazwy okien dla aplikacji z jednego pliku

W swoim pierwotnym pytaniu zastanawiałeś się, czy istnieje jakiś plik do ustawienia tytułu nowych okien konkretnej aplikacji. Jak wyjaśniono, tak nie jest, można go jednak utworzyć.

W poniższej konfiguracji możesz bardzo łatwo zdefiniować, na podstawie nazw aplikacji, nowe okna. Po prostu utwórz plik ~o nazwie (Twój katalog domowy) window_names.txt. Dla każdej aplikacji, dla której chcesz ustawić konkretną nazwę okienka, dodaj wiersz, podsekcję, aplikację i żądaną nazwę okna:

Plik tekstowy definiujący nazwy okien dla aplikacji

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

wprowadź opis zdjęcia tutaj

Wyjaśnienie

Istnieje prosty skrypt w tle. Skrypt jest bardzo lekki, więc nie będzie miał żadnego zauważalnego wpływu na wydajność.

Po uruchomieniu skryptu odczytuje plik ~/window_names.txti ładuje ustawienia dla poszczególnych aplikacji. Następnie kontroluje nowo utworzone okna. Jeśli pojawi się okno należące do jednej z aplikacji zdefiniowanych w pliku, odpowiednio ustawia nazwę okna.

Jak skonfigurować

  1. Skrypt korzysta zarówno wmctrla xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Skopiuj skrypt do pustego pliku i zapisz go jako setwindowname.py

  3. Utwórz plik ~/window_names.txt(dokładnie o nazwie window_names.txt), dodaj swoje aplikacje w formacie:

    <application> <window_name>
    

    na przykład

    gedit Text editor
    

    Nazwa okna może zawierać spacje.

  4. Uruchom skrypt z terminalu za pomocą polecenia:

    python3 /path/to/setwindowname.py
    
  5. Jeśli wszystko działa zgodnie z oczekiwaniami, dodaj go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj

    Pamiętaj, że w niektórych przypadkach skrypt może się zepsuć, jeśli zostanie uruchomiony, gdy pulpit nie zostanie jeszcze w pełni załadowany. W takim przypadku polecenie dodawania do aplikacji startowych wyglądałoby następująco:

    /bin/bash -c "sleep 15&&python3 /path/to/setwindowname.py"
    

Scenariusz

#!/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

Notatki

  • Jeśli plik ~/window_names.txtjest edytowany, skrypt musi zostać zrestartowany.
  • Działa bez względu na sposób uruchamiania aplikacji; działa również, gdy aplikacje są uruchamiane z terminala / i / lub sudo.
  • Nie koliduje z opcją kliknięcia prawym przyciskiem myszy dowolnej aplikacji.
  • Skrypt „utrzymuje” także nazwę okna; jeśli inny proces zmieni później nazwę okna (otwieranie kart, zmiana katalogów np.), skrypt zobaczy okno jako „nowe okno” i zachowa wybraną przez ciebie nazwę okna.
Jacob Vlijm
źródło
Przepraszam, to nie działało dla mnie.
Maud Kon
xdotool search --name "Rhythmbox" set_window --name "Music" Wykonałem polecenie z otwartą, zamkniętą aplikacją i uruchomiłem ponownie (alt + f2 + r), aby sprawdzić, czy działa, ale nadal wyświetla ten sam tytuł okna.
Maud Kon
Łał! Tym razem jestem pod wielkim wrażeniem! Spróbuję z samego rana. Muszę powiedzieć, że wygląda to bardzo obiecująco :) dzięki za twoją ciężką pracę i opublikowanie tego, Jacob!
Maud Kon
Próbowałem skryptu dokładnie tak, jak powiedziałeś, ale to nie działa. Czy to możliwe, że to nie zadziała z GNOME 3.16, czy powinno to być coś w mojej konfiguracji? Zastanawiam się teraz i mam nadzieję, że zadziała w moim systemie. Jeśli znajdę powód, dla którego jeszcze nie działa, skontaktuję się z Tobą jak najszybciej.
Maud Kon
1
@MaudKon Musisz edytować plik ustawień i przypadkowo dodać jedną lub więcej białych list, prawdopodobnie na końcu. Zaszczepiłem za to skrypt. Możesz teraz użyć dowolnej liczby białych list, jak chcesz :)
Jacob Vlijm,
9

Tytuł jest generowany przez plik wykonywalny aplikacji i nie ma łatwego sposobu na jego edycję.


Zmiana tytułu aplikacji, gdy jest ona otwarta:

  • Zainstaluj za xdotoolpomocąsudo apt-get install xdotool
  • Uzyskaj identyfikator aplikacji za pomocą pgrep myapp(tj. pgrep rythmbox)
  • Zmień tytuł okna (zastępując HERE_THE_PID go identyfikatorem procesu aplikacji):

    xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
    

Tworzenie skryptu w celu uruchomienia dowolnej aplikacji o niestandardowym tytule:

  • Utwórz skrypt bash o nazwie change-title zawartości:

    #!/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
    
  • Zrób to za pomocą chmod a+x change-title

  • Uruchom to z ./change-title "NewTitle" theapp --its-arguments

Aby zmienić na stałe:

  • Biegać gksudo gedit /usr/local/bin/custom-title (fx. User / local / bin / music)
  • W edytorze tekstu wklej powyższy skrypt i zapisz go.
  • Biegać sudo chmod a+x /usr/local/bin/custom-title
  • Biegać gksudo gedit /usr/share/applications/rhythmbox.desktop
  • W tym pliku znajduje się wiersz (mój numer to 35), który mówi:

    Exec=rhythmbox %U
    
  • Zamień go na nazwę utworzonego pliku:

    Exec=custom title (fx. Exec=music)
    
  • Zapisz plik jako nową niestandardową nazwę.desktop fx. music.desktop. Uważaj, aby nie zastąpić oryginalnego pliku!

Aby zmiana była skuteczna dla funkcji „otwórz za pomocą”

  • Biegać gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Zmień rhythmboxnazwę na poprzedni plik .desktop.
  • Zapisz plik.
  • Zabij aktywne procesy Rhythmbox za pomocą monitora systemu lub sudo kill rhythmbox
  • Podłącz telefon / odtwarzacz muzyki i naciśnij „Otwórz za pomocą (Aplikacja muzyczna)”, aby sprawdzić, czy zadziałało.

(Podsumowanie) Przegląd plików, które powinieneś mieć

Aby aplikacja była w pełni funkcjonalna, /usr/share/applicationspo zakończeniu powinny mieć 3 pliki .desktop :

  1. music.desktop lub nazwa nadana aplikacji

    z Exec=musici Hidden=true(dodaj ostatnią, jeśli nie jest obecna)

  2. rhythmbox.desktop

    z Exec=rhythmbox %UiHidden=true

  3. rhythmbox-device.desktop

    z Exec=music --select-source %Ui bez ukrytego wpisu

Oznacza to, że zawsze otwierasz ostatni plik, a tytuł jest zawsze taki, jak powinien. Jedynym sposobem, aby się zresetować, jest odświeżenie sesji za pomocą ALT + F2 + R.

  1. I powinieneś mieć /usr/local/binoczywiście skrypt bash .

Uwagi końcowe:

  • Kiedy używam --name "\a\b\c"do naprawy błędu , nie zastępuj nazwą aplikacji!
  • Jeśli odkomentujesz ostatni wiersz skryptu, skrypt nie zakończy się, dopóki aplikacja nie zostanie zamknięta.
  • Wyjaśnienie ${@:2}w kodzie żądanym przez @Maud Kon :

    1. $@ to tablica przechowująca wszystkie parametry pozycyjne.
    2. ${@:2}oznacza: wszystkie parametry pozycyjne oprócz pierwszego
    3. Powiedzmy, że wywołuję program w ten sposób:

      awesome-program foo bar baz fooz
      
      • ${@:1} byłoby foo bar baz fooz
      • ${@:2} byłoby bar baz fooz
      • ${@:3} byłoby baz fooz
      • ${@:4} byłoby fooz
      • ${@:5} jest pusty, ponieważ nie ma więcej parametrów pozycyjnych.
    4. $@, ${@}I ${@:1}to samo: Wszystkie parametry pozycyjne.

    5. Dowiedz się więcej na ten temat tutaj: http://wiki.bash-hackers.org/scripting/posparams
Helio
źródło
Wypróbowałem oba maniery (również ten tutaj) i twój skrypt bash działa częściowo. Otwiera nowe okno z nową nazwą, ale jeśli uruchomię je ponownie z przeglądu, nadal będzie miał stary wpis ... czy robię coś złego?
Maud Kon
@MaudKon: Jaki jest przegląd? Wypróbuj skrypt teraz. Jeśli nazywasz „Przegląd” deską rozdzielczą (duży panel z wieloma aplikacjami), powiem ci, że mój skrypt nie wprowadza trwałych zmian.
Helio
Mam na myśli przegląd aplikacji, już ukryłem samą deskę rozdzielczą, haha. Hmm, tak, niż twój skrypt działa. Czy w ogóle istnieje możliwość, aby zmiana była trwała? Jak edytowanie pliku wykonywalnego za pomocą fx. GHex? Lub zmienianie pliku wykonywalnego w pliku .desktop?
Maud Kon
Spróbuj teraz. Użyj nowego skryptu i postępuj zgodnie z metodą podaną w sekcji Aby wprowadzić zmianę na stałe . Teraz zrozumiałem, że robisz kamuflaż swojego Ubuntu ;-)
Helio
1
@Helio Zaktualizowałem Twój post, wykonując dla mnie odpowiednie kroki. Dodałem również proces, aby funkcja „otwórz za pomocą” działała.
Maud Kon
2

Wystarczy użyć pliku tłumaczenia!

Natknąłem się na ten bardzo problem wyzwanie z Thunar: Stało się to denerwujące, gdy Compiz Scale wyświetlał tytuł okna Thunar jako „AnyFolder - Menedżer plików” i zajmował miejsce niepotrzebnymi informacjami.

Próbowałem powyższe sposoby z xdotoola wmctrl, ale nie były one trwały od Thunar zmienia tytuł okna za każdym razem idę do innego folderu. I przesadnie było mieć skrypt siedzący w tle, aby zmienić tytuł za każdym razem, gdy Thunar go zmienia.

Łatwiejszym rozwiązaniem było użycie pliku tłumaczenia dołączonego do każdej aplikacji. Musisz po prostu ponownie skompilować plik źródłowy tłumaczenia za pomocą narzędzia o nazwie msgfmtzawartego w gettextpakiecie. Właśnie zrobiłem to dla gThumb - tylko dla zabawy - i tam też działa.

1. Uzyskaj kod źródłowy dla danej aplikacji.
Wpisz lub przejdź na stronę http://packages.ubuntu.com , uzyskaj źródło i poszukaj folderu o nazwie : zawiera on pliki tekstowe. Poszukaj swojego języka. Powiedzmy, że jesteś z Brazylii, ten plik będzie$ sudo apt-get source APPLICATIONpopt_BR.po

2. Zmień plik do swoich potrzeb
Poszukaj dokładnie! tytuł okna, którego chcesz się pozbyć lub zmienić. W przypadku Thunara był to „Menedżer plików” i pt_BR.poznalazłem

:. 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"

gdzie msgidjest sygnał wysyłany przez aplikację i na msgstrco tłumaczy go langpack.
Zmień msgstrna co chcesz, tj msgstr "o_-".
Dowiedziałem się, że jeśli pozostawisz takie tłumaczenie puste, msgstr ""aplikacja wróci do msgid. Jeśli chcesz, aby był „pusty”, użyj białych znaków. Lub kropka. Lub dowolny funky symbol ASCII.

3. Pobierz kompilator
Jak wspomniano, potrzebujesz msgfmtz gettextpakietu, więc musisz wpisać
$ sudo apt-get install gettext

4. Kompilacja
Otwórz terminal, przejdź do folderu ze zmienionymi pt_BR.poplikami i pozwól msgfmt sprawdzić plik pod kątem błędów:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Jeśli jest w porządku, śmiało i skompiluj go:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Umieść plik
Sprawdź, jak nazywa się oryginalne tłumaczenie w / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / lub / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / i umieść tam swój plik. Jeśli nie istnieje w obu miejscach, umieść go w jednym z nich i poeksperymentuj z nazwą pliku: małe litery, Camelcase lub coś podobnego, tj . gthumb.moLub YOUR-APP.mo.
Najpierw wykonaj kopię zapasową oryginału: skopiuj tam nowe tłumaczenie
$ 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

Jeśli działa YOUR_APP, zamknij wszystkie jego wystąpienia.
Sprawdź to!

Wskazówka Jeśli korzystasz z Ubuntu z lokalizacją EN tak jak ja, po prostu użyj dowolnej * .po, usuń lub skomentuj wszystkie niezmienione pary msgid / msgstr i umieść je w / usr / share / locale / pl / LC_MESSAGES / .

Źródła:
http://wiki.xfce.org/translations/translation_guidance_in_xfce

ronso0
źródło
Dla przypomnienia; Wątpię, czy rzeczywiście wypróbowałeś skrypt, ponieważ zachowuje on nazwę, jak wspomniano w odpowiedzi.
Jacob Vlijm,
Masz rację, nie próbowałem tego skryptu, ale podobny (prostszy) skądś indziej, i sztuczki z xdotool i wmctrl. Jak wspomniano, wydaje mi się, że to strzelanie wróblami z armaty, w porównaniu do zmiany jednej linii w pliku źródłowym. Niemniej jednak można się wiele nauczyć ze skryptów.
ronso0,
Jestem ciekawy, co się stanie, jeśli aplikacja zostanie zaktualizowana. Czy pliki * .desktop i pliki lokalizacji są nadpisywane?
ronso0,
Jak wyjaśniono tutaj askubuntu.com/a/703942/72216 , ja nie podzielam fobia na skrypcie tła, jeśli jest dobrze napisany i nie dodać ważną funkcjonalność. O .desktopplikach: znowu, musisz pomylić moją odpowiedź z inną, którą mogłeś przeczytać. Odpowiedź nie powoduje edycji .desktopplików i po ponownej instalacji aplikacji nie jest wymagane żadne działanie.
Jacob Vlijm,
To było ogólne pytanie, ponieważ odpowiedź nr 2 modyfikuje .desktoppliki i robię to z plikami do tłumaczenia. Znasz to? I mogę dać KAŻDEMU skryptowi drugą szansę, ponieważ teraz czytam, tj. „Mu__Incoming -” gdzie miałem „mu__Incoming - Menedżer plików” . W przypadku aplikacji, które mają statyczny tytuł okna bez „ścieżki / do / folderu”, moje rozwiązania działają dobrze.
ronso0,
1

Zamień (części) tytułów okien na wmctrl

Ponieważ moja własna odpowiedź przy użyciu pliku tłumaczenia aplikacji nie była dla mnie wystarczająca w kilku przypadkach, zbudowałem rozwiązanie Jacoba Vlijma i zmodyfikowałem jego skrypt, aby zastąpić niektóre ciągi znaków w tytułach okien. Mam nadzieję, że w porządku jest opublikowanie tej osobnej odpowiedzi. Podziękowania należą się Jacobowi Vlijmowi za pomysł i przygotowanie skryptu!

Na przykład lubię czytać Some fancy websitezamiast Some fancy website - Mozilla Firefox. Wtyczka skali Compiz jest teraz znacznie bardziej przejrzysta, ponieważ usunąłem - File manageri inne ciągi.

Zmiany, które wprowadziłem:

  1. użyj //jako separatora, window_names.txtaby umożliwić spacje
  2. użyj wmctrlzamiast, xdotoolaby zmodyfikować tytuł okna (ponieważ xdotool nie obsługuje zbyt dobrze znaków spoza ASCII):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. dodatkowe wiersze w skrypcie, aby zastąpić ciąg znaków itp.

Zmodyfikowany window_names.txtma następującą strukturę:
[process name]//[exact text to replace]//[replacement text]

firefox// - Mozilla Firefox// (whitespace!)
thunar// - File Manager// ° xyz
gedit// - gedit// - 123

Skąpy skrypt:

#!/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

Ponownie: Podziękowania dla Jacoba Vlijma za pomysł i przygotowanie skryptu!

ronso0
źródło