AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 690769
Accepted
user.dz
user.dz
Asked: 2015-10-28 12:02:09 +0800 CST2015-10-28 12:02:09 +0800 CST 2015-10-28 12:02:09 +0800 CST

如何为 Unity 开发系统指标?

  • 772

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

背景:

从这两个问题:

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

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

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

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

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

对于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查看哪个指标正在中继这些库。

Update2:这是为了让感兴趣的用户保持更新。

从我到目前为止收集的内容来看,以下是可能的解决方案的顺序:

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

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

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

  2. libindicator7

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

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

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

  3. libunity9(低的)

    暂无研究

unity
  • 2 2 个回答
  • 3027 Views

2 个回答

  • Voted
  1. Best Answer
    user.dz
    2016-04-02T09:04:05+08:002016-04-02T09:04:05+08:00

    系统指标服务

    好吧,这真的比我预期的要简单。它没有特定的 API。因为它只是一个GSimpleActionGroup,并带有通过 DBus 导出的相应GMenu,所以使用放入的同名声明文件告知 Unity 它们的存在/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. 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:指标服务文件格式

    系统指标插件

    这不是上面那个完全独立的指示器,它只是一个共享库插件,类似于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/
        
    • 13
  2. user408654
    2016-03-15T07:17:23+08:002016-03-15T07:17:23+08:00

    注意: 请查看这篇文章的底部,以获得对此答案的最终决定权。

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

    根据我的搜索,系统和应用程序指标的差异是明显的。考虑到这一点,我现在介绍一个有问题的概念:

    在系统指示器中使用应用程序指示器 API(与为相同目的创建新的统一 API 相反)

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

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

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

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

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

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

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

    针对您的这部分查询:

    《系统指标有没有统一的API》

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

    • 0

相关问题

  • 如何将 Web 应用程序放入 Unity Launcher?

  • Ubuntu 上网本 10.10 中没有 Alt+F2?

  • Unity 中的 gnome-do 样式键盘快捷键

  • 在哪里提交 Unity 的错误/愿望清单?

  • Unity 启动器——它可以作为单独的包提供吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve