FCITX_EXPORT_API FcitxInputContext* FcitxInstanceCreateIC(FcitxInstance* instance, int frontendid, void * priv) { /* clean up invalid ic here */ FcitxInstanceCleanUpIC(instance); FcitxAddon **pfrontend = FcitxInstanceGetPFrontend(instance, frontendid); if (pfrontend == NULL) return NULL; FcitxFrontend* frontend = (*pfrontend)->frontend; FcitxInputContext *rec; if (instance->free_list != NULL) { rec = instance->free_list; instance->free_list = instance->free_list->next; } else rec = malloc(sizeof(FcitxInputContext2)); memset(rec, 0, sizeof(FcitxInputContext2)); rec->frontendid = frontendid; rec->offset_x = -1; rec->offset_y = -1; NewICData(instance, rec); switch (instance->config->shareState) { case ShareState_All: rec->state = instance->globalState; break; case ShareState_None: case ShareState_PerProgram: rec->state = instance->config->defaultIMState; break; default: break; } frontend->CreateIC((*pfrontend)->addonInstance, rec, priv); rec->next = instance->ic_list; instance->ic_list = rec; return rec; }
FCITX_EXPORT_API FcitxInputContext* FcitxInstanceCreateIC(FcitxInstance* instance, int frontendid, void * priv) { UT_array* frontends = &instance->frontends; FcitxAddon** pfrontend = (FcitxAddon**) utarray_eltptr(frontends, frontendid); if (pfrontend == NULL) return NULL; FcitxFrontend* frontend = (*pfrontend)->frontend; FcitxInputContext *rec; if (instance->free_list != NULL) { rec = instance->free_list; instance->free_list = instance->free_list->next; } else rec = malloc(sizeof(FcitxInputContext)); memset(rec, 0, sizeof(FcitxInputContext)); rec->frontendid = frontendid; rec->offset_x = -1; rec->offset_y = -1; switch (instance->config->shareState) { case ShareState_All: rec->state = instance->globalState; break; case ShareState_None: case ShareState_PerProgram: rec->state = instance->config->defaultIMState; break; default: break; } frontend->CreateIC((*pfrontend)->addonInstance, rec, priv); rec->next = instance->ic_list; instance->ic_list = rec; return rec; }