diff -urN cui67/cui.c cui68/cui.c --- cui67/cui.c Sun Feb 2 23:50:00 2014 +++ cui68/cui.c Sun Feb 9 00:00:00 2014 @@ -225,6 +225,7 @@ void cui_hide(cui obj) { + if(obj->flags & CUI_FLG_HIDE) return; obj->flags |= CUI_FLG_HIDE; if(cui_esc_cnt > 0) cui_clear(obj); } @@ -232,6 +233,7 @@ void cui_show(cui obj) { + if(!(obj->flags & CUI_FLG_HIDE)) return; obj->flags &= ~CUI_FLG_HIDE; if(cui_esc_cnt > 0) cui_draw(obj); } @@ -282,11 +284,12 @@ cui_xywh_set(cui obj, int x, int y, int w, int h) { int bak = cui_hide_enter(obj); - if(bak) cui_draw(obj->parent); + int rsz = (obj->w != w || obj->h != h); obj->x = x; obj->y = y; obj->w = w; obj->h = h; + if(rsz) cui_handler_call(obj, CUI_EVT_RESIZE, TRUE); cui_hide_exit(obj, bak); if(obj == cui_focus_get() && !cui_is_visible_rect(obj)) cui_focus_set(NULL); } @@ -339,8 +342,10 @@ void cui_wh_fit(cui obj) { + int bak_w = obj->w, bak_h = obj->h; obj->w = obj->h = 0; cui_wh_fit_chain(obj, obj->children); + if(obj->w != bak_w || obj->h != bak_h) cui_handler_call(obj, CUI_EVT_RESIZE, TRUE); } int diff -urN cui67/cui.h cui68/cui.h --- cui67/cui.h Sun Feb 2 23:50:00 2014 +++ cui68/cui.h Sun Feb 9 00:00:00 2014 @@ -16,6 +16,7 @@ #define CUI_EVT_KEY (1<<0) #define CUI_EVT_DRAW (1<<1) #define CUI_EVT_BUTTON (1<<2) +#define CUI_EVT_RESIZE (1<<3) #define CUI_FLG_CAN_FOCUS (1<<0) #define CUI_FLG_HIDE (1<<1) diff -urN cui67/cui_test.c cui68/cui_test.c --- cui67/cui_test.c Sat Feb 8 23:00:00 2014 +++ cui68/cui_test.c Sun Feb 9 00:00:00 2014 @@ -124,8 +124,7 @@ cui_hide(base); cui_wh_fit(panel); - panel->w += 1; - panel->h += 1; + cui_wh_set(panel, panel->w+1, panel->h+1); cui_bind(rd_on, CUI_EVT_BUTTON, radio_hdr, base); cui_bind(rd_off, CUI_EVT_BUTTON, radio_hdr, base); @@ -167,7 +166,6 @@ } lst[20] = NULL; menu = cui_menu_new(parent, mn_btn->x, mn_btn->y+1, lst); - 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; @@ -229,6 +227,7 @@ 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); diff -urN cui67/fillbtn.c cui68/fillbtn.c --- cui67/fillbtn.c Fri Feb 7 22:00:00 2014 +++ cui68/fillbtn.c Sun Feb 9 00:00:00 2014 @@ -19,7 +19,7 @@ p->fill = cui_fill_new(obj, 0, 0, w, h, s, CUI_ATTR_NORMAL); p->v = 0; obj->flags |= CUI_FLG_CAN_FOCUS; - cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_fillbtn_hdr, NULL); + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_RESIZE, cui_fillbtn_hdr, NULL); } int @@ -32,7 +32,6 @@ case CUI_EVT_DRAW: attr = p->v ? CUI_ATTR_REVERSE : (val == CUI_DRAW_FOCUS ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL); cui_fill_attr_set(p->fill, attr); - if(obj->w != p->fill->w || obj->h != p->fill->h) cui_wh_set(p->fill, obj->w, obj->h); return TRUE; case CUI_EVT_KEY: if(val != CUI_KEY_ENTER) break; @@ -41,6 +40,9 @@ cui_handler_call(obj, CUI_EVT_BUTTON, p->v); p->v = FALSE; cui_draw(obj); + return TRUE; + case CUI_EVT_RESIZE: + cui_wh_set(p->fill, obj->w, obj->h); return TRUE; } return FALSE; diff -urN cui67/lblfix.c cui68/lblfix.c --- cui67/lblfix.c Sun Feb 2 22:00:00 2014 +++ cui68/lblfix.c Sun Feb 9 00:00:00 2014 @@ -1,4 +1,5 @@ #include "lblfix.h" +#include "handler.h" #include cui @@ -21,6 +22,18 @@ cui_label_attr_set(p->lb, attr); p->fill = cui_fill_new(obj, cui_x2(p->lb), 0, w - p->lb->w, 1, " ", attr); + + cui_bind(obj, CUI_EVT_RESIZE, cui_lblfix_hdr, NULL); +} + +int +cui_lblfix_hdr(cui obj, int evt, int val, void *prm) +{ + cui_lblfix p = (cui_lblfix)obj; + + /* CUI_EVT_RESIZE */ + cui_w_set(p->fill, obj->w - p->lb->w); + return TRUE; } char * @@ -51,14 +64,6 @@ 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 cui67/lblfix.h cui68/lblfix.h --- cui67/lblfix.h Sat Feb 1 02:00:00 2014 +++ cui68/lblfix.h Sun Feb 9 00:00:00 2014 @@ -10,10 +10,10 @@ 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); +int cui_lblfix_hdr(cui obj, int evt, int val, void *prm); 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 cui67/menu.c cui68/menu.c --- cui67/menu.c Sun Feb 2 22:20:00 2014 +++ cui68/menu.c Sun Feb 9 00:00:00 2014 @@ -72,7 +72,7 @@ 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); + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_RESIZE, cui_menu_item_hdr, NULL); cui_wh_fit(obj); cui_show(obj); obj->flags |= CUI_FLG_CAN_FOCUS; @@ -82,16 +82,15 @@ cui_menu_item_hdr(cui obj, int evt, int val, void *prm) { cui_menu_item p = (cui_menu_item)obj; - int attr; + int attr, dir; + cui obj2; - if(evt == CUI_EVT_BUTTON){ + switch(evt){ + case CUI_EVT_BUTTON: val = val ? cui_index(obj) : -1; cui_handler_call(obj->parent, CUI_EVT_BUTTON, val); return TRUE; - } - if(evt == CUI_EVT_KEY){ - cui obj2; - int dir; + case CUI_EVT_KEY: switch(val){ case CUI_KEY_ENTER: case CUI_KEY_ESC: @@ -107,13 +106,18 @@ break; } return FALSE; + case CUI_EVT_DRAW: + 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; + case CUI_EVT_RESIZE: + cui_w_set(p->lbf, obj->w - 1); + cui_x_set(p->lb_end, cui_x2(p->lbf)); + return TRUE; } - /* CUI_EVT_DRAW */ - 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; + return FALSE; } char * @@ -132,17 +136,6 @@ 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 cui_menu_new(cui parent, int x, int y, char **lst) { @@ -155,10 +148,9 @@ while((s = *lst++) != NULL) cui_menu_item_new(obj, 0, y++, s); cui_wh_fit(obj); for(item=obj->children; item; item=item->next){ - cui_menu_item_w_set(item, obj->w); + cui_w_set(item, obj->w); cui_bind(item, CUI_EVT_BUTTON, cui_menu_item_hdr, NULL); } - cui_show(obj); return obj; } @@ -187,10 +179,8 @@ cui_menu_popup p = (cui_menu_popup)obj; cui_menu_item_init(obj, parent, x, y, lst[val]); - if(w >= 0) cui_menu_item_w_set(obj, w); + if(w >= 0) cui_w_set(obj, w); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); - cui_hide(p->menu); - cui_draw(p->menu->parent); p->val = val; cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); @@ -207,7 +197,7 @@ int bak = p->val; menu->x = cui_lx(cui_root(obj), cui_gx(obj)); menu->y = cui_ly(cui_root(obj), cui_gy(obj)) - p->val; - cui_show(menu); + 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; diff -urN cui67/menu.h cui68/menu.h --- cui67/menu.h Sun Feb 2 22:20:00 2014 +++ cui68/menu.h Sun Feb 9 00:00:00 2014 @@ -30,7 +30,6 @@ 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 cui67/panel.c cui68/panel.c --- cui67/panel.c Fri Feb 7 22:00:00 2014 +++ cui68/panel.c Sun Feb 9 00:00:00 2014 @@ -15,7 +15,7 @@ cui_panel_init(cui obj, cui parent, int x, int y, int w, int h) { cui_panel p = (cui_panel)obj; - cui_base_init(obj, parent, x, y, w, h); + cui_base_init(obj, parent, x, y, 0, 0); p->fill[0] = cui_fill_new(obj, 0, 0, 0, 0, "-", CUI_ATTR_NORMAL); p->fill[1] = cui_fill_new(obj, 0, 0, 0, 0, "-", CUI_ATTR_NORMAL); p->fill[2] = cui_fill_new(obj, 0, 0, 0, 0, "|", CUI_ATTR_NORMAL); @@ -24,46 +24,24 @@ p->fill[5] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); p->fill[6] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); p->fill[7] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); - cui_bind(obj, CUI_EVT_DRAW, cui_panel_hdr, NULL); + cui_bind(obj, CUI_EVT_RESIZE, cui_panel_hdr, NULL); + cui_wh_set(obj, w, h); } int cui_panel_hdr(cui obj, int evt, int val, void *prm) { - /* evt == CUI_EVT_DRAW */ cui_panel p = (cui_panel)obj; - int bak; - bak = cui_hide_enter(p->fill[0]); + /* evt == CUI_EVT_RESIZE */ cui_xywh_set(p->fill[0], 1, 0, obj->w-2, 1); - cui_hide_exit(p->fill[0], bak); - - bak = cui_hide_enter(p->fill[1]); cui_xywh_set(p->fill[1], 1, obj->h-1, obj->w-2, 1); - cui_hide_exit(p->fill[1], bak); - - bak = cui_hide_enter(p->fill[2]); cui_xywh_set(p->fill[2], 0, 1, 1, obj->h-2); - cui_hide_exit(p->fill[2], bak); - - bak = cui_hide_enter(p->fill[3]); cui_xywh_set(p->fill[3], obj->w-1, 1, 1, obj->h-2); - cui_hide_exit(p->fill[3], bak); - - bak = cui_hide_enter(p->fill[4]); cui_xywh_set(p->fill[4], 0, 0, 1, 1); - cui_hide_exit(p->fill[4], bak); - - bak = cui_hide_enter(p->fill[5]); cui_xywh_set(p->fill[5], obj->w-1, 0, 1, 1); - cui_hide_exit(p->fill[5], bak); - - bak = cui_hide_enter(p->fill[6]); cui_xywh_set(p->fill[6], obj->w-1, obj->h-1, 1, 1); - cui_hide_exit(p->fill[6], bak); - bak = cui_hide_enter(p->fill[7]); cui_xywh_set(p->fill[7], 0, obj->h-1, 1, 1); - cui_hide_exit(p->fill[7], bak); return TRUE; } diff -urN cui67/scbar.c cui68/scbar.c --- cui67/scbar.c Sat Feb 8 23:00:00 2014 +++ cui68/scbar.c Sun Feb 9 00:00:00 2014 @@ -87,7 +87,7 @@ cui_bind(p->thumb, CUI_EVT_KEY, cui_scbar_thumb_hdr, obj); - cui_bind(obj, CUI_EVT_DRAW, cui_scbar_hdr, NULL); + cui_bind(obj, CUI_EVT_RESIZE, cui_scbar_hdr, NULL); } int @@ -96,36 +96,38 @@ cui obj = (cui)prm; cui_scbar p = (cui_scbar)obj; + /* evt == CUI_EVT_BUTTON */ + if(fb == p->dec){ if(p->v > 0){ p->v--; - cui_draw(obj); + cui_scbar_update(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } }else if(fb == p->inc){ if(p->v < p->max_v){ p->v++; - cui_draw(obj); + cui_scbar_update(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } }else if(fb == p->dec_pg){ if(p->v > 0){ p->v -= cui_scbar_pg_len(obj); if(p->v < 0) p->v = 0; - cui_draw(obj); + cui_scbar_update(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } }else if(fb == p->inc_pg){ if(p->v < p->max_v){ p->v += cui_scbar_pg_len(obj); if(p->v > p->max_v) p->v = p->max_v; - cui_draw(obj); + cui_scbar_update(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } }else{ /* fb == p->thumb */ if(0 <= val && val <= p->max_v){ p->v = val; - cui_draw(obj); + cui_scbar_update(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } } @@ -191,53 +193,38 @@ return TRUE; } -int -cui_scbar_hdr(cui obj, int evt, int val, void *prm) +void +cui_scbar_update(cui obj) { - /* evt == CUI_EVT_DRAW */ - cui_scbar p = (cui_scbar)obj; int pos = cui_scbar_thumb_pos(obj); int len = cui_scbar_thumb_len(obj); - int bak; + /* evt == CUI_EVT_RESIZE */ + + int bak = cui_hide_enter(obj); if(p->hv == CUI_SCBAR_H){ - bak = cui_hide_enter(p->dec_pg); cui_w_set(p->dec_pg, pos); - cui_hide_exit(p->dec_pg, bak); - - bak = cui_hide_enter(p->thumb); cui_x_set(p->thumb, cui_x2(p->dec_pg)); cui_w_set(p->thumb, len); - cui_hide_exit(p->thumb, bak); - - bak = cui_hide_enter(p->inc_pg); cui_x_set(p->inc_pg, cui_x2(p->thumb)); cui_w_set(p->inc_pg, obj->w-1 - cui_x2(p->thumb)); - cui_hide_exit(p->inc_pg, bak); - - bak = cui_hide_enter(p->inc); cui_x_set(p->inc, obj->w-1); - cui_hide_exit(p->inc, bak); }else{ - bak = cui_hide_enter(p->dec_pg); cui_h_set(p->dec_pg, pos); - cui_hide_exit(p->dec_pg, bak); - - bak = cui_hide_enter(p->thumb); cui_y_set(p->thumb, cui_y2(p->dec_pg)); cui_h_set(p->thumb, len); - cui_hide_exit(p->thumb, bak); - - bak = cui_hide_enter(p->inc_pg); cui_y_set(p->inc_pg, cui_y2(p->thumb)); cui_h_set(p->inc_pg, obj->h-1 - cui_y2(p->thumb)); - cui_hide_exit(p->inc_pg, bak); - - bak = cui_hide_enter(p->inc); cui_y_set(p->inc, obj->h-1); - cui_hide_exit(p->inc, bak); } + cui_hide_exit(obj, bak); +} + +int +cui_scbar_hdr(cui obj, int evt, int val, void *prm) +{ + cui_scbar_update(obj); return TRUE; } @@ -252,9 +239,8 @@ cui_scbar_val_set(cui obj, int v) { cui_scbar p = (cui_scbar)obj; - int bak = cui_hide_enter(obj); p->v = v; - cui_hide_exit(obj, bak); + cui_scbar_update(obj); } int @@ -268,9 +254,8 @@ cui_scbar_max_set(cui obj, int max_v) { cui_scbar p = (cui_scbar)obj; - int bak = cui_hide_enter(obj); p->max_v = max_v; - cui_hide_exit(obj, bak); + cui_scbar_update(obj); } /* EOF */ diff -urN cui67/scbar.h cui68/scbar.h --- cui67/scbar.h Sat Feb 8 23:00:00 2014 +++ cui68/scbar.h Sun Feb 9 00:00:00 2014 @@ -19,6 +19,7 @@ void cui_scbar_init(cui obj, cui parent, int x, int y, int w, int h, int max_v, int v); int cui_scbar_btn_hdr(cui fb, int evt, int val, void *prm); int cui_scbar_thumb_hdr(cui fb, int evt, int val, void *prm); +void cui_scbar_update(cui obj); int cui_scbar_hdr(cui obj, int evt, int val, void *prm); int cui_scbar_val_get(cui obj); diff -urN cui67/scpanel.c cui68/scpanel.c --- cui67/scpanel.c Sat Feb 8 23:00:00 2014 +++ cui68/scpanel.c Sun Feb 9 00:00:00 2014 @@ -28,7 +28,8 @@ cui_hide(p->hbar); cui_bind(p->hbar, CUI_EVT_BUTTON, cui_scpanel_scbar_hdr, obj); - cui_bind(obj, CUI_EVT_DRAW, cui_scpanel_hdr, NULL); + cui_bind(obj, CUI_EVT_RESIZE, cui_scpanel_hdr, obj); + cui_bind(p->sheet, CUI_EVT_RESIZE, cui_scpanel_hdr, obj); } int @@ -47,9 +48,15 @@ int cui_scpanel_hdr(cui obj, int evt, int val, void *prm) { - /* CUI_EVT_DRAW */ + cui_scpanel p = (cui_scpanel)prm; - cui_scpanel p = (cui_scpanel)obj; + /* CUI_EVT_RESIZE */ + + if(obj == (cui)prm){ /* scapanel */ + cui_wh_set(p->view, obj->w-2, obj->h-2); + cui_xywh_set(p->vbar, obj->w-1, 1, 1, obj->h-2); + cui_xywh_set(p->hbar, 1, obj->h-1, obj->w-2, 1); + } if(p->sheet->w > p->view->w){ cui_scbar_max_set(p->hbar, p->sheet->w - p->view->w); @@ -64,8 +71,7 @@ }else{ cui_hide(p->vbar); } - - return FALSE; + return TRUE; } cui