diff -urN cui86/Makefile cui87/Makefile --- cui86/Makefile Sun Mar 30 22:00:00 2014 +++ cui87/Makefile Mon Mar 31 00:00:00 2014 @@ -1,4 +1,10 @@ -CC = gcc -Wall +OS=${shell uname} +CC = gcc +CFLAGS = -Wall + +ifeq ($(OS), FreeBSD) # use gmake +LFLAGS += -lutil +endif TARG = cui_test OBJS = cui.o focus.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 @@ -12,7 +18,7 @@ $(CC) -o $@ esc_test.o esc.o cui_test: cui_test.o $(OBJS) - $(CC) -o $@ cui_test.o $(OBJS) + $(CC) -o $@ cui_test.o $(OBJS) $(LFLAGS) clean: rm -f $(TARG) *.o *~ diff -urN cui86/cui_test.c cui87/cui_test.c --- cui86/cui_test.c Sun Mar 30 22:00:00 2014 +++ cui87/cui_test.c Mon Mar 31 00:00:00 2014 @@ -305,88 +305,6 @@ } int -btn_term_hdr(cui obj, int evt, int val, void *prm) -{ - /* CUI_EVT_BUTTON */ - - cui term = ((cui_terminal)prm)->term; - int i, n, x, y; - char buf[1024]; - static int cnt = 0; - FILE *fp; - - n = cnt / 20; - if(n <= 4){ - switch(n){ - case 1: - cui_term_puts(term, "\033[4m"); - break; - case 2: - cui_term_puts(term, "\033[7m"); - break; - case 3: - cui_term_puts(term, "\033[24m"); - break; - case 4: - cui_term_puts(term, "\033[27m"); - break; - } - for(i=0; i<20; i++){ - sprintf(buf, "%d\n", cnt++); - cui_term_puts(term, buf); - } - return TRUE; - } - switch(n){ - case 5: - cui_term_puts(term, "Hello World\n"); - cui_term_puts(term, "\tfoo\tbar"); - cnt += 20; - break; - case 6: - cui_term_puts(term, "\n\033[4mULINE\t\033[0mhoge\t\033[7mREVERSE\033[0m\n"); - cnt += 20; - break; - case 7: - if((fp = fopen("cui.h", "r")) == NULL) return TRUE; - while(fgets(buf, 1024, fp)){ - cui_term_puts(term, buf); - usleep(50*1000); - } - fclose(fp); - cnt += 20; - break; - default: - cui_term_puts(term, "\033[?25l"); - for(i=0; i<100; i++, cnt++){ - x = abs(cnt % (term->w * 2 - 2) - (term->w - 1)); - y = abs(cnt % (term->h * 2 - 2) - (term->h - 1)); - sprintf(buf, "\033[%d;%dH", y+1, x+1); - cui_term_puts(term, buf); - - if(cnt % 10 == 0){ - int lst[] = {0, 4, 7, 24, 27}; - sprintf(buf, "\033[%dm", lst[(cnt/10)%5]); - cui_term_puts(term, buf); - } - cui_term_putc(term, ' ' + cnt % (0x7e - ' ')); - usleep(10*1000); - } - break; - } - return TRUE; -} - -int -bs_term_hdr(cui obj, int evt, int val, void *prm) -{ - /* CUI_EVT_RESIZE */ - cui term = (cui)prm; - cui_wh_set(term, obj->w, obj->h-2); - return TRUE; -} - -int lb_timer_hdr(cui obj, int evt, int val, void *prm) { /* CUI_EVT_TIMER */ @@ -420,10 +338,7 @@ cui sc3 = cui_scbar_new(bs_bar, cui_x2(sc)+2, sc->y, 1, 16, 4, 2); cui sc_hoge = cui_scpanel_new(bs, 1, 2, 30, 15, NULL); cui in_hoge = cui_scpanel_sheet_get(sc_hoge); - cui bs_term = cui_base_new(bs, 1, 2, 0, 0); - cui btn_term = cui_button_new(bs_term, 0, 1, "test"); - //cui term = cui_term_new(bs_term, 0, 2, 30, 15); - cui term = cui_terminal_new(bs_term, 0, 2, 30, 15); + cui bs_term = cui_base_new(bs, 1, 2, 100, 100); cui bs_timer = cui_base_new(bs, 1, 2, 0, 0); cui lb_timer1 = cui_label_new(bs_timer, 0, 1, "0 "); cui lb_timer2 = cui_label_new(bs_timer, 10, 1, "not yet"); @@ -469,10 +384,7 @@ cui_hide(sc_hoge); cui_hide(bs_term); - cui_bind(btn_term, CUI_EVT_BUTTON, btn_term_hdr, term); - cui_wh_fit(bs_term); - cui_rszbox_new(bs_term); - cui_bind(bs_term, CUI_EVT_RESIZE, bs_term_hdr, term); + cui_terminal_new(bs_term, 0, 1, 30, 15); cui_hide(bs_timer); cui_wh_fit(bs_timer); diff -urN cui86/term.c cui87/term.c --- cui86/term.c Sun Mar 30 23:00:00 2014 +++ cui87/term.c Mon Mar 31 00:00:00 2014 @@ -13,6 +13,10 @@ #include #include +#ifdef __FreeBSD__ +#include +#endif + #define UPDATE_FLG (1<<7) cui @@ -64,18 +68,18 @@ for(y=0; yh; y++){ for(x=0; xw; x++){ char *bp = cui_term_buf(obj, x, y); - if(bp[0] && (p->update_all || (bp[1] & UPDATE_FLG))){ + if(p->update_all || (bp[1] & UPDATE_FLG)){ if(attr != -1 && bp[1] != attr) hdr_update_flush(obj, &attr, lp, lx, y); if(attr == -1){ lp = p->lbuf; - *lp++ = bp[0]; + *lp++ = bp[0] ? bp[0] : ' '; attr = bp[1]; lx = x; bp[1] &= ~UPDATE_FLG; continue; } /* bp[1] == attr */ - *lp++ = bp[0]; + *lp++ = bp[0] ? bp[0] : ' '; bp[1] &= ~UPDATE_FLG; continue; } @@ -373,6 +377,7 @@ cui_term_move(cui obj, int cx, int cy) { cui_term p = (cui_term)obj; + if(p->cursor_onoff) cui_term_buf(obj, p->cx, p->cy)[1] |= UPDATE_FLG; p->cx = cx; p->cy = cy; } @@ -390,8 +395,12 @@ static int boot_sh(cui obj) { - int master, slave; - int ret; + int ret, master; +#if defined(__FreeBSD__) + if((ret = forkpty(&master, NULL, NULL, NULL)) < 0) ERR("forkpy"); + if(ret != 0) return master; /* parent */ +#else /* defined(__linux__) */ + int slave; char *name; if((master = posix_openpt(O_RDWR)) < 0) ERR("posix_openpt"); @@ -407,6 +416,7 @@ dup2(slave, 0); dup2(slave, 1); dup2(slave, 2); +#endif execl("/bin/sh", "/bin/sh", "-i", (char *)NULL); exit(0); return 0; /* not reach */ @@ -484,7 +494,6 @@ } /* in_key_mode */ if(val == CUI_KEY_ENTER) val = '\n'; - cui_term_putc(p->term, val); if(write(p->pipe_w, &val, 1) != 1) ERR("write"); cui_timer_set(obj, TIMEOUT_MSEC, TRUE); return TRUE;