Warning, /frameworks/kconfig/docs/DESIGN.kconfig is written in an unsupported language. File is not indexed.
0001 kconfigdata_p.h contains definitions of the data formats used by kconfig. 0002 0003 Configuration entries are stored as "KEntry". They are indexed with "KEntryKey". 0004 The primary store is a "KEntryMap" which is defined as a std::map from "KEntryKey" 0005 to "KEntry" 0006 0007 KEntry's are stored in order in the KEntryMap. The most significant sort 0008 criteria is mGroup. This means that all entries who belong in the same group, 0009 are grouped in the std::map as well. 0010 0011 The start of a group is indicated with a KEntryKey with an empty mKey and a 0012 dummy KEntry. This allows us to search for the start of the group and then to 0013 iterate until we end up in another group. That way we will find all entries 0014 of a certain group. 0015 0016 Entries that are localised with the _current_ locale are stored with bLocal 0017 set to true. Entries that are localised with another locale are either not 0018 stored at all (default), or with the localization as part of the key (when 0019 reading a file in order to merge it). 0020 [WABA: Does it make sense to keep both localized and non-localised around? 0021 Can't we just let the localised version override the non-localised version?] 0022 0023 Currently the localization bit is the least significant sort criteria, that 0024 means that the localised version always follows the non-localised version 0025 immediately. 0026 0027 <Changed for KDE 3.0> 0028 Entries that are being read from a location other than the location to 0029 which is written back are marked as "default" and will be added both as 0030 normal entry as well as an entry with the key marked as default. 0031 0032 When entries are written to disk, it is checked whether the entry to write 0033 is equal to the default, if so the entry will not be written. The default 0034 entry always follows directly after the normal entry, due to the sorting. 0035 (After that the localised version follows) 0036 0037 When entries are written to disk, it is checked whether the entry to write 0038 is equal to the default, if so the entry will not be written. 0039 </Changed> 0040 0041 Open question: 0042 Should unmodified entries that are written back be compared with the default 0043 too? This seems to be mostly a transition issue. 0044 0045 <Changed during KDE 3.0 / 3.2> 0046 Extra functions: 0047 0048 bool isEntryImmutable(key); // Can entry be modified? 0049 bool hasDefault(key); // Is there a system wide default set for the entry? 0050 void revertToDefault(key); // Restore to default 0051 void deleteEntry(key); // Remove entry 0052 0053 Note that there is a subtle difference between revertToDefault() and deleteEntry(). 0054 revertToDefault() will change the entry to the default value set by the system 0055 administrator (Via e.g. $KDEDIR/share/config) or, if no such default was set, 0056 non-existent. 0057 deleteEntry() will make the entry non-existent. 0058 0059 Entries are marked "immutable" if the key is followed by [$i]. This means 0060 that a user can not override these entries. 0061 0062 Entries can be marked as deleted if they are followed by [$d]. This 0063 is needed if the system administrator has specified a default value but the 0064 entry was deleted (made 'non-existant'). In that case we can't just leave 0065 the entry out since that would mean we get the default from the system 0066 administrator back the next time we read the file. 0067 </changed> 0068 0069 When an entry is read with readEntry(key, defaultValue), non-existing 0070 entries will return "defaultValue" while hasKey(key) will return "false" 0071 for such entries. 0072 0073 Currently all entries are stored in memory. When KConfig is "sync()'ed" 0074 it reads the file that it is about to overwrite (for the second time), it 0075 then merges in the entries it has in memory and writes the result back to 0076 the file. It does NOT update its map of entries in memory with the entries 0077 (re)read from disk. It only updates the entries in memory when 0078 "reparseConfiguration()" is called. 0079 0080 0081 Open Question: The standard writeEntry() function returns the original value, 0082 is this needed? Nobody seems to use it. 0083 0084 Open Question: The bPersistent flag doesn't seem to be used... could it be removed? 0085 0086 Open Question: Is the bNLS flag needed? Localised entries seem to be mostly 0087 useful for default files, are they ever created by the user itself? 0088 0089 Open Question: Would it be worthwhile to lock a user option that is equal to the 0090 default so that it doesn't change when the default changes? 0091 0092 0093 KDE3.0 Changes 0094 ============== 0095 0096 *) writeEntry now returns void instead of QString. 0097 *) deleteEntry functions added 0098 0099 0100 ------------------------------------------------------------------------------ 0101 0102 KConfig XT 0103 ========== 0104 0105 My buzzword picker offered KConfig XT ("eXtended Technology") and KConfig NG 0106 ("Next Generation"). Since the planned changes are meant to be evolutionary 0107 rather than revolutionary, KConfig NG was dropped. 0108 0109 Goals 0110 ===== 0111 0112 * Have the default value for config entries defined in 1 place. Currently it is 0113 not uncommon to have them defined in three places: 0114 1) In the application that reads the setting in order to use it 0115 2) In the settings dialog when reading the setting 0116 3) In the settings dialog when selecting "Use defaults". 0117 0118 * Provide type-information about config entries to facilitate "KConfEdit" like 0119 tools. Ideally type-information also includes range-information; this is even 0120 mandatory if enums become an explicit type. 0121 0122 * Facilitate the documentation of config entries. 0123 0124 0125 Instead of relying on the defaults that are hard-coded in the application, 0126 rely on default configuration files being installed in $KDEDIR. The technical 0127 changes required for this are very minimal, it is mostly a change in policy. 0128 0129 Type information can be provide by preceding every entry with a formalized 0130 comment. 0131 0132 Work to be done: 0133 * KConfig needs to be extended to provide access to the default values provided 0134 by the default config files. KConfig already stores this information internally. 0135 (DONE) 0136 * A formal comment structure needs to be designed that can convey type-information. 0137 Preferably in such a way that it is easily parsable by both machine and user. 0138 * KConfig needs to be extended, or another class created, that is able to parse 0139 the formalized comments. 0140 * A tool needs to be developed that can assist developers with the generation 0141 and verification of default configuration files including type-information. 0142 0143 Drawbacks: 0144 * We rely on default configuration files being properly installed. 0145 * The user can break applications by making improper modifications to these 0146 files. 0147 * It is not possible to store defaults settings in a config file that are 0148 of a dynamic nature. Examples are settings derived from other settings, 0149 e.g. a color setting could be derived from the current color theme, or 0150 e.g. the default high score user name which is determined by the user 0151 currently logged in. 0152 0153 0154 Some random ideas: 0155 * The format of the entries would be something like this: 0156 0157 [Mail Settings] 0158 #!Type=string 0159 #!Description=SMTP server to use for sending mail 0160 #!Description[nl]=SMTP server voor het versturen van mail 0161 Host=wantelbos.zogje.fr 0162 0163 - the type could be subclassed more, e.g. strings can be "email", "hostname", 0164 "url", etc. 0165 0166 - having translations in these files is very arguable. external po's would be 0167 better. 0168 0169 0170 0171 Class overview 0172 0173 KConfigBase 0174 | 0175 v 0176 KConfigBackend <-----> KConfig <------> KConfigSkeleton /--< myapp.kcfg 0177 | | | / 0178 v v |*---------------< 0179 KConfigINIBackend KSimpleConfig |kconfig_compiler \ 0180 | \--< myconfig.kcfg-codegen 0181 v 0182 MyConfig <-----KConfigDialogManager----> MyConfigWidget *---< myconfigwidget.ui 0183 uic 0184 0185 KConfigBase: defines API for generic config class 0186 0187 KConfig: functional generic config class that supports merging of cascaded 0188 configuration files 0189 0190 KSimpleConfig: functional generic config class without support for cascading 0191 configuration files. 0192 0193 KConfigBackend: defines API for config backend, t.i. the actual handling 0194 of the storage method and storage format. 0195 0196 KConfigINIBackend: the standard (and only one so far) class that implements 0197 the config backend using the file-based .INI format 0198 for configuration files 0199 0200 KConfigSkeleton: base class for deriving classes that store application 0201 specific options providing type-safety and single-point 0202 defaults. 0203 0204 MyConfig: An application specific class that offers configuration options 0205 to the applications via variables or accessor functions and that 0206 handles type-safety and defaults. MyConfig is just an example 0207 name, the application developer choses the actual name. 0208 0209 myapp.kcfg: File describing the configuration options used by a specific 0210 application. myapp.kcfg is just an example name, the application 0211 developer choses the actual name. 0212 0213 myconfig.kcfg-codegen: Implementation specific code generation instructions 0214 for the MyConfig class. myconfig.kcfg-codegen is 0215 just an example name, the application developer 0216 choses the actual name. 0217 0218 KConfigDialogManager: Class that links widgets in a dialog up with their 0219 corresponding configuration options in a configuration 0220 object derived from KConfigSkeleton. 0221 0222 MyConfigWidget: Dialog generated from a .ui description file. Widget names 0223 in the dialog that start with "kcfg_" refer to configuration 0224 options.