Tetapkan beberapa nilai untuk StartupWMClass (untuk mengelompokkan di bawah peluncur yang sama di Unity)

20

Ini contoh spesifik masalah generik yang belum saya temukan solusinya.

Saya memiliki program (Android Virtual Device Manager) yang meluncurkan 'sub-program' (yaitu emulator atau perangkat virtual) dari dalam dirinya sendiri (juga dapat diluncurkan dari tempat lain di mana). Saya ingin contoh EITHER dari program ini dikelompokkan di bawah ikon Unity yang sama.

Saya telah membuat .desktopfile untuk mencoba dan menyelesaikan ini tetapi tidak tahu persis bagaimana cara melakukannya. File desktop adalah sebagai berikut:

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Name=Android Virtual Device
Icon=/home/ben/.icons/android.svg
Exec=/home/ben/usr/bin/android avd
StartupWMClass=Android Virtual Device Manager

Dari apa yang saya pahami, StartupWMClassadalah apa yang perlu saya atur untuk mencapai ini dengan benar. Saya telah memperoleh dua nama kelas ('Android Virtual Device Manager' dan 'emulator64-arm') menggunakan xprop WM_CLASSpada jendela repsective. Keduanya bekerja secara individual (ikon peluncur terpasang dengan benar ke program apa pun yang diluncurkan), tetapi saya tidak dapat membuatnya berfungsi untuk keduanya.

Saya berasumsi bahwa saya entah bagaimana perlu menetapkan dua nilai untuk StartupWMClasstetapi belum dapat melakukannya dengan benar (atau tahu apakah itu operasi yang valid). Saya telah mencoba, yang dipisahkan oleh titik dua seperti variabel lingkungan, dipisahkan dengan koma, tanda kutip, dll dan saya tidak dapat menemukan petunjuk apa pun dalam dokumentasi resmi .

Ada saran?

EDIT:

Contoh lain, yang lebih bertele-tele, tetapi mungkin lebih bisa diidentifikasi adalah dengan Matlab. Saya menjalankan 2013a dan layar splash yang awalnya ditampilkan dan program memiliki WM_CLASSnilai yang sama sekali berbeda . Ini berarti, ketika saya mengklik peluncur saya StartupWMClass=com-mathworks-util-PostVMInitdi dalamnya, layar splash muncul dengan Unityikon (default tidak dikenal) yang berbeda , sedangkan sisanya muncul dikelompokkan di bawah peluncur saya.

Dengan menggunakan xprop WMCLASSdan mengklik dulu layar splash, lalu mengulangi dengan Matlabsesi aktif saya mendapatkan output terminal berikut:

ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

Jika saya bisa menentukan sesuatu di sepanjang baris:

StartupWMClass=com-mathworks-util-PostVMInit&&MATLAB

Itu akan bekerja dengan sempurna (karena keduanya bekerja secara terpisah) tetapi saya tidak tahu sintaksnya, jika itu ada. Saya hanya tahu tidak ada yang saya coba sejauh ini.

Setiap bantuan atau jawaban pasti bagaimanapun akan menjadi hebat karena saya percaya ini adalah elemen yang cukup mendasar dari desktop yang berfungsi dengan baik.

BT
sumber
1
Apakah Anda bisa mendapatkan beberapa petunjuk dari Laci ?
1
Saya telah melihat video Drawersdi tautan itu dan dari apa yang ditampilkan, itu hanya mengelompokkan tautan, ketika Anda mengklik setiap sub item, itu masih dibuat dengan ikonnya sendiri di Unitypeluncur yang sedang saya coba hentikan
BT

Jawaban:

8

Masalah yang sama bagi saya dengan Starcraft II meluncurkan melempar playonlinux. Pertama ada peluncur aplikasi:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") dan kemudian game itu sendiri:

  • (WM_CLASS(STRING) = "SC2.exe", "Wine")

Saya kira anggur menetapkan kelas dengan biner yang dapat dieksekusi.

Saya telah melihat kode bamf (bamf_matcher.c, metode insert_desktop_file_class_into_table ()):

  • Ada peta yang membuat hubungan antara file desktop dan satu dan hanya satu kelas,
  • StartupWMClass kunci dibaca dengan g_key_file_get_string () yang tidak dirancang untuk mengembalikan daftar string,
  • g_key_file_get_string_list () dapat melakukan itu, tetapi pengembang bamf tidak merancang kerangka kerja untuk dapat mengaitkan beberapa kelas ke satu file desktop tunggal.

Dalam kasus saya, saya curang dengan membuat 2 file desktop dengan tombol yang sama tetapi StartupWMClass. Ini tidak sempurna karena saya masih memiliki 2 ikon Uniy ketika di peluncur tetapi yang penting adalah saya tahu mengapa :-).

gotrunk
sumber
Ini terlihat sangat menjanjikan, saya telah mengajukan pertanyaan untuk mencoba dan mendapatkan konfirmasi dari mereka, tetapi masih belum ada tanggapan ...
BT
1
Ini bukan jawaban. Jawabannya adalah "Anda tidak bisa" karena spesifikasi File Desktop menjadikan nilai ini sebagai string tunggal dan bukan daftar string (itulah sebabnya bamfdaemon menggunakan get_string () dan bukan get_string_list () untuk nilai itu).
dobey
1

Saya tahu pertanyaan ini benar-benar sudah tua, tetapi setelah melalui masalah yang sama, saya pikir saya akhirnya membuat solusi untuk ini, dan memutuskan untuk berbagi dengan siapa pun yang memiliki masalah ini:

Karena kita tidak dapat mengatur beberapa WMClasses untuk satu file .desktop, mengapa tidak mengatur semua windows ke satu WMClass?

Kami dapat melakukan sesuatu seperti ini (Jelas, ganti Window 1, Window 2dan potatoesdengan nama windows Anda dan WMClass yang diinginkan):

xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"

xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"

Dan pada file .desktop kita dapat melakukan ini: StartupWMClass=potatoes

Tadam! Semua jendela dikelompokkan sekarang.
Tapi hei, apakah kita melakukan ini secara manual setiap kali program dibuka? Tentu saja tidak.

Kita bisa pergi dan membuat skrip bash yang secara otomatis melakukannya setiap setengah detik:

while true
do
    xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    sleep 0.5
done

Dan akhirnya, atur .sh yang kami buat untuk dijalankan setiap kali OS dijalankan: Tangkapan layar

Semoga jawaban saya bermanfaat bagi siapa pun yang menelusuri pertanyaan ini.

Misterio
sumber