[PATCH] kconfig: fix restart for choice symbols
Roman Zippel [Wed, 9 Nov 2005 05:34:48 +0000 (21:34 -0800)]
The restart check whether new symbols became visible, didn't always work for
choice symbols.  Even if a choice symbol itself isn't changable, the childs
are.  This also requires to update the new status of all choice values, once
one of them is set.

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

scripts/kconfig/conf.c
scripts/kconfig/symbol.c

index bc20cab..dffbf2e 100644 (file)
@@ -467,15 +467,14 @@ static void check_conf(struct menu *menu)
                return;
 
        sym = menu->sym;
-       if (sym) {
-               if (sym_is_changable(sym) && !sym_has_value(sym)) {
+       if (sym && !sym_has_value(sym)) {
+               if (sym_is_changable(sym) ||
+                   (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
                        if (!conf_cnt++)
                                printf(_("*\n* Restart config...\n*\n"));
                        rootEntry = menu_get_parent_menu(menu);
                        conf(rootEntry);
                }
-               if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
-                       return;
        }
 
        for (child = menu->list; child; child = child->next)
index 10d96c4..29bff43 100644 (file)
@@ -380,11 +380,22 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val)
                sym->flags &= ~SYMBOL_NEW;
                sym_set_changed(sym);
        }
+       /*
+        * setting a choice value also resets the new flag of the choice
+        * symbol and all other choice values.
+        */
        if (sym_is_choice_value(sym) && val == yes) {
                struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+               struct property *prop;
+               struct expr *e;
 
                cs->user.val = sym;
                cs->flags &= ~SYMBOL_NEW;
+               prop = sym_get_choice_prop(cs);
+               for (e = prop->expr; e; e = e->left.expr) {
+                       if (e->right.sym->visible != no)
+                               e->right.sym->flags &= ~SYMBOL_NEW;
+               }
        }
 
        sym->user.tri = val;