วิธีเพิ่มการรองรับเมนูโกลบอลในแอพ python non-gtk, non-qt


24

ฉันกำลังมองหาเอกสารที่ดี (ตัวอย่างเช่นการสอนหรือคำแนะนำ) เกี่ยวกับวิธีเพิ่มการสนับสนุนเมนูระดับโลกให้กับแอปพลิเคชันที่ไม่ใช่ gtk, non-qt (ใน gtk มันใช้งานได้ 'อย่างน่าอัศจรรย์' สำหรับเมนูหลัก ... ) ชุดเครื่องมือที่ฉันต้องการใช้กับkivyซึ่งรองรับglib -mainloop (เช่นสำหรับ gstreamer) ดังนั้นโดยหลักการแล้วทุกคนควรทำงานที่นั่น

ฉันได้เห็นการอ้างอิง API ของDbusmenuและที่นี่แล้ว แต่นั่นไม่เป็นประโยชน์สำหรับการทำความเข้าใจกลไก

มีตัวอย่างสั้น ๆ สำหรับการสร้างlauncher-quicklistซึ่งมี dbus-menu แต่ไม่ใช่สำหรับ global-menu / appmenu

มีหน้า wikiที่ไม่มีข้อมูลที่เกี่ยวข้องอื่น ๆ จากนั้น "ทำงานเพื่อสนับสนุนเมนูแอปพลิเคชันอื่น ๆ บนชุดเครื่องมืออื่น ๆ ที่จะได้รับการต้อนรับ แต่ไม่ใช่สิ่งสำคัญสำหรับทีม DX ต้องการความช่วยเหลือ"

มีข้อมูลเล็กน้อยในกราฟิกนี้จากซอร์สโค้ดตัวบ่งชี้ - appmenu แต่ไม่เพียงพอไม่สามารถพบได้บน developer.ubuntu.com และต้องการคำอธิบายเพิ่มเติม:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้น:

  • ขั้นตอนที่ได้รับชุดของรายการเมนู (Dbusmenu.Menuitem) ที่จะแสดงคืออะไร?
  • ไคลเอนต์และเซิร์ฟเวอร์เล่นบทบาทอะไร (สิ่งใดที่ควรถูกเรียกใช้ในแอปพลิเคชันของฉันหรือทั้งสองอย่าง)

คำถามที่คล้ายกัน


บางทีคุณสามารถเพิ่มชุดเครื่องมือที่คุณใช้
Timo

แน่ใจ: มันเป็นชุดเครื่องมือ kivy
xubuntix

1
ฉันคิดว่าคำถามนี้ต้องการคำตอบจากบัญญัติ
Tachyons

ตอนแรกฉันหวังว่าผู้เขียน dbusmenu-glib (เช่น Ted Gould) หรือแม้แต่ libdbusmenu-qt (Aurelien Gateau) อาจใช้เวลาเขียนเอกสารรหัสของพวกเขา แต่หลังจาก 4 เดือนของการรอคอยไม่มีอะไรเกิดขึ้น ดังนั้นฉันจึงลองตัวเลือกที่ดีที่สุดที่สองพยายาม 'ติดสินบน' ชุมชนที่มีชื่อเสียงในการก้าวเข้ามาดูเหมือนว่านี่จะไม่ได้ผลเช่นกัน ...
xubuntix

@xubuntix ขอแนะนำให้คุณติดต่อ Ted ( gould.cx/ted/blog ) และ aurelien ( agateau.com/about-me ) โดยตรง
fossfreedom

คำตอบ:


14

โดยทั่วไปฉันขอแนะนำให้ใช้เครื่องมือที่สนับสนุนวิธีการใส่เมนูในแถบเมนูระดับโลก ... แต่ฉันคิดว่ามันสายเกินไปที่จะโน้มน้าวคุณในตอนนี้ :-) นอกจากนี้ฉันจะทราบด้วยซ้ำว่าเราคิดว่า กำลังใช้ Dbusmenu และลงทะเบียนใน 12.04 เป้าหมายคือย้ายไปที่ GMenuModel และทำเครื่องหมายหน้าต่างด้วยเมนูของ 14.04 ดังนั้นข้อมูลนี้จะกลายเป็นวันที่ แน่นอนปลั๊กอินชุดเครื่องมือจะอัปเดต ;-) (ครั้งสุดท้ายที่ฉันจะลองฉันสัญญา)

หลักการพื้นฐานที่เกี่ยวข้องคือเราจำเป็นต้องรู้ว่าเมนูใดบ้างที่เกี่ยวข้องกับหน้าต่างใด เราติดตามหน้าต่างโดยใช้ XID และเมนูเป็นเส้นทางไปยังเซิร์ฟเวอร์ Dbusmenu บน DBus คุณจะต้องใช้ข้อมูลทั้งคู่ในการลงทะเบียน อินเทอร์เฟซการลงทะเบียนนั้นค่อนข้างง่ายโดยที่คุณส่งผ่านข้อมูลทั้งสองไปยังนายทะเบียน ชื่อที่รู้จักกันดีของนายทะเบียนใน DBus คือcom.canonical.AppMenu.Registrar com.canonical.AppMenu.Registrar

สำหรับตัวอย่างของวิธีนี้สามารถทำงานคุณสามารถดูที่โค้ดตัวอย่างจำลอง JSON แอปที่อยู่ในตัวบ่งชี้ appmenu นี่เป็นเครื่องมือขนาดเล็กที่จะนำเอาท์พุทไฟล์ JSON โดย dbusmenu-dumper (ซึ่งอยู่ในเครื่องมือ libdbusmenu ) และสร้างหน้าต่างที่อ้างว่ามีเมนูนั้น นอกจากนี้ยังจัดการกับสิ่งต่าง ๆ เช่น appmenu crashing ซึ่งอาจไม่จำเป็นสำหรับแอปพลิเคชันส่วนใหญ่ (แม้ว่าจะเป็นสิ่งสำคัญในการพัฒนา :-))

ในการสร้างเซิร์ฟเวอร์ Dbusmenuโดยทั่วไปคุณเพียงแค่ต้องจัดสรรวัตถุและบอกตำแหน่งที่จะปรากฏบน DBus (เพื่อให้คุณสามารถกำหนดที่ตั้งให้กับนายทะเบียน) สำหรับปลั๊กอินเช่นappmenu-gtkเราใช้พา ธ ที่สร้างขึ้นเพื่อไม่ให้มีข้อขัดแย้ง แต่ถ้าคุณควบคุมแอพคุณอาจใช้พา ธ คงที่ จากนั้นคุณสร้างโครงสร้างต้นไม้ของวัตถุDbusmenu Menuitem รูทหนึ่งจะไม่ปรากฏขึ้น แต่ถูกส่งไปยังเซิร์ฟเวอร์ Dbusmenuเพื่อเริ่มเมนู ระดับแรกร้องรากจะแสดงเป็นรายการทั่วUbuntu แถบเมนู

โชคดีขอบคุณทุกคนที่รบกวนฉันตอบคำถามนี้ ฉันยังเชื่อว่าคุณควรใช้การสนับสนุนชุดเครื่องมือ (ฉันโกหกว่ามันเป็นครั้งสุดท้าย) แต่โชคดี!


1
ขอบคุณมาก! และขอขอบคุณทุกคนที่คุกคามคุณ :-) สำหรับคำถามเกี่ยวกับชุดเครื่องมือ: ฉันชอบที่จะใช้การสนับสนุนชุดเครื่องมือ แต่ไม่มี Kivy และฉันจะไม่เปลี่ยนชุดเครื่องมือเพียงแค่สำหรับเมนู ... การเปลี่ยนไปใช้ GMenuModel ทำให้เป็นไปไม่ได้ที่จะใช้กับชุดเครื่องมืออื่นหรือไม่
xubuntix

GMenuModel จะทำให้ง่ายต่อการอัปสตรีมในชุดเครื่องมือจำนวนมากเนื่องจากการสนับสนุนอยู่ใน GLib โดยตรงดังนั้นจึงไม่มีการพึ่งพาเพิ่มเติมซึ่งรบกวนผู้ดูแลชุดเครื่องมือบางส่วน
Ted Gould

@TedGould คำตอบที่ดี Ted! อย่างไรก็ตามมีตัวอย่าง GTK-less ไหม? มีบางสิ่งที่ใกล้เคียงกับการใช้ Xlib มากที่สุดเท่าที่จะเป็นไปได้ ตัวอย่าง mock-json-app ที่คุณให้นั้นยอดเยี่ยมหากมีใครใช้ Gtk ไม่มากถ้าใช้ X11 โดยตรง (หรือชุดเครื่องมืออื่น) ฉันพยายามรวบรวมบางอย่างที่ใช้เฉพาะ Glib, libdbusmenu-glib และ X11 แต่ดูเหมือนว่าฉันกำลังมีปัญหา เป้าหมายของฉัน? ฉันสนใจที่จะเพิ่มการสนับสนุนในแอพ SDL และฉันคิดอยู่เสมอเกี่ยวกับแอพ GNUstep ที่ไม่รองรับ dbusmenu
Ivan Vučica

1
@TedGould ความพยายามของฉันอยู่ที่นี่: bitbucket.org/ivucica/minidbus-menuหวังว่าคุณ (หรือคนอื่น!) จะมีไม่กี่นาทีที่จะดูรหัสและดูว่าทำไมเมนูไม่ปรากฏและทำไม แถบหัวเรื่องพูดว่า "ฮัด" :-)
Ivan Vučica

ดูเหมือนว่าฉันได้รับรหัส C ของฉันเพื่อทำงานภายใต้ 12.04 ฉันไม่ควรพยายามเพิ่มรายการแบบสแตนด์อโลนลงในเมนู เมื่อเพิ่มพวกมันเป็นรายการย่อยของรายการเมนูอื่นตอนนี้มันใช้งานได้แล้ว Cool;)
Ivan Vučica

0

น่าเสียดายที่คุณจะไม่พบเอกสารที่เป็นมิตรสำหรับเรื่องนั้น เมนูทั่วโลกได้รับการพัฒนาด้วย GTK และ Qt ในใจและในขณะที่เป็นไปได้ในทางทฤษฎีที่จะใช้การสนับสนุน webkits อื่น ๆ เนื่องจากโปรโตคอลเป็นฐาน DBus มีความพยายามน้อยมากในการทำเอกสารที่มีอยู่

ชี้ที่ดีที่สุดที่ฉันสามารถให้คุณเป็นรหัสแหล่งที่มาของตัวบ่งชี้ appmenuและพลาสม่าเครื่องมือ-แถบเมนู คุณสามารถอ่านสิ่งเหล่านี้เพื่อทำความเข้าใจวิธีการทำงานของโปรโตคอล dbus


1
มันอาจช่วยให้ได้รับการติดตามการสนทนา dbus ของการสนทนาสำหรับบางกรณีตัวแทน? ฉันไม่รู้มากพอเกี่ยวกับ dbusmenu หรือติดตาม dbus ให้รู้ แต่ฉันชอบที่จะเห็นตัวอย่างจากคนที่ทำ
nealmcb

0

คุณสามารถใช้การผูก python-dbus และใช้เอกสาร API ที่http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.htmlสำหรับ DbusMenu เพื่อรวมเข้ากับแถบเมนูส่วนกลาง


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