ตั้งค่าหลายค่าสำหรับ StartupWMClass (ไปยังกลุ่มภายใต้ตัวเรียกใช้งานเดียวกันใน Unity)


20

นี่เป็นตัวอย่างเฉพาะของปัญหาทั่วไปที่ฉันยังไม่สามารถหาวิธีแก้ไขได้

ฉันมีโปรแกรม (ตัวจัดการอุปกรณ์เสมือนของ Android) ที่เปิดตัว 'โปรแกรมย่อย' (เช่นโปรแกรมจำลองหรืออุปกรณ์เสมือน) จากภายในตัวเอง (สามารถเปิดตัวได้จากที่อื่น) ฉันต้องการอินสแตนซ์ของ EITHER ของโปรแกรมเหล่านี้เพื่อจัดกลุ่มภายใต้ไอคอน Unity เดียวกัน

ฉันสร้าง.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คือสิ่งที่ฉันต้องตั้งค่าเพื่อให้บรรลุสิ่งนี้อย่างถูกต้อง ฉันได้รับชื่อคลาสสองรายการ ('Android Virtual Device Manager' และ 'emulator64-arm') โดยใช้xprop WM_CLASSบนหน้าต่าง repsective ทั้งสองทำงานแยกกัน (ไอคอนตัวเรียกใช้เชื่อมต่อกับโปรแกรมอย่างถูกต้องไม่ว่าจะเปิดตัวอย่างไร) แต่ฉันไม่สามารถทำให้มันใช้งานได้สำหรับทั้งคู่

ฉันสมมติว่าฉันต้องการตั้งค่าสองค่า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ตัวเรียกใช้ซึ่งเป็นสิ่งที่ฉันพยายามหยุด
BT

คำตอบ:


8

ปัญหาเดียวกันสำหรับฉันกับ Starcraft II เปิดตัว Throw playonlinux มีตัวเรียกใช้งานแอปพลิเคชั่นตัวแรก:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") และจากนั้นเกมก็:

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

ฉันเดาว่าไวน์กำลังตั้งคลาสด้วยระบบปฏิบัติการไบนารี

ฉันดูในรหัส bamf (bamf_matcher.c, insert_desktop_file_class_into_table วิธี) ():

  • มีแผนที่ที่เชื่อมโยงระหว่างไฟล์เดสก์ท็อปกับหนึ่งคลาสเท่านั้น
  • ปุ่ม StartupWMClass อ่านด้วย g_key_file_get_string () ซึ่งไม่ได้ออกแบบมาเพื่อส่งคืนรายการสตริง
  • g_key_file_get_string_list () สามารถทำได้ แต่ bamf developpers ไม่ได้ออกแบบกรอบการทำงานเพื่อให้สามารถเชื่อมโยงหลายคลาสกับไฟล์เดสก์ท็อปไฟล์เดียวได้

ในกรณีของฉันฉันโกงโดยสร้างไฟล์บนเดสก์ท็อป 2 ไฟล์โดยใช้คีย์เดียวกันยกเว้น StartupWMClass มันไม่สมบูรณ์เพราะฉันยังมีไอคอน Uniy 2 อันในตัวเรียกใช้งาน แต่สิ่งสำคัญคือฉันรู้ว่าทำไม :-)


สิ่งนี้ดูมีแนวโน้มมากฉันได้ถามคำถามเพื่อลองและได้รับการยืนยันจากพวกเขา แต่ยังไม่มีคำตอบในตอนนี้ ...
BT

1
นี่ไม่ใช่คำตอบที่ค่อนข้าง คำตอบคือ "คุณไม่สามารถ" ได้เนื่องจากข้อกำหนดไฟล์เดสก์ท็อปทำให้ค่านี้เป็นสตริงเดี่ยวและไม่ใช่รายการสตริง (ซึ่งเป็นสาเหตุที่ bamfdaemon ใช้ get_string () และไม่ใช่ get_string_list () สำหรับค่านั้น)
dobey

1

ฉันรู้ว่าคำถามนี้เก่าจริง ๆ แต่หลังจากผ่านปัญหาเดียวกันฉันคิดว่าในที่สุดฉันก็สร้างวิธีแก้ปัญหาสำหรับเรื่องนี้และตัดสินใจที่จะแบ่งปันกับทุกคนที่มีปัญหานี้:

เนื่องจากเราไม่สามารถตั้ง WMClasses หลายรายการสำหรับไฟล์. เดสก์ท็อปเดียวทำไมไม่ตั้งค่า windows ทั้งหมดเป็น 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 ที่เราสร้างขึ้นเพื่อให้ทำงานทุกครั้งที่ระบบปฏิบัติการเริ่มทำงาน: ภาพหน้าจอ

หวังว่าคำตอบของฉันจะเป็นประโยชน์กับทุกคนที่กำลังดูคำถามนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.