Re: [PATCH] kconfig: menuconfig: Make hidden options show as dim

From: Masahiro Yamada
Date: Thu Dec 28 2023 - 11:10:45 EST


On Thu, Dec 28, 2023 at 2:46 PM Tomasz Figa <tfiga@xxxxxxxxxxxx> wrote:
>
> When hidden options are toggled on (using 'z'), the number of options
> on the screen can be overwhelming and may make it hard to distinguish
> between available and hidden ones. Make them easier to distinguish by
> displaying the hidden one as dim (using the A_DIM curses attribute).
>
> Signed-off-by: Tomasz Figa <tfiga@xxxxxxxxxxxx>



Do you think this is useful?

This changes the color only when you select a hidden item.


For unselected items, you cannot distinguish hidden ones,
as A_DIM has no effect to black text.









> ---
> scripts/kconfig/lxdialog/dialog.h | 3 +++
> scripts/kconfig/lxdialog/menubox.c | 11 +++++++----
> scripts/kconfig/lxdialog/util.c | 10 ++++++++++
> scripts/kconfig/mconf.c | 18 ++++++++++++++++++
> 4 files changed, 38 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h
> index a501abf9fa31..d2ebdc6e2e28 100644
> --- a/scripts/kconfig/lxdialog/dialog.h
> +++ b/scripts/kconfig/lxdialog/dialog.h
> @@ -128,6 +128,7 @@ void item_add_str(const char *fmt, ...);
> void item_set_tag(char tag);
> void item_set_data(void *p);
> void item_set_selected(int val);
> +void item_set_hidden(int val);
> int item_activate_selected(void);
> void *item_data(void);
> char item_tag(void);
> @@ -139,6 +140,7 @@ struct dialog_item {
> char tag;
> void *data; /* pointer to menu item - used by menubox+checklist */
> int selected; /* Set to 1 by dialog_*() function if selected. */
> + int hidden; /* Set to 1 if hidden. */
> };
>
> /* list of lialog_items */
> @@ -157,6 +159,7 @@ int item_n(void);
> const char *item_str(void);
> int item_is_selected(void);
> int item_is_tag(char tag);
> +int item_is_hidden(void);
> #define item_foreach() \
> for (item_cur = item_head ? item_head: item_cur; \
> item_cur && (item_cur != &item_nil); item_cur = item_cur->next)
> diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
> index 0e333284e947..2cf1f24f67b6 100644
> --- a/scripts/kconfig/lxdialog/menubox.c
> +++ b/scripts/kconfig/lxdialog/menubox.c
> @@ -51,9 +51,9 @@ static int menu_width, item_x;
> * Print menu item
> */
> static void do_print_item(WINDOW * win, const char *item, int line_y,
> - int selected, int hotkey)
> + int selected, int hotkey, int hidden)
> {
> - int j;
> + int j, attrs;
> char *menu_item = malloc(menu_width + 1);
>
> strncpy(menu_item, item, menu_width - item_x);
> @@ -64,7 +64,10 @@ static void do_print_item(WINDOW * win, const char *item, int line_y,
> wattrset(win, dlg.menubox.atr);
> wmove(win, line_y, 0);
> wclrtoeol(win);
> - wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
> + attrs = selected ? dlg.item_selected.atr : dlg.item.atr;
> + if (hidden)
> + attrs |= A_DIM;
> + wattrset(win, attrs);
> mvwaddstr(win, line_y, item_x, menu_item);
> if (hotkey) {
> wattrset(win, selected ? dlg.tag_key_selected.atr
> @@ -81,7 +84,7 @@ static void do_print_item(WINDOW * win, const char *item, int line_y,
> #define print_item(index, choice, selected) \
> do { \
> item_set(index); \
> - do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \
> + do_print_item(menu, item_str(), choice, selected, !item_is_tag(':'), item_is_hidden()); \
> } while (0)
>
> /*
> diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c
> index 3f78fb265136..58d6ee96f7ec 100644
> --- a/scripts/kconfig/lxdialog/util.c
> +++ b/scripts/kconfig/lxdialog/util.c
> @@ -635,6 +635,11 @@ void item_set_selected(int val)
> item_cur->node.selected = val;
> }
>
> +void item_set_hidden(int val)
> +{
> + item_cur->node.hidden = val;
> +}
> +
> int item_activate_selected(void)
> {
> item_foreach()
> @@ -698,3 +703,8 @@ int item_is_tag(char tag)
> {
> return (item_cur->node.tag == tag);
> }
> +
> +int item_is_hidden(void)
> +{
> + return (item_cur->node.hidden != 0);
> +}
> diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
> index eccc87a441e7..090121a1e5b6 100644
> --- a/scripts/kconfig/mconf.c
> +++ b/scripts/kconfig/mconf.c
> @@ -539,6 +539,8 @@ static void build_conf(struct menu *menu)
> menu_is_empty(menu) ? "----" : "--->");
> item_set_tag('m');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> if (single_menu_mode && menu->data)
> goto conf_childs;
> return;
> @@ -548,6 +550,8 @@ static void build_conf(struct menu *menu)
> item_make(" %*c*** %s ***", indent + 1, ' ', prompt);
> item_set_tag(':');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> }
> break;
> default:
> @@ -556,6 +560,8 @@ static void build_conf(struct menu *menu)
> item_make("---%*c%s", indent + 1, ' ', prompt);
> item_set_tag(':');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> }
> }
> } else
> @@ -591,10 +597,14 @@ static void build_conf(struct menu *menu)
> }
> item_set_tag('t');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> } else {
> item_make(" ");
> item_set_tag(def_menu ? 't' : ':');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> }
>
> item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
> @@ -615,6 +625,8 @@ static void build_conf(struct menu *menu)
> item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
> item_set_tag(':');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> goto conf_childs;
> }
> child_count++;
> @@ -632,6 +644,8 @@ static void build_conf(struct menu *menu)
> item_make("-%c-", val == no ? ' ' : '*');
> item_set_tag('t');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> break;
> case S_TRISTATE:
> switch (val) {
> @@ -648,6 +662,8 @@ static void build_conf(struct menu *menu)
> item_make("-%c-", ch);
> item_set_tag('t');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> break;
> default:
> tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
> @@ -660,6 +676,8 @@ static void build_conf(struct menu *menu)
> "" : " (NEW)");
> item_set_tag('s');
> item_set_data(menu);
> + if (!visible)
> + item_set_hidden(TRUE);
> goto conf_childs;
> }
> }
> --
> 2.43.0.472.g3155946c3a-goog
>
>


--
Best Regards
Masahiro Yamada