Як додати підтримку глобального меню до програми python non-gtk, non-qt?


24

Я шукаю гарну документацію (приклад, підручник або посібник) про те, як додати підтримку глобального меню до додатку non-gtk, non-qt. (У gtk це працює "магічно" для головного меню ...). Інструментарій, з яким я хочу використовувати це, є kivy , який підтримує glib-mainloop (наприклад, для gstreamer), тому в принципі там все має працювати.

Я бачив посилання на API Dbusmenu і тут , але це не дуже корисно для розуміння механізмів.

Існує короткий приклад створення списку швидкого запуску, який містить dbus-меню, але не для глобального меню / програми.

Існує вікі-сторінка , яка не містить будь-якої відповідної інформації, крім "Робота над підтримкою іншого меню додатків для інших наборів інструментів буде вітатися, але не є пріоритетним для команди DX, допомога потрібна".

У цій графіці є небагато інформації з вихідного коду індикатора-програми, але її недостатньо, її неможливо знайти на developer.ubuntu.com і вимагає додаткових пояснень:

введіть тут опис зображення

Так:

  • Яка процедура, яка отримує набір пунктів меню (Dbusmenu.Menuitem) для відображення?
  • Яку роль відіграють клієнт і сервер? (Який із них повинен бути запущений у моїй заявці? Або обидва?)

Подібне запитання


Можливо, ви можете додати інструментарій, який ви використовуєте.
Тимо

впевнений: це киві інструментарій.
xubuntix

1
Я думаю, що на це запитання потрібна відповідь канонічної.
Тахіони

Спочатку я сподівався, що автори dbusmenu-glib (наприклад, Тед Гулд) або навіть libdbusmenu-qt (Aurelien Gateau) зможуть витратити частину свого часу на написання документації свого коду. Але через 4 місяці очікування нічого не сталося. Тож я спробував другий найкращий варіант, намагаючись «підкупити» громаду шахраями своєї репутації. Здається, що це також не працює ...
xubuntix

@xubuntix пропонує вам зв’язатися безпосередньо з Тедом ( 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 .

Для прикладу того, як це може працювати, ви можете подивитися зразок коду mock-json-додатка, який знаходиться в індикаторі-додатку . Це невеликий інструмент, який візьме вихідний файл JSON dbusmenu-dumper (який знаходиться в libdbusmenu-tools ) і зробить вікно, яке стверджує, що це меню. Він також обробляє такі речі, як збій програми, що може бути не дуже потрібним для більшості програм (хоча це дуже важливо для розвитку :-)).

Щоб створити сервер Dbusmenu, вам потрібно просто виділити об'єкт і вказати, де він з'явиться в DBus (щоб ви могли вказати місце розташування в реєстраторі). Для плагінів, таких як appmenu-gtk, ми використовуємо згенерований шлях, щоб не виникало конфліктів, але якщо ви керуєте програмою, ви, ймовірно, можете використовувати фіксований шлях. Потім ви створюєте структуру дерева об'єктів Dbusmenu Menuitem . Корінь не відображається, але передається на сервер Dbusmenu для запуску меню. Перший рівень внизу кореня буде показаний як предмети в меню Ubuntu Menubar .

Успіхів, дякую всім людям, які переслідували мене, щоб відповісти на це запитання. Я все ще вважаю, що вам слід скористатися підтримкою інструментарію (я брехав про те, що це було останній раз), але удачі!


1
Велике спасибі! І дякую всім людям, які вас переслідували :-) Що стосується питання інструментарію: я хотів би скористатися підтримкою інструментарію, але для Kivy такого немає. І я не буду перемикати набори інструментів лише для меню ... Чи переключення на GMenuModel унеможливить його використання з іншими наборами інструментів?
xubuntix

GMenuModel полегшить просування в багатьох наборах інструментів, оскільки підтримка знаходиться в GLib безпосередньо, тому немає додаткової залежності, яка заважає деяким обслуговуючим інструментам.
Тед Гулд

@TedGould Чудова відповідь, Теде! Однак чи є приклад без GTK? Щось наближене до використання лише Xlib, і нічого іншого? Приклад mock-json-програми, який ви подали, чудовий, якщо ви використовуєте Gtk; не так багато, якщо безпосередньо використовується X11 (або інший інструментарій). Я намагаюся зібрати щось, що використовує лише Glib, libdbusmenu-glib та X11, але, схоже, я зіткнувся з проблемою. Мої цілі? Мені цікаво додавати підтримку в SDL-додаток, і я постійно думаю про те, що додатки GNUstep не мають підтримки для dbusmenu.
Іван Вучиця

1
@TedGould Моя спроба закінчується тут: bitbucket.org/ivucica/minidbus-menu Сподіваємось, у вас (або когось іншого!) Буде кілька хвилин, щоб переглянути код і побачити, чому меню не з’являється, і чому на заголовку написано "Hud". :-)
Іван Вучиця

Схоже, я змусив C-код працювати до 12.04. Я б не намагався додавати до меню окремі елементи; додавши їх як підпункти іншого пункту меню, воно працює. Класно;)
Іван Вучиця

0

На жаль, ви не знайдете дружнього документа для цього. Глобальне меню було розроблено з урахуванням GTK та Qt, і, хоча теоретично можливо реалізувати підтримку інших веб-кодів, оскільки протокол базується на DBus, докладати документацію було дуже мало.

Найкращі вказівки, які я можу вам надати, - це вихідні коди індикатора-додатка та плазмового віджета-меню . Ви можете прочитати їх, щоб зрозуміти, як працює протокол 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.