DBusHandlerResult FcitxXkbDBusEventHandler (DBusConnection *connection, DBusMessage *message, void *user_data) { FcitxXkbDBus* xkbdbus = user_data; if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { DBusMessage *reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID); dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayouts")) { DBusMessage *reply = dbus_message_new_method_return(message); FcitxXkbDBusGetLayouts(xkbdbus, reply); dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); dbus_connection_flush(connection); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "SetLayoutForIM")) { DBusError error; dbus_error_init(&error); char* im, *layout, *variant; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID)) { FcitxModuleFunctionArg args; args.args[0] = im; args.args[1] = layout; args.args[2] = variant; InvokeFunction(xkbdbus->owner, FCITX_XKB, SETLAYOUTOVERRIDE, args); } DBusMessage *reply = dbus_message_new_method_return(message); dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); dbus_connection_flush(connection); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "SetDefaultLayout")) { DBusError error; dbus_error_init(&error); char *layout, *variant; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID)) { FcitxModuleFunctionArg args; args.args[0] = layout; args.args[1] = variant; InvokeFunction(xkbdbus->owner, FCITX_XKB, SETDEFAULTLAYOUT, args); } DBusMessage *reply = dbus_message_new_method_return(message); dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); dbus_connection_flush(connection); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayoutForIM")) { DBusError error; dbus_error_init(&error); char* im = NULL, *layout = NULL, *variant = NULL; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_INVALID)) { FcitxModuleFunctionArg args; args.args[0] = im; args.args[1] = &layout; args.args[2] = &variant; InvokeFunction(xkbdbus->owner, FCITX_XKB, GETLAYOUTOVERRIDE, args); if (!layout) layout = ""; if (!variant) variant = ""; DBusMessage *reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID); dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); dbus_connection_flush(connection); } return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
DBusHandlerResult FcitxXkbDBusEventHandler (DBusConnection *connection, DBusMessage *message, void *user_data) { FcitxXkbDBus* xkbdbus = user_data; DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; DBusMessage *reply = NULL; boolean flush = false; if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID); } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayouts")) { reply = dbus_message_new_method_return(message); FcitxXkbDBusGetLayouts(xkbdbus, reply); } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "SetLayoutForIM")) { DBusError error; dbus_error_init(&error); char* im, *layout, *variant; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID)) { FcitxXkbSetLayoutOverride(xkbdbus->owner, im, layout, variant); reply = dbus_message_new_method_return(message); } else { reply = FcitxXkbDBusUnknownMethod(message); } } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "SetDefaultLayout")) { DBusError error; dbus_error_init(&error); char *layout, *variant; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID)) { FcitxXkbSetDefaultLayout(xkbdbus->owner, layout, variant); reply = dbus_message_new_method_return(message); } else { reply = FcitxXkbDBusUnknownMethod(message); } } else if (dbus_message_is_method_call(message, FCITX_XKB_INTERFACE, "GetLayoutForIM")) { DBusError error; dbus_error_init(&error); char* im = NULL, *layout = NULL, *variant = NULL; if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &im, DBUS_TYPE_INVALID)) { FcitxXkbGetLayoutOverride(xkbdbus->owner, im, &layout, &variant); if (!layout) layout = ""; if (!variant) variant = ""; reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &layout, DBUS_TYPE_STRING, &variant, DBUS_TYPE_INVALID); } else { reply = FcitxXkbDBusUnknownMethod(message); } } if (reply) { dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); if (flush) { dbus_connection_flush(connection); } result = DBUS_HANDLER_RESULT_HANDLED; } return result; }