Annotation of uae/src/svgancui.c, revision 1.1.1.1

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * ncurses frontend for a text-based user interface.
                      5:   *
                      6:   * Copyright 1996 Bernd Schmidt
                      7:   * If you find the routines in this file useful, you may use them in your
                      8:   * programs without restrictions. Essentially, it's in the public domain.
                      9:   *
                     10:   */
                     11: 
                     12: 
                     13: #include "sysconfig.h"
                     14: #include "sysdeps.h"
                     15: 
                     16: #include <ncurses.h>
                     17: 
                     18: #include "config.h"
                     19: #include "options.h"
                     20: #include "tui.h"
                     21: 
                     22: static WINDOW *currwin;
                     23: 
                     24: static WINDOW *winstack[10]; /* more than enough */
                     25: static int winnr = 0;
                     26: 
                     27: void tui_setup(void)
                     28: {
                     29:     int i;
                     30:     
                     31:     for (i = 0; i < 10; i++)
                     32:        winstack[i] = NULL;
                     33:     /* From the ncurses manpage... */
                     34:     initscr(); start_color(); cbreak(); noecho(); nonl(); intrflush(stdscr, FALSE); keypad(stdscr, TRUE);
                     35:     currwin = stdscr;
                     36:     if (has_colors()) {
                     37:        init_pair(1, COLOR_WHITE, COLOR_BLUE);
                     38:        init_pair(2, COLOR_BLACK, COLOR_WHITE);
                     39:        wattron(currwin, COLOR_PAIR(1) | A_BOLD);
                     40:        wbkgd(currwin, ' '|COLOR_PAIR(1));
                     41:     }
                     42:     
                     43:     winstack[0] = stdscr;
                     44:     winnr = 1;
                     45: }
                     46: 
                     47: int tui_lines(void)
                     48: {
                     49:     return LINES;
                     50: }
                     51: 
                     52: int tui_cols(void)
                     53: {
                     54:     return COLS;
                     55: }
                     56: 
                     57: void tui_shutdown(void)
                     58: {
                     59:     endwin();
                     60: }
                     61: 
                     62: void tui_refresh(void)
                     63: {
                     64:     wrefresh(currwin);
                     65: }
                     66: 
                     67: void tui_puts(const char *s)
                     68: {
                     69:     waddstr(currwin, s);
                     70: }
                     71: 
                     72: void tui_cursoff(void)
                     73: {
                     74: }
                     75: 
                     76: void tui_curson(void)
                     77: {
                     78: }
                     79: 
                     80: void tui_putc(char c)
                     81: {
                     82:     waddch(currwin, c);
                     83: }
                     84: 
                     85: void tui_cr(void)
                     86: {
                     87:     waddch(currwin, '\r');
                     88: }
                     89: 
                     90: char tui_getc(void)
                     91: {
                     92:     return getch();
                     93: }
                     94: 
                     95: void tui_gotoxy(int x, int y)
                     96: {
                     97:     x--; y--;
                     98:     wmove(currwin, y, x);
                     99: }
                    100: 
                    101: void tui_selwin(int w)
                    102: {
                    103:     currwin = winstack[w];
                    104: }
                    105: 
                    106: void tui_clrwin(int w)
                    107: {
                    108:     wclear(winstack[w]);
                    109: }
                    110: 
                    111: void tui_drawbox(int w)
                    112: {
                    113:     wborder(winstack[w], 0, 0, 0, 0, 0, 0, 0, 0);
                    114: }
                    115: 
                    116: void tui_hline(int x1, int y1, int x2)
                    117: {
                    118:     wmove(currwin, y1-1, x1-1);
                    119:     whline(currwin, 0, x2-x1+1);
                    120: }
                    121: 
                    122: int tui_dlog(int x1, int y1, int x2, int y2)
                    123: {
                    124:     x1--; y1--;
                    125:     winstack[winnr] = newwin(y2 - y1, x2 - x1, y1, x1);
                    126:     return winnr++;
                    127: }
                    128: 
                    129: void tui_dlogdie(int w)
                    130: {
                    131:     if (currwin == winstack[w])
                    132:        currwin = stdscr;
                    133:     delwin(winstack[w]);
                    134:     winstack[w] = NULL;
                    135:     while (winstack[winnr-1] == NULL)
                    136:        winnr--;
                    137:     
                    138:     for (w = 0; w < winnr; w++)
                    139:        redrawwin(winstack[w]), wrefresh(winstack[w]);
                    140: }
                    141: 
                    142: int tui_gets(char *buf, int x, int y, int n)
                    143: {
                    144:     int i = 0;
                    145:     for (;;) {
                    146:        int c = getch();
                    147:        int j;
                    148:        wmove(currwin, y, x);
                    149:        for (j = 0; j < i; j++)
                    150:            waddch(currwin, buf[j]);
                    151:        for (; j < n; j++)
                    152:            waddch(currwin, ' ');
                    153:        wmove(currwin, y, x + i);
                    154:        wrefresh(currwin);
                    155:        buf[i] = 0;
                    156:        if (c == 13)
                    157:            return 1;
                    158:        else if (c == 27)
                    159:            return 0;
                    160:        else if (i + 1 < n)
                    161:            buf[i++] = c;
                    162:     }
                    163: }
                    164: 
                    165: int tui_wgets(char *buf, const char *title, int n)
                    166: {
                    167:     int l = strlen(title);
                    168:     int ww = l > n ? l : n;
                    169:     int w = tui_dlog((tui_cols()-ww-2)/2, tui_lines()/2-1, (tui_cols()+ww+2)/2, tui_lines()/2+1);
                    170:     tui_selwin(w); tui_drawbox(w);
                    171:     wmove(currwin, 0, (ww-l)/2);
                    172:     waddstr(currwin, title);
                    173:     return tui_gets(buf, 1, 1, n);
                    174: }
                    175: 
                    176: 
                    177: static char *pattern;
                    178: static int maxlen;
                    179: 
                    180: static void put_filename(char *s, int x, int y, attr_t a)
                    181: {
                    182:     char buf[256];
                    183:     int i;
                    184: 
                    185:     tui_gotoxy(x,y);
                    186:     if (strcmp(s, ".") == 0)
                    187:        strcpy(buf, "(none)");
                    188:     else
                    189:        strcpy(buf, s);
                    190:     buf[maxlen] = 0;
                    191:     for (i = 0; i < strlen(buf); i++)
                    192:        waddch(currwin, buf[i] | a);
                    193:     for (; i < maxlen; i++)
                    194:        waddch(currwin, ' ' | a);
                    195: }
                    196: 
                    197: static char fsbuf[256];
                    198: 
                    199: static int selectfn(const struct dirent *de)
                    200: {
                    201:     int l1, l2;
                    202: 
                    203: /*    l1 = strlen(pattern + 1);*/
                    204:     l2 = strlen(de->d_name);
                    205: 
                    206:     if (l2 >= tui_cols()-10) /* Restrict length of filenames so we won't mess up the display */
                    207:        return 0;
                    208: 
                    209:     /* No pattern matching for now. But we don't show hidden files. */
                    210:     if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0
                    211:        && de->d_name[0] == '.')
                    212:        return 0;
                    213:     if (l2 > maxlen)
                    214:        maxlen = l2;
                    215:     return 1;
                    216: }
                    217: 
                    218: char *tui_filereq(char *s, char *oldfile)
                    219: {
                    220:     char cwd[256];
                    221:     char *retval = fsbuf;
                    222:     char *tmp;
                    223:     int fin = 0;
                    224: 
                    225:     /* Save wd */
                    226:     if (getcwd(cwd, 256) == NULL)
                    227:        return NULL;
                    228: 
                    229:     /* Change into directory of old file */
                    230:     strcpy(fsbuf, oldfile);
                    231:     tmp = strrchr(fsbuf, '/');
                    232:     if (tmp != NULL) {
                    233:        *tmp = 0;
                    234:        if (strlen(fsbuf) > 0)
                    235:            chdir(fsbuf);
                    236:     }
                    237:     
                    238:     pattern = s;
                    239:     if (s[0] != '*')
                    240:        fprintf(stderr, "Can't handle wildcard %s\n", s);
                    241:     if (s[1] != 0 && strchr(s+1, '*') != NULL)
                    242:        fprintf(stderr, "Can't handle wildcard %s\n", s);
                    243:     for (;!fin;) {
                    244:        struct dirent **names;
                    245:        int i, w, n, l, yp, oldyp, s;
                    246:        
                    247:        maxlen = 0;
                    248:        n = scandir(".", &names, selectfn, alphasort);
                    249:        
                    250:        if (n <= 0)
                    251:            return NULL;
                    252:        l = n;
                    253:        if (l > 15)
                    254:            l = 15;
                    255:        yp = s = 0; oldyp = -1;
                    256:        w = tui_dlog(5, 5, 5 + maxlen + 3, 5 + l + 1);
                    257:        tui_selwin(w); tui_drawbox(w);
                    258:        for (;;) {
                    259:            int c;
                    260:            char tmp[256];
                    261:            while (s < yp)
                    262:                yp--;
                    263:            while (s >= yp + l)
                    264:                yp++;
                    265:            if (oldyp != yp) {
                    266:                oldyp = yp;
                    267:                for (i = 0; i < l; i++) {
                    268:                    put_filename(names[i + yp]->d_name, 3, 2 + i, 0);
                    269:                }
                    270:            }
                    271:            put_filename(names[s]->d_name, 3, 2 + s - yp, A_STANDOUT);
                    272:            tui_refresh();
                    273:            c = getch();
                    274:            put_filename(names[s]->d_name, 3, 2 + s - yp, 0);
                    275:            if (c == 27) {
                    276:                retval = NULL; fin = 1;
                    277:                break;
                    278:            } else if (c == KEY_ENTER || c == 13 || c == ' ') {
                    279:                int err;
                    280:                
                    281:                if (strcmp(names[s]->d_name, ".") == 0) {
                    282:                    fin = 1;
                    283:                    strcpy(fsbuf, "");
                    284:                    break;
                    285:                }
                    286:                err = chdir(names[s]->d_name);
                    287:                
                    288:                if (err == 0)
                    289:                    break;
                    290:                else if (errno == ENOTDIR) {
                    291:                    fin = 1;
                    292:                    if (getcwd(fsbuf, 256) == NULL)
                    293:                        retval = NULL;
                    294:                    if (strlen(fsbuf) + strlen(names[s]->d_name) + 2 >= 256)
                    295:                        retval = NULL;
                    296:                    else {
                    297:                        strcat(fsbuf, "/");
                    298:                        strcat(fsbuf, names[s]->d_name);
                    299:                    }
                    300:                    break;
                    301:                } /* else what? */
                    302:            }
                    303:            switch (c) {
                    304:             case KEY_UP:
                    305:                if (s > 0)
                    306:                    s--;
                    307:                break;
                    308:             case KEY_DOWN:
                    309:                if (s + 1 < n)
                    310:                    s++;
                    311:                break;
                    312:             case KEY_PPAGE:
                    313:                if (s > l)
                    314:                    s -= l;
                    315:                else
                    316:                    s = 0;
                    317:                break;
                    318:             case KEY_NPAGE:
                    319:                if (s + l < n)
                    320:                    s += l;
                    321:                else
                    322:                    s = n - 1;
                    323:                break;
                    324:             default:
                    325:                for (i = 0; i < n; i++)
                    326:                    if (names[i]->d_name[0] == c) {
                    327:                        s = i;
                    328:                        break;
                    329:                    }
                    330:            }
                    331:        }
                    332: #if 0
                    333:        /* @@@ is this right? */
                    334:        for (i = 0; i < n; i++)
                    335:            free(names[i]->d_name);
                    336:        free(names);
                    337: #endif
                    338:        tui_dlogdie(w);
                    339:     }
                    340:     chdir(cwd);
                    341:     return retval;
                    342: }
                    343: 
                    344: int tui_backup_optionsfile(void)
                    345: {
                    346:     char tmp[257];
                    347:     strcpy(tmp, optionsfile);
                    348:     strcat(tmp, "~");
                    349:     return rename(optionsfile, tmp);
                    350: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.