Blame bus/inputcontext.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-2014 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
#include "inputcontext.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
#include <string.h>
Packit Service 1d8f1c
Packit Service 1d8f1c
#include "engineproxy.h"
Packit Service 1d8f1c
#include "factoryproxy.h"
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 _SetEngineByDescData {
Packit Service 1d8f1c
    /* context related to the data */
Packit Service 1d8f1c
    BusInputContext *context;
Packit Service 1d8f1c
    /* set engine by desc result, cancellable */
Packit Service 1d8f1c
    GTask *task;
Packit Service 1d8f1c
    /* a object to cancel bus_engine_proxy_new call */
Packit Service 1d8f1c
    GCancellable *cancellable;
Packit Service 1d8f1c
    /* a object being passed to the bus_input_context_set_engine_by_desc function. if origin_cancellable is cancelled by someone,
Packit Service 1d8f1c
     * we cancel the cancellable above as well. */
Packit Service 1d8f1c
    GCancellable *origin_cancellable;
Packit Service 1d8f1c
    gulong cancelled_handler_id;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
typedef struct _SetEngineByDescData SetEngineByDescData;
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _BusInputContext {
Packit Service 1d8f1c
    IBusService parent;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* instance members */
Packit Service 1d8f1c
    BusConnection *connection;
Packit Service 1d8f1c
    BusEngineProxy *engine;
Packit Service 1d8f1c
    gchar *client;
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean has_focus;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* client capabilities */
Packit Service 1d8f1c
    guint capabilities;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* cursor location */
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
    /* prev key event that are used for handling hot-keys */
Packit Service 1d8f1c
    guint prev_keyval;
Packit Service 1d8f1c
    guint prev_modifiers;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* preedit text */
Packit Service 1d8f1c
    IBusText *preedit_text;
Packit Service 1d8f1c
    guint     preedit_cursor_pos;
Packit Service 1d8f1c
    gboolean  preedit_visible;
Packit Service 1d8f1c
    guint     preedit_mode;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* auxiliary text */
Packit Service 1d8f1c
    IBusText *auxiliary_text;
Packit Service 1d8f1c
    gboolean  auxiliary_visible;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* lookup table */
Packit Service 1d8f1c
    IBusLookupTable *lookup_table;
Packit Service 1d8f1c
    gboolean lookup_table_visible;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* filter release */
Packit Service 1d8f1c
    gboolean filter_release;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* is fake context */
Packit Service 1d8f1c
    gboolean fake;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* incompleted set engine by desc request */
Packit Service 1d8f1c
    SetEngineByDescData *data;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* content-type (primary purpose and hints) */
Packit Service 1d8f1c
    guint    purpose;
Packit Service 1d8f1c
    guint    hints;
Packit Service 1d8f1c
Packit Service 1d8f1c
    BusPanelProxy *emoji_extension;
Packit Service 1d8f1c
    gboolean is_extension_lookup_table;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
struct _BusInputContextClass {
Packit Service 1d8f1c
    IBusServiceClass parent;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* class members */
Packit Service 1d8f1c
    IBusEngineDesc *default_engine_desc;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    PROCESS_KEY_EVENT,
Packit Service 1d8f1c
    SET_CURSOR_LOCATION,
Packit Service 1d8f1c
    SET_CURSOR_LOCATION_RELATIVE,
Packit Service 1d8f1c
    FOCUS_IN,
Packit Service 1d8f1c
    FOCUS_OUT,
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
    ENGINE_CHANGED,
Packit Service 1d8f1c
    REQUEST_ENGINE,
Packit Service 1d8f1c
    SET_CONTENT_TYPE,
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,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
typedef struct _BusInputContextPrivate BusInputContextPrivate;
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint    context_signals[LAST_SIGNAL] = { 0 };
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static void     bus_input_context_destroy
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_service_method_call
Packit Service 1d8f1c
                                   (IBusService           *service,
Packit Service 1d8f1c
                                    GDBusConnection       *connection,
Packit Service 1d8f1c
                                    const gchar           *sender,
Packit Service 1d8f1c
                                    const gchar           *object_path,
Packit Service 1d8f1c
                                    const gchar           *interface_name,
Packit Service 1d8f1c
                                    const gchar           *method_name,
Packit Service 1d8f1c
                                    GVariant              *parameters,
Packit Service 1d8f1c
                                    GDBusMethodInvocation *invocation);
Packit Service 1d8f1c
static gboolean bus_input_context_service_set_property
Packit Service 1d8f1c
                                   (IBusService           *service,
Packit Service 1d8f1c
                                    GDBusConnection       *connection,
Packit Service 1d8f1c
                                    const gchar           *sender,
Packit Service 1d8f1c
                                    const gchar           *object_path,
Packit Service 1d8f1c
                                    const gchar           *interface_name,
Packit Service 1d8f1c
                                    const gchar           *property_name,
Packit Service 1d8f1c
                                    GVariant              *value,
Packit Service 1d8f1c
                                    GError               **error);
Packit Service 1d8f1c
static void     bus_input_context_unset_engine
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_show_preedit_text
Packit Service 1d8f1c
                                   (BusInputContext       *context,
Packit Service 1d8f1c
                                    gboolean               is_extension);
Packit Service 1d8f1c
static void     bus_input_context_hide_preedit_text
Packit Service 1d8f1c
                                   (BusInputContext       *context,
Packit Service 1d8f1c
                                    gboolean               is_extension);
Packit Service 1d8f1c
static void     bus_input_context_update_auxiliary_text
Packit Service 1d8f1c
                                   (BusInputContext       *context,
Packit Service 1d8f1c
                                    IBusText              *text,
Packit Service 1d8f1c
                                    gboolean               visible);
Packit Service 1d8f1c
static void     bus_input_context_show_auxiliary_text
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_hide_auxiliary_text
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_show_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_hide_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_page_up_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_page_down_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_cursor_up_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_cursor_down_lookup_table
Packit Service 1d8f1c
                                   (BusInputContext       *context);
Packit Service 1d8f1c
static void     bus_input_context_register_properties
Packit Service 1d8f1c
                                   (BusInputContext       *context,
Packit Service 1d8f1c
                                    IBusPropList          *props);
Packit Service 1d8f1c
static void     bus_input_context_update_property
Packit Service 1d8f1c
                                   (BusInputContext       *context,
Packit Service 1d8f1c
                                    IBusProperty          *prop);
Packit Service 1d8f1c
static void     _engine_destroy_cb (BusEngineProxy        *factory,
Packit Service 1d8f1c
                                    BusInputContext       *context);
Packit Service 1d8f1c
Packit Service 1d8f1c
static IBusText *text_empty = NULL;
Packit Service 1d8f1c
static IBusLookupTable *lookup_table_empty = NULL;
Packit Service 1d8f1c
static IBusPropList    *props_empty = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
/* The interfaces available in this class, which consists of a list of
Packit Service 1d8f1c
 * methods this class implements and a list of signals this class may
Packit Service 1d8f1c
 * emit. Method calls to the interface that are not defined in this
Packit Service 1d8f1c
 * XML will be automatically rejected by the GDBus library (see
Packit Service 1d8f1c
 * src/ibusservice.c for details.) */
Packit Service 1d8f1c
static const gchar introspection_xml[] =
Packit Service 1d8f1c
    "<node>"
Packit Service 1d8f1c
    "  <interface name='org.freedesktop.IBus.InputContext'>"
Packit Service 1d8f1c
    /* methods */
Packit Service 1d8f1c
    "    <method name='ProcessKeyEvent'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='keyval' />"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='keycode' />"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='state' />"
Packit Service 1d8f1c
    "      <arg direction='out' type='b' name='handled' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='SetCursorLocation'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='x' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='y' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='w' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='h' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='SetCursorLocationRelative'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='x' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='y' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='w' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='i' name='h' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='ProcessHandWritingEvent'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='ad' name='coordinates' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='CancelHandWriting'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='u' name='n_strokes' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='FocusIn' />"
Packit Service 1d8f1c
    "    <method name='FocusOut' />"
Packit Service 1d8f1c
    "    <method name='Reset' />"
Packit Service 1d8f1c
    "    <method name='SetCapabilities'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='u' name='caps' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='PropertyActivate'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='s' name='name' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='u' name='state' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='SetEngine'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='s' name='name' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='GetEngine'>"
Packit Service 1d8f1c
    "      <arg direction='out' type='v' name='desc' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='SetSurroundingText'>"
Packit Service 1d8f1c
    "      <arg direction='in' type='v' name='text' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='u' name='cursor_pos' />"
Packit Service 1d8f1c
    "      <arg direction='in' type='u' name='anchor_pos' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* signals */
Packit Service 1d8f1c
    "    <signal name='CommitText'>"
Packit Service 1d8f1c
    "      <arg type='v' name='text' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='ForwardKeyEvent'>"
Packit Service 1d8f1c
    "      <arg type='u' name='keyval' />"
Packit Service 1d8f1c
    "      <arg type='u' name='keycode' />"
Packit Service 1d8f1c
    "      <arg type='u' name='state' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='UpdatePreeditText'>"
Packit Service 1d8f1c
    "      <arg type='v' name='text' />"
Packit Service 1d8f1c
    "      <arg type='u' name='cursor_pos' />"
Packit Service 1d8f1c
    "      <arg type='b' name='visible' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='ShowPreeditText'/>"
Packit Service 1d8f1c
    "    <signal name='HidePreeditText'/>"
Packit Service 1d8f1c
    "    <signal name='UpdateAuxiliaryText'>"
Packit Service 1d8f1c
    "      <arg type='v' name='text' />"
Packit Service 1d8f1c
    "      <arg type='b' name='visible' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='ShowAuxiliaryText'/>"
Packit Service 1d8f1c
    "    <signal name='HideAuxiliaryText'/>"
Packit Service 1d8f1c
    "    <signal name='UpdateLookupTable'>"
Packit Service 1d8f1c
    "      <arg type='v' name='table' />"
Packit Service 1d8f1c
    "      <arg type='b' name='visible' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='ShowLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='HideLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='PageUpLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='PageDownLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='CursorUpLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='CursorDownLookupTable'/>"
Packit Service 1d8f1c
    "    <signal name='RegisterProperties'>"
Packit Service 1d8f1c
    "      <arg type='v' name='props' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    "    <signal name='UpdateProperty'>"
Packit Service 1d8f1c
    "      <arg type='v' name='prop' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* properties */
Packit Service 1d8f1c
    "    <property name='ContentType' type='(uu)' access='write' />"
Packit Service 1d8f1c
    "  </interface>"
Packit Service 1d8f1c
    "</node>";
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (BusInputContext, bus_input_context, IBUS_TYPE_SERVICE)
Packit Service 1d8f1c
Packit Service 1d8f1c
/* TRUE if we can send preedit text to client. FALSE if the panel has to handle it. Note that we check IBUS_CAP_FOCUS here since
Packit Service 1d8f1c
 * when the capability is not set, the client has to handle a preedit text regardless of the embed_preedit_text config. */
Packit Service 1d8f1c
#define PREEDIT_CONDITION  \
Packit Service 1d8f1c
    ((context->capabilities & IBUS_CAP_PREEDIT_TEXT) && \
Packit Service 1d8f1c
     (bus_ibus_impl_is_embed_preedit_text (BUS_DEFAULT_IBUS) || (context->capabilities & IBUS_CAP_FOCUS) == 0))
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_connection_destroy_cb (BusConnection   *connection,
Packit Service 1d8f1c
                        BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_CONNECTION (connection));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_object_destroy (IBUS_OBJECT (context));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_class_init (BusInputContextClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    class->default_engine_desc = ibus_engine_desc_new ("dummy",
Packit Service 1d8f1c
                                                       "",
Packit Service 1d8f1c
                                                       "",
Packit Service 1d8f1c
                                                       "",
Packit Service 1d8f1c
                                                       "",
Packit Service 1d8f1c
                                                       "",
Packit Service 1d8f1c
                                                       "ibus-engine",
Packit Service 1d8f1c
                                                       "");
Packit Service 1d8f1c
    g_object_ref_sink (class->default_engine_desc);
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_object_class->destroy = (IBusObjectDestroyFunc) bus_input_context_destroy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* override the parent class's implementation. */
Packit Service 1d8f1c
    IBUS_SERVICE_CLASS (class)->service_method_call =
Packit Service 1d8f1c
        bus_input_context_service_method_call;
Packit Service 1d8f1c
    IBUS_SERVICE_CLASS (class)->service_set_property =
Packit Service 1d8f1c
        bus_input_context_service_set_property;
Packit Service 1d8f1c
    /* register the xml so that bus_ibus_impl_service_method_call will be called on a method call defined in the xml (e.g. 'FocusIn'.) */
Packit Service 1d8f1c
    ibus_service_class_add_interfaces (IBUS_SERVICE_CLASS (class), introspection_xml);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install glib signals that would be handled by other classes like ibusimpl.c and panelproxy.c. */
Packit Service 1d8f1c
    context_signals[PROCESS_KEY_EVENT] =
Packit Service 1d8f1c
        g_signal_new (I_("process-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_BOOLEAN__UINT_UINT_UINT,
Packit Service 1d8f1c
            G_TYPE_BOOLEAN,
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
    context_signals[SET_CURSOR_LOCATION] =
Packit Service 1d8f1c
        g_signal_new (I_("set-cursor-location"),
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_INT_INT_INT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            4,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_signals[SET_CURSOR_LOCATION_RELATIVE] =
Packit Service 1d8f1c
        g_signal_new (I_("set-cursor-location-relative"),
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_INT_INT_INT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            4,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT,
Packit Service 1d8f1c
            G_TYPE_INT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_signals[FOCUS_IN] =
Packit Service 1d8f1c
        g_signal_new (I_("focus-in"),
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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_signals[FOCUS_OUT] =
Packit Service 1d8f1c
        g_signal_new (I_("focus-out"),
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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            3,
Packit Service 1d8f1c
            IBUS_TYPE_TEXT,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_BOOLEAN);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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
    context_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
    context_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
    context_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
    context_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
    context_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
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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, 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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
            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_PROP_LIST);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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
            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_PROPERTY);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_signals[ENGINE_CHANGED] =
Packit Service 1d8f1c
        g_signal_new (I_("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
            bus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* This signal is not for notifying an event on this object, but is for requesting an engine as the name shows.
Packit Service 1d8f1c
     * On the signal emission, ibusimpl.c will immediately update the context->engine variable. */
Packit Service 1d8f1c
    context_signals[REQUEST_ENGINE] =
Packit Service 1d8f1c
        g_signal_new (I_("request-engine"),
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_OBJECT__STRING,
Packit Service 1d8f1c
            IBUS_TYPE_ENGINE_DESC,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_STRING);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_signals[SET_CONTENT_TYPE] =
Packit Service 1d8f1c
        g_signal_new (I_("set-content-type"),
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,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context_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_string ("");
Packit Service 1d8f1c
    g_object_ref_sink (text_empty);
Packit Service 1d8f1c
    lookup_table_empty = ibus_lookup_table_new (9 /* page size */, 0, FALSE, FALSE);
Packit Service 1d8f1c
    g_object_ref_sink (lookup_table_empty);
Packit Service 1d8f1c
    props_empty = ibus_prop_list_new ();
Packit Service 1d8f1c
    g_object_ref_sink (props_empty);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_init (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    context->prev_keyval = IBUS_KEY_VoidSymbol;
Packit Service 1d8f1c
    g_object_ref_sink (text_empty);
Packit Service 1d8f1c
    context->preedit_text = text_empty;
Packit Service 1d8f1c
    context->preedit_mode = IBUS_ENGINE_PREEDIT_CLEAR;
Packit Service 1d8f1c
    g_object_ref_sink (text_empty);
Packit Service 1d8f1c
    context->auxiliary_text = text_empty;
Packit Service 1d8f1c
    g_object_ref_sink (lookup_table_empty);
Packit Service 1d8f1c
    context->lookup_table = lookup_table_empty;
Packit Service 1d8f1c
    /* other member variables will automatically be zero-cleared. */
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_destroy (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->has_focus) {
Packit Service 1d8f1c
        bus_input_context_focus_out (context);
Packit Service 1d8f1c
        context->has_focus = FALSE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_input_context_unset_engine (context);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->preedit_text) {
Packit Service 1d8f1c
        g_object_unref (context->preedit_text);
Packit Service 1d8f1c
        context->preedit_text = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->auxiliary_text) {
Packit Service 1d8f1c
        g_object_unref (context->auxiliary_text);
Packit Service 1d8f1c
        context->auxiliary_text = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->lookup_table) {
Packit Service 1d8f1c
        g_object_unref (context->lookup_table);
Packit Service 1d8f1c
        context->lookup_table = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->connection) {
Packit Service 1d8f1c
        g_signal_handlers_disconnect_by_func (context->connection,
Packit Service 1d8f1c
                                         (GCallback) _connection_destroy_cb,
Packit Service 1d8f1c
                                         context);
Packit Service 1d8f1c
        g_object_unref (context->connection);
Packit Service 1d8f1c
        context->connection = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->client) {
Packit Service 1d8f1c
        g_free (context->client);
Packit Service 1d8f1c
        context->client = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS (bus_input_context_parent_class)->destroy (IBUS_OBJECT (context));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
bus_input_context_send_signal (BusInputContext *context,
Packit Service 1d8f1c
                               const gchar     *interface_name,
Packit Service 1d8f1c
                               const gchar     *signal_name,
Packit Service 1d8f1c
                               GVariant        *parameters,
Packit Service 1d8f1c
                               GError         **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->connection == NULL) {
Packit Service 1d8f1c
        g_variant_unref (parameters);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    GDBusMessage *message = g_dbus_message_new_signal (ibus_service_get_object_path ((IBusService *)context),
Packit Service 1d8f1c
                                                       interface_name,
Packit Service 1d8f1c
                                                       signal_name);
Packit Service 1d8f1c
    g_dbus_message_set_sender (message, "org.freedesktop.IBus");
Packit Service 1d8f1c
    g_dbus_message_set_destination (message, bus_connection_get_unique_name (context->connection));
Packit Service 1d8f1c
    if (parameters != NULL)
Packit Service 1d8f1c
        g_dbus_message_set_body (message, parameters);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gboolean retval =  g_dbus_connection_send_message (bus_connection_get_dbus_connection (context->connection),
Packit Service 1d8f1c
                                                       message,
Packit Service 1d8f1c
                                                       G_DBUS_SEND_MESSAGE_FLAGS_NONE,
Packit Service 1d8f1c
                                                       NULL, error);
Packit Service 1d8f1c
    g_object_unref (message);
Packit Service 1d8f1c
    return retval;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_emit_signal:
Packit Service 1d8f1c
 * @signal_name: The D-Bus signal name to emit which is in the introspection_xml.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Emit the D-Bus signal.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
bus_input_context_emit_signal (BusInputContext *context,
Packit Service 1d8f1c
                               const gchar     *signal_name,
Packit Service 1d8f1c
                               GVariant        *parameters,
Packit Service 1d8f1c
                               GError         **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->connection == NULL) {
Packit Service 1d8f1c
        /* fake context has no connections. */
Packit Service 1d8f1c
        if (parameters)
Packit Service 1d8f1c
            g_variant_unref (parameters);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return bus_input_context_send_signal (context,
Packit Service 1d8f1c
                                          "org.freedesktop.IBus.InputContext",
Packit Service 1d8f1c
                                          signal_name,
Packit Service 1d8f1c
                                          parameters,
Packit Service 1d8f1c
                                          error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_property_changed:
Packit Service 1d8f1c
 * @context: a #BusInputContext
Packit Service 1d8f1c
 * @property_name: The D-Bus property name which has changed
Packit Service 1d8f1c
 * @value: The new value of the property
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Emit the D-Bus "PropertiesChanged" signal for a property.
Packit Service 1d8f1c
 * Returns: %TRUE on success, %FALSE on failure
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
bus_input_context_property_changed (BusInputContext *context,
Packit Service 1d8f1c
                                    const gchar     *property_name,
Packit Service 1d8f1c
                                    GVariant        *value,
Packit Service 1d8f1c
                                    GError         **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->connection == NULL)
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariantBuilder builder;
Packit Service 1d8f1c
    g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
Packit Service 1d8f1c
    g_variant_builder_add (&builder, "{sv}", property_name, value);
Packit Service 1d8f1c
    return bus_input_context_send_signal (context,
Packit Service 1d8f1c
                                          "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                          "PropertiesChanged",
Packit Service 1d8f1c
                                          g_variant_new ("(sa{sv}as)",
Packit Service 1d8f1c
                                                         "org.freedesktop.IBus",
Packit Service 1d8f1c
                                                         &builder,
Packit Service 1d8f1c
                                                         NULL),
Packit Service 1d8f1c
                                          error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _panel_process_key_event_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A GAsyncReadyCallback function to be called when
Packit Service 1d8f1c
 * bus_panel_proxy_process_key_event() is finished.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_panel_process_key_event_cb (GObject               *source,
Packit Service 1d8f1c
                             GAsyncResult          *res,
Packit Service 1d8f1c
                             GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    GVariant *value = g_dbus_proxy_call_finish ((GDBusProxy *)source,
Packit Service 1d8f1c
                                                 res,
Packit Service 1d8f1c
                                                 &error);
Packit Service 1d8f1c
    if (value != NULL) {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, value);
Packit Service 1d8f1c
        g_variant_unref (value);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_gerror (invocation, error);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
typedef struct _ProcessKeyEventData ProcessKeyEventData;
Packit Service 1d8f1c
struct _ProcessKeyEventData {
Packit Service 1d8f1c
    GDBusMethodInvocation *invocation;
Packit Service 1d8f1c
    BusInputContext       *context;
Packit Service 1d8f1c
    guint keyval;
Packit Service 1d8f1c
    guint keycode;
Packit Service 1d8f1c
    guint modifiers;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_process_key_event_reply_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A GAsyncReadyCallback function to be called when
Packit Service 1d8f1c
 * bus_engine_proxy_process_key_event() is finished.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_process_key_event_reply_cb (GObject               *source,
Packit Service 1d8f1c
                                GAsyncResult          *res,
Packit Service 1d8f1c
                                ProcessKeyEventData   *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GDBusMethodInvocation *invocation = data->invocation;
Packit Service 1d8f1c
    BusInputContext *context = data->context;
Packit Service 1d8f1c
    guint keyval = data->keyval;
Packit Service 1d8f1c
    guint keycode = data->keycode;
Packit Service 1d8f1c
    guint modifiers = data->modifiers;
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    GVariant *value = g_dbus_proxy_call_finish ((GDBusProxy *)source,
Packit Service 1d8f1c
                                                 res,
Packit Service 1d8f1c
                                                 &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (value != NULL) {
Packit Service 1d8f1c
        gboolean retval = FALSE;
Packit Service 1d8f1c
        g_variant_get (value, "(b)", &retval);
Packit Service 1d8f1c
        if (context->emoji_extension && !retval) {
Packit Service 1d8f1c
            bus_panel_proxy_process_key_event (context->emoji_extension,
Packit Service 1d8f1c
                                               keyval,
Packit Service 1d8f1c
                                               keycode,
Packit Service 1d8f1c
                                               modifiers,
Packit Service 1d8f1c
                                               (GAsyncReadyCallback)
Packit Service 1d8f1c
                                                    _panel_process_key_event_cb,
Packit Service 1d8f1c
                                               invocation);
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            g_dbus_method_invocation_return_value (invocation, value);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_variant_unref (value);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_gerror (invocation, error);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_object_unref (context);
Packit Service 1d8f1c
    g_slice_free (ProcessKeyEventData, data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_process_key_event:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "ProcessKeyEvent" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_process_key_event  (BusInputContext       *context,
Packit Service 1d8f1c
                        GVariant              *parameters,
Packit Service 1d8f1c
                        GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    guint keyval = IBUS_KEY_VoidSymbol;
Packit Service 1d8f1c
    guint keycode = 0;
Packit Service 1d8f1c
    guint modifiers = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (parameters, "(uuu)", &keyval, &keycode, &modifiers);
Packit Service 1d8f1c
    if (G_UNLIKELY (!context->has_focus)) {
Packit Service 1d8f1c
        /* workaround: set focus if context does not have focus */
Packit Service 1d8f1c
        BusInputContext *focused_context = bus_ibus_impl_get_focused_input_context (BUS_DEFAULT_IBUS);
Packit Service 1d8f1c
        if (focused_context == NULL ||
Packit Service 1d8f1c
            focused_context->fake == TRUE ||
Packit Service 1d8f1c
            context->fake == FALSE) {
Packit Service 1d8f1c
            /* grab focus, if context is a real IC or current focused IC is fake */
Packit Service 1d8f1c
            bus_input_context_focus_in (context);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* If I move the focus from the URL entry box of google-chrome
Packit Service 1d8f1c
     * to the text buffer of gnome-terminal,
Packit Service 1d8f1c
     * focus-in/focus-out of google-chrome is caused after
Packit Service 1d8f1c
     * focus-in of gonme-terminal and gnome-terminal loses the focus.
Packit Service 1d8f1c
     * The following focus events are received in ibusimcontext:
Packit Service 1d8f1c
     * 1) (gnome-terminal:445): IBUS-WARNING **: 15:32:36:717  focus_in
Packit Service 1d8f1c
     * 2) (google-chrome:495): IBUS-WARNING **: 15:32:36:866  focus_out
Packit Service 1d8f1c
     * 3) (google-chrome:495): IBUS-WARNING **: 15:32:36:875  focus_in
Packit Service 1d8f1c
     * 4) (google-chrome:495): IBUS-WARNING **: 15:32:36:890  focus_out
Packit Service 1d8f1c
     * In 2), Just return because focused_context is not google-chrome.
Packit Service 1d8f1c
     * In 3), focused_context is changed from gnome-terminal to google-chrome
Packit Service 1d8f1c
     * In 4), focused_context is changed from google-chrome to faked_context.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * It seems google-chrome has a popup window of the prediction of URL
Packit Service 1d8f1c
     * and async focus-in/focus-out.
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    if (context->has_focus && context->engine == NULL &&
Packit Service 1d8f1c
        context->fake == FALSE) {
Packit Service 1d8f1c
        BusInputContext *focused_context =
Packit Service 1d8f1c
                bus_ibus_impl_get_focused_input_context (BUS_DEFAULT_IBUS);
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (focused_context != NULL && context != focused_context &&
Packit Service 1d8f1c
            (context->capabilities & IBUS_CAP_FOCUS) != 0) {
Packit Service 1d8f1c
            context->has_focus = FALSE;
Packit Service 1d8f1c
            bus_input_context_focus_in (context);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* ignore key events, if it is a fake input context */
Packit Service 1d8f1c
    if (context->has_focus && context->engine && context->fake == FALSE) {
Packit Service 1d8f1c
        ProcessKeyEventData *data = g_slice_new0 (ProcessKeyEventData);
Packit Service 1d8f1c
        data->invocation = invocation;
Packit Service 1d8f1c
        data->context = g_object_ref (context);
Packit Service 1d8f1c
        data->keyval = keyval;
Packit Service 1d8f1c
        data->keycode = keycode;
Packit Service 1d8f1c
        data->modifiers = modifiers;
Packit Service 1d8f1c
        bus_engine_proxy_process_key_event (context->engine,
Packit Service 1d8f1c
                                            keyval,
Packit Service 1d8f1c
                                            keycode,
Packit Service 1d8f1c
                                            modifiers,
Packit Service 1d8f1c
                                            (GAsyncReadyCallback)
Packit Service 1d8f1c
                                                _ic_process_key_event_reply_cb,
Packit Service 1d8f1c
                                            data);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", FALSE));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_set_cursor_location:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "SetCursorLocation" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_cursor_location (BusInputContext       *context,
Packit Service 1d8f1c
                         GVariant              *parameters,
Packit Service 1d8f1c
                         GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (parameters, "(iiii)",
Packit Service 1d8f1c
                   &context->x, &context->y, &context->w, &context->h);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->has_focus && context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_set_cursor_location (context->engine,
Packit Service 1d8f1c
                        context->x, context->y, context->w, context->h);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[SET_CURSOR_LOCATION],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       context->x,
Packit Service 1d8f1c
                       context->y,
Packit Service 1d8f1c
                       context->w,
Packit Service 1d8f1c
                       context->h);
Packit Service 1d8f1c
        if (context->emoji_extension) {
Packit Service 1d8f1c
            bus_panel_proxy_set_cursor_location (context->emoji_extension,
Packit Service 1d8f1c
                                                 context->x,
Packit Service 1d8f1c
                                                 context->y,
Packit Service 1d8f1c
                                                 context->w,
Packit Service 1d8f1c
                                                 context->h);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_set_cursor_location_relative:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "SetCursorLocationRelative" method call of the
Packit Service 1d8f1c
 * org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Unlike _ic_set_cursor_location, this doesn't deliver the location
Packit Service 1d8f1c
 * to the engine proxy, since the relative coordinates are not very
Packit Service 1d8f1c
 * useful for engines.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_cursor_location_relative (BusInputContext       *context,
Packit Service 1d8f1c
                                  GVariant              *parameters,
Packit Service 1d8f1c
                                  GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gint x, y, w, h;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (parameters, "(iiii)", &x, &y, &w, &h);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[SET_CURSOR_LOCATION_RELATIVE],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       x,
Packit Service 1d8f1c
                       y,
Packit Service 1d8f1c
                       w,
Packit Service 1d8f1c
                       h);
Packit Service 1d8f1c
        if (context->emoji_extension) {
Packit Service 1d8f1c
            bus_panel_proxy_set_cursor_location_relative (
Packit Service 1d8f1c
                    context->emoji_extension,
Packit Service 1d8f1c
                    x,
Packit Service 1d8f1c
                    y,
Packit Service 1d8f1c
                    w,
Packit Service 1d8f1c
                    h);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_process_hand_writing_event (BusInputContext       *context,
Packit Service 1d8f1c
                                GVariant              *parameters,
Packit Service 1d8f1c
                                GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    /* do nothing if it is a fake input context */
Packit Service 1d8f1c
    if (context->has_focus &&
Packit Service 1d8f1c
        context->engine && context->fake == FALSE) {
Packit Service 1d8f1c
        bus_engine_proxy_process_hand_writing_event (context->engine, parameters);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_cancel_hand_writing (BusInputContext       *context,
Packit Service 1d8f1c
                         GVariant              *parameters,
Packit Service 1d8f1c
                         GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    guint n_strokes = 0;
Packit Service 1d8f1c
    g_variant_get (parameters, "(u)", &n_strokes);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* do nothing if it is a fake input context */
Packit Service 1d8f1c
    if (context->has_focus &&
Packit Service 1d8f1c
        context->engine && context->fake == FALSE) {
Packit Service 1d8f1c
        bus_engine_proxy_cancel_hand_writing (context->engine, n_strokes);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_focus_in:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "FocusIn" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_focus_in (BusInputContext       *context,
Packit Service 1d8f1c
              GVariant              *parameters,
Packit Service 1d8f1c
              GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        bus_input_context_focus_in (context);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                        "The input context does not support focus.");
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_focus_out:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "FocusOut" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_focus_out (BusInputContext       *context,
Packit Service 1d8f1c
               GVariant              *parameters,
Packit Service 1d8f1c
               GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        bus_input_context_focus_out (context);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                        "The input context does not support focus.");
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_reset:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "Reset" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_reset (BusInputContext       *context,
Packit Service 1d8f1c
           GVariant              *parameters,
Packit Service 1d8f1c
           GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_reset (context->engine);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_set_capabilities:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "SetCapabilities" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_capabilities (BusInputContext       *context,
Packit Service 1d8f1c
                      GVariant              *parameters,
Packit Service 1d8f1c
                      GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    guint caps = 0;
Packit Service 1d8f1c
    g_variant_get (parameters, "(u)", &caps);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_set_capabilities (context, caps);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_property_activate:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "PropertyActivate" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_property_activate (BusInputContext       *context,
Packit Service 1d8f1c
                       GVariant              *parameters,
Packit Service 1d8f1c
                       GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gchar *prop_name = NULL;
Packit Service 1d8f1c
    guint prop_state = 0;
Packit Service 1d8f1c
    g_variant_get (parameters, "(&su)", &prop_name, &prop_state);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_property_activate (context->engine, prop_name, prop_state);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
#ifdef OS_CHROMEOS
Packit Service 1d8f1c
    /* Global engine is always enabled in chromeos,
Packit Service 1d8f1c
     * so pass PropertyActivate signal to the focused context.
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    else if (context->fake) {
Packit Service 1d8f1c
        BusInputContext *focused_context = bus_ibus_impl_get_focused_input_context (BUS_DEFAULT_IBUS);
Packit Service 1d8f1c
        if (focused_context && focused_context->engine)
Packit Service 1d8f1c
            bus_engine_proxy_property_activate (focused_context->engine, prop_name, prop_state);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_engine_done (BusInputContext       *context,
Packit Service 1d8f1c
                     GAsyncResult          *res,
Packit Service 1d8f1c
                     GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean retval = FALSE;
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    retval = bus_input_context_set_engine_by_desc_finish (context,
Packit Service 1d8f1c
                    res, &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!retval) {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_gerror (invocation, error);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_set_engine:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "SetEngine" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_engine (BusInputContext       *context,
Packit Service 1d8f1c
                GVariant              *parameters,
Packit Service 1d8f1c
                GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gchar *engine_name = NULL;
Packit Service 1d8f1c
    g_variant_get (parameters, "(&s)", &engine_name);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!bus_input_context_has_focus (context)) {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_error (invocation,
Packit Service 1d8f1c
                G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                "Context which does not has focus can not change engine to %s.",
Packit Service 1d8f1c
                engine_name);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusEngineDesc *desc = NULL;
Packit Service 1d8f1c
    g_signal_emit (context,
Packit Service 1d8f1c
                   context_signals[REQUEST_ENGINE], 0,
Packit Service 1d8f1c
                   engine_name,
Packit Service 1d8f1c
                   &desc);
Packit Service 1d8f1c
    if (desc == NULL) {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_error (invocation,
Packit Service 1d8f1c
                        G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                        "Can not find engine %s.", engine_name);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_set_engine_by_desc (context,
Packit Service 1d8f1c
                            desc,
Packit Service 1d8f1c
                            g_gdbus_timeout,
Packit Service 1d8f1c
                            NULL,
Packit Service 1d8f1c
                            (GAsyncReadyCallback)_ic_set_engine_done,
Packit Service 1d8f1c
                            invocation);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _ic_get_engine:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Implement the "GetEngine" method call of the org.freedesktop.IBus.InputContext interface.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_get_engine (BusInputContext       *context,
Packit Service 1d8f1c
                GVariant              *parameters,
Packit Service 1d8f1c
                GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEngineDesc *desc = context->engine ?
Packit Service 1d8f1c
            bus_engine_proxy_get_desc (context->engine) :
Packit Service 1d8f1c
            BUS_INPUT_CONTEXT_GET_CLASS (context)->default_engine_desc;
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation,
Packit Service 1d8f1c
            g_variant_new ("(v)", ibus_serializable_serialize ((IBusSerializable *)desc)));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_surrounding_text (BusInputContext       *context,
Packit Service 1d8f1c
                          GVariant              *parameters,
Packit Service 1d8f1c
                          GDBusMethodInvocation *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *variant = NULL;
Packit Service 1d8f1c
    IBusText *text;
Packit Service 1d8f1c
    guint cursor_pos = 0;
Packit Service 1d8f1c
    guint anchor_pos = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (parameters,
Packit Service 1d8f1c
                   "(vuu)",
Packit Service 1d8f1c
                   &variant,
Packit Service 1d8f1c
                   &cursor_pos,
Packit Service 1d8f1c
                   &anchor_pos);
Packit Service 1d8f1c
    text = IBUS_TEXT (ibus_serializable_deserialize (variant));
Packit Service 1d8f1c
    g_variant_unref (variant);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_SURROUNDING_TEXT) &&
Packit Service 1d8f1c
         context->has_focus && context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_set_surrounding_text (context->engine,
Packit Service 1d8f1c
                                               text,
Packit Service 1d8f1c
                                               cursor_pos,
Packit Service 1d8f1c
                                               anchor_pos);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_object_is_floating (text))
Packit Service 1d8f1c
        g_object_unref (text);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/*
Packit Service 1d8f1c
 * Since IBusService is inherited by IBusImpl, this method cannot be
Packit Service 1d8f1c
 * applied to IBusServiceClass.method_call() directly but can be in
Packit Service 1d8f1c
 * each child class.method_call().
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
bus_input_context_service_authorized_method (IBusService     *service,
Packit Service 1d8f1c
                                             GDBusConnection *connection)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (ibus_service_get_connection (service) == connection)
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_service_method_call:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Handle a D-Bus method call whose destination and interface name are both "org.freedesktop.IBus.InputContext"
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_service_method_call (IBusService            *service,
Packit Service 1d8f1c
                                       GDBusConnection        *connection,
Packit Service 1d8f1c
                                       const gchar            *sender,
Packit Service 1d8f1c
                                       const gchar            *object_path,
Packit Service 1d8f1c
                                       const gchar            *interface_name,
Packit Service 1d8f1c
                                       const gchar            *method_name,
Packit Service 1d8f1c
                                       GVariant               *parameters,
Packit Service 1d8f1c
                                       GDBusMethodInvocation  *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) {
Packit Service 1d8f1c
        IBUS_SERVICE_CLASS (bus_input_context_parent_class)->service_method_call (
Packit Service 1d8f1c
                        service,
Packit Service 1d8f1c
                        connection,
Packit Service 1d8f1c
                        sender,
Packit Service 1d8f1c
                        object_path,
Packit Service 1d8f1c
                        interface_name,
Packit Service 1d8f1c
                        method_name,
Packit Service 1d8f1c
                        parameters,
Packit Service 1d8f1c
                        invocation);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    static const struct {
Packit Service 1d8f1c
        const gchar *method_name;
Packit Service 1d8f1c
        void (* method_callback) (BusInputContext *, GVariant *, GDBusMethodInvocation *);
Packit Service 1d8f1c
    } methods [] =  {
Packit Service 1d8f1c
        { "ProcessKeyEvent",   _ic_process_key_event },
Packit Service 1d8f1c
        { "SetCursorLocation", _ic_set_cursor_location },
Packit Service 1d8f1c
        { "SetCursorLocationRelative", _ic_set_cursor_location_relative },
Packit Service 1d8f1c
        { "ProcessHandWritingEvent",
Packit Service 1d8f1c
                               _ic_process_hand_writing_event },
Packit Service 1d8f1c
        { "CancelHandWriting", _ic_cancel_hand_writing },
Packit Service 1d8f1c
        { "FocusIn",           _ic_focus_in },
Packit Service 1d8f1c
        { "FocusOut",          _ic_focus_out },
Packit Service 1d8f1c
        { "Reset",             _ic_reset },
Packit Service 1d8f1c
        { "SetCapabilities",   _ic_set_capabilities },
Packit Service 1d8f1c
        { "PropertyActivate",  _ic_property_activate },
Packit Service 1d8f1c
        { "SetEngine",         _ic_set_engine },
Packit Service 1d8f1c
        { "GetEngine",         _ic_get_engine },
Packit Service 1d8f1c
        { "SetSurroundingText", _ic_set_surrounding_text }
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    gint i;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!bus_input_context_service_authorized_method (service, connection))
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (i = 0; i < G_N_ELEMENTS (methods); i++) {
Packit Service 1d8f1c
        if (g_strcmp0 (method_name, methods[i].method_name) == 0) {
Packit Service 1d8f1c
            methods[i].method_callback ((BusInputContext *)service, parameters, invocation);
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_reached ();
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_ic_set_content_type (BusInputContext *context,
Packit Service 1d8f1c
                      GVariant        *value)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    guint purpose = 0;
Packit Service 1d8f1c
    guint hints = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (value, "(uu)", &purpose, &hints);
Packit Service 1d8f1c
    if (purpose != context->purpose || hints != context->hints) {
Packit Service 1d8f1c
        GError *error;
Packit Service 1d8f1c
        gboolean retval;
Packit Service 1d8f1c
Packit Service 1d8f1c
        context->purpose = purpose;
Packit Service 1d8f1c
        context->hints = hints;
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (context->has_focus && context->engine)
Packit Service 1d8f1c
            bus_engine_proxy_set_content_type (context->engine,
Packit Service 1d8f1c
                                               purpose,
Packit Service 1d8f1c
                                               hints);
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (context->has_focus) {
Packit Service 1d8f1c
            g_signal_emit (context,
Packit Service 1d8f1c
                           context_signals[SET_CONTENT_TYPE],
Packit Service 1d8f1c
                           0,
Packit Service 1d8f1c
                           context->purpose,
Packit Service 1d8f1c
                           context->hints);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        error = NULL;
Packit Service 1d8f1c
        retval = bus_input_context_property_changed (context,
Packit Service 1d8f1c
                                                     "ContentType",
Packit Service 1d8f1c
                                                     value,
Packit Service 1d8f1c
                                                     &error);
Packit Service 1d8f1c
        if (!retval) {
Packit Service 1d8f1c
            g_warning ("Failed to emit PropertiesChanged signal: %s",
Packit Service 1d8f1c
                       error->message);
Packit Service 1d8f1c
            g_error_free (error);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
bus_input_context_service_set_property (IBusService     *service,
Packit Service 1d8f1c
                                        GDBusConnection *connection,
Packit Service 1d8f1c
                                        const gchar     *sender,
Packit Service 1d8f1c
                                        const gchar     *object_path,
Packit Service 1d8f1c
                                        const gchar     *interface_name,
Packit Service 1d8f1c
                                        const gchar     *property_name,
Packit Service 1d8f1c
                                        GVariant        *value,
Packit Service 1d8f1c
                                        GError         **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) {
Packit Service 1d8f1c
        return IBUS_SERVICE_CLASS (bus_input_context_parent_class)->
Packit Service 1d8f1c
            service_set_property (service,
Packit Service 1d8f1c
                                  connection,
Packit Service 1d8f1c
                                  sender,
Packit Service 1d8f1c
                                  object_path,
Packit Service 1d8f1c
                                  interface_name,
Packit Service 1d8f1c
                                  property_name,
Packit Service 1d8f1c
                                  value,
Packit Service 1d8f1c
                                  error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!bus_input_context_service_authorized_method (service, connection))
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (property_name, "ContentType") == 0) {
Packit Service 1d8f1c
        BusInputContext *context = (BusInputContext *) service;
Packit Service 1d8f1c
        _ic_set_content_type (context, value);
Packit Service 1d8f1c
        return TRUE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_val_if_reached (FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
bus_input_context_has_focus (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return context->has_focus;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_focus_in (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->has_focus)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->has_focus = TRUE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* To make sure that we won't use an old value left before we losing focus
Packit Service 1d8f1c
     * last time. */
Packit Service 1d8f1c
    context->prev_keyval = IBUS_KEY_VoidSymbol;
Packit Service 1d8f1c
    context->prev_modifiers = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_focus_in (context->engine);
Packit Service 1d8f1c
        bus_engine_proxy_enable (context->engine);
Packit Service 1d8f1c
        bus_engine_proxy_set_capabilities (context->engine, context->capabilities);
Packit Service 1d8f1c
        bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h);
Packit Service 1d8f1c
        bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        g_signal_emit (context, context_signals[FOCUS_IN], 0);
Packit Service 1d8f1c
        if (context->engine) {
Packit Service 1d8f1c
            /* if necessary, emit glib signals to the context object to update panel status. see the comment for PREEDIT_CONDITION
Packit Service 1d8f1c
             * for details. */
Packit Service 1d8f1c
            if (context->preedit_visible && !PREEDIT_CONDITION) {
Packit Service 1d8f1c
                g_signal_emit (context,
Packit Service 1d8f1c
                               context_signals[UPDATE_PREEDIT_TEXT],
Packit Service 1d8f1c
                               0,
Packit Service 1d8f1c
                               context->preedit_text,
Packit Service 1d8f1c
                               context->preedit_cursor_pos,
Packit Service 1d8f1c
                               context->preedit_visible);
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            if (context->auxiliary_visible && (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) {
Packit Service 1d8f1c
                g_signal_emit (context,
Packit Service 1d8f1c
                               context_signals[UPDATE_AUXILIARY_TEXT],
Packit Service 1d8f1c
                               0,
Packit Service 1d8f1c
                               context->auxiliary_text,
Packit Service 1d8f1c
                               context->auxiliary_visible);
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            if (context->lookup_table_visible && (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) {
Packit Service 1d8f1c
                g_signal_emit (context,
Packit Service 1d8f1c
                               context_signals[UPDATE_LOOKUP_TABLE],
Packit Service 1d8f1c
                               0,
Packit Service 1d8f1c
                               context->lookup_table,
Packit Service 1d8f1c
                               context->lookup_table_visible);
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_clear_preedit_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Clear context->preedit_text. If the preedit mode is IBUS_ENGINE_PREEDIT_COMMIT, commit it before clearing.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_clear_preedit_text (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->preedit_visible &&
Packit Service 1d8f1c
        context->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT) {
Packit Service 1d8f1c
        bus_input_context_commit_text (context, context->preedit_text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* always clear preedit text */
Packit Service 1d8f1c
    bus_input_context_update_preedit_text (context,
Packit Service 1d8f1c
        text_empty, 0, FALSE, IBUS_ENGINE_PREEDIT_CLEAR, TRUE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_focus_out (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!context->has_focus)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_clear_preedit_text (context);
Packit Service 1d8f1c
    bus_input_context_update_auxiliary_text (context, text_empty, FALSE);
Packit Service 1d8f1c
    bus_input_context_update_lookup_table (context,
Packit Service 1d8f1c
                                           lookup_table_empty,
Packit Service 1d8f1c
                                           FALSE,
Packit Service 1d8f1c
                                           FALSE);
Packit Service 1d8f1c
    bus_input_context_register_properties (context, props_empty);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_focus_out (context->engine);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->has_focus = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_FOCUS) {
Packit Service 1d8f1c
        g_signal_emit (context, context_signals[FOCUS_OUT], 0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#define DEFINE_FUNC(name)                                                   \
Packit Service 1d8f1c
    void                                                                    \
Packit Service 1d8f1c
    bus_input_context_##name (BusInputContext *context)                     \
Packit Service 1d8f1c
    {                                                                       \
Packit Service 1d8f1c
        g_assert (BUS_IS_INPUT_CONTEXT (context));                          \
Packit Service 1d8f1c
                                                                            \
Packit Service 1d8f1c
        if (context->is_extension_lookup_table &&                           \
Packit Service 1d8f1c
            context->emoji_extension) {                                     \
Packit Service 1d8f1c
            bus_panel_proxy_##name##_lookup_table (context->emoji_extension); \
Packit Service 1d8f1c
            return;                                                         \
Packit Service 1d8f1c
        }                                                                   \
Packit Service 1d8f1c
        if (context->has_focus && context->engine) {                        \
Packit Service 1d8f1c
            bus_engine_proxy_##name (context->engine);                      \
Packit Service 1d8f1c
        }                                                                   \
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
DEFINE_FUNC (page_up)
Packit Service 1d8f1c
DEFINE_FUNC (page_down)
Packit Service 1d8f1c
DEFINE_FUNC (cursor_up)
Packit Service 1d8f1c
DEFINE_FUNC (cursor_down)
Packit Service 1d8f1c
Packit Service 1d8f1c
#undef DEFINE_FUNC
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_candidate_clicked (BusInputContext *context,
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_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->is_extension_lookup_table && context->emoji_extension) {
Packit Service 1d8f1c
        bus_panel_proxy_candidate_clicked_lookup_table (
Packit Service 1d8f1c
                context->emoji_extension,
Packit Service 1d8f1c
                index,
Packit Service 1d8f1c
                button,
Packit Service 1d8f1c
                state);
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_candidate_clicked (context->engine,
Packit Service 1d8f1c
                                            index,
Packit Service 1d8f1c
                                            button,
Packit Service 1d8f1c
                                            state);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_property_activate (BusInputContext *context,
Packit Service 1d8f1c
                                     const gchar     *prop_name,
Packit Service 1d8f1c
                                     gint             prop_state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_property_activate (context->engine, prop_name, prop_state);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_show_preedit_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Show a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_show_preedit_text (BusInputContext *context,
Packit Service 1d8f1c
                                     gboolean         is_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->preedit_visible)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    if (!is_extension && context->emoji_extension)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!is_extension)
Packit Service 1d8f1c
        context->preedit_visible = TRUE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->emoji_extension && !is_extension) {
Packit Service 1d8f1c
        /* Do not use HIDE_PREEDIT_TEXT signal below but call
Packit Service 1d8f1c
         * bus_panel_proxy_hide_preedit_text() directly for the extension only
Packit Service 1d8f1c
         * but not for the normal panel.
Packit Service 1d8f1c
         */
Packit Service 1d8f1c
        bus_panel_proxy_show_preedit_text (context->emoji_extension);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (PREEDIT_CONDITION) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "ShowPreeditText",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[SHOW_PREEDIT_TEXT],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_hide_preedit_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Hide a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_hide_preedit_text (BusInputContext *context,
Packit Service 1d8f1c
                                     gboolean         is_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!is_extension && !context->preedit_visible)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!is_extension)
Packit Service 1d8f1c
        context->preedit_visible = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->emoji_extension && !is_extension) {
Packit Service 1d8f1c
        /* Do not use HIDE_PREEDIT_TEXT signal below but call
Packit Service 1d8f1c
         * bus_panel_proxy_hide_preedit_text() directly for the extension only
Packit Service 1d8f1c
         * but not for the normal panel.
Packit Service 1d8f1c
         */
Packit Service 1d8f1c
        bus_panel_proxy_hide_preedit_text (context->emoji_extension);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (PREEDIT_CONDITION) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "HidePreeditText",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[HIDE_PREEDIT_TEXT],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_update_auxiliary_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Update an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_update_auxiliary_text (BusInputContext *context,
Packit Service 1d8f1c
                                         IBusText        *text,
Packit Service 1d8f1c
                                         gboolean         visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->auxiliary_text) {
Packit Service 1d8f1c
        g_object_unref (context->auxiliary_text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->auxiliary_text = (IBusText *) g_object_ref_sink (text ? text : text_empty);
Packit Service 1d8f1c
    context->auxiliary_visible = visible;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "UpdateAuxiliaryText",
Packit Service 1d8f1c
                                       g_variant_new ("(vb)", variant, visible),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[UPDATE_AUXILIARY_TEXT],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       context->auxiliary_text,
Packit Service 1d8f1c
                       context->auxiliary_visible);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_show_auxiliary_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Show an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_show_auxiliary_text (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->auxiliary_visible) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->auxiliary_visible = TRUE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "ShowAuxiliaryText",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[SHOW_AUXILIARY_TEXT],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_hide_auxiliary_text:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Hide an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_hide_auxiliary_text (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!context->auxiliary_visible) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->auxiliary_visible = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "HideAuxiliaryText",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[HIDE_AUXILIARY_TEXT],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_update_lookup_table:
Packit Service 1d8f1c
 * @context: #BusInputContext
Packit Service 1d8f1c
 * @table: #IBusLookupTable
Packit Service 1d8f1c
 * @visible: %TRUE if the lookup table is visible, otherwise %FALSE.
Packit Service 1d8f1c
 * @is_extension: %TRUE if the lookup table is called by a panel extension.
Packit Service 1d8f1c
 *                %FALSE if it's called by an engine.
Packit Service 1d8f1c
 * I.e. is_extension_lookup_table means the owner of the lookup table.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_update_lookup_table (BusInputContext *context,
Packit Service 1d8f1c
                                       IBusLookupTable *table,
Packit Service 1d8f1c
                                       gboolean         visible,
Packit Service 1d8f1c
                                       gboolean         is_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->is_extension_lookup_table = is_extension;
Packit Service 1d8f1c
    if (context->lookup_table) {
Packit Service 1d8f1c
        g_object_unref (context->lookup_table);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->lookup_table = (IBusLookupTable *) g_object_ref_sink (table ? table : lookup_table_empty);
Packit Service 1d8f1c
    context->lookup_table_visible = visible;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)table);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "UpdateLookupTable",
Packit Service 1d8f1c
                                       g_variant_new ("(vb)", variant, visible),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[UPDATE_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       context->lookup_table,
Packit Service 1d8f1c
                       context->lookup_table_visible);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_show_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Show the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_show_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->lookup_table_visible) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->lookup_table_visible = TRUE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "ShowLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[SHOW_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_hide_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Hide the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_hide_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!context->lookup_table_visible) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->lookup_table_visible = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "HideLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[HIDE_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_page_up_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_page_up_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!ibus_lookup_table_page_up (context->lookup_table)) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "PageUpLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[PAGE_UP_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_page_down_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_page_down_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!ibus_lookup_table_page_down (context->lookup_table)) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "PageDownLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[PAGE_DOWN_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_cursor_up_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_cursor_up_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!ibus_lookup_table_cursor_up (context->lookup_table)) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "CursorUpLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[CURSOR_UP_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_cursor_down_lookup_table:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_cursor_down_lookup_table (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!ibus_lookup_table_cursor_down (context->lookup_table)) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "CursorDownLookupTable",
Packit Service 1d8f1c
                                       NULL,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[CURSOR_DOWN_LOOKUP_TABLE],
Packit Service 1d8f1c
                       0);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_register_properties:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Register properties. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_register_properties (BusInputContext *context,
Packit Service 1d8f1c
                                       IBusPropList    *props)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROP_LIST (props));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_PROPERTY) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)props);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "RegisterProperties",
Packit Service 1d8f1c
                                       g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[REGISTER_PROPERTIES],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       props);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * bus_input_context_update_property:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Update property. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_update_property (BusInputContext *context,
Packit Service 1d8f1c
                                   IBusProperty    *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities & IBUS_CAP_PROPERTY) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "UpdateProperty",
Packit Service 1d8f1c
                                       g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[UPDATE_PROPERTY],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       prop);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_destroy_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "destroy" glib signal is sent to the engine object.
Packit Service 1d8f1c
 * Remove the engine from the context.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_destroy_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                    BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_set_engine (context, NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_commit_text_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "commit-text" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_commit_text_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                        IBusText        *text,
Packit Service 1d8f1c
                        BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (text != NULL);
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_commit_text (context, text);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_forward_key_event_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "forward-key-event" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_forward_key_event_cb (BusEngineProxy    *engine,
Packit Service 1d8f1c
                              guint              keyval,
Packit Service 1d8f1c
                              guint              keycode,
Packit Service 1d8f1c
                              guint              state,
Packit Service 1d8f1c
                              BusInputContext   *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                   "ForwardKeyEvent",
Packit Service 1d8f1c
                                   g_variant_new ("(uuu)", keyval, keycode, state),
Packit Service 1d8f1c
                                   NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_delete_surrounding_text_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "delete-surrounding-text" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_delete_surrounding_text_cb (BusEngineProxy    *engine,
Packit Service 1d8f1c
                                    gint               offset_from_cursor,
Packit Service 1d8f1c
                                    guint              nchars,
Packit Service 1d8f1c
                                    BusInputContext   *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                   "DeleteSurroundingText",
Packit Service 1d8f1c
                                   g_variant_new ("(iu)", offset_from_cursor, nchars),
Packit Service 1d8f1c
                                   NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_require_surrounding_text_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "require-surrounding-text" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_require_surrounding_text_cb (BusEngineProxy    *engine,
Packit Service 1d8f1c
                                     BusInputContext   *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                   "RequireSurroundingText",
Packit Service 1d8f1c
                                   NULL,
Packit Service 1d8f1c
                                   NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_update_preedit_text_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "update-preedit-text" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_update_preedit_text_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                                IBusText        *text,
Packit Service 1d8f1c
                                guint            cursor_pos,
Packit Service 1d8f1c
                                gboolean         visible,
Packit Service 1d8f1c
                                guint            mode,
Packit Service 1d8f1c
                                BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_TEXT (text));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_update_preedit_text (context, text,
Packit Service 1d8f1c
                                           cursor_pos, visible, mode,
Packit Service 1d8f1c
                                           TRUE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_update_auxiliary_text_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "update-auxiliary-text" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_update_auxiliary_text_cb (BusEngineProxy   *engine,
Packit Service 1d8f1c
                                  IBusText         *text,
Packit Service 1d8f1c
                                  gboolean          visible,
Packit Service 1d8f1c
                                  BusInputContext  *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_TEXT (text));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_update_auxiliary_text (context, text, visible);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_update_lookup_table_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "update-lookup-table" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_update_lookup_table_cb (BusEngineProxy   *engine,
Packit Service 1d8f1c
                                IBusLookupTable  *table,
Packit Service 1d8f1c
                                gboolean          visible,
Packit Service 1d8f1c
                                BusInputContext  *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_LOOKUP_TABLE (table));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_update_lookup_table (context, table, visible, FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_register_properties_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "register-properties" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_register_properties_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                                IBusPropList    *props,
Packit Service 1d8f1c
                                BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROP_LIST (props));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_register_properties (context, props);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_update_property_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "update-property" glib signal is sent to the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_update_property_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                            IBusProperty    *prop,
Packit Service 1d8f1c
                            BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_update_property (context, prop);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * _engine_panel_extension_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A function to be called when "panel-extension" glib signal is sent
Packit Service 1d8f1c
 * from the engine object.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_panel_extension_cb (BusEngineProxy     *engine,
Packit Service 1d8f1c
                            IBusExtensionEvent *event,
Packit Service 1d8f1c
                            BusInputContext    *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_signal_emit (context, context_signals[PANEL_EXTENSION], 0, event);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_show_preedit_text_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                              BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_show_preedit_text (context, FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
_engine_hide_preedit_text_cb (BusEngineProxy  *engine,
Packit Service 1d8f1c
                              BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_ENGINE_PROXY (engine));
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (context->engine == engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_hide_preedit_text (context, FALSE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#define DEFINE_FUNCTION(name)                                   \
Packit Service 1d8f1c
    static void                                                 \
Packit Service 1d8f1c
    _engine_##name##_cb (BusEngineProxy   *engine,              \
Packit Service 1d8f1c
                         BusInputContext *context)              \
Packit Service 1d8f1c
    {                                                           \
Packit Service 1d8f1c
        g_assert (BUS_IS_ENGINE_PROXY (engine));                \
Packit Service 1d8f1c
        g_assert (BUS_IS_INPUT_CONTEXT (context));              \
Packit Service 1d8f1c
                                                                \
Packit Service 1d8f1c
        g_assert (context->engine == engine);                   \
Packit Service 1d8f1c
                                                                \
Packit Service 1d8f1c
        bus_input_context_##name (context);                     \
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
DEFINE_FUNCTION (show_auxiliary_text)
Packit Service 1d8f1c
DEFINE_FUNCTION (hide_auxiliary_text)
Packit Service 1d8f1c
DEFINE_FUNCTION (show_lookup_table)
Packit Service 1d8f1c
DEFINE_FUNCTION (hide_lookup_table)
Packit Service 1d8f1c
DEFINE_FUNCTION (page_up_lookup_table)
Packit Service 1d8f1c
DEFINE_FUNCTION (page_down_lookup_table)
Packit Service 1d8f1c
DEFINE_FUNCTION (cursor_up_lookup_table)
Packit Service 1d8f1c
DEFINE_FUNCTION (cursor_down_lookup_table)
Packit Service 1d8f1c
#undef DEFINE_FUNCTION
Packit Service 1d8f1c
Packit Service 1d8f1c
BusInputContext *
Packit Service 1d8f1c
bus_input_context_new (BusConnection    *connection,
Packit Service 1d8f1c
                       const gchar      *client)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    static guint id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (connection == NULL || BUS_IS_CONNECTION (connection));
Packit Service 1d8f1c
    g_assert (client != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gchar *path = g_strdup_printf (IBUS_PATH_INPUT_CONTEXT, ++id);
Packit Service 1d8f1c
Packit Service 1d8f1c
    BusInputContext *context = NULL;
Packit Service 1d8f1c
    if (connection) {
Packit Service 1d8f1c
        context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT,
Packit Service 1d8f1c
                                                    "object-path", path,
Packit Service 1d8f1c
                                                    "connection", bus_connection_get_dbus_connection (connection),
Packit Service 1d8f1c
                                                    NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT,
Packit Service 1d8f1c
                                                    "object-path", path,
Packit Service 1d8f1c
                                                    NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_free (path);
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->client = g_strdup (client);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* it is a fake input context, just need process hotkey */
Packit Service 1d8f1c
    context->fake = (strncmp (client, "fake", 4) == 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (connection) {
Packit Service 1d8f1c
        g_object_ref_sink (connection);
Packit Service 1d8f1c
        context->connection = connection;
Packit Service 1d8f1c
        g_signal_connect (context->connection,
Packit Service 1d8f1c
                          "destroy",
Packit Service 1d8f1c
                          (GCallback) _connection_destroy_cb,
Packit Service 1d8f1c
                          context);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return context;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_enable (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!context->has_focus) {
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine == NULL) {
Packit Service 1d8f1c
        IBusEngineDesc *desc = NULL;
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[REQUEST_ENGINE], 0,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       &desc);
Packit Service 1d8f1c
        if (desc != NULL) {
Packit Service 1d8f1c
            bus_input_context_set_engine_by_desc (context,
Packit Service 1d8f1c
                            desc,
Packit Service 1d8f1c
                            g_gdbus_timeout, /* timeout in msec. */
Packit Service 1d8f1c
                            NULL, /* we do not cancel the call. */
Packit Service 1d8f1c
                            NULL, /* use the default callback function. */
Packit Service 1d8f1c
                            NULL);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine == NULL)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_engine_proxy_focus_in (context->engine);
Packit Service 1d8f1c
    bus_engine_proxy_enable (context->engine);
Packit Service 1d8f1c
    bus_engine_proxy_set_capabilities (context->engine, context->capabilities);
Packit Service 1d8f1c
    bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h);
Packit Service 1d8f1c
    bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_disable (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_clear_preedit_text (context);
Packit Service 1d8f1c
    bus_input_context_update_auxiliary_text (context, text_empty, FALSE);
Packit Service 1d8f1c
    bus_input_context_update_lookup_table (context,
Packit Service 1d8f1c
                                           lookup_table_empty,
Packit Service 1d8f1c
                                           FALSE,
Packit Service 1d8f1c
                                           FALSE);
Packit Service 1d8f1c
    bus_input_context_register_properties (context, props_empty);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        bus_engine_proxy_focus_out (context->engine);
Packit Service 1d8f1c
        bus_engine_proxy_disable (context->engine);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/* A list of signals (and their handler functions) that could be emit by the engine proxy object. */
Packit Service 1d8f1c
const static struct {
Packit Service 1d8f1c
    const gchar *name;
Packit Service 1d8f1c
    GCallback    callback;
Packit Service 1d8f1c
} engine_signals [] = {
Packit Service 1d8f1c
    { "commit-text",              G_CALLBACK (_engine_commit_text_cb) },
Packit Service 1d8f1c
    { "forward-key-event",        G_CALLBACK (_engine_forward_key_event_cb) },
Packit Service 1d8f1c
    { "delete-surrounding-text",  G_CALLBACK (_engine_delete_surrounding_text_cb) },
Packit Service 1d8f1c
    { "require-surrounding-text", G_CALLBACK (_engine_require_surrounding_text_cb) },
Packit Service 1d8f1c
    { "update-preedit-text",      G_CALLBACK (_engine_update_preedit_text_cb) },
Packit Service 1d8f1c
    { "show-preedit-text",        G_CALLBACK (_engine_show_preedit_text_cb) },
Packit Service 1d8f1c
    { "hide-preedit-text",        G_CALLBACK (_engine_hide_preedit_text_cb) },
Packit Service 1d8f1c
    { "update-auxiliary-text",    G_CALLBACK (_engine_update_auxiliary_text_cb) },
Packit Service 1d8f1c
    { "show-auxiliary-text",      G_CALLBACK (_engine_show_auxiliary_text_cb) },
Packit Service 1d8f1c
    { "hide-auxiliary-text",      G_CALLBACK (_engine_hide_auxiliary_text_cb) },
Packit Service 1d8f1c
    { "update-lookup-table",      G_CALLBACK (_engine_update_lookup_table_cb) },
Packit Service 1d8f1c
    { "show-lookup-table",        G_CALLBACK (_engine_show_lookup_table_cb) },
Packit Service 1d8f1c
    { "hide-lookup-table",        G_CALLBACK (_engine_hide_lookup_table_cb) },
Packit Service 1d8f1c
    { "page-up-lookup-table",     G_CALLBACK (_engine_page_up_lookup_table_cb) },
Packit Service 1d8f1c
    { "page-down-lookup-table",   G_CALLBACK (_engine_page_down_lookup_table_cb) },
Packit Service 1d8f1c
    { "cursor-up-lookup-table",   G_CALLBACK (_engine_cursor_up_lookup_table_cb) },
Packit Service 1d8f1c
    { "cursor-down-lookup-table", G_CALLBACK (_engine_cursor_down_lookup_table_cb) },
Packit Service 1d8f1c
    { "register-properties",      G_CALLBACK (_engine_register_properties_cb) },
Packit Service 1d8f1c
    { "update-property",          G_CALLBACK (_engine_update_property_cb) },
Packit Service 1d8f1c
    { "panel-extension",          G_CALLBACK (_engine_panel_extension_cb) },
Packit Service 1d8f1c
    { "destroy",                  G_CALLBACK (_engine_destroy_cb) }
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
bus_input_context_unset_engine (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus_input_context_clear_preedit_text (context);
Packit Service 1d8f1c
    bus_input_context_update_auxiliary_text (context, text_empty, FALSE);
Packit Service 1d8f1c
    bus_input_context_update_lookup_table (context,
Packit Service 1d8f1c
                                           lookup_table_empty,
Packit Service 1d8f1c
                                           FALSE,
Packit Service 1d8f1c
                                           FALSE);
Packit Service 1d8f1c
    bus_input_context_register_properties (context, props_empty);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine) {
Packit Service 1d8f1c
        gint i;
Packit Service 1d8f1c
        /* uninstall signal handlers for the engine. */
Packit Service 1d8f1c
        for (i = 0; i < G_N_ELEMENTS(engine_signals); i++) {
Packit Service 1d8f1c
            g_signal_handlers_disconnect_by_func (context->engine,
Packit Service 1d8f1c
                    engine_signals[i].callback, context);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /* focus out engine so that the next call of
Packit Service 1d8f1c
           bus_engine_proxy_focus_in() will take effect and trigger
Packit Service 1d8f1c
           RegisterProperties. */
Packit Service 1d8f1c
        bus_engine_proxy_focus_out (context->engine);
Packit Service 1d8f1c
        g_object_unref (context->engine);
Packit Service 1d8f1c
        context->engine = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_set_engine (BusInputContext *context,
Packit Service 1d8f1c
                              BusEngineProxy  *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine == engine)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->engine != NULL) {
Packit Service 1d8f1c
        bus_input_context_unset_engine (context);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine == NULL) {
Packit Service 1d8f1c
        bus_input_context_disable (context);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        gint i;
Packit Service 1d8f1c
        context->engine = engine;
Packit Service 1d8f1c
        g_object_ref (context->engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* handle signals from the engine. */
Packit Service 1d8f1c
        for (i = 0; i < G_N_ELEMENTS(engine_signals); i++) {
Packit Service 1d8f1c
            g_signal_connect (context->engine,
Packit Service 1d8f1c
                              engine_signals[i].name,
Packit Service 1d8f1c
                              engine_signals[i].callback,
Packit Service 1d8f1c
                              context);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (context->has_focus) {
Packit Service 1d8f1c
            bus_engine_proxy_focus_in (context->engine);
Packit Service 1d8f1c
            bus_engine_proxy_enable (context->engine);
Packit Service 1d8f1c
            bus_engine_proxy_set_capabilities (context->engine, context->capabilities);
Packit Service 1d8f1c
            bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h);
Packit Service 1d8f1c
            bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_signal_emit (context,
Packit Service 1d8f1c
                   context_signals[ENGINE_CHANGED],
Packit Service 1d8f1c
                   0);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void set_engine_by_desc_data_free (SetEngineByDescData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (data->context != NULL) {
Packit Service 1d8f1c
        if (data->context->data == data)
Packit Service 1d8f1c
            data->context->data = NULL;
Packit Service 1d8f1c
        g_object_unref (data->context);
Packit Service 1d8f1c
    }
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->cancellable != NULL)
Packit Service 1d8f1c
        g_object_unref (data->cancellable);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->origin_cancellable != NULL) {
Packit Service 1d8f1c
        if (data->cancelled_handler_id != 0)
Packit Service 1d8f1c
            g_cancellable_disconnect (data->origin_cancellable,
Packit Service 1d8f1c
                data->cancelled_handler_id);
Packit Service 1d8f1c
        g_object_unref (data->origin_cancellable);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_slice_free (SetEngineByDescData, data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * new_engine_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A callback function to be called when bus_engine_proxy_new() is finished.
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
new_engine_cb (GObject             *obj,
Packit Service 1d8f1c
               GAsyncResult        *res,
Packit Service 1d8f1c
               SetEngineByDescData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    BusEngineProxy *engine = bus_engine_proxy_new_finish (res, &error);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine == NULL) {
Packit Service 1d8f1c
        g_task_return_error (data->task, error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else {
Packit Service 1d8f1c
        if (data->context->data != data) {
Packit Service 1d8f1c
            /* Request has been overriden or cancelled */
Packit Service 1d8f1c
            g_object_unref (engine);
Packit Service 1d8f1c
            g_task_return_new_error (data->task,
Packit Service 1d8f1c
                                     G_IO_ERROR,
Packit Service 1d8f1c
                                     G_IO_ERROR_CANCELLED,
Packit Service 1d8f1c
                                     "Opertation was cancelled");
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        else {
Packit Service 1d8f1c
            /* Let BusEngineProxy call a Disable signal. */
Packit Service 1d8f1c
            bus_input_context_disable (data->context);
Packit Service 1d8f1c
            bus_input_context_set_engine (data->context, engine);
Packit Service 1d8f1c
            g_object_unref (engine);
Packit Service 1d8f1c
            bus_input_context_enable (data->context);
Packit Service 1d8f1c
            g_task_return_boolean (data->task, TRUE);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    set_engine_by_desc_data_free (data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
cancel_set_engine_by_desc (SetEngineByDescData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    if (data->context->data == data)
Packit Service 1d8f1c
        data->context->data = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->origin_cancellable != NULL) {
Packit Service 1d8f1c
        if (data->cancelled_handler_id != 0) {
Packit Service 1d8f1c
            g_cancellable_disconnect (data->origin_cancellable,
Packit Service 1d8f1c
                                      data->cancelled_handler_id);
Packit Service 1d8f1c
            data->cancelled_handler_id = 0;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_object_unref (data->origin_cancellable);
Packit Service 1d8f1c
        data->origin_cancellable = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (data->cancellable != NULL) {
Packit Service 1d8f1c
        g_cancellable_cancel (data->cancellable);
Packit Service 1d8f1c
        g_object_unref (data->cancellable);
Packit Service 1d8f1c
        data->cancellable = NULL;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
set_engine_by_desc_cancelled_idle_cb (SetEngineByDescData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    cancel_set_engine_by_desc (data);
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
set_engine_by_desc_cancelled_cb (GCancellable        *cancellable,
Packit Service 1d8f1c
                                 SetEngineByDescData *data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    /* Cancel in idle to avoid deadlock */
Packit Service 1d8f1c
    g_idle_add ((GSourceFunc) set_engine_by_desc_cancelled_idle_cb, data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
/**
Packit Service 1d8f1c
 * set_engine_by_desc_ready_cb:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * A default callback function for bus_input_context_set_engine_by_desc().
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
set_engine_by_desc_ready_cb (BusInputContext *context,
Packit Service 1d8f1c
                             GAsyncResult    *res,
Packit Service 1d8f1c
                             gpointer         user_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GError *error = NULL;
Packit Service 1d8f1c
    if (!bus_input_context_set_engine_by_desc_finish (context, res, &error)) {
Packit Service 1d8f1c
        g_warning ("Set context engine failed: %s", error->message);
Packit Service 1d8f1c
        g_error_free (error);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_set_engine_by_desc (BusInputContext    *context,
Packit Service 1d8f1c
                                      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
    SetEngineByDescData *data;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    g_assert (IBUS_IS_ENGINE_DESC (desc));
Packit Service 1d8f1c
    g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->data != NULL) {
Packit Service 1d8f1c
        /* Cancel previous set_engine_by_desc() request */
Packit Service 1d8f1c
        cancel_set_engine_by_desc (context->data);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Previous request must be completed or cancelled */
Packit Service 1d8f1c
    g_assert (context->data == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (callback == NULL)
Packit Service 1d8f1c
        callback = (GAsyncReadyCallback) set_engine_by_desc_ready_cb;
Packit Service 1d8f1c
Packit Service 1d8f1c
    task = g_task_new (context, cancellable, callback, user_data);
Packit Service 1d8f1c
    g_task_set_source_tag (task, bus_input_context_set_engine_by_desc);
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_IO_ERROR,
Packit Service 1d8f1c
                                 G_IO_ERROR_CANCELLED,
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
    data = g_slice_new0 (SetEngineByDescData);
Packit Service 1d8f1c
    context->data = data;
Packit Service 1d8f1c
    data->context = context;
Packit Service 1d8f1c
    g_object_ref (context);
Packit Service 1d8f1c
    data->task = task;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (cancellable != NULL) {
Packit Service 1d8f1c
        data->origin_cancellable = cancellable;
Packit Service 1d8f1c
        g_object_ref (cancellable);
Packit Service 1d8f1c
        data->cancelled_handler_id =
Packit Service 1d8f1c
                g_cancellable_connect (data->origin_cancellable,
Packit Service 1d8f1c
                                       (GCallback) set_engine_by_desc_cancelled_cb,
Packit Service 1d8f1c
                                       data,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    data->cancellable = g_cancellable_new ();
Packit Service 1d8f1c
    /* We can cancel the bus_engine_proxy_new() call by data->cancellable;
Packit Service 1d8f1c
     * See cancel_set_engine_by_desc() and set_engine_by_desc_cancelled_cb(). */
Packit Service 1d8f1c
    bus_engine_proxy_new (desc,
Packit Service 1d8f1c
                          timeout,
Packit Service 1d8f1c
                          data->cancellable,
Packit Service 1d8f1c
                          (GAsyncReadyCallback) new_engine_cb,
Packit Service 1d8f1c
                          data);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
gboolean
Packit Service 1d8f1c
bus_input_context_set_engine_by_desc_finish (BusInputContext  *context,
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
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    g_assert (g_task_is_valid (res, context));
Packit Service 1d8f1c
    task = G_TASK (res);
Packit Service 1d8f1c
    g_assert (g_task_get_source_tag (task) ==
Packit Service 1d8f1c
                bus_input_context_set_engine_by_desc);
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
    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
BusEngineProxy *
Packit Service 1d8f1c
bus_input_context_get_engine (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return context->engine;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngineDesc *
Packit Service 1d8f1c
bus_input_context_get_engine_desc (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    if (context->engine)
Packit Service 1d8f1c
        return bus_engine_proxy_get_desc (context->engine);
Packit Service 1d8f1c
    return NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
guint
Packit Service 1d8f1c
bus_input_context_get_capabilities (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    return context->capabilities;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_set_capabilities (BusInputContext    *context,
Packit Service 1d8f1c
                                    guint               capabilities)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* If the context does not support IBUS_CAP_FOCUS, then the client application have to handle all information such as
Packit Service 1d8f1c
     * preedit and auxiliary text. */
Packit Service 1d8f1c
    if ((capabilities & IBUS_CAP_FOCUS) == 0) {
Packit Service 1d8f1c
        capabilities |= (IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_AUXILIARY_TEXT | IBUS_CAP_LOOKUP_TABLE | IBUS_CAP_PROPERTY);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->capabilities != capabilities) {
Packit Service 1d8f1c
        context->capabilities = capabilities;
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* If the context does not support IBUS_CAP_FOCUS, then we always assume
Packit Service 1d8f1c
         * it has focus. */
Packit Service 1d8f1c
        if ((capabilities & IBUS_CAP_FOCUS) == 0) {
Packit Service 1d8f1c
            bus_input_context_focus_in (context);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (context->engine) {
Packit Service 1d8f1c
            bus_engine_proxy_set_capabilities (context->engine, capabilities);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->capabilities = capabilities;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
const gchar *
Packit Service 1d8f1c
bus_input_context_get_client (BusInputContext *context)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    return context->client;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_get_content_type (BusInputContext *context,
Packit Service 1d8f1c
                                    guint           *purpose,
Packit Service 1d8f1c
                                    guint           *hints)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
    g_return_if_fail (purpose != NULL && hints != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    *purpose = context->purpose;
Packit Service 1d8f1c
    *hints = context->hints;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_set_content_type (BusInputContext *context,
Packit Service 1d8f1c
                                    guint            purpose,
Packit Service 1d8f1c
                                    guint            hints)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GVariant *value;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    value = g_variant_ref_sink (g_variant_new ("(uu)", purpose, hints));
Packit Service 1d8f1c
    _ic_set_content_type (context, value);
Packit Service 1d8f1c
    g_variant_unref (value);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_commit_text_use_extension (BusInputContext *context,
Packit Service 1d8f1c
                                             IBusText        *text,
Packit Service 1d8f1c
                                             gboolean         use_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (text == text_empty || text == NULL)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (use_extension && context->emoji_extension) {
Packit Service 1d8f1c
        bus_panel_proxy_commit_text_received (context->emoji_extension, text);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize (
Packit Service 1d8f1c
                (IBusSerializable *)text);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "CommitText",
Packit Service 1d8f1c
                                       g_variant_new ("(v)", variant),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_commit_text (BusInputContext *context,
Packit Service 1d8f1c
                               IBusText        *text)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    bus_input_context_commit_text_use_extension (context, text, TRUE);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_update_preedit_text (BusInputContext *context,
Packit Service 1d8f1c
                                       IBusText        *text,
Packit Service 1d8f1c
                                       guint            cursor_pos,
Packit Service 1d8f1c
                                       gboolean         visible,
Packit Service 1d8f1c
                                       guint            mode,
Packit Service 1d8f1c
                                       gboolean         use_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    gboolean extension_visible = FALSE;
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->preedit_text) {
Packit Service 1d8f1c
        g_object_unref (context->preedit_text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    context->preedit_text = (IBusText *) g_object_ref_sink (text ? text :
Packit Service 1d8f1c
                                                            text_empty);
Packit Service 1d8f1c
    context->preedit_cursor_pos = cursor_pos;
Packit Service 1d8f1c
    if (use_extension)
Packit Service 1d8f1c
        context->preedit_visible = visible;
Packit Service 1d8f1c
    if (use_extension)
Packit Service 1d8f1c
        context->preedit_mode = mode;
Packit Service 1d8f1c
    extension_visible = context->preedit_visible |
Packit Service 1d8f1c
                        (context->emoji_extension != NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (use_extension && context->emoji_extension) {
Packit Service 1d8f1c
        bus_panel_proxy_update_preedit_text (context->emoji_extension,
Packit Service 1d8f1c
                                             context->preedit_text,
Packit Service 1d8f1c
                                             context->preedit_cursor_pos,
Packit Service 1d8f1c
                                             context->preedit_visible);
Packit Service 1d8f1c
    } else if (PREEDIT_CONDITION) {
Packit Service 1d8f1c
        GVariant *variant = ibus_serializable_serialize (
Packit Service 1d8f1c
                (IBusSerializable *)context->preedit_text);
Packit Service 1d8f1c
        bus_input_context_emit_signal (context,
Packit Service 1d8f1c
                                       "UpdatePreeditText",
Packit Service 1d8f1c
                                       g_variant_new (
Packit Service 1d8f1c
                                               "(vub)",
Packit Service 1d8f1c
                                               variant,
Packit Service 1d8f1c
                                               context->preedit_cursor_pos,
Packit Service 1d8f1c
                                               extension_visible),
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        g_signal_emit (context,
Packit Service 1d8f1c
                       context_signals[UPDATE_PREEDIT_TEXT],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       context->preedit_text,
Packit Service 1d8f1c
                       context->preedit_cursor_pos,
Packit Service 1d8f1c
                       extension_visible);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_set_emoji_extension (BusInputContext *context,
Packit Service 1d8f1c
                                       BusPanelProxy   *emoji_extension)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (context->emoji_extension)
Packit Service 1d8f1c
        g_object_unref (context->emoji_extension);
Packit Service 1d8f1c
    context->emoji_extension = emoji_extension;
Packit Service 1d8f1c
    if (emoji_extension) {
Packit Service 1d8f1c
        g_object_ref (context->emoji_extension);
Packit Service 1d8f1c
        if (!context->connection)
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        bus_input_context_show_preedit_text (context, TRUE);
Packit Service 1d8f1c
        bus_panel_proxy_set_cursor_location (context->emoji_extension,
Packit Service 1d8f1c
                                             context->x,
Packit Service 1d8f1c
                                             context->y,
Packit Service 1d8f1c
                                             context->w,
Packit Service 1d8f1c
                                             context->h);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        if (!context->connection)
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        /* https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/113
Packit Service 1d8f1c
         * Cannot use bus_input_context_hide_preedit_text () yet.
Packit Service 1d8f1c
         */
Packit Service 1d8f1c
        if (!context->preedit_visible) {
Packit Service 1d8f1c
            bus_input_context_update_preedit_text (context,
Packit Service 1d8f1c
                                                   text_empty,
Packit Service 1d8f1c
                                                   0,
Packit Service 1d8f1c
                                                   FALSE,
Packit Service 1d8f1c
                                                   IBUS_ENGINE_PREEDIT_CLEAR,
Packit Service 1d8f1c
                                                   FALSE);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
bus_input_context_panel_extension_received (BusInputContext    *context,
Packit Service 1d8f1c
                                            IBusExtensionEvent *event)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (BUS_IS_INPUT_CONTEXT (context));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!context->engine)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    bus_engine_proxy_panel_extension_received (context->engine, event);
Packit Service 1d8f1c
}