Skip to content

Plasma 5: The Early Years

Monday, 25 March 2024 | Kai Uwe Broulik


With KDE’s 6th Mega Release finally out the door, let’s reflect on the outgoing Plasma 5 that has served us well over the years. Can you believe it has been almost ten years since Plasma 5.0 was released? Join me on a trip down memory lane and let me tell you how it all began. This coincidentally continues pretty much where my previous retrospective blog post concluded.

Plasma 5.1 desktop with pastel colored diamond pattern as wallpaper, white panel at the top, kickoff menu open with various apps in it, and fuzzy lcock widget “quarter past twelve” visible in the background
The earliest clean full-desktop Plasma 5 screenshot I could find in my archives, dated December 2014

We released Plasma 5.0 on Tuesday, 15th July 2014, one week after the first issue of the KDE Frameworks 5, and 11 months after last Plasma 4 feature release which was part of the KDE Software Compilation 4.11. It featured an all-new shell written in QML and Qt Quick with infrastructure to switch between different form factors at runtime – ever wondered why the file it stores your desktop config in is called plasma-org.kde.plasma.desktop-appletsrc? It’s because your settings are stored per form factor.

Plasma 5 also came with a new theme titled “Breeze” with a frosted glass effect behind its panels and popups as opposed to the blurred transparency of its predecessor “Air”. This was done to avoid contrast issues with text on some, particularly dark, backgrounds. The unified System Tray popup that we still use today also had its debut then. Additionally, the window switcher, activity switcher, and widget explorer were all moved to a vertical sidebar on the left hand side to accommodate the now ubiquitous wide-screen monitors, a decision that was later criticized and ultimately let us choose a more traditional window grid again for Plasma 6’s Alt+Tab feature.

System tray popup showing the list of passive tray icons in a list
Unified System Tray popup, a staple of every Plasma desktop since 5.0

Neither the Breeze icon theme nor the Breeze window decoration were fully finished in time for the release, which meant that apart from the Plasma shell, visually the experience was very similar to using the KDE Software Compilation 4. Above all due to the fact that it wasn’t until December that we shipped our first KDE Applications based on Frameworks 5.

While there already was a Breeze window decoration featuring the meanwhile abandoned dark title bar and circle close button, it was built using Aurorae, the QML window decoration engine. Unfortunately, its new hardware-accelerated Qt Quick Scene Graph in Qt 5 didn’t interface well with KWin’s own rendering pipeline yet. Instead, a new KDecoration2 library was created to shed its predecessor’s dependency on X11 and Qt Widgets. However, the initial commit didn’t even land in KDE Git repositories until 18th July, three days after the release of 5.0.

Various sticky notes of different color placed on the desktop
You ain’t working hard enough if your desktop isn’t cluttered with sticky notes!

Unlike Plasma 6 which is obviously already built around Qt Quick and thus porting widgets was relatively straightforward, for Plasma 5 we actually had to rewrite them all. Only a few had previously been ported to QML in the late 4.x era, like the battery monitor, task manager, or virtual desktop pager. This meant that Plasma 5.0 featured a greatly reduced set of widgets, notably lacking most of the KDE Plasma Add-ons. Aside from that, in preparation for Plasma on Wayland, KWin’s binary was renamed kwin_x11 but kwin_wayland would only follow a few months later.

Plasma 5.1, published in October 2014 marked the return of the Sticky Notes widget as well as a few other omissions from the initial release. It also introduced the Clipboard applet in System Tray, replacing the QtWidget-based Klipper of Plasma 4. Alongside the re-introduction of the “Icon Tasks Manager” that behaves more like a Dock, mixing launchers, windows, and applications, it also saw the implementation of the “Alternatives” feature for quickly switching between similar widgets, such as regular task bar and icon task bar, or between different application launchers or clock styles.

Plasma config dialog showing Fuzzy Clock Settings, options include bold and italic text, and the “fuzzyness” slider ranging from “Accurate” to “Fuzzy”
We sure have come a long way in terms of UI design… (admittedly, Qt didn’t have great high-dpi support back then)

Speaking of clocks, I ported the most important of them all: Fuzzy Clock. Originally, it used JavaScript in the translation file (!) to transform “half past 8” to “halb 9” in German. I couldn’t figure out how to replicate that from QML since it didn’t know what to do with a KLocalizedString instance. Hence, I wrote a PHP script (it’s all the scripting languages I knew at the time) to generate the Array of 5-minute interval strings you still see in there today – true meta-programming! Finally, the Breeze widget style was now available for Qt 4 applications, making sure that visually both old and new looked indistinguishable.

Plasma 5 goes mainstream

The first release that saw widespread adoption was Plasma 5.2, released on 27th January 2015 and oh boy was that a psychedelic wallpaper! KScreen saw its return with automatic display configuration and remembering screen layouts based on the connected devices. Early Plasma 5 nevertheless had a couple of multi-monitor issues. This was also in part part due to bugs in then-new QScreen that we used instead of Plasma 4’s own Kephal library since we wanted to have a single source of truth for output configuration. I remember a colleague at work trying out Plasma 5.2 on Kubuntu 15.04 on his shiny new Dell laptop with high-dpi screen and was not very satisfied with the setup on his external 24″ monitor. To be fair, most of his issues were actually related to X11 not supporting per-display scaling.

Plasma dashboard view (darkened background) with two widgets (a red sticky note and fuzzy clock) ontop of it.
Remember the Dashboard? Originally, there was another layer to place your widgets

Plasma 5.2 furthermore introduced the “Undo” feature when removing a Plasmoid. Shortly afterwards I assumed maintainership of PowerDevil, KDE’s power management service, and set up this very blog instance. In March 2015 I attended my first Plasma sprint in the Blue Systems Barcelona offices. It’s when we persuaded Ken Vermette (who even brought a French press in his suitcase all the way from Canada) to ship the wallpaper he had been using on his laptop as the default in Plasma 5.3, something he continued doing for many years, leaving a lasting impression on Plasma 5’s visual identity. It was also the inception of the Energy Info module, the first KCM (“KDE Configuration Module”) written in QML, and it unfortunately shows. The code hasn’t changed much since then, including its custom Canvas-based graph as we didn’t have a good QtQuick-compatible chart plotting library yet. The “wake-ups” API in UPower is long gone, however, and it’s definitely one of the user interfaces that in hindsight I am a lot less proud to still see around.

Early screenshot of the Energy info KCM, showing a rough blue charge percentage graph of the last hour, and a list of applications consuming energy, among them Amarok and the MySQL daemon.
Amusingly, this file was named sexystats.png – not so sure about that ;-)

DDC (Display Data Channel) support in PowerDevil to control desktop monitor brightness is something I worked on at the time but it took many years (and in fact someone else to implement it) before it got actually shipped with Plasma. So much for “I’m quite confident to get that into 5.3.”. We might finally see multi-monitor brightness controls in a subsequent Plasma 6 update, though with HDR support many aspects of that need to be entirely reworked. A project I started that year which didn’t make it either is KDE Connect integration in Solid, KDE’s Hardware abstraction framework. The idea was to show devices paired through KDE Connect as removable storage just as any local USB stick would.

One year later

Plasma 5.4, released in August 2015, just after that year’s Akademy saw the return of KRunner’s history. David Faure told me at the conference he couldn’t switch to Plasma 5 without it, so here we are. This release was also the first to integrate with Qt’s relatively new high-dpi support and gave us a properly scaled user interface for applications, including spacing and line art, rather than just enlarged font sizes and icons. Plasma 5 from its inception was designed with high-dpi in mind and had its own scaling mechanism which predated Qt’s. It took us a long time to make the two work well together and only in Plasma 6 we were confident enough to make the Plasma shell scale its UI entirely using Qt’s mechanism by default under X11.

Dolphin file manager showing my home directory with its config dialog open, all controls (shadows, frames, buttons) are quite large because of newly introduced high-dpi scaling support
Dolphin in high-dpi Breeze glory for the very first time

Additionally, the Volume Plasmoid designed around PulseAudio (plasma-pa) replaced KMix. The full-screen application dashboard useful for convertibles and touchscreen laptops had its debut. And let’s not forget: Plasma Mobile was introduced in 2015, too! Seeing the volume popup I know from my laptop plop up on one of the Nexus 5 devices as I pressed the volume rocker was truly mind-blowing. People argued the purpose of Plasma Mobile a lot but thanks to Plasma’s modular nature much of its code was shared with its desktop counterpart. Also, much of the initial advances of Plasma on Wayland were driven by it since you really don’t want to have an X Server running on your phone. Some long-time KDE fellows might be able to tell you stories of a company that actually tried…

User switcher popup in a panel, listing a bunch of users as well as lock screen and logout options.
User switcher Plasmoid

One of my clients at the time was running Plasma 4 on a single shared computer they used for accounting and purchase. For ease of operation (they’re not computer-savvy people after all) I had installed the Fast User Switch Plasmoid. When it came time to migrate them over to Plasma 5, I naturally needed a replacement. Therefore, I wrote a clone of said applet in QML and upstreamed it to KDE Plasma Add-ons where it was released as part of Plasma 5.5 in December 2015. During its development I wrote a SessionsModel class for conveniently enumerating all logged-in users. Utilizing it, I created a proper user switcher for Plasma (nowadays we merely jump to the user switcher we already have on the lock screen), mimicking the look of the logout screen. This change actually made it into a printed issue of Linux Magazin! Previously, KRunner was in charge of that, a rather odd UI choice, I think. Fun fact: you can still type “SESSIONS” (all-caps) into KRunner today to bring up the list of logged in users.

Originally, we considered XEmbed, a protocol to embed X11 windows into other windows used for System Tray icons back in the days, obsolete. Nevertheless, we received many requests to restore support for legacy tray icons. That is why we came up with “XEmbed SNI Proxy” which acts as an XEmbed endpoint for apps to enroll their tray window with and translate them into proper icons registered with the contemporary Status Notifier Item DBus specification.

Plasma 5.5 is also when we started doing releases Fibonacci-style with the first update after a feature release scheduled just one week later, then another week, then two weeks, three weeks, and finally five weeks, just before the next feature release. This ensures that fixes for issues found in one of the new features reach users promptly. We’ll continue doing that for early Plasma 6, particularly for important additions to the Wayland session, but eventually we might consider slowing down a bit to take pressure of distributions having to package it all.

Jump list galore

Taskbar in various configurations (horizontal panel, vertical panel, floating on desktop) with Dolphin, Chrome, Qt Creator, Chromium. Chromium displays a “1” badge and download progress of about 50%.
Unity Launcher API in action (number badge and progress reporting) – also mind everyone’s favorite cashew!

I’ve always been jealous of Windows 7’s ability to display application progress, quick launch shortcuts, and recent documents in its task bar. I spent most of my Christmas vacation in 2015 implementing the so-called “Jump Lists” in Task Manager. Ubuntu’s then-current Unity desktop already implemented a DBus API for application badges and progress reporting that was already widely supported in non-KDE applications through libunity. Alas, I never wrote a KDE Frameworks equivalent, so the few KDE applications that make use of it (e.g. KDevelop for displaying compilation progress in task bar, or various chat applications indicating unread messages) just emit the relevant DBus signals directly. Only in Qt 6.5 did we finally get QGuiApplication::setBadgeNumber as a partial cross-platform replacement for the discontinued QWinTaskbarButton.

On top of that, applications can define additional actions in their desktop file that are listed in the relevant launcher context menu – be it pinned applications in task manager or the Kickoff menu. Notable examples are “Open new incognito tab” for a browser, or “Compose new message” for a mail client. Around the same time Spectacle, our handy screenshot tool, saw the light of day, replacing KSnapshot, and of course I added a bunch of shortcuts for its various modes (such as “Take Rectangular Region Screenshot”), even though I usually just hit Meta+Shift+PrtScr (or Meta+R in Plasma 6 but that’ll always be “Run Command” to me) to take a region screenshot

Wifi On OSD
Never implemented due to the kernel just side-stepping us here: Feedback OSD when toggling Wifi via keyboard shortcut

Plasma 5.6, released in March 2016 had the first release announcement to feature an introduction video with a narrator and all. It also enabled the Breeze Plasma theme to follow the current color scheme – there’s nothing like a Honeycomb Kickoff to brighten up your day! One thing we naturally don’t want to talk about is application crashes, which is why it’s not mentioned in the announcement that starting in this version DrKonqi, our crash handler, shows a sleek Plasma notification instead of its main window. The idea is to get you to re-launch your app as fast as possible and not add insult to injury by having you also close a stupid dialog window on the way.

Getting Physical @ CERN

One of my personal KDE career highlights was the 2016 Plasma Sprint at CERN (yes, the one with the particle accelerator) near Geneva, Switzerland. The event took place in their IdeaSquare, a place to collaborate and innovate within CERN, including a red ex-London double-decker bus parked in the middle of the building as a retreat, should you need to think about things in silence. It’s also when I tried to log into a Plasma Wayland session for the very first time.

Getting Physical @ CERN sprint 2016

Since Switzerland, and Geneva in particular, is quite expensive, for dinner we usually walked the 3km or so to neighboring village of Saint-Genis-Pouilly in France trying to find some more affordable restaurant options. As I came to the event by car, we also used it to buy cheap(er) beer in a French grocery store and sneakily drank it in the CERN cafeteria until they kicked us out at night. I sadly missed the tour of the particle accelerator (they also used Plasma 4 in their control room from what I heard) as I had already arranged to go skiing the adjacent weekend over in Austria.

Plasma 5.7, released in July 2016 made Jump Lists available through KRunner, too. We also came up with a way to colorize Breeze icons at runtime, replacing its dark strokes with white ones for use in dark themes as well as when used on top of the blue menu highlight. It’s done by merely altering the SVG string at load time, replacing a bunch of CSS rules. I hope with Qt’s renewed interest in icon theming we’ll get that functionality into Qt eventually. We also introduced the modular libtaskmanager with support for Wayland windows. It essentially does “functional programming” through QAbstractItemModel, stacking a bunch of proxy models on top of each other, each one executing a specific transformation (group by application, filter by desktop, etc) on the list of windows. Sadly, it lost the Win32 EnumWindows functionality in the process – yes, Plasma could display your Windows windows at some point!

Picture of Randa vaillage, a single road with houses on either side, railway tracks to the right, rest mostly green lawns. Background shows mountains.
Randaaaa, Valais, Switzerland – most beautiful village to host a developer sprint

In June 2016 I went to Randa Meetings in the Swiss Alps, one of the most productive sprints I’ve ever attended. Admittedly, there wasn’t much to do besides hacking all day and eating Swiss Chocolate. If you ever wondered whose finger it is pointing at me on my Phabricator profile picture: it’s David Edmundson’s. We had a bit of white wine that evening and while listening to music together decided it was a good idea to take random profile pictures. During our stay we also visited the village of Zermatt near infamous Matterhorn, a place devoid of cars! The only vehicles you’ll find there are small golf cart like electric vehicles to transport people and goods to one of the many hotels. It’s also where I had the most expensive scoop of vanilla ice-cream in my life. We also took the cable car up a mountain (which wasn’t Matterhorn but I can’t remember which one it was) and hiked back down, all the while talking about the then-new Qt 5.7 release.

KDE turns 20

I still fondly remember the first week of September 2016 when Akademy was co-hosted with Qt Con in Berlin. A bunch of KDE folks and I shared an apartment in Friedrichshain and the weather was just beautiful. Every morning we cycled from our apartment through Brandenburger Tor, past Siegessäule, to TU Berlin “MAR Building” where the BoF sessions were located.

Plasma startup screen, KDE logo on an intense blue background gradient with a progress bar underneath
Better use protective eye wear

Plasma 5.8, released in October 2016, just before KDE’s 20th birthday, is when we became really confident in Plasma 5 as a product and made it our first LTS (long-term support) release. Originally, we also considered Plasma 5.6 for that. It was also coming together nicely with Qt 5.6 declared an LTS release. To celebrate the occasion, we even got Chris Fisher of The Linux Action Show to voice our release announcement video! It’s also when we tried to unify the whole startup and shutdown experience and brought you the Blinding Blue™ colored login screen. Sorry about that! Actually, I had one of my office walls painted that color and I love it.

Typically, the first feature update after an LTS is the time to add fancy new features. Plasma 5.9, released in January 2017, sees two of the features I am still most proud of and enjoy every single day when using Plasma: audio indicators in task bar and draggable notification thumbnails. Being able to press a shortcut, take a screenshot, and then drag it from the preview in the notification popup straight to where I need it, the web browser, an email composer, or a chat client, is an unbelievable productivity booster.

Furthermore, web browsers back then already indicated which tab was playing audio, therefore it felt natural to have Plasma’s task manager do the same. Unfortunately, the audio stream isn’t actually attached to a window, thus every window of the same app will show the indicator. While PulseAudio actually supports apps associating their audio stream with an X11 window ID, I have never seen this actually used in practice and of course that wouldn’t help us much under Wayland. It gets even more complicated when you consider sandboxing (where the process ID a client reports might be in a different namespace from the Plasma shell) or a web browser’s multi-process architecture (where the process owning the window is not necessarily the one managing audio streams).

Plasma Sprint in Stuttgart

A bookshelf with colorful insets, and two KDE logos drawn on a black board, “2017” tag on them
Last time I checked the KDE decoration they put up for us was still there

In 2017 I organized the Plasma Sprint in Stuttgart, kindly hosted by my employer at the time. That’s when I unveiled Plasma Browser Integration, an extension for Firefox and Chrome to more tightly integrate them with the Plasma desktop. I realized that people spend most of their time on a computer actually on the web and with KDE not having a stake in any of the major browsers anymore it became virtually impossible to seamlessly bridge the two worlds. KDE Connect integration, finding browser tabs through KRunner, and download reporting in Plasma’s notification center were my main motivation for fathering this project.

Plasma system tray with a smirking face icon and tooltip “Incognito Tabs”
Didn’t make the cut: Incognito tab indicator in Plasma Browser Integration

One night we went up the Fernsehturm (TV tower) in Stuttgart which had only recently reopened after renovation owing to fire safety regulations. I haven’t been up there there myself despite growing up in The Länd™ so I figured it’d be a nice social event. It’s that day when at 147 meters above the ground we brainstormed apps surviving a crash of the Wayland compositor for the very first time. Aside from that, during the sprint, some folks went to local Media Markt and bought a floppy drive. This allowed me to fix Solid erroneously calling them “0 Byte removable media”. It actually wasn’t until KDE Gear 23.08 of last year that KFloppy, a tool to format floppy disks, was finally allowed to retire.

That year is when we coined the expression “Simple by default, powerful when needed” that captures the spirit of Plasma very well. Out of the box, it just works for the majority of our users whereas it also lets them tailor it to their very specific needs. Back in the days, I had to spend forever wading through config dialogs before I was satisfied with the KDE desktop experience. Nowadays, I just move the panel to the top and window buttons to the left because I prefer it that way and call it a day.

Kate window not responding because it received SIGSTOP, window desaturated to visalize it’s unresponsive
Unresponsive apps get desaturated since Plasma 5.10

I didn’t attend Akademy 2017 in Almería for personal reasons. Nevertheless, I actually received an Akademy Award for my work on Plasma which is complementing the blue wall in my office very nicely. Due to my absence, I received it by mail alongside an Akademy T-Shirt. The yellow sun with KDE logo is still one of my favorite designs and I wear it a lot!

In 2018 I joined Blue Systems to work on KDE software full-time. Of course that meant that there’s now so many more things to talk about that it would surely go beyond the scope of this post, therefore I will wrap it up here since – as always – there has to be some material left for a sequel. I hope you enjoyed dwelling in the past with me for a while and it made you just as excited as I am about the next decade with Plasma 6. We undoubtedly wouldn’t be here without your continued generous donations, support, and contributions!

Konqi, a cute green dragon with a red K bandana, standing confident and giving a thumbs up
“Here’s to the next 10 years” (CC-BY-SA 4.0 Drakonic)

Discuss this post on KDE Discuss.