diff -urN cui54/Makefile cui55/Makefile --- cui54/Makefile Sat Feb 1 00:00:00 2014 +++ cui55/Makefile Sat Feb 1 02:00:00 2014 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o radio.o ckbox.o button.o fill.o label.o panel.o handler.o esc.o key.o rect.o +OBJS = cui.o focus.o etext.o menu.o dialog.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o all: $(TARG) diff -urN cui54/button.c cui55/button.c --- cui54/button.c Fri Jan 31 02:40:00 2014 +++ cui55/button.c Sat Feb 1 02:00:00 2014 @@ -22,9 +22,9 @@ if(evt == CUI_EVT_KEY){ if(val == CUI_KEY_ENTER){ - cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, CUI_DRAW_ACTIVE); + cui_handler_call(obj, CUI_EVT_DRAW, CUI_DRAW_ACTIVE); usleep(50*1000); - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, 0); + cui_handler_call(obj, CUI_EVT_BUTTON, 0); cui_draw(obj); return TRUE; } diff -urN cui54/ckbox.c cui55/ckbox.c --- cui54/ckbox.c Fri Jan 31 02:40:00 2014 +++ cui55/ckbox.c Sat Feb 1 02:00:00 2014 @@ -23,7 +23,7 @@ p->v = !p->v; cui_label_str_set(p->lb1, p->v ? "[X] " : "[ ] "); cui_draw(obj); - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, p->v); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); return TRUE; } return FALSE; diff -urN cui54/cui.c cui55/cui.c --- cui54/cui.c Fri Jan 31 23:00:00 2014 +++ cui55/cui.c Sat Feb 1 02:00:00 2014 @@ -209,7 +209,8 @@ if(obj == NULL) return; if(!cui_is_visible(obj)) return; val = (obj == cui_focus_get()) ? CUI_DRAW_FOCUS : CUI_DRAW_NORMAL; - cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, val); + cui_handler_call(obj, CUI_EVT_DRAW, val); + //usleep(5*1000); // for debug cui_draw_chain(obj->children); } @@ -225,14 +226,14 @@ cui_hide(cui obj) { obj->flags |= CUI_FLG_HIDE; - cui_clear(obj); + if(cui_esc_cnt > 0) cui_clear(obj); } void cui_show(cui obj) { obj->flags &= ~CUI_FLG_HIDE; - cui_draw(obj); + if(cui_esc_cnt > 0) cui_draw(obj); } int @@ -263,19 +264,30 @@ return cui_visible_rect(obj, &tmp); } +int +cui_hide_enter(cui obj) +{ + int bak = cui_is_visible(obj); + if(bak) cui_hide(obj); + return bak; +} + +void +cui_hide_exit(cui obj, int bak) +{ + if(bak) cui_show(obj); +} + void cui_xywh_set(cui obj, int x, int y, int w, int h) { - int visi = cui_is_visible(obj); - if(visi){ - cui_hide(obj); - cui_draw(obj->parent); - } + int bak = cui_hide_enter(obj); + if(bak) cui_draw(obj->parent); obj->x = x; obj->y = y; obj->w = w; obj->h = h; - if(visi) cui_show(obj); + cui_hide_exit(obj, bak); if(obj == cui_focus_get() && !cui_is_visible_rect(obj)) cui_focus_set(NULL); } @@ -286,6 +298,12 @@ } void +cui_y_set(cui obj, int y) +{ + cui_xywh_set(obj, obj->x, y, obj->w, obj->h); +} + +void cui_xy_set(cui obj, int x, int y) { cui_xywh_set(obj, x, y, obj->w, obj->h); @@ -298,18 +316,30 @@ } void +cui_h_set(cui obj, int h) +{ + cui_xywh_set(obj, obj->x, obj->y, obj->w, h); +} + +void cui_wh_set(cui obj, int w, int h) { cui_xywh_set(obj, obj->x, obj->y, w, h); } void -cui_wh_fit(cui obj, cui child) +cui_wh_fit_chain(cui obj, cui child) { if(child == NULL) return; if(obj->w < cui_x2(child)) obj->w = cui_x2(child); if(obj->h < cui_y2(child)) obj->h = cui_y2(child); - cui_wh_fit(obj, child->next); + cui_wh_fit_chain(obj, child->next); +} + +void +cui_wh_fit(cui obj) +{ + cui_wh_fit_chain(obj, obj->children); } int @@ -359,7 +389,7 @@ if((key = cui_key_get2()) == 0) continue; focus = cui_focus_get(); if(focus){ - if(cui_handler_call(focus, focus->handler_list, CUI_EVT_KEY, key)) continue; + if(cui_handler_call(focus, CUI_EVT_KEY, key)) continue; } obj = cui_focus_move_judge(top_obj, key, NULL, &val); if(obj){ diff -urN cui54/cui.h cui55/cui.h --- cui54/cui.h Fri Jan 31 23:00:00 2014 +++ cui55/cui.h Sat Feb 1 02:00:00 2014 @@ -60,12 +60,18 @@ int cui_is_visible(cui obj); int cui_visible_rect(cui obj, cui_rect r); int cui_is_visible_rect(cui obj); +int cui_hide_enter(cui obj); +void cui_hide_exit(cui obj, int bak); + void cui_xywh_set(cui obj, int x, int y, int w, int h); void cui_x_set(cui obj, int x); +void cui_y_set(cui obj, int y); void cui_xy_set(cui obj, int x, int y); void cui_w_set(cui obj, int w); +void cui_h_set(cui obj, int h); void cui_wh_set(cui obj, int w, int h); -void cui_wh_fit(cui obj, cui child); +void cui_wh_fit_chain(cui obj, cui child); +void cui_wh_fit(cui obj); int cui_index(cui obj); cui cui_index_to_child(cui obj, int i); diff -urN cui54/cui_test.c cui55/cui_test.c --- cui54/cui_test.c Sat Feb 1 01:00:00 2014 +++ cui55/cui_test.c Sat Feb 1 02:00:00 2014 @@ -75,7 +75,7 @@ { static char buf[16]; - cui_xywh_set(obj, obj->x, obj->y + 1, obj->w, obj->h); + cui_y_set(obj, obj->y + 1); sprintf(buf, "%d", cui_gy(obj)); cui_label_str_set((cui)prm, buf); return TRUE; @@ -92,7 +92,7 @@ else if (strcmp(s, "R") == 0) x--; else if (strcmp(s, "U") == 0) y++; else if (strcmp(s, "D") == 0) y--; - cui_xywh_set(big, x, y, big->w, big->h); + cui_xy_set(big, x, y); return TRUE; } @@ -137,7 +137,7 @@ grp = cui_base_new(panel, lb->x+2, cui_y2(lb), 0, 0); rd_on = cui_radio_new(grp, 0, 0, "ON", 0); rd_off = cui_radio_new(grp, cui_x2(rd_on)+1, rd_on->y, "OFF", 1); - cui_wh_fit(grp, grp->children); + cui_wh_fit(grp); base = cui_base_new(panel, grp->x, cui_y2(grp), 0, 0); grp2 = cui_base_new(base, 0, 0, 0, 0); @@ -145,12 +145,12 @@ rd[1] = cui_radio_new(grp2, 0, 1, "KBS", 0); rd[2] = cui_radio_new(grp2, 0, 2, "MBS", 0); rd[3] = cui_radio_new(grp2, 0, 3, "OBC", 0); - cui_wh_fit(grp2, grp2->children); + cui_wh_fit(grp2); lb2 = cui_label_new(base, cui_x2(grp2)+2, 0, " kHz"); - cui_wh_fit(base, base->children); - base->flags |= CUI_FLG_HIDE; + cui_wh_fit(base); + cui_hide(base); - cui_wh_fit(panel, panel->children); + cui_wh_fit(panel); panel->w += 1; panel->h += 1; cui_panel_adj(panel); @@ -195,7 +195,7 @@ } lst[20] = NULL; menu = cui_menu_new(parent, mn_btn->x, mn_btn->y+1, lst); - menu->flags |= CUI_FLG_HIDE; + cui_hide(menu); cui_bind(mn_btn, CUI_EVT_BUTTON, mn_long_hdr, menu); cui_bind(menu, CUI_EVT_BUTTON, mn_long_hdr, NULL); return mn_btn; @@ -226,7 +226,7 @@ radio_new(base, cui_x2(dlg)+1, dlg->y); cui_simple_dialog_new(base, dlg->x, cui_y2(dlg), "How are you ?", "^_^", "T_T"); mn_long_new(base, cui_x2(dlg)+1, cui_y2(dlg)+3); - cui_wh_fit(base, base->children); + cui_wh_fit(base); cui_bind(p->btn1, CUI_EVT_BUTTON, my_hdr, p); cui_bind(popup, CUI_EVT_BUTTON, popup_hdr, lb); @@ -290,7 +290,7 @@ arrow_new(base, cui_x2(mv_lb) + 2, mv_lb->y, big); - small->flags |= CUI_FLG_HIDE; + cui_hide(small); cui_bind(mn_btn, CUI_EVT_BUTTON, mn_btn_hdr, mv_lb); cui_bind(etx, CUI_EVT_BUTTON, etx_hdr, mv_lb); cui_bind(ck, CUI_EVT_BUTTON, my_hdr2, small); diff -urN cui54/esc.h cui55/esc.h --- cui54/esc.h Thu Jan 30 03:20:00 2014 +++ cui55/esc.h Sat Feb 1 02:00:00 2014 @@ -12,6 +12,8 @@ #define CUI_ESC_CURSOR_ONOFF 25 #define CUI_ESC_SCREEN_SAVE_LOAD 47 +extern int cui_esc_cnt; + void cui_esc(char *s); void cui_esc_cls(void); void cui_esc_loc(int x, int y); diff -urN cui54/etext.c cui55/etext.c --- cui54/etext.c Sat Feb 1 01:00:00 2014 +++ cui55/etext.c Sat Feb 1 02:00:00 2014 @@ -23,12 +23,11 @@ p->lb_top = cui_label_new(obj, 0, 0, "["); p->view = cui_base_new(obj, 1, 0, w-2, 1); p->lb_end = cui_label_new(obj, cui_x2(p->view), 0, "]"); - cui_wh_fit(obj, obj->children); + cui_wh_fit(obj); p->inner = cui_base_new(p->view, 0, 0, 0, 1); - p->lb = cui_label_new(p->inner, 0, 0, p->buf); - p->fill = cui_fill_new(p->inner, cui_x2(p->lb), 0, w-2, 1, " ", CUI_ATTR_NORMAL); - cui_wh_fit(p->inner, p->inner->children); + p->lbf = cui_lblfix_new(p->inner, 0, 0, CUI_ETEXT_BSIZE, p->buf, CUI_ATTR_NORMAL); + cui_wh_fit(p->inner); obj->flags |= CUI_FLG_CAN_FOCUS; @@ -37,9 +36,9 @@ p->cursor = 0; p->buf_cursor[0] = ' '; p->buf_cursor[1] = '\0'; - p->lb_cursor = cui_label_new(p->lb, 0, 0, p->buf_cursor); + p->lb_cursor = cui_label_new(p->lbf, 0, 0, p->buf_cursor); cui_label_attr_set(p->lb_cursor, CUI_ATTR_REVERSE); - p->lb_cursor->flags |= CUI_FLG_HIDE; + cui_hide(p->lb_cursor); cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_etext_hdr, NULL); } @@ -48,10 +47,7 @@ cui_etext_buf_to_lb(cui obj) { cui_etext p = (cui_etext)obj; - - cui_label_str_set(p->lb, p->buf); - if(p->edit_mode) p->lb->w++; - cui_wh_fit(p->inner, p->inner->children); + cui_lblfix_str_set(p->lbf, p->buf); } void @@ -63,8 +59,7 @@ strcpy(p->bak, p->buf); p->n = strlen(p->buf); - cui_hide(p->fill); - cui_label_attr_set(p->lb, CUI_ATTR_NORMAL); + cui_lblfix_attr_set(p->lbf, CUI_ATTR_NORMAL); cui_etext_buf_to_lb(obj); p->cursor = 0; @@ -81,18 +76,12 @@ cui_hide(p->inner); cui_hide(p->lb_cursor); - cui_label_str_set(p->lb, p->buf); - cui_label_attr_set(p->lb, CUI_ATTR_ULINE); - p->fill->x = cui_x2(p->lb); - cui_show(p->fill); + cui_lblfix_str_set(p->lbf, p->buf); + cui_lblfix_attr_set(p->lbf, CUI_ATTR_ULINE); p->inner->x = 0; - cui_wh_fit(p->inner, p->inner->children); cui_show(p->inner); p->edit_mode = FALSE; - - if(strcmp(p->buf, p->bak) != 0){ - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, 0); - } + if(strcmp(p->buf, p->bak) != 0) cui_handler_call(obj, CUI_EVT_BUTTON, 0); } void @@ -123,8 +112,7 @@ case CUI_EVT_DRAW: attr = (val == CUI_DRAW_FOCUS) ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL; cui_label_attr_set(p->lb_top, attr); - cui_label_attr_set(p->lb, attr); - cui_fill_attr_set(p->fill, attr); + cui_lblfix_attr_set(p->lbf, attr); cui_label_attr_set(p->lb_end, attr); return TRUE; case CUI_EVT_KEY: @@ -164,7 +152,7 @@ cui_etext_cursor_update(obj); break; default: - if(p->n >= CUI_ETEXT_MAX - 1) break; + if(p->n >= CUI_ETEXT_BSIZE - 1) break; for(i=p->n; i>=p->cursor; i--) p->buf[i+1] = p->buf[i]; p->buf[p->cursor] = val; p->n++; @@ -191,11 +179,9 @@ cui_etext p = (cui_etext)obj; if(p->edit_mode) cui_etext_edit_out(obj); - strcpy(p->buf, s); - cui_label_str_set(p->lb, p->buf); - p->fill->x = cui_x2(p->lb); cui_hide(p->inner); - cui_wh_fit(p->inner, p->inner->children); + strcpy(p->buf, s); + cui_lblfix_str_set(p->lbf, p->buf); cui_show(p->inner); } diff -urN cui54/etext.h cui55/etext.h --- cui54/etext.h Sat Feb 1 01:00:00 2014 +++ cui55/etext.h Sat Feb 1 02:00:00 2014 @@ -1,14 +1,14 @@ #ifndef __ETEXT_H__ #define __ETEXT_H__ -#include "fill.h" +#include "lblfix.h" -#define CUI_ETEXT_MAX 1024 +#define CUI_ETEXT_BSIZE 1024 typedef struct cui_etext{ struct cui_base base; - char buf[ CUI_ETEXT_MAX ], bak[ CUI_ETEXT_MAX ]; - cui lb_top, lb, fill, lb_end; + char buf[ CUI_ETEXT_BSIZE ], bak[ CUI_ETEXT_BSIZE ]; + cui lb_top, lbf, lb_end; cui view, inner; int edit_mode; diff -urN cui54/handler.c cui55/handler.c --- cui54/handler.c Fri Jan 31 23:00:00 2014 +++ cui55/handler.c Sat Feb 1 02:00:00 2014 @@ -49,11 +49,18 @@ } int -cui_handler_call(cui obj, cui_handler_list list, int evt, int val) +cui_handler_call_chain(cui obj, cui_handler_list list, int evt, int val) { if(list == NULL) return FALSE; return (evt & list->evt) && (*list->hdr)(obj, evt, val, list->prm) ? TRUE : - cui_handler_call(obj, list->next, evt, val); + cui_handler_call_chain(obj, list->next, evt, val); + +} + +int +cui_handler_call(cui obj, int evt, int val) +{ + return cui_handler_call_chain(obj, obj->handler_list, evt, val); } /* EOF */ diff -urN cui54/handler.h cui55/handler.h --- cui54/handler.h Thu Jan 30 05:30:00 2014 +++ cui55/handler.h Sat Feb 1 02:00:00 2014 @@ -16,6 +16,7 @@ void cui_handler_list_free(cui_handler_list list); void cui_bind(cui obj, int evt, cui_handler hdr, void *prm); void cui_unbind(cui obj, int evt, cui_handler hdr); -int cui_handler_call(cui obj, cui_handler_list list, int evt, int val); +int cui_handler_call_chain(cui obj, cui_handler_list list, int evt, int val); +int cui_handler_call(cui obj, int evt, int val); #endif diff -urN cui54/label.c cui55/label.c --- cui54/label.c Fri Jan 31 22:20:00 2014 +++ cui55/label.c Sat Feb 1 02:00:00 2014 @@ -41,11 +41,10 @@ cui_label_str_set(cui obj, char *s) { cui_label p = (cui_label)obj; - int visi = cui_is_visible(obj); - if(visi) cui_hide(obj); + int bak = cui_hide_enter(obj); p->s = s; obj->w = strlen(s); - if(visi) cui_show(obj); + cui_hide_exit(obj, bak); } int diff -urN cui54/lblfix.c cui55/lblfix.c --- cui54/lblfix.c Thu Jan 1 09:00:00 1970 +++ cui55/lblfix.c Sat Feb 1 02:00:00 2014 @@ -0,0 +1,63 @@ +#include "lblfix.h" + +cui +cui_lblfix_new(cui parent, int x, int y, int w, char *s, int attr) +{ + cui obj = cui_alloc(sizeof(struct cui_lblfix)); + cui_lblfix_init(obj, parent, x, y, w, s, attr); + return obj; +} + +void +cui_lblfix_init(cui obj, cui parent, int x, int y, int w, char *s, int attr) +{ + cui_lblfix p = (cui_lblfix)obj; + + if(w < 0) w = strlen(s); + cui_base_init(obj, parent, x, y, w, 1); + + p->lb = cui_label_new(obj, 0, 0, s); + cui_label_attr_set(p->lb, attr); + + p->fill = cui_fill_new(obj, cui_x2(p->lb), 0, w - p->lb->w, 1, " ", attr); +} + +char * +cui_lblfix_str_get(cui obj) +{ + cui_lblfix p = (cui_lblfix)obj; + return cui_label_str_get(p->lb); +} + +void +cui_lblfix_str_set(cui obj, char *s) +{ + cui_lblfix p = (cui_lblfix)obj; + cui_label_str_set(p->lb, s); + cui_xywh_set(p->fill, cui_x2(p->lb), 0, obj->w - p->lb->w, 1); +} + +int +cui_lblfix_attr_get(cui obj) +{ + cui_lblfix p = (cui_lblfix)obj; + return cui_label_attr_get(p->lb); +} + +void +cui_lblfix_attr_set(cui obj, int attr) +{ + cui_lblfix p = (cui_lblfix)obj; + cui_label_attr_set(p->lb, attr); + cui_fill_attr_set(p->fill, attr); +} + +void +cui_lblfix_w_set(cui obj, int w) +{ + cui_lblfix p = (cui_lblfix)obj; + obj->w = w; + cui_w_set(p->fill, obj->w - p->lb->w); +} + +/* EOF */ diff -urN cui54/lblfix.h cui55/lblfix.h --- cui54/lblfix.h Thu Jan 1 09:00:00 1970 +++ cui55/lblfix.h Sat Feb 1 02:00:00 2014 @@ -0,0 +1,19 @@ +#ifndef __LBLFIX__ +#define __LBLFIX__ + +#include "fill.h" + +typedef struct cui_lblfix{ + struct cui_base base; + cui lb, fill; +} *cui_lblfix; + +cui cui_lblfix_new(cui parent, int x, int y, int w, char *s, int attr); +void cui_lblfix_init(cui obj, cui parent, int x, int y, int w, char *s, int attr); +char *cui_lblfix_str_get(cui obj); +void cui_lblfix_str_set(cui obj, char *s); +int cui_lblfix_attr_get(cui obj); +void cui_lblfix_attr_set(cui obj, int attr); +void cui_lblfix_w_set(cui obj, int w); + +#endif diff -urN cui54/menu.c cui55/menu.c --- cui54/menu.c Fri Jan 31 23:10:00 2014 +++ cui55/menu.c Sat Feb 1 02:00:00 2014 @@ -19,17 +19,16 @@ cui_button_init(obj, parent, x, y, s); cui_bind(obj, CUI_EVT_DRAW, cui_menu_btn_hdr, NULL); - btn->lb1->flags |= CUI_FLG_HIDE; - - obj->flags |= CUI_FLG_HIDE; + cui_hide(btn->lb1); + cui_hide(obj); cui_label_str_set(btn->lb3, "|"); btn->lb2->x -= 1; btn->lb3->x -= 1; obj->w = 0; - cui_wh_fit(obj, obj->children); + cui_wh_fit(obj); cui_label_attr_set(btn->lb2, CUI_ATTR_ULINE); cui_label_attr_set(btn->lb3, CUI_ATTR_ULINE); - obj->flags &= ~CUI_FLG_HIDE; + cui_show(obj); } int @@ -66,35 +65,28 @@ void cui_menu_item_init(cui obj, cui parent, int x, int y, char *s) { - cui_button btn = (cui_button)obj; - cui_menu_item mn_item = (cui_menu_item)obj; + cui_menu_item p = (cui_menu_item)obj; - cui_menu_btn_init(obj, parent, x, y, s); - mn_item->fill = cui_fill_new(obj, btn->lb3->x, 0, 0, 1, " ", CUI_ATTR_ULINE); + cui_base_init(obj, parent, x, y, 0, 1); + cui_hide(obj); + p->lbf = cui_lblfix_new(obj, 0, 0, -1, s, CUI_ATTR_ULINE); + p->lb_end = cui_label_new(obj, cui_x2(p->lbf), 0, "|"); + cui_label_attr_set(p->lb_end, CUI_ATTR_ULINE); cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_menu_item_hdr, NULL); -} - -void -cui_menu_item_adj(cui obj) -{ - cui_button btn = (cui_button)obj; - cui_menu_item mn_item = (cui_menu_item)obj; - cui fill = mn_item->fill; - - btn->lb3->x = obj->w-1; - fill->x = cui_x2(btn->lb2); - fill->w = btn->lb3->x - fill->x; + cui_wh_fit(obj); + cui_show(obj); + obj->flags |= CUI_FLG_CAN_FOCUS; } int cui_menu_item_hdr(cui obj, int evt, int val, void *prm) { - cui_button btn = (cui_button)obj; - cui_menu_item mn_item = (cui_menu_item)obj; + cui_menu_item p = (cui_menu_item)obj; + int attr; if(evt == CUI_EVT_BUTTON){ val = val ? cui_index(obj) : -1; - cui_handler_call(obj->parent, obj->parent->handler_list, CUI_EVT_BUTTON, val); + cui_handler_call(obj->parent, CUI_EVT_BUTTON, val); return TRUE; } if(evt == CUI_EVT_KEY){ @@ -103,41 +95,52 @@ switch(val){ case CUI_KEY_ENTER: case CUI_KEY_ESC: - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, val == CUI_KEY_ENTER); + cui_handler_call(obj, CUI_EVT_BUTTON, val == CUI_KEY_ENTER); return TRUE; case CUI_KEY_DOWN: case CUI_KEY_UP: dir = val == CUI_KEY_DOWN ? 1 : -1; obj2 = cui_index_to_child(obj->parent, cui_index(obj) + dir); if(obj2 && !cui_is_visible_rect(obj2)){ - cui_xy_set(obj->parent, obj->parent->x, obj->parent->y - dir); + cui_y_set(obj->parent, obj->parent->y - dir); } break; } return FALSE; } /* CUI_EVT_DRAW */ - cui_menu_btn_hdr(obj, evt, val, prm); - cui_fill_attr_set(mn_item->fill, cui_label_attr_get(btn->lb2)); + attr = CUI_ATTR_ULINE; + if(val == CUI_DRAW_FOCUS) attr |= CUI_ATTR_REVERSE; + cui_lblfix_attr_set(p->lbf, attr); + cui_label_attr_set(p->lb_end, attr); return TRUE; } char * cui_menu_item_str_get(cui obj) { - return cui_menu_btn_str_get(obj); + cui_menu_item p = (cui_menu_item)obj; + return cui_lblfix_str_get(p->lbf); } void cui_menu_item_str_set(cui obj, char *s) { - int bak = obj->w; - int visi = cui_is_visible(obj); - if(visi) cui_hide(obj); - cui_menu_btn_str_set(obj, s); - obj->w = bak; - cui_menu_item_adj(obj); - if(visi) cui_show(obj); + int bak = cui_hide_enter(obj); + cui_menu_item p = (cui_menu_item)obj; + cui_lblfix_str_set(p->lbf, s); + cui_hide_exit(obj, bak); +} + +void +cui_menu_item_w_set(cui obj, int w) +{ + cui_menu_item p = (cui_menu_item)obj; + int bak = cui_hide_enter(obj); + cui_w_set(obj, w); + cui_lblfix_w_set(p->lbf, obj->w - 1); + cui_x_set(p->lb_end, cui_x2(p->lbf)); + cui_hide_exit(obj, bak); } cui @@ -146,15 +149,16 @@ cui obj = cui_base_new(parent, x, y, 0, 0); char *s; cui item; - + + cui_hide(obj); y = 0; while((s = *lst++) != NULL) cui_menu_item_new(obj, 0, y++, s); - cui_wh_fit(obj, obj->children); + cui_wh_fit(obj); for(item=obj->children; item; item=item->next){ - item->w = obj->w; - cui_menu_item_adj(item); + cui_menu_item_w_set(item, obj->w); cui_bind(item, CUI_EVT_BUTTON, cui_menu_item_hdr, NULL); } + cui_show(obj); return obj; } @@ -183,12 +187,9 @@ cui_menu_popup p = (cui_menu_popup)obj; cui_menu_item_init(obj, parent, x, y, lst[val]); - if(w >= 0){ - obj->w = w; - cui_menu_item_adj(obj); - } + if(w >= 0) cui_menu_item_w_set(obj, w); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); - p->menu->flags |= CUI_FLG_HIDE; + cui_hide(p->menu); p->val = val; cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); @@ -211,7 +212,7 @@ if(p->val != bak){ char *s = cui_menu_item_str_get(cui_index_to_child(menu, p->val)); cui_menu_item_str_set(obj, s); - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, p->val); + cui_handler_call(obj, CUI_EVT_BUTTON, p->val); } cui_draw(menu->parent); return TRUE; diff -urN cui54/menu.h cui55/menu.h --- cui54/menu.h Fri Jan 31 23:00:00 2014 +++ cui55/menu.h Sat Feb 1 02:00:00 2014 @@ -2,15 +2,15 @@ #define __MENU_H__ #include "button.h" -#include "fill.h" +#include "lblfix.h" typedef struct cui_menu_btn{ struct cui_button button; } *cui_menu_btn; typedef struct cui_menu_item{ - struct cui_menu_btn mn_btn; - cui fill; + struct cui_base base; + cui lbf, lb_end; } *cui_menu_item; typedef struct cui_menu_popup{ @@ -27,10 +27,10 @@ cui cui_menu_item_new(cui parent, int x, int y, char *s); void cui_menu_item_init(cui obj, cui parent, int x, int y, char *s); -void cui_menu_item_adj(cui obj); int cui_menu_item_hdr(cui obj, int evt, int val, void *prm); char *cui_menu_item_str_get(cui obj); void cui_menu_item_str_set(cui obj, char *s); +void cui_menu_item_w_set(cui obj, int w); cui cui_menu_new(cui parent, int x, int y, char **lst); cui cui_menu_str_to_item(cui menu, char *s); diff -urN cui54/panel.c cui55/panel.c --- cui54/panel.c Fri Jan 31 22:00:00 2014 +++ cui55/panel.c Sat Feb 1 02:00:00 2014 @@ -29,8 +29,7 @@ cui_panel_adj(cui obj) { cui_panel p = (cui_panel)obj; - int visi = cui_is_visible(obj); - if(visi) obj->flags |= CUI_FLG_HIDE; + int bak = cui_hide_enter(obj); cui_xywh_set(p->fill[0], 1, 0, obj->w-2, 1); cui_xywh_set(p->fill[1], 1, obj->h-1, obj->w-2, 1); cui_xywh_set(p->fill[2], 0, 1, 1, obj->h-2); @@ -39,7 +38,7 @@ cui_xywh_set(p->fill[5], obj->w-1, 0, 1, 1); cui_xywh_set(p->fill[6], obj->w-1, obj->h-1, 1, 1); cui_xywh_set(p->fill[7], 0, obj->h-1, 1, 1); - if(visi) obj->flags &= ~CUI_FLG_HIDE; + cui_hide_exit(obj, bak); } /* EOF */ diff -urN cui54/radio.c cui55/radio.c --- cui54/radio.c Fri Jan 31 22:00:00 2014 +++ cui55/radio.c Sat Feb 1 02:00:00 2014 @@ -18,7 +18,7 @@ ck->v = !ck->v; cui_label_str_set(ck->lb1, ck->v ? "(O) " : "( ) "); - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, ck->v); + cui_handler_call(obj, CUI_EVT_BUTTON, ck->v); } cui @@ -49,9 +49,9 @@ { cui_ckbox ck = (cui_ckbox)obj; cui_ckbox_init(obj, parent, x, y, s, v); - obj->flags |= CUI_FLG_HIDE; + cui_hide(obj); cui_label_str_set(ck->lb1, v ? "(O) " : "( ) "); - obj->flags &= ~CUI_FLG_HIDE; + cui_show(obj); cui_bind(obj, CUI_EVT_KEY, cui_radio_hdr, NULL); }