diff -urN cui113/Makefile cui114/Makefile --- cui113/Makefile Sat Apr 12 23:00:00 2014 +++ cui114/Makefile Wed Apr 16 00:00:00 2014 @@ -6,7 +6,7 @@ LFLAGS += -lutil endif -TARG = cui_test +TARG = cui_test cui_srv OBJS = cui.o select.o focus.o num.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o dbg.o list.o all: $(TARG) @@ -23,7 +23,11 @@ lib: libcui.a libcui.a: $(OBJS) + rm -f $@ ar cq $@ $(OBJS) + +cui_srv: cui_srv.o libcui.a + $(CC) -o $@ cui_srv.o -L. -lcui $(LFLAGS) clean: rm -f $(TARG) *.o *.a *~ diff -urN cui113/cui.c cui114/cui.c --- cui113/cui.c Tue Apr 15 23:00:00 2014 +++ cui114/cui.c Wed Apr 16 00:00:00 2014 @@ -65,12 +65,10 @@ return fd; } -static int sfd = -1; - -static void -srv(char *s) +int +cui_srv_port(int port) { - int port = strtol(s, NULL, 0); + int sfd; struct sockaddr_in saddr; if((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) ERR("socket"); @@ -80,20 +78,31 @@ saddr.sin_port = htons(port); if(bind(sfd, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) ERR("bind"); if(listen(sfd, 5) == -1) ERR("listen"); + return sfd; } -static void -srv_accept(cui obj) +int +cui_srv_accept(int sfd) { struct sockaddr_in caddr; socklen_t clen = sizeof(caddr); int cfd; - if(sfd == -1 || !cui_select_chk(sfd)) return; - memset(&caddr, 0, clen); if((cfd = accept(sfd, (struct sockaddr *)&caddr, &clen)) == -1) ERR("accept"); + return cfd; +} + +static int sfd = -1; + +static void +srv_accept(cui obj) +{ + int cfd; + + if(sfd == -1 || !cui_select_chk(sfd)) return; + cfd = cui_srv_accept(sfd); cui_key_fd_add(cfd); cui_puts_temp_fd_enter(cfd); cui_esc_enter(); @@ -129,7 +138,7 @@ } if((i = arg_idx(ac, av, "-srv")) > 0){ if(i+1 >= ac) ERR("-srv port"); - srv(av[i+1]); + sfd = cui_srv_port(strtol(av[i+1], NULL, 0)); cui_select_add(sfd); use_stdio = arg_idx(ac, av, "-stdio") > 0; } diff -urN cui113/cui.h cui114/cui.h --- cui113/cui.h Tue Apr 15 23:00:00 2014 +++ cui114/cui.h Wed Apr 16 00:00:00 2014 @@ -48,6 +48,9 @@ void cui_fini(int init_ret); int cui_conn(char *s); +int cui_srv_port(int port); +int cui_srv_accept(int sfd); + 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 cui113/cui_srv.c cui114/cui_srv.c --- cui113/cui_srv.c Thu Jan 1 09:00:00 1970 +++ cui114/cui_srv.c Wed Apr 16 00:00:00 2014 @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cui.h" +#include "scpanel.h" +#include "tab.h" +#include "term.h" +#include "handler.h" + +static int +arg_idx(int ac, char **av, char *targ) +{ + int i; + + for(i=1; i 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); + if((cp = getenv("COLUMNS")) != NULL) return strtol(cp, NULL, 0); + return 60; +} + +static int +h_get(int ac, char **av) +{ + int i; + char *cp; + + if((i = arg_idx(ac, av, "-h")) > 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); + if((cp = getenv("LINES")) != NULL) return strtol(cp, NULL, 0); + return 20; +} + +static int +port_get(int ac, char **av) +{ + int i; + + if((i = arg_idx(ac, av, "-port")) > 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); + ERR("-port port"); +} + +static void +srv_accept(cui obj, int sfd) +{ + cui view = obj->parent; + int y = cui_y2(obj); + cui termin; + static int cnt = 0; + char buf[16]; + int cfd = cui_srv_accept(sfd); + + termin = cui_termin_new(view, 0, y, view->w, view->h - y, cfd); + sprintf(buf, "%d", cnt++); + cui_tab_add(obj, strdup(buf), termin, TRUE); +} + +static int +tab_hdr(cui obj, int evt, int val, void *prm) +{ + switch(evt){ + case CUI_EVT_READABLE: + srv_accept(obj, *(int *)prm); + break; + default: + return FALSE; + } + return TRUE; +} + +static int +view_hdr(cui obj, int evt, int val, void *prm) +{ + cui tab = (cui)prm; + cui termin, tab_btn; + + switch(evt){ + case CUI_EVT_DEAD: + termin = cui_index_to_child(obj, val); + cui_tab_del(tab, termin); + cui_termin_del_free(termin); + break; + case CUI_EVT_RESIZE: + for(tab_btn=tab->children; tab_btn; tab_btn=tab_btn->next){ + termin = cui_tab_btn_sheet_get(tab_btn); + cui_wh_set(termin, obj->w, obj->h - termin->y); + } + break; + default: + return FALSE; + } + return TRUE; +} + +int +main(int ac, char **av) +{ + int port = port_get(ac, av); + int sfd = cui_srv_port(port); + + int init_ret = cui_init(ac, av); + cui bs = cui_scpanel_new(NULL, 0, 0, w_get(ac, av), h_get(ac, av), "cui_srv"); + cui view = ((cui_scpanel)bs)->view; + cui tab = cui_tab_new(view, 0, 0, 0, NULL, NULL, FALSE); + + cui_readable_add_bind(tab, sfd, tab_hdr, &sfd); + cui_bind(view, CUI_EVT_DEAD | CUI_EVT_RESIZE, view_hdr, tab); + + cui_main(bs, NULL); + cui_free(bs); + cui_fini(init_ret); + + close(sfd); + return 0; +} + +/* EOF */ diff -urN cui113/term.c cui114/term.c --- cui113/term.c Tue Apr 15 23:00:00 2014 +++ cui114/term.c Wed Apr 16 00:00:00 2014 @@ -448,11 +448,19 @@ p->sock = sock; p->in_key_mode = FALSE; - cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_READABLE, cui_termin_hdr, NULL); + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_RESIZE | CUI_EVT_READABLE, cui_termin_hdr, NULL); cui_readable_add(obj, p->sock); } +static void +termin_dead(cui obj) +{ + cui_termin p = (cui_termin)obj; + cui_readable_del(obj, p->sock); + cui_handler_call(obj->parent, CUI_EVT_DEAD, cui_index(obj)); +} + int cui_termin_hdr(cui obj, int evt, int val, void *prm) { @@ -466,7 +474,7 @@ break; case CUI_EVT_KEY: if(p->in_key_mode){ - if(write(p->sock, &val, 1) != 1) ERR("write"); + if(write(p->sock, &val, 1) != 1) termin_dead(obj); }else{ if(val != CUI_KEY_ENTER) return FALSE; p->in_key_mode = TRUE; @@ -475,10 +483,20 @@ cui_draw(obj); } break; + case CUI_EVT_RESIZE: + cui_wh_set(p->term, obj->w, obj->h); + + cui_w_set(p->fill[0], obj->w); + cui_w_set(p->fill[1], obj->w); + cui_h_set(p->fill[2], obj->h-2); + cui_h_set(p->fill[3], obj->h-2); + cui_y_set(p->fill[1], obj->h-1); + cui_x_set(p->fill[3], obj->w-1); + 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; + termin_dead(obj); + break; } buf[n] = '\0'; cui_term_puts(p->term, buf); @@ -489,6 +507,14 @@ return TRUE; } +void +cui_termin_del_free(cui obj) +{ + cui_termin p = (cui_termin)obj; + cui_term_buf_free(p->term); + cui_del_free(obj); +} + /**/ #define TIMEOUT_MSEC (3*1000) @@ -651,6 +677,14 @@ return TRUE; } return FALSE; +} + +void +cui_terminal_del_free(cui obj) +{ + cui_terminal p = (cui_terminal)obj; + cui_term_buf_free(p->term); + cui_del_free(obj); } /* EOF */ diff -urN cui113/term.h cui114/term.h --- cui113/term.h Tue Apr 15 22:00:00 2014 +++ cui114/term.h Wed Apr 16 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_del_free(cui obj); /**/ @@ -66,5 +67,6 @@ void cui_terminal_init(cui obj, cui parent, int x, int y, int w, int h); int cui_terminal_hdr(cui obj, int evt, int val, void *prm); void cui_terminal_in_key_mode_set(cui obj, int in_key_mode); +void cui_terminal_del_free(cui obj); #endif