boolean MainMenuAction(FcitxUIMenu* menu, int index) { FcitxClassicUI* classicui = (FcitxClassicUI*) menu->priv; FcitxInstance* instance = classicui->owner; int length = utarray_len(&menu->shell); if (index == 0) { char* args[] = { "xdg-open", "http://fcitx-im.org/", 0 }; fcitx_utils_start_process(args); } else if (index == length - 1) { /* Exit */ FcitxInstanceEnd(classicui->owner); } else if (index == length - 2) { /* Restart */ fcitx_utils_launch_restart(); } else if (index == length - 3) { /* Configuration */ fcitx_utils_launch_configure_tool(); } else if (index == length - 4) { /* Configuration */ FcitxIM* im = FcitxInstanceGetCurrentIM(classicui->owner); if (im && im->owner) { fcitx_utils_launch_configure_tool_for_addon(im->uniqueName); } else { fcitx_utils_launch_configure_tool(); } } else { FcitxMenuItem* item = (FcitxMenuItem*) utarray_eltptr(&menu->shell, index); if (item && item->type == MENUTYPE_SIMPLE && item->data) { const char* name = item->data; FcitxUIUpdateStatus(instance, name); } } return true; }
/* *选择指定index的虚拟键盘 */ void SelectVK(FcitxVKState* vkstate, int vkidx) { vkstate->bVK = false; vkstate->iCurrentVK = vkidx; FcitxUIUpdateStatus(vkstate->owner, "vk"); if (vkstate->vkWindow) DrawVKWindow(vkstate->vkWindow); }
void VKReset(void* arg) { FcitxVKState *vkstate = (FcitxVKState*) arg; VKWindow* vkWindow = vkstate->vkWindow; if (vkstate->bVK != false) FcitxUIUpdateStatus(vkstate->owner, "vk"); if (vkWindow) XUnmapWindow(vkWindow->dpy, vkWindow->window); }
INPUT_RETURN_VALUE ToggleFullWidthStateWithHotkey(void* arg) { FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; FcitxUIStatus *status = FcitxUIGetStatusByName(fwchar->owner, "fullwidth"); if (status->visible) { FcitxUIUpdateStatus(fwchar->owner, "fullwidth"); return IRV_DO_NOTHING; } else return IRV_TO_PROCESS; }
INPUT_RETURN_VALUE HotkeyToggleChttransState(void* arg) { FcitxChttrans* transState = (FcitxChttrans*) arg; FcitxUIStatus *status = FcitxUIGetStatusByName(transState->owner, "chttrans"); if (status->visible){ FcitxUIUpdateStatus(transState->owner, "chttrans"); return IRV_DO_NOTHING; } else return IRV_TO_PROCESS; }
boolean VKMenuAction(FcitxUIMenu *menu, int index) { FcitxVKState* vkstate = (FcitxVKState*) menu->priv; if (index < vkstate->iVKCount) SelectVK(vkstate, index); else { if (vkstate->bVK) { FcitxUIUpdateStatus(vkstate->owner, "vk"); } } return true; }
INPUT_RETURN_VALUE TogglePuncStateWithHotkey(void* arg) { FcitxPuncState* puncState = (FcitxPuncState*)arg; FcitxUIStatus *status = FcitxUIGetStatusByName(puncState->owner, "punc"); if (status->visible){ FcitxUIUpdateStatus(puncState->owner, "punc"); return IRV_DO_NOTHING; } else return IRV_TO_PROCESS; }
static void SimpleUITriggerStatus(FcitxSimpleUI *ui, const char *statusName) { FcitxInstance *instance = ui->owner; FcitxUIMenu *menu = FcitxUIGetMenuByStatusName(instance, statusName); if (menu) { menu->UpdateMenu(menu); FcitxSimpleEvent event; event.type = SSE_ShowMenu; event.menuName = statusName; event.menu = menu; FcitxSimpleSendEvent(ui->owner, &event); } else { FcitxUIUpdateStatus(instance, statusName); } }
INPUT_RETURN_VALUE ToggleVKStateWithHotkey(void* arg) { FcitxVKState *vkstate = (FcitxVKState*) arg; FcitxUIUpdateStatus(vkstate->owner, "vk"); return IRV_DO_NOTHING; }
INPUT_RETURN_VALUE ToggleFullWidthStateWithHotkey(void* arg) { FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; FcitxUIUpdateStatus(fwchar->owner, "fullwidth"); return IRV_DO_NOTHING; }
void FcitxDBusMenuDoEvent(void* arg) { FcitxNotificationItem* notificationitem = (FcitxNotificationItem*) arg; FcitxInstance* instance = notificationitem->owner; int32_t id = notificationitem->pendingActionId; notificationitem->pendingActionId = -1; int32_t menu = ACTION_MENU(id); int32_t index = ACTION_INDEX(id); if (index <= 0) return; if (menu == 0) { if (index <= 8 && index > 0) { switch(index) { case 1: { char* args[] = { "xdg-open", "http://fcitx-im.org/", 0 }; fcitx_utils_start_process(args); } break; case 4: { FcitxIM* im = FcitxInstanceGetCurrentIM(instance); if (im && im->owner) { fcitx_utils_launch_configure_tool_for_addon(im->uniqueName); } else { fcitx_utils_launch_configure_tool(); } } break; case 5: fcitx_utils_launch_configure_tool(); break; case 6: fcitx_utils_launch_restart(); break; case 7: FcitxInstanceEnd(instance); break; } } else { int index = STATUS_INDEX(id); const char* name = NULL; if (STATUS_ISCOMP(id)) { UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); FcitxUIComplexStatus* compstatus = (FcitxUIComplexStatus*) utarray_eltptr(uicompstats, index); if (compstatus) { name = compstatus->name; } } else { UT_array* uistats = FcitxInstanceGetUIStats(instance); FcitxUIStatus* status = (FcitxUIStatus*) utarray_eltptr(uistats, index); if (status) { name = status->name; } } if (name) { FcitxUIUpdateStatus(instance, name); } } } else if (menu > 0) { UT_array* uimenus = FcitxInstanceGetUIMenus(instance); FcitxUIMenu** menup = (FcitxUIMenu**) utarray_eltptr(uimenus, menu - 1), *menu; if (!menup) return; menu = *menup; if (menu->MenuAction) { menu->MenuAction(menu, index - 1); } } }