Hi, On Mon, Aug 29, 2011 at 5:09 AM, Cheng Renquan <crquan@xxxxxxxxx> wrote: > bug fixes: > Please split diff in logical changes, one patch per issue. This is unreviewable in the current state. And please, use git. See `Documentation/SubmittingPatches' for further informations. Thanks, - Arnaud > 1) char dialog_input_result[256]; is not enough for config item like: > CONFIG_EXTRA_FIRMWARE="iwlwifi-100-5.ucode iwlwifi-1000-3.ucode > iwlwifi-3945-2.ucode iwlwifi-4965-2.ucode iwlwifi-5000-1.ucode > iwlwifi-5000-2.ucode iwlwifi-5150-2.ucode iwlwifi-6000-4.ucode > iwlwifi-6000g2a-5.ucode iwlwifi-6000g2b-5.ucode iwlwifi-6050-4.ucode > iwlwifi-6050-5.ucode radeon/CEDAR_me.bin radeon/CEDAR_pfp.bin > radeon/CEDAR_rlc.bin radeon/CYPRESS_me.bin radeon/CYPRESS_pfp.bin > radeon/CYPRESS_rlc.bin radeon/JUNIPER_me.bin radeon/JUNIPER_pfp.bin > radeon/JUNIPER_rlc.bin radeon/R600_rlc.bin radeon/R700_rlc.bin > radeon/REDWOOD_me.bin radeon/REDWOOD_pfp.bin radeon/REDWOOD_rlc.bin" > > the original nconf just stack overflow / crashed when dealing with > longer than 256 bytes strings; Since the original menuconfig also just > uses a fixed length buffer [MAX_LEN=2048] which works for the years, > here I just append a 0 make it work in the easiest way; if required, > it could also be changed to a dynamically allocated buffer; > > char dialog_input_result[MAX_LEN + 1]; > > 2) memmove's 3rd argument should be len-cursor_position+1, the > original len+1 may cause segment fault in theory; > memmove(&result[cursor_position+1], > &result[cursor_position], > - len+1); > + len-cursor_position+1); > > 3) typo: > > - mvprintw(0, 0, "unknow key: %d\n", res); > + mvprintw(0, 0, "unknown key: %d\n", res); > > > improvement: > 1) its original conf_string doesn't work with longer string values > (longer than its dialog box width), not at all > (or may work in an invisible way if anyone has tried that) > Here I added a new variable cursor_form_win to record that new state: > cursor of the input box; and make it fun: > when you move cursor to almost left/right edge, it auto adjust text > to center, by half prompt box width; > > 2) Remove KEY_UP as RIGHT and KEY_DOWN as LEFT, > Add Home/End to locate the string begin/end; > Emacs-like key bind (C-a/C-e as Home/End, C-f/C-b as forward/backward); > this keybind I'd like but may be controversial, it could be > discussed and separated; > > This is just [Request for Comments], it just works here on one of my > distributor kernels, > if anyone may think it's useful, please feedback and I would like to > split it into > patch series and rebase to linus latest branch; > > Thanks, > > --- /mnt/static/usr/src/linux-3.0-gentoo-r1/scripts/kconfig/nconf.c 2011-07-21 > 19:17:23.000000000 -0700 > +++ /mnt/dynamic/usr/src/linux-3.0-gentoo-r1/scripts/kconfig/nconf.c 2011-08-28 > 18:08:05.699883340 -0700 > @@ -1360,7 +1360,7 @@ static void conf_choice(struct menu *men > static void conf_string(struct menu *menu) > { > const char *prompt = menu_get_prompt(menu); > - char dialog_input_result[256]; > + char dialog_input_result[2560]; > > while (1) { > int res; > --- /mnt/static/usr/src/linux-3.0-gentoo-r1/scripts/kconfig/nconf.gui.c 2011-07-21 > 19:17:23.000000000 -0700 > +++ /mnt/dynamic/usr/src/linux-3.0-gentoo-r1/scripts/kconfig/nconf.gui.c 2011-08-28 > 18:00:56.441862565 -0700 > @@ -367,7 +367,15 @@ 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) +80 > result_len) { > + (void) attrset(attributes[FUNCTION_HIGHLIGHT] | A_BLINK); > + mvprintw(0, 0, "result_len(%d) not enough to contain > init_strlen(%d) in %s:%d:%s\n", > + result_len, strlen(init), > + __FILE__, __LINE__, __func__); > + flash(); > + } > > /* find the widest line of msg: */ > prompt_lines = get_line_no(prompt); > @@ -405,7 +413,11 @@ 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); > + mvprintw(0, 0, "cursor_position=%d, cursor_form_win=%d, prompt_width=%d\n", > + cursor_position, cursor_form_win, prompt_width); > > /* create panels */ > panel = new_panel(win); > @@ -416,6 +428,8 @@ int dialog_inputbox(WINDOW *main_window, > touchwin(win); > refresh_all_windows(main_window); > while ((res = wgetch(form_win))) { > + mvprintw(0, 0, "got key: %d\n", res); > + > int len = strlen(result); > switch (res) { > case 10: /* ENTER */ > @@ -431,6 +445,13 @@ int dialog_inputbox(WINDOW *main_window, > &result[cursor_position], > len-cursor_position+1); > cursor_position--; > + if (cursor_form_win < 5 > + && cursor_position > 5) > + cursor_form_win += prompt_width/2; > + else > + cursor_form_win--; > + if (cursor_form_win > cursor_position) > + cursor_form_win = cursor_position; > } > break; > case KEY_DC: > @@ -440,16 +461,41 @@ int dialog_inputbox(WINDOW *main_window, > len-cursor_position+1); > } > break; > - case KEY_UP: > + case 6: /* Ctrl-F */ > case KEY_RIGHT: > - if (cursor_position < len && > - cursor_position < min(result_len, prompt_width)) > + if (cursor_position < len) { > cursor_position++; > + if (cursor_form_win > prompt_width-5 > + && cursor_position < len-5) > + cursor_form_win -= prompt_width/2; > + else > + cursor_form_win++; > + if (cursor_form_win < min(cursor_position, prompt_width-1) - > (len-cursor_position)) > + cursor_form_win = min(cursor_position, prompt_width-1) - > (len-cursor_position); > + } > break; > - case KEY_DOWN: > + case 2: /* Ctrl-B */ > case KEY_LEFT: > - if (cursor_position > 0) > + if (cursor_position > 0) { > cursor_position--; > + if (cursor_form_win < 5 > + && cursor_position > 5) > + cursor_form_win += prompt_width/2; > + else > + cursor_form_win--; > + if (cursor_form_win > cursor_position) > + cursor_form_win = cursor_position; > + } > + break; > + case 1: /* Ctrl-A */ > + case KEY_HOME: > + cursor_position = 0; > + cursor_form_win = 0; > + break; > + case 5: /* Ctrl-E */ > + case KEY_END: > + cursor_position = len; > + cursor_form_win = min(cursor_position, prompt_width-1); > break; > default: > if ((isgraph(res) || isspace(res)) && > @@ -457,19 +503,24 @@ int dialog_inputbox(WINDOW *main_window, > /* 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++; > + if (cursor_form_win < prompt_width-1) > + cursor_form_win++; > } else { > - mvprintw(0, 0, "unknow key: %d\n", res); > + mvprintw(0, 0, "unknown key: %d\n", res); > } > break; > } > + mvprintw(0, 0, "got key: %d, cursor_position=%d, cursor_form_win=%d\n", > + res, cursor_position, cursor_form_win); > 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); > > > -- > Cheng Renquan (程任全) > -- > 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 > ��.n��������+%������w��{.n�����{��F���{ay�ʇڙ���f���h������_�(�階�ݢj"��������G����?���&��