|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.