Annotation of coherent/g/usr/bin/vsh/winlib/pdmenu.c, revision 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.