Blame src/ibusbus.c

Packit Service 1d8f1c
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit Service 1d8f1c
/* vim:set et sts=4: */
Packit Service 1d8f1c
/* ibus - The Input Bus
Packit Service 1d8f1c
 * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2008-2016 Red Hat, Inc.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
 * modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
 * License as published by the Free Software Foundation; either
Packit Service 1d8f1c
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
 * Lesser General Public License for more details.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
 * License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
 * USA
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
Packit Service 1d8f1c
#include "ibusbus.h"
Packit Service 1d8f1c
#include <errno.h>
Packit Service 1d8f1c
#include <sys/types.h>
Packit Service 1d8f1c
#include <sys/stat.h>
Packit Service 1d8f1c
#include <unistd.h>
Packit Service 1d8f1c
#include <glib/gstdio.h>
Packit Service 1d8f1c
#include <gio/gio.h>
Packit Service 1d8f1c
#include "ibusmarshalers.h"
Packit Service 1d8f1c
#include "ibusinternal.h"
Packit Service 1d8f1c
#include "ibusshare.h"
Packit Service 1d8f1c
#include "ibusenginedesc.h"
Packit Service 1d8f1c
#include "ibusserializable.h"
Packit Service 1d8f1c
#include "ibusconfig.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
#define IBUS_BUS_GET_PRIVATE(o)  \
Packit Service 1d8f1c
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_BUS, IBusBusPrivate))
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    CONNECTED,
Packit Service 1d8f1c
    DISCONNECTED,
Packit Service 1d8f1c
    GLOBAL_ENGINE_CHANGED,
Packit Service 1d8f1c
    NAME_OWNER_CHANGED,
Packit Service 1d8f1c
    LAST_SIGNAL,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    PROP_0 = 0,
Packit Service 1d8f1c
    PROP_CONNECT_ASYNC,
Packit Service 1d8f1c
    PROP_CLIENT_ONLY,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
/* IBusBusPriv */
Packit Service 1d8f1c
struct _IBusBusPrivate {
Packit Service 1d8f1c
    GFileMonitor *monitor;
Packit Service 1d8f1c
    GDBusConnection *connection;
Packit Service 1d8f1c
    gboolean connected;
Packit Service 1d8f1c
    gboolean watch_dbus_signal;
Packit Service 1d8f1c
    guint watch_dbus_signal_id;
Packit Service 1d8f1c
    gboolean watch_ibus_signal;
Packit Service 1d8f1c
    guint watch_ibus_signal_id;
Packit Service 1d8f1c
    IBusConfig *config;
Packit Service 1d8f1c
    gchar *unique_name;
Packit Service 1d8f1c
    gboolean connect_async;
Packit Service 1d8f1c
    gchar *bus_address;
Packit Service 1d8f1c
    gboolean use_portal;
Packit Service 1d8f1c
    gboolean client_only;
Packit Service 1d8f1c
    GCancellable *cancellable;
Packit Service 1d8f1c
    guint portal_name_watch_id;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint    bus_signals[LAST_SIGNAL] = { 0 };
Packit Service 1d8f1c
Packit Service 1d8f1c
static IBusBus *_bus = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static GObject  *ibus_bus_constructor           (GType                   type,
Packit Service 1d8f1c
                                                 guint                   n_params,
Packit Service 1d8f1c
                                                 GObjectConstructParam  *params);
Packit Service 1d8f1c
static void      ibus_bus_destroy               (IBusObject             *object);
Packit Service 1d8f1c
static void      ibus_bus_connect_async         (IBusBus                *bus);
Packit Service 1d8f1c
static void      ibus_bus_watch_dbus_signal     (IBusBus                *bus);
Packit Service 1d8f1c
static void      ibus_bus_unwatch_dbus_signal   (IBusBus                *bus);
Packit Service 1d8f1c
static void      ibus_bus_watch_ibus_signal     (IBusBus                *bus);
Packit Service 1d8f1c
static void      ibus_bus_unwatch_ibus_signal   (IBusBus                *bus);
Packit Service 1d8f1c
static GVariant *ibus_bus_call_sync             (IBusBus                *bus,
Packit Service 1d8f1c
                                                 const gchar            *service,
Packit Service 1d8f1c
                                                 const gchar            *path,
Packit Service 1d8f1c
                                                 const gchar            *interface,
Packit Service 1d8f1c
                                                 const gchar            *member,
Packit Service 1d8f1c
                                                 GVariant               *parameters,
Packit Service 1d8f1c
                                                 const GVariantType     *reply_type);
Packit Service 1d8f1c
static void      ibus_bus_call_async             (IBusBus                *bus,
Packit Service 1d8f1c
                                                  const gchar            *service,
Packit Service 1d8f1c
                                                  const gchar            *path,
Packit Service 1d8f1c
                                                  const gchar            *interface,
Packit Service 1d8f1c
                                                  const gchar            *member,
Packit Service 1d8f1c
                                                  GVariant               *parameters,
Packit Service 1d8f1c
                                                  const GVariantType     *reply_type,
Packit Service 1d8f1c
                                                  gpointer                source_tag,
Packit Service 1d8f1c
                                                  gint                    timeout_msec,
Packit Service 1d8f1c
                                                  GCancellable           *cancellable,
Packit Service 1d8f1c
                                                  GAsyncReadyCallback     callback,
Packit Service 1d8f1c
                                                  gpointer                user_data);
Packit Service 1d8f1c
static void      ibus_bus_set_property           (IBusBus                *bus,
Packit Service 1d8f1c
                                                  guint                   prop_id,
Packit Service 1d8f1c
                                                  const GValue           *value,
Packit Service 1d8f1c
                                                  GParamSpec             *pspec);
Packit Service 1d8f1c
static void      ibus_bus_get_property           (IBusBus                *bus,
Packit Service 1d8f1c
                                                  guint                   prop_id,
Packit Service 1d8f1c
                                                  GValue                 *value,
Packit Service 1d8f1c
                                                  GParamSpec             *pspec);
Packit Service 1d8f1c
Packit Service 1d8f1c
static void     ibus_bus_close_connection        (IBusBus                *bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (IBusBus, ibus_bus, IBUS_TYPE_OBJECT)
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_class_init (IBusBusClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gobject_class->constructor = ibus_bus_constructor;
Packit Service 1d8f1c
    gobject_class->set_property =
Packit Service 1d8f1c
            (GObjectSetPropertyFunc) ibus_bus_set_property;
Packit Service 1d8f1c
    gobject_class->get_property =
Packit Service 1d8f1c
            (GObjectGetPropertyFunc) ibus_bus_get_property;
Packit Service 1d8f1c
    ibus_object_class->destroy = ibus_bus_destroy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install properties */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus:connect-async:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Whether the #IBusBus object should connect asynchronously to the bus.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (
Packit Service 1d8f1c
            gobject_class,
Packit Service 1d8f1c
            PROP_CONNECT_ASYNC,
Packit Service 1d8f1c
            g_param_spec_boolean ("connect-async",
Packit Service 1d8f1c
                                  "Connect Async",
Packit Service 1d8f1c
                                  "Connect asynchronously to the bus",
Packit Service 1d8f1c
                                  FALSE,
Packit Service 1d8f1c
                                  G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus:client-only:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Whether the #IBusBus object is for client use only.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (
Packit Service 1d8f1c
            gobject_class,
Packit Service 1d8f1c
            PROP_CLIENT_ONLY,
Packit Service 1d8f1c
            g_param_spec_boolean ("client-only",
Packit Service 1d8f1c
                                  "ClientOnly",
Packit Service 1d8f1c
                                  "Client use only",
Packit Service 1d8f1c
                                  FALSE,
Packit Service 1d8f1c
                                  G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install signals */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus::connected:
Packit Service 1d8f1c
     * @bus: The #IBusBus object which recevied the signal
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when #IBusBus is connected to ibus-daemon.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    bus_signals[CONNECTED] =
Packit Service 1d8f1c
        g_signal_new (I_("connected"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            0,
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus::disconnected:
Packit Service 1d8f1c
     * @bus: The #IBusBus object which recevied the signal
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when #IBusBus is disconnected from ibus-daemon.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    bus_signals[DISCONNECTED] =
Packit Service 1d8f1c
        g_signal_new (I_("disconnected"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            0,
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus::global-engine-changed:
Packit Service 1d8f1c
     * @bus: The #IBusBus object which recevied the signal
Packit Service 1d8f1c
     * @name: The name of the new global engine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when global engine is changed.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    bus_signals[GLOBAL_ENGINE_CHANGED] =
Packit Service 1d8f1c
        g_signal_new (I_("global-engine-changed"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            0,
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__STRING,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_STRING);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusBus::name-owner-changed:
Packit Service 1d8f1c
     * @bus: The #IBusBus object which recevied the signal
Packit Service 1d8f1c
     * @name: The name which ower is changed.
Packit Service 1d8f1c
     * @old_owner: The unique bus name of the old owner.
Packit Service 1d8f1c
     * @new_owner: The unique bus name of the new owner.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when D-Bus name owner is changed.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    bus_signals[NAME_OWNER_CHANGED] =
Packit Service 1d8f1c
        g_signal_new (I_("name-owner-changed"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            0,
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__STRING_STRING_STRING,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            3,
Packit Service 1d8f1c
            G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_type_class_add_private (class, sizeof (IBusBusPrivate));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_connection_dbus_signal_cb (GDBusConnection *connection,
Packit Service 1d8f1c
                            const gchar *sender_name,
Packit Service 1d8f1c
                            const gchar *object_path,
Packit Service 1d8f1c
                            const gchar *interface_name,
Packit Service 1d8f1c
                            const gchar *signal_name,
Packit Service 1d8f1c
                            GVariant *parameters,
Packit Service 1d8f1c
                            gpointer user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (user_data != NULL);
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (user_data));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "NameOwnerChanged") == 0) {
Packit Service 1d8f1c
        gchar *name = NULL;
Packit Service 1d8f1c
        gchar *old_owner = NULL;
Packit Service 1d8f1c
        gchar *new_owner = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
Packit Service 1d8f1c
        g_signal_emit (IBUS_BUS (user_data),
Packit Service 1d8f1c
                       bus_signals[NAME_OWNER_CHANGED], 0,
Packit Service 1d8f1c
                       name, old_owner, new_owner);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /* FIXME handle other D-Bus signals if needed */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_connection_ibus_signal_cb (GDBusConnection *connection,
Packit Service 1d8f1c
                            const gchar *sender_name,
Packit Service 1d8f1c
                            const gchar *object_path,
Packit Service 1d8f1c
                            const gchar *interface_name,
Packit Service 1d8f1c
                            const gchar *signal_name,
Packit Service 1d8f1c
                            GVariant *parameters,
Packit Service 1d8f1c
                            gpointer user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (user_data != NULL);
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (user_data));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "GlobalEngineChanged") == 0) {
Packit Service 1d8f1c
        gchar *engine_name = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(&s)", &engine_name);
Packit Service 1d8f1c
        g_signal_emit (IBUS_BUS (user_data),
Packit Service 1d8f1c
                       bus_signals[GLOBAL_ENGINE_CHANGED], 0,
Packit Service 1d8f1c
                       engine_name);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /* FIXME handle org.freedesktop.IBus.RegistryChanged signal if needed */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_connection_closed_cb (GDBusConnection  *connection,
Packit Service 1d8f1c
                       gboolean          remote_peer_vanished,
Packit Service 1d8f1c
                       GError           *error,
Packit Service 1d8f1c
                       IBusBus          *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (error) {
Packit Service 1d8f1c
        /* We replaced g_warning with g_debug here because
Packit Service 1d8f1c
         * currently when ibus-daemon restarts, GTK client calls this and
Packit Service 1d8f1c
         * _g_dbus_worker_do_read_cb() sets the error message:
Packit Service 1d8f1c
         * "Underlying GIOStream returned 0 bytes on an async read"
Packit Service 1d8f1c
         * http://git.gnome.org/browse/glib/tree/gio/gdbusprivate.c#n693
Packit Service 1d8f1c
         * However we think the error message is almost harmless. */
Packit Service 1d8f1c
        g_debug ("_connection_closed_cb: %s", error->message);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    ibus_bus_close_connection (bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_close_connection (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_free (bus->priv->unique_name);
Packit Service 1d8f1c
    bus->priv->unique_name = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal_id = 0;
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal_id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (bus->priv->bus_address);
Packit Service 1d8f1c
    bus->priv->bus_address = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Cancel ongoing connect request. */
Packit Service 1d8f1c
    g_cancellable_cancel (bus->priv->cancellable);
Packit Service 1d8f1c
    g_cancellable_reset (bus->priv->cancellable);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->connected = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* unref the old connection at first */
Packit Service 1d8f1c
    if (bus->priv->connection != NULL) {
Packit Service 1d8f1c
        g_signal_handlers_disconnect_by_func (bus->priv->connection,
Packit Service 1d8f1c
                                              G_CALLBACK (_connection_closed_cb),
Packit Service 1d8f1c
                                              bus);
Packit Service 1d8f1c
        if (!g_dbus_connection_is_closed(bus->priv->connection))
Packit Service 1d8f1c
            g_dbus_connection_close(bus->priv->connection, NULL, NULL, NULL);
Packit Service 1d8f1c
        g_object_unref (bus->priv->connection);
Packit Service 1d8f1c
        bus->priv->connection = NULL;
Packit Service 1d8f1c
        g_signal_emit (bus, bus_signals[DISCONNECTED], 0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_connect_completed (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (bus->priv->connection);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->connected = TRUE;
Packit Service 1d8f1c
    /* FIXME */
Packit Service 1d8f1c
    ibus_bus_hello (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_signal_connect (bus->priv->connection,
Packit Service 1d8f1c
                      "closed",
Packit Service 1d8f1c
                      (GCallback) _connection_closed_cb,
Packit Service 1d8f1c
                      bus);
Packit Service 1d8f1c
    if (bus->priv->watch_dbus_signal) {
Packit Service 1d8f1c
        ibus_bus_watch_dbus_signal (bus);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (bus->priv->watch_ibus_signal) {
Packit Service 1d8f1c
        ibus_bus_watch_ibus_signal (bus);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_signal_emit (bus, bus_signals[CONNECTED], 0);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_bus_connect_start_portal_cb (GObject      *source_object,
Packit Service 1d8f1c
                              GAsyncResult *res,
Packit Service 1d8f1c
                              gpointer      user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (user_data);
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    result = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
Packit Service 1d8f1c
                                            res,
Packit Service 1d8f1c
                                            &error);
Packit Service 1d8f1c
    if (result != NULL) {
Packit Service 1d8f1c
        ibus_bus_connect_completed (bus);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_dbus_connection_close (bus->priv->connection, NULL, NULL, NULL);
Packit Service 1d8f1c
        g_object_unref (bus->priv->connection);
Packit Service 1d8f1c
        bus->priv->connection = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_free (bus->priv->bus_address);
Packit Service 1d8f1c
        bus->priv->bus_address = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_object_unref (bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_bus_connect_async_cb (GObject      *source_object,
Packit Service 1d8f1c
                       GAsyncResult *res,
Packit Service 1d8f1c
                       gpointer      user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (user_data != NULL);
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (user_data));
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusBus *bus   = IBUS_BUS (user_data);
Packit Service 1d8f1c
    GError  *error = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->connection =
Packit Service 1d8f1c
                g_dbus_connection_new_for_address_finish (res, &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (error != NULL) {
Packit Service 1d8f1c
        g_warning ("Unable to connect to ibus: %s", error->message);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
        error = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->connection != NULL) {
Packit Service 1d8f1c
        if (bus->priv->use_portal) {
Packit Service 1d8f1c
            g_object_set_data (G_OBJECT (bus->priv->connection),
Packit Service 1d8f1c
                               "ibus-portal-connection",
Packit Service 1d8f1c
                               GINT_TO_POINTER (TRUE));
Packit Service 1d8f1c
            g_dbus_connection_call (
Packit Service 1d8f1c
                    bus->priv->connection,
Packit Service 1d8f1c
                    IBUS_SERVICE_PORTAL,
Packit Service 1d8f1c
                    IBUS_PATH_IBUS,
Packit Service 1d8f1c
                    "org.freedesktop.DBus.Peer",
Packit Service 1d8f1c
                    "Ping",
Packit Service 1d8f1c
                    g_variant_new ("()"),
Packit Service 1d8f1c
                    G_VARIANT_TYPE ("()"),
Packit Service 1d8f1c
                    G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                    -1,
Packit Service 1d8f1c
                    bus->priv->cancellable,
Packit Service 1d8f1c
                    (GAsyncReadyCallback) _bus_connect_start_portal_cb,
Packit Service 1d8f1c
                    g_object_ref (bus));
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            ibus_bus_connect_completed (bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_free (bus->priv->bus_address);
Packit Service 1d8f1c
        bus->priv->bus_address = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* unref the ref from ibus_bus_connect */
Packit Service 1d8f1c
    g_object_unref (bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gchar *
Packit Service 1d8f1c
ibus_bus_get_bus_address (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (_bus->priv->use_portal)
Packit Service 1d8f1c
        return g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, NULL, NULL);
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        return g_strdup (ibus_get_address ());
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_connect_async (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gchar *bus_address = ibus_bus_get_bus_address (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus_address == NULL)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (bus->priv->bus_address, bus_address) == 0) {
Packit Service 1d8f1c
        g_free (bus_address);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Close current connection and cancel ongoing connect request. */
Packit Service 1d8f1c
    ibus_bus_close_connection (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->bus_address = bus_address;
Packit Service 1d8f1c
    g_object_ref (bus);
Packit Service 1d8f1c
    g_dbus_connection_new_for_address (
Packit Service 1d8f1c
            bus_address,
Packit Service 1d8f1c
            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
Packit Service 1d8f1c
            G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
Packit Service 1d8f1c
            NULL,
Packit Service 1d8f1c
            bus->priv->cancellable,
Packit Service 1d8f1c
            _bus_connect_async_cb, bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
is_in_flatpak (void)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    static gboolean flatpak_info_read;
Packit Service 1d8f1c
    static gboolean in_flatpak;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (flatpak_info_read)
Packit Service 1d8f1c
        return in_flatpak;
Packit Service 1d8f1c
Packit Service 1d8f1c
    flatpak_info_read = TRUE;
Packit Service 1d8f1c
    if (g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS))
Packit Service 1d8f1c
        in_flatpak = TRUE;
Packit Service 1d8f1c
    return in_flatpak;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_bus_should_connect_portal (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return bus->priv->client_only &&
Packit Service 1d8f1c
        (is_in_flatpak () || g_getenv ("IBUS_USE_PORTAL") != NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_connect (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    const gchar *bus_address = ibus_get_address ();
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus_address == NULL)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (bus_address, bus->priv->bus_address) == 0 &&
Packit Service 1d8f1c
        bus->priv->connection != NULL)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Close current connection and cancel ongoing connect request. */
Packit Service 1d8f1c
    ibus_bus_close_connection (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->connection = g_dbus_connection_new_for_address_sync (
Packit Service 1d8f1c
            bus_address,
Packit Service 1d8f1c
            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
Packit Service 1d8f1c
            G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
Packit Service 1d8f1c
            NULL, NULL, NULL);
Packit Service 1d8f1c
    if (bus->priv->connection) {
Packit Service 1d8f1c
        bus->priv->bus_address = g_strdup (bus_address);
Packit Service 1d8f1c
        ibus_bus_connect_completed (bus);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_changed_cb (GFileMonitor       *monitor,
Packit Service 1d8f1c
             GFile              *file,
Packit Service 1d8f1c
             GFile              *other_file,
Packit Service 1d8f1c
             GFileMonitorEvent   event_type,
Packit Service 1d8f1c
             IBusBus            *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
Packit Service 1d8f1c
        event_type != G_FILE_MONITOR_EVENT_CREATED &&
Packit Service 1d8f1c
        event_type != G_FILE_MONITOR_EVENT_DELETED)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_connect_async (bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_init (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    struct stat buf;
Packit Service 1d8f1c
    gchar *path;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv = IBUS_BUS_GET_PRIVATE (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->config = NULL;
Packit Service 1d8f1c
    bus->priv->connection = NULL;
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal = FALSE;
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal_id = 0;
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal = FALSE;
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal_id = 0;
Packit Service 1d8f1c
    bus->priv->unique_name = NULL;
Packit Service 1d8f1c
    bus->priv->connect_async = FALSE;
Packit Service 1d8f1c
    bus->priv->client_only = FALSE;
Packit Service 1d8f1c
    bus->priv->bus_address = NULL;
Packit Service 1d8f1c
    bus->priv->cancellable = g_cancellable_new ();
Packit Service 1d8f1c
Packit Service 1d8f1c
    path = g_path_get_dirname (ibus_get_socket_path ());
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_mkdir_with_parents (path, 0700);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (stat (path, &buf) == 0) {
Packit Service 1d8f1c
        if (buf.st_uid != getuid ()) {
Packit Service 1d8f1c
            g_warning ("The owner of %s is not %s!",
Packit Service 1d8f1c
                       path, ibus_get_user_name ());
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (buf.st_mode != (S_IFDIR | S_IRWXU)) {
Packit Service 1d8f1c
            errno = 0;
Packit Service 1d8f1c
            if (g_chmod (path, 0700))
Packit Service 1d8f1c
                g_warning ("chmod failed: %s", errno ? g_strerror (errno) : "");
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (path);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_set_property (IBusBus      *bus,
Packit Service 1d8f1c
                       guint         prop_id,
Packit Service 1d8f1c
                       const GValue *value,
Packit Service 1d8f1c
                       GParamSpec   *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_CONNECT_ASYNC:
Packit Service 1d8f1c
        bus->priv->connect_async = g_value_get_boolean (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_CLIENT_ONLY:
Packit Service 1d8f1c
        bus->priv->client_only = g_value_get_boolean (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (bus, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_get_property (IBusBus    *bus,
Packit Service 1d8f1c
                       guint       prop_id,
Packit Service 1d8f1c
                       GValue     *value,
Packit Service 1d8f1c
                       GParamSpec *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_CONNECT_ASYNC:
Packit Service 1d8f1c
        g_value_set_boolean (value, bus->priv->connect_async);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    case PROP_CLIENT_ONLY:
Packit Service 1d8f1c
        g_value_set_boolean (value, bus->priv->client_only);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (bus, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
portal_name_appeared (GDBusConnection *connection,
Packit Service 1d8f1c
                      const gchar     *name,
Packit Service 1d8f1c
                      const gchar     *owner,
Packit Service 1d8f1c
                      gpointer         user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (user_data);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->connection == NULL)
Packit Service 1d8f1c
        ibus_bus_connect_async (bus);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
portal_name_vanished (GDBusConnection *connection,
Packit Service 1d8f1c
                      const gchar     *name,
Packit Service 1d8f1c
                      gpointer         user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (user_data);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->connection)
Packit Service 1d8f1c
        g_dbus_connection_close (bus->priv->connection, NULL, NULL, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
static GObject*
Packit Service 1d8f1c
ibus_bus_constructor (GType                  type,
Packit Service 1d8f1c
                      guint                  n_params,
Packit Service 1d8f1c
                      GObjectConstructParam *params)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObject *object;
Packit Service 1d8f1c
    GFile *file;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* share one IBusBus instance in whole application */
Packit Service 1d8f1c
    if (_bus == NULL) {
Packit Service 1d8f1c
        object = G_OBJECT_CLASS (ibus_bus_parent_class)->constructor (
Packit Service 1d8f1c
                type, n_params, params);
Packit Service 1d8f1c
        /* make bus object sink */
Packit Service 1d8f1c
        g_object_ref_sink (object);
Packit Service 1d8f1c
        _bus = IBUS_BUS (object);
Packit Service 1d8f1c
Packit Service 1d8f1c
        _bus->priv->use_portal = ibus_bus_should_connect_portal (_bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (!_bus->priv->use_portal) {
Packit Service 1d8f1c
            file = g_file_new_for_path (ibus_get_socket_path ());
Packit Service 1d8f1c
            _bus->priv->monitor = g_file_monitor_file (file, 0, NULL, NULL);
Packit Service 1d8f1c
            g_signal_connect (_bus->priv->monitor, "changed",
Packit Service 1d8f1c
                              (GCallback) _changed_cb, _bus);
Packit Service 1d8f1c
            g_object_unref (file);
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            _bus->priv->portal_name_watch_id =
Packit Service 1d8f1c
                g_bus_watch_name (G_BUS_TYPE_SESSION,
Packit Service 1d8f1c
                                  IBUS_SERVICE_PORTAL,
Packit Service 1d8f1c
                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
Packit Service 1d8f1c
                                  portal_name_appeared,
Packit Service 1d8f1c
                                  portal_name_vanished,
Packit Service 1d8f1c
                                  _bus, NULL);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (_bus->priv->connect_async)
Packit Service 1d8f1c
            ibus_bus_connect_async (_bus);
Packit Service 1d8f1c
        else
Packit Service 1d8f1c
            ibus_bus_connect (_bus);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        object = g_object_ref (G_OBJECT (_bus));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return object;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_destroy (IBusObject *object)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (_bus == (IBusBus *)object);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusBus * bus = _bus;
Packit Service 1d8f1c
    _bus = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->monitor) {
Packit Service 1d8f1c
        g_object_unref (bus->priv->monitor);
Packit Service 1d8f1c
        bus->priv->monitor = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->config) {
Packit Service 1d8f1c
        ibus_proxy_destroy ((IBusProxy *) bus->priv->config);
Packit Service 1d8f1c
        bus->priv->config = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->connection) {
Packit Service 1d8f1c
        g_signal_handlers_disconnect_by_func (bus->priv->connection,
Packit Service 1d8f1c
                                              G_CALLBACK (_connection_closed_cb),
Packit Service 1d8f1c
                                              bus);
Packit Service 1d8f1c
        /* FIXME should use async close function */
Packit Service 1d8f1c
        g_dbus_connection_close_sync (bus->priv->connection, NULL, NULL);
Packit Service 1d8f1c
        g_object_unref (bus->priv->connection);
Packit Service 1d8f1c
        bus->priv->connection = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (bus->priv->unique_name);
Packit Service 1d8f1c
    bus->priv->unique_name = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_free (bus->priv->bus_address);
Packit Service 1d8f1c
    bus->priv->bus_address = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_cancellable_cancel (bus->priv->cancellable);
Packit Service 1d8f1c
    g_object_unref (bus->priv->cancellable);
Packit Service 1d8f1c
    bus->priv->cancellable = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->portal_name_watch_id) {
Packit Service 1d8f1c
        g_bus_unwatch_name (bus->priv->portal_name_watch_id);
Packit Service 1d8f1c
        bus->priv->portal_name_watch_id = 0;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS (ibus_bus_parent_class)->destroy (object);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
_async_finish_void (GTask   *task,
Packit Service 1d8f1c
                    GError **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    /* g_task_propagate_error() is not a public API and 
Packit Service 1d8f1c
     * g_task_had_error() needs to be called before
Packit Service 1d8f1c
     * g_task_propagate_pointer() clears task->error.
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    gboolean had_error = g_task_had_error (task);
Packit Service 1d8f1c
    g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error)
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
    return TRUE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gchar *
Packit Service 1d8f1c
_async_finish_object_path (GTask   *task,
Packit Service 1d8f1c
                           GError **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean had_error = g_task_had_error (task);
Packit Service 1d8f1c
    GVariant *result = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
    gchar *path = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (result == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (result != NULL, NULL);
Packit Service 1d8f1c
    g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
    path = g_variant_dup_string (variant, NULL);
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
    g_variant_unref (result);
Packit Service 1d8f1c
    return path;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gchar *
Packit Service 1d8f1c
_async_finish_string (GTask   *task,
Packit Service 1d8f1c
                      GError **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean had_error = g_task_had_error (task);
Packit Service 1d8f1c
    GVariant *variant = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    gchar *s = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (variant == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (variant != NULL, NULL);
Packit Service 1d8f1c
    g_variant_get (variant, "(&s)", &s);
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
    return s;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
_async_finish_gboolean (GTask   *task,
Packit Service 1d8f1c
                        GError **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean had_error = g_task_had_error (task);
Packit Service 1d8f1c
    GVariant *variant = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (variant == NULL);
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (variant != NULL, FALSE);
Packit Service 1d8f1c
    g_variant_get (variant, "(b)", &retval);
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint
Packit Service 1d8f1c
_async_finish_guint (GTask   *task,
Packit Service 1d8f1c
                     GError **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean had_error = g_task_had_error (task);
Packit Service 1d8f1c
    GVariant *variant = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    static const guint bad_id = 0;
Packit Service 1d8f1c
    guint id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (variant == NULL);
Packit Service 1d8f1c
        return bad_id;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (variant != NULL, bad_id);
Packit Service 1d8f1c
    g_variant_get (variant, "(u)", &id;;
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
    return id;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusBus *
Packit Service 1d8f1c
ibus_bus_new (void)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS,
Packit Service 1d8f1c
                                           "connect-async", FALSE,
Packit Service 1d8f1c
                                           "client-only", FALSE,
Packit Service 1d8f1c
                                           NULL));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusBus *
Packit Service 1d8f1c
ibus_bus_new_async (void)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS,
Packit Service 1d8f1c
                                           "connect-async", TRUE,
Packit Service 1d8f1c
                                           "client-only", FALSE,
Packit Service 1d8f1c
                                           NULL));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusBus *
Packit Service 1d8f1c
ibus_bus_new_async_client (void)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS,
Packit Service 1d8f1c
                                           "connect-async", TRUE,
Packit Service 1d8f1c
                                           "client-only", TRUE,
Packit Service 1d8f1c
                                           NULL));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_is_connected (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->connection == NULL || g_dbus_connection_is_closed (bus->priv->connection))
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus->priv->connected;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusInputContext *
Packit Service 1d8f1c
ibus_bus_create_input_context (IBusBus      *bus,
Packit Service 1d8f1c
                               const gchar  *client_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (client_name != NULL, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *path;
Packit Service 1d8f1c
    IBusInputContext *context = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "CreateInputContext",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", client_name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(o)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result != NULL) {
Packit Service 1d8f1c
        GError *error = NULL;
Packit Service 1d8f1c
        g_variant_get (result, "(&o)", &path);
Packit Service 1d8f1c
        context = ibus_input_context_new (path, bus->priv->connection, NULL, &error);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        if (context == NULL) {
Packit Service 1d8f1c
            g_warning ("ibus_bus_create_input_context: %s", error->message);
Packit Service 1d8f1c
            g_error_free (error);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return context;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_create_input_context_async_step_two_done (GObject      *source_object,
Packit Service 1d8f1c
                                           GAsyncResult *res,
Packit Service 1d8f1c
                                           GTask        *task)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    IBusInputContext *context =
Packit Service 1d8f1c
            ibus_input_context_new_async_finish (res, &error);
Packit Service 1d8f1c
    if (context == NULL)
Packit Service 1d8f1c
        g_task_return_error (task, error);
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        g_task_return_pointer (task, context, NULL);
Packit Service 1d8f1c
    g_object_unref (task);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_create_input_context_async_step_one_done (GDBusConnection *connection,
Packit Service 1d8f1c
                                           GAsyncResult    *res,
Packit Service 1d8f1c
                                           GTask           *task)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    GVariant *variant = g_dbus_connection_call_finish (connection, res, &error);
Packit Service 1d8f1c
    const gchar *path = NULL;
Packit Service 1d8f1c
    IBusBus *bus;
Packit Service 1d8f1c
    GCancellable *cancellable;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (variant == NULL) {
Packit Service 1d8f1c
        g_task_return_error (task, error);
Packit Service 1d8f1c
        g_object_unref (task);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_dbus_connection_is_closed (connection)) {
Packit Service 1d8f1c
        /*
Packit Service 1d8f1c
         * The connection is closed, can not contine next steps, so complete
Packit Service 1d8f1c
         * the asynchronous request with error.
Packit Service 1d8f1c
         */
Packit Service 1d8f1c
        g_variant_unref(variant);
Packit Service 1d8f1c
        g_task_return_new_error (task,
Packit Service 1d8f1c
                G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Connection is closed.");
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (variant, "(&o)", &path);
Packit Service 1d8f1c
    g_variant_unref(variant);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus = (IBusBus *)g_task_get_source_object (task);
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    cancellable = g_task_get_cancellable (task);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_input_context_new_async (path,
Packit Service 1d8f1c
            bus->priv->connection,
Packit Service 1d8f1c
            cancellable,
Packit Service 1d8f1c
            (GAsyncReadyCallback)_create_input_context_async_step_two_done,
Packit Service 1d8f1c
            task);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_create_input_context_async (IBusBus            *bus,
Packit Service 1d8f1c
                                     const gchar        *client_name,
Packit Service 1d8f1c
                                     gint                timeout_msec,
Packit Service 1d8f1c
                                     GCancellable       *cancellable,
Packit Service 1d8f1c
                                     GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                     gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (client_name != NULL);
Packit Service 1d8f1c
    g_return_if_fail (callback != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = g_task_new (bus, cancellable, callback, user_data);
Packit Service 1d8f1c
    g_task_set_source_tag (task, ibus_bus_create_input_context_async);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* do not use ibus_bus_call_async, instread use g_dbus_connection_call
Packit Service 1d8f1c
     * directly, because we need two async steps for create an IBusInputContext.
Packit Service 1d8f1c
     * 1. Call CreateInputContext to request ibus-daemon create a remote IC.
Packit Service 1d8f1c
     * 2. New local IBusInputContext proxy of the remote IC
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_dbus_connection_call (bus->priv->connection,
Packit Service 1d8f1c
            ibus_bus_get_service_name (bus),
Packit Service 1d8f1c
            IBUS_PATH_IBUS,
Packit Service 1d8f1c
            bus->priv->use_portal ? IBUS_INTERFACE_PORTAL : IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
            "CreateInputContext",
Packit Service 1d8f1c
            g_variant_new ("(s)", client_name),
Packit Service 1d8f1c
            G_VARIANT_TYPE("(o)"),
Packit Service 1d8f1c
            G_DBUS_CALL_FLAGS_NO_AUTO_START,
Packit Service 1d8f1c
            timeout_msec,
Packit Service 1d8f1c
            cancellable,
Packit Service 1d8f1c
            (GAsyncReadyCallback)_create_input_context_async_step_one_done,
Packit Service 1d8f1c
            task);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusInputContext *
Packit Service 1d8f1c
ibus_bus_create_input_context_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                            GAsyncResult *res,
Packit Service 1d8f1c
                                            GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    gboolean had_error;
Packit Service 1d8f1c
    IBusInputContext *context = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) == 
Packit Service 1d8f1c
                      ibus_bus_create_input_context_async);
Packit Service 1d8f1c
    had_error = g_task_had_error (task);
Packit Service 1d8f1c
    context = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (context == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_assert (IBUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    return context;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gchar *
Packit Service 1d8f1c
ibus_bus_current_input_context (IBusBus      *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *path = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Get",
Packit Service 1d8f1c
                                 g_variant_new ("(ss)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                "CurrentInputContext"),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(v)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result != NULL) {
Packit Service 1d8f1c
        GVariant *variant = NULL;
Packit Service 1d8f1c
        g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
        path = g_variant_dup_string (variant, NULL);
Packit Service 1d8f1c
        g_variant_unref (variant);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return path;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_current_input_context_async (IBusBus            *bus,
Packit Service 1d8f1c
                                      gint                timeout_msec,
Packit Service 1d8f1c
                                      GCancellable       *cancellable,
Packit Service 1d8f1c
                                      GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                      gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Get",
Packit Service 1d8f1c
                         g_variant_new ("(ss)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        "CurrentInputContext"),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(v)"),
Packit Service 1d8f1c
                         ibus_bus_current_input_context_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gchar *
Packit Service 1d8f1c
ibus_bus_current_input_context_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                             GAsyncResult *res,
Packit Service 1d8f1c
                                             GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) ==
Packit Service 1d8f1c
                     ibus_bus_current_input_context_async);
Packit Service 1d8f1c
    return _async_finish_object_path (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_watch_dbus_signal (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->connection != NULL);
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->watch_dbus_signal_id == 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Subscribe to dbus signals such as NameOwnerChanged. */
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal_id
Packit Service 1d8f1c
        = g_dbus_connection_signal_subscribe (bus->priv->connection,
Packit Service 1d8f1c
                                              DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                              DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                              "NameOwnerChanged",
Packit Service 1d8f1c
                                              DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                              NULL /* arg0 */,
Packit Service 1d8f1c
                                              (GDBusSignalFlags) 0,
Packit Service 1d8f1c
                                              _connection_dbus_signal_cb,
Packit Service 1d8f1c
                                              bus,
Packit Service 1d8f1c
                                              NULL /* user_data_free_func */);
Packit Service 1d8f1c
    /* FIXME handle other D-Bus signals if needed */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_unwatch_dbus_signal (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->watch_dbus_signal_id != 0);
Packit Service 1d8f1c
    g_dbus_connection_signal_unsubscribe (bus->priv->connection,
Packit Service 1d8f1c
                                          bus->priv->watch_dbus_signal_id);
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal_id = 0;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_set_watch_dbus_signal (IBusBus        *bus,
Packit Service 1d8f1c
                                gboolean        watch)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->watch_dbus_signal == watch)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->watch_dbus_signal = watch;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (ibus_bus_is_connected (bus)) {
Packit Service 1d8f1c
        if (watch) {
Packit Service 1d8f1c
            ibus_bus_watch_dbus_signal (bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        else {
Packit Service 1d8f1c
            ibus_bus_unwatch_dbus_signal (bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_watch_ibus_signal (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->connection != NULL);
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->watch_ibus_signal_id == 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Subscribe to ibus signals such as GlboalEngineChanged. */
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal_id
Packit Service 1d8f1c
        = g_dbus_connection_signal_subscribe (bus->priv->connection,
Packit Service 1d8f1c
                                              "org.freedesktop.IBus",
Packit Service 1d8f1c
                                              IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                              "GlobalEngineChanged",
Packit Service 1d8f1c
                                              IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                              NULL /* arg0 */,
Packit Service 1d8f1c
                                              (GDBusSignalFlags) 0,
Packit Service 1d8f1c
                                              _connection_ibus_signal_cb,
Packit Service 1d8f1c
                                              bus,
Packit Service 1d8f1c
                                              NULL /* user_data_free_func */);
Packit Service 1d8f1c
    /* FIXME handle org.freedesktop.IBus.RegistryChanged signal if needed */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_unwatch_ibus_signal (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (bus->priv->watch_ibus_signal_id != 0);
Packit Service 1d8f1c
    g_dbus_connection_signal_unsubscribe (bus->priv->connection,
Packit Service 1d8f1c
                                          bus->priv->watch_ibus_signal_id);
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal_id = 0;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_set_watch_ibus_signal (IBusBus        *bus,
Packit Service 1d8f1c
                                gboolean        watch)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->watch_ibus_signal == watch)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus->priv->watch_ibus_signal = watch;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (ibus_bus_is_connected (bus)) {
Packit Service 1d8f1c
        if (watch) {
Packit Service 1d8f1c
            ibus_bus_watch_ibus_signal (bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        else {
Packit Service 1d8f1c
            ibus_bus_unwatch_ibus_signal (bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
const gchar *
Packit Service 1d8f1c
ibus_bus_hello (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* gdbus connection will say hello by self. */
Packit Service 1d8f1c
    if (bus->priv->connection)
Packit Service 1d8f1c
        return g_dbus_connection_get_unique_name (bus->priv->connection);
Packit Service 1d8f1c
    return NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
guint32
Packit Service 1d8f1c
ibus_bus_request_name (IBusBus      *bus,
Packit Service 1d8f1c
                       const gchar  *name,
Packit Service 1d8f1c
                       guint32       flags)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), 0);
Packit Service 1d8f1c
    g_return_val_if_fail (name != NULL, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    guint32 retval = 0;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "RequestName",
Packit Service 1d8f1c
                                 g_variant_new ("(su)", name, flags),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(u)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(u)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_request_name_async (IBusBus            *bus,
Packit Service 1d8f1c
                             const gchar        *name,
Packit Service 1d8f1c
                             guint               flags,
Packit Service 1d8f1c
                             gint                timeout_msec,
Packit Service 1d8f1c
                             GCancellable       *cancellable,
Packit Service 1d8f1c
                             GAsyncReadyCallback callback,
Packit Service 1d8f1c
                             gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "RequestName",
Packit Service 1d8f1c
                         g_variant_new ("(su)", name, flags),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(u)"),
Packit Service 1d8f1c
                         ibus_bus_request_name_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
guint
Packit Service 1d8f1c
ibus_bus_request_name_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                    GAsyncResult *res,
Packit Service 1d8f1c
                                    GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_request_name_async);
Packit Service 1d8f1c
    return _async_finish_guint (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
guint
Packit Service 1d8f1c
ibus_bus_release_name (IBusBus      *bus,
Packit Service 1d8f1c
                       const gchar  *name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), 0);
Packit Service 1d8f1c
    g_return_val_if_fail (name != NULL, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    guint retval = 0;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "ReleaseName",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(u)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(u)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_release_name_async (IBusBus            *bus,
Packit Service 1d8f1c
                             const gchar        *name,
Packit Service 1d8f1c
                             gint                timeout_msec,
Packit Service 1d8f1c
                             GCancellable       *cancellable,
Packit Service 1d8f1c
                             GAsyncReadyCallback callback,
Packit Service 1d8f1c
                             gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "ReleaseName",
Packit Service 1d8f1c
                         g_variant_new ("(s)", name),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(u)"),
Packit Service 1d8f1c
                         ibus_bus_release_name_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
guint
Packit Service 1d8f1c
ibus_bus_release_name_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                    GAsyncResult *res,
Packit Service 1d8f1c
                                    GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_release_name_async);
Packit Service 1d8f1c
    return _async_finish_guint (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_queued_owners (IBusBus      *bus,
Packit Service 1d8f1c
                             const gchar  *name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GList *retval = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (name != NULL, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "ListQueuedOwners",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(as)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        GVariantIter *iter = NULL;
Packit Service 1d8f1c
        const gchar *name = NULL;
Packit Service 1d8f1c
        g_variant_get (result, "(as)", &iter);
Packit Service 1d8f1c
        while (g_variant_iter_loop (iter, "&s", &name)) {
Packit Service 1d8f1c
            if (name == NULL) {
Packit Service 1d8f1c
                continue;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            retval = g_list_append (retval, g_strdup (name));
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_variant_iter_free (iter);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_name_has_owner (IBusBus        *bus,
Packit Service 1d8f1c
                         const gchar    *name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (name != NULL, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "NameHasOwner",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(b)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(b)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_name_has_owner_async (IBusBus            *bus,
Packit Service 1d8f1c
                               const gchar        *name,
Packit Service 1d8f1c
                               gint                timeout_msec,
Packit Service 1d8f1c
                               GCancellable       *cancellable,
Packit Service 1d8f1c
                               GAsyncReadyCallback callback,
Packit Service 1d8f1c
                               gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "NameHasOwner",
Packit Service 1d8f1c
                         g_variant_new ("(s)", name),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(b)"),
Packit Service 1d8f1c
                         ibus_bus_name_has_owner_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_name_has_owner_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                      GAsyncResult *res,
Packit Service 1d8f1c
                                      GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_name_has_owner_async);
Packit Service 1d8f1c
    return _async_finish_gboolean (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_names (IBusBus    *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    return NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_add_match (IBusBus     *bus,
Packit Service 1d8f1c
                    const gchar *rule)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (rule != NULL, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "AddMatch",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", rule),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_add_match_async (IBusBus            *bus,
Packit Service 1d8f1c
                          const gchar        *rule,
Packit Service 1d8f1c
                          gint                timeout_msec,
Packit Service 1d8f1c
                          GCancellable       *cancellable,
Packit Service 1d8f1c
                          GAsyncReadyCallback callback,
Packit Service 1d8f1c
                          gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (rule != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "AddMatch",
Packit Service 1d8f1c
                         g_variant_new ("(s)", rule),
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         ibus_bus_add_match_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_add_match_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                 GAsyncResult *res,
Packit Service 1d8f1c
                                 GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_add_match_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_remove_match (IBusBus      *bus,
Packit Service 1d8f1c
                       const gchar  *rule)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (rule != NULL, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "RemoveMatch",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", rule),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_remove_match_async (IBusBus            *bus,
Packit Service 1d8f1c
                             const gchar        *rule,
Packit Service 1d8f1c
                             gint                timeout_msec,
Packit Service 1d8f1c
                             GCancellable       *cancellable,
Packit Service 1d8f1c
                             GAsyncReadyCallback callback,
Packit Service 1d8f1c
                             gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (rule != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "RemoveMatch",
Packit Service 1d8f1c
                         g_variant_new ("(s)", rule),
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         ibus_bus_remove_match_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_remove_match_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                    GAsyncResult *res,
Packit Service 1d8f1c
                                    GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_remove_match_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gchar *
Packit Service 1d8f1c
ibus_bus_get_name_owner (IBusBus        *bus,
Packit Service 1d8f1c
                         const gchar    *name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (name != NULL, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *retval = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                                 DBUS_PATH_DBUS,
Packit Service 1d8f1c
                                 DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                                 "GetNameOwner",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(s)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(s)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_get_name_owner_async (IBusBus            *bus,
Packit Service 1d8f1c
                               const gchar        *name,
Packit Service 1d8f1c
                               gint                timeout_msec,
Packit Service 1d8f1c
                               GCancellable       *cancellable,
Packit Service 1d8f1c
                               GAsyncReadyCallback callback,
Packit Service 1d8f1c
                               gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         DBUS_SERVICE_DBUS,
Packit Service 1d8f1c
                         DBUS_PATH_DBUS,
Packit Service 1d8f1c
                         DBUS_INTERFACE_DBUS,
Packit Service 1d8f1c
                         "GetNameOwner",
Packit Service 1d8f1c
                         g_variant_new ("(s)", name),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(s)"),
Packit Service 1d8f1c
                         ibus_bus_get_name_owner_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gchar *
Packit Service 1d8f1c
ibus_bus_get_name_owner_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                      GAsyncResult *res,
Packit Service 1d8f1c
                                      GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_get_name_owner_async);
Packit Service 1d8f1c
    return g_strdup (_async_finish_string (task, error));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GDBusConnection *
Packit Service 1d8f1c
ibus_bus_get_connection (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus->priv->connection;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
const gchar *
Packit Service 1d8f1c
ibus_bus_get_service_name (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (bus->priv->use_portal)
Packit Service 1d8f1c
        return IBUS_SERVICE_PORTAL;
Packit Service 1d8f1c
    return IBUS_SERVICE_IBUS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_exit (IBusBus *bus,
Packit Service 1d8f1c
               gboolean restart)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "Exit",
Packit Service 1d8f1c
                                 g_variant_new ("(b)", restart),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_close_connection (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_exit_async (IBusBus            *bus,
Packit Service 1d8f1c
                     gboolean            restart,
Packit Service 1d8f1c
                     gint                timeout_msec,
Packit Service 1d8f1c
                     GCancellable       *cancellable,
Packit Service 1d8f1c
                     GAsyncReadyCallback callback,
Packit Service 1d8f1c
                     gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "Exit",
Packit Service 1d8f1c
                         g_variant_new ("(b)", restart),
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         ibus_bus_exit_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_exit_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                            GAsyncResult *res,
Packit Service 1d8f1c
                            GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) == ibus_bus_exit_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_register_component (IBusBus       *bus,
Packit Service 1d8f1c
                             IBusComponent *component)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_COMPONENT (component), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)component);
Packit Service 1d8f1c
    GVariant *result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                           IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                           IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                           IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                           "RegisterComponent",
Packit Service 1d8f1c
                                           g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                                           NULL);
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_register_component_async (IBusBus            *bus,
Packit Service 1d8f1c
                                   IBusComponent      *component,
Packit Service 1d8f1c
                                   gint                timeout_msec,
Packit Service 1d8f1c
                                   GCancellable       *cancellable,
Packit Service 1d8f1c
                                   GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                   gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_COMPONENT (component));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)component);
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "RegisterComponent",
Packit Service 1d8f1c
                         g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         ibus_bus_register_component_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_register_component_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                          GAsyncResult *res,
Packit Service 1d8f1c
                                          GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (
Packit Service 1d8f1c
            g_task_get_source_tag (task) == ibus_bus_register_component_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static GList *
Packit Service 1d8f1c
ibus_bus_do_list_engines (IBusBus *bus, gboolean active_engines_only)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GList *retval = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    const gchar *property =
Packit Service 1d8f1c
            active_engines_only ? "ActiveEngines" : "Engines";
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Get",
Packit Service 1d8f1c
                                 g_variant_new ("(ss)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                property),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(v)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        GVariant *variant = NULL;
Packit Service 1d8f1c
        GVariantIter *iter = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
        iter = g_variant_iter_new (variant);
Packit Service 1d8f1c
        GVariant *var;
Packit Service 1d8f1c
        while (g_variant_iter_loop (iter, "v", &var)) {
Packit Service 1d8f1c
            IBusSerializable *serializable = ibus_serializable_deserialize (var);
Packit Service 1d8f1c
            g_object_ref_sink (serializable);
Packit Service 1d8f1c
            retval = g_list_append (retval, serializable);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_variant_iter_free (iter);
Packit Service 1d8f1c
        g_variant_unref (variant);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_engines (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return ibus_bus_do_list_engines (bus, FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_list_engines_async (IBusBus            *bus,
Packit Service 1d8f1c
                             gint                timeout_msec,
Packit Service 1d8f1c
                             GCancellable       *cancellable,
Packit Service 1d8f1c
                             GAsyncReadyCallback callback,
Packit Service 1d8f1c
                             gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Get",
Packit Service 1d8f1c
                         g_variant_new ("(ss)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        "Engines"),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(v)"),
Packit Service 1d8f1c
                         ibus_bus_list_engines_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_engines_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                    GAsyncResult *res,
Packit Service 1d8f1c
                                    GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    gboolean had_error;
Packit Service 1d8f1c
    GVariant *result = NULL;
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
    GList *retval = NULL;
Packit Service 1d8f1c
    GVariantIter *iter = NULL;
Packit Service 1d8f1c
    GVariant *var;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    had_error = g_task_had_error (task);
Packit Service 1d8f1c
    result = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (result == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (result != NULL, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
    iter = g_variant_iter_new (variant);
Packit Service 1d8f1c
    while (g_variant_iter_loop (iter, "v", &var)) {
Packit Service 1d8f1c
        IBusSerializable *serializable = ibus_serializable_deserialize (var);
Packit Service 1d8f1c
        g_object_ref_sink (serializable);
Packit Service 1d8f1c
        retval = g_list_append (retval, serializable);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_variant_iter_free (iter);
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
    g_variant_unref (result);
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#ifndef IBUS_DISABLE_DEPRECATED
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_active_engines (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return ibus_bus_do_list_engines (bus, TRUE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_list_active_engines_async (IBusBus            *bus,
Packit Service 1d8f1c
                                    gint                timeout_msec,
Packit Service 1d8f1c
                                    GCancellable       *cancellable,
Packit Service 1d8f1c
                                    GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                    gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Get",
Packit Service 1d8f1c
                         g_variant_new ("(ss)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        "ActiveEngines"),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(v)"),
Packit Service 1d8f1c
                         ibus_bus_list_active_engines_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GList *
Packit Service 1d8f1c
ibus_bus_list_active_engines_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                           GAsyncResult *res,
Packit Service 1d8f1c
                                           GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return ibus_bus_list_engines_async_finish (bus, res, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
#endif /* IBUS_DISABLE_DEPRECATED */
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngineDesc **
Packit Service 1d8f1c
ibus_bus_get_engines_by_names (IBusBus             *bus,
Packit Service 1d8f1c
                               const gchar * const *names)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "GetEnginesByNames",
Packit Service 1d8f1c
                                 g_variant_new("(^as)", names),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(av)"));
Packit Service 1d8f1c
    if (result == NULL)
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GArray *array = g_array_new (TRUE, TRUE, sizeof (IBusEngineDesc *));
Packit Service 1d8f1c
    GVariantIter *iter = NULL;
Packit Service 1d8f1c
    g_variant_get (result, "(av)", &iter);
Packit Service 1d8f1c
    GVariant *var;
Packit Service 1d8f1c
    while (g_variant_iter_loop (iter, "v", &var)) {
Packit Service 1d8f1c
        IBusEngineDesc *desc = (IBusEngineDesc *) ibus_serializable_deserialize (var);
Packit Service 1d8f1c
        g_object_ref_sink (desc);
Packit Service 1d8f1c
        g_array_append_val (array, desc);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_variant_iter_free (iter);
Packit Service 1d8f1c
    g_variant_unref (result);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return (IBusEngineDesc **)g_array_free (array, FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_config_destroy_cb (IBusConfig *config,
Packit Service 1d8f1c
                    IBusBus    *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusBusPrivate *priv;
Packit Service 1d8f1c
    priv = IBUS_BUS_GET_PRIVATE (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (priv->config == config);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_object_unref (config);
Packit Service 1d8f1c
    priv->config = NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusConfig *
Packit Service 1d8f1c
ibus_bus_get_config (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusBusPrivate *priv;
Packit Service 1d8f1c
    priv = IBUS_BUS_GET_PRIVATE (bus);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (priv->config == NULL && priv->connection) {
Packit Service 1d8f1c
        priv->config = ibus_config_new (priv->connection, NULL, NULL);
Packit Service 1d8f1c
        if (priv->config) {
Packit Service 1d8f1c
            g_signal_connect (priv->config, "destroy", G_CALLBACK (_config_destroy_cb), bus);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return priv->config;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#ifndef IBUS_DISABLE_DEPRECATED
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_get_use_sys_layout (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "GetUseSysLayout",
Packit Service 1d8f1c
                                 NULL,
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(b)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(b)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_get_use_sys_layout_async (IBusBus            *bus,
Packit Service 1d8f1c
                                   gint                timeout_msec,
Packit Service 1d8f1c
                                   GCancellable       *cancellable,
Packit Service 1d8f1c
                                   GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                   gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "GetUseSysLayout",
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(b)"),
Packit Service 1d8f1c
                         ibus_bus_get_use_sys_layout_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_get_use_sys_layout_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                          GAsyncResult *res,
Packit Service 1d8f1c
                                          GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) == ibus_bus_get_use_sys_layout_async);
Packit Service 1d8f1c
    return _async_finish_gboolean (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_get_use_global_engine (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "GetUseGlobalEngine",
Packit Service 1d8f1c
                                 NULL,
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(b)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(b)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_get_use_global_engine_async (IBusBus            *bus,
Packit Service 1d8f1c
                                      gint                timeout_msec,
Packit Service 1d8f1c
                                      GCancellable       *cancellable,
Packit Service 1d8f1c
                                      GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                      gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "GetUseGlobalEngine",
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(b)"),
Packit Service 1d8f1c
                         ibus_bus_get_use_global_engine_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_get_use_global_engine_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                             GAsyncResult *res,
Packit Service 1d8f1c
                                             GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) ==
Packit Service 1d8f1c
                     ibus_bus_get_use_global_engine_async);
Packit Service 1d8f1c
    return _async_finish_gboolean (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_is_global_engine_enabled (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "IsGlobalEngineEnabled",
Packit Service 1d8f1c
                                 NULL,
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(b)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(b)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void ibus_bus_is_global_engine_enabled_async (IBusBus            *bus,
Packit Service 1d8f1c
                                              gint                timeout_msec,
Packit Service 1d8f1c
                                              GCancellable       *cancellable,
Packit Service 1d8f1c
                                              GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                              gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "IsGlobalEngineEnabled",
Packit Service 1d8f1c
                         NULL,
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(b)"),
Packit Service 1d8f1c
                         ibus_bus_is_global_engine_enabled_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean ibus_bus_is_global_engine_enabled_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                                         GAsyncResult *res,
Packit Service 1d8f1c
                                                         GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert(g_task_get_source_tag (task) ==
Packit Service 1d8f1c
                     ibus_bus_is_global_engine_enabled_async);
Packit Service 1d8f1c
    return _async_finish_gboolean (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
#endif /* IBUS_DISABLE_DEPRECATED */
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngineDesc *
Packit Service 1d8f1c
ibus_bus_get_global_engine (IBusBus *bus)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    IBusEngineDesc *engine = NULL;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Get",
Packit Service 1d8f1c
                                 g_variant_new ("(ss)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                "GlobalEngine"),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(v)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        GVariant *variant = NULL;
Packit Service 1d8f1c
        g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
        if (variant) {
Packit Service 1d8f1c
            GVariant *obj = g_variant_get_variant (variant);
Packit Service 1d8f1c
            engine = IBUS_ENGINE_DESC (ibus_serializable_deserialize (obj));
Packit Service 1d8f1c
            g_variant_unref (obj);
Packit Service 1d8f1c
            g_variant_unref (variant);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return engine;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_get_global_engine_async (IBusBus            *bus,
Packit Service 1d8f1c
                                  gint                timeout_msec,
Packit Service 1d8f1c
                                  GCancellable       *cancellable,
Packit Service 1d8f1c
                                  GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                  gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Get",
Packit Service 1d8f1c
                         g_variant_new ("(ss)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        "GlobalEngine"),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(v)"),
Packit Service 1d8f1c
                         ibus_bus_get_global_engine_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngineDesc *
Packit Service 1d8f1c
ibus_bus_get_global_engine_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                         GAsyncResult *res,
Packit Service 1d8f1c
                                         GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    gboolean had_error;
Packit Service 1d8f1c
    GVariant *result = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    had_error = g_task_had_error (task);
Packit Service 1d8f1c
    result = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (result == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (result != NULL, NULL);
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
    g_variant_get (result, "(v)", &variant);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusEngineDesc *engine = NULL;
Packit Service 1d8f1c
    if (variant) {
Packit Service 1d8f1c
        GVariant *obj = g_variant_get_variant (variant);
Packit Service 1d8f1c
        engine = IBUS_ENGINE_DESC (ibus_serializable_deserialize (obj));
Packit Service 1d8f1c
        g_variant_unref (obj);
Packit Service 1d8f1c
        g_variant_unref (variant);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_variant_unref (result);
Packit Service 1d8f1c
    return engine;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_set_global_engine (IBusBus     *bus,
Packit Service 1d8f1c
                            const gchar *global_engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (global_engine != NULL, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                 "SetGlobalEngine",
Packit Service 1d8f1c
                                 g_variant_new ("(s)", global_engine),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_set_global_engine_async (IBusBus            *bus,
Packit Service 1d8f1c
                                  const gchar        *global_engine,
Packit Service 1d8f1c
                                  gint                timeout_msec,
Packit Service 1d8f1c
                                  GCancellable       *cancellable,
Packit Service 1d8f1c
                                  GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                  gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (global_engine != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                         "SetGlobalEngine",
Packit Service 1d8f1c
                         g_variant_new ("(s)", global_engine),
Packit Service 1d8f1c
                         NULL, /* no return value */
Packit Service 1d8f1c
                         ibus_bus_set_global_engine_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_set_global_engine_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                         GAsyncResult *res,
Packit Service 1d8f1c
                                         GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) == ibus_bus_set_global_engine_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_preload_engines (IBusBus             *bus,
Packit Service 1d8f1c
                          const gchar * const *names)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
Packit Service 1d8f1c
    g_return_val_if_fail (names != NULL && names[0] != NULL, FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    variant = g_variant_new_strv(names, -1);
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Set",
Packit Service 1d8f1c
                                 g_variant_new ("(ssv)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                "PreloadEngines",
Packit Service 1d8f1c
                                                variant),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_preload_engines_async (IBusBus             *bus,
Packit Service 1d8f1c
                                const gchar * const *names,
Packit Service 1d8f1c
                                gint                 timeout_msec,
Packit Service 1d8f1c
                                GCancellable        *cancellable,
Packit Service 1d8f1c
                                GAsyncReadyCallback  callback,
Packit Service 1d8f1c
                                gpointer             user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (names != NULL && names[0] != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    variant = g_variant_new_strv(names, -1);
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Set",
Packit Service 1d8f1c
                         g_variant_new ("(ssv)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        "PreloadEngines",
Packit Service 1d8f1c
                                        variant),
Packit Service 1d8f1c
                         NULL, /* no return value */
Packit Service 1d8f1c
                         ibus_bus_preload_engines_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_preload_engines_async_finish (IBusBus       *bus,
Packit Service 1d8f1c
                                       GAsyncResult  *res,
Packit Service 1d8f1c
                                       GError       **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) == ibus_bus_preload_engines_async);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GVariant *
Packit Service 1d8f1c
ibus_bus_get_ibus_property (IBusBus     *bus,
Packit Service 1d8f1c
                            const gchar *property_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    GVariant *retval = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (property_name != NULL, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Get",
Packit Service 1d8f1c
                                 g_variant_new ("(ss)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                property_name),
Packit Service 1d8f1c
                                 G_VARIANT_TYPE ("(v)"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_get (result, "(v)", &retval);
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_get_ibus_property_async (IBusBus            *bus,
Packit Service 1d8f1c
                                  const gchar        *property_name,
Packit Service 1d8f1c
                                  gint                timeout_msec,
Packit Service 1d8f1c
                                  GCancellable       *cancellable,
Packit Service 1d8f1c
                                  GAsyncReadyCallback callback,
Packit Service 1d8f1c
                                  gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (property_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Get",
Packit Service 1d8f1c
                         g_variant_new ("(ss)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        property_name),
Packit Service 1d8f1c
                         G_VARIANT_TYPE ("(v)"),
Packit Service 1d8f1c
                         ibus_bus_get_ibus_property_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
GVariant *
Packit Service 1d8f1c
ibus_bus_get_ibus_property_async_finish (IBusBus      *bus,
Packit Service 1d8f1c
                                         GAsyncResult *res,
Packit Service 1d8f1c
                                         GError      **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    gboolean had_error;
Packit Service 1d8f1c
    GVariant *result = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    had_error = g_task_had_error (task);
Packit Service 1d8f1c
    result = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (result == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_return_val_if_fail (result != NULL, NULL);
Packit Service 1d8f1c
    GVariant *retval = NULL;
Packit Service 1d8f1c
    g_variant_get (result, "(v)", &retval);
Packit Service 1d8f1c
    g_variant_unref (result);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_set_ibus_property (IBusBus     *bus,
Packit Service 1d8f1c
                            const gchar *property_name,
Packit Service 1d8f1c
                            GVariant    *value)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (property_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    result = ibus_bus_call_sync (bus,
Packit Service 1d8f1c
                                 IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                                 IBUS_PATH_IBUS,
Packit Service 1d8f1c
                                 "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                 "Set",
Packit Service 1d8f1c
                                 g_variant_new ("(ssv)",
Packit Service 1d8f1c
                                                IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                                property_name,
Packit Service 1d8f1c
                                                value),
Packit Service 1d8f1c
                                 NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result) {
Packit Service 1d8f1c
        g_variant_unref (result);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_bus_set_ibus_property_async (IBusBus             *bus,
Packit Service 1d8f1c
                                  const gchar         *property_name,
Packit Service 1d8f1c
                                  GVariant            *value,
Packit Service 1d8f1c
                                  gint                 timeout_msec,
Packit Service 1d8f1c
                                  GCancellable        *cancellable,
Packit Service 1d8f1c
                                  GAsyncReadyCallback  callback,
Packit Service 1d8f1c
                                  gpointer             user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_return_if_fail (property_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_bus_call_async (bus,
Packit Service 1d8f1c
                         IBUS_SERVICE_IBUS,
Packit Service 1d8f1c
                         IBUS_PATH_IBUS,
Packit Service 1d8f1c
                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                         "Set",
Packit Service 1d8f1c
                         g_variant_new ("(ssv)",
Packit Service 1d8f1c
                                        IBUS_INTERFACE_IBUS,
Packit Service 1d8f1c
                                        property_name,
Packit Service 1d8f1c
                                        value),
Packit Service 1d8f1c
                         NULL, /* no return value */
Packit Service 1d8f1c
                         ibus_bus_set_ibus_property_async,
Packit Service 1d8f1c
                         timeout_msec,
Packit Service 1d8f1c
                         cancellable,
Packit Service 1d8f1c
                         callback,
Packit Service 1d8f1c
                         user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
ibus_bus_set_ibus_property_async_finish (IBusBus       *bus,
Packit Service 1d8f1c
                                         GAsyncResult  *res,
Packit Service 1d8f1c
                                         GError       **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_return_val_if_fail (
Packit Service 1d8f1c
            g_task_get_source_tag (task) == ibus_bus_set_ibus_property_async,
Packit Service 1d8f1c
            FALSE);
Packit Service 1d8f1c
    return _async_finish_void (task, error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static GVariant *
Packit Service 1d8f1c
ibus_bus_call_sync (IBusBus            *bus,
Packit Service 1d8f1c
                    const gchar        *bus_name,
Packit Service 1d8f1c
                    const gchar        *path,
Packit Service 1d8f1c
                    const gchar        *interface,
Packit Service 1d8f1c
                    const gchar        *member,
Packit Service 1d8f1c
                    GVariant           *parameters,
Packit Service 1d8f1c
                    const GVariantType *reply_type)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (member != NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->use_portal &&
Packit Service 1d8f1c
        g_strcmp0 (bus_name, IBUS_SERVICE_IBUS) == 0)  {
Packit Service 1d8f1c
        bus_name = IBUS_SERVICE_PORTAL;
Packit Service 1d8f1c
        if (g_strcmp0 (interface, IBUS_INTERFACE_IBUS) == 0)
Packit Service 1d8f1c
            interface = IBUS_INTERFACE_PORTAL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    GVariant *result;
Packit Service 1d8f1c
    result = g_dbus_connection_call_sync (bus->priv->connection,
Packit Service 1d8f1c
                                          bus_name,
Packit Service 1d8f1c
                                          path,
Packit Service 1d8f1c
                                          interface,
Packit Service 1d8f1c
                                          member,
Packit Service 1d8f1c
                                          parameters,
Packit Service 1d8f1c
                                          reply_type,
Packit Service 1d8f1c
                                          G_DBUS_CALL_FLAGS_NO_AUTO_START,
Packit Service 1d8f1c
                                          ibus_get_timeout (),
Packit Service 1d8f1c
                                          NULL,
Packit Service 1d8f1c
                                          &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (result == NULL) {
Packit Service 1d8f1c
        g_warning ("ibus_bus_call_sync: %s.%s: %s", interface, member, error->message);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return result;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_call_async_done (GDBusConnection *connection,
Packit Service 1d8f1c
                          GAsyncResult    *res,
Packit Service 1d8f1c
                          gpointer         user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    GVariant *variant;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (G_IS_DBUS_CONNECTION (connection));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = (GTask* ) user_data;
Packit Service 1d8f1c
    variant = g_dbus_connection_call_finish (connection, res, &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (variant == NULL)
Packit Service 1d8f1c
        g_task_return_error (task, error);
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        g_task_return_pointer (task, variant, (GDestroyNotify) g_variant_unref);
Packit Service 1d8f1c
    g_object_unref (task);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_bus_call_async (IBusBus            *bus,
Packit Service 1d8f1c
                     const gchar        *bus_name,
Packit Service 1d8f1c
                     const gchar        *path,
Packit Service 1d8f1c
                     const gchar        *interface,
Packit Service 1d8f1c
                     const gchar        *member,
Packit Service 1d8f1c
                     GVariant           *parameters,
Packit Service 1d8f1c
                     const GVariantType *reply_type,
Packit Service 1d8f1c
                     gpointer            source_tag,
Packit Service 1d8f1c
                     gint                timeout_msec,
Packit Service 1d8f1c
                     GCancellable       *cancellable,
Packit Service 1d8f1c
                     GAsyncReadyCallback callback,
Packit Service 1d8f1c
                     gpointer            user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_BUS (bus));
Packit Service 1d8f1c
    g_assert (member != NULL);
Packit Service 1d8f1c
    g_return_if_fail (ibus_bus_is_connected (bus));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = g_task_new (bus, cancellable, callback, user_data);
Packit Service 1d8f1c
    g_task_set_source_tag (task, source_tag);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (bus->priv->use_portal &&
Packit Service 1d8f1c
        g_strcmp0 (bus_name, IBUS_SERVICE_IBUS) == 0)  {
Packit Service 1d8f1c
        bus_name = IBUS_SERVICE_PORTAL;
Packit Service 1d8f1c
        if (g_strcmp0 (interface, IBUS_INTERFACE_IBUS) == 0)
Packit Service 1d8f1c
            interface = IBUS_INTERFACE_PORTAL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_connection_call (bus->priv->connection,
Packit Service 1d8f1c
                            bus_name,
Packit Service 1d8f1c
                            path,
Packit Service 1d8f1c
                            interface,
Packit Service 1d8f1c
                            member,
Packit Service 1d8f1c
                            parameters,
Packit Service 1d8f1c
                            reply_type,
Packit Service 1d8f1c
                            G_DBUS_CALL_FLAGS_NO_AUTO_START,
Packit Service 1d8f1c
                            timeout_msec,
Packit Service 1d8f1c
                            cancellable,
Packit Service 1d8f1c
                            (GAsyncReadyCallback) ibus_bus_call_async_done,
Packit Service 1d8f1c
                            task);
Packit Service 1d8f1c
}