StartupWMClass (एकता में एक ही लॉन्चर के तहत समूह के लिए) के लिए कई मान सेट करें


20

यह एक सामान्य समस्या का एक विशिष्ट उदाहरण है जिसका मैं अभी तक कोई समाधान नहीं निकाल पाया हूँ।

मेरा एक प्रोग्राम है (Android वर्चुअल डिवाइस मैनेजर) जो 'सब-प्रोग्राम्स' (यानी एमुलेटर या वर्चुअल डिवाइसेस) को अपने भीतर से लॉन्च करता है (जहाँ से भी लॉन्च किया जा सकता है)। मैं चाहता हूं कि इन कार्यक्रमों के किसी भी उदाहरण को एक ही एकता चिह्न के तहत समूहीकृत किया जाए।

मैंने इसे .desktopआज़माने और पूरा करने के लिए एक फ़ाइल बनाई है, लेकिन इसके बारे में कैसे जाना जाए, यह बिल्कुल नहीं पता। डेस्कटॉप फ़ाइल इस प्रकार है:

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

जो मैं समझता हूं, StartupWMClassवह वही है जिसे मुझे इसे सही ढंग से प्राप्त करने के लिए निर्धारित करने की आवश्यकता है। मैंने दो क्लास के नाम ('एंड्रॉइड वर्चुअल डिवाइस मैनेजर' और 'एमुलेटर64-आर्म') xprop WM_CLASSको रिस्पेक्टिव विंडो पर उपयोग करके प्राप्त किया है। दोनों व्यक्तिगत रूप से काम करते हैं (लॉन्चर आइकन सही तरीके से प्रोग्राम से जुड़ा हुआ है चाहे वह किस तरह से लॉन्च किया गया हो), लेकिन मैं दोनों के लिए काम करने के लिए इसे प्राप्त नहीं कर सकता।

मैं यह मान रहा हूं कि मुझे किसी तरह दो मूल्यों को निर्धारित करने की आवश्यकता है, StartupWMClassलेकिन इसे सही तरीके से करने में सक्षम नहीं है (या पता है कि यह एक वैध संचालन है)। मैंने कोशिश की है, बृहदान्त्र पर्यावरण चर की तरह अलग हो गया, अल्पविराम अलग हो गया, उद्धरण, आदि और मुझे आधिकारिक दस्तावेज में कोई संकेत नहीं मिल सकता है ।

कोई सुझाव?

संपादित करें:

एक और, अधिक पांडित्य, लेकिन शायद अधिक पहचान योग्य उदाहरण के साथ है Matlab। मैं 2013a और स्प्लैश स्क्रीन चला रहा हूं जो शुरू में दिखाता है और कार्यक्रम में पूरी तरह से अलग WM_CLASSमूल्य हैं। इसका मतलब है, जब मैं इसमें अपने लॉन्चर को क्लिक करता हूं StartupWMClass=com-mathworks-util-PostVMInit, तो स्प्लैश स्क्रीन एक अलग (डिफ़ॉल्ट अज्ञात) Unityआइकन के साथ आती है , जबकि शेष मेरे लॉन्चर के तहत समूहीकृत होती है।

xprop WMCLASSपहले स्प्लैश स्क्रीन का उपयोग और क्लिक करके, फिर एक सक्रिय Matlabसत्र के साथ दोहराते हुए मुझे निम्नलिखित टर्मिनल आउटपुट मिलता है:

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"

अगर मैं कुछ लाइनों के साथ निर्दिष्ट कर सकता है:

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

यह पूरी तरह से काम करेगा (जैसा कि दोनों अलग-अलग काम करते हैं) लेकिन मुझे सिंटैक्स का कोई पता नहीं है, अगर यह मौजूद है। मुझे अभी कुछ भी नहीं पता है कि मैंने कोशिश की है इस तरह से काम किया है।

किसी भी तरह की मदद या एक निश्चित जवाब बहुत अच्छा होगा क्योंकि मेरा मानना ​​है कि यह एक अच्छी तरह से काम कर रहे डेस्कटॉप का एक मौलिक तत्व है।


1
क्या आप दराज से कुछ संकेत प्राप्त करने में सक्षम होंगे ?

1
मैंने Drawersउस लिंक के वीडियो को देखा है और वे जो दिखाते हैं, वह केवल लिंक को समूहित करता है, जब आप किसी भी उप आइटम पर क्लिक करते हैं, तो यह अभी भी Unityलांचर में अपने स्वयं के आइकन के साथ बनाया जाता है, जिसे मैं रोकने की कोशिश कर रहा हूं
बीटी

जवाबों:


8

Starcraft II के साथ मेरे लिए एक ही समस्या ने प्लेऑनलाइन को लॉन्च किया। पहला एप्लिकेशन लॉन्चर है:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") और फिर खेल ही:

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

मुझे लगता है कि शराब द्विआधारी निष्पादन योग्य के साथ वर्ग सेट कर रहा है।

मुझे bamf कोड (bamf_matcher.c, सम्मिलित_desktop_file_class_into_table () विधि) में एक नज़र थी:

  • एक नक्शा है जो एक डेस्कटॉप फ़ाइल और एक और केवल एक वर्ग के बीच संबंध बनाता है,
  • मुख्य StartupWMClass को g_key_file_get_string () के साथ पढ़ा जाता है जिसे स्ट्रिंग्स की सूची वापस करने के लिए डिज़ाइन नहीं किया गया है,
  • g_key_file_get_string_list () ऐसा कर सकता था, लेकिन bamf डेवलपपर्स ने कई कक्षाओं को एक सिंगल डेस्कटॉप फ़ाइल में शामिल करने में सक्षम होने के लिए रूपरेखा तैयार नहीं की।

मेरे मामले में मैं एक ही कुंजी के साथ 2 डेस्कटॉप फ़ाइलों को बनाकर धोखा देता हूं, लेकिन StartupWMClass। यह सही नहीं है क्योंकि मेरे पास अभी भी 2 यूएनआई आइकन हैं जब लांचर में लेकिन महत्वपूर्ण बात यह है कि मुझे पता है कि क्यों :-)।


यह बहुत ही आशाजनक लग रहा है, मैंने कोशिश की है और उनसे पुष्टि प्राप्त करने के लिए एक सवाल पूछा है , लेकिन अभी भी कोई प्रतिक्रिया नहीं मिली है ...
बीटी

1
यह काफी जवाब नहीं है। इसका उत्तर "आप नहीं" हो सकता है क्योंकि डेस्कटॉप फ़ाइल विनिर्देश इस मान को एक स्ट्रिंग बनाता है न कि स्ट्रिंग्स की एक सूची (जिसके कारण bamfdaemon get_string () और get_string_list () उस मान के लिए) का उपयोग करता है।
dobey

1

मुझे पता है कि यह प्रश्न वास्तव में पुराना है, लेकिन एक ही समस्या से गुजरने के बाद, मुझे लगता है कि मैंने आखिरकार इसके लिए एक वर्कअराउंड बनाया है, और इस मुद्दे वाले किसी के साथ साझा करने का निर्णय लिया है:

जैसा कि हम एक एकल .desktop फ़ाइल के लिए कई WMClasses सेट नहीं कर सकते, तो सभी विंडो को एक सिंगल WMClass में सेट क्यों नहीं करें?

हम ऐसा कुछ कर सकते हैं (जाहिर है, प्रतिस्थापित करें Window 1, Window 2और potatoesआपकी खिड़कियों के नाम और वांछित WMClass के साथ):

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

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

और .desktop फ़ाइल पर हम यह कर सकते हैं: StartupWMClass=potatoes

Tadam! सभी विंडो अब समूहीकृत हैं।
लेकिन हे, क्या हम हर बार प्रोग्राम खुलने के समय मैन्युअल रूप से ऐसा कर रहे हैं? बिलकूल नही।

हम बस जा सकते हैं और एक बैश स्क्रिप्ट बना सकते हैं जो कि स्वचालित रूप से हर आधे सेकंड में करती है:

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

और अंत में, .sh को हमने ओएस के शुरू होने पर हर बार चलाने के लिए सेट किया है: स्क्रीनशॉट

आशा है कि मेरा उत्तर इस प्रश्न को ब्राउज़ करने में किसी के लिए भी उपयोगी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.