void fcitx_addon_manager_free(FcitxAddonManager* manager) { if (manager->loaded) { fcitx_addon_manager_unload(manager); } fcitx_dict_free(manager->properties); fcitx_ptr_array_free(manager->loadedAddons); fcitx_standard_path_unref(manager->standardPath); fcitx_dict_free(manager->addons); fcitx_dict_free(manager->resolvers); fcitx_string_hashset_free(manager->enabledAddons); fcitx_string_hashset_free(manager->disabledAddons); free(manager); }
void fcitx_configuration_free(FcitxConfiguration* config) { fcitx_dict_free(config->subitems); free(config->name); free(config->value); free(config->comment); free(config); }
void fcitx_compose_table_free(FcitxComposeTable* table) { free(table->locale); free(table->systemComposeDir); utarray_free(table->composeTable); fcitx_dict_free(table->localeToTable); free(table); }
void fcitx_input_method_manager_free(FcitxInputMethodManager* self) { fcitx_dict_free(self->ims); fcitx_ptr_array_free(self->groups); if (self->destroyNotify) { self->destroyNotify(self->userData); } free(self); }
FCITX_EXPORT_API void fcitx_addon_manager_load(FcitxAddonManager* manager) { // list all metadata FcitxStandardPathFilter filter; filter.flag = FSPFT_Suffix | FSPFT_Sort; filter.suffix = ".conf"; FcitxDict* fileDict = fcitx_standard_path_match(manager->standardPath, FSPT_Data, "fcitx/addon", &filter); fcitx_dict_foreach(fileDict, _fcitx_addon_load_metadata, manager); fcitx_dict_free(fileDict); // topo sort doesn't work here, since bool update; do { update = false; for (FcitxDictData* data = fcitx_dict_first(manager->addons); data != NULL; data = fcitx_dict_data_next(data)) { FcitxAddon* addon = data->data; if (!addon->config->addon.enabled) { continue; } FcitxDictData* dependency = NULL; bool allDependenciesLoaded = true; for (dependency = fcitx_dict_first(addon->dependencies); dependency != NULL; dependency = fcitx_dict_data_next(dependency)) { FcitxAddon* dependAddon; if (!fcitx_dict_lookup_by_str(manager->addons, dependency->key, &dependAddon)) { break; } if (!dependAddon->loaded) { allDependenciesLoaded = false; } } if (dependency) { addon->config->addon.enabled = false; update = true; } else if (allDependenciesLoaded) { _fcitx_addon_manager_load_addon(manager, addon); } } } while(update); manager->loaded = true; }
void fcitx_static_library_resolver_free(void* data) { FcitxDict* staticAddonDict = data; fcitx_dict_free(staticAddonDict); }