Blame src/ibusengine.c

Packit Service 1d8f1c
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit Service 1d8f1c
/* vim:set et sts=4: */
Packit Service 1d8f1c
/* ibus - The Input Bus
Packit Service 1d8f1c
 * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
Packit Service 1d8f1c
 * Copyright (C) 2008-2018 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 <stdarg.h>
Packit Service 1d8f1c
#include <string.h>
Packit Service 1d8f1c
Packit Service 1d8f1c
#include "ibusaccelgroup.h"
Packit Service 1d8f1c
#include "ibusengine.h"
Packit Service 1d8f1c
#include "ibuskeysyms.h"
Packit Service 1d8f1c
#include "ibusmarshalers.h"
Packit Service 1d8f1c
#include "ibusinternal.h"
Packit Service 1d8f1c
#include "ibusshare.h"
Packit Service 1d8f1c
#include "ibusxevent.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
#define IBUS_ENGINE_GET_PRIVATE(o)  \
Packit Service 1d8f1c
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE, IBusEnginePrivate))
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    PROCESS_KEY_EVENT,
Packit Service 1d8f1c
    FOCUS_IN,
Packit Service 1d8f1c
    FOCUS_OUT,
Packit Service 1d8f1c
    RESET,
Packit Service 1d8f1c
    ENABLE,
Packit Service 1d8f1c
    DISABLE,
Packit Service 1d8f1c
    SET_CURSOR_LOCATION,
Packit Service 1d8f1c
    SET_CAPABILITIES,
Packit Service 1d8f1c
    PAGE_UP,
Packit Service 1d8f1c
    PAGE_DOWN,
Packit Service 1d8f1c
    CURSOR_UP,
Packit Service 1d8f1c
    CURSOR_DOWN,
Packit Service 1d8f1c
    PROPERTY_ACTIVATE,
Packit Service 1d8f1c
    PROPERTY_SHOW,
Packit Service 1d8f1c
    PROPERTY_HIDE,
Packit Service 1d8f1c
    CANDIDATE_CLICKED,
Packit Service 1d8f1c
    SET_SURROUNDING_TEXT,
Packit Service 1d8f1c
    PROCESS_HAND_WRITING_EVENT,
Packit Service 1d8f1c
    CANCEL_HAND_WRITING,
Packit Service 1d8f1c
    SET_CONTENT_TYPE,
Packit Service 1d8f1c
    LAST_SIGNAL,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
enum {
Packit Service 1d8f1c
    PROP_0,
Packit Service 1d8f1c
    PROP_ENGINE_NAME,
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
/* IBusEnginePriv */
Packit Service 1d8f1c
struct _IBusEnginePrivate {
Packit Service 1d8f1c
    gchar *engine_name;
Packit Service 1d8f1c
    GDBusConnection *connection;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* cached surrounding text (see also IBusInputContextPrivate and
Packit Service 1d8f1c
       BusEngineProxy) */
Packit Service 1d8f1c
    IBusText *surrounding_text;
Packit Service 1d8f1c
    guint surrounding_cursor_pos;
Packit Service 1d8f1c
    guint selection_anchor_pos;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* cached content-type */
Packit Service 1d8f1c
    guint content_purpose;
Packit Service 1d8f1c
    guint content_hints;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GHashTable            *extension_keybindings;
Packit Service 1d8f1c
    gboolean               enable_extension;
Packit Service 1d8f1c
    gchar                 *current_extension_name;
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
static guint            engine_signals[LAST_SIGNAL] = { 0 };
Packit Service 1d8f1c
Packit Service 1d8f1c
static IBusText *text_empty;
Packit Service 1d8f1c
Packit Service 1d8f1c
/* functions prototype */
Packit Service 1d8f1c
static void      ibus_engine_destroy         (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_set_property    (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               prop_id,
Packit Service 1d8f1c
                                              const GValue       *value,
Packit Service 1d8f1c
                                              GParamSpec         *pspec);
Packit Service 1d8f1c
static void      ibus_engine_get_property    (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               prop_id,
Packit Service 1d8f1c
                                              GValue             *value,
Packit Service 1d8f1c
                                              GParamSpec         *pspec);
Packit Service 1d8f1c
static void      ibus_engine_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
Packit Service 1d8f1c
                                                                  *invocation);
Packit Service 1d8f1c
static GVariant *ibus_engine_service_get_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
                                              GError            **error);
Packit Service 1d8f1c
static gboolean  ibus_engine_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 gboolean  ibus_engine_process_key_event
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               keyval,
Packit Service 1d8f1c
                                              guint               keycode,
Packit Service 1d8f1c
                                              guint               state);
Packit Service 1d8f1c
static void      ibus_engine_focus_in        (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_focus_out       (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_reset           (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_enable          (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_disable         (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_set_cursor_location
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              gint                x,
Packit Service 1d8f1c
                                              gint                y,
Packit Service 1d8f1c
                                              gint                w,
Packit Service 1d8f1c
                                              gint                h);
Packit Service 1d8f1c
static void      ibus_engine_set_capabilities
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               caps);
Packit Service 1d8f1c
static void      ibus_engine_page_up         (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_page_down       (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_cursor_up       (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_cursor_down     (IBusEngine         *engine);
Packit Service 1d8f1c
static void      ibus_engine_candidate_clicked
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               index,
Packit Service 1d8f1c
                                              guint               button,
Packit Service 1d8f1c
                                              guint               state);
Packit Service 1d8f1c
static void      ibus_engine_property_activate
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gchar        *prop_name,
Packit Service 1d8f1c
                                              guint               prop_state);
Packit Service 1d8f1c
static void      ibus_engine_property_show   (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gchar        *prop_name);
Packit Service 1d8f1c
static void      ibus_engine_property_hide   (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gchar        *prop_name);
Packit Service 1d8f1c
static void      ibus_engine_set_surrounding_text
Packit Service 1d8f1c
                                            (IBusEngine         *engine,
Packit Service 1d8f1c
                                             IBusText           *text,
Packit Service 1d8f1c
                                             guint               cursor_pos,
Packit Service 1d8f1c
                                             guint               anchor_pos);
Packit Service 1d8f1c
static void      ibus_engine_process_hand_writing_event
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gdouble      *coordinates,
Packit Service 1d8f1c
                                              guint               coordinates_len);
Packit Service 1d8f1c
static void      ibus_engine_cancel_hand_writing
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               n_strokes);
Packit Service 1d8f1c
static void      ibus_engine_set_content_type
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              guint               purpose,
Packit Service 1d8f1c
                                              guint               hints);
Packit Service 1d8f1c
static void      ibus_engine_emit_signal     (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gchar        *signal_name,
Packit Service 1d8f1c
                                              GVariant           *parameters);
Packit Service 1d8f1c
static void      ibus_engine_dbus_property_changed
Packit Service 1d8f1c
                                             (IBusEngine         *engine,
Packit Service 1d8f1c
                                              const gchar        *property_name,
Packit Service 1d8f1c
                                              GVariant           *value);
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
G_DEFINE_TYPE (IBusEngine, ibus_engine, IBUS_TYPE_SERVICE)
Packit Service 1d8f1c
Packit Service 1d8f1c
static const gchar introspection_xml[] =
Packit Service 1d8f1c
    "<node>"
Packit Service 1d8f1c
    "  <interface name='org.freedesktop.IBus.Engine'>"
Packit Service 1d8f1c
    /* FIXME 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' />"
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='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='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='PropertyShow'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='s' name='name' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='PropertyHide'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='s' name='name' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='CandidateClicked'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='index' />"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='button' />"
Packit Service 1d8f1c
    "      <arg direction='in'  type='u' name='state' />"
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='Enable' />"
Packit Service 1d8f1c
    "    <method name='Disable' />"
Packit Service 1d8f1c
    "    <method name='PageUp' />"
Packit Service 1d8f1c
    "    <method name='PageDown' />"
Packit Service 1d8f1c
    "    <method name='CursorUp' />"
Packit Service 1d8f1c
    "    <method name='CursorDown' />"
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
    "    <method name='PanelExtensionReceived'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='v' name='event' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    "    <method name='PanelExtensionRegisterKeys'>"
Packit Service 1d8f1c
    "      <arg direction='in'  type='v' name='data' />"
Packit Service 1d8f1c
    "    </method>"
Packit Service 1d8f1c
    /* FIXME signals */
Packit Service 1d8f1c
    "    <signal name='CommitText'>"
Packit Service 1d8f1c
    "      <arg type='v' name='text' />"
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
    "      <arg type='u' name='mode' />"
Packit Service 1d8f1c
    "    </signal>"
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='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='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
    "    <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='PanelExtension'>"
Packit Service 1d8f1c
    "      <arg type='v' name='data' />"
Packit Service 1d8f1c
    "    </signal>"
Packit Service 1d8f1c
    /* FIXME 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
static const guint IBUS_MODIFIER_FILTER =
Packit Service 1d8f1c
        IBUS_MODIFIER_MASK & ~(
Packit Service 1d8f1c
        IBUS_LOCK_MASK |  /* Caps Lock */
Packit Service 1d8f1c
        IBUS_MOD2_MASK |  /* Num Lock */
Packit Service 1d8f1c
        IBUS_BUTTON1_MASK |
Packit Service 1d8f1c
        IBUS_BUTTON2_MASK |
Packit Service 1d8f1c
        IBUS_BUTTON3_MASK |
Packit Service 1d8f1c
        IBUS_BUTTON4_MASK |
Packit Service 1d8f1c
        IBUS_BUTTON5_MASK |
Packit Service 1d8f1c
        IBUS_SUPER_MASK |
Packit Service 1d8f1c
        IBUS_HYPER_MASK |
Packit Service 1d8f1c
        IBUS_META_MASK);
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_class_init (IBusEngineClass *class)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit Service 1d8f1c
    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (class);
Packit Service 1d8f1c
Packit Service 1d8f1c
    gobject_class->set_property =
Packit Service 1d8f1c
            (GObjectSetPropertyFunc) ibus_engine_set_property;
Packit Service 1d8f1c
    gobject_class->get_property =
Packit Service 1d8f1c
            (GObjectGetPropertyFunc) ibus_engine_get_property;
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_engine_destroy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_SERVICE_CLASS (class)->service_method_call  =
Packit Service 1d8f1c
            ibus_engine_service_method_call;
Packit Service 1d8f1c
    IBUS_SERVICE_CLASS (class)->service_get_property =
Packit Service 1d8f1c
            ibus_engine_service_get_property;
Packit Service 1d8f1c
    IBUS_SERVICE_CLASS (class)->service_set_property =
Packit Service 1d8f1c
            ibus_engine_service_set_property;
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_service_class_add_interfaces (IBUS_SERVICE_CLASS (class),
Packit Service 1d8f1c
                                       introspection_xml);
Packit Service 1d8f1c
Packit Service 1d8f1c
    class->process_key_event = ibus_engine_process_key_event;
Packit Service 1d8f1c
    class->focus_in     = ibus_engine_focus_in;
Packit Service 1d8f1c
    class->focus_out    = ibus_engine_focus_out;
Packit Service 1d8f1c
    class->reset        = ibus_engine_reset;
Packit Service 1d8f1c
    class->enable       = ibus_engine_enable;
Packit Service 1d8f1c
    class->disable      = ibus_engine_disable;
Packit Service 1d8f1c
    class->page_up      = ibus_engine_page_up;
Packit Service 1d8f1c
    class->page_down    = ibus_engine_page_down;
Packit Service 1d8f1c
    class->cursor_up    = ibus_engine_cursor_up;
Packit Service 1d8f1c
    class->cursor_down  = ibus_engine_cursor_down;
Packit Service 1d8f1c
    class->candidate_clicked    = ibus_engine_candidate_clicked;
Packit Service 1d8f1c
    class->property_activate    = ibus_engine_property_activate;
Packit Service 1d8f1c
    class->property_show        = ibus_engine_property_show;
Packit Service 1d8f1c
    class->property_hide        = ibus_engine_property_hide;
Packit Service 1d8f1c
    class->set_cursor_location  = ibus_engine_set_cursor_location;
Packit Service 1d8f1c
    class->set_capabilities     = ibus_engine_set_capabilities;
Packit Service 1d8f1c
    class->set_surrounding_text = ibus_engine_set_surrounding_text;
Packit Service 1d8f1c
    class->process_hand_writing_event
Packit Service 1d8f1c
                                = ibus_engine_process_hand_writing_event;
Packit Service 1d8f1c
    class->cancel_hand_writing  = ibus_engine_cancel_hand_writing;
Packit Service 1d8f1c
    class->set_content_type     = ibus_engine_set_content_type;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install properties */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine:name:
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Name of this IBusEngine.
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    g_object_class_install_property (gobject_class,
Packit Service 1d8f1c
                    PROP_ENGINE_NAME,
Packit Service 1d8f1c
                    g_param_spec_string ("engine-name",
Packit Service 1d8f1c
                        "engine name",
Packit Service 1d8f1c
                        "engine name",
Packit Service 1d8f1c
                        "noname",
Packit Service 1d8f1c
                        G_PARAM_READWRITE |
Packit Service 1d8f1c
                        G_PARAM_CONSTRUCT_ONLY |
Packit Service 1d8f1c
                        G_PARAM_STATIC_STRINGS));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* install signals */
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::process-key-event:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @keyval: Key symbol of the key press.
Packit Service 1d8f1c
     * @keycode: KeyCode of the key press.
Packit Service 1d8f1c
     * @state: Key modifier flags.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a key event is received.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::process_key_event
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     * Both the key symbol and keycode are passed to the member function.
Packit Service 1d8f1c
     * See ibus_input_context_process_key_event() for further explanation of
Packit Service 1d8f1c
     * key symbol, keycode and which to use.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Returns: %TRUE for successfully process the key; %FALSE otherwise.
Packit Service 1d8f1c
     * See also:  ibus_input_context_process_key_event().
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PROCESS_KEY_EVENT] =
Packit Service 1d8f1c
        g_signal_new (I_("process-key-event"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, process_key_event),
Packit Service 1d8f1c
            g_signal_accumulator_true_handled, NULL,
Packit Service 1d8f1c
            _ibus_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
    /**
Packit Service 1d8f1c
     * IBusEngine::focus-in:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the client application get the focus.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::focus_in
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also: ibus_input_context_focus_in()
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[FOCUS_IN] =
Packit Service 1d8f1c
        g_signal_new (I_("focus-in"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, focus_in),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::focus-out:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the client application  lost the focus.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::focus_out
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also: ibus_input_context_focus_out()
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[FOCUS_OUT] =
Packit Service 1d8f1c
        g_signal_new (I_("focus-out"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, focus_out),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::reset:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the IME is reset.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::reset
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_input_context_reset().
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[RESET] =
Packit Service 1d8f1c
        g_signal_new (I_("reset"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, reset),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::enable:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the IME is enabled.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::enable
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_bus_set_global_engine().
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[ENABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("enable"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, enable),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::disable:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the IME is disabled.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::disable
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_bus_set_global_engine().
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[DISABLE] =
Packit Service 1d8f1c
        g_signal_new (I_("disable"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, disable),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::set-cursor-location:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @x: X coordinate of the cursor.
Packit Service 1d8f1c
     * @y: Y coordinate of the cursor.
Packit Service 1d8f1c
     * @w: Width of the cursor.
Packit Service 1d8f1c
     * @h: Height of the cursor.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the location of IME is set.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::set_cursor_location
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_input_context_set_cursor_location().
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[SET_CURSOR_LOCATION] =
Packit Service 1d8f1c
        g_signal_new (I_("set-cursor-location"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, set_cursor_location),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_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
    /**
Packit Service 1d8f1c
     * IBusEngine::set-capabilities:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @caps: Capabilities flags of IBusEngine, see #IBusCapabilite
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the client application capabilities is set.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::set_capabilities
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * See also:  ibus_input_context_set_capabilities().
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[SET_CAPABILITIES] =
Packit Service 1d8f1c
        g_signal_new (I_("set-capabilities"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, set_capabilities),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::page-up:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the page-up button is pressed.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::page_up
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PAGE_UP] =
Packit Service 1d8f1c
        g_signal_new (I_("page-up"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, page_up),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::page-down:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the page-down button is pressed.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::page_down
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PAGE_DOWN] =
Packit Service 1d8f1c
        g_signal_new (I_("page-down"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, page_down),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::cursor-up:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the up cursor button is pressed.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::cursor_up
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[CURSOR_UP] =
Packit Service 1d8f1c
        g_signal_new (I_("cursor-up"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, cursor_up),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::cursor-down:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the down cursor button is pressed.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::cursor_down
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[CURSOR_DOWN] =
Packit Service 1d8f1c
        g_signal_new (I_("cursor-down"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, cursor_down),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__VOID,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            0);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::candidate-clicked:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @index:  Index of candidate be clicked.
Packit Service 1d8f1c
     * @button: Mouse button.
Packit Service 1d8f1c
     * @state:  Keyboard state.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when candidate on lookup table is clicked.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::candidate_clicked
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[CANDIDATE_CLICKED] =
Packit Service 1d8f1c
        g_signal_new (I_("candidate-clicked"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, candidate_clicked),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__UINT_UINT_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            3,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::property-activate:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @name:   Property name.
Packit Service 1d8f1c
     * @state:  Property state.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a property is activated or change changed.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::property_activate
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PROPERTY_ACTIVATE] =
Packit Service 1d8f1c
        g_signal_new (I_("property-activate"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, property_activate),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__STRING_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            G_TYPE_STRING,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::property-show:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @name:   Property name.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a property is shown.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::property_side
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PROPERTY_SHOW] =
Packit Service 1d8f1c
        g_signal_new (I_("property-show"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, property_show),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__STRING,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_STRING);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::property-hide:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @name:   Property name.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a property is hidden.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::property_hide
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PROPERTY_HIDE] =
Packit Service 1d8f1c
        g_signal_new (I_("property-hide"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, property_hide),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__STRING,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_STRING);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::process-hand-writing-event:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @coordinates: An array of double (0.0 to 1.0) which represents a stroke (i.e. [x1, y1, x2, y2, x3, y3, ...]).
Packit Service 1d8f1c
     * @coordinates_len: The number of elements in the array.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a hand writing operation is cancelled.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::cancel_hand_writing
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[PROCESS_HAND_WRITING_EVENT] =
Packit Service 1d8f1c
        g_signal_new (I_("process-hand-writing-event"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, process_hand_writing_event),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__POINTER_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            2,
Packit Service 1d8f1c
            G_TYPE_POINTER,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::cancel-hand-writing:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @n_strokes: The number of strokes to be removed. 0 means "remove all".
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a hand writing operation is cancelled.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::cancel_hand_writing
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[CANCEL_HAND_WRITING] =
Packit Service 1d8f1c
        g_signal_new (I_("cancel-hand-writing"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, cancel_hand_writing),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            1,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::set-surrounding-text:
Packit Service 1d8f1c
     * @engine: An IBusEngine.
Packit Service 1d8f1c
     * @text: The surrounding text.
Packit Service 1d8f1c
     * @cursor_pos: The cursor position on surrounding text.
Packit Service 1d8f1c
     * @anchor_pos: The anchor position on selection area.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when a surrounding text is set.
Packit Service 1d8f1c
     * Implement the member function IBusEngineClass::set_surrounding_text
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     * If anchor_pos equals to cursor_pos, it means "there are no selection"
Packit Service 1d8f1c
     * or "does not support selection retrival".
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[SET_SURROUNDING_TEXT] =
Packit Service 1d8f1c
        g_signal_new (I_("set-surrounding-text"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, set_surrounding_text),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_marshal_VOID__OBJECT_UINT_UINT,
Packit Service 1d8f1c
            G_TYPE_NONE,
Packit Service 1d8f1c
            3,
Packit Service 1d8f1c
            G_TYPE_OBJECT,
Packit Service 1d8f1c
            G_TYPE_UINT,
Packit Service 1d8f1c
            G_TYPE_UINT);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /**
Packit Service 1d8f1c
     * IBusEngine::set-content-type:
Packit Service 1d8f1c
     * @engine: An #IBusEngine.
Packit Service 1d8f1c
     * @purpose: Primary purpose of the input context, as an #IBusInputPurpose.
Packit Service 1d8f1c
     * @hints: Hints that augment @purpose, as an #IBusInputHints.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * Emitted when the client application content-type (primary
Packit Service 1d8f1c
     * purpose and hints) is set.  The engine could change the
Packit Service 1d8f1c
     * behavior according to the content-type.  Implement the member
Packit Service 1d8f1c
     * function IBusEngineClass::set_content_type
Packit Service 1d8f1c
     * in extended class to receive this signal.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * For example, if the client application wants to restrict input
Packit Service 1d8f1c
     * to numbers, this signal will be emitted with @purpose set to
Packit Service 1d8f1c
     * #IBUS_INPUT_PURPOSE_NUMBER, so the engine can switch the input
Packit Service 1d8f1c
     * mode to latin.
Packit Service 1d8f1c
     *
Packit Service 1d8f1c
     * <note><para>Argument @user_data is ignored in this
Packit Service 1d8f1c
     * function.</para></note>
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    engine_signals[SET_CONTENT_TYPE] =
Packit Service 1d8f1c
        g_signal_new (I_("set-content-type"),
Packit Service 1d8f1c
            G_TYPE_FROM_CLASS (gobject_class),
Packit Service 1d8f1c
            G_SIGNAL_RUN_LAST,
Packit Service 1d8f1c
            G_STRUCT_OFFSET (IBusEngineClass, set_content_type),
Packit Service 1d8f1c
            NULL, NULL,
Packit Service 1d8f1c
            _ibus_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
    g_type_class_add_private (class, sizeof (IBusEnginePrivate));
Packit Service 1d8f1c
Packit Service 1d8f1c
    text_empty = ibus_text_new_from_static_string ("");
Packit Service 1d8f1c
    g_object_ref_sink (text_empty);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_init (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv;
Packit Service 1d8f1c
    engine->priv = priv = IBUS_ENGINE_GET_PRIVATE (engine);
Packit Service 1d8f1c
    priv->surrounding_text = g_object_ref_sink (text_empty);
Packit Service 1d8f1c
    priv->extension_keybindings = g_hash_table_new_full (
Packit Service 1d8f1c
            g_str_hash,
Packit Service 1d8f1c
            g_str_equal,
Packit Service 1d8f1c
            g_free,
Packit Service 1d8f1c
            g_free);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_destroy (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv = engine->priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_clear_pointer (&priv->engine_name, g_free);
Packit Service 1d8f1c
    g_clear_pointer (&priv->current_extension_name, g_free);
Packit Service 1d8f1c
    if (priv->surrounding_text)
Packit Service 1d8f1c
        g_clear_object (&priv->surrounding_text);
Packit Service 1d8f1c
    if (priv->extension_keybindings)
Packit Service 1d8f1c
        g_clear_pointer (&priv->extension_keybindings, g_hash_table_destroy);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBUS_OBJECT_CLASS(ibus_engine_parent_class)->destroy (IBUS_OBJECT (engine));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_set_property (IBusEngine   *engine,
Packit Service 1d8f1c
                          guint         prop_id,
Packit Service 1d8f1c
                          const GValue *value,
Packit Service 1d8f1c
                          GParamSpec   *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_ENGINE_NAME:
Packit Service 1d8f1c
        engine->priv->engine_name = g_value_dup_string (value);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_get_property (IBusEngine *engine,
Packit Service 1d8f1c
                          guint       prop_id,
Packit Service 1d8f1c
                          GValue     *value,
Packit Service 1d8f1c
                          GParamSpec *pspec)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    switch (prop_id) {
Packit Service 1d8f1c
    case PROP_ENGINE_NAME:
Packit Service 1d8f1c
        g_value_set_string (value, engine->priv->engine_name);
Packit Service 1d8f1c
        break;
Packit Service 1d8f1c
Packit Service 1d8f1c
    default:
Packit Service 1d8f1c
        G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_panel_extension (IBusEngine  *engine,
Packit Service 1d8f1c
                             const gchar *name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv;
Packit Service 1d8f1c
    IBusExtensionEvent *event;
Packit Service 1d8f1c
    GVariant *data;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_assert (name);
Packit Service 1d8f1c
Packit Service 1d8f1c
    priv = engine->priv;
Packit Service 1d8f1c
    if (!g_strcmp0 (name, priv->current_extension_name))
Packit Service 1d8f1c
        priv->enable_extension = !priv->enable_extension;
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        priv->enable_extension = TRUE;
Packit Service 1d8f1c
    if (priv->enable_extension) {
Packit Service 1d8f1c
        g_free (priv->current_extension_name);
Packit Service 1d8f1c
        priv->current_extension_name = g_strdup (name);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    event = ibus_extension_event_new (
Packit Service 1d8f1c
            "name", name,
Packit Service 1d8f1c
            "is-enabled", priv->enable_extension,
Packit Service 1d8f1c
            NULL);
Packit Service 1d8f1c
    g_assert (IBUS_IS_EXTENSION_EVENT (event));
Packit Service 1d8f1c
    data = ibus_serializable_serialize_object (
Packit Service 1d8f1c
            IBUS_SERIALIZABLE (event));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_assert (data != NULL);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "PanelExtension",
Packit Service 1d8f1c
                             g_variant_new ("(v)", data));
Packit Service 1d8f1c
    g_object_unref (event);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_engine_filter_key_event (IBusEngine *engine,
Packit Service 1d8f1c
                              guint       keyval,
Packit Service 1d8f1c
                              guint       keycode,
Packit Service 1d8f1c
                              guint       state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv;
Packit Service 1d8f1c
    GList *names, *n;
Packit Service 1d8f1c
    IBusProcessKeyEventData *keys;
Packit Service 1d8f1c
    guint modifiers;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((state & IBUS_RELEASE_MASK) != 0)
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_ENGINE (engine), FALSE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    priv = engine->priv;
Packit Service 1d8f1c
    modifiers = state & IBUS_MODIFIER_FILTER;
Packit Service 1d8f1c
    if (keyval >= IBUS_KEY_A && keyval <= IBUS_KEY_Z &&
Packit Service 1d8f1c
        (modifiers & IBUS_SHIFT_MASK) != 0) {
Packit Service 1d8f1c
        keyval = keyval - IBUS_KEY_A + IBUS_KEY_a;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    names = g_hash_table_get_keys (priv->extension_keybindings);
Packit Service 1d8f1c
    if (!names)
Packit Service 1d8f1c
        return FALSE;
Packit Service 1d8f1c
    for (n = names; n; n = n->next) {
Packit Service 1d8f1c
        const gchar *name = (const gchar *)n->data;
Packit Service 1d8f1c
        keys = g_hash_table_lookup (priv->extension_keybindings, name);
Packit Service 1d8f1c
        for (; keys; keys++) {
Packit Service 1d8f1c
            if (keys->keyval == 0 && keys->keycode == 0 && keys->state == 0)
Packit Service 1d8f1c
                break;
Packit Service 1d8f1c
            if (keys->keyval == keyval &&
Packit Service 1d8f1c
                keys->state == modifiers &&
Packit Service 1d8f1c
                (keys->keycode == 0 || keys->keycode == keycode)) {
Packit Service 1d8f1c
                ibus_engine_panel_extension (engine, name);
Packit Service 1d8f1c
                return TRUE;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    g_list_free (names);
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_engine_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
static void
Packit Service 1d8f1c
ibus_engine_service_panel_extension_register_keys (IBusEngine      *engine,
Packit Service 1d8f1c
                                                   GVariant        *parameters,
Packit Service 1d8f1c
                                                   GDBusMethodInvocation
Packit Service 1d8f1c
                                                                   *invocation)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv = engine->priv;
Packit Service 1d8f1c
    GVariant *v1 = NULL;
Packit Service 1d8f1c
    GVariant *v2 = NULL;
Packit Service 1d8f1c
    GVariant *v3 = NULL;
Packit Service 1d8f1c
    GVariant *vkeys = NULL;
Packit Service 1d8f1c
    GVariantIter *iter1 = NULL;
Packit Service 1d8f1c
    GVariantIter *iter2 = NULL;
Packit Service 1d8f1c
    const gchar *name = NULL;
Packit Service 1d8f1c
    guint failure_id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_variant_get (parameters, "(v)", &v1;;
Packit Service 1d8f1c
    if (v1)
Packit Service 1d8f1c
        g_variant_get (v1, "(v)", &v2;;
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        failure_id = 1;
Packit Service 1d8f1c
    if (v2)
Packit Service 1d8f1c
        g_variant_get (v2, "a{sv}", &iter1);
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
        failure_id = 2;
Packit Service 1d8f1c
    if (iter1) {
Packit Service 1d8f1c
        while (g_variant_iter_loop (iter1, "{&sv}", &name, &vkeys)) {
Packit Service 1d8f1c
            if (vkeys)
Packit Service 1d8f1c
                g_variant_get (vkeys, "av", &iter2);
Packit Service 1d8f1c
            if (name && iter2) {
Packit Service 1d8f1c
                IBusProcessKeyEventData *keys = NULL;
Packit Service 1d8f1c
                gint num = 0;
Packit Service 1d8f1c
                while (g_variant_iter_loop (iter2, "v", &v3)) {
Packit Service 1d8f1c
                    if (v3) {
Packit Service 1d8f1c
                        guint keyval = 0;
Packit Service 1d8f1c
                        guint keycode = 0;
Packit Service 1d8f1c
                        guint state = 0;
Packit Service 1d8f1c
                        g_variant_get (v3, "(iii)",
Packit Service 1d8f1c
                                       &keyval, &keycode, &state);
Packit Service 1d8f1c
                        if (!keys)
Packit Service 1d8f1c
                            keys = g_new0 (IBusProcessKeyEventData, 2);
Packit Service 1d8f1c
                        else
Packit Service 1d8f1c
                            keys = g_renew (IBusProcessKeyEventData,
Packit Service 1d8f1c
                                            keys,
Packit Service 1d8f1c
                                            num + 2);
Packit Service 1d8f1c
                        keys[num].keyval = keyval;
Packit Service 1d8f1c
                        keys[num].keycode = keycode;
Packit Service 1d8f1c
                        keys[num].state = state;
Packit Service 1d8f1c
                        keys[num + 1].keyval = 0;
Packit Service 1d8f1c
                        keys[num + 1].keycode = 0;
Packit Service 1d8f1c
                        keys[num + 1].state = 0;
Packit Service 1d8f1c
                        g_clear_pointer (&v3, g_variant_unref);
Packit Service 1d8f1c
                        num++;
Packit Service 1d8f1c
                    } else {
Packit Service 1d8f1c
                        failure_id = 5;
Packit Service 1d8f1c
                    }
Packit Service 1d8f1c
                }
Packit Service 1d8f1c
                if (num > 0) {
Packit Service 1d8f1c
                    g_hash_table_replace (priv->extension_keybindings,
Packit Service 1d8f1c
                                          g_strdup (name),
Packit Service 1d8f1c
                                          keys);
Packit Service 1d8f1c
                } else {
Packit Service 1d8f1c
                    g_hash_table_remove (priv->extension_keybindings, name);
Packit Service 1d8f1c
                }
Packit Service 1d8f1c
                g_clear_pointer (&iter2, g_variant_iter_free);
Packit Service 1d8f1c
            } else {
Packit Service 1d8f1c
                failure_id = 4;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            g_clear_pointer (&vkeys, g_variant_unref);
Packit Service 1d8f1c
            name = NULL;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_variant_iter_free (iter1);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        failure_id = 3;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (failure_id == 0) {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        g_dbus_method_invocation_return_error (
Packit Service 1d8f1c
                invocation,
Packit Service 1d8f1c
                G_DBUS_ERROR,
Packit Service 1d8f1c
                G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                "PanelExtensionRegisterKeys method gives NULL: %d",
Packit Service 1d8f1c
                failure_id);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (v2)
Packit Service 1d8f1c
        g_variant_unref (v2);
Packit Service 1d8f1c
    if (v1)
Packit Service 1d8f1c
        g_variant_unref (v1);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_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
    IBusEngine *engine = IBUS_ENGINE (service);
Packit Service 1d8f1c
    IBusEnginePrivate *priv = engine->priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (interface_name, IBUS_INTERFACE_ENGINE) != 0) {
Packit Service 1d8f1c
        IBUS_SERVICE_CLASS (ibus_engine_parent_class)->
Packit Service 1d8f1c
                service_method_call (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
    if (!ibus_engine_service_authorized_method (service, connection))
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "ProcessKeyEvent") == 0) {
Packit Service 1d8f1c
        guint keyval, keycode, state;
Packit Service 1d8f1c
        gboolean retval = FALSE;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (parameters, "(uuu)", &keyval, &keycode, &state);
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[PROCESS_KEY_EVENT],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       keyval,
Packit Service 1d8f1c
                       keycode,
Packit Service 1d8f1c
                       state,
Packit Service 1d8f1c
                       &retval);
Packit Service 1d8f1c
        if (!retval) {
Packit Service 1d8f1c
            retval = ibus_engine_filter_key_event (engine,
Packit Service 1d8f1c
                                                   keyval,
Packit Service 1d8f1c
                                                   keycode,
Packit Service 1d8f1c
                                                   state);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", retval));
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "PanelExtensionReceived") == 0) {
Packit Service 1d8f1c
        GVariant *arg0 = NULL;
Packit Service 1d8f1c
        IBusExtensionEvent *event = NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_variant_get (parameters, "(v)", &arg0);
Packit Service 1d8f1c
        if (arg0) {
Packit Service 1d8f1c
            event = (IBusExtensionEvent *)ibus_serializable_deserialize_object (
Packit Service 1d8f1c
                    arg0);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (!event) {
Packit Service 1d8f1c
            g_dbus_method_invocation_return_error (
Packit Service 1d8f1c
                    invocation,
Packit Service 1d8f1c
                    G_DBUS_ERROR,
Packit Service 1d8f1c
                    G_DBUS_ERROR_FAILED,
Packit Service 1d8f1c
                    "PanelExtensionReceived method gives NULL");
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        priv->enable_extension = ibus_extension_event_is_enabled (event);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "PanelExtensionRegisterKeys") == 0) {
Packit Service 1d8f1c
        ibus_engine_service_panel_extension_register_keys (engine,
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
        gchar *member;
Packit Service 1d8f1c
        guint  signal_id;
Packit Service 1d8f1c
    } no_arg_methods[] = {
Packit Service 1d8f1c
        { "FocusIn",     FOCUS_IN },
Packit Service 1d8f1c
        { "FocusOut",    FOCUS_OUT },
Packit Service 1d8f1c
        { "Reset",       RESET },
Packit Service 1d8f1c
        { "Enable",      ENABLE },
Packit Service 1d8f1c
        { "Disable",     DISABLE },
Packit Service 1d8f1c
        { "PageUp",      PAGE_UP },
Packit Service 1d8f1c
        { "PageDown",    PAGE_DOWN },
Packit Service 1d8f1c
        { "CursorUp",    CURSOR_UP },
Packit Service 1d8f1c
        { "CursorDown",  CURSOR_DOWN },
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    gint i;
Packit Service 1d8f1c
    for (i = 0; i < G_N_ELEMENTS (no_arg_methods); i++) {
Packit Service 1d8f1c
        if (g_strcmp0 (method_name, no_arg_methods[i].member) == 0) {
Packit Service 1d8f1c
            g_signal_emit (engine, engine_signals[no_arg_methods[i].signal_id], 0);
Packit Service 1d8f1c
            g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "CandidateClicked") == 0) {
Packit Service 1d8f1c
        guint index, button, state;
Packit Service 1d8f1c
        g_variant_get (parameters, "(uuu)", &index, &button, &state);
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[CANDIDATE_CLICKED],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       index,
Packit Service 1d8f1c
                       button,
Packit Service 1d8f1c
                       state);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "PropertyActivate") == 0) {
Packit Service 1d8f1c
        gchar *name;
Packit Service 1d8f1c
        guint state;
Packit Service 1d8f1c
        g_variant_get (parameters, "(&su)", &name, &state);
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[PROPERTY_ACTIVATE],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       name,
Packit Service 1d8f1c
                       state);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "PropertyShow") == 0) {
Packit Service 1d8f1c
        gchar *name;
Packit Service 1d8f1c
        g_variant_get (parameters, "(&s)", &name);
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[PROPERTY_SHOW],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       name);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "PropertyHide") == 0) {
Packit Service 1d8f1c
        gchar *name;
Packit Service 1d8f1c
        g_variant_get (parameters, "(&s)", &name);
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[PROPERTY_HIDE],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       name);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "SetCursorLocation") == 0) {
Packit Service 1d8f1c
        gint x, y, w, h;
Packit Service 1d8f1c
        g_variant_get (parameters, "(iiii)", &x, &y, &w, &h);
Packit Service 1d8f1c
        engine->cursor_area.x = x;
Packit Service 1d8f1c
        engine->cursor_area.y = y;
Packit Service 1d8f1c
        engine->cursor_area.width = w;
Packit Service 1d8f1c
        engine->cursor_area.height = h;
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine,
Packit Service 1d8f1c
                       engine_signals[SET_CURSOR_LOCATION],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       x, y, w, h);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "SetCapabilities") == 0) {
Packit Service 1d8f1c
        guint caps;
Packit Service 1d8f1c
        g_variant_get (parameters, "(u)", &caps);
Packit Service 1d8f1c
        engine->client_capabilities = caps;
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[SET_CAPABILITIES], 0, caps);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "SetSurroundingText") == 0) {
Packit Service 1d8f1c
        GVariant *variant = NULL;
Packit Service 1d8f1c
        IBusText *text;
Packit Service 1d8f1c
        guint cursor_pos;
Packit Service 1d8f1c
        guint anchor_pos;
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
        g_signal_emit (engine, engine_signals[SET_SURROUNDING_TEXT],
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       text,
Packit Service 1d8f1c
                       cursor_pos,
Packit Service 1d8f1c
                       anchor_pos);
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
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "ProcessHandWritingEvent") == 0) {
Packit Service 1d8f1c
        const gdouble *coordinates;
Packit Service 1d8f1c
        gsize coordinates_len = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
        coordinates = g_variant_get_fixed_array (g_variant_get_child_value (parameters, 0), &coordinates_len, sizeof (gdouble));
Packit Service 1d8f1c
        g_return_if_fail (coordinates != NULL);
Packit Service 1d8f1c
        g_return_if_fail (coordinates_len >= 4); /* The array should contain at least one line. */
Packit Service 1d8f1c
        g_return_if_fail (coordinates_len <= G_MAXUINT); /* to prevent overflow in the cast in g_signal_emit */
Packit Service 1d8f1c
        g_return_if_fail ((coordinates_len & 1) == 0);
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[PROCESS_HAND_WRITING_EVENT], 0,
Packit Service 1d8f1c
                       coordinates, (guint) coordinates_len);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (method_name, "CancelHandWriting") == 0) {
Packit Service 1d8f1c
        guint n_strokes = 0;
Packit Service 1d8f1c
        g_variant_get (parameters, "(u)", &n_strokes);
Packit Service 1d8f1c
        g_signal_emit (engine, engine_signals[CANCEL_HAND_WRITING], 0, n_strokes);
Packit Service 1d8f1c
        g_dbus_method_invocation_return_value (invocation, NULL);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* should not be reached */
Packit Service 1d8f1c
    g_return_if_reached ();
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static GVariant *
Packit Service 1d8f1c
ibus_engine_service_get_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
                                  GError            **error)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return IBUS_SERVICE_CLASS (ibus_engine_parent_class)->
Packit Service 1d8f1c
                service_get_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
                                      error);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static gboolean
Packit Service 1d8f1c
ibus_engine_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
    IBusEngine *engine = IBUS_ENGINE (service);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_strcmp0 (interface_name, IBUS_INTERFACE_ENGINE) != 0) {
Packit Service 1d8f1c
        return IBUS_SERVICE_CLASS (ibus_engine_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 (!ibus_engine_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
        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 != engine->priv->content_purpose ||
Packit Service 1d8f1c
            hints != engine->priv->content_hints) {
Packit Service 1d8f1c
            engine->priv->content_purpose = purpose;
Packit Service 1d8f1c
            engine->priv->content_hints = hints;
Packit Service 1d8f1c
Packit Service 1d8f1c
            g_signal_emit (engine,
Packit Service 1d8f1c
                           engine_signals[SET_CONTENT_TYPE],
Packit Service 1d8f1c
                           0,
Packit Service 1d8f1c
                           purpose,
Packit Service 1d8f1c
                           hints);
Packit Service 1d8f1c
Packit Service 1d8f1c
            ibus_engine_dbus_property_changed (engine, "ContentType", value);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
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
static gboolean
Packit Service 1d8f1c
ibus_engine_process_key_event (IBusEngine *engine,
Packit Service 1d8f1c
                               guint       keyval,
Packit Service 1d8f1c
                               guint       keycode,
Packit Service 1d8f1c
                               guint       state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return FALSE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_focus_in (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("focus-in");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_focus_out (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("focus-out");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_reset (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("reset");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_enable (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("enable");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_disable (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("disable");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_set_cursor_location (IBusEngine *engine,
Packit Service 1d8f1c
                                 gint        x,
Packit Service 1d8f1c
                                 gint        y,
Packit Service 1d8f1c
                                 gint        w,
Packit Service 1d8f1c
                                 gint        h)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("set-cursor-location (%d, %d, %d, %d)", x, y, w, h);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_set_capabilities (IBusEngine *engine,
Packit Service 1d8f1c
                              guint       caps)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("set-capabilities (0x%04x)", caps);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_page_up (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("page-up");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_page_down (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("page-down");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_cursor_up (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("cursor-up");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_cursor_down (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("cursor-down");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_candidate_clicked (IBusEngine *engine,
Packit Service 1d8f1c
                               guint       index,
Packit Service 1d8f1c
                               guint       button,
Packit Service 1d8f1c
                               guint       state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("candidate-clicked");
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_property_activate (IBusEngine  *engine,
Packit Service 1d8f1c
                               const gchar *prop_name,
Packit Service 1d8f1c
                               guint        prop_state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("property-activate ('%s', %d)", prop_name, prop_state);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_property_show (IBusEngine *engine, const gchar *prop_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("property-show ('%s')", prop_name);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_property_hide (IBusEngine *engine, const gchar *prop_name)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("property-hide ('%s')", prop_name);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_set_surrounding_text (IBusEngine *engine,
Packit Service 1d8f1c
                                  IBusText   *text,
Packit Service 1d8f1c
                                  guint       cursor_pos,
Packit Service 1d8f1c
                                  guint       anchor_pos)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_assert (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine->priv->surrounding_text) {
Packit Service 1d8f1c
        g_object_unref (engine->priv->surrounding_text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    engine->priv->surrounding_text = (IBusText *) g_object_ref_sink (text ? text : text_empty);
Packit Service 1d8f1c
    engine->priv->surrounding_cursor_pos = cursor_pos;
Packit Service 1d8f1c
    engine->priv->selection_anchor_pos = anchor_pos;
Packit Service 1d8f1c
    // g_debug ("set-surrounding-text ('%s', %d, %d)", text->text, cursor_pos, anchor_pos);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_process_hand_writing_event (IBusEngine         *engine,
Packit Service 1d8f1c
                                        const gdouble      *coordinates,
Packit Service 1d8f1c
                                        guint               coordinates_len)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // guint i;
Packit Service 1d8f1c
    // g_debug ("process-hand-writing-event (%u)", coordinates_len);
Packit Service 1d8f1c
    // for (i = 0; i < coordinates_len; i++)
Packit Service 1d8f1c
    //     g_debug (" %lf", coordinates[i]);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_cancel_hand_writing (IBusEngine         *engine,
Packit Service 1d8f1c
                                 guint               n_strokes)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("cancel-hand-writing (%u)", n_strokes);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_set_content_type (IBusEngine *engine,
Packit Service 1d8f1c
                              guint       purpose,
Packit Service 1d8f1c
                              guint       hints)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    // g_debug ("set-content-type (%u %u)", purpose, hints);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_emit_signal (IBusEngine  *engine,
Packit Service 1d8f1c
                         const gchar *signal_name,
Packit Service 1d8f1c
                         GVariant    *parameters)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    ibus_service_emit_signal ((IBusService *)engine,
Packit Service 1d8f1c
                              NULL,
Packit Service 1d8f1c
                              IBUS_INTERFACE_ENGINE,
Packit Service 1d8f1c
                              signal_name,
Packit Service 1d8f1c
                              parameters,
Packit Service 1d8f1c
                              NULL);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void
Packit Service 1d8f1c
ibus_engine_dbus_property_changed (IBusEngine  *engine,
Packit Service 1d8f1c
                                   const gchar *property_name,
Packit Service 1d8f1c
                                   GVariant    *value)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    const gchar *object_path;
Packit Service 1d8f1c
    GDBusConnection *connection;
Packit Service 1d8f1c
    GDBusMessage *message;
Packit Service 1d8f1c
    GVariantBuilder *builder;
Packit Service 1d8f1c
    gboolean retval;
Packit Service 1d8f1c
    GError *error;
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* we cannot use ibus_service_emit_signal() here, since we need to
Packit Service 1d8f1c
       set sender of the signal so that GDBusProxy can properly track
Packit Service 1d8f1c
       the property change. */
Packit Service 1d8f1c
    object_path = ibus_service_get_object_path ((IBusService *)engine);
Packit Service 1d8f1c
    message = g_dbus_message_new_signal (object_path,
Packit Service 1d8f1c
                                         "org.freedesktop.DBus.Properties",
Packit Service 1d8f1c
                                         "PropertiesChanged");
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_dbus_message_set_sender (message, "org.freedesktop.IBus");
Packit Service 1d8f1c
Packit Service 1d8f1c
    builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
Packit Service 1d8f1c
    g_variant_builder_add (builder, "{sv}", property_name, value);
Packit Service 1d8f1c
    g_dbus_message_set_body (message,
Packit Service 1d8f1c
                             g_variant_new ("(sa{sv}as)",
Packit Service 1d8f1c
                                            IBUS_INTERFACE_ENGINE,
Packit Service 1d8f1c
                                            builder,
Packit Service 1d8f1c
                                            NULL));
Packit Service 1d8f1c
    g_variant_builder_unref (builder);
Packit Service 1d8f1c
Packit Service 1d8f1c
    error = NULL;
Packit Service 1d8f1c
    connection = ibus_service_get_connection ((IBusService *)engine);
Packit Service 1d8f1c
    retval = g_dbus_connection_send_message (connection,
Packit Service 1d8f1c
                                             message,
Packit Service 1d8f1c
                                             G_DBUS_SEND_MESSAGE_FLAGS_NONE,
Packit Service 1d8f1c
                                             NULL,
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
    g_object_unref (message);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngine *
Packit Service 1d8f1c
ibus_engine_new (const gchar     *engine_name,
Packit Service 1d8f1c
                 const gchar     *object_path,
Packit Service 1d8f1c
                 GDBusConnection *connection)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    return ibus_engine_new_with_type (IBUS_TYPE_ENGINE,
Packit Service 1d8f1c
                                      engine_name,
Packit Service 1d8f1c
                                      object_path,
Packit Service 1d8f1c
                                      connection);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBusEngine  *
Packit Service 1d8f1c
ibus_engine_new_with_type (GType            engine_type,
Packit Service 1d8f1c
                           const gchar     *engine_name,
Packit Service 1d8f1c
                           const gchar     *object_path,
Packit Service 1d8f1c
                           GDBusConnection *connection)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (g_type_is_a (engine_type, IBUS_TYPE_ENGINE), NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (engine_name != NULL, NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (object_path != NULL, NULL);
Packit Service 1d8f1c
    g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    GObject *object = g_object_new (engine_type,
Packit Service 1d8f1c
                                    "engine-name", engine_name,
Packit Service 1d8f1c
                                    "object-path", object_path,
Packit Service 1d8f1c
                                    "connection", connection,
Packit Service 1d8f1c
                                    NULL);
Packit Service 1d8f1c
    return IBUS_ENGINE (object);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_commit_text (IBusEngine *engine,
Packit Service 1d8f1c
                         IBusText   *text)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_TEXT (text));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "CommitText",
Packit Service 1d8f1c
                             g_variant_new ("(v)", variant));
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
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_update_preedit_text (IBusEngine      *engine,
Packit Service 1d8f1c
                                 IBusText        *text,
Packit Service 1d8f1c
                                 guint            cursor_pos,
Packit Service 1d8f1c
                                 gboolean         visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    ibus_engine_update_preedit_text_with_mode (engine,
Packit Service 1d8f1c
            text, cursor_pos, visible, IBUS_ENGINE_PREEDIT_CLEAR);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_update_preedit_text_with_mode (IBusEngine            *engine,
Packit Service 1d8f1c
                                           IBusText              *text,
Packit Service 1d8f1c
                                           guint                  cursor_pos,
Packit Service 1d8f1c
                                           gboolean               visible,
Packit Service 1d8f1c
                                           IBusPreeditFocusMode   mode)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_TEXT (text));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "UpdatePreeditText",
Packit Service 1d8f1c
                             g_variant_new ("(vubu)", variant, cursor_pos, visible, mode));
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
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void ibus_engine_update_auxiliary_text (IBusEngine      *engine,
Packit Service 1d8f1c
                                        IBusText        *text,
Packit Service 1d8f1c
                                        gboolean         visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_TEXT (text));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "UpdateAuxiliaryText",
Packit Service 1d8f1c
                             g_variant_new ("(vb)", variant, visible));
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
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_update_lookup_table (IBusEngine        *engine,
Packit Service 1d8f1c
                                 IBusLookupTable   *table,
Packit Service 1d8f1c
                                 gboolean           visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_LOOKUP_TABLE (table));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)table);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "UpdateLookupTable",
Packit Service 1d8f1c
                             g_variant_new ("(vb)", variant, visible));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_object_is_floating (table)) {
Packit Service 1d8f1c
        g_object_unref (table);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_update_lookup_table_fast (IBusEngine        *engine,
Packit Service 1d8f1c
                                      IBusLookupTable   *table,
Packit Service 1d8f1c
                                      gboolean           visible)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    /* Note: gnome shell needs the previous page and next page
Packit Service 1d8f1c
       to correctly show the page up/down arrows,
Packit Service 1d8f1c
       send three pages instead of one page. */
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_LOOKUP_TABLE (table));
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBusLookupTable *new_table;
Packit Service 1d8f1c
    IBusText *text;
Packit Service 1d8f1c
    gint page_begin;
Packit Service 1d8f1c
    gint cursor_pos;
Packit Service 1d8f1c
    gint i;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (table->candidates->len < table->page_size << 2) {
Packit Service 1d8f1c
        ibus_engine_update_lookup_table (engine, table, visible);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    page_begin = (table->cursor_pos / table->page_size) * table->page_size;
Packit Service 1d8f1c
    cursor_pos = ibus_lookup_table_get_cursor_in_page (table);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (table->cursor_pos >= table->page_size) {
Packit Service 1d8f1c
        /* has previous page, adjust the value. */
Packit Service 1d8f1c
        page_begin -= table->page_size;
Packit Service 1d8f1c
        cursor_pos += table->page_size;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    new_table = ibus_lookup_table_new
Packit Service 1d8f1c
        (table->page_size, 0, table->cursor_visible, table->round);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* '3' means the previous page, current page and next page. */
Packit Service 1d8f1c
    for (i = page_begin; i < page_begin + 3 * table->page_size &&
Packit Service 1d8f1c
             i < table->candidates->len; i++) {
Packit Service 1d8f1c
        ibus_lookup_table_append_candidate
Packit Service 1d8f1c
            (new_table, ibus_lookup_table_get_candidate (table, i));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (i = 0; (text = ibus_lookup_table_get_label (table, i)) != NULL; i++) {
Packit Service 1d8f1c
        ibus_lookup_table_append_label (new_table, text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_lookup_table_set_cursor_pos (new_table, cursor_pos);
Packit Service 1d8f1c
    ibus_lookup_table_set_orientation
Packit Service 1d8f1c
        (new_table, ibus_lookup_table_get_orientation (table));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_engine_update_lookup_table (engine, new_table, visible);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_object_is_floating (table)) {
Packit Service 1d8f1c
        g_object_unref (table);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_forward_key_event (IBusEngine      *engine,
Packit Service 1d8f1c
                               guint            keyval,
Packit Service 1d8f1c
                               guint            keycode,
Packit Service 1d8f1c
                               guint            state)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "ForwardKeyEvent",
Packit Service 1d8f1c
                             g_variant_new ("(uuu)", keyval, keycode, state));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void ibus_engine_delete_surrounding_text (IBusEngine      *engine,
Packit Service 1d8f1c
                                          gint             offset_from_cursor,
Packit Service 1d8f1c
                                          guint            nchars)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    priv = IBUS_ENGINE_GET_PRIVATE (engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Update surrounding-text cache.  This is necessary since some
Packit Service 1d8f1c
       engines call ibus_engine_get_surrounding_text() immediately
Packit Service 1d8f1c
       after ibus_engine_delete_surrounding_text(). */
Packit Service 1d8f1c
    if (priv->surrounding_text) {
Packit Service 1d8f1c
        IBusText *text;
Packit Service 1d8f1c
        glong cursor_pos, len;
Packit Service 1d8f1c
Packit Service 1d8f1c
        cursor_pos = priv->surrounding_cursor_pos + offset_from_cursor;
Packit Service 1d8f1c
        len = ibus_text_get_length (priv->surrounding_text);
Packit Service 1d8f1c
        if (cursor_pos >= 0 && len - cursor_pos >= nchars) {
Packit Service 1d8f1c
            gunichar *ucs;
Packit Service 1d8f1c
Packit Service 1d8f1c
            ucs = g_utf8_to_ucs4_fast (priv->surrounding_text->text,
Packit Service 1d8f1c
                                       -1,
Packit Service 1d8f1c
                                       NULL);
Packit Service 1d8f1c
            memmove (&ucs[cursor_pos],
Packit Service 1d8f1c
                     &ucs[cursor_pos + nchars],
Packit Service 1d8f1c
                     sizeof(gunichar) * (len - cursor_pos - nchars));
Packit Service 1d8f1c
            ucs[len - nchars] = 0;
Packit Service 1d8f1c
            text = ibus_text_new_from_ucs4 (ucs);
Packit Service 1d8f1c
            g_free (ucs);
Packit Service 1d8f1c
            priv->surrounding_cursor_pos = cursor_pos;
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            text = text_empty;
Packit Service 1d8f1c
            priv->surrounding_cursor_pos = 0;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        g_object_unref (priv->surrounding_text);
Packit Service 1d8f1c
        priv->surrounding_text = g_object_ref_sink (text);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "DeleteSurroundingText",
Packit Service 1d8f1c
                             g_variant_new ("(iu)", offset_from_cursor, nchars));
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_get_surrounding_text (IBusEngine   *engine,
Packit Service 1d8f1c
                                  IBusText    **text,
Packit Service 1d8f1c
                                  guint        *cursor_pos,
Packit Service 1d8f1c
                                  guint        *anchor_pos)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    IBusEnginePrivate *priv;
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    const gboolean signal_only = (text == NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (( signal_only && (cursor_pos == NULL)) ||
Packit Service 1d8f1c
                      (!signal_only && (cursor_pos != NULL)));
Packit Service 1d8f1c
Packit Service 1d8f1c
    g_return_if_fail (( signal_only && (anchor_pos == NULL)) ||
Packit Service 1d8f1c
                      (!signal_only && (anchor_pos != NULL)));
Packit Service 1d8f1c
Packit Service 1d8f1c
    priv = IBUS_ENGINE_GET_PRIVATE (engine);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!signal_only) {
Packit Service 1d8f1c
        *text = g_object_ref (priv->surrounding_text);
Packit Service 1d8f1c
        *cursor_pos = priv->surrounding_cursor_pos;
Packit Service 1d8f1c
        *anchor_pos = priv->selection_anchor_pos;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* tell the client that this engine will utilize surrounding-text
Packit Service 1d8f1c
     * feature, which causes periodical update.  Note that the client
Packit Service 1d8f1c
     * should request the initial surrounding-text when the engine is
Packit Service 1d8f1c
     * enabled (see ibus_im_context_focus_in() and
Packit Service 1d8f1c
     * _ibus_context_enabled_cb() in client/gtk2/ibusimcontext.c). */
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "RequireSurroundingText",
Packit Service 1d8f1c
                             NULL);
Packit Service 1d8f1c
Packit Service 1d8f1c
    // g_debug ("get-surrounding-text ('%s', %d, %d)", (*text)->text, *cursor_pos, *anchor_pos);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_get_content_type (IBusEngine *engine,
Packit Service 1d8f1c
                              guint      *purpose,
Packit Service 1d8f1c
                              guint      *hints)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
Packit Service 1d8f1c
    *purpose = engine->priv->content_purpose;
Packit Service 1d8f1c
    *hints = engine->priv->content_hints;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_register_properties (IBusEngine   *engine,
Packit Service 1d8f1c
                                 IBusPropList *prop_list)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_PROP_LIST (prop_list));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop_list);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "RegisterProperties",
Packit Service 1d8f1c
                             g_variant_new ("(v)", variant));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_object_is_floating (prop_list)) {
Packit Service 1d8f1c
        g_object_unref (prop_list);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void
Packit Service 1d8f1c
ibus_engine_update_property (IBusEngine   *engine,
Packit Service 1d8f1c
                             IBusProperty *prop)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_ENGINE (engine));
Packit Service 1d8f1c
    g_return_if_fail (IBUS_IS_PROPERTY (prop));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop);
Packit Service 1d8f1c
    ibus_engine_emit_signal (engine,
Packit Service 1d8f1c
                             "UpdateProperty",
Packit Service 1d8f1c
                             g_variant_new ("(v)", variant));
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (g_object_is_floating (prop)) {
Packit Service 1d8f1c
        g_object_unref (prop);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#define DEFINE_FUNC(name, Name)                             \
Packit Service 1d8f1c
    void                                                    \
Packit Service 1d8f1c
    ibus_engine_##name (IBusEngine *engine)                 \
Packit Service 1d8f1c
    {                                                       \
Packit Service 1d8f1c
        g_return_if_fail (IBUS_IS_ENGINE (engine));         \
Packit Service 1d8f1c
        ibus_engine_emit_signal (engine,                    \
Packit Service 1d8f1c
                              #Name,                        \
Packit Service 1d8f1c
                              NULL);                        \
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
DEFINE_FUNC (show_preedit_text, ShowPreeditText)
Packit Service 1d8f1c
DEFINE_FUNC (hide_preedit_text, HidePreeditText)
Packit Service 1d8f1c
DEFINE_FUNC (show_auxiliary_text, ShowAuxiliaryText)
Packit Service 1d8f1c
DEFINE_FUNC (hide_auxiliary_text, HideAuxiliaryText)
Packit Service 1d8f1c
DEFINE_FUNC (show_lookup_table, ShowLookupTable)
Packit Service 1d8f1c
DEFINE_FUNC (hide_lookup_table, HideLookupTable)
Packit Service 1d8f1c
#undef DEFINE_FUNC
Packit Service 1d8f1c
Packit Service 1d8f1c
const gchar *
Packit Service 1d8f1c
ibus_engine_get_name (IBusEngine *engine)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    g_return_val_if_fail (IBUS_IS_ENGINE (engine), NULL);
Packit Service 1d8f1c
    return engine->priv->engine_name;
Packit Service 1d8f1c
}