Blame bus/engineproxy.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-2013 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 "engineproxy.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
#include "global.h"
Packit Service 1d8f1c
#include "ibusimpl.h"
Packit Service 1d8f1c
#include "marshalers.h"
Packit Service 1d8f1c
#include "types.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _BusEngineProxy {
Packit Service 1d8f1c
    IBusProxy parent;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* instance members */
Packit Service 1d8f1c
    /* TRUE if the engine has a focus (local copy of the engine's status.) */
Packit Service 1d8f1c
    gboolean has_focus;
Packit Service 1d8f1c
    /* TRUE if the engine is enabled (local copy of the engine's status.) */
Packit Service 1d8f1c
    gboolean enabled;
Packit Service 1d8f1c
    /* A set of capabilities the current client supports (local copy of the engine's flag.) */
Packit Service 1d8f1c
    guint capabilities;
Packit Service 1d8f1c
    /* The current cursor location that are sent to the engine. */
Packit Service 1d8f1c
    gint x;
Packit Service 1d8f1c
    gint y;
Packit Service 1d8f1c
    gint w;
Packit Service 1d8f1c
    gint h;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* an engine desc used to create the proxy. */
Packit Service 1d8f1c
    IBusEngineDesc *desc;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* a key mapping for the engine that converts keycode into keysym. the mapping is used only when use_sys_layout is FALSE. */
Packit Service 1d8f1c
    IBusKeymap     *keymap;
Packit Service 1d8f1c
    /* private member */
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* cached surrounding text (see also IBusEnginePrivate and
Packit Service 1d8f1c
       IBusInputContextPrivate) */
Packit Service 1d8f1c
    IBusText *surrounding_text;
Packit Service 1d8f1c
    guint     surrounding_cursor_pos;
Packit Service 1d8f1c
    guint     selection_anchor_pos;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* cached properties */
Packit Service 1d8f1c
    IBusPropList *prop_list;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _BusEngineProxyClass {
Packit Service 1d8f1c
    IBusProxyClass parent;
Packit Service 1d8f1c
    /* class members */
Packit Service 1d8f1c
    void (* register_properties) (BusEngineProxy   *engine,
Packit Service 1d8f1c
                                  IBusPropList     *prop_list);
Packit Service 1d8f1c
    void (* update_property) (BusEngineProxy       *engine,
Packit Service 1d8f1c
                              IBusProperty         *prop);
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    COMMIT_TEXT,
Packit Service 1d8f1c
    FORWARD_KEY_EVENT,
Packit Service 1d8f1c
    DELETE_SURROUNDING_TEXT,
Packit Service 1d8f1c
    REQUIRE_SURROUNDING_TEXT,
Packit Service 1d8f1c
    UPDATE_PREEDIT_TEXT,
Packit Service 1d8f1c
    SHOW_PREEDIT_TEXT,
Packit Service 1d8f1c
    HIDE_PREEDIT_TEXT,
Packit Service 1d8f1c
    UPDATE_AUXILIARY_TEXT,
Packit Service 1d8f1c
    SHOW_AUXILIARY_TEXT,
Packit Service 1d8f1c
    HIDE_AUXILIARY_TEXT,
Packit Service 1d8f1c
    UPDATE_LOOKUP_TABLE,
Packit Service 1d8f1c
    SHOW_LOOKUP_TABLE,
Packit Service 1d8f1c
    HIDE_LOOKUP_TABLE,
Packit Service 1d8f1c
    PAGE_UP_LOOKUP_TABLE,
Packit Service 1d8f1c
    PAGE_DOWN_LOOKUP_TABLE,
Packit Service 1d8f1c
    CURSOR_UP_LOOKUP_TABLE,
Packit Service 1d8f1c
    CURSOR_DOWN_LOOKUP_TABLE,
Packit Service 1d8f1c
    REGISTER_PROPERTIES,
Packit Service 1d8f1c
    UPDATE_PROPERTY,
Packit Service 1d8f1c
    PANEL_EXTENSION,
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_ENGINE_DESC,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint    engine_signals[LAST_SIGNAL] = { 0 };
Packit Service 1d8f1c
Packit Service 1d8f1c
static IBusText *text_empty = NULL;
Packit Service 1d8f1c
static IBusPropList *prop_list_empty = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static void     bus_engine_proxy_set_property   (BusEngineProxy      *engine,
Packit Service 1d8f1c
                                                 guint                prop_id,
Packit Service 1d8f1c
                                                 const GValue        *value,
Packit Service 1d8f1c
                                                 GParamSpec          *pspec);
Packit Service 1d8f1c
static void     bus_engine_proxy_get_property   (BusEngineProxy      *engine,
Packit Service 1d8f1c
                                                 guint                prop_id,
Packit Service 1d8f1c
                                                 GValue              *value,
Packit Service 1d8f1c
                                                 GParamSpec          *pspec);
Packit Service 1d8f1c
static void     bus_engine_proxy_real_register_properties
Packit Service 1d8f1c
                                                (BusEngineProxy      *engine,
Packit Service 1d8f1c
                                                 IBusPropList        *prop_list);
Packit Service 1d8f1c
static void     bus_engine_proxy_real_update_property
Packit Service 1d8f1c
                                                (BusEngineProxy      *engine,
Packit Service 1d8f1c
                                                 IBusProperty        *prop);
Packit Service 1d8f1c
static void     bus_engine_proxy_real_destroy   (IBusProxy           *proxy);
Packit Service 1d8f1c
static void     bus_engine_proxy_g_signal       (GDBusProxy          *proxy,
Packit Service 1d8f1c
                                                 const gchar         *sender_name,
Packit Service 1d8f1c
                                                 const gchar         *signal_name,
Packit Service 1d8f1c
                                                 GVariant            *parameters);
Packit Service 1d8f1c
static void     bus_engine_proxy_initable_iface_init
Packit Service 1d8f1c
                                                (GInitableIface      *initable_iface);
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE_WITH_CODE (BusEngineProxy, bus_engine_proxy, IBUS_TYPE_PROXY,
Packit Service 1d8f1c
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, bus_engine_proxy_initable_iface_init)
Packit Service 1d8f1c
                        );
Packit Service 1d8f1c
Packit Service 1d8f1c
static GInitableIface *parent_initable_iface = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_class_init (BusEngineProxyClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gobject_class->set_property = (GObjectSetPropertyFunc)bus_engine_proxy_set_property;
Packit Service 1d8f1c
    gobject_class->get_property = (GObjectGetPropertyFunc)bus_engine_proxy_get_property;
Packit Service 1d8f1c
Packit Service 1d8f1c
    class->register_properties = bus_engine_proxy_real_register_properties;
Packit Service 1d8f1c
    class->update_property = bus_engine_proxy_real_update_property;
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_PROXY_CLASS (class)->destroy = bus_engine_proxy_real_destroy;
Packit Service 1d8f1c
    G_DBUS_PROXY_CLASS (class)->g_signal = bus_engine_proxy_g_signal;
Packit Service 1d8f1c
Packit Service 1d8f1c
    parent_initable_iface =
Packit Service 1d8f1c
            (GInitableIface *)g_type_interface_peek (bus_engine_proxy_parent_class, G_TYPE_INITABLE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install properties */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
                    PROP_ENGINE_DESC,
Packit Service 1d8f1c
                    g_param_spec_object ("desc",
Packit Service 1d8f1c
                        "desc",
Packit Service 1d8f1c
                        "desc",
Packit Service 1d8f1c
                        IBUS_TYPE_ENGINE_DESC,
Packit Service 1d8f1c
                        G_PARAM_READWRITE |
Packit Service 1d8f1c
                        G_PARAM_CONSTRUCT_ONLY |
Packit Service 1d8f1c
                        G_PARAM_STATIC_NAME |
Packit Service 1d8f1c
                        G_PARAM_STATIC_BLURB |
Packit Service 1d8f1c
                        G_PARAM_STATIC_NICK
Packit Service 1d8f1c
                        ));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install glib signals that will be sent when corresponding D-Bus signals are sent from an engine process. */
Packit Service 1d8f1c
    engine_signals[COMMIT_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("commit-text"),
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
            bus_marshal_VOID__OBJECT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            IBUS_TYPE_TEXT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[FORWARD_KEY_EVENT] =
Packit Service 1d8f1c
        g_signal_new (I_("forward-key-event"),
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
            bus_marshal_VOID__UINT_UINT_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            3,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[DELETE_SURROUNDING_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("delete-surrounding-text"),
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
            bus_marshal_VOID__INT_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[REQUIRE_SURROUNDING_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("require-surrounding-text"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[UPDATE_PREEDIT_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("update-preedit-text"),
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
            bus_marshal_VOID__OBJECT_UINT_BOOLEAN_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            4,
Packit Service 1d8f1c
            IBUS_TYPE_TEXT,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_BOOLEAN,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[SHOW_PREEDIT_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("show-preedit-text"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[HIDE_PREEDIT_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("hide-preedit-text"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[UPDATE_AUXILIARY_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("update-auxiliary-text"),
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
            bus_marshal_VOID__OBJECT_BOOLEAN,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            IBUS_TYPE_TEXT,
Packit Service 1d8f1c
            G_TYPE_BOOLEAN);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[SHOW_AUXILIARY_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("show-auxiliary-text"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[HIDE_AUXILIARY_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("hide-auxiliary-text"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[UPDATE_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("update-lookup-table"),
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
            bus_marshal_VOID__OBJECT_BOOLEAN,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            IBUS_TYPE_LOOKUP_TABLE,
Packit Service 1d8f1c
            G_TYPE_BOOLEAN);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[SHOW_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("show-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[HIDE_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("hide-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[PAGE_UP_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("page-up-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[PAGE_DOWN_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("page-down-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[CURSOR_UP_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("cursor-up-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[CURSOR_DOWN_LOOKUP_TABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("cursor-down-lookup-table"),
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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[REGISTER_PROPERTIES] =
Packit Service 1d8f1c
        g_signal_new (I_("register-properties"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (BusEngineProxyClass, register_properties),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            bus_marshal_VOID__OBJECT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            IBUS_TYPE_PROP_LIST);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[UPDATE_PROPERTY] =
Packit Service 1d8f1c
        g_signal_new (I_("update-property"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (BusEngineProxyClass, update_property),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            bus_marshal_VOID__OBJECT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            IBUS_TYPE_PROPERTY);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_signals[PANEL_EXTENSION] =
Packit Service 1d8f1c
        g_signal_new (I_("panel-extension"),
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
            bus_marshal_VOID__OBJECT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            IBUS_TYPE_EXTENSION_EVENT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    text_empty = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    g_object_ref_sink (text_empty);
Packit Service 1d8f1c
Packit Service 1d8f1c
    prop_list_empty = ibus_prop_list_new ();
Packit Service 1d8f1c
    g_object_ref_sink (prop_list_empty);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_init (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    engine->surrounding_text = g_object_ref_sink (text_empty);
Packit Service 1d8f1c
    engine->prop_list = g_object_ref_sink (prop_list_empty);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_set_property (BusEngineProxy *engine,
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_ENGINE_DESC:
Packit Service 1d8f1c
        g_assert (engine->desc == NULL);
Packit Service 1d8f1c
        engine->desc = g_value_dup_object (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_get_property (BusEngineProxy *engine,
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_ENGINE_DESC:
Packit Service 1d8f1c
        g_value_set_object (value, bus_engine_proxy_get_desc (engine));
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_real_register_properties (BusEngineProxy *engine,
Packit Service 1d8f1c
                                           IBusPropList   *prop_list)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROP_LIST (prop_list));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->prop_list != prop_list_empty)
Packit Service 1d8f1c
        g_object_unref (engine->prop_list);
Packit Service 1d8f1c
    engine->prop_list = (IBusPropList *) g_object_ref_sink (prop_list);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_real_update_property (BusEngineProxy *engine,
Packit Service 1d8f1c
                                       IBusProperty   *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (prop);
Packit Service 1d8f1c
    if (engine->prop_list)
Packit Service 1d8f1c
        ibus_prop_list_update_property (engine->prop_list, prop);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_real_destroy (IBusProxy *proxy)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    BusEngineProxy *engine = (BusEngineProxy *)proxy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->desc) {
Packit Service 1d8f1c
        g_object_unref (engine->desc);
Packit Service 1d8f1c
        engine->desc = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->keymap) {
Packit Service 1d8f1c
        g_object_unref (engine->keymap);
Packit Service 1d8f1c
        engine->keymap = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->surrounding_text) {
Packit Service 1d8f1c
        g_object_unref (engine->surrounding_text);
Packit Service 1d8f1c
        engine->surrounding_text = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->prop_list) {
Packit Service 1d8f1c
        g_object_unref (engine->prop_list);
Packit Service 1d8f1c
        engine->prop_list = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_PROXY_CLASS (bus_engine_proxy_parent_class)->destroy ((IBusProxy *)engine);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_g_object_unref_if_floating (gpointer instance)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (g_object_is_floating (instance))
Packit Service 1d8f1c
        g_object_unref (instance);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_engine_proxy_g_signal:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Handle all D-Bus signals from the engine process. This function emits corresponding glib signal for the D-Bus signal.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_g_signal (GDBusProxy  *proxy,
Packit Service 1d8f1c
                           const gchar *sender_name,
Packit Service 1d8f1c
                           const gchar *signal_name,
Packit Service 1d8f1c
                           GVariant    *parameters)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    BusEngineProxy *engine = (BusEngineProxy *)proxy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* The list of nullary D-Bus signals. */
Packit Service 1d8f1c
    static const struct {
Packit Service 1d8f1c
        const gchar *signal_name;
Packit Service 1d8f1c
        const guint  signal_id;
Packit Service 1d8f1c
    } signals [] = {
Packit Service 1d8f1c
        { "ShowPreeditText",        SHOW_PREEDIT_TEXT },
Packit Service 1d8f1c
        { "HidePreeditText",        HIDE_PREEDIT_TEXT },
Packit Service 1d8f1c
        { "ShowAuxiliaryText",      SHOW_AUXILIARY_TEXT },
Packit Service 1d8f1c
        { "HideAuxiliaryText",      HIDE_AUXILIARY_TEXT },
Packit Service 1d8f1c
        { "ShowLookupTable",        SHOW_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "HideLookupTable",        HIDE_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "PageUpLookupTable",      PAGE_UP_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "PageDownLookupTable",    PAGE_DOWN_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "CursorUpLookupTable",    CURSOR_UP_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "CursorDownLookupTable",  CURSOR_DOWN_LOOKUP_TABLE },
Packit Service 1d8f1c
        { "RequireSurroundingText", REQUIRE_SURROUNDING_TEXT },
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    gint i;
Packit Service 1d8f1c
    for (i = 0; i < G_N_ELEMENTS (signals); i++) {
Packit Service 1d8f1c
        if (g_strcmp0 (signal_name, signals[i].signal_name) == 0) {
Packit Service 1d8f1c
            g_signal_emit (engine, engine_signals[signals[i].signal_id], 0);
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Handle D-Bus signals with parameters. Deserialize them and emit a glib signal. */
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "CommitText") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(v)", &arg0);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusText *text = IBUS_TEXT (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (text != NULL);
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[COMMIT_TEXT], 0, text);
Packit Service 1d8f1c
        _g_object_unref_if_floating (text);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "ForwardKeyEvent") == 0) {
Packit Service 1d8f1c
        guint32 keyval = 0;
Packit Service 1d8f1c
        guint32 keycode = 0;
Packit Service 1d8f1c
        guint32 states = 0;
Packit Service 1d8f1c
        g_variant_get (parameters, "(uuu)", &keyval, &keycode, &states);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[FORWARD_KEY_EVENT],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       keyval,
Packit Service 1d8f1c
                       keycode,
Packit Service 1d8f1c
                       states);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "DeleteSurroundingText") == 0) {
Packit Service 1d8f1c
        gint  offset_from_cursor = 0;
Packit Service 1d8f1c
        guint nchars = 0;
Packit Service 1d8f1c
        g_variant_get (parameters, "(iu)", &offset_from_cursor, &nchars);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[DELETE_SURROUNDING_TEXT],
Packit Service 1d8f1c
                       0, offset_from_cursor, nchars);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "UpdatePreeditText") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        guint cursor_pos = 0;
Packit Service 1d8f1c
        gboolean visible = FALSE;
Packit Service 1d8f1c
        guint mode = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (parameters, "(vubu)", &arg0, &cursor_pos, &visible, &mode);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusText *text = IBUS_TEXT (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (text != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[UPDATE_PREEDIT_TEXT],
Packit Service 1d8f1c
                       0, text, cursor_pos, visible, mode);
Packit Service 1d8f1c
Packit Service 1d8f1c
        _g_object_unref_if_floating (text);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "UpdateAuxiliaryText") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        gboolean visible = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (parameters, "(vb)", &arg0, &visible);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusText *text = IBUS_TEXT (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (text != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[UPDATE_AUXILIARY_TEXT], 0, text, visible);
Packit Service 1d8f1c
        _g_object_unref_if_floating (text);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "UpdateLookupTable") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        gboolean visible = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (parameters, "(vb)", &arg0, &visible);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusLookupTable *table = IBUS_LOOKUP_TABLE (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (table != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[UPDATE_LOOKUP_TABLE], 0, table, visible);
Packit Service 1d8f1c
        _g_object_unref_if_floating (table);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "RegisterProperties") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(v)", &arg0);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusPropList *prop_list = IBUS_PROP_LIST (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (prop_list != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[REGISTER_PROPERTIES], 0, prop_list);
Packit Service 1d8f1c
        _g_object_unref_if_floating (prop_list);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "UpdateProperty") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(v)", &arg0);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusProperty *prop = IBUS_PROPERTY (ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (prop != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[UPDATE_PROPERTY], 0, prop);
Packit Service 1d8f1c
        _g_object_unref_if_floating (prop);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (signal_name, "PanelExtension") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        g_variant_get (parameters, "(v)", &arg0);
Packit Service 1d8f1c
        g_return_if_fail (arg0 != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusExtensionEvent *event = IBUS_EXTENSION_EVENT (
Packit Service 1d8f1c
                ibus_serializable_deserialize (arg0));
Packit Service 1d8f1c
        g_variant_unref (arg0);
Packit Service 1d8f1c
        g_return_if_fail (event != NULL);
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[PANEL_EXTENSION], 0, event);
Packit Service 1d8f1c
        _g_object_unref_if_floating (event);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_reached ();
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static BusEngineProxy *
Packit Service 1d8f1c
bus_engine_proxy_new_internal (const gchar     *path,
Packit Service 1d8f1c
                               IBusEngineDesc  *desc,
Packit Service 1d8f1c
                               GDBusConnection *connection)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (path);
Packit Service 1d8f1c
    g_assert (IBUS_IS_ENGINE_DESC (desc));
Packit Service 1d8f1c
    g_assert (G_IS_DBUS_CONNECTION (connection));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
Packit Service 1d8f1c
    BusEngineProxy *engine =
Packit Service 1d8f1c
        (BusEngineProxy *) g_initable_new (BUS_TYPE_ENGINE_PROXY,
Packit Service 1d8f1c
                                           NULL,
Packit Service 1d8f1c
                                           NULL,
Packit Service 1d8f1c
                                           "desc",              desc,
Packit Service 1d8f1c
                                           "g-connection",      connection,
Packit Service 1d8f1c
                                           "g-interface-name",  IBUS_INTERFACE_ENGINE,
Packit Service 1d8f1c
                                           "g-object-path",     path,
Packit Service 1d8f1c
                                           "g-default-timeout", g_gdbus_timeout,
Packit Service 1d8f1c
                                           "g-flags",           flags,
Packit Service 1d8f1c
                                           NULL);
Packit Service 1d8f1c
    const gchar *layout = ibus_engine_desc_get_layout (desc);
Packit Service 1d8f1c
    if (layout != NULL && layout[0] != '\0') {
Packit Service 1d8f1c
        engine->keymap = ibus_keymap_get (layout);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return engine;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
typedef struct {
Packit Service 1d8f1c
    GTask           *task;
Packit Service 1d8f1c
    IBusEngineDesc  *desc;
Packit Service 1d8f1c
    BusComponent    *component;
Packit Service 1d8f1c
    BusFactoryProxy *factory;
Packit Service 1d8f1c
    GCancellable *cancellable;
Packit Service 1d8f1c
    gulong cancelled_handler_id;
Packit Service 1d8f1c
    guint handler_id;
Packit Service 1d8f1c
    guint timeout_id;
Packit Service 1d8f1c
    gint timeout;
Packit Service 1d8f1c
} EngineProxyNewData;
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
engine_proxy_new_data_free (EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (data->task != NULL) {
Packit Service 1d8f1c
        g_object_unref (data->task);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->desc != NULL) {
Packit Service 1d8f1c
        g_object_unref (data->desc);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->component != NULL) {
Packit Service 1d8f1c
        if (data->handler_id != 0) {
Packit Service 1d8f1c
            g_signal_handler_disconnect (data->component, data->handler_id);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_object_unref (data->component);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->factory != NULL) {
Packit Service 1d8f1c
        g_object_unref (data->factory);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->timeout_id != 0) {
Packit Service 1d8f1c
        g_source_remove (data->timeout_id);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->cancellable != NULL) {
Packit Service 1d8f1c
        if (data->cancelled_handler_id != 0) {
Packit Service 1d8f1c
            g_cancellable_disconnect (data->cancellable,
Packit Service 1d8f1c
                                      data->cancelled_handler_id);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_object_unref (data->cancellable);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_slice_free (EngineProxyNewData, data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * create_engine_ready_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A callback function to be called when bus_factory_proxy_create_engine finishes.
Packit Service 1d8f1c
 * Create an BusEngineProxy object and call the GAsyncReadyCallback.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
create_engine_ready_cb (BusFactoryProxy    *factory,
Packit Service 1d8f1c
                        GAsyncResult       *res,
Packit Service 1d8f1c
                        EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (data->task != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    gchar *path = bus_factory_proxy_create_engine_finish (factory,
Packit Service 1d8f1c
                                                          res,
Packit Service 1d8f1c
                                                          &error);
Packit Service 1d8f1c
    if (path == NULL) {
Packit Service 1d8f1c
        g_task_return_error (data->task, error);
Packit Service 1d8f1c
        engine_proxy_new_data_free (data);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    BusEngineProxy *engine =
Packit Service 1d8f1c
            bus_engine_proxy_new_internal (path,
Packit Service 1d8f1c
                                           data->desc,
Packit Service 1d8f1c
                                           g_dbus_proxy_get_connection ((GDBusProxy *)data->factory));
Packit Service 1d8f1c
    g_free (path);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* FIXME: set destroy callback ? */
Packit Service 1d8f1c
    g_task_return_pointer (data->task, engine, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_proxy_new_data_free (data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * notify_factory_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A callback function to be called when bus_component_start() emits "notify::factory" signal within 5 seconds.
Packit Service 1d8f1c
 * Call bus_factory_proxy_create_engine to create the engine proxy asynchronously.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
notify_factory_cb (BusComponent       *component,
Packit Service 1d8f1c
                   GParamSpec         *spec,
Packit Service 1d8f1c
                   EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    data->factory = bus_component_get_factory (data->component);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->factory != NULL) {
Packit Service 1d8f1c
        g_object_ref (data->factory);
Packit Service 1d8f1c
        /* Timeout should be removed */
Packit Service 1d8f1c
        if (data->timeout_id != 0) {
Packit Service 1d8f1c
            g_source_remove (data->timeout_id);
Packit Service 1d8f1c
            data->timeout_id = 0;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /* Handler of notify::factory should be removed. */
Packit Service 1d8f1c
        if (data->handler_id != 0) {
Packit Service 1d8f1c
            g_signal_handler_disconnect (data->component, data->handler_id);
Packit Service 1d8f1c
            data->handler_id = 0;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* We *have to* disconnect the cancelled_cb here, since g_dbus_proxy_call
Packit Service 1d8f1c
         * calls create_engine_ready_cb even if the proxy call is cancelled, and
Packit Service 1d8f1c
         * in this case, create_engine_ready_cb itself will return error using
Packit Service 1d8f1c
         * g_task_return_error(). */
Packit Service 1d8f1c
        if (data->cancellable && data->cancelled_handler_id != 0) {
Packit Service 1d8f1c
            g_cancellable_disconnect (data->cancellable, data->cancelled_handler_id);
Packit Service 1d8f1c
            data->cancelled_handler_id = 0;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* Create engine from factory. */
Packit Service 1d8f1c
        bus_factory_proxy_create_engine (data->factory,
Packit Service 1d8f1c
                                         data->desc,
Packit Service 1d8f1c
                                         data->timeout,
Packit Service 1d8f1c
                                         data->cancellable,
Packit Service 1d8f1c
                                         (GAsyncReadyCallback) create_engine_ready_cb,
Packit Service 1d8f1c
                                         data);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /* If factory is NULL, we will continue wait for
Packit Service 1d8f1c
     * factory notify signal or timeout */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * timeout_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A callback function to be called when bus_component_start() does not emit "notify::factory" signal within 5 seconds.
Packit Service 1d8f1c
 * Call the GAsyncReadyCallback and stop the 5 sec timer.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
timeout_cb (EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_task_return_new_error (data->task,
Packit Service 1d8f1c
                             G_DBUS_ERROR,
Packit Service 1d8f1c
                             G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                             "Timeout was reached");
Packit Service 1d8f1c
    engine_proxy_new_data_free (data);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * cancelled_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A callback function to be called when someone calls g_cancellable_cancel()
Packit Service 1d8f1c
 * for the cancellable object for bus_engine_proxy_new.
Packit Service 1d8f1c
 * Call the GAsyncReadyCallback.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
cancelled_idle_cb (EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_task_return_new_error (data->task,
Packit Service 1d8f1c
                             G_DBUS_ERROR,
Packit Service 1d8f1c
                             G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                             "Operation was cancelled");
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine_proxy_new_data_free (data);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
cancelled_cb (GCancellable       *cancellable,
Packit Service 1d8f1c
              EngineProxyNewData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    /* Cancel the bus_engine_proxy_new() in idle to avoid deadlock.
Packit Service 1d8f1c
     * And use HIGH priority to avoid timeout event happening before
Packit Service 1d8f1c
     * idle callback. */
Packit Service 1d8f1c
    g_idle_add_full (G_PRIORITY_HIGH,
Packit Service 1d8f1c
                    (GSourceFunc) cancelled_idle_cb,
Packit Service 1d8f1c
                    data, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_new (IBusEngineDesc      *desc,
Packit Service 1d8f1c
                      gint                 timeout,
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_ENGINE_DESC (desc));
Packit Service 1d8f1c
    g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
Packit Service 1d8f1c
    g_assert (callback);
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = g_task_new (NULL, cancellable, callback, user_data);
Packit Service 1d8f1c
    g_task_set_source_tag (task, bus_engine_proxy_new);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_cancellable_is_cancelled (cancellable)) {
Packit Service 1d8f1c
        g_task_return_new_error (task,
Packit Service 1d8f1c
                                 G_DBUS_ERROR,
Packit Service 1d8f1c
                                 G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                                 "Operation was cancelled");
Packit Service 1d8f1c
        g_object_unref (task);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    EngineProxyNewData *data = g_slice_new0 (EngineProxyNewData);
Packit Service 1d8f1c
    data->desc = g_object_ref (desc);
Packit Service 1d8f1c
    data->component = bus_component_from_engine_desc (desc);
Packit Service 1d8f1c
    g_object_ref (data->component);
Packit Service 1d8f1c
    data->task = task;
Packit Service 1d8f1c
    data->timeout = timeout;
Packit Service 1d8f1c
Packit Service 1d8f1c
    data->factory = bus_component_get_factory (data->component);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->factory == NULL) {
Packit Service 1d8f1c
        /* The factory is not ready yet. Create the factory first, and wait for
Packit Service 1d8f1c
         * the "notify::factory" signal. In the handler of "notify::factory",
Packit Service 1d8f1c
         * we'll create the engine proxy. */
Packit Service 1d8f1c
        data->handler_id = g_signal_connect (data->component,
Packit Service 1d8f1c
                                             "notify::factory",
Packit Service 1d8f1c
                                             G_CALLBACK (notify_factory_cb),
Packit Service 1d8f1c
                                             data);
Packit Service 1d8f1c
        data->timeout_id = g_timeout_add (timeout,
Packit Service 1d8f1c
                                          (GSourceFunc) timeout_cb,
Packit Service 1d8f1c
                                          data);
Packit Service 1d8f1c
        if (cancellable) {
Packit Service 1d8f1c
            data->cancellable = (GCancellable *) g_object_ref (cancellable);
Packit Service 1d8f1c
            data->cancelled_handler_id = g_cancellable_connect (cancellable,
Packit Service 1d8f1c
                                                                (GCallback) cancelled_cb,
Packit Service 1d8f1c
                                                                data,
Packit Service 1d8f1c
                                                                NULL);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        bus_component_start (data->component, g_verbose);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        /* The factory is ready. We'll create the engine proxy directly. */
Packit Service 1d8f1c
        g_object_ref (data->factory);
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* We don't have to connect to cancelled_cb here, since g_dbus_proxy_call
Packit Service 1d8f1c
         * calls create_engine_ready_cb even if the proxy call is cancelled, and
Packit Service 1d8f1c
         * in this case, create_engine_ready_cb itself can return error using
Packit Service 1d8f1c
         * g_task_return_error(). */
Packit Service 1d8f1c
        bus_factory_proxy_create_engine (data->factory,
Packit Service 1d8f1c
                                         data->desc,
Packit Service 1d8f1c
                                         timeout,
Packit Service 1d8f1c
                                         cancellable,
Packit Service 1d8f1c
                                         (GAsyncReadyCallback) create_engine_ready_cb,
Packit Service 1d8f1c
                                         data);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
BusEngineProxy *
Packit Service 1d8f1c
bus_engine_proxy_new_finish (GAsyncResult   *res,
Packit Service 1d8f1c
                             GError       **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    gboolean had_error;
Packit Service 1d8f1c
    BusEngineProxy *retval = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (error == NULL || *error == NULL);
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, NULL));
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) == bus_engine_proxy_new);
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
    had_error = g_task_had_error (task);
Packit Service 1d8f1c
    retval = g_task_propagate_pointer (task, error);
Packit Service 1d8f1c
    if (had_error) {
Packit Service 1d8f1c
        g_assert (retval == NULL);
Packit Service 1d8f1c
        return NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_process_key_event (BusEngineProxy      *engine,
Packit Service 1d8f1c
                                    guint                keyval,
Packit Service 1d8f1c
                                    guint                keycode,
Packit Service 1d8f1c
                                    guint                state,
Packit Service 1d8f1c
                                    GAsyncReadyCallback  callback,
Packit Service 1d8f1c
                                    gpointer             user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (keycode != 0 && bus_ibus_impl_is_use_sys_layout (BUS_DEFAULT_IBUS) == FALSE) {
Packit Service 1d8f1c
        /* Since use_sys_layout is false, we don't rely on XKB. Try to convert keyval from keycode by using our own mapping. */
Packit Service 1d8f1c
        IBusKeymap *keymap = engine->keymap;
Packit Service 1d8f1c
        if (keymap == NULL)
Packit Service 1d8f1c
            keymap = BUS_DEFAULT_KEYMAP;
Packit Service 1d8f1c
        if (keymap != NULL) {
Packit Service 1d8f1c
            guint t = ibus_keymap_lookup_keysym (keymap, keycode, state);
Packit Service 1d8f1c
            if (t != IBUS_KEY_VoidSymbol) {
Packit Service 1d8f1c
                keyval = t;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "ProcessKeyEvent",
Packit Service 1d8f1c
                       g_variant_new ("(uuu)", keyval, keycode, state),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       callback,
Packit Service 1d8f1c
                       user_data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_set_cursor_location (BusEngineProxy *engine,
Packit Service 1d8f1c
                                      gint            x,
Packit Service 1d8f1c
                                      gint            y,
Packit Service 1d8f1c
                                      gint            w,
Packit Service 1d8f1c
                                      gint            h)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->x != x || engine->y != y || engine->w != w || engine->h != h) {
Packit Service 1d8f1c
        engine->x = x;
Packit Service 1d8f1c
        engine->y = y;
Packit Service 1d8f1c
        engine->w = w;
Packit Service 1d8f1c
        engine->h = h;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "SetCursorLocation",
Packit Service 1d8f1c
                           g_variant_new ("(iiii)", x, y, w, h),
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_process_hand_writing_event
Packit Service 1d8f1c
                                  (BusEngineProxy        *engine,
Packit Service 1d8f1c
                                   GVariant              *coordinates)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "ProcessHandWritingEvent",
Packit Service 1d8f1c
                       coordinates,
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_cancel_hand_writing
Packit Service 1d8f1c
                                  (BusEngineProxy        *engine,
Packit Service 1d8f1c
                                   guint                  n_strokes)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "CancelHandWriting",
Packit Service 1d8f1c
                       g_variant_new ("(u)", n_strokes),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_set_capabilities (BusEngineProxy *engine,
Packit Service 1d8f1c
                                   guint           caps)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->capabilities != caps) {
Packit Service 1d8f1c
        engine->capabilities = caps;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "SetCapabilities",
Packit Service 1d8f1c
                           g_variant_new ("(u)", caps),
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_property_activate (BusEngineProxy *engine,
Packit Service 1d8f1c
                                    const gchar    *prop_name,
Packit Service 1d8f1c
                                    guint           prop_state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (prop_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "PropertyActivate",
Packit Service 1d8f1c
                       g_variant_new ("(su)", prop_name, prop_state),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_property_show (BusEngineProxy *engine,
Packit Service 1d8f1c
                                const gchar    *prop_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (prop_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "PropertyShow",
Packit Service 1d8f1c
                       g_variant_new ("(s)", prop_name),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void bus_engine_proxy_property_hide (BusEngineProxy *engine,
Packit Service 1d8f1c
                                     const gchar    *prop_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (prop_name != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "PropertyHide",
Packit Service 1d8f1c
                       g_variant_new ("(s)", prop_name),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void bus_engine_proxy_set_surrounding_text (BusEngineProxy *engine,
Packit Service 1d8f1c
                                            IBusText       *text,
Packit Service 1d8f1c
                                            guint           cursor_pos,
Packit Service 1d8f1c
                                            guint           anchor_pos)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (text != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!engine->surrounding_text ||
Packit Service 1d8f1c
        g_strcmp0 (text->text, engine->surrounding_text->text) != 0 ||
Packit Service 1d8f1c
        cursor_pos != engine->surrounding_cursor_pos ||
Packit Service 1d8f1c
        anchor_pos != engine->selection_anchor_pos) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
Packit Service 1d8f1c
        if (engine->surrounding_text)
Packit Service 1d8f1c
            g_object_unref (engine->surrounding_text);
Packit Service 1d8f1c
        engine->surrounding_text = (IBusText *) g_object_ref_sink (text);
Packit Service 1d8f1c
        engine->surrounding_cursor_pos = cursor_pos;
Packit Service 1d8f1c
        engine->selection_anchor_pos = anchor_pos;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "SetSurroundingText",
Packit Service 1d8f1c
                           g_variant_new ("(vuu)",
Packit Service 1d8f1c
                                          variant,
Packit Service 1d8f1c
                                          cursor_pos,
Packit Service 1d8f1c
                                          anchor_pos),
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_set_content_type (BusEngineProxy *engine,
Packit Service 1d8f1c
                                   guint           purpose,
Packit Service 1d8f1c
                                   guint           hints)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *cached_content_type =
Packit Service 1d8f1c
        g_dbus_proxy_get_cached_property ((GDBusProxy *) engine,
Packit Service 1d8f1c
                                          "ContentType");
Packit Service 1d8f1c
    GVariant *content_type = g_variant_new ("(uu)", purpose, hints);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_ref_sink (content_type);
Packit Service 1d8f1c
    if (cached_content_type == NULL ||
Packit Service 1d8f1c
        !g_variant_equal (content_type, cached_content_type)) {
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *) engine,
Packit Service 1d8f1c
                           "org.freedesktop.DBus.Properties.Set",
Packit Service 1d8f1c
                           g_variant_new ("(ssv)",
Packit Service 1d8f1c
                                          IBUS_INTERFACE_ENGINE,
Packit Service 1d8f1c
                                          "ContentType",
Packit Service 1d8f1c
                                          content_type),
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* Need to update the cache by manual since there is a timing issue. */
Packit Service 1d8f1c
        g_dbus_proxy_set_cached_property ((GDBusProxy *) engine,
Packit Service 1d8f1c
                                          "ContentType",
Packit Service 1d8f1c
                                          content_type);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (cached_content_type != NULL)
Packit Service 1d8f1c
        g_variant_unref (cached_content_type);
Packit Service 1d8f1c
    g_variant_unref (content_type);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/* a macro to generate a function to call a nullary D-Bus method. */
Packit Service 1d8f1c
#define DEFINE_FUNCTION(Name, name)                         \
Packit Service 1d8f1c
    void                                                    \
Packit Service 1d8f1c
    bus_engine_proxy_##name (BusEngineProxy *engine)        \
Packit Service 1d8f1c
    {                                                       \
Packit Service 1d8f1c
        g_assert (BUS_IS_ENGINE_PROXY (engine));            \
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,            \
Packit Service 1d8f1c
                           #Name,                           \
Packit Service 1d8f1c
                           NULL,                            \
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,          \
Packit Service 1d8f1c
                           -1, NULL, NULL, NULL);           \
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
DEFINE_FUNCTION (Reset, reset)
Packit Service 1d8f1c
DEFINE_FUNCTION (PageUp, page_up)
Packit Service 1d8f1c
DEFINE_FUNCTION (PageDown, page_down)
Packit Service 1d8f1c
DEFINE_FUNCTION (CursorUp, cursor_up)
Packit Service 1d8f1c
DEFINE_FUNCTION (CursorDown, cursor_down)
Packit Service 1d8f1c
Packit Service 1d8f1c
#undef DEFINE_FUNCTION
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_focus_in (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    if (!engine->has_focus) {
Packit Service 1d8f1c
        engine->has_focus = TRUE;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "FocusIn",
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_focus_out (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    if (engine->has_focus) {
Packit Service 1d8f1c
        engine->has_focus = FALSE;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "FocusOut",
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_enable (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    if (!engine->enabled) {
Packit Service 1d8f1c
        engine->enabled = TRUE;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "Enable",
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_disable (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    if (engine->enabled) {
Packit Service 1d8f1c
        engine->enabled = FALSE;
Packit Service 1d8f1c
        g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                           "Disable",
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                           -1,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL,
Packit Service 1d8f1c
                           NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_candidate_clicked (BusEngineProxy *engine,
Packit Service 1d8f1c
                                    guint           index,
Packit Service 1d8f1c
                                    guint           button,
Packit Service 1d8f1c
                                    guint           state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "CandidateClicked",
Packit Service 1d8f1c
                       g_variant_new ("(uuu)", index, button, state),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngineDesc *
Packit Service 1d8f1c
bus_engine_proxy_get_desc (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return engine->desc;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusPropList *
Packit Service 1d8f1c
bus_engine_proxy_get_properties (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return engine->prop_list;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
bus_engine_proxy_is_enabled (BusEngineProxy *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return engine->enabled;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_panel_extension_received (BusEngineProxy     *engine,
Packit Service 1d8f1c
                                           IBusExtensionEvent *event)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *variant;
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_EXTENSION_EVENT (event));
Packit Service 1d8f1c
Packit Service 1d8f1c
    variant = ibus_serializable_serialize_object (
Packit Service 1d8f1c
            IBUS_SERIALIZABLE (event));
Packit Service 1d8f1c
    g_return_if_fail (variant != NULL);
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "PanelExtensionReceived",
Packit Service 1d8f1c
                       g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_engine_proxy_panel_extension_register_keys (BusEngineProxy *engine,
Packit Service 1d8f1c
                                                GVariant       *parameters)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (parameters);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_proxy_call ((GDBusProxy *)engine,
Packit Service 1d8f1c
                       "PanelExtensionRegisterKeys",
Packit Service 1d8f1c
                       g_variant_new ("(v)", g_variant_ref (parameters)),
Packit Service 1d8f1c
                       G_DBUS_CALL_FLAGS_NONE,
Packit Service 1d8f1c
                       -1,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
initable_init (GInitable     *initable,
Packit Service 1d8f1c
               GCancellable  *cancellable,
Packit Service 1d8f1c
               GError       **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    BusEngineProxy *engine = BUS_ENGINE_PROXY (initable);
Packit Service 1d8f1c
    if (engine->desc == NULL) {
Packit Service 1d8f1c
        *error = g_error_new (G_DBUS_ERROR,
Packit Service 1d8f1c
                              G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                              "Desc is NULL");
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return parent_initable_iface->init (initable,
Packit Service 1d8f1c
                                        cancellable,
Packit Service 1d8f1c
                                        error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_engine_proxy_initable_iface_init (GInitableIface *initable_iface)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    initable_iface->init = initable_init;
Packit Service 1d8f1c
}