Имя не активируется на g_dbus_proxy_call_sync - PullRequest
0 голосов
/ 27 мая 2019

В сеансе GNOME Xorg, чтобы получить возвращаемое значение метода GetIdletime, представленное в DBus, вы можете использовать

$ dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime

или

$ gdbus call --session --dest org.gnome.Mutter.IdleMonitor --object-path /org/gnome/Mutter/IdleMonitor/Core --method org.gnome.Mutter.IdleMonitor.GetIdletime

Мне нужно получить это значение с помощью GDBus API, поэтому я написал следующий код

/*
 * Compile with:
 *   gcc -Wall print_user_idle_time-gnome.c -o print_user_idle_time-gnome `pkg-config --libs gio-2.0 --cflags`
 */

#include <gio/gio.h>

static void
print_user_idle_time (GDBusProxy *proxy)
{
    guint64 user_idle_time;
    gchar *method = "GetIdletime";
    GError *error = NULL;
    GVariant *ret = NULL;

    ret = g_dbus_proxy_call_sync(proxy,
                                  method,
                                  NULL,
                                  G_DBUS_CALL_FLAGS_NONE, -1,
                                  NULL, &error);
    if (!ret) {
        g_dbus_error_strip_remote_error (error);
        g_print ("GetIdletime failed: %s\n", error->message);
        g_error_free (error);
        return;
    }

    user_idle_time = g_variant_get_uint64 (ret);
    g_print("%lu\n", user_idle_time);
    g_variant_unref (ret);
}

int
main (int argc, char *argv[])
{
    GDBusProxy *proxy = NULL;
    gchar *name = "org.gnome.Mutter.IdleMonitor";
    gchar *object_path = "/org/gnome/Mutter/IdleMonitor/Core";
    gchar *interface_name = "org.gnome.Mutter.IdleMonitor";
    /* Create a D-Bus proxy */
    proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
                                           G_DBUS_PROXY_FLAGS_NONE,
                                           NULL,
                                           name,
                                           object_path,
                                           interface_name,
                                           NULL, NULL);
    g_assert (proxy != NULL);

    print_user_idle_time (proxy);

    g_object_unref (proxy);

    return 0;
}

Но когда я запускаю его, я получаю ошибку GetIdletime failed: The name is not activable. Что случилось? Спасибо

1 Ответ

1 голос
/ 27 мая 2019

org.gnome.Mutter.IdleMonitor на шине сеанса, а не на системной шине;поэтому вам нужно использовать G_BUS_TYPE_SESSION.

...