Как добавить поддержку глобального меню в приложение Python non-gtk, non-qt?

24

Я ищу хорошую документацию (пример, учебное пособие или руководство) о том, как добавить поддержку глобального меню в не-gtk, не-qt-приложения. (В gtk это работает «магически» для главного меню ...). Набор инструментов, с которым я хочу использовать это kivy , который поддерживает glib-mainloop (например, для gstreamer), поэтому в принципе все должно работать там.

Я видел ссылку на API в Dbusmenu и здесь , но это не очень полезно для понимания механизмов.

Есть короткий пример создания списка быстрого запуска, который содержит dbus-меню, но не для global-menu / appmenu.

Существует вики-страница , которая не содержит какой-либо соответствующей информации, кроме «Хотелось бы приветствовать работу по поддержке других меню приложения в других наборах инструментов, но это не является приоритетом для команды DX, нужна помощь».

На этом рисунке немного информации из исходного кода индикатора-приложения, но ее недостаточно, ее нельзя найти на developer.ubuntu.com, и она требует дополнительных пояснений:

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

Так:

  • Какова процедура, которая получает набор пунктов меню (Dbusmenu.Menuitem) для отображения?
  • Какую роль играет клиент и сервер? (Какой из них должен быть запущен в моем приложении? Или оба?)

Подобный вопрос

xubuntix
источник
Может быть, вы можете добавить набор инструментов, который вы используете.
Тимо
конечно: это набор инструментов.
xubuntix
1
Я думаю, что этот вопрос требует ответа от канонического.
Тахионы
Сначала я надеялся, что авторы dbusmenu-glib (например, Ted Gould) или даже libdbusmenu-qt (Aurelien Gateau) смогут потратить некоторое время на написание документации своего кода. Но после 4 месяцев ожидания ничего не произошло. Поэтому я попробовал второй лучший вариант, пытаясь «подкупить» сообщество с указанием моей репутации, чтобы вмешаться. Кажется, что это не работает так же ...
xubuntix
@xubuntix предлагает вам связаться с Тедом ( gould.cx/ted/blog ) и Аурелиеном ( agateau.com/about-me ) напрямую
fossfreedom

Ответы:

14

В общем, я бы рекомендовал использовать поддерживаемые инструментарием способы размещения меню в глобальной строке меню ... но, я полагаю, уже слишком поздно, чтобы убедить вас в этом :-) Кроме того, я отмечу, что даже мы думали, что мы При использовании Dbusmenu и регистрации в 12.04 цель состоит в том, чтобы перейти к GMenuModel и пометить окно с его меню к 14.04, так что эта информация станет устаревшей. Конечно, плагины инструментария будут обновлены ;-) (последний раз попробую, обещаю)

Основной принцип заключается в том, что нам нужно знать, какие меню связаны с каким окном. Мы отслеживаем окно, используя его XID, и меню - это путь к Серверу Dbusmenu на DBus. Вам понадобится обе эти части информации для регистрации. Интерфейс регистрации довольно прост в том, что вы передаете обе эти информации регистратору. Хорошо известное имя регистратора в DBus - com.canonical.AppMenu.Registrar .

В качестве примера того, как это может работать, вы можете взглянуть на пример кода mock-json-app, который находится в Indicator-Appmenu . Это небольшой инструмент, который принимает вывод файла 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-app, который вы привели, великолепен, если вы используете Gtk; не так много, если X11 используется напрямую (или другой инструментарий). Я пытаюсь собрать что-то, что использует только Glib, libdbusmenu-glib и X11, но похоже, что у меня проблемы. Мои цели? Я заинтересован в добавлении поддержки в приложение SDL и постоянно думаю о том, чтобы приложения GNUstep не поддерживали dbusmenu.
Иван Вучица
1
@TedGould Моя попытка здесь окончена: bitbucket.org/ivucica/minidbus-menu Надеюсь, у вас (или у кого-то еще!) Будет несколько минут, чтобы взглянуть на код и понять, почему меню не появляется, и почему Titlebar говорит "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