kconfig: show number of search results in nconfig/menuconfig/xconfig
PATCH v2 1/1 kconfig: show number of search results in nconfig/menuconfig/xconfig
When searching for config symbols, the search results popup will now display a count of the results in the title bar, e.g. "Search Results (42)". This helps the user to gauge the number of matches quickly and refine their search if necessary, instead of having to scroll down by an indefinite amount (especially for nconfig's UI).
Signed-off-by Zuo An <[email protected]>
---
Changes in v2:
- Addressed Sashiko review concerns (thanks Julian!)
- Fixed window title overflow in nconfig when no results are found
v1: https://lore.kernel.org/linux-kbuild/[email protected]/
scripts/kconfig/lkc_proto.h | 2 +- scripts/kconfig/mconf.c | 11 +++++++++-- scripts/kconfig/nconf.c | 11 +++++++++-- scripts/kconfig/nconf.gui.c | 2 +- scripts/kconfig/qconf.cc | 2 +- scripts/kconfig/symbol.c | 4 +++- 6 files changed, 24 insertions(+), 8 deletions(-)
scripts/kconfig/lkc_proto.h +1 -1
@@ -21,7 +21,7 @@ bool conf_errors(void);struct symbol *sym_lookup (const char *name,int flags);struct symbol *sym_find (const char *name);void print_symbol_for_listconfig (struct symbol *sym); -struct symbol **sym_re_search (const char *pattern); +struct symbol **sym_re_search (const char *pattern,int *sym_cnt);const char *sym_type_name (enum symbol_type type);void sym_calc_value (struct symbol *sym);bool sym_dep_errors (void );
scripts/kconfig/mconf.c +9 -2
@@ -384,8 +384,10 @@ static void show_help(struct menu *menu)static void search_conf (void ) {struct symbol **sym_arr; +int sym_cnt =0 ;struct gstr res;struct gstr title; +struct gstr res_title;char *dialog_input;int dres, vscroll =0 , hscroll =0 ;bool again;
@@ -422,7 +424,7 @@ static void search_conf(void) stpart.text =str_get (&sttext);list_add_tail (&stpart.entries, &trail); - sym_arr =sym_re_search (dialog_input); + sym_arr =sym_re_search (dialog_input, &sym_cnt); do { LIST_HEAD(head); struct search_data data = {
@@ -433,9 +435,14 @@ static void search_conf(void) jump_key_char =0 ; res =get_relations_str (sym_arr, &head);set_subtitle (); - dres =show_textbox_ext ("Search Results" ,str_get (&res),0 ,0 , + + res_title =str_new (); +str_printf (&res_title,"Search Results (%d)" , sym_cnt); + dres =show_textbox_ext (str_get (&res_title),str_get (&res),0 ,0 , &vscroll, &hscroll, handle_search_keys, &data); +str_free (&res_title); + again = false;if (dres >='1' && dres <='9' ) {assert (data.target !=NULL );
scripts/kconfig/nconf.c +9 -2
@@ -700,8 +700,10 @@ static int do_exit(void)static void search_conf (void ) {struct symbol **sym_arr; +int sym_cnt =0 ;struct gstr res;struct gstr title; +struct gstr res_title;char *dialog_input;int dres, vscroll =0 , hscroll =0 ;bool again;
@@ -732,7 +734,7 @@ static void search_conf(void)if (strncasecmp (dialog_input_result,CONFIG_ ,strlen (CONFIG_ )) ==0 ) dialog_input +=strlen (CONFIG_ ); - sym_arr =sym_re_search (dialog_input); + sym_arr =sym_re_search (dialog_input, &sym_cnt); do { LIST_HEAD(head);
@@ -742,10 +744,15 @@ static void search_conf(void) }; jump_key_char =0 ; res =get_relations_str (sym_arr, &head); + + res_title =str_new (); +str_printf (&res_title,"Search Results (%d)" , sym_cnt); dres =show_scroll_win_ext (main_window, -"Search Results" ,str_get (&res), +str_get (&res_title),str_get (&res), &vscroll, &hscroll, handle_search_keys, &data); +str_free (&res_title); + again = false;if (dres >='1' && dres <='9' ) {assert (data.target !=NULL );
scripts/kconfig/nconf.gui.c +1 -1
@@ -523,7 +523,7 @@ int show_scroll_win_ext(WINDOW *main_window, const char *title, char *text,int x, y, lines, columns;int start_x =0 , start_y =0 ;int text_lines =0 , text_cols =0 ; -int total_cols =0 ; +int total_cols =get_line_length (title) +4 ;int win_cols =0 ;int win_lines =0 ;int i =0 ;
scripts/kconfig/qconf.cc +1 -1
@@ -1245,7 +1245,7 @@ void ConfigSearchWindow::search(void) list->clear(); info->clear(); - result = sym_re_search(editField->text().toLatin1()); + result = sym_re_search(editField->text().toLatin1(), nullptr); if (!result) return; for (p = result; *p; p++) {
scripts/kconfig/symbol.c +3 -1
@@ -1020,7 +1020,7 @@ static int sym_rel_comp(const void *sym1, const void *sym2)return strcmp (s1->sym->name, s2->sym->name); } -struct symbol **sym_re_search (const char *pattern) +struct symbol **sym_re_search (const char *pattern,int *sym_cnt) {struct symbol *sym, **sym_arr =NULL ;struct sym_match *sym_match_arr =NULL ;
@@ -1065,6 +1065,8 @@ struct symbol **sym_re_search(const char *pattern) sym_arr[i] = sym_match_arr[i].sym; sym_arr[cnt] =NULL ; } +if (sym_cnt) + *sym_cnt = cnt; sym_re_search_free:/* sym_match_arr can be NULL if no match, but free(NULL) is OK */ free (sym_match_arr);
Signature · 1 line
2.56.0