diff -urN cui107/Makefile cui108/Makefile --- cui107/Makefile Sun Apr 6 23:00:00 2014 +++ cui108/Makefile Sat Apr 12 23:00:00 2014 @@ -7,7 +7,7 @@ endif TARG = cui_test -OBJS = cui.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 +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) diff -urN cui107/cui.c cui108/cui.c --- cui107/cui.c Fri Apr 11 02:00:00 2014 +++ cui108/cui.c Sat Apr 12 23:00:00 2014 @@ -1,4 +1,5 @@ #include "cui.h" +#include "select.h" #include "focus.h" #include "rect.h" #include "esc.h" @@ -18,6 +19,84 @@ #include #include +/* --> for socket */ +#include +#include +#include +#include +#include +/* <-- for socket */ + +#define KEY_FD 0 +static int use_stdio = TRUE; + +static int +arg_idx(int ac, char **av, char *targ) +{ + int i; + + for(i=1; i 0 && s[i]){ + memcpy(name, s, i); + name[i] = '\0'; + }else strcpy(name, "localhost"); + i = s[i] ? i + 1 : 0; + port = strtol(s+i, NULL, 0); + + if((hp = gethostbyname(name)) == NULL) ERR("gethostbyname"); + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); + if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) ERR("socket"); + if(connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) ERR("connect"); + return fd; +} + +int +cui_init(int ac, char **av) +{ + int i; + + cui_dbg_open(ac, av); + cui_select_init(); + 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])); + use_stdio = arg_idx(ac, av, "-stdio") > 0; + } + if(use_stdio){ + cui_key_fd_add(KEY_FD); + cui_key_enter(); + } + cui_esc_enter(); + return 0; +} + +void +cui_fini(int init_ret) +{ + cui_esc_exit(); + cui_key_fd_close(); /* without KEY_FD (0) */ + if(use_stdio){ + cui_key_exit(); + } + cui_dbg_close(); +} + typedef struct cui_main_stack *cui_main_stack; struct cui_main_stack{ @@ -416,50 +495,6 @@ cui_running_set(FALSE); } -#define KEY_FD 0 - -static fd_set sel_rfs, res_rfs; -static int sel_inited = FALSE; - -void -cui_select_init(void) -{ - FD_ZERO(&sel_rfs); - FD_SET(KEY_FD, &sel_rfs); - sel_inited = TRUE; -} - -void -cui_select_add(int fd) -{ - FD_SET(fd, &sel_rfs); -} - -void -cui_select_del(int fd) -{ - FD_CLR(fd, &sel_rfs); -} - -int -cui_select(void) -{ - int nfds = 0, fd; - struct timeval tm; - - res_rfs = sel_rfs; - for(fd=0; fd nfds) nfds = fd; - tm.tv_sec = 0; - tm.tv_usec = 100*1000; - return select(nfds+1, &res_rfs, NULL, NULL, &tm); -} - -int -cui_select_chk(int fd) -{ - return FD_ISSET(fd, &res_rfs); -} - typedef struct cui_readable{ cui obj; int fd; @@ -467,24 +502,13 @@ static cui_list readable_list = NULL; -static void -cui_readable_select_setup(void) -{ - cui_list lp = readable_list; - cui_select_init(); - for(; lp; lp=lp->next){ - cui_readable p = (cui_readable)lp->data; - cui_select_add(p->fd); - } -} - void cui_readable_add(cui obj, int fd) { cui_readable p = cui_list_add(&readable_list, sizeof(struct cui_readable)); p->obj = obj; p->fd = fd; - cui_readable_select_setup(); + cui_select_add(fd); } void @@ -498,7 +522,7 @@ } if(lp == NULL) return; cui_list_del(&readable_list, p); - cui_readable_select_setup(); + cui_select_del(fd); } void @@ -615,8 +639,10 @@ if(strcmp(s, "^C") == 0) return 1; else if(strcmp(s, "Quit") == 0) cui_quit(); - else if(strcmp(s, "Redraw") == 0) cui_draw(obj); - else if(strcmp(s, "HTML") == 0) html(cui_root(obj)); + else if(strcmp(s, "Redraw") == 0){ + cui_clear(obj); + cui_draw(obj); + }else if(strcmp(s, "HTML") == 0) html(cui_root(obj)); /* else Cancel */ return 0; } @@ -635,19 +661,13 @@ sp->prev = main_stack; main_stack = sp; - cui_esc_enter(); - cui_key_enter(); - cui_clear(top_obj); cui_draw(top_obj); - if(!sel_inited) cui_select_init(); - while(cui_running_get()){ cui_timer_work(); - if(cui_select() <= 0) continue; + if(cui_select(100*1000) <= 0) continue; cui_readable_work(); - if(!cui_select_chk(KEY_FD)) continue; if((key = cui_key_get2()) == 0) continue; if(cmenu(top_obj, key) == 0) continue; focus = cui_focus_get(); @@ -661,9 +681,6 @@ cui_draw(obj); } } - cui_key_exit(); - cui_esc_exit(); - main_stack = sp->prev; } @@ -737,8 +754,11 @@ { cui_list lp = puts_list; if(puts_list == NULL){ - printf("%s", s); - fflush(stdout); + int fd, n = strlen(s); + for(fd=0; fdnext){ diff -urN cui107/cui.h cui108/cui.h --- cui107/cui.h Thu Apr 10 22:00:00 2014 +++ cui108/cui.h Sat Apr 12 23:00:00 2014 @@ -43,6 +43,9 @@ extern cui_rect cui_clip; +int cui_init(int ac, char **av); +void cui_fini(int init_ret); + 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 cui107/cui_test.c cui108/cui_test.c --- cui107/cui_test.c Fri Apr 11 00:00:00 2014 +++ cui108/cui_test.c Sat Apr 12 23:00:00 2014 @@ -381,7 +381,7 @@ int main(int ac, char **av) { - int dbg_ret = cui_dbg_open(ac, av); + int init_ret = cui_init(ac, av); cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); cui bs_view = ((cui_scpanel)bs)->view; cui bs_bar = cui_base_new(bs_view, 0, 1, 0, 0); @@ -473,7 +473,7 @@ cui_main(bs, NULL); printf("result %s\n", p->btn_result); cui_free(bs); - if(dbg_ret == 0) cui_dbg_close(); + cui_fini(init_ret); return 0; } diff -urN cui107/dbg.c cui108/dbg.c --- cui107/dbg.c Tue Apr 1 22:00:00 2014 +++ cui108/dbg.c Sat Apr 12 23:00:00 2014 @@ -7,25 +7,24 @@ static FILE *fp = NULL; int cui_dbg_enable = 1; -int +void cui_dbg_open(int ac, char **av) { char buf[1024]; int i; char *nc_opt = "localhost 12345"; - if(fp) return 0; + if(fp) return; for(i=1; i= ac) return 0; + if(i >= ac) return; if(i+1 < ac) nc_opt = av[i+1]; sprintf(buf, "nc %s", nc_opt); - if((fp = popen(buf, "w")) == NULL) return -1; - return 0; + if((fp = popen(buf, "w")) == NULL) perror("popen"); } void diff -urN cui107/dbg.h cui108/dbg.h --- cui107/dbg.h Mon Mar 31 01:00:00 2014 +++ cui108/dbg.h Sat Apr 12 23:00:00 2014 @@ -5,7 +5,7 @@ extern int cui_dbg_enable; -int cui_dbg_open(int ac, char **av); +void cui_dbg_open(int ac, char **av); void cui_dbg_close(void); void cui_dbg(char *fmt, ...); diff -urN cui107/key.c cui108/key.c --- cui107/key.c Sat Apr 12 22:00:00 2014 +++ cui108/key.c Sat Apr 12 23:00:00 2014 @@ -1,5 +1,5 @@ #include "key.h" - +#include "select.h" #include #include #include @@ -9,15 +9,20 @@ #define KEY_FD 0 -int cui_key_cnt = 0; static struct termios bak; +fd_set cui_key_fds; + +void +cui_key_init(void) +{ + FD_ZERO(&cui_key_fds); +} void cui_key_enter(void) { struct termios raw; - if(cui_key_cnt++ > 0) return; tcgetattr(KEY_FD, &bak); cfmakeraw(&raw); raw.c_lflag &= ~FLUSHO; @@ -27,21 +32,27 @@ void cui_key_exit(void) { - if(--cui_key_cnt > 0) return; tcsetattr(KEY_FD, TCSANOW, &bak); } -static int -readable_chk(int fd) +void +cui_key_fd_add(int fd) { - fd_set rfs; - struct timeval tm; + FD_SET(fd, &cui_key_fds); + cui_select_add(fd); +} + +void +cui_key_fd_del(int fd) +{ + FD_CLR(fd, &cui_key_fds); + cui_select_del(fd); +} - FD_ZERO(&rfs); - FD_SET(fd, &rfs); - tm.tv_sec = 0; - tm.tv_usec = 100*1000; - return select(fd+1, &rfs, NULL, NULL, &tm) > 0; +int +cui_key_fd_chk(int fd) +{ + return FD_ISSET(fd, &cui_key_fds); } int @@ -49,22 +60,50 @@ { unsigned char uc; - if(!readable_chk(KEY_FD)) return 0; + if(!cui_select_readable_chk(KEY_FD, 100*1000)) return 0; if(read(KEY_FD, &uc, 1) != 1) return 0; return uc; } +void +cui_key_fd_close(void) /* without KEY_FD (0) */ +{ + int fd; + for(fd=1; fd= FD_SETSIZE) return 0; + + k = key_get(fd); if(k == 0x7f) return CUI_KEY_BS; if(k == CUI_KEY_ESC){ - k2 = cui_key_get(); + k2 = key_get(fd); if(k2 == '['){ - k3 = cui_key_get(); + k3 = key_get(fd); switch(k3){ case 'A': return CUI_KEY_UP; case 'B': return CUI_KEY_DOWN; diff -urN cui107/key.h cui108/key.h --- cui107/key.h Thu Apr 3 23:00:00 2014 +++ cui108/key.h Sat Apr 12 23:00:00 2014 @@ -1,6 +1,9 @@ #ifndef __KEY_H__ #define __KEY_H__ +#include /* for fd_set */ +#include + #define CUI_KEY_ENTER 0x0d /* '\r' */ #define CUI_KEY_BS 0x08 /* '\b' */ #define CUI_KEY_CTRL(c) (0x01+(c)-'A') @@ -10,8 +13,16 @@ #define CUI_KEY_RIGHT CUI_KEY_CTRL('F') #define CUI_KEY_ESC 0x1b +void cui_key_init(void); void cui_key_enter(void); void cui_key_exit(void); + +extern fd_set cui_key_fds; +void cui_key_fd_add(int fd); +void cui_key_fd_del(int fd); +int cui_key_fd_chk(int fd); +void cui_key_fd_close(void); /* without KEY_FD (0) */ + int cui_key_get(void); int cui_key_get2(void); diff -urN cui107/select.c cui108/select.c --- cui107/select.c Thu Jan 1 09:00:00 1970 +++ cui108/select.c Sat Apr 12 23:00:00 2014 @@ -0,0 +1,60 @@ +#include "select.h" +#include +#include +#include +#include +#include + +static fd_set sel_rfs, res_rfs; + +void +cui_select_init(void) +{ + FD_ZERO(&sel_rfs); +} + +void +cui_select_add(int fd) +{ + FD_SET(fd, &sel_rfs); +} + +void +cui_select_del(int fd) +{ + FD_CLR(fd, &sel_rfs); +} + +int +cui_select(int usec) +{ + int nfds = 0, fd; + struct timeval tm; + + res_rfs = sel_rfs; + for(fd=0; fd nfds) nfds = fd; + tm.tv_sec = 0; + tm.tv_usec = usec; + return select(nfds+1, &res_rfs, NULL, NULL, &tm); +} + +int +cui_select_chk(int fd) +{ + return FD_ISSET(fd, &res_rfs); +} + +int +cui_select_readable_chk(int fd, int usec) +{ + fd_set rfs; + struct timeval tm; + + FD_ZERO(&rfs); + FD_SET(fd, &rfs); + tm.tv_sec = 0; + tm.tv_usec = usec; + return select(fd+1, &rfs, NULL, NULL, &tm) > 0; +} + +/* EOF */ diff -urN cui107/select.h cui108/select.h --- cui107/select.h Thu Jan 1 09:00:00 1970 +++ cui108/select.h Sat Apr 12 23:00:00 2014 @@ -0,0 +1,12 @@ +#ifndef __SELECT_H__ +#define __SELECT_H__ + +void cui_select_init(void); +void cui_select_add(int fd); +void cui_select_del(int fd); +int cui_select(int usec); +int cui_select_chk(int fd); + +int cui_select_readable_chk(int fd, int usec); + +#endif diff -urN cui107/term.c cui108/term.c --- cui107/term.c Thu Apr 3 23:00:00 2014 +++ cui108/term.c Sat Apr 12 23:00:00 2014 @@ -477,6 +477,7 @@ dup2(slave, 1); dup2(slave, 2); #endif + cui_key_fd_close(); cui_dbg_close(); execl("/bin/sh", "/bin/sh", "-i", (char *)NULL); exit(0);