--- uae/src/svgancui.c 2018/04/24 16:38:39 1.1.1.1 +++ uae/src/svgancui.c 2018/04/24 16:39:07 1.1.1.2 @@ -13,10 +13,16 @@ #include "sysconfig.h" #include "sysdeps.h" +#ifdef HAVE_NCURSES_H #include +#else +#include +#endif +#include #include "config.h" #include "options.h" +#include "uae.h" #include "tui.h" static WINDOW *currwin; @@ -61,7 +67,12 @@ void tui_shutdown(void) void tui_refresh(void) { - wrefresh(currwin); + int w; + for (w = 0; w < winnr; w++) { + touchwin(winstack[w]); + wnoutrefresh(winstack[w]); + } + doupdate(); } void tui_puts(const char *s) @@ -105,7 +116,7 @@ void tui_selwin(int w) void tui_clrwin(int w) { - wclear(winstack[w]); + werase(winstack[w]); } void tui_drawbox(int w) @@ -143,21 +154,28 @@ int tui_gets(char *buf, int x, int y, in { int i = 0; for (;;) { - int c = getch(); - int j; + int c, j; + + buf[i] = 0; wmove(currwin, y, x); for (j = 0; j < i; j++) waddch(currwin, buf[j]); for (; j < n; j++) waddch(currwin, ' '); + wmove(currwin, y, x + i); wrefresh(currwin); - buf[i] = 0; + + c = getch(); + + wmove(currwin, y, x + i); if (c == 13) return 1; else if (c == 27) return 0; - else if (i + 1 < n) + else if (i > 0 && c == KEY_BACKSPACE) + i--; + else if (i + 1 < n && !iscntrl(c)) buf[i++] = c; } } @@ -165,14 +183,135 @@ int tui_gets(char *buf, int x, int y, in int tui_wgets(char *buf, const char *title, int n) { int l = strlen(title); - int ww = l > n ? l : n; - int w = tui_dlog((tui_cols()-ww-2)/2, tui_lines()/2-1, (tui_cols()+ww+2)/2, tui_lines()/2+1); + int ww = (l > n ? l : n) + 2; + int w = tui_dlog((tui_cols()-ww)/2, tui_lines()/2-1, (tui_cols()+ww)/2, tui_lines()/2+1); + int result; + tui_selwin(w); tui_drawbox(w); wmove(currwin, 0, (ww-l)/2); waddstr(currwin, title); - return tui_gets(buf, 1, 1, n); + result = tui_gets(buf, 1, 1, n); + tui_dlogdie(w); + return result; } +int tui_menubrowse(struct bstring *menu, int xoff, int yoff, int selected) +{ + int count = 0, maxsel = 0, maxw = 0; + int i, j, w; + + const char *mtitle = NULL; + + for (i = 0; menu[i].val != -3; i++) { + int tmp; + if (menu[i].val != 0) { + count++; + if (menu[i].val != -2) + maxsel++; + } else + mtitle = menu[i].data; + if ((tmp = strlen(menu[i].data)) > maxw) + maxw = tmp; + } + maxw += 3; + w = tui_dlog(xoff, yoff, xoff+maxw, yoff+count+1); + tui_selwin(w); + tui_drawbox(w); + if (mtitle != NULL) { + wmove(currwin, 0, 1); + waddstr(currwin, mtitle); + } + + for (;;) { + int c; + int s2; + + for (i = j = s2 = 0; i < count; i++, j++) { + int k, x; + attr_t a = s2 == selected ? A_STANDOUT : 0; + + while (menu[j].val == 0) + j++; + wmove(currwin, 1+i, 1); + waddch(currwin, ' ' | a); + for (k = x = 0; menu[j].data[k]; k++, x++) { + int a2 = 0; + c = menu[j].data[k]; + if (c == '_') + c = menu[j].data[++k], a2 = A_UNDERLINE; + wmove(currwin, 1+i, 2+x); + waddch(currwin, c | a | a2); + } + for (; x < maxw-2; x++) { + wmove(currwin, 1+i, 2+x); + waddch(currwin, ' ' | a); + } + if (menu[j].val != -1) + s2++; + } + + tui_refresh(); + c = getch(); + if (c == 27) { + tui_dlogdie(w); + return -1; + } else if (c == KEY_ENTER || c == 13 || c == ' ') { + tui_dlogdie(w); + return selected; + } else switch (c) { + case KEY_UP: + if (selected > 0) + selected--; + break; + case KEY_DOWN: + if (selected + 1 < count) + selected++; + break; + case KEY_PPAGE: + selected = 0; + break; + case KEY_NPAGE: + selected = count - 1; + break; + default: + for (j = i = 0; menu[i].val != -3; i++) + if (menu[i].val == toupper(c)) { + tui_dlogdie(w); + return j; + } else if (menu[i].val == -1 || menu[i].val > 0) { + j++; + } + + break; + } + } + return -1; /* Can't get here */ +} + +void tui_errorbox(const char *err) +{ + const char *hak = "Hit any key"; + int n = strlen(hak); + int l = strlen(err); + int ww = (l > n ? l : n) + 2; + int w = tui_dlog((tui_cols()-ww)/2, tui_lines()/2-1, (tui_cols()+ww)/2, tui_lines()/2+1); + tui_selwin(w); tui_drawbox(w); + + wmove(currwin, 0, (ww-6)/2); + waddstr(currwin, "Error!"); + wmove(currwin, 1, (ww-l)/2); + waddstr(currwin, err); + wmove(currwin, 2, (ww-n)/2); + waddstr(currwin, hak); + + wrefresh(currwin); + for (;;) { + int c = getch(); + if (c == 13) + break; + } + tui_dlogdie(w); +} static char *pattern; static int maxlen;