Ejemplo n.º 1
0
FCITX_EXPORT_API
void FcitxUIUpdateStatus(FcitxInstance* instance, const char* name)
{
    FcitxLog(DEBUG, "Update Status for %s", name);

    FcitxUIStatus *status = FcitxUIGetStatusByName(instance, name);

    if (status != NULL) {
        if (status->toggleStatus)
            status->toggleStatus(status->arg);

        if (UI_FUNC_IS_VALID(UpdateStatus))
            instance->ui->ui->UpdateStatus(instance->ui->addonInstance , status);
    }
    else {
        FcitxUIComplexStatus *compstatus = FcitxUIGetComplexStatusByName(instance, name);
        if (!compstatus)
            return;

        if (compstatus->toggleStatus)
            compstatus->toggleStatus(compstatus->arg);
        if (UI_FUNC_IS_VALID(UpdateComplexStatus))
            instance->ui->ui->UpdateComplexStatus(instance->ui->addonInstance , compstatus);
    }
}
Ejemplo n.º 2
0
FCITX_EXPORT_API
void FcitxUISetStatusVisable(FcitxInstance* instance, const char* name, boolean visible)
{
    FcitxUIStatus *status = FcitxUIGetStatusByName(instance, name);
    if (!status) {
        FcitxUIComplexStatus *compstatus = FcitxUIGetComplexStatusByName(instance, name);
        if (!compstatus)
            return;

        if (compstatus->visible != visible) {
            compstatus->visible = visible;

            if (UI_FUNC_IS_VALID(UpdateComplexStatus))
                instance->ui->ui->UpdateComplexStatus(instance->ui->addonInstance, compstatus);
        }
        return;
    }

    if (status->visible != visible) {
        status->visible = visible;

        if (UI_FUNC_IS_VALID(UpdateStatus))
            instance->ui->ui->UpdateStatus(instance->ui->addonInstance, status);
    }
}
Ejemplo n.º 3
0
FCITX_EXPORT_API
void FcitxUIRefreshStatus(FcitxInstance* instance, const char* name)
{
    FcitxUIStatus *status = FcitxUIGetStatusByName(instance, name);

    if (status != NULL) {
        if (UI_FUNC_IS_VALID(UpdateStatus))
            instance->ui->ui->UpdateStatus(instance->ui->addonInstance , status);
    }
    else {
        FcitxUIComplexStatus *compstatus = FcitxUIGetComplexStatusByName(instance, name);
        if (!compstatus)
            return;

        if (UI_FUNC_IS_VALID(UpdateComplexStatus))
            instance->ui->ui->UpdateComplexStatus(instance->ui->addonInstance , compstatus);
    }
}
Ejemplo n.º 4
0
FCITX_EXPORT_API
void FcitxUISetStatusString(FcitxInstance* instance, const char* name, const char* shortDesc, const char* longDesc)
{
    char** pShort = NULL, **pLong = NULL;
    FcitxUIStatus *status = FcitxUIGetStatusByName(instance, name);
    FcitxUIComplexStatus *compstatus = NULL;
    if (!status) {
        compstatus = FcitxUIGetComplexStatusByName(instance, name);
        if (!compstatus)
            return;

        pShort = &compstatus->shortDescription;
        pLong = &compstatus->longDescription;
    }
    else {
        pShort = &status->shortDescription;
        pLong = &status->longDescription;
    }

    if (*pShort)
        free(*pShort);

    if (*pLong)
        free(*pLong);

    *pShort = strdup(shortDesc);
    *pLong = strdup(longDesc);

    if (status){
        if (UI_FUNC_IS_VALID(UpdateStatus))
            instance->ui->ui->UpdateStatus(instance->ui->addonInstance, status);
    }
    else if (compstatus) {
        if (UI_FUNC_IS_VALID(UpdateComplexStatus))
            instance->ui->ui->UpdateComplexStatus(instance->ui->addonInstance, compstatus);
    }
}
Ejemplo n.º 5
0
FCITX_EXPORT_API
FcitxUIMenu* FcitxUIGetMenuByStatusName(FcitxInstance* instance, const char* name)
{
    FcitxUIStatus* status = FcitxUIGetStatusByName(instance, name);
    if (!status) {
        FcitxUIComplexStatus* compstatus = FcitxUIGetComplexStatusByName(instance, name);
        if (!compstatus)
            return NULL;
    }

    UT_array* uimenus = &instance->uimenus;
    FcitxUIMenu** menupp, *menup = NULL;
    for (menupp = (FcitxUIMenu **) utarray_front(uimenus);
         menupp != NULL;
         menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp)
        ) {
        if ((*menupp)->candStatusBind && strcmp((*menupp)->candStatusBind, name) == 0) {
            menup = *menupp;
            break;
        }
    }

    return menup;
}
Ejemplo n.º 6
0
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);
}
Ejemplo n.º 7
0
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);
}