diff options
Diffstat (limited to 'scripts/kconfig/nconf.gui.c')
| -rw-r--r-- | scripts/kconfig/nconf.gui.c | 89 | 
1 files changed, 64 insertions, 25 deletions
diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c index f8137b3a538..8275f0e5510 100644 --- a/scripts/kconfig/nconf.gui.c +++ b/scripts/kconfig/nconf.gui.c @@ -48,7 +48,7 @@ static void set_normal_colors(void)  	init_pair(INPUT_FIELD, -1, -1);  	init_pair(FUNCTION_HIGHLIGHT, -1, -1); -	init_pair(FUNCTION_TEXT, COLOR_BLUE, -1); +	init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1);  }  /* available attributes: @@ -276,8 +276,8 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)  	total_width = max(msg_width, btns_width);  	/* place dialog in middle of screen */ -	y = (LINES-(msg_lines+4))/2; -	x = (COLS-(total_width+4))/2; +	y = (getmaxy(stdscr)-(msg_lines+4))/2; +	x = (getmaxx(stdscr)-(total_width+4))/2;  	/* create the windows */ @@ -356,7 +356,7 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)  int dialog_inputbox(WINDOW *main_window,  		const char *title, const char *prompt, -		const char *init, char *result, int result_len) +		const char *init, char **resultp, int *result_len)  {  	int prompt_lines = 0;  	int prompt_width = 0; @@ -367,7 +367,13 @@ int dialog_inputbox(WINDOW *main_window,  	int i, x, y;  	int res = -1;  	int cursor_position = strlen(init); +	int cursor_form_win; +	char *result = *resultp; +	if (strlen(init)+1 > *result_len) { +		*result_len = strlen(init)+1; +		*resultp = result = realloc(result, *result_len); +	}  	/* find the widest line of msg: */  	prompt_lines = get_line_no(prompt); @@ -381,10 +387,10 @@ int dialog_inputbox(WINDOW *main_window,  		prompt_width = max(prompt_width, strlen(title));  	/* place dialog in middle of screen */ -	y = (LINES-(prompt_lines+4))/2; -	x = (COLS-(prompt_width+4))/2; +	y = (getmaxy(stdscr)-(prompt_lines+4))/2; +	x = (getmaxx(stdscr)-(prompt_width+4))/2; -	strncpy(result, init, result_len); +	strncpy(result, init, *result_len);  	/* create the windows */  	win = newwin(prompt_lines+6, prompt_width+7, y, x); @@ -405,7 +411,9 @@ int dialog_inputbox(WINDOW *main_window,  	fill_window(prompt_win, prompt);  	mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); -	mvwprintw(form_win, 0, 0, "%s", result); +	cursor_form_win = min(cursor_position, prompt_width-1); +	mvwprintw(form_win, 0, 0, "%s", +		  result + cursor_position-cursor_form_win);  	/* create panels */  	panel = new_panel(win); @@ -431,6 +439,8 @@ int dialog_inputbox(WINDOW *main_window,  						&result[cursor_position],  						len-cursor_position+1);  				cursor_position--; +				cursor_form_win--; +				len--;  			}  			break;  		case KEY_DC: @@ -438,38 +448,63 @@ int dialog_inputbox(WINDOW *main_window,  				memmove(&result[cursor_position],  						&result[cursor_position+1],  						len-cursor_position+1); +				len--;  			}  			break;  		case KEY_UP:  		case KEY_RIGHT: -			if (cursor_position < len && -			    cursor_position < min(result_len, prompt_width)) +			if (cursor_position < len) {  				cursor_position++; +				cursor_form_win++; +			}  			break;  		case KEY_DOWN:  		case KEY_LEFT: -			if (cursor_position > 0) +			if (cursor_position > 0) {  				cursor_position--; +				cursor_form_win--; +			} +			break; +		case KEY_HOME: +			cursor_position = 0; +			cursor_form_win = 0; +			break; +		case KEY_END: +			cursor_position = len; +			cursor_form_win = min(cursor_position, prompt_width-1);  			break;  		default: -			if ((isgraph(res) || isspace(res)) && -					len-2 < result_len) { +			if ((isgraph(res) || isspace(res))) { +				/* one for new char, one for '\0' */ +				if (len+2 > *result_len) { +					*result_len = len+2; +					*resultp = result = realloc(result, +								*result_len); +				}  				/* insert the char at the proper position */  				memmove(&result[cursor_position+1],  						&result[cursor_position], -						len+1); +						len-cursor_position+1);  				result[cursor_position] = res;  				cursor_position++; +				cursor_form_win++; +				len++;  			} else { -				mvprintw(0, 0, "unknow key: %d\n", res); +				mvprintw(0, 0, "unknown key: %d\n", res);  			}  			break;  		} +		if (cursor_form_win < 0) +			cursor_form_win = 0; +		else if (cursor_form_win > prompt_width-1) +			cursor_form_win = prompt_width-1; +  		wmove(form_win, 0, 0);  		wclrtoeol(form_win);  		mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); -		mvwprintw(form_win, 0, 0, "%s", result); -		wmove(form_win, 0, cursor_position); +		mvwprintw(form_win, 0, 0, "%s", +			result + cursor_position-cursor_form_win); +		wmove(form_win, 0, cursor_form_win);  		touchwin(win);  		refresh_all_windows(main_window); @@ -510,7 +545,7 @@ void show_scroll_win(WINDOW *main_window,  {  	int res;  	int total_lines = get_line_no(text); -	int x, y; +	int x, y, lines, columns;  	int start_x = 0, start_y = 0;  	int text_lines = 0, text_cols = 0;  	int total_cols = 0; @@ -521,6 +556,8 @@ void show_scroll_win(WINDOW *main_window,  	WINDOW *pad;  	PANEL *panel; +	getmaxyx(stdscr, lines, columns); +  	/* find the widest line of msg: */  	total_lines = get_line_no(text);  	for (i = 0; i < total_lines; i++) { @@ -534,14 +571,14 @@ void show_scroll_win(WINDOW *main_window,  	(void) wattrset(pad, attributes[SCROLLWIN_TEXT]);  	fill_window(pad, text); -	win_lines = min(total_lines+4, LINES-2); -	win_cols = min(total_cols+2, COLS-2); +	win_lines = min(total_lines+4, lines-2); +	win_cols = min(total_cols+2, columns-2);  	text_lines = max(win_lines-4, 0);  	text_cols = max(win_cols-2, 0);  	/* place window in middle of screen */ -	y = (LINES-win_lines)/2; -	x = (COLS-win_cols)/2; +	y = (lines-win_lines)/2; +	x = (columns-win_cols)/2;  	win = newwin(win_lines, win_cols, y, x);  	keypad(win, TRUE); @@ -569,9 +606,11 @@ void show_scroll_win(WINDOW *main_window,  		switch (res) {  		case KEY_NPAGE:  		case ' ': +		case 'd':  			start_y += text_lines-2;  			break;  		case KEY_PPAGE: +		case 'u':  			start_y -= text_lines+2;  			break;  		case KEY_HOME: @@ -597,10 +636,10 @@ void show_scroll_win(WINDOW *main_window,  			start_x++;  			break;  		} -		if (res == 10 || res == 27 || res == 'q' -		    || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { +		if (res == 10 || res == 27 || res == 'q' || +			res == KEY_F(F_HELP) || res == KEY_F(F_BACK) || +			res == KEY_F(F_EXIT))  			break; -		}  		if (start_y < 0)  			start_y = 0;  		if (start_y >= total_lines-text_lines)  | 
