Python非gtk、非qtアプリにグローバルメニューのサポートを追加するにはどうすればよいですか?


24

非GTK、非QTアプリケーションにグローバルメニューサポートを追加する方法に関する優れたドキュメント(例、チュートリアル、またはガイド)を探しています。(gtkでは、メインメニューで「魔法のように」動作します...)。これと一緒に使用したいツールキットはkivyで、glib-mainloopをサポートしています(gstreamerなど)ので、原則としてすべてがそこで動作するはずです。

Dbusmenuおよびhereの APIリファレンスを見てきましたが、それはメカニズムを理解するのにあまり役に立ちません。

dbus-menuを含むlauncher-quicklistを作成する短い例がありますが、global-menu / appmenu用ではありません。

「他のツールキットのアプリケーションメニューをサポートする作業は歓迎されますが、DXチームの優先事項ではありません。ヘルプが必要です」以外の関連情報を含まないWikiページがあります

このグラフィックには、インディケーターアプリメニューのソースコードから少しの情報がありますが、それだけでは不十分で、developer.ubuntu.comで見つけることができず、詳細な説明が必要です。

ここに画像の説明を入力してください

そう:

  • 表示される一連のメニュー項目(Dbusmenu.Menuitem)を取得する手順は何ですか?
  • クライアントとサーバーはどのような役割を果たしますか?(これらのどれが私のアプリケーションで実行されることになっていますか?またはその両方?)

同様の質問


使用しているツールキットを追加できます。
ティモ

確かに、それはkivyツールキットです。
xubuntix

1
この質問には標準的な答えが必要だと思います。
タキオン

最初は、dbusmenu-glib(例:Ted Gould)やlibdbusmenu-qt(Aurelien Gateau)の作成者がコードのドキュメントを書くのに時間を費やすことを望んでいました。しかし、4か月待っても何も起こりませんでした。だから私は2番目に良い選択肢を試し、自分の評判に合ったコミュニティに「賄bri」をかけようとしました。これはうまくいかないようです
...-xubuntix

あなたがテッド(連絡示唆@xubuntix gould.cx/ted/blogを)とオーレリアン(agateau.com/about-me直接)
fossfreedom

回答:


14

一般に、ツールキットを使用してグローバルメニューバーにメニューを配置する方法を使用することをお勧めします...しかし、この時点で納得するには遅すぎると思います:-)また、 12.04でDbusmenuと登録を使用しているのは、14.04までにGMenuModelに移動し、メニューでウィンドウをマークすることが目標なので、この情報は古くなっています。もちろん、ツールキットのプラグインは更新されます;-)(前回試してみると約束します)

基本的な原則は、どのメニューがどのウィンドウに関連付けられているかを知る必要があるということです。XIDを使用してウィンドウを追跡し、メニューはDBus上のDbusmenuサーバーへのパスです。登録するには、これらの情報の両方が必要です。登録インターフェースは、基本的にこれら両方の情報をレジストラに渡すという点で非常にシンプルです。DBusでのレジストラのよく知られた名前はcom.canonical.AppMenu.Registrarです。

これがどのように機能するかの例については、indicator-appmenuにあるmock-json-appサンプルコードご覧ください。これはdbusmenu-dumper(libdbusmenu-toolsにあります)が出力するJSONファイルを取得し、そのメニューを表示するウィンドウを作成する小さなツールです。また、ほとんどのアプリケーションでは本当に必要とされないappmenuのクラッシュなども処理します(ただし、開発では本当に重要です:-))。

Dbusmenuサーバーを作成するには、基本的にオブジェクトを割り当て、DBusのどこに表示するかを指定するだけです(そのため、レジストラに場所を指定できます)。appmenu-gtkのようなプラグインの場合、競合が発生しないように生成されたパスを使用しますが、アプリを制御している場合は、おそらく固定パスを使用できます。次に、Dbusmenu Menuitemオブジェクトのツリー構造を作成します。ルートは表示されませんが、メニューを開始するためにDbusmenuサーバー渡されます。ルートの下の最初のレベルは、Ubuntu Menubarの項目として表示されます。

幸運を祈ります。この質問に答えようと私を悩ませたすべての人々に感謝します。ツールキットのサポートを使用する必要があると私はまだ信じています(私はそれが最後であると嘘をつきました)が、幸運を祈ります!


1
どうもありがとうございました!そして、あなたに嫌がらせをしてくれたすべての人々に感謝します:-) そして、私はメニューのためだけにツールキットを切り替えません... GMenuModelへの切り替えは、他のツールキットでそれを使用することを不可能にしますか?
xubuntix

GMenuModelは、サポートが直接GLibにあるため、多くのツールキットのアップストリームを容易にし、追加の依存関係がないため、一部のツールキットメンテナーを悩ませました。
テッド・グールド

@TedGould素晴らしい答え、テッド!しかし、GTKなしの例はありますか?可能な限りXlibのみを使用することに近いもの、それ以外は何もありませんか?Gtkを使用している場合は、与えられたmock-json-appの例は素晴らしいです。X11を直接使用する(または別のツールキット)場合はそれほどではありません。Glib、libdbusmenu-glib、およびX11のみを使用するものをまとめようとしていますが、問題が発生しているようです。私の目標?SDLアプリにサポートを追加することに興味があり、GNUstepアプリがdbusmenuをサポートしていないことを常に考えています。
イヴァンヴチカ

1
@TedGould私の試みはここにあります:bitbucket.org/ivucica/minidbus-menuあなた(または他の誰か!)がコードを見て、メニューが表示されない理由とタイトルバーには「Hud」と表示されます。:
イヴァンヴチカ

12.04でCコードが動作するようになったようです。メニューにスタンドアロンのアイテムを追加しようとしてはいけませんでした。それらを別のメニュー項目のサブ項目として追加すると、動作するようになりました。クール;)
イヴァンヴチカ

0

残念ながら、そのためのわかりやすい文書は見つかりません。グローバルメニューはGTKとQtを念頭に置いて開発されました。プロトコルはDBusベースであるため、他のWebキットのサポートを実装することは理論的には可能ですが、ドキュメントを利用可能にする努力はほとんどありませんでした。

私があなたに与えることができる最高のポインタは、のソースコードです indicator-appmenuplasma-widget- menubarの。これらを読んで、dbusプロトコルがどのように機能するかを理解できます。


1
いくつかの代表的なケースについて、会話のdbus-monitorトレースを取得することも役立つでしょうか?dbusmenuや監視dbusについて十分な知識はありませんが、知っている誰かからいくつかの例を見てみたいです。
nealmcb

0

python-dbusバインディングを使用し、http: //developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.htmlで文書化されているDbusMenuのAPIを使用して、グローバルメニューバーと統合できます。


4
これはまさに答えで私が与えたリンクであり、私はそれを使用する方法を理解していないと述べています!
-xubuntix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.