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

1.1       root        1: /*
                      2:  *     Output an pulldown menu and select one option
                      3:  *
                      4:  *      Copyright (c) 1990-93 by Udo Munk
                      5:  */
                      6: 
                      7: #ifdef AIX
                      8: #define NLS
                      9: #endif
                     10: 
                     11: #include <curses.h>
                     12: #include <ctype.h>
                     13: #include <string.h>
                     14: #include "winfun.h"
                     15: 
                     16: extern WINDOW *open_window();
                     17: extern int close_window();
                     18:  
                     19: static int inp;
                     20: 
                     21: pulldown_menu(b, y, x, attr, color)
                     22: struct menu *b;
                     23: int x, y;
                     24: chtype attr, color;
                     25: {
                     26:        register char *p;
                     27:        register int i, j;
                     28:        int bh, bw, ni, ai, eoj, search;
                     29:        register struct menu *m;
                     30:        WINDOW *w;
                     31: 
                     32:        i = bh = bw = 0;
                     33:        m = b;
                     34:        while (m->m_text != NULL) {
                     35:                if (strlen(m->m_text) > bw)
                     36:                        bw = strlen(m->m_text);
                     37:                i++;
                     38:                m++;
                     39:        }
                     40:        bw += 4;
                     41:        bh = i + 3;
                     42:        ni = i - 1;
                     43:        if ((w = open_window(bh, bw, y, x)) == (WINDOW *) 0)
                     44:                nomem();
                     45:        cursoroff();
                     46:        leaveok(w, TRUE);
                     47:        wattron(w, color);
                     48:        mvwaddch(w, 0, 0, ul_corner);
                     49:        for (i = 0; i < bw-2; i++)
                     50:                waddch(w, h_line);
                     51:        waddch(w, ur_corner);
                     52:        mvwaddch(w, 1, 0, v_line);
                     53:        waddch(w, ' ');
                     54:        waddstr(w, b->m_text);
                     55:        i = strlen(b->m_text);
                     56:        while (i < bw - 2) {
                     57:                waddch(w, ' ');
                     58:                i++;
                     59:        }
                     60:        mvwaddch(w, 1, bw-1, v_line);
                     61:        mvwaddch(w, 2, 0, l_tee);
                     62:        for (i = 0; i < bw-2; i++)
                     63:                waddch(w, h_line);
                     64:        waddch(w, r_tee);
                     65:        for (i = 0; i < ni; i++) {
                     66:                mvwaddch(w, i+3, 0, v_line);
                     67:                mvwaddch(w, i+3, bw-1, v_line);
                     68:        }
                     69:        mvwaddch(w, i+3, 0, ll_corner);
                     70:        for (j = 0; j < bw-2; j++)
                     71:                waddch(w, h_line);
                     72:        waddch(w, lr_corner);
                     73:        ai = 1;
                     74:        menu_options(w, bw-3, b, ni, ai, attr, color);
                     75:        eoj = 1;
                     76:        while (eoj) {
                     77:                if (inp == -1)
                     78:                        inp = wgetch(w);
                     79:                switch (inp) {
                     80:                case KEY_DOWN:
                     81:                        ai++;
                     82:                        if (ai > ni)
                     83:                                ai = 1;
                     84:                        menu_options(w, bw-3, b, ni, ai, attr, color);
                     85:                        break;
                     86:                case KEY_UP:
                     87:                        ai--;
                     88:                        if (ai < 1)
                     89:                                ai = ni;
                     90:                        menu_options(w, bw-3, b, ni, ai, attr, color);
                     91:                        break;
                     92:                case KEY_LEFT:
                     93:                        ai = WIN_PREVMEN;
                     94:                        eoj = 0;
                     95:                        break;
                     96:                case KEY_RIGHT:
                     97:                        ai = WIN_NEXTMEN;
                     98:                        eoj = 0;
                     99:                        break;
                    100:                case '\r':
                    101:                case KEY_ENTER:
                    102:                        eoj = 0;
                    103:                        break;
                    104:                case 033:       /* ESC, abort menu */
                    105:                case ' ':
                    106:                        ai = WIN_ABORT;
                    107:                        eoj = 0;
                    108:                        break;
                    109:                case W_KEY_REFR:
                    110: #ifdef KEY_REFR
                    111:                case KEY_REFR:
                    112: #endif
                    113:                        wrefresh(curscr);
                    114:                        inp = -1;
                    115:                        break;
                    116:                default:
                    117:                        if (!((inp >= '0' && inp <= '9') ||
                    118:                              (inp >= 'A' && inp <= 'Z') ||
                    119:                              (inp >= 'a' && inp <= 'z'))) {
                    120:                                inp = -1;
                    121:                                break;
                    122:                        }
                    123:                        m = b + 1;
                    124:                        search = 0;
                    125:                        j = 1;
                    126:                        while (m->m_text) {
                    127:                                p = m->m_text;
                    128:                                if (toupper(inp&0177) == toupper(*(p + m->m_opt - 1))) {
                    129:                                        search = j;
                    130:                                        break;
                    131:                                }
                    132:                                m++;
                    133:                                j++;
                    134:                        }
                    135:                        if (search) {
                    136:                                ai = search;
                    137:                                eoj = 0;
                    138:                        } else
                    139:                                inp = -1;
                    140:                        break;
                    141:                }
                    142:        }
                    143:        close_window(w);
                    144:        return(ai);
                    145: }
                    146: 
                    147: /*
                    148:  *      output options of pulldown menu
                    149:  */
                    150: static menu_options(w, l, s, n, a, attr, color)
                    151: WINDOW *w;
                    152: struct menu *s;
                    153: int l, n, a;
                    154: chtype attr, color;
                    155: {
                    156:        register int i, j;
                    157:        register char *p;
                    158:        register chtype mark = (color == A_NORMAL) ? A_REVERSE : A_NORMAL;
                    159:        register chtype mark1 = (color == A_NORMAL) ? ((attr == A_NORMAL) ? A_REVERSE : attr) : ((attr == A_NORMAL) ? A_NORMAL : A_REVERSE | attr);
                    160: 
                    161:        s++;
                    162:        for (i = 1; i <= n; i++, s++) {
                    163:                wmove(w, i+2, 1);
                    164:                if (i == a)
                    165:                        wattrset(w, mark);
                    166:                else
                    167:                        wattrset(w, color);
                    168:                waddch(w, ' ');
                    169:                j = 1;
                    170:                p = s->m_text;
                    171:                while (*p) {
                    172:                        if (j == s->m_opt) {
                    173:                                if (i == a)
                    174:                                        wattrset(w, attr);
                    175:                                else
                    176:                                        wattrset(w, mark1);
                    177:                                waddch(w, *p++);
                    178:                                if (i == a)
                    179:                                        wattrset(w, mark);
                    180:                                else
                    181:                                        wattrset(w, color);
                    182:                                waddstr(w, p);
                    183:                                break;
                    184:                        } else {
                    185:                                waddch(w, *p++);
                    186:                                j++;
                    187:                        }
                    188:                }
                    189:                j = strlen(s->m_text);
                    190:                while (j < l) {
                    191:                        waddch(w, ' ');
                    192:                        j++;
                    193:                }
                    194:        }
                    195:        nodelay(w, TRUE);
                    196:        inp = wgetch(w);
                    197:        nodelay(w, FALSE);
                    198:        if (inp == -1)
                    199:                wrefresh(w);
                    200: }

unix.superglobalmegacorp.com

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