Bagaimana cara mengubah judul jendela secara permanen?

17

File mana yang terlibat dalam menghasilkan judul jendela? Misalnya, jika Anda membuka Rhythmbox, Anda melihat nama program sebagai judul jendela. Tapi itu tidak dihasilkan oleh .desktopfile. File mana yang perlu saya edit untuk menambahkan teks ke judul aplikasi? Saya ingin perubahannya permanen

Saya menggunakan Ubuntu GNOME 15.04 dengan GNOME 3.16.

Maud Kon
sumber
Hai, Maud. Saya menyukai pertanyaan Anda, dan itu mengarah ke solusi yang sangat bagus. Namun saya tidak bisa menolak untuk menyebutkan satu hal yang perlu diingat untuk pertanyaan di masa depan: tolong jangan mengubah secara drastis makna pertanyaan setelah jawaban telah diposting. Itu membuat jawaban, semula cukup diposting pada versi pertama dari pertanyaan, tampaknya salah tempat pada versi yang diedit. Saya pikir itulah yang sebenarnya terjadi dengan jawaban saya. Saya akan menyarankan memposting pertanyaan baru, lebih khusus untuk pertanyaan Anda yang sebenarnya jika memikirkan kembali pertanyaan Anda.
Jacob Vlijm
1
Saya memahami pendapat Anda dan saya pasti akan melakukannya dengan pertanyaan di masa depan karena saya dapat melihat bagaimana hal itu mungkin membingungkan bagi orang-orang. Saya tentu saja tidak meremehkan kontribusi Anda pada utas, biarkan itu menjadi jelas. Saya ingin judulnya lebih spesifik karena judul aslinya tidak benar-benar mencakup pertanyaan saya yang sebenarnya dan menimbulkan sedikit ketidakpastian tentang apa tujuan saya dengan utas ini. Terima kasih atas bantuan Anda! :)
Maud Kon

Jawaban:

21

Nama awal biasanya ditetapkan oleh (kode di dalam) aplikasi itu sendiri. Namun Anda dapat mengubahnya, misalnya dengan menggunakan xdotool, yang harus Anda instal terlebih dahulu:

sudo apt-get install xdotool

Kemudian, setelah diinstal, Anda dapat mengatur nama jendela lain dengan (mis.) Perintah:

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

Ini akan berubah:

masukkan deskripsi gambar di sini

ke:

masukkan deskripsi gambar di sini

Catatan

Seperti yang Anda lihat, ada perintah:

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

The <current_name>harus sama persis.


Edit secara alternatif

Dari komentar Anda, saya mengerti perintah di atas tidak berhasil. Saya mengujinya dengan aplikasi yang berbeda, dan ternyata berhasil ...

Tapi karena suatu alasan saya tidak mengerti, BUKAN dengan Rhytmbox(!! mungkin bug)

Alternatifnya adalah menggunakan wmctrl, yang juga harus Anda pasang:

sudo apt-get install wmctrl

Kemudian gunakan perintah:

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

Saya berhasil mengujinya di Rhythmbox:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Buat perubahan itu permanen?

Seperti yang disebutkan, nama jendela default didefinisikan dalam kode aplikasi.

Mengubah judul jendela default perlu mengubah kode. Itu bisa dilakukan jika kode tersebut tersedia, akan perlu dikompilasi ulang dalam banyak kasus dan tergantung pada bahasa yang digunakan, antara lain. Instruksi umum akan sangat mustahil dan melampaui (di luar) ruang lingkup AU menurut saya.


EDIT 2

Secara fleksibel mengelola / menetapkan nama jendela khusus per aplikasi dari satu file

Dalam pertanyaan awal Anda, Anda bertanya-tanya apakah ada semacam file untuk mengatur judul jendela baru aplikasi tertentu. Sebagaimana dijelaskan, bukan itu masalahnya, namun, itu dapat dibuat.

Pada pengaturan di bawah ini, Anda dapat dengan mudah menentukan pada basis per aplikasi bagaimana nama jendela baru. Cukup buat file di ~(direktori home Anda), beri nama window_names.txt. Untuk setiap aplikasi yang ingin Anda tetapkan nama angin tertentu, tambahkan baris, selanjutnya, aplikasi dan nama jendela yang diinginkan:

File teks, mendefinisikan nama jendela per aplikasi

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

masukkan deskripsi gambar di sini

Penjelasan

Penyiapan ada skrip latar belakang sederhana. Skripnya sangat ringan, sehingga tidak akan memiliki efek nyata pada kinerja apa pun.

Setelah skrip dimulai, ia membaca file ~/window_names.txtdan memuat pengaturan per aplikasi. Maka itu mengawasi windows yang baru dibuat. Jika sebuah jendela muncul milik salah satu aplikasi, didefinisikan dalam file, itu menetapkan nama jendela yang sesuai.

Cara mengatur

  1. Script menggunakan keduanya wmctrldan xdotool:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Salin skrip ke file kosong, simpan sebagai setwindowname.py

  3. Buat file ~/window_names.txt(persis bernama window_names.txt), tambahkan aplikasi Anda dalam format:

    <application> <window_name>
    

    misalnya

    gedit Text editor
    

    Nama jendela mungkin termasuk spasi.

  4. Uji-coba skrip dari terminal dengan perintah:

    python3 /path/to/setwindowname.py
    
  5. Jika semua berfungsi seperti yang diharapkan, tambahkan ke aplikasi startup: Dash> Startup Applications> Add

    Perhatikan bahwa dalam beberapa kasus, skrip mungkin rusak jika dimulai ketika desktop belum dimuat penuh. Jika itu masalahnya, perintah untuk menambah aplikasi startup adalah:

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

Naskah

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

Catatan

  • Jika file ~/window_names.txtdiedit, skrip perlu di-restart.
  • Ini berfungsi tidak peduli bagaimana aplikasi dimulai; ini juga berfungsi ketika aplikasi dijalankan dari terminal / dan atau dengan sudo.
  • Itu tidak mengganggu dengan opsi klik kanan aplikasi apa pun .
  • Script juga "mempertahankan" nama jendela; jika proses lain mengubah nama jendela sesudahnya (membuka tab, ubah direktori misalnya) skrip melihat jendela sebagai "jendela baru" dan mempertahankan nama jendela pilihan Anda.
Yakub Vlijm
sumber
Maaf, ini tidak berhasil untuk saya.
Maud Kon
xdotool search --name "Rhythmbox" set_window --name "Music" Saya melakukan perintah dengan aplikasi terbuka, ditutup dan melakukan restart (alt + f2 + r) untuk memeriksa apakah itu berfungsi, tetapi masih menunjukkan judul jendela yang sama.
Maud Kon
Wow! Kali ini saya benar-benar terkesan! Saya akan mencobanya terlebih dahulu di pagi hari. Saya harus mengatakan, ini terlihat sangat menjanjikan :) terima kasih atas kerja keras Anda dan memposting ini, Jacob!
Maud Kon
Saya mencoba skrip persis seperti yang Anda katakan, tetapi tidak berhasil. Apakah mungkin ini tidak akan berfungsi dengan GNOME 3.16 atau haruskah itu sesuatu dalam pengaturan saya? Saya bingung dengan itu sekarang dan mudah-mudahan membuatnya bekerja di sistem saya. Jika saya menemukan alasan mengapa belum berfungsi, saya akan menghubungi Anda secepatnya.
Maud Kon
1
@MaudKon Anda harus mengedit file pengaturan, dan tanpa sengaja menambahkan satu atau beberapa daftar putih, mungkin di akhir. Saya "mengimunisasi" naskah untuk itu. Anda dapat menggunakan daftar putih sebanyak yang Anda suka sekarang :)
Jacob Vlijm
9

Judul dihasilkan oleh aplikasi yang dapat dieksekusi dan tidak ada cara mudah untuk mengeditnya.


Mengubah judul aplikasi setelah terbuka:

  • Instal xdotooldengansudo apt-get install xdotool
  • Dapatkan pid aplikasi dengan pgrep myapp(yaitu pgrep rythmbox)
  • Ubah judul jendela (ganti HERE_THE_PIDdengan id proses aplikasi):

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

Membuat skrip untuk meluncurkan aplikasi apa pun dengan judul khusus:

  • Buat skrip bash yang disebut change-titledengan konten ini:

    #!/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
    
  • Jadikan itu dapat dieksekusi dengan chmod a+x change-title

  • Jalankan dengan ./change-title "NewTitle" theapp --its-arguments

Untuk membuat perubahan permanen:

  • Jalankan gksudo gedit /usr/local/bin/custom-title(fx. Pengguna / lokal / bin / musik)
  • Pada editor teks tempel skrip di atas dan simpan.
  • Lari sudo chmod a+x /usr/local/bin/custom-title
  • Lari gksudo gedit /usr/share/applications/rhythmbox.desktop
  • Pada file ini, ada baris (nomor baris 35 pada saya) yang mengatakan:

    Exec=rhythmbox %U
    
  • Ganti dengan ini dengan nama file yang dibuat:

    Exec=custom title (fx. Exec=music)
    
  • Simpan file sebagai custom-name.desktop fx baru. music.desktop. Berhati-hatilah agar Anda tidak menimpa file asli!

Agar perubahan efektif untuk fungsi "terbuka dengan"

  • Lari gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • Ubah rhythmboxke nama yang digunakan dalam file .desktop sebelumnya.
  • Simpan file.
  • Bunuh proses rhythmbox aktif dengan monitor sistem atau dengan sudo kill rhythmbox
  • Plugin ponsel / pemutar musik Anda dan tekan "Buka dengan (aplikasi Musik)" untuk melihat apakah itu berfungsi.

(Ringkasan) Gambaran umum file yang seharusnya Anda miliki

Untuk membuat aplikasi berfungsi penuh, Anda harus memiliki 3 file .desktop /usr/share/applicationssaat selesai:

  1. music.desktop atau nama yang Anda berikan aplikasi

    dengan Exec=musicdan Hidden=true(tambahkan yang terakhir jika tidak ada)

  2. rhythmbox.desktop

    dengan Exec=rhythmbox %UdanHidden=true

  3. rhythmbox-device.desktop

    dengan Exec=music --select-source %Udan TANPA entri Tersembunyi

Ini berarti bahwa Anda selalu membuka file terakhir dan judul selalu sebagaimana mestinya. Satu-satunya cara adalah me-reset sendiri ketika Anda me-refresh sesi Anda dengan ALT + F2 + R.

  1. Dan Anda harus memiliki skrip bash di /usr/local/binofcourse.

Catatan akhir:

  • Ketika saya menggunakan --name "\a\b\c"ini untuk memperbaiki bug , jangan ganti dengan nama aplikasi!
  • Jika Anda menghapus tanda komentar pada baris terakhir skrip, skrip tidak akan berakhir hingga aplikasi ditutup.
  • Penjelasan ${@:2}dalam kode yang diminta oleh @Maud Kon :

    1. $@ adalah array yang menyimpan semua parameter posisi.
    2. ${@:2}berarti: Semua parameter posisi kecuali yang pertama
    3. Katakanlah saya memanggil program dengan cara ini:

      awesome-program foo bar baz fooz
      
      • ${@:1} akan menjadi foo bar baz fooz
      • ${@:2} akan menjadi bar baz fooz
      • ${@:3} akan menjadi baz fooz
      • ${@:4} akan menjadi fooz
      • ${@:5} kosong karena tidak ada lebih banyak parameter posisi.
    4. $@, ${@}dan ${@:1}hal yang sama: Semua parameter posisi.

    5. Pelajari lebih lanjut tentang topik ini di sini: http://wiki.bash-hackers.org/scripting/posparams
Helio
sumber
Saya sudah mencoba kedua tata krama (juga yang di sini) dan skrip bash Anda berfungsi sebagian. Ini meluncurkan jendela baru dengan nama baru, tetapi jika saya meluncurkan lagi dari ikhtisar, itu masih memiliki entri lama ... apakah saya melakukan sesuatu yang salah?
Maud Kon
@MaudKon: Apa gambarannya? Coba skripnya sekarang. Jika Anda memanggil "Ikhtisar" ke dasbor (panel besar dengan banyak aplikasi), saya akan mengatakan kepada Anda bahwa skrip saya tidak membuat perubahan permanen.
Helio
Maksud saya ikhtisar aplikasi, saya sudah menyembunyikan dasbor itu sendiri, haha. Hmm, ya, daripada naskah Anda bekerja. Apakah ada cara untuk membuat perubahan itu permanen? Seperti mengedit file yang dapat dieksekusi dengan fx. GHex? Atau mengubah executable di file .desktop?
Maud Kon
Coba sekarang. Gunakan skrip baru dan ikuti metode di bawah bagian Untuk membuat perubahan permanen . Sekarang saya mengerti bahwa Anda membuat kamuflase Ubuntu ;-)
Helio
1
@ Halo saya perbarui posting Anda dengan langkah-langkah yang bekerja untuk saya. Saya juga menambahkan proses untuk membuat fungsi "terbuka dengan" berfungsi.
Maud Kon
2

Cukup gunakan file terjemahan!

Saya mengalami tantangan yang sangat masalah dengan Thunar: Menjadi menjengkelkan ketika Compiz Scale menampilkan judul jendela Thunar sebagai "AnyFolder - File Manager" dan memulai ruang dengan informasi yang tidak perlu.

Saya mencoba cara-cara yang disebutkan di atas dengan xdotooldan wmctrltetapi mereka tidak permanen karena Thunar mengubah judul jendelanya setiap kali saya pergi ke folder lain. Dan rasanya dilebih-lebihkan memiliki skrip yang ada di latar belakang untuk mengubah judulnya kembali setiap kali Thunar mengubahnya.

Solusi yang lebih mudah adalah dengan menggunakan file terjemahan yang datang dengan setiap aplikasi. Anda hanya perlu mengkompilasi ulang file sumber terjemahan dengan alat yang disebut msgfmttermasuk dalam gettextpaket. Saya hanya melakukan ini untuk gThumb - hanya untuk bersenang-senang - dan itu berhasil juga.

1. Dapatkan kode sumber untuk aplikasi yang bersangkutan.
Ketik atau buka http://packages.ubuntu.com , dapatkan sumbernya dan cari folder bernama : berisi file bahasa teks biasa. Cari bahasa Anda. Katakanlah Anda dari Brasil, file itu adalah$ sudo apt-get source APPLICATIONpopt_BR.po

2. Ubah file sesuai kebutuhan Anda.
Carilah yang tepat! judul jendela yang ingin Anda singkirkan atau ubah. Dalam kasus Thunar itu adalah "File Manager" dan pt_BR.posaya temukan

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

di mana msgidsinyal aplikasi mengirim dan msgstrapa yang diterjemahkan langpack itu.
Ubah msgstrke apa pun yang Anda suka, yaitu msgstr "o_-".
Saya belajar bahwa jika Anda membiarkan terjemahannya kosong seperti ini msgstr "", aplikasi akan kembali ke msgid. Jika Anda ingin "kosong", gunakan spasi putih. Atau sebuah titik. Atau simbol ASCII yang funky.

3. Dapatkan kompiler
Seperti yang disebutkan Anda butuhkan msgfmtdari gettextpaket, jadi Anda perlu mengetik
$ sudo apt-get install gettext

4. Kompilasi
Buka terminal, buka folder dengan perubahan Anda pt_BR.podan biarkan msgfmt memeriksa file untuk kesalahan:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
Jika tidak apa-apa, lanjutkan dan kompilasi:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. Tempatkan file
Lihat bagaimana terjemahan asli di / usr / share / locale / YOUR Westph / LC_MESSAGES / atau / usr / share / langale-langpack / YOURosat / LC_MESSAGES / dinamai dan tempatkan file Anda di sana. Jika tidak ada di kedua tempat, letakkan di salah satu dari mereka dan coba sedikit dengan nama file: huruf kecil, Camelcase atau sesuatu seperti, yaitu gthumb.moatau YOUR-APP.mo.
Pertama-tama buat salinan asli: lalu salin terjemahan baru Anda di sana
$ 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

Jika YOUR_APP berjalan, tutup semua instance.
Menguji!

Tips Jika Anda menjalankan Ubuntu dengan EN lokalisasi seperti saya, cukup gunakan * .po, hapus atau komentar semua pasangan msgid / msg yang tidak berubah dan letakkan di / usr / share / locale / en / LC_MESSAGES / .

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

ronso0
sumber
Hanya sebagai catatan; Saya ragu Anda benar-benar mencoba skrip, karena mempertahankan nama, sebagaimana disebutkan dalam jawaban.
Jacob Vlijm
Anda benar, saya tidak mencoba skrip ini tetapi yang serupa (lebih sederhana) dari tempat lain, dan trik dengan xdotool dan wmctrl. Seperti yang disebutkan, bagi saya rasanya seperti menembak burung pipit dengan meriam, dibandingkan dengan mengubah satu baris dalam file sumber. Namun demikian, orang dapat belajar banyak dari skrip.
ronso0
Saya ingin tahu apa yang terjadi jika aplikasi ditingkatkan. Apakah file * .desktop dan file lokalisasi ditimpa?
ronso0
Seperti dijelaskan di sini askubuntu.com/a/703942/72216 , saya tidak berbagi fobia untuk script latar belakang, jika itu ditulis dengan baik dan tidak menambah fungsionalitas penting. Tentang .desktopfile: sekali lagi, Anda harus mengacaukan jawaban saya dengan yang lain yang mungkin telah Anda baca. Jawabannya tidak mengedit .desktopfile dan tidak ada tindakan yang diperlukan ketika aplikasi diinstal ulang.
Jacob Vlijm
Ini adalah pertanyaan umum karena jawaban # 2 memodifikasi .desktopfile dan saya melakukannya dengan file terjemahan. Apakah kamu mengetahuinya? Dan saya dapat memberikan solusi skrip APAPUN kesempatan kedua karena saya sekarang membaca yaitu "mu__Incoming -" di mana saya punya "mu__Incoming - File Manager" . Untuk aplikasi yang memiliki judul jendela statis tanpa "path / ke / folder", solusi saya berfungsi dengan baik.
ronso0
1

Ganti (bagian) judul jendela dengan wmctrl

Karena jawaban saya sendiri menggunakan file terjemahan aplikasi tidak cukup untuk beberapa kasus bagi saya, saya membangun solusi Jacob Vlijm dan memodifikasi skripnya untuk mengganti string tertentu dalam judul jendela. Saya harap tidak apa-apa untuk mengirim jawaban yang terpisah ini. Kredit diberikan kepada Jacob Vlijm untuk ide dan pengaturan naskah!

Sebagai contoh, saya suka membaca Some fancy websitebukan Some fancy website - Mozilla Firefox. Plugin skala Compiz jauh lebih jelas sekarang karena saya juga menghapus - File managerdan string lainnya.

Perubahan yang saya buat:

  1. gunakan //sebagai pemisah window_names.txtuntuk memungkinkan spasi putih
  2. gunakan wmctrlalih-alih xdotooluntuk memodifikasi judul jendela (karena xdotool tidak menangani karakter non-ASCII dengan sangat baik):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. beberapa baris tambahan dalam skrip untuk melakukan penggantian string dll.

Yang diubah window_names.txtterstruktur seperti ini:
[process name]//[exact text to replace]//[replacement text]

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

Skrip germo:

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

Sekali lagi: Kredit diberikan kepada Jacob Vlijm untuk ide dan pengaturan naskah!

ronso0
sumber