查询获取已启用GNOME扩展的C/C++ API
查询获取已启用GNOME扩展的C/C++ API
当然有对应的办法啦!你日常用的gnome-extensions list --enabled命令,本质是通过D-Bus和GNOME Shell的扩展服务(org.gnome.Shell.Extensions)交互来获取数据的,我们完全可以在C/C++代码里用GIO库直接调用这套API,实现和命令一样的效果,不用依赖外部进程调用。
下面是具体的实现思路和代码示例:
核心思路
GNOME Shell的扩展系统对外暴露了D-Bus服务接口,我们可以通过GIO库连接到会话D-Bus,调用org.gnome.Shell.Extensions接口的ListExtensions方法,该方法会返回所有扩展的详细属性(包括是否启用的状态),之后我们只需要筛选出enabled属性为true的扩展即可。
C语言示例代码
#include <gio/gio.h> #include <stdio.h> #include <stdlib.h> int main(void) { GDBusConnection *session_bus = NULL; GError *error = NULL; GVariant *response = NULL; GVariantIter *ext_iter = NULL; const gchar *ext_uuid; GVariant *ext_props; // 连接到会话D-Bus session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); if (!session_bus) { g_fprintf(stderr, "无法连接到会话D-Bus: %s\n", error->message); g_error_free(error); return EXIT_FAILURE; } // 调用扩展服务的ListExtensions方法,获取所有扩展的属性 response = g_dbus_connection_call_sync( session_bus, "org.gnome.Shell.Extensions", // 目标服务名称 "/org/gnome/Shell/Extensions", // 服务的对象路径 "org.gnome.Shell.Extensions", // 接口名称 "ListExtensions", // 要调用的方法名 NULL, // 该方法不需要传入参数 G_VARIANT_TYPE("a{sa{sv}}"), // 预期返回类型:UUID到属性字典的映射 G_DBUS_CALL_FLAGS_NONE, -1, // 无限超时等待响应 NULL, // 取消对象,这里暂时用不到 &error ); if (!response) { g_fprintf(stderr, "调用ListExtensions方法失败: %s\n", error->message); g_error_free(error); g_object_unref(session_bus); return EXIT_FAILURE; } // 解析返回的结果,筛选已启用的扩展 g_variant_get(response, "a{sa{sv}}", &ext_iter); while (g_variant_iter_next(ext_iter, "{&sa{sv}}", &ext_uuid, &ext_props)) { // 取出当前扩展的enabled属性 GVariant *enabled_variant = g_variant_lookup_value(ext_props, "enabled", G_VARIANT_TYPE_BOOLEAN); if (enabled_variant != NULL && g_variant_get_boolean(enabled_variant)) { g_printf("已启用的扩展: %s\n", ext_uuid); } // 及时释放资源,避免内存泄漏 if (enabled_variant) { g_variant_unref(enabled_variant); } g_variant_unref(ext_props); } // 清理所有申请的资源 g_variant_iter_free(ext_iter); g_variant_unref(response); g_object_unref(session_bus); return EXIT_SUCCESS; }
编译与运行
你可以用下面的命令编译这段代码(需要提前安装libglib2.0-dev等依赖包):
gcc -o enabled-extensions-lister enabled-extensions-lister.c $(pkg-config --cflags --libs gio-2.0)
运行编译后的程序,就能看到已启用的扩展UUID列表,和gnome-extensions list --enabled的输出一致。
一些注意事项
- 这个程序必须在GNOME桌面环境的会话中运行,因为
org.gnome.Shell.Extensions服务只有在GNOME Shell启动后才会存在,否则会出现D-Bus连接失败的错误。 - 如果是用C开发,可以借助gtkmm(GNOME的C绑定库)来调用GIO接口,核心逻辑完全相同,只是语法会更贴合C++的特性。
备注:内容来源于stack exchange,提问作者ibse
相关产品推荐
相关产品推荐

