Unity 용 시스템 인디케이터를 개발하는 방법?


38

이것은 Unity 지표를 만드는 방법과 중복되지 않습니다 . . 응용 프로그램 표시기가 아닌 시스템 표시기를 찾고 있습니다.

Backgound :

이 두 질문에서

나는 두 가지 유형의 지표가 있다는 것을 배웠다.

모든 응용 프로그램 표시기는 표시기 응용 프로그램 (시스템 표시기)에 의해 처리 / 표시됩니다. 시스템 표시기는 Unity 패널에서 직접 보여줍니다.

두 가지 질문 모두 로그인 및 잠금 화면에서 표시기를 추가 / 제거하는 것에 관한 것입니다. 첫 번째는 간단한 설정이었습니다 (시스템 표시기를 처리 할 때). 두 번째는 잠금 화면에 대한 패널 서비스 소스 (유니티 패키지)와 로그인 화면에 대한 통일 인사 소스를 수정해야하는 어려운 설정 (앱 지표를 처리 할 때)이었습니다.

의 경우 sysmonitor, 저에게 그 해결 방법이었습니다. 가장 좋은 솔루션은 응용 프로그램 대신 시스템 표시기를 구현하는 것입니다.

이야기:

  • 시스템 인디케이터를위한 통합 API가 있습니까 (바람직하게는 Python과 C / C ++)? 공식 문서를 참조하십시오.

  • 대부분의 시스템 표시기는 Vala 프로그래밍 언어를 사용하여 작성됩니다. 파이썬이나 C를 사용하여 시스템 표시기에 대한 작은 데모를 작성할 수 있습니까?

최신 정보:

푸시 할 수있는 링크가 거의 없습니다.

  • 응용 프로그램 표시기 프로젝트 페이지 에는 응용 프로그램 표시기에 사용 되는 AppIndicator-0.3 API ( C & Python )에 대한 링크가 나열되어 있습니다 .

    그들은 또한 Indicate-0.7 API ( C & Python )를 나열했습니다 . 이게 뭐야? 글쎄, 그것은 데스크탑 응용 프로그램 사이의 DBus 메시징 채널입니다.

  • 반면, 시스템 표시기 프로젝트 페이지에서 다음을 언급했습니다.

    시스템 표시기 API

    • libindicate를 사용하는 메시징 메뉴.
    • libunity를 사용하는 사운드 메뉴.
    • Evolution-Data-Server를 사용한 날짜 / 시간 표시기

    Evolution-Data-Server와 같은 표시기 개발 API가 아닌 데이터 API를 나열하는 것 같습니다. 그러나 libindicate & libunity 에 대해서는 확실하지 않습니다 . 이 두 라이브러리에서 작업 한 사람이 있습니까?

    시도 apt-cache rdepends libunity9 libindicator7 libindicator3-7하는 지표 것은 이러한 라이브러리를 중계하는 것을 볼 수 있습니다.

Update2 : 관심있는 사용자를 계속 업데이트합니다.

내가 지금까지 수집 한 것부터 가능한 해결책의 순서는 다음과 같습니다.

  1. libindicator3-7 (높음, 많은 지표가 의존합니다)

    소스에서 몇 가지 테스트 예제를 찾았습니다. 내가 시도한 일부 더미 표시기는에 설치 될 수 있으며 /usr/lib/indicators3/7/lib 공유 .so됩니다. 로그인 및 일반 세션에는 표시되지만 잠금 화면에는 표시되지 않습니다.

    그러나 Unity 시스템 서비스처럼 보이는 테스트 인디케이터 서비스가 있습니다. 아직 시도하지 않았습니다.

  2. libindicator7

    rdepends의 libindicator3-7과 동일한 소스에서 :

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

    패널의 표시기 컨테이너를 만드는 데 사용되는 것 같습니다.

  3. libunity9 (낮은)

    아직 연구가 없습니다

답변:


12

시스템 표시기 서비스

글쎄요, 예상보다 훨씬 간단합니다. 특정 API가 없습니다. GSusActionGroup 일 뿐이며 해당 GMenu가 DBus를 통해 내보내 졌기 때문에 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 파일 이름에서 postfix를 제거 하고 실행 파일 경로를 변경하십시오.

      [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 포함)를 지원하는 다른 언어로 쉽게 이식 될 수 있습니다. 파이썬을 찾을 때 나중에 추가 할 수 있습니다.

참고 문헌 :


시스템 표시기 플러그인

이것은 위의 독립형 표시기가 아니며 libappmenu.so& libprintersmenu.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/

2
이것이 파이썬에서 이루어질 수 있는지 궁금합니다. C는 약간 무섭게 보입니다.
세스

@ Seth 나는 그것이 파이썬으로 만들어 질 수 있다고 믿는다. 방금 확인한대로 필요한 모든 함수 ( export_action_group, export_menu_model) 및 객체 ( SimpleActionGroup, Menu)가 있습니다 gi.repository.Gio. 앞으로 며칠 안에 글을 쓸 것입니다.
user.dz

0

참고 : 이 답변의 마지막 말을 위해이 게시물의 하단을 확인하십시오.

실제로 도움이되는지 모르겠지만이 아이디어가 도움이 되길 바랍니다.

내가 검색 한 내용과 시스템 및 응용 프로그램 표시기의 차이점은 분명합니다. 이를 염두에두고 이제 의심스러운 개념을 소개합니다.

시스템 표시기에서 응용 프로그램 표시기 API 사용 (동일한 목적으로 새로운 통합 API를 만드는 것과 반대)

다음 게시물을 보면서 아이디어가 나에게 왔습니다.

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

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

Unity API는 주로 애플리케이션 인디케이터와 함께 사용하도록 구축 된 것으로 보이지만 시스템 및 애플리케이션 인디케이터 모두 유사한 프로그래밍 (C lang)을 사용할 수 있습니다. 그러나 앞에서 언급 한 두 가지 유형의 지표는 서로 다른 두 시스템에서 처리된다고 언급했습니다. 따라서 나는 당신의 출처 중 하나를 읽었습니다.

로그인 화면에서 애플리케이션 / 시스템 표시기를 추가하거나 조작하려면 어떻게합니까?

주요 답변은 기존 사용자를 재정 의하여 필요한 액세스 권한을 얻는 것입니다. 또한 기존의 모든 지표를 추가 및 제거하기위한 솔루션을 제공했습니다. 지표에 대한 통합 관리 솔루션입니다. 시스템 표시기를 실행 / 소개하기 위해 기본 (기존) 사용자를 무시할 수 있습니까?

시스템 표시기가 Unity Application Indicator API를 사용할 수 있습니까 (Unity 패널에서 API를 올바르게 사용하고 표시 할 수 있습니까)? 이것에 대한 대답이 예라면, 그 결과 다른 문제를 일으키지 않는다면 상황을 만족시킬 것입니다. 나는 이것이 즉시 대답처럼 보이지 않는다는 것을 알고 있으므로 내가 시도한 것을 분명히 할 것입니다-나는 과제를 더 작은 목표로 나누려고합니다. 주요 목표는 응용 프로그램 표시기 API를 시스템 표시기 (시스템 표시기의 기존 통합 API)를 코딩하는 데 사용할 수 있는지 확인하는 것입니다.

쿼리의이 부분에 대한 응답으로 :

"시스템 표시 기용 통합 API가 있습니까?"

그러나 불행하게도 시스템 표시기에 응용 프로그램 표시기 API를 사용할 수있는 방법이 없습니다. 따라서 내 솔루션은 무효입니다 :(


불행히도, 애플리케이션 인디케이터 API를 사용하여 시스템 인디케이터를 작성할 수 없습니다. indicator-sysmonitor 와 같은 경우가 될 것입니다 . 그것은 unity & unity-greeter의 수정 된 빌드가 필요합니다.
user.dz

이 경우 새로운 API가 필요한 것처럼 보입니다. 시스템 표시기 전용입니다. 시스템 표시기는 우분투와는 별도의 여러 API를 가지고 있습니다. 질문 게시물 끝에 언급 된대로 타사 라이브러리를 사용할 수있는 옵션이 남아 있다고 생각합니다.
TopHatProductions115
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.