void CloudPinyinHookForNewRequest(void* arg) { FcitxCloudPinyin* cloudpinyin = (FcitxCloudPinyin*) arg; if (!cloudpinyin->initialized && !cloudpinyin->isrequestkey) { CloudPinyinRequestKey(cloudpinyin); } }
void* CloudPinyinCreate(FcitxInstance* instance) { FcitxCloudPinyin* cloudpinyin = fcitx_utils_malloc0(sizeof(FcitxCloudPinyin)); bindtextdomain("fcitx-cloudpinyin", LOCALEDIR); cloudpinyin->owner = instance; int pipe1[2]; int pipe2[2]; if (!LoadCloudPinyinConfig(&cloudpinyin->config)) { free(cloudpinyin); return NULL; } if (pipe(pipe1) < 0) { free(cloudpinyin); return NULL; } if (pipe(pipe2) < 0) { close(pipe1[0]); close(pipe1[1]); free(cloudpinyin); return NULL; } cloudpinyin->pipeRecv = pipe1[0]; cloudpinyin->pipeNotify = pipe2[1]; fcntl(pipe1[0], F_SETFL, O_NONBLOCK); fcntl(pipe1[1], F_SETFL, O_NONBLOCK); fcntl(pipe2[0], F_SETFL, O_NONBLOCK); fcntl(pipe2[1], F_SETFL, O_NONBLOCK); cloudpinyin->pendingQueue = fcitx_utils_malloc0(sizeof(CurlQueue)); cloudpinyin->finishQueue = fcitx_utils_malloc0(sizeof(CurlQueue)); pthread_mutex_init(&cloudpinyin->pendingQueueLock, NULL); pthread_mutex_init(&cloudpinyin->finishQueueLock, NULL); FcitxFetchThread* fetch = fcitx_utils_malloc0(sizeof(FcitxFetchThread)); cloudpinyin->fetch = fetch; fetch->owner = cloudpinyin; fetch->pipeRecv = pipe2[0]; fetch->pipeNotify = pipe1[1]; fetch->pendingQueueLock = &cloudpinyin->pendingQueueLock; fetch->finishQueueLock = &cloudpinyin->finishQueueLock; fetch->queue = fcitx_utils_malloc0(sizeof(CurlQueue)); FcitxIMEventHook hook; hook.arg = cloudpinyin; hook.func = CloudPinyinAddCandidateWord; FcitxInstanceRegisterUpdateCandidateWordHook(instance, hook); hook.arg = cloudpinyin; hook.func = CloudPinyinHookForNewRequest; FcitxInstanceRegisterResetInputHook(instance, hook); FcitxInstanceRegisterInputFocusHook(instance, hook); FcitxInstanceRegisterInputUnFocusHook(instance, hook); FcitxInstanceRegisterTriggerOnHook(instance, hook); pthread_create(&cloudpinyin->pid, NULL, FetchThread, fetch); CloudPinyinRequestKey(cloudpinyin); return cloudpinyin; }