|
|
1.1 ! root 1: /* ! 2: * inputbox.c -- implements the input box ! 3: * ! 4: * ORIGINAL AUTHOR: Savio Lam ([email protected]) ! 5: * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap ([email protected]) ! 6: * ! 7: * This program is free software; you can redistribute it and/or ! 8: * modify it under the terms of the GNU General Public License ! 9: * as published by the Free Software Foundation; either version 2 ! 10: * of the License, or (at your option) any later version. ! 11: * ! 12: * This program is distributed in the hope that it will be useful, ! 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: * GNU General Public License for more details. ! 16: * ! 17: * You should have received a copy of the GNU General Public License ! 18: * along with this program; if not, write to the Free Software ! 19: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 20: */ ! 21: ! 22: #include "dialog.h" ! 23: ! 24: char dialog_input_result[MAX_LEN + 1]; ! 25: ! 26: /* ! 27: * Print the termination buttons ! 28: */ ! 29: static void print_buttons(WINDOW * dialog, int height, int width, int selected) ! 30: { ! 31: int x = width / 2 - 11; ! 32: int y = height - 2; ! 33: ! 34: print_button(dialog, gettext(" Ok "), y, x, selected == 0); ! 35: print_button(dialog, gettext(" Help "), y, x + 14, selected == 1); ! 36: ! 37: wmove(dialog, y, x + 1 + 14 * selected); ! 38: wrefresh(dialog); ! 39: } ! 40: ! 41: /* ! 42: * Display a dialog box for inputing a string ! 43: */ ! 44: int dialog_inputbox(const char *title, const char *prompt, int height, int width, ! 45: const char *init) ! 46: { ! 47: int i, x, y, box_y, box_x, box_width; ! 48: int input_x = 0, scroll = 0, key = 0, button = -1; ! 49: char *instr = dialog_input_result; ! 50: WINDOW *dialog; ! 51: ! 52: if (!init) ! 53: instr[0] = '\0'; ! 54: else ! 55: strcpy(instr, init); ! 56: ! 57: do_resize: ! 58: if (getmaxy(stdscr) <= (height - 2)) ! 59: return -ERRDISPLAYTOOSMALL; ! 60: if (getmaxx(stdscr) <= (width - 2)) ! 61: return -ERRDISPLAYTOOSMALL; ! 62: ! 63: /* center dialog box on screen */ ! 64: x = (COLS - width) / 2; ! 65: y = (LINES - height) / 2; ! 66: ! 67: draw_shadow(stdscr, y, x, height, width); ! 68: ! 69: dialog = newwin(height, width, y, x); ! 70: keypad(dialog, TRUE); ! 71: ! 72: draw_box(dialog, 0, 0, height, width, ! 73: dlg.dialog.atr, dlg.border.atr); ! 74: wattrset(dialog, dlg.border.atr); ! 75: mvwaddch(dialog, height - 3, 0, ACS_LTEE); ! 76: for (i = 0; i < width - 2; i++) ! 77: waddch(dialog, ACS_HLINE); ! 78: wattrset(dialog, dlg.dialog.atr); ! 79: waddch(dialog, ACS_RTEE); ! 80: ! 81: print_title(dialog, title, width); ! 82: ! 83: wattrset(dialog, dlg.dialog.atr); ! 84: print_autowrap(dialog, prompt, width - 2, 1, 3); ! 85: ! 86: /* Draw the input field box */ ! 87: box_width = width - 6; ! 88: getyx(dialog, y, x); ! 89: box_y = y + 2; ! 90: box_x = (width - box_width) / 2; ! 91: draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, ! 92: dlg.dialog.atr, dlg.border.atr); ! 93: ! 94: print_buttons(dialog, height, width, 0); ! 95: ! 96: /* Set up the initial value */ ! 97: wmove(dialog, box_y, box_x); ! 98: wattrset(dialog, dlg.inputbox.atr); ! 99: ! 100: input_x = strlen(instr); ! 101: ! 102: if (input_x >= box_width) { ! 103: scroll = input_x - box_width + 1; ! 104: input_x = box_width - 1; ! 105: for (i = 0; i < box_width - 1; i++) ! 106: waddch(dialog, instr[scroll + i]); ! 107: } else { ! 108: waddstr(dialog, instr); ! 109: } ! 110: ! 111: wmove(dialog, box_y, box_x + input_x); ! 112: ! 113: wrefresh(dialog); ! 114: ! 115: while (key != KEY_ESC) { ! 116: key = wgetch(dialog); ! 117: ! 118: if (button == -1) { /* Input box selected */ ! 119: switch (key) { ! 120: case TAB: ! 121: case KEY_UP: ! 122: case KEY_DOWN: ! 123: break; ! 124: case KEY_LEFT: ! 125: continue; ! 126: case KEY_RIGHT: ! 127: continue; ! 128: case KEY_BACKSPACE: ! 129: case 127: ! 130: if (input_x || scroll) { ! 131: wattrset(dialog, dlg.inputbox.atr); ! 132: if (!input_x) { ! 133: scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); ! 134: wmove(dialog, box_y, box_x); ! 135: for (i = 0; i < box_width; i++) ! 136: waddch(dialog, ! 137: instr[scroll + input_x + i] ? ! 138: instr[scroll + input_x + i] : ' '); ! 139: input_x = strlen(instr) - scroll; ! 140: } else ! 141: input_x--; ! 142: instr[scroll + input_x] = '\0'; ! 143: mvwaddch(dialog, box_y, input_x + box_x, ' '); ! 144: wmove(dialog, box_y, input_x + box_x); ! 145: wrefresh(dialog); ! 146: } ! 147: continue; ! 148: default: ! 149: if (key < 0x100 && isprint(key)) { ! 150: if (scroll + input_x < MAX_LEN) { ! 151: wattrset(dialog, dlg.inputbox.atr); ! 152: instr[scroll + input_x] = key; ! 153: instr[scroll + input_x + 1] = '\0'; ! 154: if (input_x == box_width - 1) { ! 155: scroll++; ! 156: wmove(dialog, box_y, box_x); ! 157: for (i = 0; i < box_width - 1; i++) ! 158: waddch(dialog, instr [scroll + i]); ! 159: } else { ! 160: wmove(dialog, box_y, input_x++ + box_x); ! 161: waddch(dialog, key); ! 162: } ! 163: wrefresh(dialog); ! 164: } else ! 165: flash(); /* Alarm user about overflow */ ! 166: continue; ! 167: } ! 168: } ! 169: } ! 170: switch (key) { ! 171: case 'O': ! 172: case 'o': ! 173: delwin(dialog); ! 174: return 0; ! 175: case 'H': ! 176: case 'h': ! 177: delwin(dialog); ! 178: return 1; ! 179: case KEY_UP: ! 180: case KEY_LEFT: ! 181: switch (button) { ! 182: case -1: ! 183: button = 1; /* Indicates "Help" button is selected */ ! 184: print_buttons(dialog, height, width, 1); ! 185: break; ! 186: case 0: ! 187: button = -1; /* Indicates input box is selected */ ! 188: print_buttons(dialog, height, width, 0); ! 189: wmove(dialog, box_y, box_x + input_x); ! 190: wrefresh(dialog); ! 191: break; ! 192: case 1: ! 193: button = 0; /* Indicates "OK" button is selected */ ! 194: print_buttons(dialog, height, width, 0); ! 195: break; ! 196: } ! 197: break; ! 198: case TAB: ! 199: case KEY_DOWN: ! 200: case KEY_RIGHT: ! 201: switch (button) { ! 202: case -1: ! 203: button = 0; /* Indicates "OK" button is selected */ ! 204: print_buttons(dialog, height, width, 0); ! 205: break; ! 206: case 0: ! 207: button = 1; /* Indicates "Help" button is selected */ ! 208: print_buttons(dialog, height, width, 1); ! 209: break; ! 210: case 1: ! 211: button = -1; /* Indicates input box is selected */ ! 212: print_buttons(dialog, height, width, 0); ! 213: wmove(dialog, box_y, box_x + input_x); ! 214: wrefresh(dialog); ! 215: break; ! 216: } ! 217: break; ! 218: case ' ': ! 219: case '\n': ! 220: delwin(dialog); ! 221: return (button == -1 ? 0 : button); ! 222: case 'X': ! 223: case 'x': ! 224: key = KEY_ESC; ! 225: break; ! 226: case KEY_ESC: ! 227: key = on_key_esc(dialog); ! 228: break; ! 229: case KEY_RESIZE: ! 230: delwin(dialog); ! 231: on_key_resize(); ! 232: goto do_resize; ! 233: } ! 234: } ! 235: ! 236: delwin(dialog); ! 237: return KEY_ESC; /* ESC pressed */ ! 238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.