static void ibus_config_service_class_init (IBusConfigServiceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); parent_class = (IBusServiceClass *) g_type_class_peek_parent (klass); gobject_class->set_property = (GObjectSetPropertyFunc) ibus_config_service_set_property; gobject_class->get_property = (GObjectGetPropertyFunc) ibus_config_service_get_property; IBUS_OBJECT_CLASS (gobject_class)->destroy = (IBusObjectDestroyFunc) ibus_config_service_destroy; IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_config_service_ibus_message; klass->set_value = ibus_config_service_set_value; klass->get_value = ibus_config_service_get_value; /* install properties */ /** * IBusConfigService:connection: * * Connection of this IBusConfigService. */ g_object_class_install_property (gobject_class, PROP_CONNECTION, g_param_spec_object ("connection", "connection", "The connection of config object", IBUS_TYPE_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); }
static void bus_dbus_impl_class_init (BusDBusImplClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); IBusServiceClass *service_class = IBUS_SERVICE_CLASS (klass); parent_class = (IBusServiceClass *) g_type_class_peek_parent (klass); IBUS_OBJECT_CLASS (gobject_class)->destroy = (IBusObjectDestroyFunc) bus_dbus_impl_destroy; service_class->ibus_message = (ServiceIBusMessageFunc) bus_dbus_impl_ibus_message; klass->name_owner_changed = bus_dbus_impl_name_owner_changed; /* install signals */ dbus_signals[NAME_OWNER_CHANGED] = g_signal_new (I_("name-owner-changed"), G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (BusDBusImplClass, name_owner_changed), NULL, NULL, ibus_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); }
static void ibus_factory_class_init (IBusFactoryClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (IBusFactoryPrivate)); gobject_class->set_property = (GObjectSetPropertyFunc) ibus_factory_set_property; gobject_class->get_property = (GObjectGetPropertyFunc) ibus_factory_get_property; ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_factory_destroy; IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_factory_ibus_message; /** * IBusFactory:connection: * * Connection of this IBusFactory. **/ g_object_class_install_property (gobject_class, PROP_CONNECTION, g_param_spec_object ("connection", "connection", "The connection of factory object", IBUS_TYPE_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); }
static void ibus_panel_service_class_init (IBusPanelServiceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = (GObjectSetPropertyFunc) ibus_panel_service_service_set_property; gobject_class->get_property = (GObjectGetPropertyFunc) ibus_panel_service_service_get_property; IBUS_OBJECT_CLASS (gobject_class)->destroy = (IBusObjectDestroyFunc) ibus_panel_service_real_destroy; IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_panel_service_ibus_message; klass->focus_in = ibus_panel_service_focus_in; klass->focus_out = ibus_panel_service_focus_out; klass->register_properties = ibus_panel_service_register_properties; klass->set_cursor_location = ibus_panel_service_set_cursor_location; klass->update_lookup_table = ibus_panel_service_update_lookup_table; klass->update_auxiliary_text = ibus_panel_service_update_auxiliary_text; klass->update_preedit_text = ibus_panel_service_update_preedit_text; klass->update_property = ibus_panel_service_update_property; klass->cursor_down_lookup_table = ibus_panel_service_not_implemented; klass->cursor_up_lookup_table = ibus_panel_service_not_implemented; klass->destroy = ibus_panel_service_not_implemented; klass->hide_auxiliary_text = ibus_panel_service_not_implemented; klass->hide_language_bar = ibus_panel_service_not_implemented; klass->hide_lookup_table = ibus_panel_service_not_implemented; klass->hide_preedit_text = ibus_panel_service_not_implemented; klass->page_down_lookup_table = ibus_panel_service_not_implemented; klass->page_up_lookup_table = ibus_panel_service_not_implemented; klass->reset = ibus_panel_service_not_implemented; klass->show_auxiliary_text = ibus_panel_service_not_implemented; klass->show_language_bar = ibus_panel_service_not_implemented; klass->show_lookup_table = ibus_panel_service_not_implemented; klass->show_preedit_text = ibus_panel_service_not_implemented; klass->start_setup = ibus_panel_service_not_implemented; klass->state_changed = ibus_panel_service_not_implemented; /* install properties */ /** * IBusPanelService:connection: * * Connection of this IBusPanelService. */ g_object_class_install_property (gobject_class, PROP_CONNECTION, g_param_spec_object ("connection", "connection", "The connection of service object", IBUS_TYPE_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); }
static void ibus_factory_class_init (IBusFactoryClass *klass) { // GObjectClass *gobject_class = G_OBJECT_CLASS (klass); IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass); factory_parent_class = (IBusServiceClass *) g_type_class_peek_parent (klass); g_type_class_add_private (klass, sizeof (IBusFactoryPrivate)); ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_factory_destroy; IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_factory_ibus_message; }
static gboolean ibus_engine_ibus_message (IBusEngine *engine, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_ENGINE (engine)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); g_assert (ibus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL); IBusEnginePrivate *priv; priv = IBUS_ENGINE_GET_PRIVATE (engine); g_assert (priv->connection == connection); IBusMessage *reply = NULL; IBusError *error = NULL; gboolean retval; gint i; const gchar *interface; const gchar *name; static const struct { gchar *member; guint signal_id; } no_arg_methods[] = { { "FocusIn", FOCUS_IN }, { "FocusOut", FOCUS_OUT }, { "Reset", RESET }, { "Enable", ENABLE }, { "Disable", DISABLE }, { "PageUp", PAGE_UP }, { "PageDown", PAGE_DOWN }, { "CursorUp", CURSOR_UP }, { "CursorDown", CURSOR_DOWN }, }; interface = ibus_message_get_interface (message); name = ibus_message_get_member (message); if (interface != NULL && g_strcmp0 (interface, IBUS_INTERFACE_ENGINE) != 0) return IBUS_SERVICE_CLASS (ibus_engine_parent_class)->ibus_message ( (IBusService *) engine, connection, message); do { if (g_strcmp0 (name, "ProcessKeyEvent") == 0) { guint keyval, keycode, state; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &keyval, G_TYPE_UINT, &keycode, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (uuu) of method", IBUS_INTERFACE_ENGINE, "ProcessKeyEvent"); ibus_error_free (error); } else { retval = FALSE; g_signal_emit (engine, engine_signals[PROCESS_KEY_EVENT], 0, keyval, keycode, state, &retval); reply = ibus_message_new_method_return (message); ibus_message_append_args (reply, G_TYPE_BOOLEAN, &retval, G_TYPE_INVALID); } break; } for (i = 0; i < G_N_ELEMENTS (no_arg_methods) && g_strcmp0 (name, no_arg_methods[i].member) != 0; i++); if (i < G_N_ELEMENTS (no_arg_methods)) { IBusMessageIter iter; ibus_message_iter_init (message, &iter); if (ibus_message_iter_has_next (&iter)) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Method does not have arguments", IBUS_INTERFACE_ENGINE, no_arg_methods[i].member); } else { g_signal_emit (engine, engine_signals[no_arg_methods[i].signal_id], 0); reply = ibus_message_new_method_return (message); } break; } if (g_strcmp0 (name, "CandidateClicked") == 0) { guint index, button, state; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &index, G_TYPE_UINT, &button, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (uuu) of method", IBUS_INTERFACE_ENGINE, "CandidateClicked"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[CANDIDATE_CLICKED], 0, index, button, state); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyActivate") == 0) { gchar *name; guint state; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (si) of method", IBUS_INTERFACE_ENGINE, "PropertyActivate"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_ACTIVATE], 0, name, state); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyShow") == 0) { gchar *name; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (s) of method", IBUS_INTERFACE_ENGINE, "PropertyShow"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_SHOW], 0, name); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyHide") == 0) { gchar *name; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (s) of method", IBUS_INTERFACE_ENGINE, "PropertyHide"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_HIDE], 0, name); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "SetCursorLocation") == 0) { gint x, y, w, h; retval = ibus_message_get_args (message, &error, G_TYPE_INT, &x, G_TYPE_INT, &y, G_TYPE_INT, &w, G_TYPE_INT, &h, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (iiii) of method", IBUS_INTERFACE_ENGINE, "SetCursorLocation"); ibus_error_free (error); } else { engine->cursor_area.x = x; engine->cursor_area.y = y; engine->cursor_area.width = w; engine->cursor_area.height = h; g_signal_emit (engine, engine_signals[SET_CURSOR_LOCATION], 0, x, y, w, h); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "SetCapabilities") == 0) { guint caps; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &caps, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (u) of method", IBUS_INTERFACE_ENGINE, "SetCapabilities"); ibus_error_free (error); } else { engine->client_capabilities = caps; g_signal_emit (engine, engine_signals[SET_CAPABILITIES], 0, caps); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "Destroy") == 0) { reply = ibus_message_new_method_return (message); ibus_connection_send (connection, reply); ibus_message_unref (reply); ibus_object_destroy ((IBusObject *) engine); return TRUE; } else { reply = ibus_message_new_error_printf (message, DBUS_ERROR_UNKNOWN_METHOD, "%s.%s", IBUS_INTERFACE_ENGINE, name); g_warn_if_reached (); } } while (0); ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; }
static void ibus_engine_class_init (IBusEngineClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (IBusEnginePrivate)); gobject_class->set_property = (GObjectSetPropertyFunc) ibus_engine_set_property; gobject_class->get_property = (GObjectGetPropertyFunc) ibus_engine_get_property; ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_engine_destroy; IBUS_SERVICE_CLASS (klass)->ibus_message = (ServiceIBusMessageFunc) ibus_engine_ibus_message; klass->process_key_event = ibus_engine_process_key_event; klass->focus_in = ibus_engine_focus_in; klass->focus_out = ibus_engine_focus_out; klass->reset = ibus_engine_reset; klass->enable = ibus_engine_enable; klass->disable = ibus_engine_disable; klass->page_up = ibus_engine_page_up; klass->page_down = ibus_engine_page_down; klass->cursor_up = ibus_engine_cursor_up; klass->cursor_down = ibus_engine_cursor_down; klass->candidate_clicked = ibus_engine_candidate_clicked; klass->property_activate = ibus_engine_property_activate; klass->property_show = ibus_engine_property_show; klass->property_hide = ibus_engine_property_hide; klass->set_cursor_location = ibus_engine_set_cursor_location; klass->set_capabilities = ibus_engine_set_capabilities; /* install properties */ /** * IBusEngine:name: * * Name of this IBusEngine. */ g_object_class_install_property (gobject_class, PROP_NAME, g_param_spec_string ("name", "name", "engine name", "noname", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * IBusEngine:connection: * * Connection of this IBusEngine. */ g_object_class_install_property (gobject_class, PROP_CONNECTION, g_param_spec_object ("connection", "connection", "The connection of engine object", IBUS_TYPE_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /* install signals */ /** * IBusEngine::process-key-event: * @engine: An IBusEngine. * @keyval: Key symbol of the key press. * @keycode: KeyCode of the key press. * @state: Key modifier flags. * * Emitted when a key event is received. * Implement the member function process_key_event() in extended class to receive this signal. * Both the key symbol and keycode are passed to the member function. * See ibus_input_context_process_key_event() for further explanation of * key symbol, keycode and which to use. * * Returns: TRUE for successfully process the key; FALSE otherwise. * See also: ibus_input_context_process_key_event(). * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PROCESS_KEY_EVENT] = g_signal_new (I_("process-key-event"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, process_key_event), NULL, NULL, ibus_marshal_BOOL__UINT_UINT_UINT, G_TYPE_BOOLEAN, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * IBusEngine::focus-in: * @engine: An IBusEngine. * * Emitted when the client application get the focus. * Implement the member function focus_in() in extended class to receive this signal. * * See also: ibus_input_context_focus_in() * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[FOCUS_IN] = g_signal_new (I_("focus-in"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, focus_in), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::focus-out: * @engine: An IBusEngine. * * Emitted when the client application lost the focus. * Implement the member function focus_out() in extended class to receive this signal. * * See also: ibus_input_context_focus_out() * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[FOCUS_OUT] = g_signal_new (I_("focus-out"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, focus_out), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::reset: * @engine: An IBusEngine. * * Emitted when the IME is reset. * Implement the member function reset() in extended class to receive this signal. * * See also: ibus_input_context_reset(). * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[RESET] = g_signal_new (I_("reset"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, reset), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::enable: * @engine: An IBusEngine. * * Emitted when the IME is enabled. * Implement the member function set_enable() in extended class to receive this signal. * * See also: ibus_input_context_enable(). * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[ENABLE] = g_signal_new (I_("enable"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, enable), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::disable: * @engine: An IBusEngine. * * Emitted when the IME is disabled. * Implement the member function set_disable() in extended class to receive this signal. * * See also: ibus_input_context_disable(). * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[DISABLE] = g_signal_new (I_("disable"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, disable), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::set-cursor-location: * @engine: An IBusEngine. * @x: X coordinate of the cursor. * @y: Y coordinate of the cursor. * @w: Width of the cursor. * @h: Height of the cursor. * * Emitted when the location of IME is set. * Implement the member function set_cursor_location() in extended class to receive this signal. * * See also: ibus_input_context_set_cursor_location(). * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[SET_CURSOR_LOCATION] = g_signal_new (I_("set-cursor-location"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, set_cursor_location), NULL, NULL, ibus_marshal_VOID__INT_INT_INT_INT, G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); /** * IBusEngine::set-capabilities: * @engine: An IBusEngine. * @caps: Capabilities flags of IBusEngine, see #IBusCapabilite * * Emitted when the client application capabilities is set. * Implement the member function set_capabilities() in extended class to receive this signal. * * See also: ibus_input_context_set_capabilities(). * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[SET_CAPABILITIES] = g_signal_new (I_("set-capabilities"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, set_capabilities), NULL, NULL, ibus_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * IBusEngine::page-up: * @engine: An IBusEngine. * * Emitted when the page-up button is pressed. * Implement the member function page_up() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PAGE_UP] = g_signal_new (I_("page-up"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, page_up), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::page-down: * @engine: An IBusEngine. * * Emitted when the page-down button is pressed. * Implement the member function page_down() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PAGE_DOWN] = g_signal_new (I_("page-down"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, page_down), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::cursor-up: * @engine: An IBusEngine. * * Emitted when the up cursor button is pressed. * Implement the member function cursor_up() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[CURSOR_UP] = g_signal_new (I_("cursor-up"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, cursor_up), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::cursor-down: * @engine: An IBusEngine. * * Emitted when the down cursor button is pressed. * Implement the member function cursor_down() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[CURSOR_DOWN] = g_signal_new (I_("cursor-down"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, cursor_down), NULL, NULL, ibus_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * IBusEngine::candidate-clicked: * @engine: An IBusEngine. * @index: Index of candidate be clicked. * @button: Mouse button. * @state: Keyboard state. * * Emitted when candidate on lookup table is clicked. * Implement the member function candidate_clicked() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[CANDIDATE_CLICKED] = g_signal_new (I_("candidate-clicked"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, candidate_clicked), NULL, NULL, ibus_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * IBusEngine::property-activate: * @engine: An IBusEngine. * @name: Property name. * @state: Property state. * * Emitted when a property is activated or change changed. * Implement the member function property_activate() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PROPERTY_ACTIVATE] = g_signal_new (I_("property-activate"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, property_activate), NULL, NULL, ibus_marshal_VOID__STRING_UINT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_UINT); /** * IBusEngine::property-show: * @engine: An IBusEngine. * @name: Property name. * * Emitted when a property is shown. * Implement the member function property_side() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PROPERTY_SHOW] = g_signal_new (I_("property-show"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, property_show), NULL, NULL, ibus_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); /** * IBusEngine::property-hide: * @engine: An IBusEngine. * @name: Property name. * * Emitted when a property is hidden. * Implement the member function property_hide() in extended class to receive this signal. * * <note><para>Argument @user_data is ignored in this function.</para></note> */ engine_signals[PROPERTY_HIDE] = g_signal_new (I_("property-hide"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (IBusEngineClass, property_hide), NULL, NULL, ibus_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); }
static gboolean ibus_factory_ibus_message (IBusFactory *factory, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_FACTORY (factory)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); IBusMessage *reply_message; IBusFactoryPrivate *priv; priv = IBUS_FACTORY_GET_PRIVATE (factory); g_assert (priv->connection == connection); if (ibus_message_is_method_call (message, IBUS_INTERFACE_FACTORY, "CreateEngine")) { gchar *engine_name; gchar *path; IBusError *error; IBusEngine *engine; gboolean retval; GType engine_type; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &engine_name, G_TYPE_INVALID); if (!retval) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "The 1st arg should be engine name"); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } engine_type = (GType )g_hash_table_lookup (priv->engine_table, engine_name); if (engine_type == G_TYPE_INVALID) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_FAILED, "Can not create engine %s", engine_name); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } path = g_strdup_printf ("/org/freedesktop/IBus/Engine/%d", ++priv->id); engine = g_object_new (engine_type, "name", engine_name, "path", path, "connection", priv->connection, NULL); priv->engine_list = g_list_append (priv->engine_list, engine); g_signal_connect (engine, "destroy", G_CALLBACK (_engine_destroy_cb), factory); reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, IBUS_TYPE_OBJECT_PATH, &path, G_TYPE_INVALID); g_free (path); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } return IBUS_SERVICE_CLASS (ibus_factory_parent_class)->ibus_message ( (IBusService *)factory, connection, message); }