diff options
author | Cheng Renquan <crquan@gmail.com> | 2011-09-01 13:52:21 -0400 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2011-09-09 08:40:08 -0400 |
commit | e631a57a19e103c3bb59495b236634ec62e2a850 (patch) | |
tree | abcd76bf12c0ea7d6a34f16a0d1b874411d4d827 /scripts | |
parent | 5ea9f64ffc073bf2882f6aa83b0dad3609b1e67a (diff) |
scripts/kconfig/nconf: fix editing long strings
The original dialog_inputbox doesn't work with longer than prompt_width
strings, here fixed it in this way:
1) add variable cursor_form_win to record cursor of form_win,
keep its value always between [0, prompt_width-1];
reuse the original cursor_position as cursor of the string result,
use (cursor_position-cursor_form_win) as begin offset to show part of
the string in form_win;
Signed-off-by: Cheng Renquan <crquan@gmail.com>
Cc: Arnaud Lacombe <lacombar@gmail.com>
Cc: Nir Tzachar <nir.tzachar@gmail.com>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/kconfig/nconf.gui.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c index d64bc1c24c20..4b9d8b66087d 100644 --- a/scripts/kconfig/nconf.gui.c +++ b/scripts/kconfig/nconf.gui.c | |||
@@ -367,6 +367,7 @@ int dialog_inputbox(WINDOW *main_window, | |||
367 | int i, x, y; | 367 | int i, x, y; |
368 | int res = -1; | 368 | int res = -1; |
369 | int cursor_position = strlen(init); | 369 | int cursor_position = strlen(init); |
370 | int cursor_form_win; | ||
370 | char *result = *resultp; | 371 | char *result = *resultp; |
371 | 372 | ||
372 | if (strlen(init)+1 > *result_len) { | 373 | if (strlen(init)+1 > *result_len) { |
@@ -410,7 +411,9 @@ int dialog_inputbox(WINDOW *main_window, | |||
410 | fill_window(prompt_win, prompt); | 411 | fill_window(prompt_win, prompt); |
411 | 412 | ||
412 | mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); | 413 | mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); |
413 | mvwprintw(form_win, 0, 0, "%s", result); | 414 | cursor_form_win = min(cursor_position, prompt_width-1); |
415 | mvwprintw(form_win, 0, 0, "%s", | ||
416 | result + cursor_position-cursor_form_win); | ||
414 | 417 | ||
415 | /* create panels */ | 418 | /* create panels */ |
416 | panel = new_panel(win); | 419 | panel = new_panel(win); |
@@ -436,6 +439,8 @@ int dialog_inputbox(WINDOW *main_window, | |||
436 | &result[cursor_position], | 439 | &result[cursor_position], |
437 | len-cursor_position+1); | 440 | len-cursor_position+1); |
438 | cursor_position--; | 441 | cursor_position--; |
442 | cursor_form_win--; | ||
443 | len--; | ||
439 | } | 444 | } |
440 | break; | 445 | break; |
441 | case KEY_DC: | 446 | case KEY_DC: |
@@ -443,18 +448,22 @@ int dialog_inputbox(WINDOW *main_window, | |||
443 | memmove(&result[cursor_position], | 448 | memmove(&result[cursor_position], |
444 | &result[cursor_position+1], | 449 | &result[cursor_position+1], |
445 | len-cursor_position+1); | 450 | len-cursor_position+1); |
451 | len--; | ||
446 | } | 452 | } |
447 | break; | 453 | break; |
448 | case KEY_UP: | 454 | case KEY_UP: |
449 | case KEY_RIGHT: | 455 | case KEY_RIGHT: |
450 | if (cursor_position < len && | 456 | if (cursor_position < len) { |
451 | cursor_position < min(*result_len, prompt_width)) | ||
452 | cursor_position++; | 457 | cursor_position++; |
458 | cursor_form_win++; | ||
459 | } | ||
453 | break; | 460 | break; |
454 | case KEY_DOWN: | 461 | case KEY_DOWN: |
455 | case KEY_LEFT: | 462 | case KEY_LEFT: |
456 | if (cursor_position > 0) | 463 | if (cursor_position > 0) { |
457 | cursor_position--; | 464 | cursor_position--; |
465 | cursor_form_win--; | ||
466 | } | ||
458 | break; | 467 | break; |
459 | default: | 468 | default: |
460 | if ((isgraph(res) || isspace(res))) { | 469 | if ((isgraph(res) || isspace(res))) { |
@@ -470,16 +479,24 @@ int dialog_inputbox(WINDOW *main_window, | |||
470 | len-cursor_position+1); | 479 | len-cursor_position+1); |
471 | result[cursor_position] = res; | 480 | result[cursor_position] = res; |
472 | cursor_position++; | 481 | cursor_position++; |
482 | cursor_form_win++; | ||
483 | len++; | ||
473 | } else { | 484 | } else { |
474 | mvprintw(0, 0, "unknown key: %d\n", res); | 485 | mvprintw(0, 0, "unknown key: %d\n", res); |
475 | } | 486 | } |
476 | break; | 487 | break; |
477 | } | 488 | } |
489 | if (cursor_form_win < 0) | ||
490 | cursor_form_win = 0; | ||
491 | else if (cursor_form_win > prompt_width-1) | ||
492 | cursor_form_win = prompt_width-1; | ||
493 | |||
478 | wmove(form_win, 0, 0); | 494 | wmove(form_win, 0, 0); |
479 | wclrtoeol(form_win); | 495 | wclrtoeol(form_win); |
480 | mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); | 496 | mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); |
481 | mvwprintw(form_win, 0, 0, "%s", result); | 497 | mvwprintw(form_win, 0, 0, "%s", |
482 | wmove(form_win, 0, cursor_position); | 498 | result + cursor_position-cursor_form_win); |
499 | wmove(form_win, 0, cursor_form_win); | ||
483 | touchwin(win); | 500 | touchwin(win); |
484 | refresh_all_windows(main_window); | 501 | refresh_all_windows(main_window); |
485 | 502 | ||