kconfig/lxdialog/inputbox.c
author Arnaud Lacombe <lacombar@gmail.com>
Tue Aug 03 06:17:51 2010 +0200 (2010-08-03)
changeset 2064 f5ebe8c429dc
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
libc/uClibc: add uClibc 0.9.30.3

This version has been released a couple of month ago, but it never reached
crosstool-ng tree. This may be linked to the fact that the current 0.9.30.2,
once patched, has nothing much different from 0.9.30.3, released.

I'm not including any patch with this upgrade, on purpose.

Signed-off-by: Arnaud Lacombe <lacombar@gmail.com>
     1 /*
     2  *  inputbox.c -- implements the input box
     3  *
     4  *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
     5  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
     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 "Cancel" 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 "Cancel" 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 }