FcitxYaTableInfo* FcitxYaTableGetAllCFG() { FcitxYaTableInfo* head = NULL,* prev = NULL,* cur = NULL; FcitxStringHashSet* configfiles = FcitxXDGGetFiles("yatable", NULL, ".conf"); HASH_FOREACH(file, configfiles, FcitxStringHashSet) { FcitxConfigFileDesc* cfgdesc = FcitxYaTableConfigDesc(); if(cfgdesc == NULL) continue; FILE* fcfg = FcitxXDGGetFileWithPrefix("yatable", file->name, "r", NULL); if(fcfg == NULL) continue; FcitxConfigFile* cfgfile = FcitxConfigParseConfigFileFp(fcfg, cfgdesc); cur = fcitx_utils_malloc0(sizeof(FcitxYaTableInfo)); cur->next = NULL; if(head == NULL) { head = cur; } else { prev->next = cur; } prev = cur; YaTableInfoConfigBind(&(cur->info), cfgfile, cfgdesc); FcitxConfigBindSync((FcitxGenericConfig*) &(cur->info)); FcitxConfigFreeConfigFile(cfgfile); fclose(fcfg); }
FCITX_EXPORT_API void FcitxAddonFree(void* v) { FcitxAddon *addon = (FcitxAddon*) v; if (!addon) return ; FcitxConfigFreeConfigFile(addon->config.configFile); free(addon->name); free(addon->library); free(addon->comment); free(addon->generalname); free(addon->depend); free(addon->subconfig); }
/** @加载皮肤配置文件 */ int LoadSkinConfig(FcitxSkin* sc, char** skinType) { FILE *fp; boolean isreload = False; int ret = 0; if (sc->config.configFile) { utarray_done(&sc->skinMainBar.skinPlacement); FcitxConfigFreeConfigFile(sc->config.configFile); free(sc->skinInfo.skinName); free(sc->skinInfo.skinVersion); free(sc->skinInfo.skinAuthor); free(sc->skinInfo.skinDesc); free(sc->skinMainBar.backImg); free(sc->skinMainBar.logo); free(sc->skinMainBar.eng); free(sc->skinMainBar.active); free(sc->skinMainBar.placement); free(sc->skinInputBar.backImg); free(sc->skinInputBar.backArrow); free(sc->skinInputBar.forwardArrow); free(sc->skinTrayIcon.active); free(sc->skinTrayIcon.inactive); free(sc->skinMenu.backImg); free(sc->skinKeyboard.backImg); UnloadImage(sc); } memset(sc, 0, sizeof(FcitxSkin)); utarray_init(&sc->skinMainBar.skinPlacement, &place_icd); reload: //获取配置文件的绝对路径 { if (!isreload) { char* buf; asprintf(&buf, "%s/fcitx_skin.conf", *skinType); fp = FcitxXDGGetFileWithPrefix("skin", buf, "r", NULL); free(buf); } else { char* path = fcitx_utils_get_fcitx_path_with_filename("pkgdatadir", "/skin/default/fcitx_skin.conf"); fp = fopen(path, "r"); free(path); } } if (fp) { FcitxConfigFile *cfile; FcitxConfigFileDesc* skinDesc = GetSkinDesc(); if (sc->config.configFile == NULL) { cfile = FcitxConfigParseConfigFileFp(fp, skinDesc); } else { cfile = sc->config.configFile; cfile = FcitxConfigParseIniFp(fp, cfile); } if (!cfile) { fclose(fp); fp = NULL; } else { FcitxSkinConfigBind(sc, cfile, skinDesc); FcitxConfigBindSync((FcitxGenericConfig*)sc); } } if (!fp) { if (isreload) { FcitxLog(FATAL, _("Can not load default skin, is installion correct?")); perror("fopen"); ret = 1; // 如果安装目录里面也没有配置文件,那就只好告诉用户,无法运行了 } else { perror("fopen"); FcitxLog(WARNING, _("Can not load skin %s, return to default"), *skinType); if (*skinType) free(*skinType); *skinType = strdup("default"); isreload = true; goto reload; } } if (fp) fclose(fp); sc->skinType = skinType; return ret; }