StartupWMClass için Birden Çok Değer Ayarla (Unity'de aynı başlatıcının altında gruplamak için)


20

Bu, genel bir sorunun özel bir örneği için henüz bir çözüm bulamadım.

'Alt programları' (yani öykünücüler veya sanal cihazlar) kendi içinden başlatan (başka bir yerden da başlatılabilir) bir programım (Android Sanal Cihaz Yöneticisi) var. Bu programların EITHER örneklerinin aynı Birlik simgesi altında gruplandırılmasını istiyorum.

Bunu .desktopdenemek ve başarmak için bir dosya oluşturdum, ancak tam olarak nasıl gideceğimi bilmiyorum. Masaüstü dosyası aşağıdaki gibidir:

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

Anladığım kadarıyla, StartupWMClassbunu doğru bir şekilde başarmak için ayarlamam gereken şey. xprop WM_CLASSGizli pencereleri kullanarak iki sınıf adı ('Android Sanal Aygıt Yöneticisi' ve 'emulator64-kol') aldım. Her ikisi de ayrı ayrı çalışır (başlatıcı simgesi, hangi şekilde başlatıldığına bakılmaksızın programa doğru şekilde eklenir), ancak her ikisi için de çalışmasını sağlayamıyorum.

Bir şekilde iki değer belirlemem gerektiğini StartupWMClassancak doğru bir şekilde yapamadığımı (veya geçerli bir işlem olup olmadığını bildiğimi) kabul ediyorum. Denedim, kolon gibi ortam değişkenleri ayrılmış, virgülle ayrılmış, tırnak vb. Ve resmi belgelerde ipucu bulamıyorum .

Baska öneri?

DÜZENLE:

Başka, daha bilgili, ama muhtemelen daha fazla tanımlanabilir bir örnek Matlab. 2013a kullanıyorum ve başlangıçta gösterilen açılış ekranı ve programın tamamen farklı WM_CLASSdeğerleri var. Bu, StartupWMClass=com-mathworks-util-PostVMInitiçinde başlatıcımı tıklattığımda , açılış ekranının farklı bir (varsayılan Bilinmeyen) Unitysimgesiyle ortaya çıkması, gerisi başlatıcımın altında gruplanmış olarak gelmesi anlamına geliyor.

xprop WMCLASSİlk açılış ekranını kullanarak ve tıklayarak, ardından aktif bir Matlaboturumla tekrarlayarak aşağıdaki terminal çıkışını elde ederim:

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"

Satırları boyunca bir şey belirtebilirsem:

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

Bu mükemmel bir şekilde işe yarar (her ikisi de ayrı ayrı çalışır), ancak varsa bile sözdizimi hakkında hiçbir fikrim yok. Sadece şimdiye kadar denediğim hiçbir şeyin işe yaramadığını biliyorum.

Herhangi bir yardım ya da kesin bir cevap, bunun iyi işleyen bir masaüstünün oldukça temel bir unsuru olduğuna inandığım için çok iyi olurdu.


1
Çekmecelerden bazı ipuçları alabilir misiniz?

1
DrawersBu bağlantıdaki videolara baktım ve gösterdikleri şeyden sadece bağlantıları gruplandırdı, herhangi bir alt öğeye tıkladığınızda, Unitybaşlatmaya çalıştığım başlatıcıda kendi simgesiyle oluşturuldu
BT

Yanıtlar:


8

Benim için de aynı sorun II Starcraft ile başlatılan playonlinux fırlattı. İlk önce bir uygulama başlatıcısı var:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") ve sonra oyunun kendisi:

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

Sanırım bu şarap sınıfı çalıştırılabilir dosyaya koyuyor.

Bamf koduna baktım (bamf_matcher.c, insert_desktop_file_class_into_table () yöntemi):

  • Bir masaüstü dosyası ile bir ve sadece bir sınıf arasında ilişki kuran bir harita var.
  • StartupWMClass anahtarı, bir dizge listesi döndürmek için tasarlanmamış g_key_file_get_string () ile okunur,
  • g_key_file_get_string_list () bunu yapabilir, ancak bamf geliştiricileri birden fazla sınıfı tek bir masaüstü dosyasına ilişkilendirebilmek için çerçeve tasarlamamışlardır.

Benim durumumda, ancak StartupWMClass ile aynı tuşlarla 2 masaüstü dosyası oluşturarak hile yapıyorum. Bu mükemmel değil çünkü başlatıcıda hala 2 tane Uniy ikonum var ama önemli olan nedenini biliyorum :-).


Bu çok umut verici görünüyor , onlardan onay almak için bir soru sordum , ancak henüz cevap olarak henüz bir cevap alamadım ...
BT

1
Bu tam bir cevap değil. Cevap "yapamazsınız" çünkü Masaüstü Dosyası özelliği bu değeri tek bir dize yapar ve dizelerin bir listesini yapmaz (bu yüzden bamfdaemon get_string () kullanır ve bu değer için get_string_list () kullanmaz).
Ocak'ta

1

Bu sorunun gerçekten eski olduğunu biliyorum, ancak aynı sorunu çözdükten sonra, sonunda bunun için bir geçici çözüm oluşturduğumu ve bu soruna sahip olanlarla paylaşmaya karar verdiğimi düşünüyorum:

Tek bir .desktop dosyası için birden fazla WMClasses ayarlayamadığımız için neden tüm pencereleri tek bir WMClass'a ayarlamıyorsunuz?

(Açıkçası, yerine biz böyle bir şey yapabilir Window 1, Window 2ve potatoespencerelerinizi isimleri ve istenen WMClass ile):

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

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

Ve .desktop dosyasında bunu yapabiliriz: StartupWMClass=potatoes

Tadam! Tüm pencereler şimdi gruplandırılmış.
Ancak, program her açıldığında bunu manuel olarak mı yapıyoruz? Tabii ki değil.

Gidip otomatik olarak bunu her yarım saniyede bir yapan bir bash betiği yapabiliriz:

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

Ve son olarak, işletim sisteminin her başlatılışında çalıştırmak için yarattığımız .sh'yi ayarlayın: Ekran görüntüsü

Umarım cevabım bu soruyu gezen herkese yardımcı olur.

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.