bool hook_add_extl(WHook *hk, ExtlFn efn) { WHookItem *item; if(efn==extl_fn_none()){ warn(TR("No function given.")); return FALSE; } if(hook_find_extl(hk, efn)) return FALSE; item=create_item(hk); if(item==NULL) return FALSE; item->efn=extl_ref_fn(efn); return TRUE; }
static void show_sub(WMenu *menu, int n) { WFitParams fp; WMenuCreateParams fnp; WMenu *submenu; WWindow *par; par=REGION_PARENT(menu); if(par==NULL) return; fp=menu->last_fp; fnp.pmenu_mode=menu->pmenu_mode; fnp.big_mode=menu->big_mode; fnp.submenu_mode=TRUE; if(menu->pmenu_mode){ fnp.refg.x=REGION_GEOM(menu).x+REGION_GEOM(menu).w; fnp.refg.y=REGION_GEOM(menu).y+get_sub_y_off(menu, n); fnp.refg.w=0; fnp.refg.h=0; }else{ fnp.refg=REGION_GEOM(menu); } fnp.tab=extl_table_none(); { ExtlFn fn; if(extl_table_getis(menu->tab, n+1, "submenu_fn", 'f', &fn)){ extl_protect(NULL); extl_call(fn, NULL, "t", &(fnp.tab)); extl_unprotect(NULL); extl_unref_fn(fn); }else{ extl_table_getis(menu->tab, n+1, "submenu", 't', &(fnp.tab)); } if(fnp.tab==extl_table_none()) return; } fnp.handler=extl_ref_fn(menu->handler); fnp.initial=0; { ExtlFn fn; if(extl_table_getis(menu->tab, n+1, "initial", 'f', &fn)){ extl_protect(NULL); extl_call(fn, NULL, "i", &(fnp.initial)); extl_unprotect(NULL); extl_unref_fn(fn); }else{ extl_table_getis(menu->tab, n+1, "initial", 'i', &(fnp.initial)); } } submenu=create_menu(par, &fp, &fnp); if(submenu==NULL) return; menu->submenu=submenu; region_set_manager((WRegion*)submenu, (WRegion*)menu); region_restack((WRegion*)submenu, MENU_WIN(menu), Above); region_map((WRegion*)submenu); if(!menu->pmenu_mode && region_may_control_focus((WRegion*)menu)) region_do_set_focus((WRegion*)submenu, FALSE); }
bool menu_init(WMenu *menu, WWindow *par, const WFitParams *fp, const WMenuCreateParams *params) { Window win; int i; menu->entries=preprocess_menu(params->tab, &(menu->n_entries)); if(menu->entries==NULL){ warn(TR("Empty menu.")); return FALSE; } menu->tab=extl_ref_table(params->tab); menu->handler=extl_ref_fn(params->handler); menu->pmenu_mode=params->pmenu_mode; menu->big_mode=params->big_mode; /*menu->cycle_bindmap=NULL;*/ menu->last_fp=*fp; if(params->pmenu_mode){ menu->selected_entry=-1; }else{ menu->selected_entry=params->initial-1; if(menu->selected_entry<0) menu->selected_entry=0; if(params->initial > menu->n_entries) menu->selected_entry=0; } menu->max_entry_w=0; menu->entry_h=0; menu->brush=NULL; menu->entry_brush=NULL; menu->entry_spacing=0; menu->vis_entries=menu->n_entries; menu->first_entry=0; menu->submenu=NULL; menu->typeahead=NULL; menu->gm_kcb=0; menu->gm_state=0; if(!window_init((WWindow*)menu, par, fp)) goto fail; win=menu->win.win; if(!menu_init_gr(menu, region_rootwin_of((WRegion*)par), win)) goto fail2; init_attr(); menu_firstfit(menu, params->submenu_mode, &(params->refg)); window_select_input(&(menu->win), IONCORE_EVENTMASK_NORMAL); region_add_bindmap((WRegion*)menu, mod_menu_menu_bindmap); region_register((WRegion*)menu); return TRUE; fail2: window_deinit((WWindow*)menu); fail: extl_unref_table(menu->tab); extl_unref_fn(menu->handler); deinit_entries(menu); return FALSE; }