如何为Unity开发系统指标?

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

Backgound:

从这两个问题:

  • 如何在登录屏幕中添加或操作应用程序/系统指示器?
  • 如何将indicator-sysmonitor设置为登录屏幕上的默认指示器

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

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

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

这两个问题都是关于在登录和锁定屏幕中添加/删除指标。 第一个是直接设置(处理系统指标时)。 第二个是艰难的设置(当处理应用指标时),这需要修改锁定屏幕的面板服务(统一包)的来源以及登录屏幕的统一来源。

作为sysmonitor的情况,对我来说是解决方法。 最好的解决方案是实现系统指示器而不是应用程序指示器。

话题:

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

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

更新:

我找到了一些可能推动的链接:

  • 在Application Indicators项目页面中,他们列出了用于应用程序指标的AppIndicator-0.3 API( C和Python )的链接。

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

  • 另一方面,在系统指标项目页面中,他们提到:

    系统指标API

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

    他们似乎列出了与Evolution-Data-Server类似的Data API而非指标开发API。 但不确定libindicate和 libunity。 有没有人使用这两个库?

    尝试使用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 (低)

    还没有研究

系统指标服务

嗯,这比我预想的要简单得多。 它没有特定的API。 因为它只是一个GSimpleActionGroup并且通过DBus导出了相应的GMenu,所以Unity会使用/usr/share/unity/indicators/相同名称的声明文件告知它们的存在。 不需要任何其他库。

这是一个非常小的C语言示例:

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

     apt-get source libindicator cp libindicator-*/tests/indicator-test-service.c . cp libindicator-*/tests/com.canonical.indicator.test* . 
    • indicator-test-service.c没有变化

       #include  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)的任何其他语言。 因为我正在寻找python,我可能会在以后添加它。

参考文献:

  • libindicator README:指标服务文件格式

系统指标插件

这不是上面的完全独立指标,它只是一个共享lib插件,类似于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.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/ 

注意: 请查看本文的底部,以获得有关此答案的最终发言权。

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

根据我的搜索结果,系统和应用程序指标的区别是不同的。 考虑到这一点,我现在介绍一个值得怀疑的概念:

在系统指标中使用Application Indicator API(与为同一目的创建新的统一API相反)

在查看以下post时,我想到了这个想法:

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

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

Unity API似乎主要用于与应用程序指示器一起使用,但系统和应用程序指示器都可以使用类似的编程(C lang)。 但是,您之前提到过,这两种类型的指标由两个不同的系统处理。 因此,我接着开始阅读您的一个来源:

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

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

系统指示器是否可以使用Unity应用指示器API(Unity面板可以正确使用和显示API)? 如果对这些问题的答案是肯定的,那就可以满足这种情况 – 如果它不会导致其他问题。 我知道这不会立即成为一个答案,所以我会澄清我的尝试 – 我试图将任务分解为更小的目标。 主要目标是确定应用指标API是否可用于编码系统指标(作为系统指标的预先存在的统一API)。

为了回应您的查询的这一部分:

“系统指标是否有统一的API”

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