系统指示器服务

系统指示器服务

这不是重复的如何创建 Unity 指标?。我正在寻找系统指示器而不是应用程序指示器。

背景:

从这两个问题来看:

我了解到有两种类型的指标:

  • 系统:声音、键盘、应用程序……(尝试ps ax | grep indicator:)
  • 应用程序:nm-applet、sysmonitor……以及几乎所有列出的有哪些应用指标可用?

所有应用程序指标均由指标应用程序(系统应用程序)处理/显示。系统指标直接由 Unity 面板显示。

这两个问题都是关于从登录和锁定屏幕添加/删除指示器。第一个是一个简单的设置(处理系统指示器时)。第二个是一个艰难的设置(处理应用程序指示器时),需要修改锁定屏幕的面板服务(unity 包)的来源和登录屏幕的 unity-greeter 的来源。

就 而言sysmonitor,对我来说,这是个解决办法。最好的解决方案是实现系统指示器,而不是应用程序指示器。

话题:

  • 系统指标是否有统一的 API(最好是 Python 然后是 C/C++)?请参考官方文档。

  • 大多数系统指标都是使用 Vala 编程语言编写的。有人能用 Python 或 C 为系统指标编写小型演示吗?

更新:

我发现几个可能会有推动作用的链接:

  • 应用指标项目页面,他们列出了 AppIndicator-0.3 API 的链接(C&Python) 用于应用指标。

    他们还列出了 Indicate-0.7 API (C&Python)。这是什么?嗯,它是桌面应用程序之间的 DBus 消息传递通道。

  • 另一方面,在系统指示器项目页面上,他们提到:

    系统指标 API

    • 使用 libindicate 的消息菜单。
    • 使用 libunity 的声音菜单。
    • 使用 Evolution-Data-Server 的日期/时间指示器

    他们似乎列出了数据 API,而不是像 Evolution-Data-Server 那样的指标开发 API。但不确定libindicate 和libunity。有人用过这两个库吗?

    尝试apt-cache rdepends libunity9 libindicator7 libindicator3-7查看哪个指标正在传递这些库。

更新2:这是为了让感兴趣的用户及时了解最新情况。

根据我目前收集到的信息,可能的解决方案的顺序如下:

  1. libindicator3-7(高,很多指标都依赖于它)

    我在源代码中找到了一些测试示例,一些我尝试过的虚拟指标,可以安装在中/usr/lib/indicators3/7/,它们是共享库.so。我可以让它们显示在登录和常规会话中,但不显示在锁定屏幕中。

    不过有一些测试指标服务,好像是Unity系统的,我还没试过。

  2. libindicator7

    来自与 libindicator3-7 相同的来源,来自 rdepends:

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

    它似乎是用来制作面板中指示器的容器。

  3. libunity9(低的)

    尚未研究

答案1

系统指示器服务

嗯,它确实比我想象的要简单。它没有特定的 API。因为它只是一个GSimpleActionGroup& 相应的菜单通过 DBus 导出后,Unity 会使用同名声明文件告知它们的存在/usr/share/unity/indicators/。无需任何其他库。

这里有一个非常小的C 语言例子:

  1. tests/indicator-test-service.clibindicator源获取副本

    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.测试修改添加锁定和迎宾模式

      [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.测试.服务从文件名中删除.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.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

笔记: 请查看这篇文章的底部以了解此答案的最终决定。

我不知道我是否真的能提供任何帮助,但我希望这个想法可能会有用。

从我搜索到的内容来看,系统指标和应用指标的区别很明显。考虑到这一点,我现在介绍一个值得怀疑的概念:

在系统指标中使用应用指标 API(而不是为同一目的创建新的统一 API)

我在看以下帖子时产生了这个想法:

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

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

Unity API 似乎主要为与应用程序指示器一起使用而构建,但系统指示器和应用程序指示器可能使用类似的编程(C 语言)。但是,您之前提到,这两种类型的指示器由两个不同的系统处理。因此,我继续阅读您的一个来源:

如何在登录屏幕添加或操作应用程序/系统指标?

主要答案涉及覆盖已经存在的用户以获得他们所需的访问权限。它还提供了添加和删除所有现有指标的解决方案。它是指标的统一管理解决方案。是否可以覆盖默认(预先存在的)用户来运行/引入系统指标?

系统指示器可以使用 Unity 应用程序指示器 API 吗(Unity 面板可以使用和正确显示该 API 吗)?如果这些问题的答案是肯定的,那么情况就解决了 - 前提是它不会导致其他问题。我知道这不会立即看起来像是一个答案,所以我将澄清我所尝试的 - 我试图将任务分解为更小的目标。主要目标是找出应用程序指示器 API 是否可用于编码系统指示器(作为系统指示器的预先存在的统一 API)。

针对您查询的这一部分:

“系统指标有没有统一的API”

但不幸的是,没有办法将应用程序指标 API 用于系统指标。因此,我的解决方案无效 :(

相关内容