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; } } }
FCITX_EXPORT_API void FcitxInstanceDestroyIC(FcitxInstance* instance, int frontendid, void* filter) { FcitxInputContext *rec, *last; UT_array* frontends = &instance->frontends; FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, frontendid); if (pfrontend == NULL) return; FcitxFrontend* frontend = (*pfrontend)->frontend; last = NULL; for (rec = instance->ic_list; rec != NULL; last = rec, rec = rec->next) { if (rec->frontendid == frontendid && frontend->CheckIC((*pfrontend)->addonInstance, rec, filter)) { if (last != NULL) last->next = rec->next; else instance->ic_list = rec->next; rec->next = instance->free_list; instance->free_list = rec; if (rec == FcitxInstanceGetCurrentIC(instance)) { FcitxUICloseInputWindow(instance); FcitxUIOnInputUnFocus(instance); FcitxInstanceSetCurrentIC(instance, NULL); } frontend->DestroyIC((*pfrontend)->addonInstance, rec); return; } } return; }
Bool XIMUnsetFocusHandler(FcitxXimFrontend* xim, IMChangeICStruct * call_data) { FcitxInputContext* ic = FcitxInstanceGetCurrentIC(xim->owner); if (ic && GetXimIC(ic)->id == call_data->icid) { FcitxUICommitPreedit(xim->owner); FcitxUICloseInputWindow(xim->owner); FcitxInstanceSetCurrentIC(xim->owner, NULL); FcitxUIOnInputUnFocus(xim->owner); } return True; }