You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询获取已启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:33:17