Most of the window decorations available for KWin are not native decorations but themes for a native theme engine, such as deKorator, Smaragd, QtCurve or my own Aurorae. Themes are much easier to design and to distribute than a native decoration which has to be implemented in C++ and be distributed by the Linux distribution. Thus themes are an important part of the decoration system.
But we did a very bad job of integrating the themes into our configuration system. The configuration system only knows about native decorations and doesn’t know that the native decoration is in fact a theme engine. This makes selecting a theme difficult, because a user has to first select the theme engine and then configure this to select the theme. Downloading new themes through GHNS is also difficult as again it requires to go through the configuration of the theme engine. We can do better.
With Aurorae I tried to address some of the problems by extending the configuration system to know about Aurorae, to be able to find the themes and render previews for it. This only worked because Aurorae and the configuration module are in the same source tree and could share code. Nevertheless it needed to have multiple code paths in the configuration module to load the native themes, Aurorae’s SVG themes, Aurorae’s QML themes and to render the three different kind of themes.
The solution works for one theme engine, but others are still not supported. Which is something I find very sad as it turns the theme engines to second class citizens and also looks bad as my theme engine has full support while others don’t, while doing as a good or even a better job at themeing than Aurorae.
When I started to think about KDecoration2 and started to draft the API design I wanted to make sure that theme engines become a first class citizen in KWin. Last week I started to port the Aurorae theme engine to KDecoration2 and added the missing pieces to make KDecoration2 fully theme aware. The configuration of the selected theme is moved into the framework and the selected theme is passed to the native plugin when a Decoration gets created.
As a result of this work the command line options for kdecoration-viewer changed to:
kdecorationviewer [plugin] [theme]
which allows us to load for example the plugin for Aurorae with one of the SVG based themes:
To announce support that the decoration plugin is a theme engine, the decoration plugin has to put some information into the JSON meta data:
"org.kde.kdecoration2": { "themes": true, "defaultTheme": "kwin4_decoration_qml_plastik", "themeListKeyword": "themes" }
If the value for themes is present and true the framework will pass theme information to the Decoration. The framework looks in its configuration for the theme to be used, if there is none it falls back to the defaultTheme from the JSON meta data. The configured theme is passed to the Deocration when being created through KPluginFactory::create which takes a QVariantList as argument. As first element the framework passes in a QVariantMap with a key/value pair of “theme” as key and the configured theme as the value.
The last value of the meta data above is themeListKeyword which is used by the configuration module to locate all themes and provide them. I have not yet finalized the mechanismn so this is still experimental code. The keyword is used to create a different Object through the KPluginFactory. Right now this is a QObject with a QVariantMap property called “themes”. Each key is the user visible name and the value is the internal plugin name. That’s enough information for the configuration module to create a dedicated instance for each of the themes, create a preview for it and properly load/store the information. It allows us to have a configuration module which currently looks like this:
This new configuration module does not have any Aurorae specific code any more. It just knows about plugins and themes and can display them all. As one can see in this screenshot the KCM does not need to know whether it’s a QML based theme (e.g. Plastik) or a SVG based theme (all the others). Which is a nice improvement to the situation before.
The mechanismn for locating the themes will probably change and be moved to KDecoration2 directly. It needs some more tweaks to expose GHNS information and support looking for new themes and deleting existing themes. So there is still a little bit of work to be done. But overall the state is now looking really good and I will soon start the review process for the new API so that KDecoration2 will land in Plasma 5.2. Of course that will be faster if we get more help to finalize the last missing pieces.
Great job Martin, you never cease to amaze. 🙂 Thanks for the great job and caring about diversity of the ecosystem.
Nice work Martin.
Is breeze windeco going to be finished for plasma 5.2? And is there any repo from where I could try it right now 🙂 ?
you need:
really nice.. can’t wait to see it in action 🙂
Any comment on your earlier troubles with speed / RAM usage and the theme engines?
Are we waiting on Qt 5.4 for things that fix those issues?
the troubles were specific to Aurorae and not in general for theme engines. For Aurorae the situation does not improve with the switch to KDecoration2, but Qt 5.4 might improve it.
Amazing work, as always!
Yay! I was the first to be frustrated about the hard-coded Aurorae stuff in KDE 4 😉 Will adapt deKorator and Smaragd.
GHNS unfortunately does not support different settings when passing multiple categories, see bug 235103.
And, how would theming work with DWD?
urgh 🙁
We will need a way to have the decoration announce what it supports. So if KDecoration provides some protected setters it should also work for themes.
I just pushed a solution which should be sufficient: http://commits.kde.org/kwin/2034e7e875cfaff6cf0b6ced060c2bf18e124654
I hope that variant (posted few days ago in planet kde) http://kver.wordpress.com/2014/10/25/presenting-dwd-a-candidate-for-kde-window-decorations/ will be implemented