StartupWMClass için Çoklu değerleri ayarlayın (Unity ile aynı fırlatıcı altında gruplandırın)

20

Bu, henüz bir çözüm bulamadığım genel bir sorun örneğidir.

'Alt programlarını (yani, emülatör veya sanal aygıtlar) kendi içinden başlatan bir program (Android Sanal Aygıt Yöneticisi) var (ayrıca başka bir yerden de başlatılabilir). Bu programların EITHER örneğinin aynı Birlik simgesi altında gruplandırılmasını istiyorum.

Bunu denemek ve başarmak için .desktop dosyası oluşturdum, ancak bunun nasıl yapılacağını tam olarak 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, StartupWMClass , bunu doğru bir şekilde elde etmek için ayarlamam gerekenler. İki sınıf ismini ('Android Virtual Device Manager' ve 'emulator64-arm'), repsektif pencerelerde xprop WM_CLASS kullanarak elde ettim. Her ikisi de ayrı ayrı çalışır (başlatıcı simgesi, hangi yolla başlatılsa da programa doğru şekilde bağlanır), ancak her ikisini de işe yaratamam.

Bir şekilde StartupWMClass için iki değer ayarlamam gerektiğini, ancak doğru bir şekilde yapamadığımı varsayarak (veya geçerli bir işlem olup olmadığını bildiğimi varsayarak). Ben denedim, kolon çevre değişkenleri gibi ayrılmış, virgülle ayrılmış, tırnak vb. Ve herhangi bir ipucu bulamıyorum resmi belgeler .

Herhangi bir öneri?

DÜZENLEME:

Başka, daha akılda kalıcı, ancak muhtemelen daha tanımlanabilir bir örnek Matlab ile. 2013a'yı çalıştırıyorum ve başlangıçta gösterilen ve program tamamen farklı WM_CLASS değerlerine sahip olan açılış ekranı. Bu, başlatıcıyı StartupWMClass=com-mathworks-util-PostVMInit ile tıkladığımda, açılış ekranının farklı (varsayılan Bilinmeyen) Unity simgesiyle gelirken, geri kalanı benim başlatıcımın altında gruplandırılır.

xprop WMCLASS kullanarak ve ilk açılış ekranına tıkladıktan sonra aktif Matlab oturumunu tekrarlayarak aşağıdaki terminal çıkışını elde ederim:

[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

Çizgiler boyunca bir şey belirtebilirsem:

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

Bu mükemmel çalışırdı (her ikisi de ayrı ayrı çalıştığı gibi), fakat eğer varsa, sözdizimi hakkında hiçbir fikrim yok. Şimdiye kadar çalışmış olduğum hiçbir şey bilmiyorum.

Herhangi bir yardım ya da kesin bir cevap, her ikisinin de iyi çalışan bir masaüstünün oldukça temel bir unsuru olduğuna inandığım kadar iyi olurdu.

    
sordu B T 29.01.2013 02:17

2 cevap

8

Starcraft II ile benim için aynı problem atıldı playonlinux attı. İ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 şarap, sınıfı ikili yürütülebilir dosyayla ayarlıyor.

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

  • Masaüstü dosya ile bir ve bir sınıf arasında ilişki kuran bir harita var
  • StartupWMClass tuşu, dizelerin listesini döndürmek için tasarlanmamış g_key_file_get_string () ile okunur,
  • g_key_file_get_string_list () bunu yapabilirdi, ancak bamf geliştiricileri birden fazla sınıfı tek bir masaüstü dosyasına ilişkilendirebilmek için çerçeve tasarlamadılar.

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

    
verilen cevap gotrunk 12.05.2013 14:15
1

Bu sorunun gerçekten yaşlı olduğunu biliyorum, ancak aynı problemi geçtikten sonra, bunun için bir geçici çözüm oluşturduğumu düşünüyorum ve bu sorunu yaşayan herkesle paylaşmaya karar verdim:

Tek bir .desktop dosyası için birden çok WMClasses ayarlayamadığımızdan, neden tüm pencereleri tek bir WMClass'a ayarlamıyoruz?

Bunun gibi bir şey yapabiliriz (Açıkçası, Window 1 , Window 2 ve potatoes ile windows adlarınızı ve istediğiniz WMClass'ı değiştirin):

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ıldı.
Hey, program her açıldığında bunu elle yapıyor muyuz? Tabii ki değil.

Gidip her yarım saniyede bunu otomatik olarak 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

Son olarak, işletim sisteminin her açılışında çalıştırmak için yarattığımız .sh:

Cevabım, bu soruyu arayan herkese yardımcı olur.

    
verilen cevap Misterio7 25.03.2016 17:15

Etiketlerdeki diğer soruları oku