2 * inputbox.c -- implements the input box
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
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.
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.
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.
24 unsigned char dialog_input_result
[MAX_LEN
+ 1];
27 * Print the termination buttons
30 print_buttons(WINDOW
*dialog
, int height
, int width
, int selected
)
32 int x
= width
/ 2 - 11;
35 print_button (dialog
, " Ok ", y
, x
, selected
==0);
36 print_button (dialog
, " Help ", y
, x
+ 14, selected
==1);
38 wmove(dialog
, y
, x
+1+14*selected
);
43 * Display a dialog box for inputing a string
46 dialog_inputbox (const char *title
, const char *prompt
, int height
, int width
,
49 int i
, x
, y
, box_y
, box_x
, box_width
;
50 int input_x
= 0, scroll
= 0, key
= 0, button
= -1;
51 unsigned char *instr
= dialog_input_result
;
54 /* center dialog box on screen */
55 x
= (COLS
- width
) / 2;
56 y
= (LINES
- height
) / 2;
59 draw_shadow (stdscr
, y
, x
, height
, width
);
61 dialog
= newwin (height
, width
, y
, x
);
62 keypad (dialog
, TRUE
);
64 draw_box (dialog
, 0, 0, height
, width
, dialog_attr
, border_attr
);
65 wattrset (dialog
, border_attr
);
66 mvwaddch (dialog
, height
-3, 0, ACS_LTEE
);
67 for (i
= 0; i
< width
- 2; i
++)
68 waddch (dialog
, ACS_HLINE
);
69 wattrset (dialog
, dialog_attr
);
70 waddch (dialog
, ACS_RTEE
);
72 if (title
!= NULL
&& strlen(title
) >= width
-2 ) {
73 /* truncate long title -- mec */
74 char * title2
= malloc(width
-2+1);
75 memcpy( title2
, title
, width
-2 );
76 title2
[width
-2] = '\0';
81 wattrset (dialog
, title_attr
);
82 mvwaddch (dialog
, 0, (width
- strlen(title
))/2 - 1, ' ');
83 waddstr (dialog
, (char *)title
);
87 wattrset (dialog
, dialog_attr
);
88 print_autowrap (dialog
, prompt
, width
- 2, 1, 3);
90 /* Draw the input field box */
91 box_width
= width
- 6;
94 box_x
= (width
- box_width
) / 2;
95 draw_box (dialog
, y
+ 1, box_x
- 1, 3, box_width
+ 2,
96 border_attr
, dialog_attr
);
98 print_buttons(dialog
, height
, width
, 0);
100 /* Set up the initial value */
101 wmove (dialog
, box_y
, box_x
);
102 wattrset (dialog
, inputbox_attr
);
107 strcpy (instr
, init
);
109 input_x
= strlen (instr
);
111 if (input_x
>= box_width
) {
112 scroll
= input_x
- box_width
+ 1;
113 input_x
= box_width
- 1;
114 for (i
= 0; i
< box_width
- 1; i
++)
115 waddch (dialog
, instr
[scroll
+ i
]);
117 waddstr (dialog
, instr
);
119 wmove (dialog
, box_y
, box_x
+ input_x
);
124 key
= wgetch (dialog
);
126 if (button
== -1) { /* Input box selected */
138 if (input_x
|| scroll
) {
139 wattrset (dialog
, inputbox_attr
);
141 scroll
= scroll
< box_width
- 1 ?
142 0 : scroll
- (box_width
- 1);
143 wmove (dialog
, box_y
, box_x
);
144 for (i
= 0; i
< box_width
; i
++)
145 waddch (dialog
, instr
[scroll
+ input_x
+ i
] ?
146 instr
[scroll
+ input_x
+ i
] : ' ');
147 input_x
= strlen (instr
) - scroll
;
150 instr
[scroll
+ input_x
] = '\0';
151 mvwaddch (dialog
, box_y
, input_x
+ box_x
, ' ');
152 wmove (dialog
, box_y
, input_x
+ box_x
);
157 if (key
< 0x100 && isprint (key
)) {
158 if (scroll
+ input_x
< MAX_LEN
) {
159 wattrset (dialog
, inputbox_attr
);
160 instr
[scroll
+ input_x
] = key
;
161 instr
[scroll
+ input_x
+ 1] = '\0';
162 if (input_x
== box_width
- 1) {
164 wmove (dialog
, box_y
, box_x
);
165 for (i
= 0; i
< box_width
- 1; i
++)
166 waddch (dialog
, instr
[scroll
+ i
]);
168 wmove (dialog
, box_y
, input_x
++ + box_x
);
169 waddch (dialog
, key
);
173 flash (); /* Alarm user about overflow */
191 button
= 1; /* Indicates "Cancel" button is selected */
192 print_buttons(dialog
, height
, width
, 1);
195 button
= -1; /* Indicates input box is selected */
196 print_buttons(dialog
, height
, width
, 0);
197 wmove (dialog
, box_y
, box_x
+ input_x
);
201 button
= 0; /* Indicates "OK" button is selected */
202 print_buttons(dialog
, height
, width
, 0);
211 button
= 0; /* Indicates "OK" button is selected */
212 print_buttons(dialog
, height
, width
, 0);
215 button
= 1; /* Indicates "Cancel" button is selected */
216 print_buttons(dialog
, height
, width
, 1);
219 button
= -1; /* Indicates input box is selected */
220 print_buttons(dialog
, height
, width
, 0);
221 wmove (dialog
, box_y
, box_x
+ input_x
);
229 return (button
== -1 ? 0 : button
);
239 return -1; /* ESC pressed */