kconfig/nconf.gui.c
author Cody P Schafer <dev@codyps.com>
Sun May 11 23:31:54 2014 +0200 (2014-05-11)
changeset 3319 283cebef7061
permissions -rw-r--r--
cc/gcc: add 4.9.0

Signed-off-by: Cody P Schafer <dev@codyps.com>
[yann.morin.1998@free.fr: latest is now a 4.9]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Message-Id: <5bac788539bb272893ed.1399801933@gun>
Patchwork-Id: 347774
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
}