FCITX_EXPORT_API void FcitxUISwitchToFallback(struct _FcitxInstance* instance) { if (!instance->fallbackuiName || instance->ui != instance->uinormal) return; if (!instance->uifallback) { // load fallback ui FcitxAddon* fallbackAddon = FcitxAddonsGetAddonByName(&instance->addons, instance->fallbackuiName); if (!fallbackAddon || !fallbackAddon->bEnabled || !FcitxUILoadInternal(instance, fallbackAddon)) { // reset fallbackuiName, never load it again and again free(instance->fallbackuiName); instance->fallbackuiName = NULL; return; } instance->uifallback = fallbackAddon; if (instance->uifallback->ui->Suspend) instance->uifallback->ui->Suspend(instance->uifallback->addonInstance); } if (instance->uinormal->ui->Suspend) instance->uinormal->ui->Suspend(instance->uinormal->addonInstance); if (instance->uifallback->ui->Resume) instance->uifallback->ui->Resume(instance->uifallback->addonInstance); instance->ui = instance->uifallback; }
FCITX_EXPORT_API void FcitxUILoad(FcitxInstance* instance) { UT_array* addons = &instance->addons; FcitxAddon *addon; for (addon = (FcitxAddon *) utarray_front(addons); addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->bEnabled && addon->category == AC_UI) { if (FcitxUILoadInternal(instance, addon)) instance->uinormal = addon; if (instance->uinormal != NULL) break; } } instance->ui = instance->uinormal; if (instance->ui == NULL) { FcitxLog(ERROR, "no usable user interface."); return; } if (addon->uifallback) instance->fallbackuiName = strdup(addon->uifallback); }
FCITX_EXPORT_API void FcitxUILoad(FcitxInstance* instance) { UT_array* addons = &instance->addons; FcitxAddon *addon; for (addon = (FcitxAddon *) utarray_front(addons); addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->bEnabled && addon->category == AC_UI) { if (FcitxUILoadInternal(instance, addon)) instance->uinormal = addon; if (instance->uinormal != NULL) break; } } instance->ui = instance->uinormal; if (instance->ui == NULL) FcitxLog(ERROR, "no usable user interface."); else { do { FcitxAddon* fallbackAddon = FcitxAddonsGetAddonByName(&instance->addons, addon->uifallback); if (fallbackAddon == NULL) break; if (!fallbackAddon->bEnabled) break; if (FcitxUILoadInternal(instance, fallbackAddon)) { instance->uifallback = fallbackAddon; if (instance->uifallback->ui->Suspend) instance->uifallback->ui->Suspend(instance->uifallback->addonInstance); } } while (0); } }