Annotation of coherent/g/usr/bin/vsh/winlib/buttbox.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *      Display a box with buttons and edit the buttons
                      3:  *
                      4:  *      Copyright (c) 1990-93 Udo Munk
                      5:  */
                      6: 
                      7: #ifdef AIX
                      8: #define NLS
                      9: #endif
                     10: 
                     11: #include <curses.h>
                     12: #include <string.h>
                     13: #include "winfun.h"     
                     14: 
                     15: extern WINDOW *open_window();
                     16: extern int close_window();
                     17: 
                     18: button_box(bp)
                     19: struct bbox *bp;
                     20: {
                     21:        register int i, j, k;
                     22:        int grp = 0, but = 0;
                     23:        int bh, bw;
                     24:        int eoj = 1;
                     25:        int *p;
                     26:        int ret;
                     27:        WINDOW *w;
                     28: 
                     29:        bh = bp->b_anz * 3 + 3;     /* compute high of box */
                     30:        bw = strlen(bp->b_text) + 2;/* compute width of box */
                     31:        for (i = 0; i < bp->b_anz; i++) {
                     32:                j = strlen(bp->b_ptr[i]->g_text) + 2;
                     33:                if (j > bw)
                     34:                        bw = j;
                     35:                for (j = 0, k = 0; j < bp->b_ptr[i]->g_anz; j++)
                     36:                        k += strlen(bp->b_ptr[i]->g_ptr[j]->b_text) + 6;
                     37:                if (k > bw)
                     38:                        bw = k;
                     39:        }
                     40: 
                     41:        if ((w = open_window(bh, bw, (LINES-bh)/2, (COLS-bw)/2)) == (WINDOW *) 0)
                     42:                nomem();
                     43: 
                     44:        wattron(w, A_REVERSE);  /* output inverted box */
                     45:        for (i = 0; i < bh; i++)
                     46:                for (j = 0; j < bw; j++)
                     47:                        mvwaddch(w, i, j, ' ');
                     48:        mvwaddstr(w, 1, 1, bp->b_text);
                     49:        for (i = 0; i < bp->b_anz; i++) {
                     50:                mvwaddstr(w, i*3+3, 1, bp->b_ptr[i]->g_text);
                     51:                wmove(w, i*3+4, 1);
                     52:                for (j = 0; j < bp->b_ptr[i]->g_anz; j++) {
                     53:                        wprintw(w, "%s ", bp->b_ptr[i]->g_ptr[j]->b_text);
                     54:                        wprintw(w, "[%c]  ", (bp->b_ptr[i]->g_ptr[j]->b_val) ? 'x' : ' ');
                     55:                }
                     56:        }
                     57:        wrefresh(w);
                     58:        cursoron();
                     59: 
                     60:        while (eoj) {          /* now edit the buttons */
                     61:                for (i = 0, j = 0; i <= but; i++)
                     62:                        j += strlen(bp->b_ptr[grp]->g_ptr[i]->b_text) + 6;
                     63:                wmove(w, grp*3+4, j-3);
                     64:                wrefresh(w);
                     65:                switch (k = wgetch(w)) {
                     66:                case '\r':      /* ready, leave function */
                     67:                case KEY_ENTER:
                     68:                        ret = WIN_OK;
                     69:                        eoj = 0;
                     70:                        break;
                     71:                case 033:       /* ESC, function aborted */
                     72:                        ret = WIN_ABORT;
                     73:                        eoj = 0;
                     74:                        break;
                     75:                case ' ':       /* switch current button on/off */
                     76:                        p = &(bp->b_ptr[grp]->g_ptr[but]->b_val);
                     77:                        if (*p == 0) {
                     78:                                *p = 1;
                     79:                                waddch(w, 'x');
                     80:                        } else {
                     81:                                *p = 0;
                     82:                                waddch(w, ' ');
                     83:                        }
                     84:                        break;
                     85:                case KEY_RIGHT:         /* go to next button right */
                     86:                        but++;
                     87:                        if (but >= bp->b_ptr[grp]->g_anz)
                     88:                                but = 0;
                     89:                        break;
                     90:                case KEY_LEFT:          /* go to next button left */
                     91:                        but--;
                     92:                        if (but < 0)
                     93:                                but = bp->b_ptr[grp]->g_anz - 1;
                     94:                        break;
                     95:                case KEY_DOWN:          /* go to next button down */
                     96:                        grp++;
                     97:                        if (grp >= bp->b_anz)
                     98:                                grp = 0;
                     99:                        break;
                    100:                case KEY_UP:            /* go to next button up */
                    101:                        grp--;
                    102:                        if (grp < 0)
                    103:                                grp = bp->b_anz - 1;
                    104:                        break;
                    105:                }
                    106:        }
                    107:        close_window(w);
                    108:        cursoroff();
                    109:        return(ret);
                    110: }

unix.superglobalmegacorp.com

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