kconfig/nconf.gui.c
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@2454
     1
/*
yann@2454
     2
 * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
yann@2454
     3
 * Released under the terms of the GNU GPL v2.0.
yann@2454
     4
 *
yann@2454
     5
 * Derived from menuconfig.
yann@2454
     6
 *
yann@2454
     7
 */
yann@2454
     8
#include "nconf.h"
yann@2454
     9
yann@2454
    10
/* a list of all the different widgets we use */
yann@2454
    11
attributes_t attributes[ATTR_MAX+1] = {0};
yann@2454
    12
yann@2454
    13
/* available colors:
yann@2454
    14
   COLOR_BLACK   0
yann@2454
    15
   COLOR_RED     1
yann@2454
    16
   COLOR_GREEN   2
yann@2454
    17
   COLOR_YELLOW  3
yann@2454
    18
   COLOR_BLUE    4
yann@2454
    19
   COLOR_MAGENTA 5
yann@2454
    20
   COLOR_CYAN    6
yann@2454
    21
   COLOR_WHITE   7
yann@2454
    22
   */
yann@2454
    23
static void set_normal_colors(void)
yann@2454
    24
{
yann@2454
    25
	init_pair(NORMAL, -1, -1);
yann@2454
    26
	init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
yann@2454
    27
yann@2454
    28
	/* FORE is for the selected item */
yann@2454
    29
	init_pair(MAIN_MENU_FORE, -1, -1);
yann@2454
    30
	/* BACK for all the rest */
yann@2454
    31
	init_pair(MAIN_MENU_BACK, -1, -1);
yann@2454
    32
	init_pair(MAIN_MENU_GREY, -1, -1);
yann@2454
    33
	init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
yann@2454
    34
	init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
yann@2454
    35
yann@2454
    36
	init_pair(SCROLLWIN_TEXT, -1, -1);
yann@2454
    37
	init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
yann@2454
    38
	init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
yann@2454
    39
yann@2454
    40
	init_pair(DIALOG_TEXT, -1, -1);
yann@2454
    41
	init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
yann@2454
    42
	init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
yann@2454
    43
	init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
yann@2454
    44
yann@2454
    45
	init_pair(INPUT_BOX, COLOR_YELLOW, -1);
yann@2454
    46
	init_pair(INPUT_HEADING, COLOR_GREEN, -1);
yann@2454
    47
	init_pair(INPUT_TEXT, -1, -1);
yann@2454
    48
	init_pair(INPUT_FIELD, -1, -1);
yann@2454
    49
yann@2454
    50
	init_pair(FUNCTION_HIGHLIGHT, -1, -1);
yann@2454
    51
	init_pair(FUNCTION_TEXT, COLOR_BLUE, -1);
yann@2454
    52
}
yann@2454
    53
yann@2454
    54
/* available attributes:
yann@2454
    55
   A_NORMAL        Normal display (no highlight)
yann@2454
    56
   A_STANDOUT      Best highlighting mode of the terminal.
yann@2454
    57
   A_UNDERLINE     Underlining
yann@2454
    58
   A_REVERSE       Reverse video
yann@2454
    59
   A_BLINK         Blinking
yann@2454
    60
   A_DIM           Half bright
yann@2454
    61
   A_BOLD          Extra bright or bold
yann@2454
    62
   A_PROTECT       Protected mode
yann@2454
    63
   A_INVIS         Invisible or blank mode
yann@2454
    64
   A_ALTCHARSET    Alternate character set
yann@2454
    65
   A_CHARTEXT      Bit-mask to extract a character
yann@2454
    66
   COLOR_PAIR(n)   Color-pair number n
yann@2454
    67
   */
yann@2454
    68
static void normal_color_theme(void)
yann@2454
    69
{
yann@2454
    70
	/* automatically add color... */
yann@2454
    71
#define mkattr(name, attr) do { \
yann@2454
    72
attributes[name] = attr | COLOR_PAIR(name); } while (0)
yann@2454
    73
	mkattr(NORMAL, NORMAL);
yann@2454
    74
	mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
yann@2454
    75
yann@2454
    76
	mkattr(MAIN_MENU_FORE, A_REVERSE);
yann@2454
    77
	mkattr(MAIN_MENU_BACK, A_NORMAL);
yann@2454
    78
	mkattr(MAIN_MENU_GREY, A_NORMAL);
yann@2454
    79
	mkattr(MAIN_MENU_HEADING, A_BOLD);
yann@2454
    80
	mkattr(MAIN_MENU_BOX, A_NORMAL);
yann@2454
    81
yann@2454
    82
	mkattr(SCROLLWIN_TEXT, A_NORMAL);
yann@2454
    83
	mkattr(SCROLLWIN_HEADING, A_BOLD);
yann@2454
    84
	mkattr(SCROLLWIN_BOX, A_BOLD);
yann@2454
    85
yann@2454
    86
	mkattr(DIALOG_TEXT, A_BOLD);
yann@2454
    87
	mkattr(DIALOG_BOX, A_BOLD);
yann@2454
    88
	mkattr(DIALOG_MENU_FORE, A_STANDOUT);
yann@2454
    89
	mkattr(DIALOG_MENU_BACK, A_NORMAL);
yann@2454
    90
yann@2454
    91
	mkattr(INPUT_BOX, A_NORMAL);
yann@2454
    92
	mkattr(INPUT_HEADING, A_BOLD);
yann@2454
    93
	mkattr(INPUT_TEXT, A_NORMAL);
yann@2454
    94
	mkattr(INPUT_FIELD, A_UNDERLINE);
yann@2454
    95
yann@2454
    96
	mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
yann@2454
    97
	mkattr(FUNCTION_TEXT, A_REVERSE);
yann@2454
    98
}
yann@2454
    99
yann@2454
   100
static void no_colors_theme(void)
yann@2454
   101
{
yann@2454
   102
	/* automatically add highlight, no color */
yann@2454
   103
#define mkattrn(name, attr) { attributes[name] = attr; }
yann@2454
   104
yann@2454
   105
	mkattrn(NORMAL, NORMAL);
yann@2454
   106
	mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
yann@2454
   107
yann@2454
   108
	mkattrn(MAIN_MENU_FORE, A_STANDOUT);
yann@2454
   109
	mkattrn(MAIN_MENU_BACK, A_NORMAL);
yann@2454
   110
	mkattrn(MAIN_MENU_GREY, A_NORMAL);
yann@2454
   111
	mkattrn(MAIN_MENU_HEADING, A_BOLD);
yann@2454
   112
	mkattrn(MAIN_MENU_BOX, A_NORMAL);
yann@2454
   113
yann@2454
   114
	mkattrn(SCROLLWIN_TEXT, A_NORMAL);
yann@2454
   115
	mkattrn(SCROLLWIN_HEADING, A_BOLD);
yann@2454
   116
	mkattrn(SCROLLWIN_BOX, A_BOLD);
yann@2454
   117
yann@2454
   118
	mkattrn(DIALOG_TEXT, A_NORMAL);
yann@2454
   119
	mkattrn(DIALOG_BOX, A_BOLD);
yann@2454
   120
	mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
yann@2454
   121
	mkattrn(DIALOG_MENU_BACK, A_NORMAL);
yann@2454
   122
yann@2454
   123
	mkattrn(INPUT_BOX, A_BOLD);
yann@2454
   124
	mkattrn(INPUT_HEADING, A_BOLD);
yann@2454
   125
	mkattrn(INPUT_TEXT, A_NORMAL);
yann@2454
   126
	mkattrn(INPUT_FIELD, A_UNDERLINE);
yann@2454
   127
yann@2454
   128
	mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
yann@2454
   129
	mkattrn(FUNCTION_TEXT, A_REVERSE);
yann@2454
   130
}
yann@2454
   131
yann@2454
   132
void set_colors()
yann@2454
   133
{
yann@2454
   134
	start_color();
yann@2454
   135
	use_default_colors();
yann@2454
   136
	set_normal_colors();
yann@2454
   137
	if (has_colors()) {
yann@2454
   138
		normal_color_theme();
yann@2454
   139
	} else {
yann@2454
   140
		/* give defaults */
yann@2454
   141
		no_colors_theme();
yann@2454
   142
	}
yann@2454
   143
}
yann@2454
   144
yann@2454
   145
yann@2454
   146
/* this changes the windows attributes !!! */
yann@2454
   147
void print_in_middle(WINDOW *win,
yann@2454
   148
		int starty,
yann@2454
   149
		int startx,
yann@2454
   150
		int width,
yann@2454
   151
		const char *string,
yann@2454
   152
		chtype color)
yann@2454
   153
{      int length, x, y;
yann@2454
   154
	float temp;
yann@2454
   155
yann@2454
   156
yann@2454
   157
	if (win == NULL)
yann@2454
   158
		win = stdscr;
yann@2454
   159
	getyx(win, y, x);
yann@2454
   160
	if (startx != 0)
yann@2454
   161
		x = startx;
yann@2454
   162
	if (starty != 0)
yann@2454
   163
		y = starty;
yann@2454
   164
	if (width == 0)
yann@2454
   165
		width = 80;
yann@2454
   166
yann@2454
   167
	length = strlen(string);
yann@2454
   168
	temp = (width - length) / 2;
yann@2454
   169
	x = startx + (int)temp;
yann@2454
   170
	(void) wattrset(win, color);
yann@2454
   171
	mvwprintw(win, y, x, "%s", string);
yann@2454
   172
	refresh();
yann@2454
   173
}
yann@2454
   174
yann@2454
   175
int get_line_no(const char *text)
yann@2454
   176
{
yann@2454
   177
	int i;
yann@2454
   178
	int total = 1;
yann@2454
   179
yann@2454
   180
	if (!text)
yann@2454
   181
		return 0;
yann@2454
   182
yann@2454
   183
	for (i = 0; text[i] != '\0'; i++)
yann@2454
   184
		if (text[i] == '\n')
yann@2454
   185
			total++;
yann@2454
   186
	return total;
yann@2454
   187
}
yann@2454
   188
yann@2454
   189
const char *get_line(const char *text, int line_no)
yann@2454
   190
{
yann@2454
   191
	int i;
yann@2454
   192
	int lines = 0;
yann@2454
   193
yann@2454
   194
	if (!text)
yann@2454
   195
		return 0;
yann@2454
   196
yann@2454
   197
	for (i = 0; text[i] != '\0' && lines < line_no; i++)
yann@2454
   198
		if (text[i] == '\n')
yann@2454
   199
			lines++;
yann@2454
   200
	return text+i;
yann@2454
   201
}
yann@2454
   202
yann@2454
   203
int get_line_length(const char *line)
yann@2454
   204
{
yann@2454
   205
	int res = 0;
yann@2454
   206
	while (*line != '\0' && *line != '\n') {
yann@2454
   207
		line++;
yann@2454
   208
		res++;
yann@2454
   209
	}
yann@2454
   210
	return res;
yann@2454
   211
}
yann@2454
   212
yann@2454
   213
/* print all lines to the window. */
yann@2454
   214
void fill_window(WINDOW *win, const char *text)
yann@2454
   215
{
yann@2454
   216
	int x, y;
yann@2454
   217
	int total_lines = get_line_no(text);
yann@2454
   218
	int i;
yann@2454
   219
yann@2454
   220
	getmaxyx(win, y, x);
yann@2454
   221
	/* do not go over end of line */
yann@2454
   222
	total_lines = min(total_lines, y);
yann@2454
   223
	for (i = 0; i < total_lines; i++) {
yann@2454
   224
		char tmp[x+10];
yann@2454
   225
		const char *line = get_line(text, i);
yann@2454
   226
		int len = get_line_length(line);
yann@2454
   227
		strncpy(tmp, line, min(len, x));
yann@2454
   228
		tmp[len] = '\0';
yann@2454
   229
		mvwprintw(win, i, 0, "%s", tmp);
yann@2454
   230
	}
yann@2454
   231
}
yann@2454
   232
yann@2454
   233
/* get the message, and buttons.
yann@2454
   234
 * each button must be a char*
yann@2454
   235
 * return the selected button
yann@2454
   236
 *
yann@2454
   237
 * this dialog is used for 2 different things:
yann@2454
   238
 * 1) show a text box, no buttons.
yann@2454
   239
 * 2) show a dialog, with horizontal buttons
yann@2454
   240
 */
yann@2454
   241
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
yann@2454
   242
{
yann@2454
   243
	va_list ap;
yann@2454
   244
	char *btn;
yann@2454
   245
	int btns_width = 0;
yann@2454
   246
	int msg_lines = 0;
yann@2454
   247
	int msg_width = 0;
yann@2454
   248
	int total_width;
yann@2454
   249
	int win_rows = 0;
yann@2454
   250
	WINDOW *win;
yann@2454
   251
	WINDOW *msg_win;
yann@2454
   252
	WINDOW *menu_win;
yann@2454
   253
	MENU *menu;
yann@2454
   254
	ITEM *btns[btn_num+1];
yann@2454
   255
	int i, x, y;
yann@2454
   256
	int res = -1;
yann@2454
   257
yann@2454
   258
yann@2454
   259
	va_start(ap, btn_num);
yann@2454
   260
	for (i = 0; i < btn_num; i++) {
yann@2454
   261
		btn = va_arg(ap, char *);
yann@2454
   262
		btns[i] = new_item(btn, "");
yann@2454
   263
		btns_width += strlen(btn)+1;
yann@2454
   264
	}
yann@2454
   265
	va_end(ap);
yann@2454
   266
	btns[btn_num] = NULL;
yann@2454
   267
yann@2454
   268
	/* find the widest line of msg: */
yann@2454
   269
	msg_lines = get_line_no(msg);
yann@2454
   270
	for (i = 0; i < msg_lines; i++) {
yann@2454
   271
		const char *line = get_line(msg, i);
yann@2454
   272
		int len = get_line_length(line);
yann@2454
   273
		if (msg_width < len)
yann@2454
   274
			msg_width = len;
yann@2454
   275
	}
yann@2454
   276
yann@2454
   277
	total_width = max(msg_width, btns_width);
yann@2454
   278
	/* place dialog in middle of screen */
yann@2454
   279
	y = (LINES-(msg_lines+4))/2;
yann@2454
   280
	x = (COLS-(total_width+4))/2;
yann@2454
   281
yann@2454
   282
yann@2454
   283
	/* create the windows */
yann@2454
   284
	if (btn_num > 0)
yann@2454
   285
		win_rows = msg_lines+4;
yann@2454
   286
	else
yann@2454
   287
		win_rows = msg_lines+2;
yann@2454
   288
yann@2454
   289
	win = newwin(win_rows, total_width+4, y, x);
yann@2454
   290
	keypad(win, TRUE);
yann@2454
   291
	menu_win = derwin(win, 1, btns_width, win_rows-2,
yann@2454
   292
			1+(total_width+2-btns_width)/2);
yann@2454
   293
	menu = new_menu(btns);
yann@2454
   294
	msg_win = derwin(win, win_rows-2, msg_width, 1,
yann@2454
   295
			1+(total_width+2-msg_width)/2);
yann@2454
   296
yann@2454
   297
	set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
yann@2454
   298
	set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
yann@2454
   299
yann@2454
   300
	(void) wattrset(win, attributes[DIALOG_BOX]);
yann@2454
   301
	box(win, 0, 0);
yann@2454
   302
yann@2454
   303
	/* print message */
yann@2454
   304
	(void) wattrset(msg_win, attributes[DIALOG_TEXT]);
yann@2454
   305
	fill_window(msg_win, msg);
yann@2454
   306
yann@2454
   307
	set_menu_win(menu, win);
yann@2454
   308
	set_menu_sub(menu, menu_win);
yann@2454
   309
	set_menu_format(menu, 1, btn_num);
yann@2454
   310
	menu_opts_off(menu, O_SHOWDESC);
yann@2454
   311
	menu_opts_off(menu, O_SHOWMATCH);
yann@2454
   312
	menu_opts_on(menu, O_ONEVALUE);
yann@2454
   313
	menu_opts_on(menu, O_NONCYCLIC);
yann@2454
   314
	set_menu_mark(menu, "");
yann@2454
   315
	post_menu(menu);
yann@2454
   316
yann@2454
   317
yann@2454
   318
	touchwin(win);
yann@2454
   319
	refresh_all_windows(main_window);
yann@2454
   320
	while ((res = wgetch(win))) {
yann@2454
   321
		switch (res) {
yann@2454
   322
		case KEY_LEFT:
yann@2454
   323
			menu_driver(menu, REQ_LEFT_ITEM);
yann@2454
   324
			break;
yann@2454
   325
		case KEY_RIGHT:
yann@2454
   326
			menu_driver(menu, REQ_RIGHT_ITEM);
yann@2454
   327
			break;
yann@2454
   328
		case 10: /* ENTER */
yann@2454
   329
		case 27: /* ESCAPE */
yann@2454
   330
		case ' ':
yann@2454
   331
		case KEY_F(F_BACK):
yann@2454
   332
		case KEY_F(F_EXIT):
yann@2454
   333
			break;
yann@2454
   334
		}
yann@2454
   335
		touchwin(win);
yann@2454
   336
		refresh_all_windows(main_window);
yann@2454
   337
yann@2454
   338
		if (res == 10 || res == ' ') {
yann@2454
   339
			res = item_index(current_item(menu));
yann@2454
   340
			break;
yann@2454
   341
		} else if (res == 27 || res == KEY_F(F_BACK) ||
yann@2454
   342
				res == KEY_F(F_EXIT)) {
yann@2454
   343
			res = KEY_EXIT;
yann@2454
   344
			break;
yann@2454
   345
		}
yann@2454
   346
	}
yann@2454
   347
yann@2454
   348
	unpost_menu(menu);
yann@2454
   349
	free_menu(menu);
yann@2454
   350
	for (i = 0; i < btn_num; i++)
yann@2454
   351
		free_item(btns[i]);
yann@2454
   352
yann@2454
   353
	delwin(win);
yann@2454
   354
	return res;
yann@2454
   355
}
yann@2454
   356
yann@2454
   357
int dialog_inputbox(WINDOW *main_window,
yann@2454
   358
		const char *title, const char *prompt,
yann@2454
   359
		const char *init, char *result, int result_len)
yann@2454
   360
{
yann@2454
   361
	int prompt_lines = 0;
yann@2454
   362
	int prompt_width = 0;
yann@2454
   363
	WINDOW *win;
yann@2454
   364
	WINDOW *prompt_win;
yann@2454
   365
	WINDOW *form_win;
yann@2454
   366
	PANEL *panel;
yann@2454
   367
	int i, x, y;
yann@2454
   368
	int res = -1;
yann@2454
   369
	int cursor_position = strlen(init);
yann@2454
   370
yann@2454
   371
yann@2454
   372
	/* find the widest line of msg: */
yann@2454
   373
	prompt_lines = get_line_no(prompt);
yann@2454
   374
	for (i = 0; i < prompt_lines; i++) {
yann@2454
   375
		const char *line = get_line(prompt, i);
yann@2454
   376
		int len = get_line_length(line);
yann@2454
   377
		prompt_width = max(prompt_width, len);
yann@2454
   378
	}
yann@2454
   379
yann@2454
   380
	if (title)
yann@2454
   381
		prompt_width = max(prompt_width, strlen(title));
yann@2454
   382
yann@2454
   383
	/* place dialog in middle of screen */
yann@2454
   384
	y = (LINES-(prompt_lines+4))/2;
yann@2454
   385
	x = (COLS-(prompt_width+4))/2;
yann@2454
   386
yann@2454
   387
	strncpy(result, init, result_len);
yann@2454
   388
yann@2454
   389
	/* create the windows */
yann@2454
   390
	win = newwin(prompt_lines+6, prompt_width+7, y, x);
yann@2454
   391
	prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
yann@2454
   392
	form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
yann@2454
   393
	keypad(form_win, TRUE);
yann@2454
   394
yann@2454
   395
	(void) wattrset(form_win, attributes[INPUT_FIELD]);
yann@2454
   396
yann@2454
   397
	(void) wattrset(win, attributes[INPUT_BOX]);
yann@2454
   398
	box(win, 0, 0);
yann@2454
   399
	(void) wattrset(win, attributes[INPUT_HEADING]);
yann@2454
   400
	if (title)
yann@2454
   401
		mvwprintw(win, 0, 3, "%s", title);
yann@2454
   402
yann@2454
   403
	/* print message */
yann@2454
   404
	(void) wattrset(prompt_win, attributes[INPUT_TEXT]);
yann@2454
   405
	fill_window(prompt_win, prompt);
yann@2454
   406
yann@2454
   407
	mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
yann@2454
   408
	mvwprintw(form_win, 0, 0, "%s", result);
yann@2454
   409
yann@2454
   410
	/* create panels */
yann@2454
   411
	panel = new_panel(win);
yann@2454
   412
yann@2454
   413
	/* show the cursor */
yann@2454
   414
	curs_set(1);
yann@2454
   415
yann@2454
   416
	touchwin(win);
yann@2454
   417
	refresh_all_windows(main_window);
yann@2454
   418
	while ((res = wgetch(form_win))) {
yann@2454
   419
		int len = strlen(result);
yann@2454
   420
		switch (res) {
yann@2454
   421
		case 10: /* ENTER */
yann@2454
   422
		case 27: /* ESCAPE */
yann@2454
   423
		case KEY_F(F_HELP):
yann@2454
   424
		case KEY_F(F_EXIT):
yann@2454
   425
		case KEY_F(F_BACK):
yann@2454
   426
			break;
yann@2454
   427
		case 127:
yann@2454
   428
		case KEY_BACKSPACE:
yann@2454
   429
			if (cursor_position > 0) {
yann@2454
   430
				memmove(&result[cursor_position-1],
yann@2454
   431
						&result[cursor_position],
yann@2454
   432
						len-cursor_position+1);
yann@2454
   433
				cursor_position--;
yann@2454
   434
			}
yann@2454
   435
			break;
yann@2454
   436
		case KEY_DC:
yann@2454
   437
			if (cursor_position >= 0 && cursor_position < len) {
yann@2454
   438
				memmove(&result[cursor_position],
yann@2454
   439
						&result[cursor_position+1],
yann@2454
   440
						len-cursor_position+1);
yann@2454
   441
			}
yann@2454
   442
			break;
yann@2454
   443
		case KEY_UP:
yann@2454
   444
		case KEY_RIGHT:
yann@2454
   445
			if (cursor_position < len &&
yann@2454
   446
			    cursor_position < min(result_len, prompt_width))
yann@2454
   447
				cursor_position++;
yann@2454
   448
			break;
yann@2454
   449
		case KEY_DOWN:
yann@2454
   450
		case KEY_LEFT:
yann@2454
   451
			if (cursor_position > 0)
yann@2454
   452
				cursor_position--;
yann@2454
   453
			break;
yann@2454
   454
		default:
yann@2454
   455
			if ((isgraph(res) || isspace(res)) &&
yann@2454
   456
					len-2 < result_len) {
yann@2454
   457
				/* insert the char at the proper position */
yann@2454
   458
				memmove(&result[cursor_position+1],
yann@2454
   459
						&result[cursor_position],
yann@2454
   460
						len+1);
yann@2454
   461
				result[cursor_position] = res;
yann@2454
   462
				cursor_position++;
yann@2454
   463
			} else {
yann@2454
   464
				mvprintw(0, 0, "unknow key: %d\n", res);
yann@2454
   465
			}
yann@2454
   466
			break;
yann@2454
   467
		}
yann@2454
   468
		wmove(form_win, 0, 0);
yann@2454
   469
		wclrtoeol(form_win);
yann@2454
   470
		mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
yann@2454
   471
		mvwprintw(form_win, 0, 0, "%s", result);
yann@2454
   472
		wmove(form_win, 0, cursor_position);
yann@2454
   473
		touchwin(win);
yann@2454
   474
		refresh_all_windows(main_window);
yann@2454
   475
yann@2454
   476
		if (res == 10) {
yann@2454
   477
			res = 0;
yann@2454
   478
			break;
yann@2454
   479
		} else if (res == 27 || res == KEY_F(F_BACK) ||
yann@2454
   480
				res == KEY_F(F_EXIT)) {
yann@2454
   481
			res = KEY_EXIT;
yann@2454
   482
			break;
yann@2454
   483
		} else if (res == KEY_F(F_HELP)) {
yann@2454
   484
			res = 1;
yann@2454
   485
			break;
yann@2454
   486
		}
yann@2454
   487
	}
yann@2454
   488
yann@2454
   489
	/* hide the cursor */
yann@2454
   490
	curs_set(0);
yann@2454
   491
	del_panel(panel);
yann@2454
   492
	delwin(prompt_win);
yann@2454
   493
	delwin(form_win);
yann@2454
   494
	delwin(win);
yann@2454
   495
	return res;
yann@2454
   496
}
yann@2454
   497
yann@2454
   498
/* refresh all windows in the correct order */
yann@2454
   499
void refresh_all_windows(WINDOW *main_window)
yann@2454
   500
{
yann@2454
   501
	update_panels();
yann@2454
   502
	touchwin(main_window);
yann@2454
   503
	refresh();
yann@2454
   504
}
yann@2454
   505
yann@2454
   506
/* layman's scrollable window... */
yann@2454
   507
void show_scroll_win(WINDOW *main_window,
yann@2454
   508
		const char *title,
yann@2454
   509
		const char *text)
yann@2454
   510
{
yann@2454
   511
	int res;
yann@2454
   512
	int total_lines = get_line_no(text);
yann@2454
   513
	int x, y;
yann@2454
   514
	int start_x = 0, start_y = 0;
yann@2454
   515
	int text_lines = 0, text_cols = 0;
yann@2454
   516
	int total_cols = 0;
yann@2454
   517
	int win_cols = 0;
yann@2454
   518
	int win_lines = 0;
yann@2454
   519
	int i = 0;
yann@2454
   520
	WINDOW *win;
yann@2454
   521
	WINDOW *pad;
yann@2454
   522
	PANEL *panel;
yann@2454
   523
yann@2454
   524
	/* find the widest line of msg: */
yann@2454
   525
	total_lines = get_line_no(text);
yann@2454
   526
	for (i = 0; i < total_lines; i++) {
yann@2454
   527
		const char *line = get_line(text, i);
yann@2454
   528
		int len = get_line_length(line);
yann@2454
   529
		total_cols = max(total_cols, len+2);
yann@2454
   530
	}
yann@2454
   531
yann@2454
   532
	/* create the pad */
yann@2454
   533
	pad = newpad(total_lines+10, total_cols+10);
yann@2454
   534
	(void) wattrset(pad, attributes[SCROLLWIN_TEXT]);
yann@2454
   535
	fill_window(pad, text);
yann@2454
   536
yann@2454
   537
	win_lines = min(total_lines+4, LINES-2);
yann@2454
   538
	win_cols = min(total_cols+2, COLS-2);
yann@2454
   539
	text_lines = max(win_lines-4, 0);
yann@2454
   540
	text_cols = max(win_cols-2, 0);
yann@2454
   541
yann@2454
   542
	/* place window in middle of screen */
yann@2454
   543
	y = (LINES-win_lines)/2;
yann@2454
   544
	x = (COLS-win_cols)/2;
yann@2454
   545
yann@2454
   546
	win = newwin(win_lines, win_cols, y, x);
yann@2454
   547
	keypad(win, TRUE);
yann@2454
   548
	/* show the help in the help window, and show the help panel */
yann@2454
   549
	(void) wattrset(win, attributes[SCROLLWIN_BOX]);
yann@2454
   550
	box(win, 0, 0);
yann@2454
   551
	(void) wattrset(win, attributes[SCROLLWIN_HEADING]);
yann@2454
   552
	mvwprintw(win, 0, 3, " %s ", title);
yann@2454
   553
	panel = new_panel(win);
yann@2454
   554
yann@2454
   555
	/* handle scrolling */
yann@2454
   556
	do {
yann@2454
   557
yann@2454
   558
		copywin(pad, win, start_y, start_x, 2, 2, text_lines,
yann@2454
   559
				text_cols, 0);
yann@2454
   560
		print_in_middle(win,
yann@2454
   561
				text_lines+2,
yann@2454
   562
				0,
yann@2454
   563
				text_cols,
yann@2454
   564
				"<OK>",
yann@2454
   565
				attributes[DIALOG_MENU_FORE]);
yann@2454
   566
		wrefresh(win);
yann@2454
   567
yann@2454
   568
		res = wgetch(win);
yann@2454
   569
		switch (res) {
yann@2454
   570
		case KEY_NPAGE:
yann@2454
   571
		case ' ':
yann@2454
   572
			start_y += text_lines-2;
yann@2454
   573
			break;
yann@2454
   574
		case KEY_PPAGE:
yann@2454
   575
			start_y -= text_lines+2;
yann@2454
   576
			break;
yann@2454
   577
		case KEY_HOME:
yann@2454
   578
			start_y = 0;
yann@2454
   579
			break;
yann@2454
   580
		case KEY_END:
yann@2454
   581
			start_y = total_lines-text_lines;
yann@2454
   582
			break;
yann@2454
   583
		case KEY_DOWN:
yann@2454
   584
		case 'j':
yann@2454
   585
			start_y++;
yann@2454
   586
			break;
yann@2454
   587
		case KEY_UP:
yann@2454
   588
		case 'k':
yann@2454
   589
			start_y--;
yann@2454
   590
			break;
yann@2454
   591
		case KEY_LEFT:
yann@2454
   592
		case 'h':
yann@2454
   593
			start_x--;
yann@2454
   594
			break;
yann@2454
   595
		case KEY_RIGHT:
yann@2454
   596
		case 'l':
yann@2454
   597
			start_x++;
yann@2454
   598
			break;
yann@2454
   599
		}
yann@2454
   600
		if (res == 10 || res == 27 || res == 'q'
yann@2454
   601
		    || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) {
yann@2454
   602
			break;
yann@2454
   603
		}
yann@2454
   604
		if (start_y < 0)
yann@2454
   605
			start_y = 0;
yann@2454
   606
		if (start_y >= total_lines-text_lines)
yann@2454
   607
			start_y = total_lines-text_lines;
yann@2454
   608
		if (start_x < 0)
yann@2454
   609
			start_x = 0;
yann@2454
   610
		if (start_x >= total_cols-text_cols)
yann@2454
   611
			start_x = total_cols-text_cols;
yann@2454
   612
	} while (res);
yann@2454
   613
yann@2454
   614
	del_panel(panel);
yann@2454
   615
	delwin(win);
yann@2454
   616
	refresh_all_windows(main_window);
yann@2454
   617
}