diff -urN cui117/cui.c cui118/cui.c --- cui117/cui.c 2014-04-17 22:00:00.000000000 +0900 +++ cui118/cui.c 2014-04-18 00:00:00.000000000 +0900 @@ -15,6 +15,7 @@ #include "list.h" #include "menu.h" #include "term.h" +#include "dialog.h" #include #include #include @@ -47,6 +48,26 @@ } static void +conn(cui obj) +{ + char host[1024]; + int port = 12345, cfd; + + strcpy(host, "localhost"); + if(!cui_host_port_dialog(obj, 1, 1, host, &port)) return; + if((cfd = cui_conn_host_port(host, port)) == -1){ + cui_msg_dialog(obj, "connect failed"); + return; + } + cui_key_fd_add(cfd); + cui_puts_temp_fd_enter(cfd); + cui_esc_enter(); + cui_clear(obj); + cui_draw(obj); + cui_puts_temp_fd_exit(); +} + +static void disconn(void) { int fd = cui_key_last_fd; @@ -590,7 +611,7 @@ cmenu(cui obj, int key) { cui mn; - char *lst[] = { "Cancel", "^C", "Redraw", "Disconn", "HTML", "Quit", NULL }, *s; + char *lst[] = { "Cancel", "^C", "Redraw", "Conn", "Disconn", "HTML", "Quit", NULL }, *s; if(key != CUI_KEY_CTRL('C')) return key; @@ -606,6 +627,7 @@ cui_clear(obj); cui_draw(obj); }else if(strcmp(s, "HTML") == 0) html(cui_root(obj)); + else if(strcmp(s, "Conn") == 0) conn(obj); else if(strcmp(s, "Disconn") == 0) disconn(); /* else Cancel */ return 0; diff -urN cui117/cui_srv.c cui118/cui_srv.c --- cui117/cui_srv.c 2014-04-17 22:00:00.000000000 +0900 +++ cui118/cui_srv.c 2014-04-18 00:00:00.000000000 +0900 @@ -11,8 +11,7 @@ #include "term.h" #include "handler.h" #include "button.h" -#include "etext.h" -#include "num.h" +#include "dialog.h" static int w_get(char **av) @@ -95,38 +94,26 @@ return TRUE; } -typedef struct conn_prm{ +struct conn_prm{ cui view, conn, tab; - cui dlg, host, port, ok, cancel; - int result; -} *conn_prm; +}; static int conn_hdr(cui obj, int evt, int val, void *prm) { - conn_prm p = (conn_prm)prm; - int cfd; + struct conn_prm *p = (struct conn_prm *)prm; + char host[1024]; + int port = 12345, cfd; switch(evt){ case CUI_EVT_BUTTON: - if(obj == p->conn){ - cui_show(p->dlg); - cui_main(p->dlg, p->host); - cui_hide(p->dlg); - cui_draw(p->dlg->parent); - if(p->result){ - char *host = cui_etext_str_get(p->host); - int port = cui_num_get(p->port); - cfd = cui_conn_host_port(host, port); - client_add(p->tab, cfd); - } - }else if(obj == p->ok){ - p->result = TRUE; - cui_quit(); - }else if(obj == p->cancel){ - p->result = FALSE; - cui_quit(); - }else return FALSE; + 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); break; default: return FALSE; @@ -134,29 +121,6 @@ return TRUE; } -static void -conn_prm_new(cui conn, cui tab) -{ - cui obj = cui_alloc(sizeof(struct conn_prm)); - conn_prm p = (conn_prm)obj; - - p->conn = conn; - p->view = conn->parent; - p->tab = tab; - p->dlg = cui_panel_new(p->view, conn->x+1, cui_y2(conn), 0, 0); - cui_hide(p->dlg); - p->host = cui_etext_new(p->dlg, 1, 1, 12, "localhost"); - p->port = cui_num_new(p->dlg, p->host->x, cui_y2(p->host), 10, 12345, 0, 65535, 0); - p->ok = cui_button_new(p->dlg, p->port->x, cui_y2(p->port)+1, "OK"); - p->cancel = cui_button_new(p->dlg, cui_x2(p->ok)+1, p->ok->y, "Cancel"); - cui_wh_fit(p->dlg); - cui_wh_set(p->dlg, p->dlg->w+1, p->dlg->h+1); - - cui_bind(conn, CUI_EVT_BUTTON, conn_hdr, p); - cui_bind(p->ok, CUI_EVT_BUTTON, conn_hdr, p); - cui_bind(p->cancel, CUI_EVT_BUTTON, conn_hdr, p); -} - int main(int ac, char **av) { @@ -167,6 +131,7 @@ cui tab = cui_tab_new(view, cui_x2(conn) + 1, 0, 0, NULL, NULL, FALSE); char **av2 = av; int port, sfd; + struct conn_prm cprm = {view, conn, tab}; cui_bind(tab, CUI_EVT_READABLE, tab_hdr, NULL); while((port = cui_arg_int(av2, "-port", -1, &av2)) != -1){ @@ -174,8 +139,7 @@ cui_readable_add(tab, sfd); } cui_bind(view, CUI_EVT_DEAD | CUI_EVT_RESIZE, view_hdr, tab); - - conn_prm_new(conn, tab); + cui_bind(conn, CUI_EVT_BUTTON, conn_hdr, &cprm); cui_main(bs, NULL); cui_free(bs); diff -urN cui117/dialog.c cui118/dialog.c --- cui117/dialog.c 2014-01-31 22:20:00.000000000 +0900 +++ cui118/dialog.c 2014-04-18 00:00:00.000000000 +0900 @@ -1,6 +1,8 @@ #include "dialog.h" #include "button.h" #include "handler.h" +#include "etext.h" +#include "num.h" #include int @@ -38,4 +40,78 @@ return obj; } +static int +msg_hdr(cui obj, int evt, int val, void *prm) +{ + switch(evt){ + case CUI_EVT_BUTTON: + cui_quit(); + break; + default: + return FALSE; + } + return TRUE; +} + +void +cui_msg_dialog(cui parent, char *s) +{ + int n = strlen(s); + int x = (parent->w - (n+4)) / 2; + int y = (parent->h - 5) / 2; + cui panel = cui_panel_new(parent, x, y, n+4, 5); + cui view = cui_base_new(panel, 2, 1, n, 3); + cui ok; + + cui_label_new(view, 0, 0, s); + ok = cui_button_new(view, (n-4)/2, 2, "OK"); + cui_bind(ok, CUI_EVT_BUTTON, msg_hdr, NULL); + + cui_main(panel, ok); + cui_hide(panel); + cui_draw(parent); + cui_del_free(panel); +} + +static int +host_port_hdr(cui obj, int evt, int val, void *prm) +{ + int *ret = (int *)prm;; + switch(evt){ + case CUI_EVT_BUTTON: + *ret = (strcmp(cui_button_str_get(obj), "OK") == 0); + cui_quit(); + break; + default: + return FALSE; + } + return TRUE; +} + +int +cui_host_port_dialog(cui parent, int x, int y, char *host, int *port) +{ + int w = strlen("(OK)") + 1 + strlen("(Cancel)"); + cui panel = cui_panel_new(parent, x, y, w+2, 6); + cui view = cui_base_new(panel, 1, 1, w, 4); + cui etxt = cui_etext_new(view, 0, 0, view->w, host); + cui num = cui_num_new(view, 0, 1, view->w, *port, 0, 65535, 0); + cui ok = cui_button_new(view, 0, 3, "OK"); + 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_main(panel, etxt); + cui_hide(panel); + cui_draw(parent); + if(result){ + strcpy(host, cui_etext_str_get(etxt)); + *port = cui_num_get(num); + } + cui_del_free(panel); + return result; +} + /* EOF */ diff -urN cui117/dialog.h cui118/dialog.h --- cui117/dialog.h 2014-01-30 22:00:00.000000000 +0900 +++ cui118/dialog.h 2014-04-18 00:00:00.000000000 +0900 @@ -10,5 +10,7 @@ } *cui_simple_dialog; 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); #endif