Skip to content

Welcome to Planet KDE

This is a feed aggregator that collects what the contributors to the KDE community are writing on their respective blogs, in different languages

Thursday, 30 November 2023

Qt for MCUs 2.5.2 LTS (Long-Term Support) has been released and is available for download. As a patch release, Qt for MCUs 2.5.2 LTS provides bug fixes and other improvements, and maintains source compatibility with Qt for MCUs 2.5.x. It does not add any new functionality.

Wednesday, 29 November 2023

KDiagram is two powerful libraries (KChart, KGantt) for creating business diagrams.

Version 3.0.0 is now available for packaging.

It moves KDiagram to use Qt 6. It is co-installable with previous Qt 5 versions and distros may want to package both alongside each other for app compatibility.

SHA256: 6d5f53dfdd019018151c0193a01eed36df10111a92c7c06ed7d631535e943c21

Signed by E0A3EB202F8E57528E13E72FD7574483BB57B18D Jonathan Esk-Riddell

KWeatherCore is a library to facilitate retrieval of weather information including forecasts and alerts.

0.8.0 is available for packaging now

SHA256: 9bcac13daf98705e2f0d5b06b21a1a8694962078fce1bf620dbbc364873a0efeS
Signed by E0A3EB202F8E57528E13E72FD7574483BB57B18D Jonathan Esk-Riddell <>

This release moves the library to use Qt 6. It is not compatible with older Qt 5 versions of the library so should only be packaged when KWeather is released or in testing archives.

En route to the new Plasma, Frameworks and Gear

Every few years we port the key components of our software to a new version of Qt, taking the opportunity to remove cruft and leverage the updated features the most recent version of Qt has to offer us.

It has been nearly 10 years since the last big release of our flagship Plasma desktop environment, and the time has come again. KDE is making available today the Beta version of all the software we will include in a megarelease scheduled for the end of February 2024.

To ensure all parts of KDE's software stack are working together, we are releasing all our major bundles at the same time. Today sees the continuation of that journey with the Beta releases of Plasma 6, KDE Frameworks 6 and the KDE Gear bundle of apps.

This is a very early preview intended for developers and testers only. We hope it will be picked up by rolling unstable distros, but it is far from being ready for day-to-day use yet.

Read on to find out more about KDE's 6th Megarelease, what it covers, and how you can help make the new versions of Plasma, KDE's apps and Frameworks a success now.


Plasma is KDE's flagship desktop environment. Plasma is like Windows or macOS, but is renowned for being flexible, powerful, lightweight and configurable. It can be used at home, at work, for schools and research.

Plasma 6 is the upcoming version of Plasma that integrates the latest version of Qt, Qt 6, the framework upon which Plasma is built.

Plasma 6 incorporates new technologies from Qt and other constantly evolving tools, providing new features, better support for the latest hardware, and supports for the hardware and software technologies to come.

You can be part of the new Plasma. Download and install a Plasma 6-powered distribution (like Neon Unstable) to a test machine and start trying all its features. Check the Contributing section below to find out how you can deliver reports of what you find to the developers.

KDE Gear

KDE Gear is a collection of applications produced by the KDE community. Gear includes file explorers, music and video players, text and video-editors, apps to manage social media and chats, email and calendaring applications, travel assistants, and much more.

Developers of these apps also rely on the Qt toolbox, so most of the software will also be adapted to use the new Qt6 toolset and we need you to help us test them too.


KDE's Frameworks add tools created by the KDE community on top of those provided by the Qt toolbox. These tools give developers more and easier ways of developing interfaces and functionality that work on more platforms.

Among many other things, KDE Frameworks provide

  • widgets (buttons, text boxes, etc.) that make building your apps easier and their looks more consistent across platforms, including Windows, Linux, Android and macOS
  • libraries that facilitate storing and retrieving configuration settings
  • icon sets, or technologies that make the integration of the translation workflow of applications easier

KDE's Frameworks also rely heavily on Qt and will also be upgraded to adapt them to the new version 6. This change will add more features and tools, enable your applications to work on more devices, and give them a longer shelf life.


KDE relies on volunteers to create, test and maintain its software. You can help too by...

  • Reporting bugs -- When you come across a bug when testing the software included in this Alpha Megarelease, you can report it so developers can work on it and remove it. When reporting a bug
    • make sure you understand when the bug is triggered so you can give developers a guide on how to check it for themselves
    • check you are using the latest version of the software you are testing, just in case the bug has been solved in the meantime
    • go to KDE's bug-tracker and search for your bug to make sure it does not get reported twice
    • if no-one has reported the bug yet, fill in the bug report, giving all the details you think are significant.
    • keep tabs on the report, just in case developers need more details.
  • Solving bugs -- Many bugs are easy to solve. Some just require changing a version number or tweaking the name of a library to its new name. If you have some basic programming knowledge of C++ and Qt, you too can help carry the weight of debugging KDE's software for the grand release in February.
  • Joining the development effort -- You may have a deeper knowledge development, and would like to contribute to KDE with your own solutions. This is the perfect moment to get involved in KDE and contribute with your own code.
  • Donating to KDE -- Creating, debugging and maintaining the large catalogue of software KDE distributes to users requires a lot of resources, many of which cost money. Donating to KDE helps keep the day-to-day operation of KDE running smoothly and allows developers to concentrate on creating great software. KDE is currently running a drive to encourage more people to become contributing supporters, but you can also give one-time donations if you want.

A note on pre-release software

Pre-release software is only suited for developers and testers. Alpha/Beta/RC software is unfinished, will be unstable and will contain bugs. It is published so volunteers can trial-run it, identify its problems, and report them so they can be solved before the publication of the final product.

The risks of running pre-release software are many. Apart from the hit to productivity produced by instability and the lack of features, the using pre-release software can lead to data loss, and, in extreme cases, damage to hardware. That said, the latter is highly unlikely in the case of KDE software.

The version of the software included in KDE's 6th Megarelease is beta software. We strongly recommend you do not use it as your daily driver.

If, despite the above, you want to try the software distributed in KDE's 6th Megarelease, you do so under your sole responsibility, and in the understanding that the main aim, as a tester, you help us by providing feedback and your know-how regarding the software. Please see the Contributing section above.

Tuesday, 28 November 2023

In the third installment of Off-Theme, we cover Shades of Purple, a global theme with a rather striking set of shades that sets it apart from many other flat themes.

Monday, 27 November 2023

We're happy to announce the new release 5.12.0 of KPhotoAlbum, the KDE photo management program!

20 years KPhotoAlbum

This is some kind of "special" release, as exactly 20 years ago, on 2003-11-27, version 1.0 was tagged (we tagged this release already on saturday, so that it will hit the mirrors and we can publish this release announcement at this very date though ;-).

20 years is quite a long time for such a "small" FLOSS project. Enough times, nice programs die from bit rot, because the only dev or too many of the few lose interest in it, don't need it anymore and/or nobody wants to take over maintainership. Happily, this is not the case for KPA! After all these years, the project is still alive and kicking, and – when the family, the job and everything else allow it (after all, we're all not fulltime KPA devs), we work on it to make it better.

Just speaking of me, I joined the project back in 2014, almost ten years ago now (which is arguably also quite a long period of time). And I'm really proud to still be a part of this great project :-)

So, I think it's time to especially thank Jesper Pedersen for initiating the project back then, and Johannes Zarl-Zierl for taking over the maintainership and being the project leader since 2019! Joyfully, Jesper never really stopped contributing to KPA and still works on it until now.

After all, we're still – without too much self-laudation – a small but excellent crew of FLOSS enthusiasts ;-)

But about the release itself:

What's new?


Most notably, we could fix a really big amount of crashes and unexpected behavior. The following bug reports could be closed as "fixed": #472427, #472523, #473231, #473324, #473587, #473762, #474151, #474392, #475387, #475388, #475529, #475585, #476131, #476561, #476651, #476862 and #477195. That's quite an impressive list, isn't it?!

Kudos to our new super-diligent beta tester Victor Lobo for filing 17 of those bug reports alone, always providing meaningful information about how to reproduce the issue and tirelessly testing the fixes. Thank you! As a dev, you really appreciate this! Apart from that, also big thanks to Pierre Etchemaïté and Andreas Schleth for providing equivalently excellent bug reports!

Thanks to you all for helping making KPhotoAlbum better!

New features and changes

Apart from that, there are also some new interesting features:

  • Support annotating images from the viewer by using letters to assign tags. Use the context menu and select "Annotate | Assign Tags" to enable. More information is available in the KPhotoAlbum handbook.
  • Add option to sort category page by natural order (feature #475339). Natural sort order takes the locale into account and sorts numeric values properly (e.g. sort "9" before "10").
  • Allow selecting a date range in the DateBar via keyboard (Use "Shift + Left|Right")
  • Allow closing the annotation dialog's fullscreen preview using the Escape key.

… as well as sone changes:

  • In the viewer window, using the letters A-Z to assign tokens now needs to be explicitly enabled. You can do this by opening the context menu and selecting "Annotate | Assign Tokens".
  • When KPhotoAlbum is started in demo mode and a previously saved demo database exists, the old demo database is no longer overwritten.
  • The ui.rc file (kphotoalbumui.rc) is now deployed as a Qt resource instead of an on-disk file.
  • Improved usability of "Invoke external program" menu (#474819)
  • No longer set the default shortcut for "Use current video frame in thumbnail view" to Ctrl+S and avoid shortcut conflict.
  • Restrict context menu entries for fullscreen preview of annotation dialog to a sane set of actions.
  • It is no longer possible to annotate images from the viewer by pressing "/" and typing tag names.
  • It is no longer possible to change an image through the annotation dialog's fullscreen image preview.

Thanks to everybody involved!

According to git, the following individuals pushed commits:

  • Yuri Chornoivan
  • Friedrich W. H. Kossebau
  • Nicholas Leggiero
  • Tobias Leupold
  • Alexander Lohnau
  • Scarlett Moore
  • Jesper K. Pedersen
  • Johannes Zarl-Zierl

Thanks for spending your time with coding on KPA and for contributing your work!

Have a lot of fun with the new release, and keep KPA the best photo management program out there, also for the 20 years to come :-)

— Tobias

We’re already in November, but I managed to do a lot of work this month which I’m really happy about.

Quickly something that’s not strictly programming: I was accepted as a member of KDE e.V. early this month, thank you all very much! I was also given moderation powers on Discuss so maybe it will stop rate limiting me when moving posts around.

I also went on a crusade of merging and triaging merge requests on Invent, which some of you might’ve seen. Notably I was able to take care one or two pages worth of open MRs, which I’m really happy about.

Without further ado, let’s begin.

Plasma #

Feature Merged the Game Controller KCM into Plasma, starting with a simple rewrite in QML. I’m aiming to add back the visual representation in 6.1 (which still exists in the standalone repository if you want to take a shot at it.) At least for right now the code is much better and it supports more devices than the 5.X Joystick KCM ever could. 6.0

The new and not much improved Game Controller KCM
The new and not much improved Game Controller KCM

My hope is that since it’s much cleaner and easier to work with, it would invite more contributors… and it’s already doing that as we speak! :-)

NeoChat #

Feature Blockquotes now look more like quotes, and no longer just somewhat indented blocks of text. 24.02

New blockquote stylings
New blockquote stylings

Bugfix You can now right-click (or long tap) on rooms to access the context menu without switching to it. I gave the treatment for spaces a while back. 24.02

Feature Added UnifiedPush support! It’s functional already and I have used it to receive push notifications even when NeoChat is closed. 24.02

Tokodon #

Feature I merged the post redesign I was teasing on Mastodon, which includes better margins and standalone tags. 24.02

The new post design, which includes standalone tags!
The new post design, which includes standalone tags!

Feature The language selector is now a regular dialog and not the buggy custom combo box we had before. It now displays the native language name, if available. 24.02

The new language selector
The new language selector

Feature Muting and blocking users has been accessible through profile pages, and now those actions are present in the post menu like on Mastodon Web. Useful for taking action against harmful users without navigating to a cesspool of a profile too. 24.02

Feature Added a report dialog. It’s a little basic right now, which I want to improve before release. 24.02

The new report dialog
The new report dialog

Feature Rebased and merged Rishi’s Moderation Tool, which works fantastic and I used this to test my reporting feature! 24.02

Feature Added a way to filter out boosts and replies from timeline pages. 24.02

New filter controls
New filter controls

Feature Added supports for lists. You can’t add people to lists (you must use another client to do that) but you can at least view and manage them. 24.02

New list management
New list management

Kiten #

Bugfix Marked the X11 socket as fallback. This removes a warning on the Flathub page about the deprecated windowing system. 23.08

Now the Flathub page is all green!
Now the Flathub page is all green!

Bugfix Numerous UI improvements, such as improving the margins of configuration dialogs. I also redid the toolbar layout. 24.02

The new toolbar layout
The new toolbar layout

Feature Added a search function to the Kanji browser. 24.02

Kirigami #

Bugfix Fixed an edge cases of ToolBar incubation, which liked to spam logs. I squashed some other log spam, so Kirigami applications should be less noisy. 6.0

Feature Added a property to FlexColumn that allows you to read the inner column’s width. We use this in Tokodon to set the width of the separator between posts. 6.0

Craft #

I’m getting addicted to fixing Craft recipes, and there’s a lot to fix in the upcoming 6.0 megarelease:

KUnifiedPush #

Feature Improved the look of it’s KCM. Not only does it look nice, and it’s design is more in line with other list based ones.

The new look for the Push Notifications KCM!
The new look for the Push Notifications KCM!

PlasmaTube #

Feature Added better hover effects for video items. I did a bunch of refactoring to unify the two types (list and grid) so they work better in general (especially for keyboard-only navigation.) 24.02

Feature Added a video queue system, which is exactly what you think it is. You can queue up an entire playlist, or add videos manually like on YouTube. 24.02

Feature Different types of search results is supported now, so you can find channels and playlists. 24.02

Feature Public Piped instances are now fetched and displayed on initial setup. 24.02

Feature Features of PlasmaTube that are unsupported by the current video source are now disabled or hidden. This should result in less buggy and broken looking behavior depending on which video source you use. 24.02

Feature Added support for MPRIS, which is used by the Media Player applet, the lockscreen and KDE Connect. 24.02

Accessibility #

Bugfix Fixed our spinboxes not being read correctly by screen readers, since they were editable by default. Now the accessible descriptions and other data is passed down to the text field. Fixed in QQC2 Desktop Style (used on Plasma Desktop) and QQC2 Breeze Style (Plasma Mobile and Android.) 6.0

Documentation #

Found lots more missing Bugzilla links in Invent, and did some more README updating!

KWeather #

Bugfix Fixed the setup wizard. 24.02

Upcoming #

Feature Not merged yet, but I’m adding a pen calibration tool to the Tablet KCM. If you have the required equipment and can test, please help out! It’s cutting it close to the feature freeze, so this will most likely be pushed off until 6.1.

The new calibrator
The new calibrator

See you in December!

Saturday, 25 November 2023

Following my recent post on porting KDE Android applications to Qt 6 and Ingo’s post on the CI/CD changes for APKs here are some more details about packaging changes for KDE’s Android apps.

APK packaging so far

The basic flow for creating APKs so far is:

  • ECM identifies the various pieces of information needed for androiddeployqt, such as the application binary, the location of the Android manifest file, Java source code, and install prefixes of dependencies.
  • androiddeployqt gathers all of this together into a temporary directory, considering things like link dependencies and additional dependency metadata. Offering very little external control this tends to err on the side of including too much in the package.
  • Gradle is then used to compile the Java code (if any) and create the actual APK. This offers some limited amount of control for excluding unused files.

This isn’t pretty but kinda worked so far. With the KF6 transition we hit a limit there though, with the combination of androiddeployqt and Gradle failing to properly strip and exclude all debug information. That’s not breaking the APK as such, but it massively bloats its size.


Our APK builds are driven by Craft, which manages the build environment and takes care of building all dependencies as well. It however also has infrastructure for packaging, something we haven’t used for APKs so far.

That changed now though, solving the above mentioned debug information problem and giving us much more fine-grained control over what goes into the APK, and doing that in a way that’s easy to manage even (ECM MR, Craft MR).

Craft has multi-level exclusion lists for defining patterns that should not be in the package:

  • A global list that applies to all package on all platforms. This typically contains development files and development tools that are needed to build the application but that aren’t needed at runtime.
  • A platform specific exclusion list. For Android this could contain for example Qt Quick Controls styles we don’t use there, or translations for locales not available on Android.
  • Application-specific exclusion lists, for anything not used by a particular app.

Being able to manage the first two in a shared place is a major benefit, as those lists tend to be long and change quite a bit over time as libraries/dependencies evolve.

Adapting applications

No changes are required for applications to benefit from this for the most part, only adding an application-specific exclusion list requires a minor change to the Craft blueprint.

class Package(CMakePackageBase):
    def __init__(self):
        # register application-specific exclusion list
        self.blacklist_file.append(self.packageDir() / "blacklist.txt")

The format of the exclusion list file itself is rather intuitive, consisting of one regular expression applied to the full path per line.

# data files for ki18n that we don't need

# other KF6 data files we don't need

See the Kongress blueprint as an example.

Also, the previous mechanisms excluding files via build.gradle still works and is applied on top of this.

At this point nearly all the planned features for Plasma 6 are done, and everyone’s focus has begun to shift to bug-fixing and polishing. People are reporting plenty of bugs (most of them fairly minor) and we’re fixing them as fast as we can! In addition to that, some larger and more notable changes went in too:

KDE 6 Mega-Release

(Includes all software to be released on the February 28th mega-release: Plasma 6, Frameworks 6, and apps from Gear 24.02)

General infoOpen issues: 162

Shutting down or restarting the machine while in the Plasma Wayland session now causes apps with unsaved changes to prompt the user to save them, rather than just quitting immediately and losing the changes. No new Wayland protocol ended up being necessary after all! This was one of the last three Wayland Showstoppers (David Redondo, link)

“Bounce Keys” now fully work in the Plasma Wayland session. This was the second of the last three Wayland Showstoppers! Now we’re just down to one, and it too is being worked on! (Nicolas Fella, link)

Partition Manager no longer lets you write entries to your fstab file that could prevent mounting a partition in the future by closing the partition editing dialog without changing the mountpoint, when the mountpoint was previously undefined (Arjen Hiemstra, link 1 and link 2)

Files and folders created in ~/Desktop but outside of Plasma itself should now always appear there immediately (Harald Sitter, link)

Changing your user picture in System Settings now results in the picture in Kickoff changing immediately, rather than only after Plasma was restarted (Akseli Lahtinen, link)

Fixed a visual glitch in Kate and other KTextEditor-based apps involving the completion popup (Waqar Ahmed, link)

Since the API for Plasma Widgets has changed in Plasma 6, widgets that you migrate from a Plasma 5 installation but aren’t compatible with Plasma 6 are now shown in a relatively user-friendly way, so at least you know what to do and don’t think that Plasma 6 is just totally broken (Marco Martin, link 1, link 2)

When you’ve downloaded an offline update, there’s now an option to reboot without applying it on the next boot-up. We’re considering adding this as an option when shutting down, too (Kai Uwe Broulik, link)

The “Battery and Brightness” widget has been split into two new widgets: “Brightness and Color” and “Power and Battery.” The former one integrates controls for Night Color, so in the end the total number of widgets in your System Tray isn’t increasing; they’re just better organized and relevant now! (Natalie Clarius, link):

KMail now gains support for the beautiful new frameless styling in the Plasma 6 Breeze theme (Carl Schwan, link):

The “Kill unresponsive window?” dialog now exists in the Plasma Wayland session and has received a visual overhaul to brings its UI into the 21st century (Kai Uwe Broulik, link):

Spectacle now opens on Meta+Shift+S, for the benefit of those whose keyboards don’t have a PrintScreen key (Noah Davis, link)

Welcome Center gains a dedicated page shown to people who use the beta version of Plasma (Oliver Beard, link):

The Samba sharing configuration wizard has been fully ported to Qt6 (Harald Sitter, link)

Other Bug-Related Information of Interest:

This section is short because all notable bugfixes are included in the mega-release! Expect this to be more and more true as we get closer to the final release, which, as a reminder, is planned for February 28, 2024.

…And Everything Else

This blog only covers the tip of the iceberg! If you’re hungry for more, check out, where you can find more news from other KDE contributors.

How You Can Help

We’re hosting our Plasma 6 fundraiser right now and need your help! Thanks to you we’re past the 75% mark, but we’re not there yet! So if you like the work we’re doing, spreading the wealth is a great way to share the love. 🙂

If you’re a developer, work on Qt6/KF6/Plasma 6 issues! Which issues? These issues. Plasma 6 is usable for daily driving now, but still in need of bug-fixing and polishing to get it into a releasable state by February.

Otherwise, visit to discover other 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!

Friday, 24 November 2023

One of the the less apparent omissions in Plasma’s Wayland session compared to X was the lack of a prompt for terminating an unresponsive app. Of course, you should never see one because any decent app will just crash and quit rather than get stuck. Nevertheless, over the course of three evenings I spent way too much time making the “KWin Killer Helper” work on Wayland and while at it revamped its user interface entirely.

KWrite text editor window, desaturated, reading “Untitled – KWrite (Not Responding)” with a popup ontop of it reading “Untitled of KWrite is not responding. Do you want to terminate this application? Terminating this application will close all of its windows. Any unsaved data will be lost” with actions “Terminate KWrite” and “Wait Longer” (highlighted).
Isn’t it pretty? Of course this is staged using SIGSTOP – KWrite is awesome and never freezes like this!

It’s always fun to add your copyright from 2023 to a file with “© 2003” at the top. Times were surely different back then and what was considered good user interface design, too. The prompt for terminating an app is actually a separate executable since under X KWin isn’t really designed to open windows by itself and even under Wayland it’s tough. The helper might also use KAuth to end a privileged process. Being an external application, however, poses some challenges under Wayland because unlike X, it actually has some notion of security, and thus no random client can just mess with another one.

In order for the helper to attach itself to the frozen application window, it needs to use the XDG Foreign protocol. It’s designed for this particular use case of parenting oneself to a window in another process and used by for example the XDG Desktop Portal where a file dialog should appear as if it were coming from the application that requested it. The way it works is relatively simple: A client can ask the compositor to “export” a surface and receives a unique token for it. This token can then be passed to another application by any means (DBus, environment variable, doesn’t matter) which uses it to “import” that surface (to put it simply) and parent a window to it. But it’s a one-way street – you cannot pull a surface from another client, it has to send it to you.

KWin of course supports this protocol but its internals weren’t designed for it to launch an application by itself and export a surface to it, it would only export surfaces on behalf of an actual Wayland client. It took me like three different attempts to find a good solution everyone was happy about: just create an “exported surface” base class that is referenced internally and create a subclass including the Wayland resources when actually needed. I’m still having a bit of a hard time wrapping my head around the memory ownership model employed by Qt Wayland Scanner. It’s a build tool which takes a Wayland XML Protocol description and generates C++ classes out of it for use in your Qt application.

KWrite text editor window, desaturated, reading “Untitled – KWrite (Not Responding)” with a popup ontop of it reading “Application kwrite is not responding. You tried to close window Untitled from application KWrite (PID 1464283) but the application is not responding. Do you want to terminate this application? Warning: Terminating the application will close all of its child windows. Any unsaved data will be lost” with actions “Terminate Application kwrite” and “Wait Longer” (highlighted).
The original prompt, just running under Wayland. Quite a mouthful, isn’t it?

Next, I introduced a KillPrompt class that managed the life cycle of the process so its logic could easily be shared between X11 and Wayland windows. Originally, the X11Window class even used lowlevel ::kill(0) calls scattered throughout it to check whether the helper was still alive. Not something you would do today thanks to QProcess. The helper takes a bunch of command-line arguments, such as the window title, application name, process ID, etc. Instead of sending an X Window ID I used the UUID of the aforementioned exported surface and instead of using the “Window Class” I used the more contemporary “desktop file name” (application ID) – that’s also why the original version above reads “org.kde.kwrite” instead of just “kwrite”.

Additionally, instead of setting the “X User Time” for soothing KWin’s focus stealing prevention I generated an activation token to enable the dialog to properly focus itself. That’s using XDG Activation, a Wayland protocol for passing focus between programs, for instance clicking a link in a chat app should bring the browser to the front. The same principle applies: you ask the compositor for a token and then pass it to another application. However, the compositor may invalidate that token if you’re typing elsewhere in the meantime or the window wasn’t actually active at the time it requested the token and so on.

KWin also has a killPingTimeout option (despite what some people say about KDE software being jammed with settings, this one isn’t in a spin box in System Settings) which defaults to 5 seconds. When clicking the close button, at half that time the window gets de-saturated as “not responding” and once the full timeout has passed the prompt asks whether to terminate the application. Now you might be asking yourself: Wait a minute, I have seen my windows getting all washed out even without trying to close them?!

Same dialog, this time asking to terminate a browser window
I will never figure out the word wrapping logic for message boxes. Again, staged using SIGSTOP.

I congratulate you on using Wayland then! On X we only ping a window when asking it to close because we cannot really be certain that it will respond to our ping or even implement the interfaces that we need for that. On Wayland however, your typical floating desktop application will implement the XDG Shell protocol which handles things such as the window title, title bar buttons, and popup menus, and specifies a “ping” operation. In addition to pinging a window when closing it, KWin can also safely ping it whenever it gets focus, and thus realize sooner that it has become frozen.

Coming back to the timeout, I found that it was actually hard-coded to 1 second in the Wayland case. Sometimes even my IDE loading a large project or the email client handling lots of incoming messages was enough to cause a brief flash of white. How hard can it be to pass an int around? Well, KWin’s Wayland interfaces are to be kept separate from its main application logic (most importantly to ease unit testing but also historically from trying to make them available to others as a KDE Framework) so I couldn’t just access KWin’s options dict from there and read the setting out of it. Instead, I had to inject the value from the outside and refactor KWin’s startup a bit so that the XDG Shell integration is only initialized once the options have actually been read.

Dialog asking to permanently delete a QML file, instead of the regular warning icon there is a QML file icon (green sheet of paper) with an orange exclamation mark in the corner.
Concept: Should we use this icon with a badge design in more places?

Ultimately, I figured, if I’m working on this piece of code anyway, I might as well overhaul its design which hasn’t changed much in two decades. You might recall I like doing that sort of thing. First of all, I used the desktop file name to look up the actual application name. Next, I significantly reduced the amount of text – by the time you finished reading the original dialog, the app might already be responding again ;) Technical information like the process ID and host name (in case of remote X applications) was then tucked away in the expandable “Details” section. I also tried hard to remove the redundant application name from the displayed title but some apps use an ndash, some an mdash, some just a regular hyphen, and some even put it before the window title.

I furthermore felt the need to more prominently correlate the dialog to the application that is about to be terminated and used its icon instead of the generic orange exclamation mark. The overlay you can see in the screenshots was achieved using KIconUtils in our KGuiAddons framework which – instead of drawing a pixmap once – creates a “live” QIconEngine that can re-render when the window gets moved between screens of different DPI. Saved me quite some QPainter headaches right there! Finally, the helper received a proper .desktop file which is needed to give it an appropriate window icon. It also let me suppress the bouncing cursor it would otherwise get by setting StartupFeedback to false. Originally, I wanted to restore the “bomb” icon it used to have but given the circumstances I opted for that sad face we also use in DrKonqi when an application crashes.

Next time you’re wondering why it took so long to implement that tiny feature X and Y, think of me and all the plumbing that had to be done for a stupid freaking message box that you should never even see in the first place and the love and attention to detail that me and my fellow KDE developers put in our software. A good way to show your love for KDE is to donate to our Plasma 6 fundraiser! ♥

Discuss this post on KDE Discuss.