diff -urN cui72/cui.c cui73/cui.c --- cui72/cui.c Sun Feb 9 00:00:00 2014 +++ cui73/cui.c Mon Feb 10 01:00:00 2014 @@ -21,6 +21,7 @@ }; static cui_main_stack main_stack = NULL; +cui_rect cui_clip = NULL; cui cui_focus_get(void) @@ -104,6 +105,12 @@ if(!cui_visible_rect(obj, r1)) return; cui_rect_init(r2, x, y, n, 1); if(!cui_rect_and(r1, r2, r2)) return; /* r1 and r2 --> r2 */ + if(cui_clip){ + *r1 = *cui_clip; + r1->x = cui_lx(obj, r1->x); + r1->y = cui_ly(obj, r1->y); + if(!cui_rect_and(r1, r2, r2)) return; + } s += r2->x - x; if(r2->x + r2->w < x + n){ @@ -180,7 +187,7 @@ int cui_ly(cui obj, int gy) { - return obj == NULL ? gy : cui_lx(obj->parent, gy) - obj->y; + return obj == NULL ? gy : cui_ly(obj->parent, gy) - obj->y; } int @@ -283,14 +290,30 @@ void cui_xywh_set(cui obj, int x, int y, int w, int h) { - int bak = cui_hide_enter(obj); + int visi = cui_is_visible(obj) && cui_esc_cnt > 0; int rsz = (obj->w != w || obj->h != h); + struct cui_rect rect; + cui_rect r = ▭ + + if(visi){ + cui_clear(obj); + cui_rect_init(r, cui_gx(obj), cui_gy(obj), obj->w, obj->h); + obj->flags |= CUI_FLG_HIDE; + } 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(visi){ + obj->flags &= ~CUI_FLG_HIDE; + cui_clear(obj); + + cui_clip = r; + cui_draw(obj->parent); + cui_clip = NULL; + cui_draw(obj); + } if(obj == cui_focus_get() && !cui_is_visible_rect(obj)) cui_focus_set(NULL); } diff -urN cui72/cui.h cui73/cui.h --- cui72/cui.h Sun Feb 9 00:00:00 2014 +++ cui73/cui.h Mon Feb 10 01:00:00 2014 @@ -36,6 +36,8 @@ int flags; }; +extern cui_rect cui_clip; + cui cui_alloc(int size); void cui_base_init(cui obj, cui parent, int x, int y, int w, int h); void cui_base_child_add(cui obj, cui child); diff -urN cui72/cui_test.c cui73/cui_test.c --- cui72/cui_test.c Mon Feb 10 00:00:00 2014 +++ cui73/cui_test.c Mon Feb 10 01:00:00 2014 @@ -80,11 +80,7 @@ { static char buf[16]; - cui_hide(obj); - cui_draw(obj->parent); cui_y_set(obj, obj->y + 1); - cui_show(obj); - sprintf(buf, "%d", cui_gy(obj)); cui_label_str_set((cui)prm, buf); return TRUE; @@ -267,7 +263,7 @@ int main() { - cui bs = cui_panel_new(NULL, 0, 0, 42, 23); + cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); cui bs_bar = cui_base_new(bs, 1, 2, 0, 0); cui lb_bar = cui_label_new(bs_bar, 1, 1, "bar"); cui sc = cui_scbar_new(bs_bar, 1, 2, 20, 1, 30, 15); diff -urN cui72/scpanel.c cui73/scpanel.c --- cui72/scpanel.c Mon Feb 10 00:00:00 2014 +++ cui73/scpanel.c Mon Feb 10 01:00:00 2014 @@ -59,8 +59,12 @@ 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->tbar && obj->w != p->tbar->w) cui_w_set(p->tbar, obj->w); + return FALSE; } + /* sheet */ + if(p->sheet->w > p->view->w){ cui_scbar_max_set(p->hbar, p->sheet->w - p->view->w); cui_show(p->hbar); @@ -74,8 +78,6 @@ }else{ cui_hide(p->vbar); } - - if(p->tbar && obj->w != p->tbar->w) cui_w_set(p->tbar, obj->w); return TRUE; } diff -urN cui72/tbar.c cui73/tbar.c --- cui72/tbar.c Mon Feb 10 00:00:00 2014 +++ cui73/tbar.c Mon Feb 10 01:00:00 2014 @@ -2,6 +2,7 @@ #include "handler.h" #include "key.h" #include +#include cui cui_tbar_new(cui parent, char *s) @@ -69,7 +70,11 @@ break; case CUI_EVT_DRAW: attr = p->drag ? CUI_ATTR_REVERSE : (val == CUI_DRAW_FOCUS ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL); + cui_label_attr_set(p->fl_top, attr); + cui_label_attr_set(p->sp_top, attr); cui_label_attr_set(p->lb, attr); + cui_label_attr_set(p->sp_end, attr); + cui_label_attr_set(p->fl_end, attr); return TRUE; case CUI_EVT_RESIZE: w = obj->parent->w;