1 /* vim:set et sts=4: */
2 /* ibus - The Input Bus
3 * Copyright (C) 2008-2009 Huang Peng <shawn.p.huang@gmail.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 #include "ibusengine.h"
23 #include "ibusinternal.h"
24 #include "ibusshare.h"
26 #define IBUS_ENGINE_GET_PRIVATE(o) \
27 (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE, IBusEnginePrivate))
57 struct _IBusEnginePrivate {
59 IBusConnection *connection;
61 typedef struct _IBusEnginePrivate IBusEnginePrivate;
63 static guint engine_signals[LAST_SIGNAL] = { 0 };
65 /* functions prototype */
66 static void ibus_engine_class_init (IBusEngineClass *klass);
67 static void ibus_engine_init (IBusEngine *engine);
68 static void ibus_engine_destroy (IBusEngine *engine);
69 static void ibus_engine_set_property (IBusEngine *engine,
73 static void ibus_engine_get_property (IBusEngine *engine,
77 static gboolean ibus_engine_ibus_message (IBusEngine *engine,
78 IBusConnection *connection,
79 IBusMessage *message);
80 static gboolean ibus_engine_process_key_event
85 static void ibus_engine_focus_in (IBusEngine *engine);
86 static void ibus_engine_focus_out (IBusEngine *engine);
87 static void ibus_engine_reset (IBusEngine *engine);
88 static void ibus_engine_enable (IBusEngine *engine);
89 static void ibus_engine_disable (IBusEngine *engine);
90 static void ibus_engine_set_cursor_location
96 static void ibus_engine_set_capabilities
99 static void ibus_engine_page_up (IBusEngine *engine);
100 static void ibus_engine_page_down (IBusEngine *engine);
101 static void ibus_engine_cursor_up (IBusEngine *engine);
102 static void ibus_engine_cursor_down (IBusEngine *engine);
103 static void ibus_engine_candidate_clicked
108 static void ibus_engine_property_activate
110 const gchar *prop_name,
112 static void ibus_engine_property_show (IBusEngine *engine,
113 const gchar *prop_name);
114 static void ibus_engine_property_hide (IBusEngine *engine,
115 const gchar *prop_name);
118 static IBusServiceClass *parent_class = NULL;
121 ibus_engine_get_type (void)
123 static GType type = 0;
125 static const GTypeInfo type_info = {
126 sizeof (IBusEngineClass),
127 (GBaseInitFunc) NULL,
128 (GBaseFinalizeFunc) NULL,
129 (GClassInitFunc) ibus_engine_class_init,
130 NULL, /* class finalize */
131 NULL, /* class data */
134 (GInstanceInitFunc) ibus_engine_init,
138 type = g_type_register_static (IBUS_TYPE_SERVICE,
147 ibus_engine_new (const gchar *name,
149 IBusConnection *connection)
152 g_assert (IBUS_IS_CONNECTION (connection));
156 engine = (IBusEngine *) g_object_new (IBUS_TYPE_ENGINE,
159 "connection", connection,
166 ibus_engine_class_init (IBusEngineClass *klass)
168 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
169 IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
171 parent_class = (IBusServiceClass *) g_type_class_peek_parent (klass);
173 g_type_class_add_private (klass, sizeof (IBusEnginePrivate));
175 gobject_class->set_property = (GObjectSetPropertyFunc) ibus_engine_set_property;
176 gobject_class->get_property = (GObjectGetPropertyFunc) ibus_engine_get_property;
178 ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_engine_destroy;
180 IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_engine_ibus_message;
182 klass->process_key_event = ibus_engine_process_key_event;
183 klass->focus_in = ibus_engine_focus_in;
184 klass->focus_out = ibus_engine_focus_out;
185 klass->reset = ibus_engine_reset;
186 klass->enable = ibus_engine_enable;
187 klass->disable = ibus_engine_disable;
188 klass->page_up = ibus_engine_page_up;
189 klass->page_down = ibus_engine_page_down;
190 klass->cursor_up = ibus_engine_cursor_up;
191 klass->cursor_down = ibus_engine_cursor_down;
192 klass->candidate_clicked = ibus_engine_candidate_clicked;
193 klass->property_activate = ibus_engine_property_activate;
194 klass->property_show = ibus_engine_property_show;
195 klass->property_hide = ibus_engine_property_hide;
196 klass->set_cursor_location = ibus_engine_set_cursor_location;
197 klass->set_capabilities = ibus_engine_set_capabilities;
200 /* install properties */
204 * Name of this IBusEngine.
206 g_object_class_install_property (gobject_class,
208 g_param_spec_string ("name",
212 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
215 * IBusEngine:connection:
217 * Connection of this IBusEngine.
219 g_object_class_install_property (gobject_class,
221 g_param_spec_object ("connection",
223 "The connection of engine object",
224 IBUS_TYPE_CONNECTION,
225 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
227 /* install signals */
229 * IBusEngine::process-key-event:
230 * @engine: An IBusEngine.
231 * @keyval: KeySym of the key press.
232 * @state: Key modifier flags
234 * Emitted when a key event is received.
235 * Implement the member function process_key_event() in extended class to receive this signal.
237 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
239 engine_signals[PROCESS_KEY_EVENT] =
240 g_signal_new (I_("process-key-event"),
241 G_TYPE_FROM_CLASS (gobject_class),
243 G_STRUCT_OFFSET (IBusEngineClass, process_key_event),
245 ibus_marshal_BOOL__UINT_UINT_UINT,
253 * IBusEngine::focus-in:
254 * @engine: An IBusEngine.
256 * Emitted when the client application get the focus.
257 * Implement the member function focus_in() in extended class to receive this signal.
259 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
261 engine_signals[FOCUS_IN] =
262 g_signal_new (I_("focus-in"),
263 G_TYPE_FROM_CLASS (gobject_class),
265 G_STRUCT_OFFSET (IBusEngineClass, focus_in),
267 ibus_marshal_VOID__VOID,
272 * IBusEngine::focus-out:
273 * @engine: An IBusEngine.
275 * Emitted when the client application lost the focus.
276 * Implement the member function focus_out() in extended class to receive this signal.
278 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
280 engine_signals[FOCUS_OUT] =
281 g_signal_new (I_("focus-out"),
282 G_TYPE_FROM_CLASS (gobject_class),
284 G_STRUCT_OFFSET (IBusEngineClass, focus_out),
286 ibus_marshal_VOID__VOID,
292 * @engine: An IBusEngine.
294 * Emitted when the IME is reset.
295 * Implement the member function reset() in extended class to receive this signal.
297 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
299 engine_signals[RESET] =
300 g_signal_new (I_("reset"),
301 G_TYPE_FROM_CLASS (gobject_class),
303 G_STRUCT_OFFSET (IBusEngineClass, reset),
305 ibus_marshal_VOID__VOID,
310 * IBusEngine::enable:
311 * @engine: An IBusEngine.
313 * Emitted when the IME is enabled.
314 * Implement the member function set_enable() in extended class to receive this signal.
316 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
318 engine_signals[ENABLE] =
319 g_signal_new (I_("enable"),
320 G_TYPE_FROM_CLASS (gobject_class),
322 G_STRUCT_OFFSET (IBusEngineClass, enable),
324 ibus_marshal_VOID__VOID,
329 * IBusEngine::disable:
330 * @engine: An IBusEngine.
332 * Emitted when the IME is disabled.
333 * Implement the member function set_disable() in extended class to receive this signal.
335 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
337 engine_signals[DISABLE] =
338 g_signal_new (I_("disable"),
339 G_TYPE_FROM_CLASS (gobject_class),
341 G_STRUCT_OFFSET (IBusEngineClass, disable),
343 ibus_marshal_VOID__VOID,
348 * IBusEngine::set-cursor-location:
349 * @engine: An IBusEngine.
351 * Emitted when the location of IME is set.
352 * Implement the member function set_cursor_location() in extended class to receive this signal.
354 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
356 engine_signals[SET_CURSOR_LOCATION] =
357 g_signal_new (I_("set-cursor-location"),
358 G_TYPE_FROM_CLASS (gobject_class),
360 G_STRUCT_OFFSET (IBusEngineClass, set_cursor_location),
362 ibus_marshal_VOID__INT_INT_INT_INT,
371 * IBusEngine::set-capabilities:
372 * @engine: An IBusEngine.
373 * @caps: Capabilities flags of IBusEngine, see #IBusCapabilite
375 * Emitted when the client application capabilities is set.
376 * Implement the member function set_capabilities() in extended class to receive this signal.
378 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
380 engine_signals[SET_CAPABILITIES] =
381 g_signal_new (I_("set-capabilities"),
382 G_TYPE_FROM_CLASS (gobject_class),
384 G_STRUCT_OFFSET (IBusEngineClass, set_capabilities),
386 ibus_marshal_VOID__UINT,
392 * IBusEngine::page-up:
393 * @engine: An IBusEngine.
395 * Emitted when the page-up button is pressed.
396 * Implement the member function page_up() in extended class to receive this signal.
398 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
400 engine_signals[PAGE_UP] =
401 g_signal_new (I_("page-up"),
402 G_TYPE_FROM_CLASS (gobject_class),
404 G_STRUCT_OFFSET (IBusEngineClass, page_up),
406 ibus_marshal_VOID__VOID,
411 * IBusEngine::page-down:
412 * @engine: An IBusEngine.
414 * Emitted when the page-down button is pressed.
415 * Implement the member function page_down() in extended class to receive this signal.
417 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
419 engine_signals[PAGE_DOWN] =
420 g_signal_new (I_("page-down"),
421 G_TYPE_FROM_CLASS (gobject_class),
423 G_STRUCT_OFFSET (IBusEngineClass, page_down),
425 ibus_marshal_VOID__VOID,
430 * IBusEngine::cursor-up:
431 * @engine: An IBusEngine.
433 * Emitted when the up cursor button is pressed.
434 * Implement the member function cursor_up() in extended class to receive this signal.
436 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
438 engine_signals[CURSOR_UP] =
439 g_signal_new (I_("cursor-up"),
440 G_TYPE_FROM_CLASS (gobject_class),
442 G_STRUCT_OFFSET (IBusEngineClass, cursor_up),
444 ibus_marshal_VOID__VOID,
449 * IBusEngine::cursor-down:
450 * @engine: An IBusEngine.
452 * Emitted when the down cursor button is pressed.
453 * Implement the member function cursor_down() in extended class to receive this signal.
455 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
457 engine_signals[CURSOR_DOWN] =
458 g_signal_new (I_("cursor-down"),
459 G_TYPE_FROM_CLASS (gobject_class),
461 G_STRUCT_OFFSET (IBusEngineClass, cursor_down),
463 ibus_marshal_VOID__VOID,
468 * IBusEngine::candidate-clicked:
469 * @engine: An IBusEngine.
471 * Emitted when candidate on lookup table is clicked.
472 * Implement the member function candidate_clicked() in extended class to receive this signal.
474 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
476 engine_signals[CANDIDATE_CLICKED] =
477 g_signal_new (I_("candidate-clicked"),
478 G_TYPE_FROM_CLASS (gobject_class),
480 G_STRUCT_OFFSET (IBusEngineClass, candidate_clicked),
482 ibus_marshal_VOID__UINT_UINT_UINT,
490 * IBusEngine::property-activate:
491 * @engine: An IBusEngine.
493 * Emitted when a property is activated or change changed.
494 * Implement the member function property_activate() in extended class to receive this signal.
496 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
498 engine_signals[PROPERTY_ACTIVATE] =
499 g_signal_new (I_("property-activate"),
500 G_TYPE_FROM_CLASS (gobject_class),
502 G_STRUCT_OFFSET (IBusEngineClass, property_activate),
504 ibus_marshal_VOID__STRING_UINT,
511 * IBusEngine::property-show:
512 * @engine: An IBusEngine.
514 * Emitted when a property is shown.
515 * Implement the member function property_side() in extended class to receive this signal.
517 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
519 engine_signals[PROPERTY_SHOW] =
520 g_signal_new (I_("property-show"),
521 G_TYPE_FROM_CLASS (gobject_class),
523 G_STRUCT_OFFSET (IBusEngineClass, property_show),
525 ibus_marshal_VOID__STRING,
531 * IBusEngine::property-hide:
532 * @engine: An IBusEngine.
534 * Emitted when a property is hidden.
535 * Implement the member function property_hide() in extended class to receive this signal.
537 * <note><para>@user_data is not actually a valid parameter. It is displayed because of GtkDoc bug.</para></note>
539 engine_signals[PROPERTY_HIDE] =
540 g_signal_new (I_("property-hide"),
541 G_TYPE_FROM_CLASS (gobject_class),
543 G_STRUCT_OFFSET (IBusEngineClass, property_hide),
545 ibus_marshal_VOID__STRING,
553 ibus_engine_init (IBusEngine *engine)
555 IBusEnginePrivate *priv;
556 priv = IBUS_ENGINE_GET_PRIVATE (engine);
559 priv->connection = NULL;
563 ibus_engine_destroy (IBusEngine *engine)
565 IBusEnginePrivate *priv;
566 priv = IBUS_ENGINE_GET_PRIVATE (engine);
570 if (priv->connection) {
571 g_object_unref (priv->connection);
572 priv->connection = NULL;
575 IBUS_OBJECT_CLASS(parent_class)->destroy (IBUS_OBJECT (engine));
579 ibus_engine_set_property (IBusEngine *engine,
584 IBusEnginePrivate *priv;
585 priv = IBUS_ENGINE_GET_PRIVATE (engine);
589 priv->name = g_strdup (g_value_dup_string (value));
592 case PROP_CONNECTION:
593 priv->connection = g_value_get_object (value);
594 g_object_ref (priv->connection);
595 ibus_service_add_to_connection ((IBusService *) engine,
600 G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
605 ibus_engine_get_property (IBusEngine *engine,
606 guint prop_id, GValue *value, GParamSpec *pspec)
608 IBusEnginePrivate *priv;
609 priv = IBUS_ENGINE_GET_PRIVATE (engine);
613 g_value_set_string (value, priv->name);
616 case PROP_CONNECTION:
617 g_value_set_object (value, priv->connection);
621 G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
626 ibus_engine_ibus_message (IBusEngine *engine,
627 IBusConnection *connection,
628 IBusMessage *message)
630 g_assert (IBUS_IS_ENGINE (engine));
631 g_assert (IBUS_IS_CONNECTION (connection));
632 g_assert (message != NULL);
634 IBusEnginePrivate *priv;
635 priv = IBUS_ENGINE_GET_PRIVATE (engine);
637 g_assert (priv->connection == connection);
639 IBusMessage *return_message = NULL;
640 IBusMessage *error_message = NULL;
642 static const struct {
645 } no_arg_methods[] = {
646 {"FocusIn", FOCUS_IN},
647 {"FocusOut", FOCUS_OUT},
650 {"Disable", DISABLE},
652 {"PageDown", PAGE_DOWN},
653 {"CursorUp", CURSOR_UP},
654 {"CursorDown", CURSOR_DOWN},
659 for (i = 0; no_arg_methods[i].member != NULL; i++) {
660 if (!ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, no_arg_methods[i].member))
663 IBusMessageIter iter;
664 ibus_message_iter_init (message, &iter);
665 if (ibus_message_iter_has_next (&iter)) {
666 error_message = ibus_message_new_error_printf (message,
667 DBUS_ERROR_INVALID_ARGS,
668 "%s.%s: Method does not have arguments",
669 IBUS_INTERFACE_ENGINE, no_arg_methods[i].member);
670 ibus_connection_send (connection, error_message);
671 ibus_message_unref (error_message);
675 g_signal_emit (engine, engine_signals[no_arg_methods[i].signal_id], 0);
676 return_message = ibus_message_new_method_return (message);
677 ibus_connection_send (connection, return_message);
678 ibus_message_unref (return_message);
682 if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "ProcessKeyEvent")) {
683 guint keyval, keycode, state;
685 IBusError *error = NULL;
687 retval = ibus_message_get_args (message,
689 G_TYPE_UINT, &keyval,
690 G_TYPE_UINT, &keycode,
695 goto _keypress2_fail;
698 g_signal_emit (engine,
699 engine_signals[PROCESS_KEY_EVENT],
706 return_message = ibus_message_new_method_return (message);
707 ibus_message_append_args (return_message,
708 G_TYPE_BOOLEAN, &retval,
710 ibus_connection_send (connection, return_message);
711 ibus_message_unref (return_message);
715 error_message = ibus_message_new_error_printf (message,
716 DBUS_ERROR_INVALID_ARGS,
717 "%s.%s: Can not match signature (ubu) of method",
718 IBUS_INTERFACE_ENGINE, "ProcessKeyEvent2");
719 ibus_connection_send (connection, error_message);
720 ibus_message_unref (error_message);
724 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "CandidateClicked")) {
725 guint index, button, state;
727 IBusError *error = NULL;
729 retval = ibus_message_get_args (message,
732 G_TYPE_UINT, &button,
737 goto _candidate_clicked_fail;
740 g_signal_emit (engine,
741 engine_signals[CANDIDATE_CLICKED],
748 return_message = ibus_message_new_method_return (message);
749 ibus_connection_send (connection, return_message);
750 ibus_message_unref (return_message);
753 _candidate_clicked_fail:
754 error_message = ibus_message_new_error_printf (message,
755 DBUS_ERROR_INVALID_ARGS,
756 "%s.%s: Can not match signature (uuu) of method",
757 IBUS_INTERFACE_ENGINE, "CandidateClicked");
758 ibus_connection_send (connection, error_message);
759 ibus_message_unref (error_message);
762 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyActivate")) {
766 IBusError *error = NULL;
768 retval = ibus_message_get_args (message,
770 G_TYPE_STRING, &name,
775 goto _property_activate_fail;
777 g_signal_emit (engine,
778 engine_signals[PROPERTY_ACTIVATE],
783 return_message = ibus_message_new_method_return (message);
784 ibus_connection_send (connection, return_message);
785 ibus_message_unref (return_message);
788 _property_activate_fail:
789 error_message = ibus_message_new_error_printf (message,
790 DBUS_ERROR_INVALID_ARGS,
791 "%s.%s: Can not match signature (si) of method",
792 IBUS_INTERFACE_ENGINE,
794 ibus_connection_send (connection, error_message);
795 ibus_message_unref (error_message);
799 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyShow")) {
804 retval = ibus_message_get_args (message,
806 G_TYPE_STRING, &name,
810 goto _property_show_fail;
812 g_signal_emit (engine,
813 engine_signals[PROPERTY_SHOW],
817 return_message = ibus_message_new_method_return (message);
818 ibus_connection_send (connection, return_message);
819 ibus_message_unref (return_message);
823 error_message = ibus_message_new_error_printf (message,
824 DBUS_ERROR_INVALID_ARGS,
825 "%s.%s: Can not match signature (s) of method",
826 IBUS_INTERFACE_ENGINE,
828 ibus_connection_send (connection, error_message);
829 ibus_message_unref (error_message);
832 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyHide")) {
835 IBusError *error = NULL;
837 retval = ibus_message_get_args (message,
839 G_TYPE_STRING, &name,
842 goto _property_hide_fail;
844 g_signal_emit (engine, engine_signals[PROPERTY_HIDE], 0, name);
846 return_message = ibus_message_new_method_return (message);
847 ibus_connection_send (connection, return_message);
848 ibus_message_unref (return_message);
852 error_message = ibus_message_new_error_printf (message,
853 DBUS_ERROR_INVALID_ARGS,
854 "%s.%s: Can not match signature (s) of method",
855 IBUS_INTERFACE_ENGINE, "PropertyHide");
856 ibus_connection_send (connection, error_message);
857 ibus_message_unref (error_message);
860 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "SetCursorLocation")) {
863 IBusError *error = NULL;
865 retval = ibus_message_get_args (message,
873 goto _set_cursor_location_fail;
875 engine->cursor_area.x = x;
876 engine->cursor_area.y = y;
877 engine->cursor_area.width = w;
878 engine->cursor_area.height = h;
880 g_signal_emit (engine,
881 engine_signals[SET_CURSOR_LOCATION],
885 return_message = ibus_message_new_method_return (message);
886 ibus_connection_send (connection, return_message);
887 ibus_message_unref (return_message);
890 _set_cursor_location_fail:
891 error_message = ibus_message_new_error_printf (message,
892 DBUS_ERROR_INVALID_ARGS,
893 "%s.%s: Can not match signature (iiii) of method",
894 IBUS_INTERFACE_ENGINE,
895 "SetCursorLocation");
896 ibus_connection_send (connection, error_message);
897 ibus_message_unref (error_message);
900 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "SetCapabilities")) {
903 IBusError *error = NULL;
905 retval = ibus_message_get_args (message,
911 goto _set_capabilities_fail;
913 engine->client_capabilities = caps;
915 g_signal_emit (engine, engine_signals[SET_CAPABILITIES], 0, caps);
917 return_message = ibus_message_new_method_return (message);
918 ibus_connection_send (connection, return_message);
919 ibus_message_unref (return_message);
922 _set_capabilities_fail:
923 error_message = ibus_message_new_error_printf (message,
924 DBUS_ERROR_INVALID_ARGS,
925 "%s.%s: Can not match signature (u) of method",
926 IBUS_INTERFACE_ENGINE, "SetCapabilities");
927 ibus_connection_send (connection, error_message);
928 ibus_message_unref (error_message);
931 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "Destroy")) {
932 return_message = ibus_message_new_method_return (message);
934 ibus_connection_send (connection, return_message);
935 ibus_message_unref (return_message);
937 ibus_object_destroy ((IBusObject *) engine);
940 return parent_class->ibus_message ((IBusService *) engine, connection, message);
944 ibus_engine_process_key_event (IBusEngine *engine,
953 ibus_engine_focus_in (IBusEngine *engine)
955 // g_debug ("focus-in");
959 ibus_engine_focus_out (IBusEngine *engine)
961 // g_debug ("focus-out");
965 ibus_engine_reset (IBusEngine *engine)
967 // g_debug ("reset");
971 ibus_engine_enable (IBusEngine *engine)
973 // g_debug ("enable");
977 ibus_engine_disable (IBusEngine *engine)
979 // g_debug ("disable");
983 ibus_engine_set_cursor_location (IBusEngine *engine,
989 // g_debug ("set-cursor-location (%d, %d, %d, %d)", x, y, w, h);
993 ibus_engine_set_capabilities (IBusEngine *engine,
996 // g_debug ("set-capabilities (0x%04x)", caps);
1000 ibus_engine_page_up (IBusEngine *engine)
1002 // g_debug ("page-up");
1006 ibus_engine_page_down (IBusEngine *engine)
1008 // g_debug ("page-down");
1012 ibus_engine_cursor_up (IBusEngine *engine)
1014 // g_debug ("cursor-up");
1018 ibus_engine_cursor_down (IBusEngine *engine)
1020 // g_debug ("cursor-down");
1024 ibus_engine_candidate_clicked (IBusEngine *engine,
1029 // g_debug ("candidate-clicked");
1033 ibus_engine_property_activate (IBusEngine *engine,
1034 const gchar *prop_name,
1037 // g_debug ("property-activate ('%s', %d)", prop_name, prop_state);
1041 ibus_engine_property_show (IBusEngine *engine, const gchar *prop_name)
1043 // g_debug ("property-show ('%s')", prop_name);
1047 ibus_engine_property_hide (IBusEngine *engine, const gchar *prop_name)
1049 // g_debug ("property-hide ('%s')", prop_name);
1053 _send_signal (IBusEngine *engine,
1055 GType first_arg_type,
1058 g_assert (IBUS_IS_ENGINE (engine));
1059 g_assert (name != NULL);
1063 IBusEnginePrivate *priv;
1065 priv = IBUS_ENGINE_GET_PRIVATE (engine);
1067 path = ibus_service_get_path ((IBusService *)engine);
1069 va_start (args, first_arg_type);
1070 ibus_connection_send_signal_valist (priv->connection,
1072 IBUS_INTERFACE_ENGINE,
1080 ibus_engine_commit_text (IBusEngine *engine,
1083 _send_signal (engine,
1085 IBUS_TYPE_TEXT, &text,
1090 ibus_engine_update_preedit_text (IBusEngine *engine,
1095 _send_signal (engine,
1096 "UpdatePreeditText",
1097 IBUS_TYPE_TEXT, &text,
1098 G_TYPE_UINT, &cursor_pos,
1099 G_TYPE_BOOLEAN, &visible,
1104 ibus_engine_show_preedit_text (IBusEngine *engine)
1106 _send_signal (engine,
1111 void ibus_engine_hide_preedit_text (IBusEngine *engine)
1113 _send_signal (engine,
1118 void ibus_engine_update_auxiliary_text (IBusEngine *engine,
1122 _send_signal (engine,
1123 "UpdateAuxiliaryText",
1124 IBUS_TYPE_TEXT, &text,
1125 G_TYPE_BOOLEAN, &visible,
1130 ibus_engine_show_auxiliary_text (IBusEngine *engine)
1132 _send_signal (engine,
1133 "ShowAuxiliaryText",
1138 ibus_engine_hide_auxiliary_text (IBusEngine *engine)
1140 _send_signal (engine,
1141 "HideAuxiliaryText",
1146 ibus_engine_update_lookup_table (IBusEngine *engine,
1147 IBusLookupTable *table,
1150 _send_signal (engine,
1151 "UpdateLookupTable",
1152 IBUS_TYPE_LOOKUP_TABLE, &table,
1153 G_TYPE_BOOLEAN, &visible,
1158 ibus_engine_update_lookup_table_fast (IBusEngine *engine,
1159 IBusLookupTable *table,
1162 IBusLookupTable *new_table;
1166 if (table->candidates->len < table->page_size << 2) {
1167 ibus_engine_update_lookup_table (engine, table, visible);
1171 page_begin = (table->cursor_pos / table->page_size) * table->page_size;
1173 new_table = ibus_lookup_table_new (table->page_size, 0, table->cursor_visible, table->round);
1175 for (i = page_begin; i < page_begin + table->page_size && i < table->candidates->len; i++) {
1176 ibus_lookup_table_append_candidate (new_table, ibus_lookup_table_get_candidate (table, i));
1179 ibus_lookup_table_set_cursor_pos (new_table, ibus_lookup_table_get_cursor_in_page (table));
1181 ibus_engine_update_lookup_table (engine, new_table, visible);
1183 g_object_unref (new_table);
1186 void ibus_engine_show_lookup_table (IBusEngine *engine)
1188 _send_signal (engine,
1193 void ibus_engine_hide_lookup_table (IBusEngine *engine)
1195 _send_signal (engine,
1200 void ibus_engine_forward_key_event (IBusEngine *engine,
1205 _send_signal (engine,
1207 G_TYPE_UINT, &keyval,
1208 G_TYPE_UINT, &keycode,
1209 G_TYPE_UINT, &state,
1214 ibus_engine_register_properties (IBusEngine *engine,
1215 IBusPropList *prop_list)
1217 _send_signal (engine,
1218 "RegisterProperties",
1219 IBUS_TYPE_PROP_LIST, &prop_list,
1224 ibus_engine_update_property (IBusEngine *engine,
1227 _send_signal (engine,
1229 IBUS_TYPE_PROPERTY, &prop,
1234 ibus_engine_get_name (IBusEngine *engine)
1236 g_assert (IBUS_IS_ENGINE (engine));
1238 IBusEnginePrivate *priv;
1239 priv = IBUS_ENGINE_GET_PRIVATE (engine);