static gboolean ibus_connection_ibus_signal (IBusConnection *connection, IBusMessage *message) { IBusConnectionPrivate *priv; priv = IBUS_CONNECTION_GET_PRIVATE (connection); if (ibus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { g_signal_emit (connection, connection_signals[DISCONNECTED], 0); return FALSE; } return FALSE; }
static gboolean _connection_ibus_signal_cb (IBusConnection *connection, IBusMessage *message, IBusBus *bus) { IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); if (ibus_message_is_signal (message, IBUS_INTERFACE_IBUS, "GlobalEngineChanged")) { g_signal_emit (bus, bus_signals[GLOBAL_ENGINE_CHANGED], 0); return TRUE; } return FALSE; }
static gboolean ibus_config_ibus_signal (IBusProxy *proxy, IBusMessage *message) { g_assert (IBUS_IS_CONFIG (proxy)); g_assert (message != NULL); IBusConfig *config; config = IBUS_CONFIG (proxy); if (ibus_message_is_signal (message, IBUS_INTERFACE_CONFIG, "ValueChanged")) { gchar *section; gchar *name; GValue value = { 0 }; IBusError *error = NULL; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, §ion, G_TYPE_STRING, &name, G_TYPE_VALUE, &value, G_TYPE_INVALID); if (!retval) { g_warning ("%s: Can not parse arguments of ValueChanges.", DBUS_ERROR_INVALID_ARGS); return FALSE; } g_signal_emit (config, config_signals[VALUE_CHANGED], 0, section, name, &value); g_value_unset (&value); g_signal_stop_emission_by_name (config, "ibus-signal"); return TRUE; } return FALSE; }
gboolean ibus_proxy_handle_signal (IBusProxy *proxy, DBusMessage *message) { g_assert (IBUS_IS_PROXY (proxy)); g_assert (message != NULL); gboolean retval = FALSE; IBusProxyPrivate *priv; priv = IBUS_PROXY_GET_PRIVATE (proxy); if (ibus_message_is_signal (message, DBUS_SERVICE_DBUS, "NameOwnerChanged")) { gchar *name, *old_name, *new_name; IBusError *error; if (!ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_STRING, &old_name, G_TYPE_STRING, &new_name, G_TYPE_INVALID)) { g_warning ("%s :%s", error->name, error->message); ibus_error_free (error); } if (g_strcmp0 (priv->unique_name, old_name) == 0) { ibus_object_destroy (IBUS_OBJECT (proxy)); return FALSE; } } if (g_strcmp0 (ibus_message_get_path (message), priv->path) == 0) { g_signal_emit (proxy, proxy_signals[IBUS_SIGNAL], 0, message, &retval); } return retval; }
static gboolean bus_panel_proxy_ibus_signal (IBusProxy *proxy, IBusMessage *message) { g_assert (BUS_IS_PANEL_PROXY (proxy)); g_assert (message != NULL); BusPanelProxy *panel; IBusError *error; gint i; static const struct { const gchar *member; const guint signal_id; } signals [] = { { "PageUp", PAGE_UP }, { "PageDown", PAGE_DOWN }, { "CursorUp", CURSOR_UP }, { "CursorDown", CURSOR_DOWN }, }; panel = BUS_PANEL_PROXY (proxy); for (i = 0; i < G_N_ELEMENTS (signals); i++) { if (ibus_message_is_signal (message, IBUS_INTERFACE_PANEL, signals[i].member)) { g_signal_emit (panel, panel_signals[signals[i].signal_id], 0); goto handled; } } if (ibus_message_is_signal (message, IBUS_INTERFACE_PANEL, "CandidateClicked")) { guint index, button, state; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &index, G_TYPE_UINT, &button, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (panel, panel_signals[CANDIDATE_CLICKED], 0, index, button, state); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_PANEL, "PropertyActivate")) { gchar *prop_name; gint prop_state; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &prop_name, G_TYPE_INT, &prop_state, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (panel, panel_signals[PROPERTY_ACTIVATE], 0, prop_name, prop_state); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_PANEL, "PropertyShow")) { gchar *prop_name; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &prop_name, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (panel, panel_signals[PROPERTY_SHOW], 0, prop_name); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_PANEL, "PropertyHide")) { gchar *prop_name; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &prop_name, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (panel, panel_signals[PROPERTY_HIDE], 0, prop_name); } handled: g_signal_stop_emission_by_name (panel, "ibus-signal"); return TRUE; failed: g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); return FALSE; }
static gboolean bus_engine_proxy_ibus_signal (IBusProxy *proxy, IBusMessage *message) { g_assert (BUS_IS_ENGINE_PROXY (proxy)); g_assert (message != NULL); BusEngineProxy *engine; IBusError *error; gint i; static const struct { const gchar *member; const guint signal_id; } signals [] = { { "ShowPreeditText", SHOW_PREEDIT_TEXT }, { "HidePreeditText", HIDE_PREEDIT_TEXT }, { "ShowAuxiliaryText", SHOW_AUXILIARY_TEXT }, { "HideAuxiliaryText", HIDE_AUXILIARY_TEXT }, { "ShowLookupTable", SHOW_LOOKUP_TABLE }, { "HideLookupTable", HIDE_LOOKUP_TABLE }, { "PageUpLookupTable", PAGE_UP_LOOKUP_TABLE }, { "PageDownLookupTable", PAGE_DOWN_LOOKUP_TABLE }, { "CursorUpLookupTable", CURSOR_UP_LOOKUP_TABLE }, { "CursorDownLookupTable", CURSOR_DOWN_LOOKUP_TABLE }, { NULL, 0}, }; engine = BUS_ENGINE_PROXY (proxy); for (i = 0; ; i++) { if (signals[i].member == NULL) break; if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, signals[i].member)) { g_signal_emit (engine, engine_signals[signals[i].signal_id], 0); goto handled; } } if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "CommitText")) { IBusText *text; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[COMMIT_TEXT], 0, text); g_object_unref (text); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "ForwardKeyEvent")) { guint32 keyval; guint32 keycode; guint32 states; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &keyval, G_TYPE_UINT, &keycode, G_TYPE_UINT, &states, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[FORWARD_KEY_EVENT], keyval, keycode, states); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "UpdatePreeditText")) { IBusText *text; gint cursor_pos; gboolean visible; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_UINT, &cursor_pos, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[UPDATE_PREEDIT_TEXT], 0, text, cursor_pos, visible); g_object_unref (text); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "UpdateAuxiliaryText")) { IBusText *text; gboolean visible; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[UPDATE_AUXILIARY_TEXT], 0, text, visible); g_object_unref (text); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "UpdateLookupTable")) { IBusLookupTable *table; gboolean visible; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_LOOKUP_TABLE, &table, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[UPDATE_LOOKUP_TABLE], 0, table, visible); g_object_unref (table); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "RegisterProperties")) { gboolean retval; if (engine->prop_list) { g_object_unref (engine->prop_list); engine->prop_list = NULL; } retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROP_LIST, &engine->prop_list, G_TYPE_INVALID); if (!retval) { engine->prop_list = NULL; goto failed; } g_signal_emit (engine, engine_signals[REGISTER_PROPERTIES], 0, engine->prop_list); } else if (ibus_message_is_signal (message, IBUS_INTERFACE_ENGINE, "UpdateProperty")) { IBusProperty *prop; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROPERTY, &prop, G_TYPE_INVALID); if (!retval) goto failed; g_signal_emit (engine, engine_signals[UPDATE_PROPERTY], 0, prop); g_object_unref (prop); } else { return FALSE; } handled: g_signal_stop_emission_by_name (engine, "ibus-signal"); return TRUE; failed: g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); return FALSE; }
static gboolean _connection_ibus_message_cb (BusConnection *connection, IBusMessage *message, BusDBusImpl *dbus) { g_assert (BUS_IS_CONNECTION (connection)); g_assert (message != NULL); g_assert (BUS_IS_DBUS_IMPL (dbus)); const gchar *dest; if (G_UNLIKELY (IBUS_OBJECT_DESTROYED (dbus))) { return; } if (ibus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { /* ignore signal from local interface */ return FALSE; } ibus_message_set_sender (message, bus_connection_get_unique_name (connection)); switch (ibus_message_get_type (message)) { #if 1 case DBUS_MESSAGE_TYPE_ERROR: g_debug ("From :%s to %s, Error: %s : %s", ibus_message_get_sender (message), ibus_message_get_destination (message), ibus_message_get_error_name (message), ibus_message_get_error_message (message)); break; #endif #if 0 case DBUS_MESSAGE_TYPE_SIGNAL: g_debug ("From :%s to %s, Signal: %s @ %s", ibus_message_get_sender (message), ibus_message_get_destination (message), ibus_message_get_member (message), ibus_message_get_path (message) ); break; #endif #if 0 case DBUS_MESSAGE_TYPE_METHOD_CALL: g_debug("From %s to %s, Method %s on %s", ibus_message_get_sender (message), ibus_message_get_destination (message), ibus_message_get_path (message), ibus_message_get_member (message)); break; #endif } dest = ibus_message_get_destination (message); if (dest == NULL || strcmp ((gchar *)dest, IBUS_SERVICE_IBUS) == 0 || strcmp ((gchar *)dest, DBUS_SERVICE_DBUS) == 0) { /* this message is sent to ibus-daemon */ switch (ibus_message_get_type (message)) { case DBUS_MESSAGE_TYPE_SIGNAL: case DBUS_MESSAGE_TYPE_METHOD_RETURN: case DBUS_MESSAGE_TYPE_ERROR: bus_dbus_impl_dispatch_message_by_rule (dbus, message, NULL); return FALSE; case DBUS_MESSAGE_TYPE_METHOD_CALL: { const gchar *path; IBusService *object; path = ibus_message_get_path (message); object = g_hash_table_lookup (dbus->objects, path); if (object == NULL || ibus_service_handle_message (object, (IBusConnection *) connection, message) == FALSE) { IBusMessage *error; error = ibus_message_new_error_printf (message, DBUS_ERROR_UNKNOWN_METHOD, "Unknown method %s on %s", ibus_message_get_member (message), path); ibus_connection_send ((IBusConnection *) connection, error); ibus_message_unref (error); } /* dispatch message */ bus_dbus_impl_dispatch_message_by_rule (dbus, message, NULL); } break; default: g_assert (FALSE); } } else { /* If the destination is not IBus or DBus, the message will be forwanded. */ bus_dbus_impl_dispatch_message (dbus, message); } g_signal_stop_emission_by_name (connection, "ibus-message"); return TRUE; }