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