Pencere başlıklarını kalıcı olarak nasıl değiştiririm?


17

Pencere başlığının oluşturulmasında hangi dosyalar var? Örneğin, Rhythmbox'ı açarsanız, program adını pencere başlığı olarak görürsünüz. Ancak .desktopdosya tarafından oluşturulmaz . Bir uygulamanın başlığına metin eklemek için hangi dosyaları düzenlemem gerekir? Değişikliklerin kalıcı olmasını istiyorum

GNOME 3.16 ile Ubuntu GNOME 15.04 kullanıyorum.


Merhaba Maud. Sorunu çok sevdim ve çok güzel bir çözüme yol açtı. Bununla birlikte, gelecekteki sorular için akılda tutulması gereken bir şeyden bahsetmeye dayanamıyorum: lütfen cevaplar gönderildikten sonra sorunun anlamını büyük ölçüde değiştirmeyin . Başlangıçta sorunun ilk sürümünde yeterince gönderilmiş olan cevapları, düzenlenmiş sürümde yanlış yerleştirilmiş gibi görünüyor. Cevabımın gerçekte böyle olduğunu düşünüyorum. Sorunuzu yeniden düşünürseniz, yeni bir soru göndermenizi öneririm.
Jacob Vlijm

1
Fikrinizi anlıyorum ve kesinlikle gelecekteki sorularla yapacağım, çünkü insanlar için nasıl kafa karıştırıcı olabileceğini görebiliyorum. Kesinlikle konuya katkınızı küçümsemiyorum, açık olsun. Orijinal başlık aslında gerçek sorumu kapsamadığından ve bu konu ile amacımın ne olduğu konusunda biraz belirsizlik yarattığından başlığın daha spesifik olmasını istedim. Yardımın için teşekkürler! :)
Maud Kon

Yanıtlar:


21

İlk ad genellikle uygulamanın (içindeki kod) tarafından ayarlanır. Bununla birlikte, örneğin xdotoolilk önce yüklemeniz gereken kullanarak:

sudo apt-get install xdotool

Ardından, yüklendikten sonra, (örn.) Komutunu kullanarak başka bir pencere adı ayarlayabilirsiniz:

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

Bu değişecek:

resim açıklamasını buraya girin

içine:

resim açıklamasını buraya girin

Not

Gördüğünüz gibi, komut aşağıdakilerden oluşur:

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

<current_name>Tam olarak eşleşmesi gerekir.


Alternatif olarak düzenle

Yorumunuzdan, yukarıdaki komutun işe yaramadığını anlıyorum. Farklı uygulamalarla test ettim ve işe yaradı ...

Ama bir nedenden dolayı anlamıyorum, DEĞİL ile Rhytmbox(!! bir hata olabilir)

Alternatif olarak, wmctrlyüklemeniz gereken kullanım da:

sudo apt-get install wmctrl

Ardından şu komutu kullanın:

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

Ben başarıyla üzerinde test Rhythmbox:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Değişiklikler kalıcı hale getirilsin mi?

Belirtildiği gibi, varsayılan pencere adı uygulamanın kodunda tanımlanır.

Değişen varsayılan pencere başlığını kodunu değiştirmek gerekir. Yani yapılabilir eğer kod kullanılabilir, birçok durumda yeniden derlenmesine gerekir ve diğer şeylerin yanı sıra, kullanılan dile bağlıdır. Genel bir talimat oldukça imkansız ve bence AU kapsamının ötesinde olacaktı.


DÜZENLEME 2

Uygulama başına özel pencere adlarını tek bir dosyadan esnek bir şekilde yönetin / ayarlayın

Orijinal sorunuzda, belirli bir uygulamanın yeni pencerelerinin başlığını ayarlamak için bir tür dosya olup olmadığını merak ediyordunuz. As ancak, böyle olmadığını açıkladı olabilir oluşturulabilir.

Aşağıdaki kurulumda, uygulama bazında yeni pencerelerin nasıl adlandırılacağını kolayca tanımlayabilirsiniz . Sadece ~(ana dizininiz) adlı bir dosya oluşturun window_names.txt. Belirli bir windowname ayarlamak istediğiniz uygulamaların her biri için, bir sonraki satır, uygulama ve istediğiniz pencere adı ekleyin:

Uygulama başına pencere adlarını tanımlayan bir metin dosyası

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

resim açıklamasını buraya girin

açıklama

Kurulum basit bir arka plan komut dosyası var. Komut dosyası çok hafiftir, bu nedenle performans üzerinde belirgin bir etkisi olmayacaktır.

Komut dosyası başlatıldığında, dosyayı okur ~/window_names.txtve uygulama başına ayarları yükler. Sonra yeni oluşturulan pencerelere göz kulak olur . Dosyalardan birinde tanımlanan uygulamalardan birine ait bir pencere görünürse, pencere adını buna göre ayarlar.

Nasıl kurulur

  1. Senaryo hem kullanır wmctrlve xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Komut dosyasını boş bir dosyaya kopyalayın ve kaydedin setwindowname.py

  3. Dosyayı ~/window_names.txt(tam olarak adlandırılmış window_names.txt) oluşturun, uygulamalarınızı şu biçimde ekleyin:

    <application> <window_name>
    

    Örneğin

    gedit Text editor
    

    Pencere adı boşluk içerebilir.

  4. Komut dosyasını komutla terminalden test edin:

    python3 /path/to/setwindowname.py
    
  5. Tümü beklendiği gibi çalışıyorsa, başlangıç ​​uygulamalarına ekleyin: Çizgi> Başlangıç ​​Uygulamaları> Ekle

    Bazı durumlarda, bir komut dosyası, masaüstü henüz tam olarak yüklenmediğinde başlayabileceğini unutmayın. Bu durumda, başlangıç ​​uygulamalarına ekleme komutu şu şekilde olur:

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

Senaryo

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

notlar

  • Dosya ~/window_names.txtdüzenlenirse, komut dosyasının yeniden başlatılması gerekir.
  • Bir uygulama nasıl başlatılırsa çalışın; uygulamalar terminalden ve / veya ile çalıştırıldığında da çalışır sudo.
  • Herhangi bir uygulamanın sağ tıklama seçeneğine müdahale etmez .
  • Komut dosyası ayrıca pencere adını "korur"; başka bir işlem daha sonra pencere adını değiştirirse (sekmeleri açma, dizinleri değiştirme örn.) komut dosyası pencereyi "yeni bir pencere" olarak görür ve seçtiğiniz pencere adını korur.

Üzgünüm, bu benim için işe yaramadı.
Maud Kon

xdotool search --name "Rhythmbox" set_window --name "Music" Uygulamayı açık, kapalı ve komutun çalışıp çalışmadığını kontrol etmek için yeniden başlattım (alt + f2 + r), ancak yine de aynı pencere başlığını gösterir.
Maud Kon

Vaov! Bu sefer gerçekten çok etkilendim! Sabah ilk denemeyi yapacağım. Söylemeliyim ki, bu çok promosing görünüyor :) Sıkı çalışmanız ve bunu yayınladığınız için teşekkürler, Jacob!
Maud Kon

Senaryoyu aynen dediğin gibi denedim ama işe yaramıyor. Bu GNOME 3.16 ile çalışmayabilir mi yoksa kurulumumda bir şey olmalı mı? Şimdi onunla karıştırıyorum ve umarım sistemimde çalışmasını sağlarım. Henüz çalışmadığının nedenini bulursam, en kısa sürede size geri döneceğim.
Maud Kon

1
@MaudKon Ayarlar dosyasını düzenlemiş ve muhtemelen sonunda bir veya daha fazla beyaz çizgi eklemiş olmanız gerekir. Bunun için senaryoyu "aşıladım". Şu anda istediğiniz kadar beyaz
hat kullanabilirsiniz

9

Başlık, uygulama yürütülebilir dosyası tarafından oluşturulur ve bunu düzenlemenin kolay bir yolu yoktur.


Bir uygulamanın başlığını açtıktan sonra değiştirme:

  • yükleme xdotoolilesudo apt-get install xdotool
  • pgrep myapp(P pgrep rythmbox) ile uygulama pid alın
  • Pencere başlığını değiştirin ( HERE_THE_PIDuygulamanın işlem kimliğiyle değiştirin ):

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

Özel bir başlık ile herhangi bir uygulamayı başlatmak için bir komut dosyası oluşturma:

  • Şu change-titleiçeriklerle adlandırılan bir bash betiği oluşturun :

    #!/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
    
  • İle çalıştırılabilir yap chmod a+x change-title

  • Şununla çalıştır ./change-title "NewTitle" theapp --its-arguments

Değişikliği kalıcı hale getirmek için:

  • Çalıştır gksudo gedit /usr/local/bin/custom-title(fx. Kullanıcı / yerel / bin / müzik)
  • Metin düzenleyicide yukarıdaki komut dosyasını yapıştırın ve kaydedin.
  • Çalıştırmak sudo chmod a+x /usr/local/bin/custom-title
  • Çalıştırmak gksudo gedit /usr/share/applications/rhythmbox.desktop
  • Bu dosyada şöyle bir satır (benimki satır numarası 35):

    Exec=rhythmbox %U
    
  • Bunu, oluşturulan dosyanın adıyla değiştirin:

    Exec=custom title (fx. Exec=music)
    
  • Dosyayı yeni bir custom-name.desktop fx olarak kaydedin. music.desktop. Orijinal dosyanın üzerine yazmamaya dikkat edin!

Değişikliği "Birlikte aç" işlevi için etkili hale getirmek

  • Çalıştırmak gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Değişiklik rhythmboxÖnceki .desktop dosyasında kullanılan adla .
  • Dosya 'yı kaydet.
  • Ritim kutusunun aktif işlemlerini sistem monitörü veya sudo kill rhythmbox
  • Telefonunuzu / müzik çalarınızı takın ve çalışıp çalışmadığını görmek için "Birlikte aç (Müzik uygulaması)" tuşuna basın.

(Özet) Sahip olmanız gereken dosyalara genel bakış

Uygulamayı tamamen işlevsel hale getirmek için, /usr/share/applicationsbittiğinde 3 .desktop dosyanız olmalıdır :

  1. music.desktop veya başvuruyu verdiğiniz ad

    ile Exec=musicve Hidden=true(sonuncusu eklerseniz değil mevcut)

  2. rhythmbox.desktop

    ile Exec=rhythmbox %UveHidden=true

  3. rhythmbox-device.desktop

    Gizli girişi olan Exec=music --select-source %Uve OLMADAN

Bu, her zaman son dosyayı açtığınız ve başlığın her zaman olması gerektiği gibi olduğu anlamına gelir. Tek yol sıfırlanır, oturumunuzu ALT + F2 + R ile yenilemenizdir.

  1. Ve /usr/local/bintabii ki bash senaryosuna sahip olmalısınız .

Son notlar:

  • Ben bir hatayı--name "\a\b\c" düzeltmek için kullanırken , uygulama adıyla değiştirmeyin!
  • Komut dosyasının son satırını kaldırırsanız, uygulama kapatılana kadar komut dosyası bitmez.
  • Ait Açıklama ${@:2}tarafından talep kodunda @Maud Kon :

    1. $@ tüm konum parametrelerini saklayan bir dizidir.
    2. ${@:2}şu anlama gelir: İlk konum hariç tüm konum parametreleri
    3. Diyelim ki bir programı bu şekilde çağırıyorum:

      awesome-program foo bar baz fooz
      
      • ${@:1} olabilir foo bar baz fooz
      • ${@:2} olabilir bar baz fooz
      • ${@:3} olabilir baz fooz
      • ${@:4} olabilir fooz
      • ${@:5} boş çünkü daha fazla konumsal parametre yok.
    4. $@, ${@}Ve ${@:1}aynı şeydir: Tüm konumsal parametreler.

    5. Bu konu hakkında daha fazla bilgiyi buradan edinebilirsiniz: http://wiki.bash-hackers.org/scripting/posparams

Her iki şekilde de denedim (burada da bir tane) ve bash betiğiniz kısmen çalışıyor. Yeni adla yeni bir pencere açar, ancak genel bakıştan tekrar başlatırsam, hala eski girişi vardır ... Yanlış bir şey mi yapıyorum?
Maud Kon

@MaudKon: Genel bakış nedir? Komut dosyasını şimdi deneyin. Çizgiye "Genel Bakış" derseniz (birçok uygulama içeren büyük panel), size komut dosyamın kalıcı bir değişiklik yapmadığını söyleyeceğim.
Helio

Demek istediğim, uygulamalara genel bakış, zaten çizginin kendisini gizledim, haha. Hmm, evet, senaryonuzdan daha iyi. Değişikliği kalıcı hale getirmek için yine de var mı? Fx ile yürütülebilir bir dosyayı düzenlemek gibi. GHex? Veya .desktop dosyasındaki yürütülebilir dosyayı mı değiştiriyorsunuz?
Maud Kon

Şimdi dene. Yeni komut dosyasını kullanın ve Değişikliği kalıcı hale getirmek için bölümün altındaki yöntemi izleyin . Şimdi anladım ki Ubuntu'nuzun kamuflajını yaptığınızı anladım ;-)
Helio

1
@Helio Yayınınızı, benim için çalışan adımlarla güncelledim. "Birlikte aç" işlevinin çalışması için de işlemi ekledim.
Maud Kon

2

Sadece çeviri dosyasını kullanın!

Bu problemle karşılaştımThunar ile karşılaştım: Compiz Ölçeği Thunar pencere başlığını "AnyFolder - Dosya Yöneticisi" olarak gösterdiğinde ve gereksiz bilgilerle alan tükendiğinde can sıkıcı oldu.

Birlikte yukarıda belirtilen yollar denenmiş xdotoolve wmctrlfakat Thunar onun pencere başlığını ben başka bir klasöre gitmek her zaman değiştirir beri onlar kalıcı değildi. Ve Thunar her değiştirdiğinde başlığı değiştirmek için arka planda oturan bir senaryo olması abartılı hissetti.

Her uygulama ile birlikte gelen çeviri dosyasını kullanmak daha kolay bir çözümdü . Çeviri kaynak dosyasını, msgfmtiçinde bulunan adlı bir araçla yeniden derlemeniz yeterlidir .gettext pakete . Bunu sadece gThumb için -sadece eğlence için- yaptım ve orada da işe yarıyor.

1. İlgili uygulama için kaynak kodu alın.
Tip veya sından http://packages.ubuntu.com , adlı bir klasör için kaynağını ve görünümü elde : o düz metin dil dosyalarını içerir. Dilinizi arayın. Diyelim ki Brezilya'dansınız, bu dosya$ sudo apt-get source APPLICATIONpopt_BR.po

2. Dosyayı ihtiyaçlarınıza göre değiştirin
Tam olarak arayın! kurtulmak veya değiştirmek istediğiniz pencere başlığı. Thunar örneğinde öyleydi "Dosya Yöneticisi" ve pt_BR.pobuldum

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

nerede msgiduygulama gönderir sinyal ve bir msgstrşey Langpack onu çevirir. İstediğiniz gibi
değiştirin msgstr, yani msgstr "o_-".
Bu şekilde çeviriyi boş bırakırsanız msgstr ""uygulamanın geri düşeceğini öğrendim msgid. "Boş" olmasını istiyorsanız boşluk kullanın. Veya bir nokta. Veya herhangi bir korkak ASCII sembolü.

Derleyici alın 3.
olarak size gereken sözü msgfmtdan gettexttüre gerek yüzden, paketin
$ sudo apt-get install gettext

4. Derleme
Bir terminal açın, değiştirilmiş klasörünüzle klasöre gidin pt_BR.pove msgfmt dosyasının hata olup olmadığını kontrol etmesine izin verin:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Sorun yoksa, devam edin ve derleyin:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Dosya
yerleştir / usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES / veya / usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES / içindeki orijinal çevirinin nasıl adlandırıldığına bir göz atın ve dosyanızı buraya yerleştirin. O iki yerde de yoksa, bunlardan biri koyun ve bir dosya adı ile küçük bir deney: küçük harf, CamelCase ya da benzeri bir şey, yani gthumb.moya YOUR-APP.mo.
Önce orijinalin yedeğini alın: ardından yeni çevirinizi buraya kopyalayın
$ 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 çalışıyorsa, tüm örneklerini kapatın.
Dene!

İpucu Ubuntu'yu EN yerelleştirme ile benim gibi çalıştırıyorsanız, herhangi bir * .po kullanın, değişmemiş tüm msgid / msgstr çiftlerini silin veya yorumlayın ve / usr / share / locale / en / LC_MESSAGES / .

Kaynaklar:
http://wiki.xfce.org/translations/translation_guidance_in_xfce


Sadece kayıt için; Cevapta belirtildiği gibi ismi koruduğu için senaryoyu gerçekten denediğinizden şüpheliyim .
Jacob Vlijm

Haklısın, bu senaryoyu denemedim ama başka bir yerden benzer (basit) ve xdotool ve wmctrl ile hileler. Belirtildiği gibi, benim için kaynak dosyadaki bir satırı değiştirmeye kıyasla bir topla serçeler vurmak gibi geliyor . Bununla birlikte, senaryolardan çok şey öğrenilebilir.
ronso0

Uygulama yükseltilirse ne olacağını merak ediyorum. * .Desktop dosyalarının ve yerelleştirme dosyalarının üzerine yazılıyor mu?
ronso0

As burada açıklandığı askubuntu.com/a/703942/72216 ben bir arka plan komut dosyası için fobia paylaşmayan, eğer iyi yazılmış ve yok önemli işlevler ekleyin. Hakkında .desktopdosyalar: yine okuduğunuzu olabilecek başka biriyle benim cevap karıştırmayın gerekir. Yanıt .desktopdosyaları düzenlemez ve bir uygulama yeniden yüklendiğinde herhangi bir işlem yapılması gerekmez.
Jacob Vlijm

Cevap # 2 .desktopdosyaları değiştirdiğinden ve çeviri dosyaları ile yaptığım için bu genel bir soruydu . Bunu biliyor musun? Ve şimdi "mu__Incoming - Dosya Yöneticisi" vardı "mu__Incoming - " okudum beri HERHANGİ BİR script çözümü ikinci bir şans verebilir . Herhangi bir "yol / klasör / klasör" olmadan statik pencere başlığı olan uygulamalar için çözümlerim iyi çalışıyor.
ronso0

1

Pencere başlıklarını (bölümlerini) wmctrl ile değiştirin

Yana kendi cevap uygulamanın çeviri dosyasını kullanarak benim için çeşitli durumlar için yeterli değildi, üzerine inşa Jacob Vlijm çözümü ve pencere başlıklarında belirli dizeleri yerine onun senaryoyu değiştirdi. Umarım bu soruyu ayrı bir cevap olarak göndermeniz uygundur. Krediler , fikir ve senaryoyu ayarlamak için Jacob Vlijm'e gidiyor !

Örneğin, okumak Some fancy websiteyerine okumayı seviyorum Some fancy website - Mozilla Firefox. Compiz ölçek eklentisi artık daha net ve ben de - File managerdiğer dizeleri kaldırdım .

Yaptığım değişiklikler:

  1. kullanmak //içinde ayırıcı olarak window_names.txtbeyaz boşluk sağlamak için
  2. pencere başlığını değiştirmek wmctrlyerine kullanın xdotool(xdotool ASCII olmayan karakterleri çok iyi işlemediğinden):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. dize değiştirme vb yapmak için komut dosyasında bazı ekstra satırlar.

Değiştirilmiş window_names.txtşu şekilde yapılandırılmıştır:
[process name]//[exact text to replace]//[replacement text]

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

Pezevenk senaryo:

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

Tekrar: Krediler, fikir ve senaryoyu ayarlamak için Jacob Vlijm'e gidiyor!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.