void* FcitxXkbDBusCreate(FcitxInstance* instance) { FcitxXkbDBus* xkbdbus = fcitx_utils_new(FcitxXkbDBus); xkbdbus->owner = instance; do { FcitxModuleFunctionArg arg; DBusConnection* conn = InvokeFunction(instance, FCITX_DBUS, GETCONNECTION, arg); if (conn == NULL) { FcitxLog(ERROR, "DBus Not initialized"); break; } DBusObjectPathVTable fcitxIPCVTable = {NULL, &FcitxXkbDBusEventHandler, NULL, NULL, NULL, NULL }; if (!dbus_connection_register_object_path(conn, FCITX_XKB_PATH, &fcitxIPCVTable, xkbdbus)) { FcitxLog(ERROR, "No memory"); break; } FcitxModuleFunctionArg args; FcitxXkbRules* rules = InvokeFunction(instance, FCITX_XKB, GETRULES, args); if (!rules) break; xkbdbus->rules = rules; xkbdbus->isocodes = FcitxXkbReadIsoCodes(ISOCODES_ISO639_XML, ISOCODES_ISO3166_XML); return xkbdbus; } while(0); free(xkbdbus); return NULL; }
void* FcitxXkbDBusCreate(FcitxInstance* instance) { FcitxXkbDBus* xkbdbus = fcitx_utils_new(FcitxXkbDBus); xkbdbus->owner = instance; do { DBusConnection *conn = FcitxDBusGetConnection(instance); DBusConnection *privconn = FcitxDBusGetPrivConnection(instance); if (conn == NULL && privconn == NULL) { FcitxLog(ERROR, "DBus Not initialized"); break; } DBusObjectPathVTable fcitxIPCVTable = {NULL, &FcitxXkbDBusEventHandler, NULL, NULL, NULL, NULL }; if (conn) { dbus_connection_register_object_path(conn, FCITX_XKB_PATH, &fcitxIPCVTable, xkbdbus); } if (privconn) { dbus_connection_register_object_path(privconn, FCITX_XKB_PATH, &fcitxIPCVTable, xkbdbus); } xkbdbus->conn = conn; xkbdbus->privconn = privconn; FcitxXkbRules *rules = FcitxXkbGetRules(instance); if (!rules) break; int id = FcitxDBusWatchName(instance, "org.fcitx.GnomeHelper", xkbdbus, FcitxXkbDBusHelperOwnerChanged, NULL, NULL); if (id == 0) { break; } xkbdbus->watcherId = id; const char* helper = GNOME_HELPER_NAME; DBusMessage* message = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameHasOwner"); dbus_message_append_args(message, DBUS_TYPE_STRING, &helper, DBUS_TYPE_INVALID); DBusPendingCall* call = NULL; dbus_bool_t reply = dbus_connection_send_with_reply(xkbdbus->conn, message, &call, DBUS_TIMEOUT_USE_DEFAULT); if (reply == TRUE) { dbus_pending_call_set_notify(call, FcitxXkbDBusHelperServiceExistCallback, xkbdbus, NULL); dbus_pending_call_unref(call); } dbus_connection_flush(xkbdbus->conn); dbus_message_unref(message); xkbdbus->rules = rules; xkbdbus->isocodes = FcitxXkbReadIsoCodes(ISOCODES_ISO639_XML, ISOCODES_ISO3166_XML); FcitxXkbDBusAddFunctions(instance); return xkbdbus; } while(0); free(xkbdbus); return NULL; }