Re: [PATCH 4/5] scripts/kconfig/nconf: fix editing long strings |
|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Hi,
On Mon, Aug 29, 2011 at 7:56 PM, Cheng Renquan <crquan@xxxxxxxxx> wrote:
> 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];
> keep the original cursor_position as cursor of the string result,
> for short strings, cursor_form_win is identical to cursor_position;
> for long strings, use (cursor_position-cursor_form_win) as begin offset
> to show part of the string in form_win;
>
> 2) whenever cursor of form_win is near (by 3 chars) to left or right edge
> of form_win, make a auto scroll by half prompt_width, to make this one
> line string editor more fun to use;
>
I am not a huge fan of this behavior, it seems a bit chaotic and
unnatural to me.
menuconfig's (partial) support of long string seem more stable. When
you erase a long string, the cursor move left. When you end up on the
edge, the window slide left fully, which let you see either a full
window again, or the beginning of the string. Unfortunately, you
cannot scroll within the string, but I would expect that when you
reach the right of the window, and continue typing, to see the window
moves right, without this "come back" effect.
Beside that, I agree, it's a huge improvement :)
- Arnaud
> 3) update len for later cursor_form_win correct calculation;
>
> Signed-off-by: Cheng Renquan <crquan@xxxxxxxxx>
> ---
> scripts/kconfig/nconf.gui.c | 43 +++++++++++++++++++++++++++++++++++++------
> 1 files changed, 37 insertions(+), 6 deletions(-)
>
> diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c
> index bc482ad..62a41d1 100644
> --- a/scripts/kconfig/nconf.gui.c
> +++ b/scripts/kconfig/nconf.gui.c
> @@ -367,6 +367,7 @@ int dialog_inputbox(WINDOW *main_window,
> int i, x, y;
> int res = -1;
> int cursor_position = strlen(init);
> + int cursor_form_win;
>
> if (strlen(init) > *result_len) {
> do {
> @@ -413,7 +414,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);
> @@ -439,6 +442,8 @@ int dialog_inputbox(WINDOW *main_window,
> &result[cursor_position],
> len-cursor_position+1);
> cursor_position--;
> + cursor_form_win--;
> + len--;
> }
> break;
> case KEY_DC:
> @@ -446,18 +451,22 @@ 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;
> default:
> if ((isgraph(res) || isspace(res))) {
> @@ -475,16 +484,38 @@ int dialog_inputbox(WINDOW *main_window,
> len-cursor_position+1);
> result[cursor_position] = res;
> cursor_position++;
> + cursor_form_win++;
> + len++;
> } else {
> mvprintw(0, 0, "unknown key: %d\n", res);
> }
> break;
> }
> + if (len <= prompt_width-1)
> + cursor_form_win = cursor_position;
> + else {
> + if (cursor_form_win <= 3)
> + cursor_form_win += prompt_width/2;
> + else if (cursor_form_win >= prompt_width-3)
> + cursor_form_win -= prompt_width/2;
> +
> + if (cursor_form_win < 0)
> + cursor_form_win = 0;
> + else if (cursor_form_win >= prompt_width-1)
> + cursor_form_win = prompt_width-1;
> +
> + if (cursor_form_win > cursor_position)
> + cursor_form_win = cursor_position;
> + if (cursor_form_win < (prompt_width-1) - (len-cursor_position))
> + cursor_form_win = (prompt_width-1) - (len-cursor_position);
> + }
> +
> 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);
>
> --
> 1.7.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Linux Media]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]