diff -urN cui130/cui.c cui131/cui.c --- cui130/cui.c Thu Apr 24 22:00:00 2014 +++ cui131/cui.c Fri Apr 25 00:00:00 2014 @@ -854,4 +854,15 @@ return bs; } +cui +cui_wlb_name_new(cui parent, char *s1, char *name, char *s2) +{ + cui obj; + + if(parent == NULL) return NULL; + if((obj = parent->children) == NULL) return NULL; + obj->name = name; + return cui_wlb_new(parent, obj->x, obj->y, s1, obj, s2); +} + /* EOF */ diff -urN cui130/cui.h cui131/cui.h --- cui130/cui.h Thu Apr 24 22:00:00 2014 +++ cui131/cui.h Fri Apr 25 00:00:00 2014 @@ -123,6 +123,6 @@ void cui_puts(char *s); cui cui_wlb_new(cui parent, int x, int y, char *s1, cui obj, char *s2); - +cui cui_wlb_name_new(cui parent, char *s1, char *name, char *s2); #endif diff -urN cui130/cui_test.c cui131/cui_test.c --- cui130/cui_test.c Sat Apr 19 00:00:00 2014 +++ cui131/cui_test.c Fri Apr 25 00:00:00 2014 @@ -227,19 +227,17 @@ } int -mn_btn_hdr(cui obj, int evt, int val, void *prm) +mn_pd_hdr(cui obj, int evt, int val, void *prm) { - char *lst[] = {"Open", "Save", "Close", "Quit", NULL}; - cui menu = cui_menu_new(obj->parent, obj->x, obj->y+1, lst); - - cui_bind(menu, CUI_EVT_BUTTON, mn_hdr, prm); - menu->flags &= ~CUI_FLG_HIDE; - cui_main(menu, cui_menu_str_to_item(menu, "Open")); - cui_hide(menu); - cui_draw(menu->parent); - cui_del_free(menu); + /* CUI_EVT_BUTTON */ - if(strcmp(cui_label_str_get((cui)prm), "Quit") == 0) cui_quit(); + cui lb = (cui)prm; + char *s = cui_menu_pulldown_str_get(obj); + if(strcmp(s, "Quit") == 0) cui_quit(); + else{ + cui_label_str_set(lb, s); + cui_handler_call(lb, CUI_EVT_RESIZE, TRUE); + } return TRUE; } @@ -460,9 +458,10 @@ cui bs_termin = cui_base_new(bs_view, 0, 1, 0, 0); cui base = cui_base_new(bs_view, 0, 1, 40, 20); - cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); - cui etx = cui_etext_new(base, mn_btn->x, cui_y2(mn_btn), 8, "foo"); - cui ck = cui_ckbox_new(base, cui_x2(mn_btn)+2, 1, "Show", FALSE); + char *mn_pd_lst[] = {"Open", "Save", "Close", "Quit", NULL}; + cui mn_pd = cui_menu_pulldown_new(base, 1, 1, "File", mn_pd_lst); + cui etx = cui_etext_new(base, CUI_CHILD_X, CUI_CHILD_Y2, 8, "foo"); + cui ck = cui_ckbox_new(base, cui_x2(mn_pd)+2, 1, "Show", FALSE); cui mv_btn = cui_button_new(base, cui_x2(ck) + 2, ck->y, "move"); cui scl = cui_scline_new(base, cui_x2(mv_btn) + 2, mv_btn->y, 0); cui mv_lb = cui_label_new(cui_scline_view_get(scl), 0, 0, ""); @@ -480,7 +479,7 @@ cui_wh_fit(small2); cui_hide(small); - cui_bind(mn_btn, CUI_EVT_BUTTON, mn_btn_hdr, mv_lb); + cui_bind(mn_pd, CUI_EVT_BUTTON, mn_pd_hdr, mv_lb); cui_bind(etx, CUI_EVT_BUTTON, etx_hdr, mv_lb); cui_bind(ck, CUI_EVT_BUTTON, my_hdr2, small); cui_bind(mv_btn, CUI_EVT_BUTTON, mv_hdr, mv_lb); diff -urN cui130/menu.c cui131/menu.c --- cui130/menu.c Thu Apr 24 22:00:00 2014 +++ cui131/menu.c Fri Apr 25 00:00:00 2014 @@ -151,6 +151,38 @@ return obj; } +int +cui_menu_hdr(cui menu, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + int *vp = (int *)prm; + if(vp) *vp = val; + cui_quit(); + return TRUE; +} + +int +cui_menu_main(cui obj, cui menu, int *v, int dy) +{ + int bak = *v, ret; + if(menu->parent != cui_root(obj)){ + if(menu->parent) cui_del(menu); + menu->parent = cui_root(obj); + cui_base_child_add(cui_root(obj), menu); + } + + menu->x = cui_lx(cui_root(obj), cui_gx(obj)); + menu->y = cui_ly(cui_root(obj), cui_gy(obj)) + dy; + menu->flags &= ~CUI_FLG_HIDE; + + cui_main(menu, cui_index_to_child(menu, *v)); + cui_hide(menu); + + if(!(ret = (*v >= 0))) *v = bak; + return ret; +} + cui cui_menu_str_to_item(cui menu, char *s) { @@ -197,7 +229,7 @@ cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); cui_bind(obj, CUI_EVT_KEY, cui_menu_popup_hdr, NULL); - cui_bind(p->menu, CUI_EVT_BUTTON, cui_menu_popup_hdr, obj); + cui_bind(p->menu, CUI_EVT_BUTTON, cui_menu_hdr, &p->val); } int @@ -206,33 +238,16 @@ if(evt == CUI_EVT_KEY && val == CUI_KEY_ENTER){ /* menu_popup */ cui_menu_popup p = (cui_menu_popup)obj; cui menu = p->menu; - int bak = p->val; - if(menu->parent != cui_root(obj)){ - if(menu->parent) cui_del(menu); - menu->parent = cui_root(obj); - cui_base_child_add(cui_root(obj), menu); - } - menu->x = cui_lx(cui_root(obj), cui_gx(obj)); - menu->y = cui_ly(cui_root(obj), cui_gy(obj)) - p->val; - menu->flags &= ~CUI_FLG_HIDE; - cui_main(menu, cui_index_to_child(menu, p->val)); - cui_hide(menu); - if(p->val < 0) p->val = bak; - else{ - char *s = cui_menu_item_str_get(cui_index_to_child(menu, p->val)); + if(cui_menu_main(obj, menu, &p->val, -p->val)){ + char *s; + if(p->vp) *p->vp = p->val; + s = cui_menu_item_str_get(cui_index_to_child(menu, p->val)); cui_menu_item_str_set(obj, s); if(p->call_btn_hdr_flag) cui_handler_call(obj, CUI_EVT_BUTTON, p->val); } cui_draw(menu->parent); - return TRUE; - }else if(evt == CUI_EVT_BUTTON){ /* menu */ - cui_menu_popup p = (cui_menu_popup)prm; - p->val = val; - if(p->vp) *p->vp = p->val; - cui_quit(); - return TRUE; - } - return FALSE; + }else return FALSE; + return TRUE; } char * @@ -435,11 +450,11 @@ p->btn = cui_menu_btn_new(obj, 0, 0, s); cui_wh_fit(obj); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); - p->v = -1; + p->v = 0; p->vp = NULL; cui_bind(p->btn, CUI_EVT_BUTTON, cui_menu_pulldown_hdr, obj); - cui_bind(p->menu, CUI_EVT_BUTTON, cui_menu_pulldown_hdr, obj); + cui_bind(p->menu, CUI_EVT_BUTTON, cui_menu_hdr, &p->v); } int @@ -451,18 +466,11 @@ switch(evt){ case CUI_EVT_BUTTON: if(ev_obj == p->btn){ - int bak = p->v; - p->menu->x = cui_lx(cui_root(obj), cui_gx(obj)); - p->menu->y = cui_ly(cui_root(obj), cui_gy(obj)) + 1; - p->menu->flags &= ~CUI_FLG_HIDE; - cui_main(p->menu, cui_index_to_child(p->menu, 0)); - cui_hide(p->menu); - if(p->v < 0) p->v = bak; - else cui_handler_call(obj, CUI_EVT_BUTTON, p->v); - }else if(ev_obj == p->menu){ - p->v = val; - if(p->vp) *p->vp = p->v; - cui_quit(); + p->v = 0; + if(cui_menu_main(ev_obj, p->menu, &p->v, 1)){ + if(p->vp) *p->vp = p->v; + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } } break; default: diff -urN cui130/menu.h cui131/menu.h --- cui130/menu.h Mon Apr 21 22:00:00 2014 +++ cui131/menu.h Fri Apr 25 00:00:00 2014 @@ -46,6 +46,8 @@ void cui_menu_item_str_set(cui obj, char *s); cui cui_menu_new(cui parent, int x, int y, char **lst); +int cui_menu_hdr(cui menu, int evt, int val, void *prm); + cui cui_menu_str_to_item(cui menu, char *s); int cui_menu_item_num(cui obj); cui cui_menu_item_get(cui obj, int i);