diff options
author | Masahiro Yamada <masahiroy@kernel.org> | 2024-10-27 02:55:50 +0900 |
---|---|---|
committer | Masahiro Yamada <masahiroy@kernel.org> | 2024-10-31 21:42:20 +0900 |
commit | d01661e1f422f071279417c6a21d9d7989844d25 (patch) | |
tree | 708c83d409bbc5a4d4dcf6591bbfead7dbd8c170 | |
parent | 2ad7126c5190864e928154ef74e0ae6cbdcea783 (diff) | |
download | linux-stable-d01661e1f422f071279417c6a21d9d7989844d25.tar.gz linux-stable-d01661e1f422f071279417c6a21d9d7989844d25.tar.bz2 linux-stable-d01661e1f422f071279417c6a21d9d7989844d25.zip |
kconfig: show sub-menu entries even if the prompt is hidden
Since commit f79dc03fe68c ("kconfig: refactor choice value
calculation"), when EXPERT is disabled, nothing within the "if INPUT"
... "endif" block in drivers/input/Kconfig is displayed. This issue
affects all command-line interfaces and GUI frontends.
The prompt for INPUT is hidden when EXPERT is disabled. Previously,
menu_is_visible() returned true in this case; however, it now returns
false, resulting in all sub-menu entries being skipped.
Here is a simplified test case illustrating the issue:
config A
bool "A" if X
default y
config B
bool "B"
depends on A
When X is disabled, A becomes unconfigurable and is forced to y.
B should be displayed, as its dependency is met.
This commit restores the necessary code, so menu_is_visible() functions
as it did previously.
Fixes: f79dc03fe68c ("kconfig: refactor choice value calculation")
Reported-by: Edmund Raile <edmund.raile@proton.me>
Closes: https://lore.kernel.org/all/5fd0dfc7ff171aa74352e638c276069a5f2e888d.camel@proton.me/
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
-rw-r--r-- | scripts/kconfig/menu.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 4addd33749bb..6587ac86d0d5 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -533,6 +533,7 @@ bool menu_is_empty(struct menu *menu) bool menu_is_visible(struct menu *menu) { + struct menu *child; struct symbol *sym; tristate visible; @@ -551,7 +552,17 @@ bool menu_is_visible(struct menu *menu) } else visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); - return visible != no; + if (visible != no) + return true; + + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) + if (menu_is_visible(child)) + return true; + + return false; } const char *menu_get_prompt(const struct menu *menu) |