diff -urN cui123/cui.c cui124/cui.c --- cui123/cui.c Fri Apr 18 00:00:00 2014 +++ cui124/cui.c Mon Apr 21 00:00:00 2014 @@ -116,8 +116,15 @@ void cui_fini(int init_ret) { + int sfd; + cui_esc_exit(); cui_key_fd_close(); /* without KEY_FD (0) */ + for(sfd=0; sfdview, 0, 0, 0, 0, cfd); + static int cnt = 0; char buf[16]; - cui view = cui_tab_parent(tab); - int y = cui_y2(cui_tab_scline(tab)); - cui termin = cui_termin_new(view, 0, 0, 0, 0, cfd); cui_hide(termin); - cui_xywh_set(termin, 0, y, view->w, view->h - y); + cui_xywh_set(termin, 0, y, p->view->w, p->view->h - y); sprintf(buf, "%d", cnt++); cui_tab_add(tab, strdup(buf), termin, FALSE); + + cui_show(p->close_btn); } static int @@ -60,7 +67,7 @@ case CUI_EVT_READABLE: sfd = val; if((cfd = cui_srv_accept(sfd)) == -1) return FALSE; - client_add(obj, cfd); + client_add(obj, cfd, prm); break; default: return FALSE; @@ -71,7 +78,8 @@ static int view_hdr(cui obj, int evt, int val, void *prm) { - cui tab = (cui)prm; + struct conn_prm *p = (struct conn_prm *)prm; + cui tab = p->tab; cui termin, tab_btn, fc; switch(evt){ @@ -81,6 +89,7 @@ if(fc == tab || fc == termin) cui_focus_set(NULL); cui_tab_del(tab, termin); cui_termin_del_free(termin); + if(cui_tab_n_get(tab) <= 0) cui_hide(p->close_btn); break; case CUI_EVT_RESIZE: for(tab_btn=tab->children; tab_btn; tab_btn=tab_btn->next){ @@ -94,10 +103,6 @@ return TRUE; } -struct conn_prm{ - cui view, conn, tab; -}; - static int conn_hdr(cui obj, int evt, int val, void *prm) { @@ -107,13 +112,22 @@ switch(evt){ case CUI_EVT_BUTTON: - strcpy(host, "localhost"); - if(!cui_host_port_dialog(p->view, p->conn->x+1, cui_y2(p->conn), host, &port)) break; - if((cfd = cui_conn_host_port(host, port)) == -1){ - cui_msg_dialog(p->view, "connect failed"); - break; + if(obj == p->conn){ + strcpy(host, "localhost"); + if(!cui_host_port_dialog(p->view, p->conn->x+1, cui_y2(p->conn), host, &port)) break; + if((cfd = cui_conn_host_port(host, port)) == -1){ + cui_msg_dialog(p->view, "connect failed"); + break; + } + client_add(p->tab, cfd, prm); + }else if(obj == p->close_btn){ + cui_termin termin = (cui_termin)cui_tab_get(p->tab); + if(termin){ + char buf[1024]; + sprintf(buf, "close tab '%s' ?", cui_tab_str_get(p->tab)); + if(cui_confirm_dialog(p->view, buf)) cui_termin_kill((cui)termin); + } } - client_add(p->tab, cfd); break; default: return FALSE; @@ -128,24 +142,27 @@ cui bs = cui_scpanel_new(NULL, 0, 0, w_get(av), h_get(av), "cui_srv"); cui view = ((cui_scpanel)bs)->view; cui conn = cui_button_new(view, 0, 0, "conn"); - cui tab = cui_tab_new(view, cui_x2(conn) + 1, 0, 0, NULL, NULL, FALSE); + cui close_btn = cui_button_new(view, cui_x2(conn) + 1, 0, "close"); + cui tab = cui_tab_new(view, cui_x2(close_btn) + 1, 0, 0, NULL, NULL, FALSE); char **av2 = av; int port, sfd; - struct conn_prm cprm = {view, conn, tab}; + struct conn_prm cprm = {view, conn, close_btn, tab}; - cui_bind(tab, CUI_EVT_READABLE, tab_hdr, NULL); + cui_hide(close_btn); + cui_bind(tab, CUI_EVT_READABLE, tab_hdr, &cprm); while((port = cui_arg_int(av2, "-port", -1, &av2)) != -1){ if((sfd = cui_srv_port(port)) == -1) continue; cui_readable_add(tab, sfd); } - cui_bind(view, CUI_EVT_DEAD | CUI_EVT_RESIZE, view_hdr, tab); + cui_bind(view, CUI_EVT_DEAD | CUI_EVT_RESIZE, view_hdr, &cprm); cui_bind(conn, CUI_EVT_BUTTON, conn_hdr, &cprm); + cui_bind(close_btn, CUI_EVT_BUTTON, conn_hdr, &cprm); cui_main(bs, NULL); cui_free(bs); cui_fini(init_ret); - close(sfd); + // readable sfds close ... return 0; } diff -urN cui123/dialog.c cui124/dialog.c --- cui123/dialog.c Fri Apr 18 00:00:00 2014 +++ cui124/dialog.c Mon Apr 21 00:00:00 2014 @@ -74,7 +74,7 @@ } static int -host_port_hdr(cui obj, int evt, int val, void *prm) +ok_cancel_hdr(cui obj, int evt, int val, void *prm) { int *ret = (int *)prm;; switch(evt){ @@ -100,8 +100,8 @@ cui cancel = cui_button_new(view, cui_x2(ok)+1, ok->y, "Cancle"); int result; - cui_bind(ok, CUI_EVT_BUTTON, host_port_hdr, &result); - cui_bind(cancel, CUI_EVT_BUTTON, host_port_hdr, &result); + cui_bind(ok, CUI_EVT_BUTTON, ok_cancel_hdr, &result); + cui_bind(cancel, CUI_EVT_BUTTON, ok_cancel_hdr, &result); cui_main(panel, etxt); cui_hide(panel); @@ -110,6 +110,34 @@ strcpy(host, cui_etext_str_get(etxt)); *port = cui_num_get(num); } + cui_del_free(panel); + return result; +} + +int +cui_confirm_dialog(cui parent, char *s) +{ + int n = strlen(s); + int bw = strlen("(OK)") + 1 + strlen("(Cancel)"); + int w = n > bw ? n : bw; + int x = (parent->w - (w+4)) / 2; + int y = (parent->h - 5) / 2; + cui panel = cui_panel_new(parent, x, y, w+4, 5); + cui view = cui_base_new(panel, 2, 1, w, 3); + cui ok, cancel; + int result; + + cui_label_new(view, 0, 0, s); + x = (w - bw) / 2; + y = 2; + ok = cui_button_new(view, x, y, "OK"); + cancel = cui_button_new(view, cui_x2(ok)+1, y, "Cancel"); + cui_bind(ok, CUI_EVT_BUTTON, ok_cancel_hdr, &result); + cui_bind(cancel, CUI_EVT_BUTTON, ok_cancel_hdr, &result); + + cui_main(panel, cancel); + cui_hide(panel); + cui_draw(parent); cui_del_free(panel); return result; } diff -urN cui123/dialog.h cui124/dialog.h --- cui123/dialog.h Fri Apr 18 00:00:00 2014 +++ cui124/dialog.h Mon Apr 21 00:00:00 2014 @@ -12,5 +12,6 @@ cui cui_simple_dialog_new(cui parent, int x, int y, char *s, char *s_btn1, char *s_btn2); void cui_msg_dialog(cui parent, char *s); int cui_host_port_dialog(cui parent, int x, int y, char *host, int *port); +int cui_confirm_dialog(cui parent, char *s); #endif diff -urN cui123/tab.c cui124/tab.c --- cui123/tab.c Fri Apr 18 23:30:00 2014 +++ cui124/tab.c Mon Apr 21 00:00:00 2014 @@ -113,7 +113,7 @@ { cui obj = (cui)step_prm; cui_tab p = (cui_tab)obj; - int n = cui_index(obj->children) + 1; + int n = cui_tab_n_get(obj); int i, x, ret = 1; cui btn = NULL; cui view = cui_scline_view_get(p->scl); @@ -231,6 +231,21 @@ cui_tab_parent(cui obj) { return cui_tab_scline(obj)->parent; +} + +int +cui_tab_n_get(cui obj) +{ + return obj->children == NULL ? 0 : cui_index(obj->children) + 1; +} + +char * +cui_tab_str_get(cui obj) +{ + cui sheet = cui_tab_get(obj); + cui btn = btn_get(obj, sheet); + if(btn == NULL) return ""; + return cui_radio_str_get(btn); } /* EOF */ diff -urN cui123/tab.h cui124/tab.h --- cui123/tab.h Fri Apr 18 23:00:00 2014 +++ cui124/tab.h Mon Apr 21 00:00:00 2014 @@ -32,5 +32,7 @@ cui cui_tab_scline(cui obj); cui cui_tab_parent(cui obj); +int cui_tab_n_get(cui obj); +char *cui_tab_str_get(cui obj); #endif diff -urN cui123/term.c cui124/term.c --- cui123/term.c Thu Apr 17 22:00:00 2014 +++ cui124/term.c Mon Apr 21 00:00:00 2014 @@ -518,6 +518,12 @@ } void +cui_termin_kill(cui obj) +{ + termin_dead(obj); +} + +void cui_termin_del_free(cui obj) { cui_termin p = (cui_termin)obj; diff -urN cui123/term.h cui124/term.h --- cui123/term.h Wed Apr 16 00:00:00 2014 +++ cui124/term.h Mon Apr 21 00:00:00 2014 @@ -59,6 +59,7 @@ cui cui_termin_new(cui parent, int x, int y, int w, int h, int sock); void cui_termin_init(cui obj, cui parent, int x, int y, int w, int h, int sock); int cui_termin_hdr(cui obj, int evt, int val, void *prm); +void cui_termin_kill(cui obj); void cui_termin_del_free(cui obj); /**/