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))
56 struct _IBusEnginePrivate {
58 IBusConnection *connection;
60 typedef struct _IBusEnginePrivate IBusEnginePrivate;
62 static guint engine_signals[LAST_SIGNAL] = { 0 };
64 /* functions prototype */
65 static void ibus_engine_class_init (IBusEngineClass *klass);
66 static void ibus_engine_init (IBusEngine *engine);
67 static void ibus_engine_destroy (IBusEngine *engine);
68 static void ibus_engine_set_property (IBusEngine *engine,
72 static void ibus_engine_get_property (IBusEngine *engine,
76 static gboolean ibus_engine_ibus_message (IBusEngine *engine,
77 IBusConnection *connection,
78 IBusMessage *message);
79 static gboolean ibus_engine_process_key_event
83 static void ibus_engine_focus_in (IBusEngine *engine);
84 static void ibus_engine_focus_out (IBusEngine *engine);
85 static void ibus_engine_reset (IBusEngine *engine);
86 static void ibus_engine_enable (IBusEngine *engine);
87 static void ibus_engine_disable (IBusEngine *engine);
88 static void ibus_engine_set_cursor_location
94 static void ibus_engine_set_capabilities
97 static void ibus_engine_page_up (IBusEngine *engine);
98 static void ibus_engine_page_down (IBusEngine *engine);
99 static void ibus_engine_cursor_up (IBusEngine *engine);
100 static void ibus_engine_cursor_down (IBusEngine *engine);
101 static void ibus_engine_property_activate
103 const gchar *prop_name,
105 static void ibus_engine_property_show (IBusEngine *engine,
106 const gchar *prop_name);
107 static void ibus_engine_property_hide (IBusEngine *engine,
108 const gchar *prop_name);
111 static IBusServiceClass *parent_class = NULL;
114 ibus_engine_get_type (void)
116 static GType type = 0;
118 static const GTypeInfo type_info = {
119 sizeof (IBusEngineClass),
120 (GBaseInitFunc) NULL,
121 (GBaseFinalizeFunc) NULL,
122 (GClassInitFunc) ibus_engine_class_init,
123 NULL, /* class finalize */
124 NULL, /* class data */
127 (GInstanceInitFunc) ibus_engine_init,
131 type = g_type_register_static (IBUS_TYPE_SERVICE,
140 ibus_engine_new (const gchar *name,
142 IBusConnection *connection)
145 g_assert (IBUS_IS_CONNECTION (connection));
149 engine = (IBusEngine *) g_object_new (IBUS_TYPE_ENGINE,
152 "connection", connection,
159 ibus_engine_class_init (IBusEngineClass *klass)
161 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
162 IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
164 parent_class = (IBusServiceClass *) g_type_class_peek_parent (klass);
166 g_type_class_add_private (klass, sizeof (IBusEnginePrivate));
168 gobject_class->set_property = (GObjectSetPropertyFunc) ibus_engine_set_property;
169 gobject_class->get_property = (GObjectGetPropertyFunc) ibus_engine_get_property;
171 ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_engine_destroy;
173 IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_engine_ibus_message;
175 klass->process_key_event = ibus_engine_process_key_event;
176 klass->focus_in = ibus_engine_focus_in;
177 klass->focus_out = ibus_engine_focus_out;
178 klass->reset = ibus_engine_reset;
179 klass->enable = ibus_engine_enable;
180 klass->disable = ibus_engine_disable;
181 klass->page_up = ibus_engine_page_up;
182 klass->page_down = ibus_engine_page_down;
183 klass->cursor_up = ibus_engine_cursor_up;
184 klass->cursor_down = ibus_engine_cursor_down;
185 klass->property_activate = ibus_engine_property_activate;
186 klass->property_show = ibus_engine_property_show;
187 klass->property_hide = ibus_engine_property_hide;
188 klass->set_cursor_location = ibus_engine_set_cursor_location;
189 klass->set_capabilities = ibus_engine_set_capabilities;
192 /* install properties */
196 * Name of this IBusEngine.
198 g_object_class_install_property (gobject_class,
200 g_param_spec_string ("name",
204 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
207 * IBusEngine:connection:
209 * Connection of this IBusEngine.
211 g_object_class_install_property (gobject_class,
213 g_param_spec_object ("connection",
215 "The connection of engine object",
216 IBUS_TYPE_CONNECTION,
217 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
219 /* install signals */
221 * IBusEngine::process-key-event:
222 * @engine: An IBusEngine.
223 * @keyval: KeySym of the key press.
224 * @state: Key modifier flags
226 * Emitted when a key event is received.
227 * Implement the member function process_key_event() in extended class to receive this signal.
229 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
231 engine_signals[PROCESS_KEY_EVENT] =
232 g_signal_new (I_("process-key-event"),
233 G_TYPE_FROM_CLASS (gobject_class),
235 G_STRUCT_OFFSET (IBusEngineClass, process_key_event),
237 ibus_marshal_BOOL__UINT_UINT,
244 * IBusEngine::focus-in:
245 * @engine: An IBusEngine.
247 * Emitted when the client application get the focus.
248 * Implement the member function focus_in() in extended class to receive this signal.
250 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
252 engine_signals[FOCUS_IN] =
253 g_signal_new (I_("focus-in"),
254 G_TYPE_FROM_CLASS (gobject_class),
256 G_STRUCT_OFFSET (IBusEngineClass, focus_in),
258 ibus_marshal_VOID__VOID,
263 * IBusEngine::focus-out:
264 * @engine: An IBusEngine.
266 * Emitted when the client application lost the focus.
267 * Implement the member function focus_out() in extended class to receive this signal.
269 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
271 engine_signals[FOCUS_OUT] =
272 g_signal_new (I_("focus-out"),
273 G_TYPE_FROM_CLASS (gobject_class),
275 G_STRUCT_OFFSET (IBusEngineClass, focus_out),
277 ibus_marshal_VOID__VOID,
283 * @engine: An IBusEngine.
285 * Emitted when the IME is reset.
286 * Implement the member function reset() in extended class to receive this signal.
288 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
290 engine_signals[RESET] =
291 g_signal_new (I_("reset"),
292 G_TYPE_FROM_CLASS (gobject_class),
294 G_STRUCT_OFFSET (IBusEngineClass, reset),
296 ibus_marshal_VOID__VOID,
301 * IBusEngine::enable:
302 * @engine: An IBusEngine.
304 * Emitted when the IME is enabled.
305 * Implement the member function set_enable() in extended class to receive this signal.
307 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
309 engine_signals[ENABLE] =
310 g_signal_new (I_("enable"),
311 G_TYPE_FROM_CLASS (gobject_class),
313 G_STRUCT_OFFSET (IBusEngineClass, enable),
315 ibus_marshal_VOID__VOID,
320 * IBusEngine::disable:
321 * @engine: An IBusEngine.
323 * Emitted when the IME is disabled.
324 * Implement the member function set_disable() in extended class to receive this signal.
326 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
328 engine_signals[DISABLE] =
329 g_signal_new (I_("disable"),
330 G_TYPE_FROM_CLASS (gobject_class),
332 G_STRUCT_OFFSET (IBusEngineClass, disable),
334 ibus_marshal_VOID__VOID,
339 * IBusEngine::set-cursor-location:
340 * @engine: An IBusEngine.
342 * Emitted when the location of IME is set.
343 * Implement the member function set_cursor_location() in extended class to receive this signal.
345 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
347 engine_signals[SET_CURSOR_LOCATION] =
348 g_signal_new (I_("set-cursor-location"),
349 G_TYPE_FROM_CLASS (gobject_class),
351 G_STRUCT_OFFSET (IBusEngineClass, set_cursor_location),
353 ibus_marshal_VOID__INT_INT_INT_INT,
362 * IBusEngine::set-capabilities:
363 * @engine: An IBusEngine.
364 * @caps: Capabilities flags of IBusEngine, see #IBusCapabilite
366 * Emitted when the client application capabilities is set.
367 * Implement the member function set_capabilities() in extended class to receive this signal.
369 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
371 engine_signals[SET_CAPABILITIES] =
372 g_signal_new (I_("set-capabilities"),
373 G_TYPE_FROM_CLASS (gobject_class),
375 G_STRUCT_OFFSET (IBusEngineClass, set_capabilities),
377 ibus_marshal_VOID__UINT,
383 * IBusEngine::page-up:
384 * @engine: An IBusEngine.
386 * Emitted when the page-up key is pressed.
387 * Implement the member function page_up() in extended class to receive this signal.
389 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
391 engine_signals[PAGE_UP] =
392 g_signal_new (I_("page-up"),
393 G_TYPE_FROM_CLASS (gobject_class),
395 G_STRUCT_OFFSET (IBusEngineClass, page_up),
397 ibus_marshal_VOID__VOID,
402 * IBusEngine::page-down:
403 * @engine: An IBusEngine.
405 * Emitted when the page-down key is pressed.
406 * Implement the member function page_down() in extended class to receive this signal.
408 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
410 engine_signals[PAGE_DOWN] =
411 g_signal_new (I_("page-down"),
412 G_TYPE_FROM_CLASS (gobject_class),
414 G_STRUCT_OFFSET (IBusEngineClass, page_down),
416 ibus_marshal_VOID__VOID,
421 * IBusEngine::cursor-up:
422 * @engine: An IBusEngine.
424 * Emitted when the up cursor key is pressed.
425 * Implement the member function cursor_up() in extended class to receive this signal.
427 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
429 engine_signals[CURSOR_UP] =
430 g_signal_new (I_("cursor-up"),
431 G_TYPE_FROM_CLASS (gobject_class),
433 G_STRUCT_OFFSET (IBusEngineClass, cursor_up),
435 ibus_marshal_VOID__VOID,
440 * IBusEngine::cursor-down:
441 * @engine: An IBusEngine.
443 * Emitted when the down cursor key is pressed.
444 * Implement the member function cursor_down() in extended class to receive this signal.
446 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
448 engine_signals[CURSOR_DOWN] =
449 g_signal_new (I_("cursor-down"),
450 G_TYPE_FROM_CLASS (gobject_class),
452 G_STRUCT_OFFSET (IBusEngineClass, cursor_down),
454 ibus_marshal_VOID__VOID,
459 * IBusEngine::property-activate:
460 * @engine: An IBusEngine.
462 * Emitted when a property is activated or change changed.
463 * Implement the member function property_activate() in extended class to receive this signal.
465 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
467 engine_signals[PROPERTY_ACTIVATE] =
468 g_signal_new (I_("property-activate"),
469 G_TYPE_FROM_CLASS (gobject_class),
471 G_STRUCT_OFFSET (IBusEngineClass, property_activate),
473 ibus_marshal_VOID__STRING_UINT,
480 * IBusEngine::property-show:
481 * @engine: An IBusEngine.
483 * Emitted when a property is shown.
484 * Implement the member function property_side() in extended class to receive this signal.
486 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
488 engine_signals[PROPERTY_SHOW] =
489 g_signal_new (I_("property-show"),
490 G_TYPE_FROM_CLASS (gobject_class),
492 G_STRUCT_OFFSET (IBusEngineClass, property_show),
494 ibus_marshal_VOID__STRING,
500 * IBusEngine::property-hide:
501 * @engine: An IBusEngine.
503 * Emitted when a property is hidden.
504 * Implement the member function property_hide() in extended class to receive this signal.
506 * <note><para>@user_data is not actually a valid parameter. It is displayed because GtkDoc.</para></note>
508 engine_signals[PROPERTY_HIDE] =
509 g_signal_new (I_("property-hide"),
510 G_TYPE_FROM_CLASS (gobject_class),
512 G_STRUCT_OFFSET (IBusEngineClass, property_hide),
514 ibus_marshal_VOID__STRING,
522 ibus_engine_init (IBusEngine *engine)
524 IBusEnginePrivate *priv;
525 priv = IBUS_ENGINE_GET_PRIVATE (engine);
528 priv->connection = NULL;
532 ibus_engine_destroy (IBusEngine *engine)
534 IBusEnginePrivate *priv;
535 priv = IBUS_ENGINE_GET_PRIVATE (engine);
539 if (priv->connection) {
540 g_object_unref (priv->connection);
541 priv->connection = NULL;
544 IBUS_OBJECT_CLASS(parent_class)->destroy (IBUS_OBJECT (engine));
548 ibus_engine_set_property (IBusEngine *engine,
553 IBusEnginePrivate *priv;
554 priv = IBUS_ENGINE_GET_PRIVATE (engine);
558 priv->name = g_strdup (g_value_dup_string (value));
561 case PROP_CONNECTION:
562 priv->connection = g_value_get_object (value);
563 g_object_ref (priv->connection);
564 ibus_service_add_to_connection ((IBusService *) engine,
569 G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
574 ibus_engine_get_property (IBusEngine *engine,
575 guint prop_id, GValue *value, GParamSpec *pspec)
577 IBusEnginePrivate *priv;
578 priv = IBUS_ENGINE_GET_PRIVATE (engine);
582 g_value_set_string (value, priv->name);
585 case PROP_CONNECTION:
586 g_value_set_object (value, priv->connection);
590 G_OBJECT_WARN_INVALID_PROPERTY_ID (engine, prop_id, pspec);
595 ibus_engine_ibus_message (IBusEngine *engine,
596 IBusConnection *connection,
597 IBusMessage *message)
599 g_assert (IBUS_IS_ENGINE (engine));
600 g_assert (IBUS_IS_CONNECTION (connection));
601 g_assert (message != NULL);
603 IBusEnginePrivate *priv;
604 priv = IBUS_ENGINE_GET_PRIVATE (engine);
606 g_assert (priv->connection == connection);
608 IBusMessage *return_message = NULL;
609 IBusMessage *error_message = NULL;
611 static const struct {
614 } no_arg_methods[] = {
615 {"FocusIn", FOCUS_IN},
616 {"FocusOut", FOCUS_OUT},
619 {"Disable", DISABLE},
621 {"PageDown", PAGE_DOWN},
622 {"CursorUp", CURSOR_UP},
623 {"CursorDown", CURSOR_DOWN},
628 for (i = 0; no_arg_methods[i].member != NULL; i++) {
629 if (!ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, no_arg_methods[i].member))
632 IBusMessageIter iter;
633 ibus_message_iter_init (message, &iter);
634 if (ibus_message_iter_has_next (&iter)) {
635 error_message = ibus_message_new_error_printf (message,
636 DBUS_ERROR_INVALID_ARGS,
637 "%s.%s: Method does not have arguments",
638 IBUS_INTERFACE_ENGINE, no_arg_methods[i].member);
639 ibus_connection_send (connection, error_message);
640 ibus_message_unref (error_message);
644 g_signal_emit (engine, engine_signals[no_arg_methods[i].signal_id], 0);
645 return_message = ibus_message_new_method_return (message);
646 ibus_connection_send (connection, return_message);
647 ibus_message_unref (return_message);
652 if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "ProcessKeyEvent")) {
655 IBusError *error = NULL;
657 retval = ibus_message_get_args (message,
659 G_TYPE_UINT, &keyval,
667 g_signal_emit (engine,
668 engine_signals[PROCESS_KEY_EVENT],
674 return_message = ibus_message_new_method_return (message);
675 ibus_message_append_args (return_message,
676 G_TYPE_BOOLEAN, &retval,
678 ibus_connection_send (connection, return_message);
679 ibus_message_unref (return_message);
683 error_message = ibus_message_new_error_printf (message,
684 DBUS_ERROR_INVALID_ARGS,
685 "%s.%s: Can not match signature (ubu) of method",
686 IBUS_INTERFACE_ENGINE, "ProcessKeyEvent");
687 ibus_connection_send (connection, error_message);
688 ibus_message_unref (error_message);
691 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyActivate")) {
695 IBusError *error = NULL;
697 retval = ibus_message_get_args (message,
699 G_TYPE_STRING, &name,
704 goto _property_activate_fail;
706 g_signal_emit (engine,
707 engine_signals[PROPERTY_ACTIVATE],
712 return_message = ibus_message_new_method_return (message);
713 ibus_connection_send (connection, return_message);
714 ibus_message_unref (return_message);
717 _property_activate_fail:
718 error_message = ibus_message_new_error_printf (message,
719 DBUS_ERROR_INVALID_ARGS,
720 "%s.%s: Can not match signature (si) of method",
721 IBUS_INTERFACE_ENGINE,
723 ibus_connection_send (connection, error_message);
724 ibus_message_unref (error_message);
728 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyShow")) {
733 retval = ibus_message_get_args (message,
735 G_TYPE_STRING, &name,
739 goto _property_show_fail;
741 g_signal_emit (engine,
742 engine_signals[PROPERTY_SHOW],
746 return_message = ibus_message_new_method_return (message);
747 ibus_connection_send (connection, return_message);
748 ibus_message_unref (return_message);
752 error_message = ibus_message_new_error_printf (message,
753 DBUS_ERROR_INVALID_ARGS,
754 "%s.%s: Can not match signature (s) of method",
755 IBUS_INTERFACE_ENGINE,
757 ibus_connection_send (connection, error_message);
758 ibus_message_unref (error_message);
761 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "PropertyHide")) {
764 IBusError *error = NULL;
766 retval = ibus_message_get_args (message,
768 G_TYPE_STRING, &name,
771 goto _property_hide_fail;
773 g_signal_emit (engine, engine_signals[PROPERTY_HIDE], 0, name);
775 return_message = ibus_message_new_method_return (message);
776 ibus_connection_send (connection, return_message);
777 ibus_message_unref (return_message);
781 error_message = ibus_message_new_error_printf (message,
782 DBUS_ERROR_INVALID_ARGS,
783 "%s.%s: Can not match signature (s) of method",
784 IBUS_INTERFACE_ENGINE, "PropertyHide");
785 ibus_connection_send (connection, error_message);
786 ibus_message_unref (error_message);
789 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "SetCursorLocation")) {
792 IBusError *error = NULL;
794 retval = ibus_message_get_args (message,
802 goto _set_cursor_location_fail;
804 engine->cursor_area.x = x;
805 engine->cursor_area.y = y;
806 engine->cursor_area.width = w;
807 engine->cursor_area.height = h;
809 g_signal_emit (engine,
810 engine_signals[SET_CURSOR_LOCATION],
814 return_message = ibus_message_new_method_return (message);
815 ibus_connection_send (connection, return_message);
816 ibus_message_unref (return_message);
819 _set_cursor_location_fail:
820 error_message = ibus_message_new_error_printf (message,
821 DBUS_ERROR_INVALID_ARGS,
822 "%s.%s: Can not match signature (iiii) of method",
823 IBUS_INTERFACE_ENGINE,
824 "SetCursorLocation");
825 ibus_connection_send (connection, error_message);
826 ibus_message_unref (error_message);
829 else if (ibus_message_is_method_call (message, IBUS_INTERFACE_ENGINE, "SetCapabilities")) {
832 IBusError *error = NULL;
834 retval = ibus_message_get_args (message,
840 goto _set_capabilities_fail;
842 engine->client_capabilities = caps;
844 g_signal_emit (engine, engine_signals[SET_CAPABILITIES], 0, caps);
846 return_message = ibus_message_new_method_return (message);
847 ibus_connection_send (connection, return_message);
848 ibus_message_unref (return_message);
851 _set_capabilities_fail:
852 error_message = ibus_message_new_error_printf (message,
853 DBUS_ERROR_INVALID_ARGS,
854 "%s.%s: Can not match signature (u) of method",
855 IBUS_INTERFACE_ENGINE, "SetCapabilities");
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, "Destroy")) {
861 return_message = ibus_message_new_method_return (message);
863 ibus_connection_send (connection, return_message);
864 ibus_message_unref (return_message);
866 ibus_object_destroy ((IBusObject *) engine);
869 return parent_class->ibus_message ((IBusService *) engine, connection, message);
873 ibus_engine_process_key_event (IBusEngine *engine,
877 // g_debug ("process-key-event (%d, %d)", keyval, state);
882 ibus_engine_focus_in (IBusEngine *engine)
884 // g_debug ("focus-in");
888 ibus_engine_focus_out (IBusEngine *engine)
890 // g_debug ("focus-out");
894 ibus_engine_reset (IBusEngine *engine)
896 // g_debug ("reset");
900 ibus_engine_enable (IBusEngine *engine)
902 // g_debug ("enable");
906 ibus_engine_disable (IBusEngine *engine)
908 // g_debug ("disable");
912 ibus_engine_set_cursor_location (IBusEngine *engine,
918 // g_debug ("set-cursor-location (%d, %d, %d, %d)", x, y, w, h);
922 ibus_engine_set_capabilities (IBusEngine *engine,
925 // g_debug ("set-capabilities (0x%04x)", caps);
929 ibus_engine_page_up (IBusEngine *engine)
931 // g_debug ("page-up");
935 ibus_engine_page_down (IBusEngine *engine)
937 // g_debug ("page-down");
941 ibus_engine_cursor_up (IBusEngine *engine)
943 // g_debug ("cursor-up");
947 ibus_engine_cursor_down (IBusEngine *engine)
949 // g_debug ("cursor-down");
953 ibus_engine_property_activate (IBusEngine *engine,
954 const gchar *prop_name,
957 // g_debug ("property-activate ('%s', %d)", prop_name, prop_state);
961 ibus_engine_property_show (IBusEngine *engine, const gchar *prop_name)
963 // g_debug ("property-show ('%s')", prop_name);
967 ibus_engine_property_hide (IBusEngine *engine, const gchar *prop_name)
969 // g_debug ("property-hide ('%s')", prop_name);
973 _send_signal (IBusEngine *engine,
975 GType first_arg_type,
978 g_assert (IBUS_IS_ENGINE (engine));
979 g_assert (name != NULL);
983 IBusEnginePrivate *priv;
985 priv = IBUS_ENGINE_GET_PRIVATE (engine);
987 path = ibus_service_get_path ((IBusService *)engine);
989 va_start (args, first_arg_type);
990 ibus_connection_send_signal_valist (priv->connection,
992 IBUS_INTERFACE_ENGINE,
1000 ibus_engine_commit_text (IBusEngine *engine,
1003 _send_signal (engine,
1005 IBUS_TYPE_TEXT, &text,
1010 ibus_engine_update_preedit_text (IBusEngine *engine,
1015 _send_signal (engine,
1016 "UpdatePreeditText",
1017 IBUS_TYPE_TEXT, &text,
1018 G_TYPE_UINT, &cursor_pos,
1019 G_TYPE_BOOLEAN, &visible,
1024 ibus_engine_show_preedit_text (IBusEngine *engine)
1026 _send_signal (engine,
1031 void ibus_engine_hide_preedit_text (IBusEngine *engine)
1033 _send_signal (engine,
1038 void ibus_engine_update_auxiliary_text (IBusEngine *engine,
1042 _send_signal (engine,
1043 "UpdateAuxiliaryText",
1044 IBUS_TYPE_TEXT, &text,
1045 G_TYPE_BOOLEAN, &visible,
1050 ibus_engine_show_auxiliary_text (IBusEngine *engine)
1052 _send_signal (engine,
1053 "ShowAuxiliaryText",
1058 ibus_engine_hide_auxiliary_text (IBusEngine *engine)
1060 _send_signal (engine,
1061 "HideAuxiliaryText",
1066 ibus_engine_update_lookup_table (IBusEngine *engine,
1067 IBusLookupTable *table,
1070 _send_signal (engine,
1071 "UpdateLookupTable",
1072 IBUS_TYPE_LOOKUP_TABLE, &table,
1073 G_TYPE_BOOLEAN, &visible,
1078 ibus_engine_update_lookup_table_fast (IBusEngine *engine,
1079 IBusLookupTable *table,
1082 IBusLookupTable *new_table;
1086 if (table->candidates->len < table->page_size << 2) {
1087 ibus_engine_update_lookup_table (engine, table, visible);
1091 page_begin = (table->cursor_pos / table->page_size) * table->page_size;
1093 new_table = ibus_lookup_table_new (table->page_size, 0, table->cursor_visible, table->round);
1095 for (i = page_begin; i < page_begin + table->page_size && i < table->candidates->len; i++) {
1096 ibus_lookup_table_append_candidate (new_table, ibus_lookup_table_get_candidate (table, i));
1099 ibus_lookup_table_set_cursor_pos (new_table, ibus_lookup_table_get_cursor_in_page (table));
1101 ibus_engine_update_lookup_table (engine, new_table, visible);
1103 g_object_unref (new_table);
1106 void ibus_engine_show_lookup_table (IBusEngine *engine)
1108 _send_signal (engine,
1113 void ibus_engine_hide_lookup_table (IBusEngine *engine)
1115 _send_signal (engine,
1120 void ibus_engine_forward_key_event (IBusEngine *engine,
1124 _send_signal (engine,
1126 G_TYPE_UINT, &keyval,
1127 G_TYPE_UINT, &state,
1132 ibus_engine_register_properties (IBusEngine *engine,
1133 IBusPropList *prop_list)
1135 _send_signal (engine,
1136 "RegisterProperties",
1137 IBUS_TYPE_PROP_LIST, &prop_list,
1142 ibus_engine_update_property (IBusEngine *engine,
1145 _send_signal (engine,
1147 IBUS_TYPE_PROPERTY, &prop,
1152 ibus_engine_get_name (IBusEngine *engine)
1154 g_assert (IBUS_IS_ENGINE (engine));
1156 IBusEnginePrivate *priv;
1157 priv = IBUS_ENGINE_GET_PRIVATE (engine);