Message ID | 1314662164-8565-4-git-send-email-crquan@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Mon, Aug 29, 2011 at 7:56 PM, Cheng Renquan <crquan@gmail.com> 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@gmail.com> > --- > 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@vger.kernel.org > 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello. On Tue, Aug 30, 2011 at 7:59 AM, Arnaud Lacombe <lacombar@gmail.com> wrote: > Hi, > > On Mon, Aug 29, 2011 at 7:56 PM, Cheng Renquan <crquan@gmail.com> 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. I agree with Arnaud. Jumping the line is chaotic. I believe that scrolling the string view one character left (or right)-wise is a better solution. > 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@gmail.com> >> --- >> 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@vger.kernel.org >> 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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);
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; 3) update len for later cursor_form_win correct calculation; Signed-off-by: Cheng Renquan <crquan@gmail.com> --- scripts/kconfig/nconf.gui.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 37 insertions(+), 6 deletions(-)