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.


Ported palacios to Kbuild
[palacios.git] / scripts / 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, "  Ok  ", y, x, selected == 0);
35         print_button(dialog, " 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         /* center dialog box on screen */
53         x = (COLS - width) / 2;
54         y = (LINES - height) / 2;
55
56         draw_shadow(stdscr, y, x, height, width);
57
58         dialog = newwin(height, width, y, x);
59         keypad(dialog, TRUE);
60
61         draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
62         wattrset(dialog, border_attr);
63         mvwaddch(dialog, height - 3, 0, ACS_LTEE);
64         for (i = 0; i < width - 2; i++)
65                 waddch(dialog, ACS_HLINE);
66         wattrset(dialog, dialog_attr);
67         waddch(dialog, ACS_RTEE);
68
69         print_title(dialog, title, width);
70
71         wattrset(dialog, dialog_attr);
72         print_autowrap(dialog, prompt, width - 2, 1, 3);
73
74         /* Draw the input field box */
75         box_width = width - 6;
76         getyx(dialog, y, x);
77         box_y = y + 2;
78         box_x = (width - box_width) / 2;
79         draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr);
80
81         print_buttons(dialog, height, width, 0);
82
83         /* Set up the initial value */
84         wmove(dialog, box_y, box_x);
85         wattrset(dialog, inputbox_attr);
86
87         if (!init)
88                 instr[0] = '\0';
89         else
90                 strcpy(instr, init);
91
92         input_x = strlen(instr);
93
94         if (input_x >= box_width) {
95                 scroll = input_x - box_width + 1;
96                 input_x = box_width - 1;
97                 for (i = 0; i < box_width - 1; i++)
98                         waddch(dialog, instr[scroll + i]);
99         } else {
100                 waddstr(dialog, instr);
101         }
102
103         wmove(dialog, box_y, box_x + input_x);
104
105         wrefresh(dialog);
106
107         while (key != ESC) {
108                 key = wgetch(dialog);
109
110                 if (button == -1) {     /* Input box selected */
111                         switch (key) {
112                         case TAB:
113                         case KEY_UP:
114                         case KEY_DOWN:
115                                 break;
116                         case KEY_LEFT:
117                                 continue;
118                         case KEY_RIGHT:
119                                 continue;
120                         case KEY_BACKSPACE:
121                         case 127:
122                                 if (input_x || scroll) {
123                                         wattrset(dialog, inputbox_attr);
124                                         if (!input_x) {
125                                                 scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
126                                                 wmove(dialog, box_y, box_x);
127                                                 for (i = 0; i < box_width; i++)
128                                                         waddch(dialog,
129                                                                instr[scroll + input_x + i] ?
130                                                                instr[scroll + input_x + i] : ' ');
131                                                 input_x = strlen(instr) - scroll;
132                                         } else
133                                                 input_x--;
134                                         instr[scroll + input_x] = '\0';
135                                         mvwaddch(dialog, box_y, input_x + box_x, ' ');
136                                         wmove(dialog, box_y, input_x + box_x);
137                                         wrefresh(dialog);
138                                 }
139                                 continue;
140                         default:
141                                 if (key < 0x100 && isprint(key)) {
142                                         if (scroll + input_x < MAX_LEN) {
143                                                 wattrset(dialog, inputbox_attr);
144                                                 instr[scroll + input_x] = key;
145                                                 instr[scroll + input_x + 1] = '\0';
146                                                 if (input_x == box_width - 1) {
147                                                         scroll++;
148                                                         wmove(dialog, box_y, box_x);
149                                                         for (i = 0; i < box_width - 1; i++)
150                                                                 waddch(dialog, instr [scroll + i]);
151                                                 } else {
152                                                         wmove(dialog, box_y, input_x++ + box_x);
153                                                         waddch(dialog, key);
154                                                 }
155                                                 wrefresh(dialog);
156                                         } else
157                                                 flash();        /* Alarm user about overflow */
158                                         continue;
159                                 }
160                         }
161                 }
162                 switch (key) {
163                 case 'O':
164                 case 'o':
165                         delwin(dialog);
166                         return 0;
167                 case 'H':
168                 case 'h':
169                         delwin(dialog);
170                         return 1;
171                 case KEY_UP:
172                 case KEY_LEFT:
173                         switch (button) {
174                         case -1:
175                                 button = 1;     /* Indicates "Cancel" button is selected */
176                                 print_buttons(dialog, height, width, 1);
177                                 break;
178                         case 0:
179                                 button = -1;    /* Indicates input box is selected */
180                                 print_buttons(dialog, height, width, 0);
181                                 wmove(dialog, box_y, box_x + input_x);
182                                 wrefresh(dialog);
183                                 break;
184                         case 1:
185                                 button = 0;     /* Indicates "OK" button is selected */
186                                 print_buttons(dialog, height, width, 0);
187                                 break;
188                         }
189                         break;
190                 case TAB:
191                 case KEY_DOWN:
192                 case KEY_RIGHT:
193                         switch (button) {
194                         case -1:
195                                 button = 0;     /* Indicates "OK" button is selected */
196                                 print_buttons(dialog, height, width, 0);
197                                 break;
198                         case 0:
199                                 button = 1;     /* Indicates "Cancel" button is selected */
200                                 print_buttons(dialog, height, width, 1);
201                                 break;
202                         case 1:
203                                 button = -1;    /* Indicates input box is selected */
204                                 print_buttons(dialog, height, width, 0);
205                                 wmove(dialog, box_y, box_x + input_x);
206                                 wrefresh(dialog);
207                                 break;
208                         }
209                         break;
210                 case ' ':
211                 case '\n':
212                         delwin(dialog);
213                         return (button == -1 ? 0 : button);
214                 case 'X':
215                 case 'x':
216                         key = ESC;
217                 case ESC:
218                         break;
219                 }
220         }
221
222         delwin(dialog);
223         return -1;              /* ESC pressed */
224 }