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