diff -urN cui104/cui.c cui105/cui.c --- cui104/cui.c Tue Apr 8 23:00:00 2014 +++ cui105/cui.c Thu Apr 10 22:00:00 2014 @@ -9,6 +9,8 @@ #include "button.h" #include "timer.h" #include "list.h" +#include "menu.h" +#include "term.h" #include #include #include @@ -129,9 +131,8 @@ cui_esc_loc(cui_gx(obj) + x, cui_gy(obj) + y); if(attr & CUI_ATTR_ULINE) cui_esc_attr(CUI_ESC_ULINE); if(attr & CUI_ATTR_REVERSE) cui_esc_attr(CUI_ESC_REVERSE); - printf("%s", s); + cui_puts(s); if(attr != CUI_ATTR_NORMAL) cui_esc_attr(CUI_ESC_NORMAL); - fflush(stdout); if(s2) free(s2); } @@ -520,6 +521,105 @@ } } +static void +html_puts(char *s, void *prm) +{ + cui term = (cui)prm; + cui_term_puts_buf(term, s); +} + +static void +html_buf_flush(cui obj, int *attr, char *lp, int x, int y) +{ + cui_term p = (cui_term)obj; + char *s = p->lbuf, c; + + if(*attr == -1) return; + *lp = '\0'; + + if(*attr & CUI_ATTR_ULINE) cui_dbg(""); + if(*attr & CUI_ATTR_REVERSE) cui_dbg(""); + while((c = *s++) != '\0'){ + switch(c){ + case '&': cui_dbg("&"); break; + case '<': cui_dbg("<"); break; + case '>': cui_dbg(">"); break; + default: cui_dbg("%c", c); break; + } + } + if(*attr & CUI_ATTR_REVERSE) cui_dbg(""); + if(*attr & CUI_ATTR_ULINE) cui_dbg(""); + *attr = -1; +} + +static void +html_buf_out(cui obj) +{ + cui_term p = (cui_term)obj; + char *lp = p->lbuf; + int x, y, attr = -1, lx = 0; + + cui_dbg("
\n");
+	for(y=0; yh; y++){
+		for(x=0; xw; x++){
+			char *bp = cui_term_buf(obj, x, y);
+			if(attr != -1 && bp[1] != attr) html_buf_flush(obj, &attr, lp, lx, y);
+			if(attr == -1){
+				lp = p->lbuf;
+				*lp++ = bp[0] ? bp[0] : ' ';
+				attr = bp[1];
+				lx = x;
+				continue;
+			}
+			/* bp[1] == attr */
+			*lp++ = bp[0] ? bp[0] : ' ';
+			continue;
+			html_buf_flush(obj, &attr, lp, lx, y);
+		}
+		html_buf_flush(obj, &attr, lp, lx, y);
+		cui_dbg("\n");
+	}
+	cui_dbg("
\n"); +} + +static void +html(cui obj) +{ + cui term = cui_term_new(obj, 0, 0, cui_x2(obj)+2, cui_y2(obj)+2); + cui_hide(term); + + cui_puts_add(html_puts, term); + cui_draw(obj); + + cui_puts_del(html_puts); + + html_buf_out(term); + + cui_term_buf_free(term); + cui_del_free(term); +} + +static int +cmenu(cui obj, int key) +{ + cui mn; + char *lst[] = { "Cancel", "^C", "HTML", "Quit", NULL }, *s; + + if(key != CUI_KEY_CTRL('C')) return key; + + mn = cui_menu_popup_new(obj, 0, 1, -1, lst, 1); + cui_hide(mn); + cui_handler_call(mn, CUI_EVT_KEY, CUI_KEY_ENTER); + s = cui_menu_popup_str_get(mn); + cui_menu_popup_del_free(mn); + + if(strcmp(s, "^C") == 0) return 1; + else if(strcmp(s, "Quit") == 0) cui_quit(); + else if(strcmp(s, "HTML") == 0) html(obj); + /* else Cancel */ + return 0; +} + void cui_main(cui top_obj, cui init_focus) { @@ -548,6 +648,7 @@ cui_readable_work(); if(!cui_select_chk(KEY_FD)) continue; if((key = cui_key_get2()) == 0) continue; + if(cmenu(cui_root(top_obj), key) == 0) continue; focus = cui_focus_get(); if(focus){ if(cui_handler_call(focus, CUI_EVT_KEY, key)) continue; @@ -597,6 +698,54 @@ cui_free_chain(obj->children); cui_list_del_all(&obj->handler_list); free(obj); +} + +void +cui_del_free(cui obj) +{ + cui_del(obj); + cui_free(obj); +} + +typedef void (*puts_func)(char *, void *prm); + +typedef struct puts_data{ + puts_func f; + void *prm; +} *puts_data; + +static cui_list puts_list = NULL; + +void +cui_puts_add(puts_func f, void *prm) +{ + puts_data p = cui_list_add(&puts_list, sizeof(struct puts_data)); + p->f = f; + p->prm = prm; +} + +void +cui_puts_del(puts_func f) +{ + cui_list lp = puts_list; + for(; lp; lp=lp->next) if(*(puts_func *)lp->data == f) break; + if(lp == NULL) return; + cui_list_del(&puts_list, lp->data); +} + +void +cui_puts(char *s) +{ + cui_list lp = puts_list; + if(puts_list == NULL){ + printf("%s", s); + fflush(stdout); + return; + } + for(; lp; lp=lp->next){ + puts_data p = (puts_data)lp->data; + (*p->f)(s, p->prm); + } } /* EOF */ diff -urN cui104/cui.h cui105/cui.h --- cui104/cui.h Tue Apr 8 23:00:00 2014 +++ cui105/cui.h Thu Apr 10 22:00:00 2014 @@ -100,5 +100,11 @@ void cui_del(cui obj); void cui_free_chain(cui obj); void cui_free(cui obj); +void cui_del_free(cui obj); + +typedef void (*puts_func)(char *, void *prm); +void cui_puts_add(puts_func f, void *prm); +void cui_puts_del(puts_func f); +void cui_puts(char *s); #endif diff -urN cui104/cui_test.c cui105/cui_test.c --- cui104/cui_test.c Tue Apr 8 23:00:00 2014 +++ cui105/cui_test.c Thu Apr 10 22:00:00 2014 @@ -65,8 +65,7 @@ cui_unbind(obj, CUI_EVT_BUTTON, my_hdr); joke = joke_new(((cui)p)->parent->parent->parent, 0, 4); cui_main(joke, joke->children->next); - cui_del(joke); - cui_free(joke); + cui_del_free(joke); return TRUE; } @@ -235,8 +234,7 @@ cui_main(menu, cui_menu_str_to_item(menu, "Open")); cui_hide(menu); cui_draw(menu->parent); - cui_del(menu); - cui_free(menu); + cui_del_free(menu); if(strcmp(cui_label_str_get((cui)prm), "Quit") == 0) cui_quit(); return TRUE; diff -urN cui104/esc.c cui105/esc.c --- cui104/esc.c Fri Jan 31 01:10:00 2014 +++ cui105/esc.c Thu Apr 10 22:00:00 2014 @@ -1,12 +1,13 @@ #include "esc.h" - +#include "cui.h" #include void cui_esc(char *s) { - printf("\033[%s", s); - fflush(stdout); + char buf[1024]; + sprintf(buf, "\033[%s", s); + cui_puts(buf); } void diff -urN cui104/etext.c cui105/etext.c --- cui104/etext.c Sun Feb 2 22:30:00 2014 +++ cui105/etext.c Thu Apr 10 22:00:00 2014 @@ -140,8 +140,7 @@ cui_bind(pm, CUI_EVT_BUTTON, cui_etext_hist_menu_hdr, p); cui_hide(pm); cui_handler_call(pm, CUI_EVT_KEY, CUI_KEY_ENTER); - cui_del(pm); - cui_free(pm); + cui_menu_popup_del_free(pm); } int @@ -168,8 +167,7 @@ cui_bind(pm, CUI_EVT_BUTTON, cui_etext_digit_menu_hdr, p); cui_hide(pm); cui_handler_call(pm, CUI_EVT_KEY, CUI_KEY_ENTER); - cui_del(pm); - cui_free(pm); + cui_menu_popup_del_free(pm); } void diff -urN cui104/menu.c cui105/menu.c --- cui104/menu.c Tue Apr 8 23:00:00 2014 +++ cui105/menu.c Thu Apr 10 22:00:00 2014 @@ -238,6 +238,14 @@ cui_menu_item_str_set(obj, s); } +void +cui_menu_popup_del_free(cui obj) +{ + cui_menu_popup p = (cui_menu_popup)obj; + cui_del_free(p->menu); + cui_del_free(obj); +} + cui cui_menu_int_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v) { diff -urN cui104/menu.h cui105/menu.h --- cui104/menu.h Tue Apr 8 23:00:00 2014 +++ cui105/menu.h Thu Apr 10 22:00:00 2014 @@ -48,6 +48,7 @@ char *cui_menu_popup_str_get(cui obj); int cui_menu_popup_get(cui obj); void cui_menu_popup_set(cui obj, int idx); +void cui_menu_popup_del_free(cui obj); cui cui_menu_int_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v); void cui_menu_int_init(cui obj, cui parent, int x, int y, int w, int init_v, int min_v, int max_v);