Як розробити системний показник для єдності?


38

Це не дублікат « Як створити індикатори єдності»? . Я шукаю індикатор системи, а не індикатор програми.

Назад:

З цих двох питань:

Я дізнався, що є два типи показників:

Усі індикатори додатків обробляються / показуються індикатором-додатком (системним). Показники системи відображаються безпосередньо на панелі Unity.

Обидва питання стосуються додавання / видалення індикаторів із екрана входу та блокування. Перша - це встановлення прямого руху вперед (при роботі з системними індикаторами). Друга - це жорстка установка (при роботі з індикаторами додатків), яка потребує зміни джерела служби панелі (пакету єдності) для блокування екрана та джерела єдності-привітання для екрана входу.

Як sysmonitorна мене, це було вирішено. Найкраще рішення - застосувати системний індикатор замість додаткового.

Тема:

  • Чи існує уніфікований API для системних індикаторів (Переважно: Python, потім C / C ++)? Будь ласка, посилайтесь на офіційні документації.

  • Більшість системних індикаторів записуються мовою програмування Vala. Чи міг би хтось написати невелику демонстраційну версію для системного індикатора за допомогою Python або C?

Оновлення:

Я знайшов кілька посилань, які можуть підштовхнути:

  • На сторінці проекту « Показники додатків » вони перелічили посилання на API AppIndicator-0.3 ( C & Python ), що використовується для індикаторів додатків.

    Вони також перераховували API Indicate-0.7 ( C & Python ). Що це? Ну, це канал обміну повідомленнями DBus між настільними програмами.

  • З іншого боку, на сторінці проекту System Indicators вони згадували:

    API системного індикатора

    • Меню обміну повідомленнями за допомогою libindicate.
    • Звукове меню за допомогою лібідності.
    • Індикатор дати / часу за допомогою сервера Evolution-Data

    Вони, схоже, перелічують API даних, а не API розвитку індикатора, як для Evolution-Data-Server. Але не впевнений у лібіндикаті та лібітеті. Чи працював хтось із цими двома бібліотеками?

    Спробуйте apt-cache rdepends libunity9 libindicator7 libindicator3-7побачити, який показник передає ці бібліотеки.

Update2: це допоможе інформувати зацікавлених користувачів.

З того, що я зібрав дотепер, ось порядок можливих рішень:

  1. libindicator3-7 (високо, від цього залежить багато показників)

    У джерелі я знайшов кілька тестових прикладів, декілька фіктивних індикаторів, які я спробував, можна встановити в них /usr/lib/indicators3/7/, вони поділяються lib .so. Я міг би відображати їх у вході та регулярній сесії, але не в блокованому екрані.

    Однак є деякі сервіси тестових індикаторів, схожі на системи Unity. Я ще їх не пробував.

  2. libindicator7

    З того самого джерела, що і libindicator3-7, від rdepends:

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

    Здається, використовується для виготовлення контейнера для індикаторів на панелях.

  3. libunity9 (низький)

    Досліджень поки що немає

Відповіді:


12

Служба системних індикаторів

Що ж, це справді простіше, ніж я очікував. Для нього немає специфічного API. Оскільки це просто GSimpleActionGroup & з відповідними GMenu , експортованими через DBus, Unity повідомляється про їх присутність, використовуючи файл декларації з тим самим іменем, що вводиться /usr/share/unity/indicators/. Не потрібно жодної іншої бібліотеки.

Ось дуже невеликий приклад мови С :

  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* .
    • індикатор-тест-сервіс.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

    Де я спробував різні меню для різних режимів. Його можна було швидко встановити та протестувати.

  • Це здається занадто простим і його можна легко перенести на будь-яку іншу мову, яка підтримує lib GIO Gnome (включаючи DBus). Оскільки я шукаю python, я можу його додати пізніше.

Список літератури:


Плагін системного індикатора

Це не повний автономний індикатор, як показано вище, це лише плагін для власного доступу, подібний до 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/

2
Цікаво, чи можна це зробити в Python .. З виглядає трохи страшно.
Сет

@Seth Я вважаю, що так, це можна зробити в Python. Щойно я перевірив, що всі необхідні функції ( 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

API Unity, здається, в основному побудований для використання з індикаторами додатків, але і системні, і індикатори додатків можуть використовувати подібне програмування (C lang). Однак ви згадали раніше, що ці два типи індикаторів обробляються двома різними системами. Тоді я продовжив читати одне з ваших джерел:

Як додати або маніпулювати індикаторами програми / системи на екрані входу?

Основна відповідь передбачала переосмислення вже існуючого користувача, щоб отримати необхідний їм доступ. Він також запропонував рішення для додавання та вилучення всіх існуючих показників. Це єдине рішення для управління показниками. Чи можна було б замінити типового (раніше існуючого) користувача для запуску / впровадження системного індикатора?

Чи може системний індикатор використовувати Unity Application Indicator API (чи API може бути використаний та відображений належним чином на панелі Unity)? Якщо відповіді на це "так", це би наситило ситуацію - якщо це не спричинить інших питань. Я знаю, що це не відразу здасться відповіддю, тому я поясню, що я намагався - я намагаюся розбити завдання на менші цілі. Основна мета полягає у з'ясуванні, чи API може бути використаний для кодування системних індикаторів (як попередньо уніфікований API для системних індикаторів).

У відповідь на цю частину вашого запиту:

"Чи є єдиний API для системних індикаторів"

На жаль, однак немає можливості використовувати API-індикатори додатків для системних індикаторів. Таким чином, моє рішення недійсне :(


На жаль, ні, API індикатора програми не можна було використовувати для створення системного індикатора. це буде той самий випадок, що і для індикатора-системонітора. Він потребує модифікованих побудов єдності та єдності-привітання.
user.dz

У такому випадку виглядає, що потрібен новий API - той, який призначений саме для системного індикатора. На даний момент системний індикатор має декілька окремих API від Ubuntu. Я думаю, що нам залишається можливість використовувати сторонні бібліотеки, як зазначено в кінці повідомлення.
TopHatProductions115
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.