Happy new year everyone !

We will be having a Virtual Sprint for the Wayland Goal between Saturday 23rd and Sunday 24th January 2021.

This is open to contributors, you can have a look at the current program and more details at Wayland Virtual Sprint.


9 January, 2021

A year ago I felt like getting back into c++ and kde development. Scratching one of my itches seemed to be the right path back. For quite some time I was looking for a plasma applet that allows to control and monitor systemd units. Preferably for both system and session service managers.

The attempt actually led to a result which was neither pretty nor perfect, but it worked. I put it on github https://github.com/jansenm/systemd-plasmoid and used it locally. No formal announcement was ever done and my plan to put it into kde infrastructure kinda never realized too.

Fast-forward nearly a year and some aspect of the applet stopped working. It no longer notices if you stop a service manually on the session service manager. For the system service manager it works. Unfortunately I realized I am no longer interested in this kind of programming. And that i kinda forgot everything i learned a year ago :).

The solution. Make an announcement to check if someone else is interested in taking over the applet.

So are YOU interested in taking over? I consider it a very useful applet and would hate to see it perish. I would assist in moving it over to kde infrastructure.

Btw … is it applet or widget? There seems to be some inconsistent naming.

The first minor release of the 20.12 series is out with a huge batch of fixes and usability improvements.


  • The ability to select and move multiple keyframes by SHIFT + click drag.

  • Select multiple keyframes with CTRL+ click.
  • Add option to move selected keyframe to current cursor position.
  • Added a duplicate keyframes button.
  • Zoom on keyframes with CTRL + wheel.
  • Add option to delete all effects in selected clip(s).
  • Fix track effects applying only on first playlist.



Added ability to hide and lock subtitles.


Other hightlights

  • Added undo/redo when setting in and out points.
  • Automatically update title clip name when we edit a duplicate title.
  • Appearance improvements to compositions and clips.
  • Added unused clip filter to the project bin.
  • Added option in the timeline settings to not pause playback while seeking.
  • Moved the timeline tooltips to the status bar.
Full log
  • Fix crash on copy subtitle (not implemented yet). Commit.
  • Ensure jobs for timeline clips/tracks are properly canceled when the clip/track is deleted, fix crash on audio align deleted clip. Commit.
  • Fix crash if the clip of an audio align job is deleted during calculations. Commit.
  • Fix possible crash dragging clip in timeline from a file manager. Commit.
  • Various display adjustments for compositions and clips. Commit.
  • Reset config should also delete xmlui config file. Commit.
  • Fix disabling proxy loses some clip properties. Commit.
  • Fix tests. Commit.
  • Fix some regressions in keyframe move. Commit.
  • Undo/redo on clip monitor set in/out point. Commit.
  • Don’t snap on subtitles when track is hidden. Commit.
  • Add option to delete all effects in selected clip/s. Commit.
  • Fix some more xml parameters by Eugen Mohr. Commit.
  • Fix crash when all audio streams of a clip were disabled. Commit. Fixes bug #429997
  • Fix some broken effects descriptions, spotted by Eugen Mohr. Commit.
  • Reduce latency on forwards/backwards play. Commit.
  • Fix the integer value of effect parameter’s checkbox. Fixes #880. Commit.
  • Fix various typos spotted by Kunda Ki. Commit.
  • Automatically update title clip name when we edit a duplicate title. Commit.
  • Add option to not pause the playback while seeking. Commit.
  • Fix some crashes with locked subtitle track. Commit.
  • Fix qml deprecation warning. Commit.
  • Fix track effects applying only on first playlist. Commit.
  • Fix timeline vertical scrolling too fast. Commit.
  • Fix clip move incorrectly rejected. Commit.
  • Fix regression with crash in effect stack. Commit.
  • Add preliminary support to copy a keyframe param value to other selected keyframes. Commit.
  • Move timeline tooltips in statusbar. Commit.
  • Add normalizers to MLT thumbcreator, fixing Kdeinit crash. Commit. See bug #430122
  • Effectstack: Add duplicate keyframe(s) button. Commit.
  • Effectstack: select multiple keyframes by shift-click + drag (like in timeline). Commit.
  • Improve grabbing of keyframes in effect stack. Commit.
  • Initial implementation of grouped keyframe operation (move/delete). Select multiple keyframes with CTRL+click. Commit.
  • When calculating a folder hash (to find a missing slideshow), take into accound the file hash of 2 files inside the folder. Commit.
  • Ensure subtitle track buttons are hidden when the track is hidden. Commit.
  • Fix project profile creation dialog not updating properties on profile selection. Commit.
  • Don’t change Bin horizontal scrolling when focusing an item. Commit.
  • Fix composition unselected on move. Commit.
  • Fix unwanted keyframe move on keyframe widget seek. Commit.
  • Don’t snap on subtitles when locked. Commit.
  • Show/lock subtitle track now correctly uses undo/redo. Commit.
  • Restor subtitle track state (hidden/locked) on project opening. Commit.
  • Fix qmlt typo. Commit.
  • Fix color picker offset, live preview of picked color in the button. Commit.
  • Implement subtitle track lock. Commit.
  • Add hide and lock (in progress) of subtitle track. Commit.
  • Zoom effect keyframe on CTRL + wheel, add option to move selected keyframe to current cursor position. Commit.
  • Add “unused clip” filter in Project Bin. Commit. Fixes bug #430035
  • Another small fix for image sequence on project opening. Commit.

This week KWin’s compositing code was almost totally rewritten! It should broadly reduce latency throughout all compositing operations, and also adds a user-facing control in the System Settings Compositing page so people can choose for themselves whether they prefer lower latency or smoother animations. In addition, it brings support for mixed-refresh-rate display setups on Wayland, e.g. one 144Hz screen and one 60Hz screen! This very exciting work was completed by Vlad Zahorodnii and will land in Plasma 5.21.

But that’s not all: Plasma also got a brand new Kickoff menu, which was rewritten from the ground up and fixes more than two thirds of the open issues in the bug tracker! It features a double-pane UI with better keyboard, mouse, touch, and accessibility, RTL support, an alphabetical “All Applications” view, a grid-style favorites view, power actions visible by default with labels, and much more. Here it is:

I’d like to offer a big thanks to Mikel Johnson for this excellent contribution, which will also land in Plasma 5.21. People who liked the old Kickoff can download it from store.kde.org using the “Get new widgets” button in the “Add Widgets” panel. Search for “Legacy Kickoff”.

But there’s one more really big cool thing: The Plasma Audio Volume applet now has a little visualizer for the current recording level and output volume!

Gone are the days of being embarrassed during a meeting because your microphone is muted or way too sensitive. This lovely improvement was contributed by David Edmundson and David Redondo, and also lands in Plasma 5.21.

But that’s not all:

Other New Features

Konsole now lets you select which text editor is opened when you Ctrl+click on a text file to open it (Ahmad Samir, Konsole 21.04):

Bugfixes & Performance Improvements

Kate can now open files beginning with a colon from the command line (Ahmad Samir, Kate 21.04)

Right-clicking on an ISO image in Dolphin no longer imposes such a long delay before the context menu appears (Kai Uwe Broulik, Dolphin 21.04)

Dolphin’s in-toolbar breadcrumbs bar/URL navigator is now sized correctly the first time you open Dolphin (Felix Ernst, Dolphin 21.04)

Filelight now shows the correct amount of free space on a disk (Jakob Erzar, Filelight 21.04)

Filelight’s tooltip is now positioned correctly in multi-screen setups (Teemu Patana, Filelight 21.04)

The screen locker no longer sometimes consumes 100% of the CPU’s resources (David Edmundson, Plasma 5.18.7 and 5.21)

The Folder View applet now has a sane layout when used on a vertical panel greater than 50px thick (me: Nate Graham, Plasma 5.18.7 and 5.21)

Fixed one of the most common ways that Plasma could crash when interacting with screen-related settings (David Edmundson, Plasma 5.21)

When Discover and the Emoji picker are already open but unfocused, activating them via their System Tray icons or global shortcuts now raise the existing windows properly (David Edmundson and me: Nate Graham, Plasma 5.21)

Fixed the Network Speed Widget for people who were seeing that it didn’t work properly for them some of the time (David Redondo, Plasma 5.21)

The “Get new [thing]” dialog now shows recently-installed content properly when you activate its “Installed” filter (Alexander Lohnau, Frameworks 5.79)

User Interface Improvements

Opening and closing split views in Dolphin is now animated (Felix Ernst, Dolphin 21.04):

Kate’s “Quick Open” panel now supports fuzzy matching (Waqar Ahmed, Kate 21.04)

Notifications about items moved to the trash no longer give you the option to open the item, because that’s just silly (Kai Uwe Broulik, Plasma 5.21)

After you click on the “Connect” button in the Plasma network list, the inline password field no longer runs away from you if the list is re-ordered (Bharadwaj Raju, Plasma 5.21)

System Settings’ KWin Scripts and Accessibility pages now respect the “Highlight changed settings” feature (Cyril Rossi, Plasma 5.21)

The Maximize and Fullscreen animations now use the standard animation easing curve (in/out cubic) (Alex Rosca, Plasma 5.21):

When setting up a KWin window rule, the default value for each newly-added property is now “Apply initially”, not “Do not affect” (Michael Tunnell, Plasma 5.21)

The clipboard applet now closes when you select a history entry with the keyboard, same as when you do so using the mouse (me: Nate Graham, Plasma 5.21)

Dolphin and other KDE apps now display thumbnail previews for ancient .ANI animated windows cursor files (Kai Uwe Broulik, Frameworks 5.79)

How You Can Help

Have a look at https://community.kde.org/Get_Involved to discover ways to be part of a project that really matters. Each contributor makes a huge difference in KDE; you are not a number or a cog in a machine! You don’t have to already be a programmer, either. I wasn’t when I got started. Try it, you’ll like it! We don’t bite!

Finally, consider making a tax-deductible donation to the KDE e.V. foundation.

The migration happened and well… it turns out that it was not as smooth as I expected. In particular, comments weren’t working at all due to a filesystem permission on the database (which meant nothing would get written at all). That is now fixed. Sorry for the problems.

To add problems over problems, I had a hardware failure (RAID card) last June, which wrecked the root filesystem and I had to reinstall everything from scratch. When I looked back to recover the last comment backup… Well… it wasn’t being backed up. I was able to recover the ones up to 2015-2016 or so because I had still my old Disqus export laying around.

tl;dr: Comments were broken, now they’re fixed, lost a bunch of comments due to hardware failure.

Excuse me while I go bury myself.

Saturday, 09 January 2021

KDE today announces the release of KDE Frameworks 5.78.0.

KDE Frameworks are 83 addon libraries to Qt which provide a wide variety of commonly needed functionality in mature, peer reviewed and well tested libraries with friendly licensing terms. For an introduction see the KDE Frameworks release announcement.

This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner.

New in this Version


  • Honour the job being aborted immediately (bug 429939)


  • [ExtractorProcess] Move DBus signal from helper to main process
  • [timeline] Consolidate code for root folder stat and list
  • Make toplevel ioslave UDS entries readonly
  • Avoid errors for application startup if no baloo index was ever created
  • [BasicIndexingJob] Strip trailing slash from folders (bug 430273)

Breeze Icons

  • New compass action icon
  • Add image-missing icon to theme
  • Add icon for WIM images

Extra CMake Modules

  • Tell MSVC that our source files are UTF-8 encoded
  • Add Findepoxy.cmake
  • Consider local fastlane image assets
  • Reproducible tarballs with GNU tar only
  • Preserve the rich-text subset supported by F-Droid
  • Bump required cmake version for Android.cmake (bug 424392)
  • Automatically detect plugin lib deps on Android
  • Check if file exists before removing the fastlane archive
  • Clean image folder and archive file before downloading/generating those
  • Retain screenshot order from the appstream file
  • Windows: fix QT_PLUGIN_PATH for tests
  • Don’t fail if we haven’t found any categories
  • Make KDEPackageAppTemplates to create reproducible tarball


  • Remove broken lastQuery feature, fixes krunner crashes for me


  • CMakeLists.txt - increase minimum libical version to 3.0


  • KPluginSelector implement default highlight indicator
  • kcmoduleqml: don’t bind column width to view width (bug 428727)


  • [KComboBox] fix crash when calling setEditable(false) with open context menu


  • Fix windows being inappropriately maximized on launch (bug 426813)
  • Correct format of window maximized string
  • Fix window sizing and positioning on Windows (bug 429943)


  • KCodecAction: add non-overload signals codecTriggered & encodingProberTriggered


  • Port KJobTrackerInterface to Qt5 connect syntax
  • KTextToHtml: fix assert due to out of bounds at() call
  • Use flat hierarchy for plugin paths on Android
  • desktop to JSON conversion: ignore “Actions=” entry
  • Deprecate KProcess::pid()
  • ktexttohtml: fix KTextToHTMLHelper usage


  • Use std::unique_ptr<char[]> to prevent memory leaks


  • Switch to Findepoxy provided by ECM
  • KCMShell: Add support for passing arguments
  • Workaround crash with GL detection and kwin_wayland
  • [KQuickAddons] QtQuickSettings::checkBackend() for fallback to software backend (bug 346519)
  • [abstractkcm] Fix import version in code example
  • Avoid setting QSG_RENDER_LOOP if set already
  • ConfigPropertyMap : load property’s default value in the map


  • Add an entity for MathML acronym
  • Change ‘Naval Battle’ to ‘KNavalBattle’ to meet legal matters


  • Avoid autostarting kglobalaccel when shutting down (bug 429415)


  • Update Japanese holidays


  • Skip warning for some Adwaita icons for backward compatibility
  • QSvgRenderer::setAspectRatioMode() was introduced in Qt 5.15


  • Add AVIF to the list of supported formats
  • Add plugin for AV1 Image File Format (AVIF)


  • [KFileItemDelegate] do not waste space for non-existing icons in columns other than first
  • KFilePlacesView, KDirOperator: port to async askUserDelete()
  • Rework the way CopyJob finds the JobUiDelegate extensions
  • Introduce AskUserActionInterface, an async API for Rename/Skip dialogs
  • RenameDialog: only call compareFiles() on files
  • kcm/webshortcuts: Fix Reset button
  • KUrlNavigatorMenu: fix middle-click handling
  • Remove knetattach item from the remote:// ioslave’s view (bug 430211)
  • CopyJob: port to AskUserActionInterface
  • Jobs: add non-overloaded signal “mimeTypeFound” to deprecate “mimetype”
  • RenameDialog: Add missing nullptr initialization (bug 430374)
  • KShortUriFilter: don’t filter “../” and co. strings
  • Do not assert if KIO::rawErrorDetail() is given a URL with no scheme (bug 393496)
  • KFileItemActions: fix condition, we want to exclude only remote dirs (bug 430293)
  • KUrlNavigator: remove kurisearchfilter usage
  • KUrlNavigator: make completions of relative paths work (bug 319700)
  • KUrlNavigator: resolve relative dir paths (bug 319700)
  • Silence warnings due to samba config issues when not using samba explicitly
  • KFileWidget: allow files that begin with a ‘:’ to be selected (bug 322837)
  • [KFileWidget] fixed bookmark button position in toolbar
  • KDirOperator: deprecate mkdir(const QString &, bool)
  • KFilePlacesView: allow setting a static icon size (bug 182089)
  • KFileItemActions: add new method to insert openwith actions (bug 423765)


  • [controls/SwipeListItem]: Always show actions on desktop by default
  • [overlaysheet] Use more conditional positioning for close button (bug 430581)
  • [controls/avatar]: Open up internal AvatarPrivate as public NameUtils API
  • [controls/avatar]: expose generated colour
  • Add Hero component
  • [controls/Card]: Remove hover animation
  • [controls/ListItem]: Remove hover animation
  • Move ListItems to use veryShortDuration for hover instead of longDuration
  • [controls/Units]: Add veryShortDuration
  • ActionButton icon coloring
  • use icon pixmaps only as big as needed
  • [controls/avatar]: better default appearance
  • [controls/avatar]: Fix visual bugs
  • Create CheckableListItem component
  • [controls/avatar]: scale border according to avatar size
  • Revert “[Avatar] Change background gradient”
  • Revert “[Avatar] Change border width to 1px to match other bother widths”
  • [controls/avatar]: Make Avatar accessibility-friendly
  • [controls/avatar]: Increase padding of icon fallback
  • [controls/avatar]: Make image mode set sourceSize
  • [controls/avatar]: Adjust sizing of text
  • [controls/avatar]: Adjust techniques used for circular shape
  • [controls/avatar]: Add primary/secondary action to Avatar
  • Hardcode OverlaySheet header item padding
  • qmake build: add missing sizegroup source/header
  • Color icons, not buttons (bug 429972)
  • Fix header back and forward buttons having no width
  • [BannerImage]: fix not vertically centred header title with non-plasma themes


  • Add count property, allows rowCount binding in QML


  • KWidgetItemDelegate allow to trigger a resetModel from KPluginSelector


  • Deprecate standardAction and standardActionUpload methods
  • Fix QtQuick model if there is only a payload, but no download links
  • Add a dptr to Cache, and move the throttle timer there to fix crash (bug 429442)
  • Refactor KNS3::Button to use new dialog internally
  • Create wrapper class for QML dialog
  • Check if version is empty before concatenating version


  • Improve KNotification API docs


  • Deprecate BrowserHostExtension


  • Use a custom macro for deprecation messages in QML
  • Use ECMGenerateExportHeader for deprecation macros and use them
  • Changing interval does not need to clear history
  • Change continuous line chart to history proxy source example
  • Deprecate Model/ValueHistorySource
  • Introduce HistoryProxySource as a replacement for Model/ValueHistorySource
  • Add logging categories for charts and use them for existing warnings


  • [DBus Runner] Add support for custom pixmap icons for results
  • Add key to check if the config was migrated
  • Separate config and data files
  • New API to run matches and for history
  • Do not build RunnerContextTest on windows


  • KSycoca: avoid database rebuild if XDG_CONFIG_DIRS contains duplicates
  • KSycoca: ensure extrafiles are ordered for comparison (bug 429593)


  • Rename “Variable:” to “Document:Variable:”
  • Variable Expansion: Fix finding prefix matches with multiple colons
  • Move painting from KateTextPreview into KateRenderer
  • Make sure only lines in view are used to paint the pixmap
  • Use KateTextPreview to render the pixmap
  • Variable expansion: Add support for %{Document:Variable:}
  • Show the dragged text when dragging (bug 398719)
  • Fix detach in TextRange::fixLookup()
  • Don’t paint currentLine bg if there is an overlapping selection
  • KateRegExpSearch: fix logic when adding ‘\n’ between range lines
  • rename action to ‘Swap with clipboard contents’
  • add an action to trigger copy & paste as one action
  • feat: add text-wrap action icon for Dynamic Word Wrap
  • Undo indent in one step (bug 373009)


  • KSelectAction: add non-overload signals indexTriggered & textTriggered
  • KFontChooserDialog: handle dialog being deleted by parent during exec()
  • KMessageDialog: call setFocus() on the default button
  • Port from QLocale::Norwegian to QLocale::NorwegianBokmal
  • Port KToolBarPopupActionTest to QToolButton::ToolButtonPopupMode


  • KXmlGui: when upgrading a local .rc file, keep new app toolbars
  • Fix key recording by setWindow before capture starts (bug 430388)
  • Remove unused KWindowSystem dependency
  • Clear KXMLGUIClient in memory xml doc after saving shortcuts to disk

Oxygen Icons

  • Add upindicator

Plasma Framework

  • Expose error information to error plasmoid in a more structured manner
  • [components] Hook up Mnemonics
  • [svg] Always start SvgRectsCache timer from the correct thread
  • [PC3 ProgressBar] Set binding for width (bug 430544)
  • fix Windows build + inversion of variables
  • [PlasmaComponents/TabGroup] Fix check if item inherits from Page
  • Port various components to veryShortDuration on hover
  • Move ListItems to use veryShortDuration for hover instead of longDuration
  • Add veryShortDuration
  • Don’t allow negative calendar years (bug 430320)
  • Fix broken background (bug 430390)
  • Replace QString cache IDs with a struct-based version
  • [TabGroup] Reverse animations in RTL mode
  • Only remove shortcuts on applet removal not destruction
  • Hide disabled contextual actions from ExpandableListItem


  • KFileItemActions: add menu windowflag
  • Share fileitemplugin: use parent Widget as menu parent (bug 425997)


  • Update org.kde.desktop/Dialog.qml
  • Draw ScrollView using Frame instead of Edit (bug 429601)


  • Improve performance of createOrderedModel using QVector
  • Avoid runtime warning if no guess result exists

Syntax Highlighting

  • C++ Highlighting: QOverload and co
  • Fix labels beginning with period not being highlighted in GAS
  • C++ highlighting: add qGuiApp macro
  • Improve dracula theme
  • fix #5: Bash, Zsh: ! with if, while, until ; Bash: pattern style for ${var,patt} and ${var^patt}
  • fix #5: Bash, Zsh: comments within array
  • Cucumber feature syntax
  • Zsh: increment syntax version
  • Zsh: fix brace expansion in a command
  • add weakDeliminator and additionalDeliminator with keyword, WordDetect, Int, Float, HlCOct and HlCHex
  • Indexer: reset currentKeywords and currentContext when opening a new definition
  • Zsh: many fixes and improvements
  • Bash: fix comments in case, sequence expression and ) after ]
  • Handle import color in base correctly and specialize for c/c++
  • Update Monokai theme
  • Verify the correctness/presence of custom-styles in themes
  • Add GitHub Dark/Light themes
  • increment version, don’t change kate version, until I understand why it is needed
  • Add licenses
  • Add Atom One dark/light themes
  • missed to increment version on change
  • Fix monokai attribute & operator color
  • Add Monokai theme
  • CMake: Add missed 3.19 variables and some new added in 3.19.2
  • Kotlin: fix some issues and other improvements
  • Groovy: fix some issues and other improvements
  • Scala: fix some issues and other improvements
  • Java: fix some issues and other improvements
  • fix && and || in a subcontext and fix function name pattern
  • add QRegularExpression::DontCaptureOption when there is no dynamic rule
  • Bash: add (…), ||, && in [[ … ]] ; add backquote in [ … ] and [[ … ]]

Security information

The released code has been GPG-signed using the following key: pub rsa2048/58D0EE648A48B3BB 2016-09-05 David Faure faure@kde.org Primary key fingerprint: 53E6 B47B 45CE A3E0 D5B7 4577 58D0 EE64 8A48 B3BB

Featured image of post Matrix Live about NeoChat

I was recently interviewed with Tobias by the Matrix folks about NeoChat as part of Matrix Live. You can read the integrality of the Matrix update for this week here.


8 January, 2021

KSystemStats, The New Backend for System Monitoring

This is the first in a series of articles where I will talk about some of the technology behind Plasma System Monitor. They will be quite technical.

About two years ago, a project was started to create an alternative to ksysguardd, the process that does the actual statistics collection for KSysGuard. Initially, this was intended to power a new set of system monitor applets for Plasma, but while we were working on it we concluded that it would also be a good idea to build a new system monitor application on top of this. The result of that is Plasma System Monitor, which had a preview release at the start of November.

Plasma System Monitor Overview Page
Plasma System Monitor, powered by KSystemStats

But Why?

Now, the first question anyone is going to ask when someone says they will replace some working piece of code is "Why?". Why replace working code with something untested and new? To answer that, let me first exaplain how the old ksysguardd worked.

ksysguardd is a binary that gets launched when KSysGuard (or another application that wants system data) gets launched. It implements the actual data collection side of KSysGuard, using a custom protocol over standard input to communicate with the application. It has different code paths for different operating systems, which each operating system "backend" exposing a number of sensors that read system data.

Custom Protocols

One of the first reasons to create something new was the requirement of ksysguardd that it needs to be started separately for each process that wants to do something with the statistics. This has much to do with ksysguardd using a custom protocol for communication. While twenty years ago writing a custom protocol was probably about the only way to get something like this to work, these days we tend to make use of a more sophisticated IPC mechanism: D-Bus.

D-Bus allows us to create a process that can run as a stand-alone service exposing a more robust RPC interface to applications that want to use this data. This in turn means we do not need to start a separate instance for each process that wants to do something with this data. It also means that the underlying code can now be changed to deal with proper data structures rather than writing just about anything to a text stream, which is what happens in ksysguardd code.

Memory Usage displayed in both Plasma System Monitor and Plasma Desktop
Memory usage being displayed by both Plasma System Monitor and Plasma Desktop, with KSystemStats providing the same data to both.

Code Reuse

ksysguardd is written completely in C. While this is fine for certain cases, in this case that means it prevents us from reusing code that we already have to implement some of the functionalities. For example, the partition usage sensors need to know which partitions exist and then query those for usage amounts. In ksysguardd this is implemented by reading /etc/mtab. That file, however, contains everything that is mounted, including things like /proc, cgroup and a lot of other things that are really not partitions. So the code has to filter that list, which leads to issues where we either do not list everything a user considers "a partition", or we show too much.

The thing is, we already have a solution for this problem. There are plenty of places in Plasma and other KDE software where we need to provide a list of partitions. For example, the device manager applet needs to show these, as well as the places panel in Dolphin. These all make use of the Solid framework to do this, which uses udisks2 on Linux these days. So it would be nice to be able to reuse that code, since it provides a much better way of listing partitions, that is well tested on multiple platforms. However, Solid is C++ code. While it is technically possible to interface with that from C code, it is not going to be the nicest of solutions and would clutter up code that already is not the most readable.

There is an additional reason to move away from C code: Most code written as part of KDE software is C++, if not an even higher level language like QML. We are used to having all the facilities that modern C++ provides us, in addition to all the things that come from Qt. Having to write things in C is cumbersome, to say the least, making it a lot harder to make changes to what kind of data we expose.

All APIs are Equal, But Some are More Equal than Others

All that said, most of those issues are not so much architectural problems. However, there is one fundamental issue in ksysguardd that is very much architectural and which we did not even solve in KSystemStats for a fairly long time. This has much to do with what can be considered the "API" of a separate service like this.

As I mentioned above, in ksysguardd, the system specific "backend" deteremines which sensors there are and what kind of things they expose. However, this means that, on different platforms, the set of sensors exposed by the service can be different. When you then have an application that makes use of some sensors to display data, that application suddenly has to deal with the differences between these sensors, which makes things a lot harder for the application. Moreover, this problem is not even limited to different platforms, the same platform can change what sensors are exposed since there is absolutely nothing that enforces a structure.

In a way, these sensors can be considered the "public API" of the service. And like a good public API, they should not change at the whim of whatever the underlying system decides, but be mostly stable. Therefore, in KSystemStats, we decided to restrict things a lot more. First, everything is part of a subsystem. These are mostly meant for categorisation and include things like "CPU" or "Memory". Each subsystem can contain one or more "sensor objects", which represent more concrete objects in the system, like a CPU core or a GPU. Finally, each sensor object has a number of sensor properties, which are the objects that provide the actual system data. Sensor properties include things like CPU core usage and the amount of memory used.

One additional important aspect is that sensor properties represent not only the data value but also several bits of metadata about those properties. This includes a name and description, but also its unit and maximum value. Since the sensor properties are mostly static and defined up front, we can actually provide proper translated names for everything. In addition, with the extra metadata the client can make decisions about how to display that information, like how to format the data value or providing a reasonable default range for a line chart.

All this should lead to a much more stable "public API" for the sensors, which means that the experience when running an application that makes use of KSystemStats should behave a lot more like it is intended, regardless of the underlying system. This in turn means that the application can be polished a lot more to provide a good experience to users.

Plasma displaying several different data sources.
Plasma displaying several different data sources.

Plugins and Modularity

A change that was made fairly early in the project is that sensors are no longer hardcoded directly in the service itself, but are provided by plugins. This enforces separation between the service code that exposes things on D-Bus and the code that is reading values from the system and between the different subsystems. It also means that it becomes a lot simpler to add new sensors to the system, since that simply means writing a new plugin. Longer term, I hope this will lead to more things being supported. It already helped a lot when creating the [GPU integration].

In addition, it helped us transition to the new system, as we could create a plugin that uses ksysguardd behind the scenes, but then maps that to the structure as we defined it for KSystemStats. While not entirely painless, this allowed us to build on top of the new infrastructure and later on replace the underlying data collection code. That meant we couldto ship KSystemStats and the improved Plasma widgets in Plasma 5.19, while the data collection code has been mostly replaced for Plasma 5.21.

Closing Notes

This has become a pretty long story, but I hope it highlights some of the reasoning and design ideas behind the KSystemStats service. In the next blog post I will talk about rendering charts and the KQuickCharts framework.

ahiemstra Fri, 01/08/2021 - 12:01

This is a guest blog post by Sam Kreuze, an Embedded Engineer at DornerWorks. To see the original article click here.

OMEMO logo

Kaidan will be supported by NLnet for adding end-to-end encryption support. We will implement the latest version of the encryption protocol OMEMO and extend it by an easy trust management to solve issues other OMEMO-capable chat apps suffer from.


End-to-end encryption ensures that sent data can only be read by the intended recipients. Signing is used to ensure that received data comes from the intended sender and was not modified in transit. To read encrypted data, it has to be decrypted before.

Keys are used to encrypt and decrypt data. Those keys are like very strong passwords. If the data is encrypted and decrypted with the same key, the procedure is called symmetric encryption.

OMEMO enables the users to chat end-to-end encrypted. It is an asymmetric encryption protocol. That means, different keys are used to encrypt and decrypt the data. Each communication partner has a private and a public key. A private key is used to sign and decrypt data. A public key is used to encrypt data and verify its signature.


The latest version of OMEMO uses Stanza Content Encryption. That means, in addition to messages and files such as images, it is now possible to end-to-end encrypt metadata as well. Such metadata could be e.g. the indicator whether someone is currently composing a message. Kaidan will use Chat State Notifications for that purpose and encrypt them with OMEMO. Furthermore, many features already supported, like delivery receipts and message correction, are going to be automatically end-to-end encrypted.

Trust Management

When a user starts an encrypted chat, OMEMO retrieves the recipient’s public key automatically. Since there is no secure channel yet, that key might not belong to the intended recipient but to an attacker controlling the infrastructure in between. Trust management is the process of deciding whether a retrieved public key should be trusted and thus used for encryption and signature verification. Trust Messages in combination with Automatic Trust Management simplify the trust management.

Nowadays, it is possible to use OMEMO relatively hassle-free with several XMPP clients but the trust management is still complicated. It becomes even more difficult when someone uses a new device. With Automatic Trust Management, Kaidan will be the first XMPP chat app introducing an easy trust management. It automates as much as possible while keeping the same security level as with a completely manual trust management.

Free and Secure Communication

As far as we know, there are no other implementations of Stanza Content Encryption and Automatic Trust Management in use at the moment. We will take the first steps and hope that other XMPP developers will follow our lead. XMPP client developers interested in implementing an easy trust management should have a look at ATM’s project site. It contains all relevant links, pseudocode and test cases.

Kaidan’s goal is to minimize the effort for establishing free and secure communication, thus lowering the entry barrier to strong encryption mechanisms for the average user. NLnet and a couple of other organizations support us via the NGI Zero PET fund to achieve that. The money is provided by the European Commission. That is a great example (like the previous support by the DBJR (German Federal Youth Council)) of how public money can be used to develop free software.

There are many other interesting projects currently funded by NLnet. We are glad that Kaidan is one of them!