web-dev-qa-db-ja.com

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

これは、 nityインジケーターの作成方法 の複製ではありません。アプリケーションインジケーターではなくシステムインジケーターを探しています。

背景:

次の2つの質問から:

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

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

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

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

トピック:

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

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

更新:

私はプッシュを与える可能性のあるリンクをいくつか見つけました:

  • アプリケーションインジケーター プロジェクトページでは、アプリケーションインジケーターに使用されるAppIndicator-0.3 API( CPython )へのリンクをリストしました。

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

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

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

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

    Evolution-Data-Serverのようなインジケータ開発APIではなく、データAPIをリストしているようです。しかし、わからない libindicate& 自由。これら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(低)

    研究はまだありません

38
user.dz

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

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

ここに非常に小さいC言語の例:

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

    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.overridelibプレフィックスと.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/
      
12
user.dz

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

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

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

システムインジケーターでのアプリケーションインジケーター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を使用する方法はありません。そのため、私の解決策は無効です:(