如何为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:这可以让感兴趣的用户保持更新。
从我收集到现在,这是可能的解决方案的顺序:
-
libindicator3-7
(高,许多指标依赖于它)我在源代码中发现了一些测试示例,我尝试过的一些虚拟指示器可以安装在
/usr/lib/indicators3/7/
,它们是共享库.so
。 我可以在登录和常规会话中显示它们但不在锁定屏幕中显示。但是有一些测试指标服务,看起来像Unity系统服务。 我还没有尝试过。
-
libindicator7
来自与libindicator3-7相同的来源,来自rdepends:
mate-indicator-applet lxpanel-indicator-applet-plugin
它似乎被用来制作面板指示器的容器。
-
libunity9
(低)还没有研究
系统指标服务
嗯,这比我预想的要简单得多。 它没有特定的API。 因为它只是一个GSimpleActionGroup并且通过DBus导出了相应的GMenu,所以Unity会使用/usr/share/unity/indicators/
相同名称的声明文件告知它们的存在。 不需要任何其他库。
这是一个非常小的C语言示例:
-
从
libindicator
源获取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
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
-
-
编译它
gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
-
手动安装
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/
-
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/
-
-
测试
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.so
和libprintersmenu.so
(应用程序菜单和打印机指示器)。 它只能在常规用户会话和欢迎中显示(不在锁定屏幕上)。
我无法在我当前的机器上工作,但我之前做过。 这里的步骤,可能是我遗漏了一些东西。
-
使用
libindicator
上面的相同来源test/libdummy-indicator-*.c
是示例(面板上显示的简单和可见) -
编
./autogen.sh make
-
安装
sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
-
配置为在欢迎屏幕中显示
-
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用于系统指标。 因此,我的解决方案是无效的:(