Как разработать Системный Индикатор для Единицы?

Это не дубликат того, Как создать индикаторы Unity?. Я ищу системный индикатор не индикатор приложения.

Backgound:

От этих двух вопросов:

Я узнал, что существует два типа индикаторов:

Все индикаторы приложения обрабатываются/показываются приложением индикатора (система одна). Системные индикаторы, показал непосредственно панелью Unity.

Оба вопроса о добавляющих/удаляющих индикаторах от входа в систему и блокируют экран. Первой была прямая установка (при контакте с системными индикаторами). Второй была жесткая установка (при контакте с индикаторами приложения), которому нужно изменение источника сервиса панели (пакет единицы) для экрана блокировки и источника зазывалы единицы для экрана входа в систему.

Как случай sysmonitor, мне, который был обходным решением. Лучшее решение состоит в том, чтобы реализовать системный индикатор вместо приложения один.

Тема:

  • Есть ли объединенный API для системных индикаторов (Предпочтительно: Python затем C/C++)? Ссылка на официальную документацию.

  • Большинство системных индикаторов записано с помощью языка программирования Vala. Кто-либо мог писать мелко демонстрацию для системного индикатора с помощью Python или C?

Обновление:

Я нашел немного ссылок, которые могут дать нажатие:

  • На странице проекта Индикаторов приложения Они перечислили ссылки на AppIndicator-0.3 API (C & Python), используемый для индикаторов приложения.

    Они перечислили, также Указывают на 0,7 API (C & Python).Что это такое? Ну, это - DBus обменивающийся сообщениями канал между Настольными приложениями.

  • На другой руке, на Системной странице проекта Индикаторов, они упомянули:

    Системные API индикатора

    • Обмен сообщениями Меню, использующего libindicate.
    • Звуковое Меню с помощью libunity.
    • Индикатор даты/Времени с помощью Сервера данных эволюции

    Они кажутся Данными списка API не Разработка Индикатора API как для Сервера данных эволюции. Но не уверенный в libindicate и libunity. Кто-либо работал с этими двумя библиотеками?

    Попробовать apt-cache rdepends libunity9 libindicator7 libindicator3-7 видеть, какой индикатор передает эти библиотеки.

Update2: Это для держания заинтересованных пользователей в курсе.

Из того, что я собрался до настоящего времени, вот порядок возможных решений:

  1. libindicator3-7 (высоко, индикаторы Many зависят от него),

    Я нашел некоторые тестовые примеры в источнике, некоторые фиктивные индикаторы, которые я попробовал, могли быть установлены в /usr/lib/indicators3/7/, они - совместно использованный lib .so. Я мог отобразить их во Входе в систему и Очередной сессии, но Не на Экране Блокировки.

    Однако существуют некоторые сервисы контрольного индикатора, который походит на системные Единицы. Я еще не судил их.

  2. libindicator7

    Из того же источника как libindicator3-7, от rdepends:

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

    Это, кажется, используется для создания контейнера для индикаторов в панелях.

  3. libunity9 (низко)

    Никакое исследование все же

38
задан 6 January 2016 в 02:00

2 ответа

Системный сервис индикатора

Ну, это действительно более просто затем, я ожидал. Нет никакого определенного API для него. Поскольку это - просто GSimpleActionGroup и с соответствующим GMenu's, экспортируемым через DBus затем, Единица сказана об их присутствии с помощью файла объявления с тем же вставленным именем /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. Конфигурация для Зазывалы, переопределите список индикаторов по умолчанию

    • 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

    Где я попробовал другое меню за другой режим. Это могло быть установлено и протестировано быстро.

  • Это кажется слишком простым и может быть легко портировано на любой другой язык, которые имеют поддержку lib Gnome GIO (включая DBus). Поскольку я ищу Python, я могу добавить его позже.

Ссылки:


Системный плагин индикатора

Это не полный автономный индикатор как тот выше, это - просто плагин lib доли, подобный 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.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/
      
12
ответ дан 23 November 2019 в 00:16

ПРИМЕЧАНИЕ: проверьте, что нижняя часть этого сообщения для финала говорит относительно этого ответа.

я не знаю, имею ли я действительно помощь, но я надеюсь, что эта идея может быть полезной.

Из того, что я искал, различия в Системе и Индикаторах приложения являются явными. Принимая это во внимание, я теперь представляю сомнительное понятие:

использование Индикатора приложения API в Системном Индикаторе (в настроенном против создания нового, объединенного API для той же цели)

идея прибыла ко мне при рассмотрении следующих сообщений:

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

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

Единица API, кажется, прежде всего, создается для использования с Индикаторами приложения, но и Система и Индикаторы приложения могут использовать подобное программирование (C Ленг). Однако Вы упомянули ранее, что эти два типа Индикаторов обрабатываются двумя различными системами. По сути, я затем продолжил читать один из Ваших источников:

, Как я добавляю или управляю Индикаторами Приложения/Системы на экране входа в систему?

основной ответ включил переопределение уже существующего пользователя для получения доступа, которого они потребовали. Это также предоставило решение для добавления и удаления всех существующих Индикаторов. Это - объединенное решение по управлению для Индикаторов. Было бы возможно переопределить значение по умолчанию (существующее ранее) пользователь для выполнения/представления Системного Индикатора?

Системный Индикатор может использовать Индикатор приложения Единицы API (API может использоваться и отображаться правильно панелью Unity)? Если бы ответы на них да, который насытил бы ситуацию - если она не вызывает другие проблемы в результате. Я знаю, что это не будет сразу походить на ответ, таким образом, я разъясню то, чего я делал попытку - я пытаюсь повредить задачу в меньшие цели. Основное цель быть, узнавая, может ли Индикатор приложения API использоваться для кодирования Системных Индикаторов (как существование ранее, объединил API для Системных Индикаторов).

В ответ на эту часть Вашего запроса:

"Там объединенный API для системных индикаторов"

, К сожалению, тем не менее, нет никакого способа использовать API Индикатора приложения для Системных Индикаторов. По сути, мое решение является пустым :(

0
ответ дан 23 November 2019 в 00:16

Другие вопросы по тегам:

Похожие вопросы: