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

24

Saya mencari dokumentasi yang bagus (contoh, tutorial, atau panduan) tentang cara menambahkan dukungan menu global ke aplikasi non-gtk, non-qt. (Di gtk berfungsi 'secara ajaib' untuk menu utama ...). Toolkit yang ingin saya gunakan dengan 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 di sini , tapi itu tidak terlalu membantu untuk memahami mekanisme.

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

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

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

masukkan deskripsi gambar di sini

Begitu:

  • Bagaimana prosedur yang mendapat satu set item menu (Dbusmenu.Menuitem) untuk ditampilkan?
  • Apa peran yang dimainkan klien dan server? (Manakah dari mereka yang seharusnya dijalankan dalam aplikasi saya? Atau keduanya?)

Pertanyaan serupa

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

Jawaban:

14

Secara umum, saya akan merekomendasikan menggunakan toolkit yang didukung cara untuk menempatkan menu di menu global ... tapi, saya anggap sudah terlambat untuk meyakinkan Anda pada saat ini :-) Juga, saya akan perhatikan bahwa bahkan berpikir kami Sedang menggunakan Dbusmenu dan registrasi dalam 12,04 tujuannya adalah untuk pindah ke GMenuModel dan menandai jendela dengan menu-menu pada 14,04, sehingga informasi ini akan menjadi tanggal. Tentu saja, plug-in toolkit akan diperbarui ;-) (terakhir kali saya akan mencoba, saya janji)

Prinsip dasar yang terlibat adalah bahwa kita perlu tahu menu apa yang dikaitkan dengan jendela mana. Kami melacak jendela menggunakan XID-nya dan menunya adalah jalur ke Server Dbusmenu di DBus. Anda membutuhkan kedua informasi tersebut untuk mendaftar. Antarmuka registrasi cukup sederhana karena pada dasarnya Anda menyampaikan kedua informasi tersebut ke registrar. Nama pendaftar yang terkenal di DBus adalah com.canonical.AppMenu.Registrar .

Untuk contoh bagaimana ini bisa bekerja, Anda bisa melihat kode contoh mock-json-app yang ada di indikator-appmenu . Ini adalah alat kecil yang akan mengambil keluaran file JSON oleh dbusmenu-dumper (yang ada di libdbusmenu-tools ) dan membuat jendela yang mengklaim memiliki menu itu. Ini juga menangani hal-hal seperti crash appmenu, 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 akan 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 mengendalikan aplikasi, Anda mungkin dapat menggunakan jalur tetap. Kemudian Anda membuat struktur pohon objek Dbusmenu Menuitem . Root tidak ditampilkan, tetapi diteruskan ke Server Dbusmenu untuk memulai menu. Tingkat pertama di bawah root akan ditampilkan sebagai item di 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 yang terakhir kali), tapi semoga berhasil!

Ted Gould
sumber
1
Terima kasih banyak! Dan terima kasih kepada semua orang yang melecehkan Anda :-) Mengenai pertanyaan tentang toolkit: Saya ingin menggunakan dukungan toolkit, tetapi tidak ada untuk Kivy. Dan saya tidak akan mengganti toolkit hanya untuk menu ... Akankah beralih ke GMenuModel membuatnya mustahil untuk menggunakannya dengan toolkit lain?
xubuntix
GMenuModel akan mempermudah upstream di banyak toolkit karena dukungannya ada di GLib secara langsung sehingga tidak ada ketergantungan tambahan, yang mengganggu beberapa pengelola toolkit.
Ted Gould
@TedGould Jawaban yang bagus, Ted! Namun, apakah ada contoh kurang GTK? Sesuatu yang sedekat mungkin hanya 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 menyatukan 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 berpikir tentang aplikasi GNUstep yang tidak memiliki dukungan untuk dbusmenu.
Ivan Vučica
1
@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 menu bilah judul bertuliskan "Hud". :-)
Ivan Vučica
Sepertinya saya mendapatkan kode C saya untuk bekerja di bawah 12,04. Saya seharusnya tidak mencoba menambahkan item mandiri ke menu; setelah menambahkannya sebagai subtitle dari item menu lain, sekarang berfungsi. Cool;)
Ivan Vučica
0

Sayangnya, Anda tidak akan menemukan dokumen yang ramah untuk itu. Menu global dikembangkan dengan mempertimbangkan GTK dan Qt dan, walaupun secara teori dimungkinkan untuk menerapkan dukungan untuk webkit lain karena protokol berbasiskan DBus, ada sedikit upaya dalam membuat dokumentasi tersedia.

Pointer terbaik yang bisa saya berikan adalah kode sumber indikator-appmenu dan plasma-widget-menubar . Anda dapat membacanya untuk memahami cara kerja protokol dbus.

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