Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


SEABIOS updates to support reset and to simplify
[palacios.git] / bios / seabios / tools / kconfig / lxdialog / inputbox.c
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 "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 }