파이썬 비 GTK, 비 qt 앱에 전역 메뉴에 대한 지원을 추가하는 방법은 무엇입니까?


24

비 GTK가 아닌 응용 프로그램에 전역 메뉴 지원을 추가하는 방법에 대한 좋은 문서 (예 : 자습서 또는 안내서)를 찾고 있습니다. (gtk에서는 주 메뉴에서 '마 법적으로'작동합니다 ...). 내가 이것을 사용하고 싶은 툴킷은 kivy인데 , 이것은 glib- mainloop 를 지원한다.

Dbusmenuhere 의 API 참조를 보았지만 메커니즘을 이해하는 데별로 도움이되지 않습니다.

dbus-menu를 포함 하는 launcher-quicklist 를 작성하는 짧은 예제가 있지만 global-menu / appmenu는 아닙니다.

거기에있다 위키 페이지 다음 다른 모든 관련 정보가 없습니다 "환영 할 것이다 다른 툴킷에서 응용 프로그램 메뉴를 다른 지원에 일이 있지만, DX 팀이 아닌 우선 순위는, 도움을 원했다."

indicator-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

일반적으로 툴킷이 지원하는 방법을 사용하여 메뉴를 글로벌 메뉴 표시 줄에 넣는 것이 좋습니다 ...하지만이 시점에서 당신을 설득하기에는 너무 늦었다 고 가정합니다 :-) '12 .04에서 Dbusmenu와 등록을 사용하는 목표는 GMenuModel로 이동하고 창에 14.04까지 메뉴를 표시하는 것이므로이 정보는 날짜가 표시됩니다. 물론 툴킷 플러그인이 업데이트 될 것입니다. ;-)

관련된 기본 원리는 어떤 메뉴가 어떤 창과 관련되어 있는지 알아야한다는 것입니다. XID를 사용하여 창을 추적하고 메뉴는 DBus의 Dbusmenu 서버에 대한 경로입니다. 등록하려면 두 가지 정보가 모두 필요합니다. 등록 인터페이스는 기본적으로 두 정보를 모두 레지스트라에 전달한다는 점에서 매우 간단 합니다. DBus에서 등록 기관의 잘 알려진 이름은 com.canonical.AppMenu.Registrar 입니다.

이것이 어떻게 작동하는지에 대한 예제는 indicator-appmenu 에있는 mock-json-app 샘플 코드볼 수 있습니다. 이것은 dbusmenu-dumper ( libdbusmenu-tools에 있음 ) 의 JSON 파일 출력을 가져 와서 해당 메뉴가 있다고 주장하는 창을 만드는 작은 도구입니다 . 또한 대부분의 응용 프로그램에 실제로 필요하지 않을 수있는 appmenu crashing과 같은 것을 처리합니다 (개발에서 실제로 중요하지만 :-)).

Dbusmenu 서버 를 만들려면 기본적으로 객체를 할당하고 DBus에 표시 할 위치를 지정하면됩니다 (레지스트라에 위치를 제공 할 수 있음). appmenu-gtk 와 같은 플러그인의 경우 생성 된 경로를 사용하므로 충돌이 없지만 앱을 제어하는 ​​경우 고정 경로를 사용할 수 있습니다. 그런 다음 Dbusmenu Menuitem 객체 의 트리 구조를 만듭니다 . 루트는 표시되지 않지만 메뉴를 시작 하기 위해 Dbusmenu 서버전달됩니다 . 루트 아래의 첫 번째 레벨은 Ubuntu 메뉴 표시 줄에 항목으로 표시됩니다 .

이 질문에 대답하기 위해 나를 괴롭힌 모든 사람들에게 감사합니다. 여전히 툴킷 지원을 사용해야한다고 생각하지만 (마지막으로 거짓말을 했음) 행운을 빕니다!


1
대단히 감사합니다! 그리고 당신을 괴롭힌 모든 사람들에게 감사합니다 :-) 툴킷 질문에 관해서 : 툴킷 지원을 사용하고 싶지만 Kivy에게는 아무것도 없습니다. 메뉴 용 툴킷 만 전환하지는 않겠습니다 ... GMenuModel로 전환하면 다른 툴킷과 함께 사용할 수 없습니까?
xubuntix

GMenuModel은 지원이 GLib에 직접 있기 때문에 많은 툴킷에서 업스트림하기가 더 쉬워 지므로 추가적인 툴킷이 없어서 툴킷 관리자를 방해했습니다.
Ted Gould

@TedGould 훌륭한 답변, 테드! 그러나 GTK가 적은 예가 있습니까? 가능한 한 Xlib 만 사용하는 것과 비슷한 것이 있습니까? Gtk를 사용한다면 mock-json-app 예제는 훌륭하다. X11이 직접 사용되는 경우 (또는 다른 툴킷) 그렇게 많지 않습니다. Glib, libdbusmenu-glib 및 X11 만 사용하는 것을 모 으려고하는데 문제가있는 것처럼 보입니다. 내 목표? SDL 앱에서 지원을 추가하는 데 관심이 있으며 dbusmenu를 지원하지 않는 GNUstep 앱을 계속 생각하고 있습니다.
Ivan Vučica

1
@TedGould 내 시도는 여기에 있습니다 : bitbucket.org/ivucica/minidbus-menu 희망적으로 당신 (또는 다른 사람!)이 코드를 살펴보고 메뉴가 나타나지 않는 이유와 이유가 무엇인지 볼 수 있기를 바랍니다. 제목 표시 줄에 "Hud"가 표시됩니다. :-)
Ivan Vučica

12.04에서 작동하도록 C 코드를 얻은 것 같습니다. 메뉴에 독립형 항목을 추가하려고 시도해서는 안됩니다. 다른 메뉴 항목의 하위 항목으로 추가하면 이제 작동합니다. Cool;)
Ivan Vučica 2016 년

0

불행히도, 당신은 그것에 대한 친숙한 문서를 찾지 못할 것입니다. 글로벌 메뉴는 GTK와 Qt를 염두에두고 개발되었으며, 프로토콜은 DBus 기반이므로 다른 웹킷에 대한 지원을 구현하는 것이 이론적으로 가능하지만 문서를 제공하는 데는 거의 노력이 없었습니다.

내가 줄 수있는 가장 좋은 포인터는 indicator-appmenuplasma-widget-menubar 의 소스 코드입니다 . 그것들을 읽고 dbus 프로토콜의 작동 방식을 이해할 수 있습니다.


1
일부 대표 사례에 대한 대화의 dbus 모니터 추적을 얻는 데 도움이 될 수 있습니까? dbusmenu 또는 dbus 모니터링에 대해 충분히 알지 못하지만 다른 사람의 예를보고 싶습니다.
nealmcb

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.