void FcitxInstanceCleanUpIC(FcitxInstance* instance) { FcitxInputContext *rec = instance->ic_list, *last = NULL, *todel; while (rec) { FcitxAddon **pfrontend = FcitxInstanceGetPFrontend(instance, rec->frontendid); FcitxFrontend *frontend = (*pfrontend)->frontend; pid_t pid = 0; if (frontend->GetPid) pid = frontend->GetPid((*pfrontend)->addonInstance, rec); if (pid && !fcitx_utils_pid_exists(pid)) { if (last != NULL) last->next = rec->next; else instance->ic_list = rec->next; todel = rec; rec = rec->next; todel->next = instance->free_list; instance->free_list = todel; frontend->DestroyIC((*pfrontend)->addonInstance, todel); FreeICData(instance, todel); if (todel == instance->CurrentIC) { instance->CurrentIC = NULL; FcitxUICloseInputWindow(instance); FcitxUIOnInputUnFocus(instance); FcitxInstanceSetCurrentIC(instance, NULL); } } else { last = rec; rec = rec->next; } } }