/* 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, ®); 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(); } }
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]; }