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