KDE Core/Platform 11/Settings
KConfig x New config as a library support
Replace KConfig with a Qt-only-based config library, with native backends for target operating systems. This new library will even be suitable for Qt-only apps. It will be the equivalent of Solid or Phonon for configuration.
- Remove all global config usage (as <KDEDIR>/share/config in Linux). All configs are user based and Kiosk is of course respected, so no user or distro will be affected. (Not sure what this means - is it simply saying that there will no longer be any configuration files installed by vanilla KDE? cf. next bullet point - rg3).
- kcfg and defaults would not be deployed anymore as separate files. Defaults should be included in binaries, through headers for example, and are generated on the fly on first run from user. Distros can still have their tree with configs. There should possibly be a tool to generate a description of what configuration files/options are available, for the use of distros and system admins. (Does this mean that the configuration system will still look in /etc/whatever, for example, so distros/sysadmins can change the global defaults? - rg3)
- The new library would be written from scratch, and a KConfig compatibility layer would be provided to retain source compatibility. In future, apps should directly use the new library. The KConfig wrapper will be a transitory stage.
Helio wants to try to implement it.
Current pointed implementation issues open questions
- Multiple instances of same app and concurrent write/read
- We want notifications of changes. Is this available on all platforms?
- dconf has change notification support.
- The Windows registry also does, via RegNotifyChangeKeyValue, for example.
- Mac OS X's NSUserDefaults class also has a notification method, but it is quite coarse (it just tells you that the application's settings have changed) and is also Objective C. The C API does not appear to have notification support.
- Migration from kde4 configs. A tool could be written to do this. This is feasible - it only requires writing a parser, but will take some time to write. Using kconfig itself will create an undesirable dependency.
DConf as a backend for KConfig would offer some nice features.
Unlike the current .ini files it creates one or multiple binary settings files that is used by all applications. A shell tool exists as well as a gtk settings editor. This multiple files can be used in a form of list, with the benefits of locks as well, making a must for kiosk or at least not breaking the functionality.
Reading of settings is done via one mmaped file (read only). Therefor reading is fast. Writing happens via dbus.
There are notifications for changes of settings.
It features a hierarchy of settings like KConfig where user settings take precedence compared to system settings. The concept of locking is very similar to Kiosk immutable settings. In addition there are notifications if the locked state changes - that means activating a Kiosk immutable on a setting could immediately reflected in the UI.
There is an existing Qt library: https://gitorious.org/dconf-qt/dconf-qt
Problems could be: There is no win/mac support. This requires keeping the old way with ini files a live or some investment to make dconf work or write other kconfig backends.
We can't use change notifications as that would assume use of dconf as a backend which makes an application unportable to windows/mac (currently).
DConf stores its config in xdg dirs (.config).
Current state to compile
Core dconf It requires quite new version of glib and vala, the visual registry editor requires Gtk 3 ( not needed for us now ) and dconf-qt made by Canonical requires a new vendor patch for Qt, included only in Qt 4.8
Registry? It has change notification support. Probably doesn't have all the types we would want - some encoding may need to be done.
Some sort of tool to convert existing ini configs would presumably be needed.
Mac OS X uses property lists as a configuration format. These are quite Objective-C centric. The OS X Objective C API has an NSUserDefaults class for accessing these, and provides basic change notification support.
The fact that this API is Objective C may prove problematic.
There is also the Core Foundation API. This is a C API, but has no notification support (that I can find).
It may make sense to split between application state and actual configuration settings. DConf and other backends could then handle the real settings whereas application state (unread mails in kmail) could be handled by the traditional ini files.
- Having a dconf backend to KConfig is nice but doesn't mean a huge change. For application developers nothing would change due to this. The implementation of a current KConfig backend is far from simple, and banging on current implementation add more code will not help in any thew goals of a new modern configuration system.
- What about QSettings? big problems with settings-groups, not power full enough for KDE. Can KConfig be merged with this ? The short answer is no, most the fact that even Trolls decided not support it anymore, and current KConfig architecture is way to different and for sure we don't want create an Unmaintainable Frankenstein.