Pertanyaan Bagaimana cara menambahkan dukungan untuk menu global ke python non-gtk, aplikasi non-qt?


Saya mencari dokumentasi yang baik (contoh, tutorial, atau panduan) tentang cara menambahkan dukungan menu global ke aplikasi non-gtk, non-qt. (Di gtk itu bekerja 'ajaib' untuk menu utama ...). Toolkit yang ingin saya gunakan ini adalah kivy, yang mendukung glib-mainloop (misalnya untuk gstreamer), jadi pada prinsipnya semua harus bekerja di sana.

Saya telah melihat referensi API Dbusmenu dan sini, tetapi itu tidak sangat membantu untuk memahami mekanisme.

Ada contoh singkat untuk membuat peluncur-quicklist yang berisi dbus-menu, tetapi tidak untuk menu-global / appmenu.

Ada sebuah halaman wiki yang tidak mengandung informasi yang relevan lainnya kemudian "Bekerja untuk mendukung menu aplikasi lain pada toolkit lain akan diterima, tetapi bukan prioritas untuk tim DX, tolonglah yang diinginkan."

Ada sedikit informasi dalam grafik ini dari kode sumber indikator-appmenu, tetapi itu tidak cukup, tidak dapat ditemukan di developer.ubuntu.com dan membutuhkan lebih banyak penjelasan:

enter image description here

Begitu:

  • Apa prosedur yang mendapat sekumpulan item menu (Dbusmenu.Menuitem) untuk ditampilkan?
  • Peran apa yang dimainkan klien dan server? (Yang mana dari yang seharusnya dijalankan dalam aplikasi saya? Atau keduanya?)

Pertanyaan serupa


24
2018-01-26 11:43


asal


Mungkin Anda bisa menambahkan toolkit yang Anda gunakan. - Timo
yakin: itu adalah toolkit kivy. - xubuntix
Saya pikir pertanyaan ini membutuhkan jawaban dari kanonik. - Tachyons
Awalnya saya berharap bahwa penulis dbusmenu-glib (misalnya Ted Gould), atau bahkan libdbusmenu-qt (Aurelien Gateau) dapat menghabiskan sebagian waktu menulis dokumentasi kode mereka. Tetapi setelah 4 bulan menunggu, tidak ada yang terjadi. Jadi saya mencoba pilihan terbaik kedua, mencoba untuk 'menyuap' komunitas dengan reputasi saya untuk melangkah masuk. Tampaknya ini tidak berhasil juga ... - xubuntix
@xubuntix sarankan Anda menghubungi Ted (gould.cx/ted/blog) dan aurelien (agateau.com/about-me) secara langsung - fossfreedom♦


Jawaban:


Secara umum, saya akan merekomendasikan menggunakan toolkit didukung cara untuk menempatkan menu di global menubar ... tapi, saya berasumsi sudah terlambat untuk meyakinkan Anda pada titik ini :-) Juga, saya akan mencatat bahwa bahkan berpikir kita menggunakan Dbusmenu dan pendaftaran di 12.04 tujuannya adalah untuk pindah ke GMenuModel dan menandai jendela dengan menu-nya dengan 14.04, sehingga informasi ini akan menjadi tanggal. Tentu saja, toolkit plug-in akan diperbarui ;-) (Terakhir kali saya akan mencoba, saya berjanji)

Prinsip dasar yang terlibat adalah bahwa kita perlu mengetahui menu apa yang dikaitkan dengan jendela yang mana. Kami melacak jendela menggunakan XID dan menu adalah jalur ke Server Dbusmenu di DBus. Anda akan membutuhkan kedua bagian informasi tersebut untuk mendaftar. Antarmuka registrasi adalah cukup mudah karena pada dasarnya Anda melewatkan kedua bagian informasi tersebut ke pencatat. Nama terkenal registrar di DBus adalah com.canonical.AppMenu.Registrar.

Untuk contoh bagaimana ini dapat bekerja, Anda dapat melihat kode contoh mock-json-app yang ada di dalamnya indikator-appmenu. Ini adalah alat kecil yang akan mengambil output file JSON oleh dbusmenu-dumper (yang ada di dalamnya libdbusmenu-tools) dan membuat jendela yang mengklaim memiliki menu itu. Ini juga menangani hal-hal seperti appmenu crashing, yang mungkin tidak benar-benar diperlukan untuk sebagian besar aplikasi (meskipun sangat penting dalam pengembangan :-)).

Untuk membuat Server Dbusmenu Anda pada dasarnya hanya perlu mengalokasikan objek dan memberitahukannya di mana harus muncul di DBus (sehingga Anda dapat memberikan lokasi ke registrar). Untuk plugin seperti appmenu-gtk kami menggunakan jalur yang dibuat sehingga tidak ada konflik, tetapi jika Anda mengontrol aplikasi, Anda mungkin dapat menggunakan jalur tetap. Kemudian Anda membuat struktur pohon Dbusmenu Menuitem objek. Akar tidak ditampilkan, tetapi itu diteruskan ke Server Dbusmenu untuk memulai menu. Level pertama di bawah root akan ditampilkan sebagai item di seluruh Ubuntu Menubar.

Semoga beruntung, terima kasih kepada semua orang yang melecehkan saya untuk menjawab pertanyaan ini. Saya masih percaya bahwa Anda harus menggunakan dukungan toolkit (saya berbohong tentang itu menjadi yang terakhir kalinya), tetapi semoga berhasil!


14
2018-05-20 17:50



Terima kasih banyak! Dan terima kasih kepada semua orang yang melecehkan Anda :-) Mengenai pertanyaan toolkit: Saya ingin sekali menggunakan dukungan toolkit, tetapi tidak ada untuk Kivy. Dan saya tidak akan mengganti toolkit hanya untuk menu ... Akankah peralihan ke GMenuModel membuatnya mustahil untuk menggunakannya dengan toolkit lainnya? - xubuntix
GMenuModel akan mempermudah hulu di banyak toolkit karena dukungannya ada di GLib secara langsung sehingga tidak ada ketergantungan tambahan, yang mengganggu beberapa pengelola toolkit. - Ted Gould
@TedGould Jawaban luar biasa, Ted! Namun, apakah ada contoh GTK-less? Sesuatu yang sedekat mungkin menggunakan Xlib, dan tidak ada yang lain? Contoh mock-json-app yang Anda berikan sangat bagus, jika seseorang menggunakan Gtk; tidak begitu banyak jika X11 langsung digunakan (atau toolkit lain). Saya mencoba mengumpulkan sesuatu yang hanya menggunakan Glib, libdbusmenu-glib dan X11, tetapi sepertinya saya mengalami masalah. Tujuan saya? Saya tertarik untuk menambahkan dukungan dalam aplikasi SDL, dan saya terus-menerus memikirkan aplikasi GNUstep yang tidak memiliki dukungan untuk dbusmenu. - Ivan Vučica
@TedGould Upaya saya ada di sini: bitbucket.org/ivucica/minidbus-menu Semoga Anda (atau orang lain!) Akan memiliki beberapa menit untuk melihat kode dan melihat mengapa menu tidak muncul, dan mengapa judul mengatakan "Hud". :-) - Ivan Vučica
Sepertinya saya mendapatkan kode C saya bekerja di bawah 12.04. Saya seharusnya tidak mencoba untuk menambahkan item yang berdiri sendiri ke menu; setelah menambahkannya sebagai subitem item menu lain, sekarang berfungsi. Keren ;) - Ivan Vučica


Sayangnya, Anda tidak akan menemukan dokumen ramah untuk itu. Menu global dikembangkan dengan GTK dan Qt dalam pikiran dan, sementara secara teoritis mungkin untuk mengimplementasikan dukungan untuk webkit lainnya karena protokolnya berbasis DBus, hanya ada sedikit upaya dalam membuat dokumentasi tersedia.

Pointer terbaik yang bisa saya berikan kepada Anda adalah kode sumbernya indikator-appmenu dan plasma-widget-menubar. Anda dapat membaca mereka untuk memahami bagaimana protokol dbus bekerja.


0
2018-01-27 22:05



Mungkinkah itu juga membantu untuk mendapatkan jejak dbus-monitor dari percakapan untuk beberapa kasus yang representatif? Saya tidak cukup tahu tentang dbusmenu atau pemantauan dbus, tetapi saya ingin melihat beberapa contoh dari seseorang yang melakukannya. - nealmcb


Anda dapat menggunakan binding python-dbus, dan menggunakan API yang didokumentasikan di http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.html untuk DbusMenu, untuk berintegrasi dengan bar menu global.


0
2018-05-18 16:11



ini persis tautan yang saya berikan dalam jawaban saya, menyatakan bahwa saya tidak mengerti cara menggunakannya! - xubuntix