diff -urN cui112/cui.c cui113/cui.c --- cui112/cui.c Tue Apr 15 22:00:00 2014 +++ cui113/cui.c Tue Apr 15 23:00:00 2014 @@ -39,8 +39,8 @@ return i < ac ? i : -1; } -static int -conn(char *s) +int +cui_conn(char *s) { int i, port, fd; char name[1024]; @@ -65,12 +65,6 @@ return fd; } -int -cui_conn(char *s) -{ - return conn(s); -} - static int sfd = -1; static void @@ -130,7 +124,7 @@ cui_key_init(); if((i = arg_idx(ac, av, "-conn")) > 0){ if(i+1 >= ac) ERR("-conn [name:]port"); - cui_key_fd_add(conn(av[i+1])); + cui_key_fd_add(cui_conn(av[i+1])); use_stdio = arg_idx(ac, av, "-stdio") > 0; } if((i = arg_idx(ac, av, "-srv")) > 0){ diff -urN cui112/cui.h cui113/cui.h --- cui112/cui.h Tue Apr 15 22:00:00 2014 +++ cui113/cui.h Tue Apr 15 23:00:00 2014 @@ -21,6 +21,7 @@ #define CUI_EVT_RESIZE (1<<3) #define CUI_EVT_TIMER (1<<4) #define CUI_EVT_READABLE (1<<5) +#define CUI_EVT_DEAD (1<<6) #define CUI_FLG_CAN_FOCUS (1<<0) #define CUI_FLG_HIDE (1<<1) diff -urN cui112/cui_test.c cui113/cui_test.c --- cui112/cui_test.c Tue Apr 15 22:00:00 2014 +++ cui113/cui_test.c Tue Apr 15 23:00:00 2014 @@ -383,22 +383,29 @@ /* CUI_EVT_BUTTON */ cui bs = (cui)prm; + cui add = cui_index_to_child(bs, 0); cui ck = cui_index_to_child(bs, 1); - cui tab_test = cui_index_to_child(bs, 2); + cui del = cui_index_to_child(bs, 2); + cui tab_test = cui_index_to_child(bs, 3); static int cnt = 0; char buf[16]; cui parent = tab_test->parent; int y = cui_y2(tab_test); - cui sheet = cui_base_new(parent, 0, y, 0, 0); - cui_hide(sheet); - cui_wh_set(sheet, parent->w, parent->h-y); - - sprintf(buf, "%d", cnt++); - cui_label_new(sheet, 1, 1, strdup(buf)); - - cui_tab_add(tab_test, strdup(buf), sheet, cui_ckbox_val_get(ck)); + if(obj == add){ + cui sheet = cui_base_new(parent, 0, y, 0, 0); + cui_hide(sheet); + cui_wh_set(sheet, parent->w, parent->h-y); + + sprintf(buf, "%d", cnt++); + cui_label_new(sheet, 1, 1, strdup(buf)); + + cui_tab_add(tab_test, strdup(buf), sheet, cui_ckbox_val_get(ck)); + }else if(obj == del){ + cui sheet = cui_tab_get(tab_test); + cui_tab_del(tab_test, sheet); + }else return FALSE; return TRUE; } @@ -432,8 +439,9 @@ cui num_arr[] = { num2, num_d2, mn_int1 }; cui bs_tab_test = cui_base_new(bs_view, 0, 1, bs_view->w, bs_view->h-1); - cui tab_test_btn = cui_button_new(bs_tab_test, 0, 1, "add"); - + cui tab_test_add_btn = cui_button_new(bs_tab_test, 0, 1, "add"); + cui tab_test_ck = cui_ckbox_new(bs_tab_test, cui_x2(tab_test_add_btn)+2, tab_test_add_btn->y, "init_act", TRUE); + cui tab_test_del_btn = cui_button_new(bs_tab_test, cui_x2(tab_test_ck)+2, tab_test_ck->y, "del"); cui bs_termin = cui_base_new(bs_view, 0, 1, 0, 0); cui base = cui_base_new(bs_view, 0, 1, 40, 20); @@ -498,9 +506,9 @@ cui_wh_exp(bs_num); cui_hide(bs_tab_test); - cui_ckbox_new(bs_tab_test, cui_x2(tab_test_btn)+2, tab_test_btn->y, "init_act", TRUE); - cui_tab_new(bs_tab_test, 0, cui_y2(tab_test_btn)+1, 0, NULL, NULL, 0); - cui_bind(tab_test_btn, CUI_EVT_BUTTON, tab_test_btn_hdr, bs_tab_test); + cui_tab_new(bs_tab_test, 0, cui_y2(tab_test_add_btn)+1, 0, NULL, NULL, 0); + cui_bind(tab_test_add_btn, CUI_EVT_BUTTON, tab_test_btn_hdr, bs_tab_test); + cui_bind(tab_test_del_btn, CUI_EVT_BUTTON, tab_test_btn_hdr, bs_tab_test); cui_hide(bs_termin); cui_wh_set(bs_termin, 72, 24); diff -urN cui112/tab.c cui113/tab.c --- cui112/tab.c Mon Apr 14 01:00:00 2014 +++ cui113/tab.c Tue Apr 15 23:00:00 2014 @@ -4,15 +4,15 @@ #include cui -cui_tab_btn_new(cui parent, int x, int y, char *s, int v) +cui_tab_btn_new(cui parent, int x, int y, char *s, int v, cui sheet) { cui obj = cui_alloc(sizeof(struct cui_tab_btn)); - cui_tab_btn_init(obj, parent, x, y, s, v); + cui_tab_btn_init(obj, parent, x, y, s, v, sheet); return obj; } void -cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v) +cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v, cui sheet) { cui_radio rd = (cui_radio)obj; cui_tab_btn p = (cui_tab_btn)rd; @@ -26,10 +26,12 @@ cui_label_str_set(p->lb1, "/ "); cui_x_set(p->lb2, cui_x2(p->lb1)); p->lb3 = cui_label_new(obj, cui_x2(p->lb2), 0, " |"); + p->sheet = sheet; cui_wh_fit(obj); cui_bind(obj, CUI_EVT_DRAW , cui_tab_btn_hdr, NULL); cui_show(obj); + cui_show_hide(sheet, v); } int @@ -37,7 +39,6 @@ { cui_tab_btn p = (cui_tab_btn)obj; int attr, v; - cui sheet; switch(evt){ case CUI_EVT_DRAW: @@ -49,8 +50,7 @@ cui_label_attr_set(p->lb2, attr); return TRUE; case CUI_EVT_BUTTON: - sheet = (cui)prm; - cui_show_hide(sheet, val); + cui_show_hide(p->sheet, val); return TRUE; } return FALSE; @@ -69,6 +69,22 @@ } cui +cui_tab_btn_sheet_get(cui obj) +{ + cui_tab_btn p = (cui_tab_btn)obj; + return p->sheet; +} + +void +cui_tab_btn_sheet_set(cui obj, cui sheet) +{ + cui_tab_btn p = (cui_tab_btn)obj; + p->sheet = sheet; +} + +/**/ + +cui cui_tab_new(cui parent, int x, int y, int w, char **lst, cui *sheets, int v) { cui obj = cui_alloc(sizeof(struct cui_tab)); @@ -86,9 +102,9 @@ if(lst){ x = 0; for(i=0; lst[i]; i++){ - btn = cui_tab_btn_new(obj, x, 0, lst[i], i == v); + btn = cui_tab_btn_new(obj, x, 0, lst[i], i == v, sheets[i]); x = cui_x2(btn); - cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, sheets[i]); + cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, NULL); } } if(w < 0) cui_wh_fit(obj); @@ -99,12 +115,53 @@ { int first = !obj->children; int x = first ? 0 : cui_x2(obj->children); - cui btn = cui_tab_btn_new(obj, x, 0, s, first); - cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, sheet); + cui btn = cui_tab_btn_new(obj, x, 0, s, first, sheet); + cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, NULL); cui_wh_fit(obj); cui_draw(obj); if(first) cui_show(sheet); - else if(v) cui_handler_call(btn, CUI_EVT_KEY, CUI_KEY_ENTER); + else if(v) cui_tab_set(obj, sheet); +} + +static cui +btn_get(cui obj, cui sheet) +{ + cui c = obj->children; + for(; c; c=c->next) if(cui_tab_btn_sheet_get(c) == sheet) return c; + return NULL; +} + +void +cui_tab_del(cui obj, cui sheet) +{ + cui clst = obj->children; + cui c = btn_get(obj, sheet), c2; + + if(!c) return; + cui_hide(c); + if(cui_tab_btn_val_get(c)){ + c2 = cui_index_to_child(obj, 0); + if(c2 == c) c2 = cui_index_to_child(obj, 1); + if(c2) cui_tab_set(obj, cui_tab_btn_sheet_get(c2)); + } + for(c2=clst; c2!=c; c2=c2->next) cui_x_set(c2, c2->x - c->w); + cui_del_free(c); +} + +cui +cui_tab_get(cui obj) +{ + cui c = obj->children; + for(; c; c=c->next) if(cui_tab_btn_val_get(c)) return cui_tab_btn_sheet_get(c); + return NULL; +} + +void +cui_tab_set(cui obj, cui sheet) +{ + cui c = btn_get(obj, sheet); + if(!c) return; + cui_handler_call(c, CUI_EVT_KEY, CUI_KEY_ENTER); } /* EOF */ diff -urN cui112/tab.h cui113/tab.h --- cui112/tab.h Mon Apr 14 00:00:00 2014 +++ cui113/tab.h Tue Apr 15 23:00:00 2014 @@ -6,20 +6,27 @@ typedef struct cui_tab_btn{ struct cui_radio radio; cui lb1, lb2, lb3; + cui sheet; } *cui_tab_btn; typedef struct cui_tab{ struct cui_base base; } *cui_tab; -cui cui_tab_btn_new(cui parent, int x, int y, char *s, int v); -void cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v); +cui cui_tab_btn_new(cui parent, int x, int y, char *s, int v, cui sheet); +void cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v, cui sheet); int cui_tab_btn_hdr(cui obj, int evt, int val, void *prm); int cui_tab_btn_val_get(cui obj); void cui_tab_btn_val_set(cui obj, int v); +cui cui_tab_btn_sheet_get(cui obj); +void cui_tab_btn_sheet_set(cui obj, cui sheet); cui cui_tab_new(cui parent, int x, int y, int w, char **lst, cui *sheets, int v); void cui_tab_init(cui obj, cui parent, int x, int y, int w, char **lst, cui *sheets, int v); void cui_tab_add(cui obj, char *s, cui sheet, int v); +void cui_tab_del(cui obj, cui sheet); + +cui cui_tab_get(cui obj); +void cui_tab_set(cui obj, cui sheet); #endif diff -urN cui112/term.c cui113/term.c --- cui112/term.c Tue Apr 15 22:00:00 2014 +++ cui113/term.c Tue Apr 15 23:00:00 2014 @@ -472,11 +472,12 @@ p->in_key_mode = TRUE; cui_main(obj, obj); p->in_key_mode = FALSE; + cui_draw(obj); } break; case CUI_EVT_READABLE: if((n = read(p->sock, buf, 1024-1)) <= 0){ - // ... + cui_handler_call(obj->parent, CUI_EVT_DEAD, cui_index(obj)); return TRUE; } buf[n] = '\0';