From b321429325e4c911c379a5bf4156c9fc9713e425 Mon Sep 17 00:00:00 2001 From: Karsten Wiese Date: Wed, 13 Dec 2006 00:34:06 -0800 Subject: [PATCH] kconfig: new function "bool conf_get_changed(void)" Run "make xconfig" on a freshly untarred kernel-tree. Look at the floppy disk icon of the qt application, that has just started: Its in a normal, active state. Mouse click on it: .config is being saved. This patch series changes things so taht after the mouse click on the floppy disk icon, the icon is greyed out. If you mouse click on it now, nothing happens. If you change some CONFIG_*, the floppy disk icon returns to "active state", that is, if you mouse click it now, .config is written. This patch: Returns sym_change_count to reflect the .config's change state. All read only accesses of sym_change_count are replaced by calls to conf_get_changed() . mconfig.c is manipulated to ask for saving only when conf_get_changed() returned true. Signed-off-by: Karsten Wiese Cc: Sam Ravnborg Cc: Roman Zippel Acked-by: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- scripts/kconfig/lkc_proto.h | 1 + 1 file changed, 1 insertion(+) (limited to 'scripts/kconfig/lkc_proto.h') diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index a263746cfa7..9f1823c88b7 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -5,6 +5,7 @@ P(conf_read,int,(const char *name)); P(conf_read_simple,int,(const char *name, int)); P(conf_write,int,(const char *name)); P(conf_write_autoconf,int,(void)); +P(conf_get_changed,bool,(void)); /* menu.c */ P(rootmenu,struct menu,); -- cgit v1.2.3-70-g09d2 From bfc10001b11e51b59ac901d17c5f05361bd2351d Mon Sep 17 00:00:00 2001 From: Karsten Wiese Date: Wed, 13 Dec 2006 00:34:07 -0800 Subject: [PATCH] kconfig: make sym_change_count static, let it be altered by 2 functions only Those two functions are void sym_set_change_count(int count) and void sym_add_change_count(int count) All write accesses to sym_change_count are replaced by calls to above functions. Variable and changer-functions are moved to confdata.c. IMO thats ok, as sym_change_count is an attribute of the .config's change state. Signed-off-by: Karsten Wiese Cc: Sam Ravnborg Cc: Roman Zippel Acked-by: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- scripts/kconfig/confdata.c | 20 ++++++++++++++++---- scripts/kconfig/lkc.h | 2 ++ scripts/kconfig/lkc_proto.h | 1 - scripts/kconfig/symbol.c | 3 +-- scripts/kconfig/zconf.tab.c_shipped | 2 +- scripts/kconfig/zconf.y | 2 +- 6 files changed, 21 insertions(+), 9 deletions(-) (limited to 'scripts/kconfig/lkc_proto.h') diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 140742ebd73..4bbbb5b09c8 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -100,7 +100,7 @@ int conf_read_simple(const char *name, int def) in = zconf_fopen(name); if (in) goto load; - sym_change_count++; + sym_add_change_count(1); if (!sym_defconfig_list) return 1; @@ -312,7 +312,7 @@ int conf_read(const char *name) struct expr *e; int i, flags; - sym_change_count = 0; + sym_set_change_count(0); if (conf_read_simple(name, S_DEF_USER)) return 1; @@ -364,7 +364,7 @@ int conf_read(const char *name) sym->flags &= flags | ~SYMBOL_DEF_USER; } - sym_change_count += conf_warnings || conf_unsaved; + sym_add_change_count(conf_warnings || conf_unsaved); return 0; } @@ -528,7 +528,7 @@ int conf_write(const char *name) "# configuration written to %s\n" "#\n"), newname); - sym_change_count = 0; + sym_set_change_count(0); return 0; } @@ -766,6 +766,18 @@ int conf_write_autoconf(void) return 0; } +static int sym_change_count; + +void sym_set_change_count(int count) +{ + sym_change_count = count; +} + +void sym_add_change_count(int count) +{ + sym_change_count += count; +} + bool conf_get_changed(void) { return sym_change_count; diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 2628023a1fe..9b2706a4154 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -65,6 +65,8 @@ char *zconf_curname(void); /* confdata.c */ char *conf_get_default_confname(void); +void sym_set_change_count(int count); +void sym_add_change_count(int count); /* kconfig_load.c */ void kconfig_load(void); diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 9f1823c88b7..84bb139789a 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -17,7 +17,6 @@ P(menu_get_parent_menu,struct menu *,(struct menu *menu)); /* symbol.c */ P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); -P(sym_change_count,int,); P(sym_lookup,struct symbol *,(const char *name, int isconst)); P(sym_find,struct symbol *,(const char *name)); diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index ee225ced2ce..8f06c474d80 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -30,7 +30,6 @@ struct symbol symbol_yes = { .flags = SYMBOL_VALID, }; -int sym_change_count; struct symbol *sym_defconfig_list; struct symbol *modules_sym; tristate modules_val; @@ -379,7 +378,7 @@ void sym_clear_all_valid(void) for_all_symbols(i, sym) sym->flags &= ~SYMBOL_VALID; - sym_change_count++; + sym_add_change_count(1); if (modules_sym) sym_calc_value(modules_sym); } diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index 2fb0a4fc61d..d777fe85627 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -2135,7 +2135,7 @@ void conf_parse(const char *name) sym_check_deps(sym); } - sym_change_count = 1; + sym_set_change_count(1); } const char *zconf_tokenname(int token) diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index ab44feb3c60..04a5864c03b 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -504,7 +504,7 @@ void conf_parse(const char *name) sym_check_deps(sym); } - sym_change_count = 1; + sym_set_change_count(1); } const char *zconf_tokenname(int token) -- cgit v1.2.3-70-g09d2 From 3b354c557c7a6fcac099b3a20b308853fe596183 Mon Sep 17 00:00:00 2001 From: Karsten Wiese Date: Wed, 13 Dec 2006 00:34:08 -0800 Subject: [PATCH] kconfig: add "void conf_set_changed_callback(void (*fn)(void))", use it in qconf.cc Added function sets "void (*conf_changed_callback)(void)". Call it, if .config's changed state changes. Use above in qconf.cc to set gui's save-widget's sensitvity. Signed-off-by: Karsten Wiese Cc: Sam Ravnborg Cc: Roman Zippel Acked-by: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- scripts/kconfig/confdata.c | 12 +++++++++++- scripts/kconfig/lkc_proto.h | 1 + scripts/kconfig/qconf.cc | 13 ++++++++++++- scripts/kconfig/qconf.h | 3 +++ 4 files changed, 27 insertions(+), 2 deletions(-) (limited to 'scripts/kconfig/lkc_proto.h') diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 4bbbb5b09c8..664fe29dace 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -767,18 +767,28 @@ int conf_write_autoconf(void) } static int sym_change_count; +static void (*conf_changed_callback)(void); void sym_set_change_count(int count) { + int _sym_change_count = sym_change_count; sym_change_count = count; + if (conf_changed_callback && + (bool)_sym_change_count != (bool)count) + conf_changed_callback(); } void sym_add_change_count(int count) { - sym_change_count += count; + sym_set_change_count(count + sym_change_count); } bool conf_get_changed(void) { return sym_change_count; } + +void conf_set_changed_callback(void (*fn)(void)) +{ + conf_changed_callback = fn; +} diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 84bb139789a..15030770d1a 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -6,6 +6,7 @@ P(conf_read_simple,int,(const char *name, int)); P(conf_write,int,(const char *name)); P(conf_write_autoconf,int,(void)); P(conf_get_changed,bool,(void)); +P(conf_set_changed_callback, void,(void (*fn)(void))); /* menu.c */ P(rootmenu,struct menu,); diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 8d60d99bd9f..0b2fcc417f5 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -38,6 +38,8 @@ static QApplication *configApp; static ConfigSettings *configSettings; +QAction *ConfigMainWindow::saveAction; + static inline QString qgettext(const char* str) { return QString::fromLocal8Bit(gettext(str)); @@ -1306,8 +1308,11 @@ ConfigMainWindow::ConfigMainWindow(void) connect(quitAction, SIGNAL(activated()), SLOT(close())); QAction *loadAction = new QAction("Load", QPixmap(xpm_load), "&Load", CTRL+Key_L, this); connect(loadAction, SIGNAL(activated()), SLOT(loadConfig())); - QAction *saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this); + saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this); connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); + conf_set_changed_callback(conf_changed); + // Set saveAction's initial state + conf_changed(); QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs())); QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this); @@ -1658,6 +1663,12 @@ void ConfigMainWindow::saveSettings(void) configSettings->writeSizes("/split2", split2->sizes()); } +void ConfigMainWindow::conf_changed(void) +{ + if (saveAction) + saveAction->setEnabled(conf_get_changed()); +} + void fixup_rootmenu(struct menu *menu) { struct menu *child; diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index 6a9e3b14c22..6fc1c5f1442 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h @@ -297,6 +297,9 @@ protected: class ConfigMainWindow : public QMainWindow { Q_OBJECT + + static QAction *saveAction; + static void conf_changed(void); public: ConfigMainWindow(void); public slots: -- cgit v1.2.3-70-g09d2