static void SimpleUITriggerMenuItem(FcitxSimpleUI *ui, const char *statusName, int index) { FcitxUIMenu *menup = FcitxUIGetMenuByStatusName(ui->owner, statusName); if (menup) { menup->MenuAction(menup, index); } }
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); } }
void FcitxDBusMenuFillLayooutItem(FcitxNotificationItem* notificationitem, int32_t id, int depth, FcitxStringHashSet* properties, DBusMessageIter* iter) { FcitxInstance* instance = notificationitem->owner; DBusMessageIter sub, array; dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &sub); dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &id); FcitxDBusMenuFillProperty(notificationitem, id, properties, &sub); dbus_message_iter_open_container(&sub, DBUS_TYPE_ARRAY, "v", &array); /* for dbus menu, we have * root (0,0) -> online help (0,1) * -> separator (0,2) * -> some status (0,8 + X) do cache * -> separator (0,8) * -> registered menu (x,0) -> (x,1) , (x,2), (x,3) * -> separator (0,3) * -> configure current (0,4) * -> configure (0,5) * -> restart (0,6) * -> exit (0,7) */ /* using != 0 can make -1 recursive to infinite */ if (depth != 0) { int32_t menu = ACTION_MENU(id); int32_t index = ACTION_INDEX(id); UT_array* uimenus = FcitxInstanceGetUIMenus(instance); /* we ONLY support submenu in top level menu */ if (menu == 0) { if (index == 0) { FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,1), depth - 1, properties, &array); FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,2), depth - 1, properties, &array); boolean flag = false; /* copied from classicui.c */ FcitxUIStatus* status; UT_array* uistats = FcitxInstanceGetUIStats(instance); int i; for (i = 0, status = (FcitxUIStatus*) utarray_front(uistats); status != NULL; i++, status = (FcitxUIStatus*) utarray_next(uistats, status)) { if (!status->visible) continue; flag = true; FcitxDBusMenuFillLayooutItemWrap(notificationitem, STATUS_ID(0,i), depth - 1, properties, &array); } FcitxUIComplexStatus* compstatus; UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); for (i = 0, compstatus = (FcitxUIComplexStatus*) utarray_front(uicompstats); compstatus != NULL; i++, compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) ) { if (!compstatus->visible) continue; if (FcitxUIGetMenuByStatusName(instance, compstatus->name)) continue; flag = true; FcitxDBusMenuFillLayooutItemWrap(notificationitem, STATUS_ID(1,i), depth - 1, properties, &array); } if (flag) FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,8), depth - 1, properties, &array); if (utarray_len(uimenus) > 0) { FcitxUIMenu **menupp; int i = 1; for (menupp = (FcitxUIMenu **) utarray_front(uimenus); menupp != NULL; menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp)) { do { if (!menupp) { break; } FcitxUIMenu* menup = *menupp; if (!menup->visible) { break; } if (menup->candStatusBind) { FcitxUIComplexStatus* compStatus = FcitxUIGetComplexStatusByName(instance, menup->candStatusBind); if (compStatus && !compStatus->visible) { break; } } FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(i,0), depth - 1, properties, &array); } while(0); i ++; } FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,3), depth - 1, properties, &array); } FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,4), depth - 1, properties, &array); FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,5), depth - 1, properties, &array); FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,6), depth - 1, properties, &array); FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(0,7), depth - 1, properties, &array); } } else { if (index == 0) { FcitxUIMenu** menupp = (FcitxUIMenu**) utarray_eltptr(uimenus, menu - 1), *menup; if (menupp) { menup = *menupp; menup->UpdateMenu(menup); unsigned int i = 0; unsigned int len = utarray_len(&menup->shell); for (i = 0; i < len; i++) { FcitxDBusMenuFillLayooutItemWrap(notificationitem, ACTION_ID(menu,i + 1), depth - 1, properties, &array); } } } } } dbus_message_iter_close_container(&sub, &array); dbus_message_iter_close_container(iter, &sub); }
static void UpdateMainMenu(FcitxUIMenu* menu) { FcitxClassicUI* classicui = (FcitxClassicUI*) menu->priv; FcitxInstance* instance = classicui->owner; FcitxMenuClear(menu); FcitxMenuAddMenuItem(menu, _("Online Help"), MENUTYPE_SIMPLE, NULL); FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); boolean flag = false; FcitxUIStatus* status; UT_array* uistats = FcitxInstanceGetUIStats(instance); for (status = (FcitxUIStatus*) utarray_front(uistats); status != NULL; status = (FcitxUIStatus*) utarray_next(uistats, status) ) { FcitxClassicUIStatus* privstat = GetPrivateStatus(status); if (privstat == NULL || !status->visible || privstat->avail ) continue; flag = true; FcitxMenuAddMenuItemWithData(menu, status->shortDescription, MENUTYPE_SIMPLE, NULL, strdup(status->name)); } FcitxUIComplexStatus* compstatus; UT_array* uicompstats = FcitxInstanceGetUIComplexStats(instance); for (compstatus = (FcitxUIComplexStatus*) utarray_front(uicompstats); compstatus != NULL; compstatus = (FcitxUIComplexStatus*) utarray_next(uicompstats, compstatus) ) { FcitxClassicUIStatus* privstat = GetPrivateStatus(compstatus); if (privstat == NULL || !compstatus->visible || privstat->avail) continue; if (FcitxUIGetMenuByStatusName(instance, compstatus->name)) continue; flag = true; FcitxMenuAddMenuItemWithData(menu, compstatus->shortDescription, MENUTYPE_SIMPLE, NULL, strdup(compstatus->name)); } if (flag) FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); FcitxUIMenu **menupp; UT_array* uimenus = FcitxInstanceGetUIMenus(instance); for (menupp = (FcitxUIMenu **) utarray_front(uimenus); menupp != NULL; menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp) ) { FcitxUIMenu * menup = *menupp; if (menup->isSubMenu) continue; if (!menup->visible) continue; if (menup->candStatusBind) { FcitxUIComplexStatus* compStatus = FcitxUIGetComplexStatusByName(instance, menup->candStatusBind); if (compStatus) { if (!compStatus->visible) continue; if (GetPrivateStatus(compStatus)->avail) continue; } } FcitxMenuAddMenuItem(menu, menup->name, MENUTYPE_SUBMENU, menup); } FcitxMenuAddMenuItem(menu, NULL, MENUTYPE_DIVLINE, NULL); FcitxMenuAddMenuItem(menu, _("Configure Current Input Method"), MENUTYPE_SIMPLE, NULL); FcitxMenuAddMenuItem(menu, _("Configure"), MENUTYPE_SIMPLE, NULL); FcitxMenuAddMenuItem(menu, _("Restart"), MENUTYPE_SIMPLE, NULL); FcitxMenuAddMenuItem(menu, _("Exit"), MENUTYPE_SIMPLE, NULL); }