示例#1
0
/* Makes sure that each top level configuration node has a
   corresponding menu item in the 'Options' menu.*/
static void
refresh_config_menu_items(void) {
    khui_menu_def * omenu;
    khm_boolean refresh_menu = FALSE;
    khui_config_node cfg_r = NULL;

    omenu = khui_find_menu(KHUI_MENU_OPTIONS);
    if (omenu == NULL) {
#ifdef DEBUG
        assert(FALSE);
#endif
        return;
    }

    khui_action_lock();

    for (khui_cfg_get_first_child(NULL, &cfg_r);
         cfg_r != NULL;
         khui_cfg_get_next_release(&cfg_r)) {

        khm_int32     flags;
        khui_action * paction;
        wchar_t       cname[KHUI_MAXCCH_NAME];
        khm_size      cb;

        flags = khui_cfg_get_flags(cfg_r);
        if (flags & KHUI_CNFLAG_SYSTEM)
            continue;

        cb = sizeof(cname);
        if (KHM_FAILED(khui_cfg_get_name(cfg_r, cname, &cb))) {
#ifdef DEBUG
            assert(FALSE);
#endif
            continue;
        }

        paction = khui_find_named_action(cname);

        if (!paction) {
            khm_handle sub;
            khui_config_node_reg reg;
            wchar_t wshort[KHUI_MAXCCH_SHORT_DESC];
            khm_int32 action;

            khui_cfg_get_reg(cfg_r, &reg);

            kmq_create_hwnd_subscription(khm_hwnd_main, &sub);

            StringCbCopy(wshort, sizeof(wshort), reg.short_desc);
            StringCbCat(wshort, sizeof(wshort), L" ...");

            action = khui_action_create(cname, wshort, reg.long_desc,
                                        (void *) CFGACTION_MAGIC,
                                        KHUI_ACTIONTYPE_TRIGGER, sub);

            if (action == 0) {
#ifdef DEBUG
                assert(FALSE);
#endif
                continue;
            }

            khui_menu_insert_action(omenu, (khm_size) -1, action, 0);

            refresh_menu = TRUE;
        }
    }

    khui_action_unlock();

    if (refresh_menu) {
        khui_refresh_actions();
    }

}
示例#2
0
static ident_data *
find_ident_by_node(khui_config_node node) {
    khm_size cb;
    wchar_t idname[KCDB_IDENT_MAXCCH_NAME];
    int i;
    khm_handle ident = NULL;

    cb = sizeof(idname);
    khui_cfg_get_name(node, idname, &cb);

    for (i=0; i < (int)cfg_idents.n_idents; i++) {
        if (!wcscmp(cfg_idents.idents[i].idname, idname))
            break;
    }

    if (i < (int)cfg_idents.n_idents)
        return &cfg_idents.idents[i];

    /* there is no identity data for this configuration node.  We try
       to create it. */
    if (KHM_FAILED(kcdb_identity_create(idname, 0, &ident)))
        return NULL;

    if (cfg_idents.n_idents >= cfg_idents.nc_idents) {
        cfg_idents.nc_idents = UBOUNDSS(cfg_idents.n_idents + 1,
                                        IDENTS_DATA_ALLOC_INCR,
                                        IDENTS_DATA_ALLOC_INCR);
#ifdef DEBUG
        assert(cfg_idents.nc_idents > cfg_idents.n_idents);
#endif
        cfg_idents.idents = PREALLOC(cfg_idents.idents,
                                     sizeof(*cfg_idents.idents) *
                                     cfg_idents.nc_idents);
#ifdef DEBUG
        assert(cfg_idents.idents);
#endif
        ZeroMemory(&(cfg_idents.idents[cfg_idents.n_idents]),
                   sizeof(*cfg_idents.idents) *
                   (cfg_idents.nc_idents - cfg_idents.n_idents));
    }

    i = (int) cfg_idents.n_idents;

    StringCbLength(idname, KCDB_IDENT_MAXCB_NAME, &cb);
    cb += sizeof(wchar_t);

    cfg_idents.idents[i].idname = PMALLOC(cb);
#ifdef DEBUG
    assert(cfg_idents.idents[i].idname);
#endif
    StringCbCopy(cfg_idents.idents[i].idname, cb, idname);

    cfg_idents.idents[i].ident = ident;
    cfg_idents.idents[i].removed = FALSE;

    kcdb_identity_get_flags(ident, &cfg_idents.idents[i].flags);
#ifdef DEBUG
    assert(cfg_idents.idents[i].flags & KCDB_IDENT_FLAG_CONFIG);
#endif

    read_params_ident(&cfg_idents.idents[i]);

    cfg_idents.n_idents++;

    /* leave ident held. */

    return &cfg_idents.idents[i];
}