Unityのシステムインジケーターを開発する方法は?


38

これは、Unityインジケーターの作成方法とは異なりますか?。アプリケーションインジケーターではなくシステムインジケーターを探しています。

背景:

次の2つの質問から:

私は2種類の指標があることを学びました:

すべてのアプリケーションインジケーターは、インジケーターアプリケーション(システム1)によって処理/表示されます。システムインジケータは、Unityパネルによって直接表示されます。

どちらの質問も、ログイン画面とロック画面のインジケータの追加/削除に関するものです。1つ目は、単純なセットアップです(システムインジケーターを処理する場合)。2つ目は、ロック画面のパネルサービス(ユニティパッケージ)のソースとログイン画面の統一グリーターのソースを変更する必要がある、厳しい設定(アプリインジケーターを処理する場合)でした。

の場合、sysmonitorそれは回避策でした。最善の解決策は、アプリケーションの代わりにシステムインジケーターを実装することです。

トピック:

  • システムインジケータ用の統一されたAPIはありますか(できればPython、次にC / C ++)?公式ドキュメントを参照してください。

  • ほとんどのシステムインジケータは、Valaプログラミング言語を使用して記述されています。PythonまたはCを使用して、システムインジケーターの小さなデモを作成できますか?

更新:

私はプッシュを与えるかもしれないいくつかのリンクを見つけました:

  • アプリケーション指標プロジェクトページ、彼らはAppIndicator-0.3 API(へのリンクリストされているCPythonのアプリケーションの指標を使用します)。

    また、Indicate-0.7 API(CおよびPython)もリストしました。これは何ですか?まあ、それはデスクトップアプリケーション間のDBusメッセージングチャネルです。

  • 一方、システムインジケータープロジェクトページでは、次のように言及されました。

    システムインジケーターAPI

    • libindicateを使用したメッセージングメニュー。
    • libunityを使用したサウンドメニュー。
    • Evolution-Data-Serverを使用した日付/時刻インジケータ

    Evolution-Data-Serverのようなインジケータ開発APIではなく、データAPIをリストしているようです。しかし、libindicateと libunity についてはわかりません。これら2つのライブラリで作業した人はいますか?

    apt-cache rdepends libunity9 libindicator7 libindicator3-7これらのライブラリを中継しているインジケーターを確認してください。

Update2:これにより、関心のあるユーザーを最新の状態に保ちます。

これまでに収集したものから、可​​能な解決策の順序を以下に示します。

  1. libindicator3-7 (高、多くの指標はそれに依存しています)

    私はソースでいくつかのテスト例を見つけました、私が試したいくつかのダミーインジケータは、にインストールでき/usr/lib/indicators3/7/、それらは共有ライブラリ.soです。ログインと通常のセッションでは表示できますが、ロック画面では表示できません。

    ただし、Unityシステムのサービスのように見えるいくつかのテストインジケータサービスがあります。まだ試していません。

  2. libindicator7

    libindicator3-7と同じソースから、rdependsから:

    mate-indicator-applet
    lxpanel-indicator-applet-plugin
    

    パネル内のインジケータのコンテナを作成するために使用されるようです。

  3. libunity9 (低)

    研究はまだありません

回答:


12

システムインジケータサービス

まあ、それは私が期待したよりも本当に簡単です。特定のAPIはありません。これはGSimpleActionGroupであり、DBusを介して対応するGMenuがエクスポートされているため、Unityは同じ名前の宣言ファイルを使用してその存在を通知され/usr/share/unity/indicators/ます。他のライブラリは必要ありません。

これは非常に小さなC言語の例です。

  1. ソースtests/indicator-test-service.cからのコピーを取得libindicator

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    
    • indicator-test-service.c変更なし

      #include <gio/gio.h>
      
      typedef struct
      {
        GSimpleActionGroup *actions;
        GMenu *menu;
      
        guint actions_export_id;
        guint menu_export_id;
      } IndicatorTestService;
      
      static void
      bus_acquired (GDBusConnection *connection,
                    const gchar     *name,
                    gpointer         user_data)
      {
        IndicatorTestService *indicator = user_data;
        GError *error = NULL;
      
        indicator->actions_export_id = g_dbus_connection_export_action_group (connection,
                                                                              "/com/canonical/indicator/test",
                                                                              G_ACTION_GROUP (indicator->actions),
                                                                              &error);
        if (indicator->actions_export_id == 0)
          {
            g_warning ("cannot export action group: %s", error->message);
            g_error_free (error);
            return;
          }
      
        indicator->menu_export_id = g_dbus_connection_export_menu_model (connection,
                                                                         "/com/canonical/indicator/test/desktop",
                                                                         G_MENU_MODEL (indicator->menu),
                                                                         &error);
        if (indicator->menu_export_id == 0)
          {
            g_warning ("cannot export menu: %s", error->message);
            g_error_free (error);
            return;
          }
      }
      
      static void
      name_lost (GDBusConnection *connection,
                 const gchar     *name,
                 gpointer         user_data)
      {
        IndicatorTestService *indicator = user_data;
      
        if (indicator->actions_export_id)
          g_dbus_connection_unexport_action_group (connection, indicator->actions_export_id);
      
        if (indicator->menu_export_id)
          g_dbus_connection_unexport_menu_model (connection, indicator->menu_export_id);
      }
      
      static void
      activate_show (GSimpleAction *action,
                     GVariant      *parameter,
                     gpointer       user_data)
      {
        g_message ("showing");
      }
      
      int
      main (int argc, char **argv)
      {
        IndicatorTestService indicator = { 0 };
        GMenuItem *item;
        GMenu *submenu;
        GActionEntry entries[] = {
          { "_header", NULL, NULL, "{'label': <'Test'>,"
                                   " 'icon': <'indicator-test'>,"
                                   " 'accessible-desc': <'Test indicator'> }", NULL },
          { "show", activate_show, NULL, NULL, NULL }
        };
        GMainLoop *loop;
      
        indicator.actions = g_simple_action_group_new ();
        g_simple_action_group_add_entries (indicator.actions, entries, G_N_ELEMENTS (entries), NULL);
      
        submenu = g_menu_new ();
        g_menu_append (submenu, "Show", "indicator.show");
        item = g_menu_item_new (NULL, "indicator._header");
        g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.root");
        g_menu_item_set_submenu (item, G_MENU_MODEL (submenu));
        indicator.menu = g_menu_new ();
        g_menu_append_item (indicator.menu, item);
      
        g_bus_own_name (G_BUS_TYPE_SESSION,
                        "com.canonical.indicator.test",
                        G_BUS_NAME_OWNER_FLAGS_NONE,
                        bus_acquired,
                        NULL,
                        name_lost,
                        &indicator,
                        NULL);
      
        loop = g_main_loop_new (NULL, FALSE);
        g_main_loop_run (loop);
      
        g_object_unref (submenu);
        g_object_unref (item);
        g_object_unref (indicator.actions);
        g_object_unref (indicator.menu);
        g_object_unref (loop);
      
        return 0;
      }
      
    • ロックおよびグリーターモードを追加するために変更されたcom.canonical.indicator.test

      [Indicator Service]
      Name=indicator-test
      ObjectPath=/com/canonical/indicator/test
      
      [desktop]
      ObjectPath=/com/canonical/indicator/test/desktop
      
      [desktop_greeter]
      ObjectPath=/com/canonical/indicator/test/desktop
      
      [desktop_lockscreen]
      ObjectPath=/com/canonical/indicator/test/desktop
      
    • com.canonical.indicator.test.service.inファイル名から接尾辞を削除し、実行可能パスを変更します

      [D-BUS Service]
      Name=com.canonical.indicator.test
      Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
      
  2. コンパイルする

    gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
  3. 手動インストール

    sudo su
    mkdir /usr/lib/x86_64-linux-gnu/indicator-test/
    cp indicator-test-service /usr/lib/x86_64-linux-gnu/indicator-test/
    cp com.canonical.indicator.test /usr/share/unity/indicators/
    cp com.canonical.indicator.test.service /usr/share/dbus-1/services/
    
  4. Greeterの構成、デフォルトのインジケーターリストのオーバーライド

    • 90_unity-greeter.gschema.override

      [com.canonical.unity-greeter]
      indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'com.canonical.indicator.test', 'application']
      
    • インストール

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      
  5. テスト

    sudo service lightdm restart

ノート

  • ユーザーがいつでもアプリケーションを終了できるようにしたい場合、DBusサービスは面倒です。デフォルトのインジケータのように、代わりに自動起動を使用することをお勧めします。

  • 準備ができたファイルをここにアップロードしました:

    https://github.com/sneetsher/mysystemindicator_minimum

    ここに変更されたコピー:

    https://github.com/sneetsher/mysystemindicator

    モードごとに異なるメニューを試しました。すぐにインストールしてテストできます。

  • これは単純すぎるようで、GIO Gnome lib(DBusを含む)をサポートする他の言語に簡単に移植できます。Pythonを探しているので、後で追加するかもしれません。

参照:


システムインジケータプラグイン

これは、上記のような完全なスタンドアロンインジケータではなく、libappmenu.solibprintersmenu.so(アプリケーションメニューとプリンタインジケータ)に似た単なる共有ライブラリプラグインです。通常のユーザーセッションとグリーターでのみ表示できます(ロック画面では表示されません)。

現在のマシンで動作させることはできませんでしたが、以前は動作していました。ここでの手順は、何か不足している可能性があります。

  1. 上記と同じソースを使用 libindicator

    test/libdummy-indicator-*.c 例(パネルに表示されるシンプルで表示可能なもの)

  2. コンパイル

    ./autogen.sh
    make
    
  3. インストール

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
  4. グリーター画面に表示するように構成する

    • 90_unity-greeter.gschema.overrideは、libプレフィックスと.so拡張子なしで同じ名前を使用します。

      [com.canonical.unity-greeter]
      indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'application', 'dummy']
      
    • インストール

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      

2
Pythonでこれができるのかしら.. Cは少し怖いです。
セス

@Sethはい、Pythonで作成できます。私がチェックしたばかりのようにexport_action_group、必要なすべての関数(、export_menu_model)とオブジェクト(SimpleActionGroupMenu)はにありgi.repository.Gioます。これから数日のうちに作成してみます。
user.dz

0

注: この回答の最終決定については、この投稿の下部をご覧ください。

私が本当に助けになっているかどうかはわかりませんが、このアイデアが役に立つかもしれません。

私が検索したものから、システムとアプリケーションのインジケータの違いは明確です。これを念頭に置いて、疑問のある概念を紹介します。

システムインジケーターでのアプリケーションインジケーターAPIの使用(同じ目的で新しい統合APIを作成するのではなく)

このアイデアは、次の投稿を見ながら思いついたものです。

https://askubuntu.com/a/234204/408654

https://askubuntu.com/a/42213/408654

Unity APIは主にアプリケーションインジケーターで使用するために構築されているように見えますが、システムインジケーターとアプリケーションインジケーターの両方が同様のプログラミング(C lang)を使用する場合があります。ただし、これらの2種類のインジケーターは2つの異なるシステムによって処理されることを前に述べました。そのため、次にソースの1つを読みました。

ログイン画面でアプリケーション/システムインジケータを追加または操作するにはどうすればよいですか?

主な答えは、既存のユーザーをオーバーライドして、必要なアクセス権を取得することでした。また、既存のすべてのインジケーターを追加および削除するためのソリューションも提供しました。これは、インジケーターの統合管理ソリューションです。システムインジケーターを実行/導入するために、既定の(既存の)ユーザーをオーバーライドすることは可能ですか?

システムインジケーターはUnityアプリケーションインジケーターAPIを使用できますか(APIはUnityパネルで適切に使用および表示できますか)?これらの答えが「はい」であれば、それは状況を満足させるでしょう-結果として他の問題を引き起こさないなら。私はこれがすぐに答えのように思えないことを知っているので、私が試みたことを明確にします-タスクをより小さな目的に分解しようとしています。主な目的は、アプリケーションインジケータAPIをシステムインジケータのコーディングに使用できるかどうかを確認することです(システムインジケータ用の既存の統合APIとして)。

クエリのこの部分に対する応答:

「システムインジケータ用の統合APIはありますか」

ただし、残念ながら、システムインジケータにアプリケーションインジケータAPIを使用する方法はありません。そのため、私の解決策は無効です:(


残念ながら、アプリケーションインジケータAPIを使用してシステムインジケータを作成することはできませんでした。それは、indicator-sysmonitorと同じケースになり、unityおよびunity- greeterの修正ビルドが必要です。
user.dz

その場合、新しいAPIが必要であるように見えます-それはシステムインジケータ専用です。現状では、システムインジケーターにはUbuntuとは異なる複数のAPIがあります。質問投稿の最後で述べたように、サードパーティのライブラリを使用するオプションが残っていると思います。
-TopHatProductions115
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.