Skip to content

Saturday, 16 September 2023

This week it was pretty much all Plasma 6 all the time. With the release date four and a half months away, work is kicking into high gear to make sure that we hit our deadline!

Plasma 6

General infoOpen issues: 87

Made even more cursor responsiveness improvements for the Plasma Wayland session! The cursor is really very responsive now 🙂 (Xaver Hugl, link)

This work as also substantially improved latency in general, especially for games (Xaver Hugl, link)

Kickoff now has an option to move its sidebar over to the other side of the main view. This has better Fitts’ Law adherence and zero risk of accidental category switching if you use the mouse pointer to activate Kickoff and launch Favorites more often than you activate it with the Meta key or switch categories (Forest Ix, link)

The default keyboard shortcut used to open the Activity Switcher has been changed to Meta+A, so that its prior shortcut Meta+Tab can be used some something else, which is coming soon… (Niccolò Venerandi, link)

When you have Powerdevil configured to hibernate after a period of sleep, invoking sleep using KRunner now respects that preference and hibernates at the appropriate time (Natalie Clarius, link)

Sped up the launch time of Plasma and QtQuick-based KDE apps by loading the mobile text editing toolbar on demand, rather than always (Fushan Wen, link 1 and link 2)

fstab-mounted NFS drives no longer produce duplicate items in the Places panel of various KDE apps and the open/save dialog (Méven Car, link)

Discover now shows release data for SteamOS system updates in a prettier and more comprehensible way (Jeremy Whiting, link)

Discover’s “About” page now uses the newer and more attractive FormCard style (Carl Schwan, link):

A variety of QtWidgets-based dialog windows that have menubars or toolbars now use the common unified header style that KDE’s app windows use (Carl Schwan, link):

Created a new standard component: Kirigami.InlineViewHeader, and ported a bunch of list and grid views to use it (me: Nate Graham, link):

The “Upgrade your distro now” notification message is no longer radioactive (Oliver Beard, link)

Other Significant Bugfixes

(This is a curated list of e.g. HI and VHI priority bugs, Wayland showstoppers, major regressions, etc.)

Spectacle now takes Rectangular Region screenshots correctly when you’re using any screen scale factors less than 100% (Noah Davis, Spectacle 24.02.0. Link 1 and link 2)

Fixed a case where the touchpad daemon could randomly crash (Gabriel Souza Franco and Fushan Wen, Plasma 5.27.8. Link)

Fixed a rare case where KWin would crash in the Plasma Wayland session when waking from sleep (Xaver Hugl, Plasma 5.27.9. Link)

The Alt+Tab window switcher is now fully accessible via the standard Orca screen reader in the Plasma Wayland session (Fushan Wen, Plasma 5.27.9. Link)

While updating a lot of Flatpak apps at the same time, discover can no longer exhaust the system’s set of available file handles and then fail (Discover 5.27.9. Link)

Automatically turning off the keyboard backlight when on battery power now works, if you’ve configured it to do this (Nicolas Fella, Plasma 6.0. Link)

Fixed a bug that could cause KIO-using apps to crash when trying to overwrite a file under certain circumstances (Kevin Ottens, Frameworks 5.111. Link)

Other bug-related information of interest:

Automation & Systematization

Added autotests for KHamburgerMenu (Felix Ernst, link)

Added more autotests for window placement in KWin (Vlad Zahorodnii, link)

Fixed a flaky autotest for the Task Manager in Plasma, and also expanded it to cover more things (Fushan Wen, link)

Fixed a flaky autotest in KIO (Méven Car, link)

…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

If you’re a developer, work on Qt6/KF6/Plasma 6 issues! Plasma 6 is usable for daily driving now, but still in need of bugfixing and polishing to get it into a releaseable state by the end of the year.

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!

And finally, KDE can’t work without financial support, so consider making a donation today! This stuff ain’t cheap and KDE e.V. has ambitious hiring goals. We can’t meet them without your generous donations!

Friday, 15 September 2023

Let’s go for my web review for the week 2023-37.

Willingham Sends Fables Into the Public Domain

Tags: culture, law, public-domain

This is unclear on the technicalities (is it even possible to just claim it like this? is CC0 required? etc.). Still this is a bold move, hats off to this renowned author.

Google gets its way, bakes a user-tracking ad platform directly into Chrome | Ars Technica

Tags: tech, google, surveillance, attention-economy

If you’re still using Chrome, maybe you shouldn’t… They’re clearly making it easier to overcome ad blocker and the tracking won’t be a third party thing anymore, this browser will directly report on your behavior.

Meet the Guy Preserving the New History of PC Games, One Linux Port at a Time

Tags: tech, gaming, maintenance, culture

Interesting conservation work. Video games being part of our culture, especially indie ones, it’s important for such work to happen and be funded.

Touch Pianist - Tap in Rhythm and Perform Your Favourite Music

Tags: tech, music, funny

Really cool and fun experiment. Surprisingly relaxing I find.

If a hammer was like AI…

Tags: tech, ai, gpt, ethics, ecology, bias

Lays out the ethical problems with the current trend of AI system very well. They’re definitely not neutral tools and currently suffer from major issues.

Against LLM maximalism · Explosion

Tags: tech, ai, gpt, language

Now this is a very good article highlighting the pros and cons of large language models for natural language processing tasks. It can help on some things but definitely shouldn’t be relied on for longer term systems.

Computer Science from the Bottom Up

Tags: tech, system, unix, cpu, memory, filesystem

I didn’t read it since it’s basically a whole book. Still from the outline it looks like a very good resource for beginners or to dig deeper on some lower level topics.

A systematic approach to debugging | nicole@web

Tags: tech, debugging

Good process for fixing bug. Definitely similar to how I approach it as well.

A user program doing intense IO can manifest as high system CPU time

Tags: tech, io, storage, cpu, kernel, performance

A good reminder that depending what happens in the kernel, the I/O time you were expecting might turn out to be purely CPU time.

Linear code is more readable

Tags: tech, programming, craftsmanship

A bit of a rambling, there’s something interesting in it though. Splitting small functions early will do more harm than good if they’re not reused. Don’t assume they automatically make things easier to read.

Async Rust Is A Bad Language

Tags: tech, rust, asynchronous, criticism

More details are surfacing regarding async and Rust… definitely not a match in heaven it seems.

Good performance is not just big O - Julio Merino (

Tags: tech, performance, programming

Good list of things to keep in mind when thinking about performances. Of course, always measure using a profiler when you want to be really sure.

Response Time Is the System Talking

Tags: tech, queuing, networking, system, performance

Interesting way to approximate how loaded a system is.

FIFO queues are all you need for cache eviction

Tags: tech, caching

Interesting caching strategy. Looks somewhat simple to put in place as well.

Death by a thousand microservices

Tags: tech, microservices, criticism, complexity

Looks like the morbid fascination for microservices is fading. This is very welcome. This piece is a good criticism of this particular fad and gives an interesting theory of why it came to be.

Making visually stable UIs | Horizon EDA Blog

Tags: tech, gui, fonts

Think of the typography and fonts if you don’t want to have text jumping around in your GUI.

Bricolage | Some notes on Local-First Development

Tags: tech, web, frontend, crdt

Interesting, “state of the union” regarding local-first we frontend. Lots of pointers towards other resources too.

Multi-page web apps

Tags: tech, web, frontend, complexity

Good reasoning, multi-page applications should be the default choice for web frontends architecture. The single page applications come at a cost.

The Tyranny of the Marginal User - by Ivan Vendrov

Tags: tech, attention-economy, criticism, design, ux

OK, this is a very bleak view… maybe a bit over the top I’m unsure. There seems to be some truth to it though.

On Waiting - Tim Kellogg

Tags: management, organization, patience

This is a sound advice. In other words, don’t commit too early, only when you got enough information. Of course monitor to make sure you don’t miss said information.

Bye for now!

As last weeks post on countering string bloat has triggered some interest (and a few misunderstandings) here are a few more details on that topic. Nevertheless this isn’t going to be a comprehensive discussion of string handling in Qt (and was never meant to be), there’s plenty of posts and talks on that subject already out there if you want to dig deeper.

When to use QLatin1String

The KWeatherCore example in the last post was mainly discussing the use of QLatin1String in combination with Qt’s JSON API, as that has corresponding overloads. And that is a very important point, preferring QLatin1String over QStringLiteral for constant strings is only generally advisable if such overloads exist.

Things will work either way of course (as long as we are only dealing with 7bit ASCII strings), but at a cost. QLatin1String is implicitly convertible to a QString, which involves a runtime memory allocation of twice its size and a text codec conversion to UTF-16. QStringLiteral exists to avoid precisely that, and saving that runtime cost is generally preferable over a few bytes in storage.

So this is always a case-by-case decision. QLatin1String overloads only exist in places where they can actually be implemented more efficiently, and it only makes sense to add them in those cases.

Note that “overload” is to be understood a bit more loosely than in the strict C++ sense here. Examples:

  • String comparison and searching.
  • JSON keys.
  • QLatin1String::arg as an alternative for QString::arg.
  • String concatenations, in particular in combination with QStringBuilder.

Yes, exceptions might exist where the reduced binary size trumps the additional runtime cost, e.g. for sparsely used large data tables. But there might be even better solutions for that, and that’s probably worth a post on its own.


With the right choice being a case-by-case decision, there’s also understandably demand for better tooling to support this, search/replace isn’t going to cut it. While I am not aware of a tool that reliably identifies places where QLatin1String overloads should be used instead, there are tools that can at least support that work.

Clazy has the qstring-allocations static check to identify QString uses that can potentially be optimized to avoid memory allocations. This is actually the reverse of what is discussed here, so it’s a good way to catch overzealous QLatin1String uses. It has the second to lowest reliability rating regarding false positives though, so this is also not something to apply without careful review.

Clazy’s qlatin1string-non-ascii check is another useful safety net, finding QLatin1String literals that cannot actually be represented in the Latin-1 encoding.

Enabling QT_NO_CAST_FROM_ASCII also helps a bit as it forces you to think about the right type and encoding when interfacing with QString API.

The other aspect of tooling is looking at binary size impact of code changes. A simple but effective tool is bloaty, which is what produced the size difference table in the previous post. Make sure to strip binaries beforehand, otherwise the debug information will drown everything else.

For a more detailed look, there is also the size tree map in ELF Dissector.

Size tree map showing a large area pointing to QRC data compiled into KPublicTransport.
ELF Dissector's size tree map showing KPublicTransport, the big block in the center being QRC data.

Expected savings

How much savings to expect varies greatly depending on a number of circumstances. It’s also worth looking at absolute and relative savings separately. In the previously mentioned KWeatherCore example this were 16kB or 7% respectively.

This is due:

  • Few if any QLatin1String overloads were used, so a lot of room for optimization.
  • The library is very small and a significant part of it is JSON handling.
  • Other significantly more impactful optimizations to its static data tables had been applied previously (see e.g. this MR).

Let’s look at another example to put this into perspective, this change in KPublicTransport. Just like the KWeatherCore change this also changes QStringLiteral to QLatin1String in places where corresponding overloads exist, primarily in JSON API.

    FILE SIZE        VM SIZE
 --------------  --------------
  -0.1%     -16  -0.1%     -16    .eh_frame_hdr
  -0.1%    -144  -0.1%    -144    .eh_frame
  -0.1%    -430  -0.1%    -430    .text
  -0.9% -3.97Ki  -0.9% -3.97Ki    .rodata
  -0.3% -4.00Ki  -0.3% -4.54Ki    TOTAL

The savings here are lower though, just 4kB or 0.3%. This is due:

  • The majority of this code already uses QLatin1String overloads, the change only fixes a few cases that slipped through.
  • Unlike with KWeatherCore the QString overloads remain in use for generic code not using literal keys. We therefore see no reduction due to fewer used external symbols (.plt remains unchanged).
  • The library is much larger in total.
  • The data size is dominated by compiled in resources, primarily polygons in GeoJSON format (the big red box in the center of the above screenshot).

The latter would be the much more relevant optimization target here, as GeoJSON isn’t the most efficient way neither regarding space nor regarding runtime cost.

In general, the absolute amount of size reduction should be somewhat proportional to the amount of QStringLiteral changed to QLatin1String. If the relative change is surprisingly low, it’s worth checking what else is taking the space.

An even more extreme example that came up in discussions on this is Tokodon, where the relative reduction was just a fraction of a percent. A view in ELF Dissector reveals the reason for that, its giant compiled-in Emoji tables overshadowing everything else

Size tree map showing several large areas pointing to static Emoji data tables in Tokodon.
Size tree map for Tokodon, the large top left and center blocks are all related to static Emoji data.

Besides the data size (which wont be entirely avoidable here) this also involves a significant amount of static construction code, which is the even more interesting optimization target as it also impacts application startup and application runtime memory use.


As always with optimizations there is no silver bullet. Occasionally looking into the output of various profiling and analysis tools for your application or library usually turns up a few unexpected details that are worth improving.

Nevertheless I stand by my recommendation from last time to keep the seemingly minor details like the use of the right string API in mind. It’s an essentially free optimization that adds up given how widely applicable it is.

The release candidate is here for Krita 5.2, this means that we are confident that all the major bugs brought on by the changes in Krita 5.2 have now been fixed, and would like you to give it another round of testing.

Please pay extra attention to the following features of Krita, since they got updated or reworked since Beta2:

  • assignment of profiles to displays in multi-monitor setup (Krita should use EDID info to map the displays to profiles everywhere, except on macOS)
  • dockers layout should now be properly restored after Krita restart, even after the usage of canvas-only mode
  • autokeyframing feature of animated layers got a lot of fixes since Beta2

Here is the full list of bugs (and other minor changes) have been fixed since the second beta:

  • Fix crash when activating Halftone filter in Filter Brush (Bug 473242)
  • Fix a crash when activating Color Index filter in the filter brush (Bug 473242)
  • text: Write xml:space as XML attribute in SVG output
  • text: Normalize linebreaks into LF when loading from SVG
  • Build patched libraqm with Krita instead of in 3rdparty deps
  • [qtbase] Correctly parse non BMP char refs in the sax parser
  • Actually load the fonts in the QML theme (Bug 473478)
  • Fix Channels docker to generate thumbnails asynchronously (Bug 473130)
  • Fix wobbly lines when using line tool (Bug 473459)
  • text: Make sure white-space overrides xml:space
  • text: Reject negative line-height in SVG
  • Simplified fix for tag selector and checkboxes problem (CCBug 473510)
  • Fix creation of a new image from clipboard (Bug 473559)
  • Make sure that the horizontal mode of the preset chooser is properly initialized
  • Hide preset chooser mode button when the chooser is in horizontal mode (Bug 473558)
  • Only repaint KisShapeLayerCanvas on setImage when really needed
  • text: Do not synthesize bold in several cases like fonts that are already bold or variable fonts.
  • AnimAudio: Fixed crash when loading animation file with audio attached, due to incompletely constructed canvas.
  • Fix a model warning in KisTimeBasedItemModel (Bug 473485)
  • Don’t recreate the frames when not necessary (Bug 472414)
  • Fix cross-colorspace bitBlt with channel flags (Bug 473479)
  • text: Also consider HHEA metrics for default line height (Bug 472502)
  • Fix BDF font-size matching (Bug 472791)
  • Make sure that the node emits nodeChanged() signal on opacity change (Bug 473724)
  • Fix ‘enabled’ state of the actions in the Default Tool (Bug 473719)
  • Respect statusbar visibility after Welcome page (Bug 472800)
  • Fix a warning in outline generation code in shape tools (Bug 473715)
  • Possibly fix a crash when switching animated documents (Bug 473760)
  • OpenGL: Request DeprecatedFunctions on Windows to fix Intel driver (Bug 473782)
  • Allow welcome page banner to shrink
  • text: Use line-height when flowing text in shape (Bug 473527)
  • text: Make first word of text-in-shape flush against the shape
  • Fix color values under transparent pixels be lost in Separate Image (Bug 473948)
  • flake: Fix transformation of text path and shape-inside (Bug 472571)
  • Make sure that Krita correctly specifies video codec for libopenh264 (Bug 473207)
  • Don’t allow New/Open File buttons to grow taller (Bug 473509)
  • raqm: Fix Unicode codepoint conversion from UTF-16
  • Android: Bump targetSdkVersion to 33
  • Fix multiple issues with auto-keyframing code
  • Edit Shapes tool: make moving points move points by a delta instead of snapping them to the cursor
  • Initialize tool configGroup before optionWidget (Bug 473515)
  • Fix updates on autokeyframing with onion skins enabled (Bug 474138)
  • JPEG-XL: fix crash on importing XYB grayscale that needs transform
  • JPEG-XL: also apply patches workaround on lossy export
  • Fix artifacts when using assistants in images with high DPI (Bug 436422)
  • Don’t allow closing hidden document views without confirmation (Bug 474396)
  • logdocker: Fix infinite tail recursion with multiple windows (Bug 474431)



If you’re using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the Krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder.

Note that we are not making 32 bits Windows builds anymore.


The separate gmic-qt AppImage is no longer needed.

(If, for some reason, Firefox thinks it needs to load this as text: to download, right-click on the link.)


Note: if you use macOS Sierra or High Sierra, please check this video to learn how to enable starting developer-signed binaries, instead of just Apple Store binaries.


We consider Krita on ChromeOS as ready for production. Krita on Android is still beta. Krita is not available for Android phones, only for tablets, because the user interface requires a large screen. RC1 packages for Android are signed as usual.

Source code


For all downloads, visit and click on Details to get the hashes.


The Linux AppImage and the source .tar.gz and .tar.xz tarballs are signed. This particular release is signed with a non-standard key, you can retrieve is here or download from the public server:

gpg --recv-keys E9FB29E74ADEACC5E3035B8AB69EB4CF7468332F

The signatures are here (filenames ending in .sig).



The post Krita 5.2 Release Candidate is out! appeared first on Krita.

I’m trying to come up with a plan to harmonize all my sites. There are way too many installs on too many machines spread out over vendors and sites. A general clean-up is really needed.

Right now I have a couple of sites that are self-hosted (they run on a old machine in my office), a VPS at Linode and a couple of VPSes at DigitalOcean. I also have a couple of sites run via github pages.

Right now, a majority of the sites are based around WordPress which is great due to the ease of use – but static sites are easier (and cheaper) to host. In addition to this, I also have a couple of Django apps running on VPSes. Nice, but requires quite a bit of RAM in my experience.

So, the general plan is to clean up my domains, and to harmonize the environments. Perhaps a single WordPress machine, that also hosts the static sites, and the dedicated machines for the more complex Django apps. There will also be a bunch of URL rewrites to make the structure better, i.e. this blog will probably live under, but be available via the old URL too (

When reviewing my domains, I found the following ones that I most likely will give up. If there are any takers, please tell me what you want it for, and I’d be happy to hand it over to you (contact me at e8johan-at-gmail):

  • (open source in Swedish)
  • (I’ve already got, and I won’t write another book until Qt 8)
  • (see

Also, I plan to pull all the machines over to DigitalOcean, as they offer a really nice interface (and APIs!) for managing VPSs, DNS and more (and I’ve gotten used to them while building Eperoto’s infrastructure).

Finally, I intend to collect all domain name registrations at a single registrar (most likely Loopia, but let’s see.

Thursday, 14 September 2023

Witch Wells Az

I had to make the hard decision to put snaps on hold. I am working odd jobs to “stay alive” and to pay for my beautiful scenery. My “Project” should move forward, as I have done everything asked of me including finding a super awesome management team to take us all the way through. But until it is signed sealed and delivered, I have to survive. In my free time I am helping out Jonathan and working on KDE Neon, he has done so much for me over the years, it is the least I can do!

So without further ado! Carlos and I have been working diligently on new Frameworks 5.110, Plasma 5.27.8, and Applications 23.08.1! They are complete and ready in /user! With that, a great many fixes to qml dependencies and packaging updates. Current users can update freely and the docker images and ISO are building now. We are working on Unstable… as it is a bit unstable right now, but improving 🙂

On the Debian front I am wrapping up packaging of new upstream release of squashfuse.

Thanks for stopping by!

If you can spare some change, consider a donation

Thank you!

GCompris includes well over a hundred fun educational activities. In this video you will learn how they are divided into categories and see a number of examples of what you can find in the GComrpis treasure trove.

Over 120 individual programs plus dozens of programmer libraries and feature plugins are released simultaneously as part of KDE Gear.

Today they all get new bugfix source releases with updated translations, including:

  • gwenview: Fix navigation with side mouse buttons (Commit)
  • kio-extras: Thumbnail: Fix heap-use-after-free in AudioCreator::create (Commit, fixes bug #469458)
  • akonadi-calendar: Use correct identity when sending iTIP counter-proposal (Commit, fixes bug #458524)

Distro and app store packagers should update their application packages.

Wednesday, 13 September 2023

Another month, another Plasma 6 update. I’ve been pretty busy during the past weeks, mostly further improving the Wayland session, fractional scaling, and dealing with Qt bugs. Working under the hood like this is tremendously important albeit somewhat ungrateful when there aren’t any pretty pictures to show.

Empty KDE Plasma 6 desktop with a bluish-gray mountain wallpaper. Bottom right caption reads “KDE Plasma 6.0 Dev. Visit to report issues”
Still looks the same now, doesn’t it? By the way, there is a Wallpaper Contest going on!

A key reason for being able to work so efficiently on kwin_wayland nowadays is that our apps can survive a restart of the Wayland compositor. I can just recompile KWin and restart it like I could on X11. Check out David’s blog post to learn more, including some spectacular video demos, and things we could do with that capability in the future!

I’m a huge fan of screen edges, so I have my bottom left, bottom center, and bottom right edge configured to trigger the window overview, KRunner, and peek at desktop, respectively. I noticed that under Wayland while selecting loads of text and bumping into the bottom of the screen, expecting the view to scroll, the screen edge triggered instead, interrupting the selection operation. This was fixed by simply checking whether the mouse is currently pressed when triggering the edge. Of course, windows can still be moved past the sides to switch desktops. Unfortunately, this also means that an edge cannot be triggered by dragging a file. This never really worked on X either, and the overview effect isn’t prepared to handle drag events anyway, but in the future I’d really like to be able to start dragging a file, drag it into the overview effect, and drop it on another window.

Speaking of drag and drop, I also fixed the mouse cursor being stuck after dropping a file. Qt has an “override cursor” that is set to a hand (or the like) while dragging but the code for resetting it wasn’t called from the Wayland drag handler. Additionally, I made child surface positioning in KWin more spec-compliant. Using an XDG Positioner, a client can specify the relative position of a popup window and define rules for how it should be placed when there isn’t enough room (for instance, flip it to the other side or just move it around slightly) and whether those rules should be applied once or continuously. As a result, GTK fly-outs dodge screen edges while moving around, whereas context menus in Qt apps just stick to their parent window stoically.

Regarding mouse cursors, there’s now a cursor-shape protocol which lets applications set a cursor by name, e.g. crosshair, wait, col_resize, as opposed to painting their own cursor surface. I never understood the original design decision behind requiring clients to know how to parse Xcursor images, pick the right cursor theme, size, etc. There are sure use cases for custom cursor pixmaps but your run-of-the-mill desktop app probably just wants a pointer and an IBeam. With cursor-shape, theme handling is delegated to the compositor which can then load the correct theme once and re-use it for all supporting clients.

I fixed a bug in the QtWayland implementation where switching from shape cursors to bitmap cursors didn’t work as could be observed with Kolourpaint’s tool cursors. Moreover, Qt no longer allocates a cursor surface at all if the app never used a bitmap cursor. While we switched the default modifier key for moving windows from Alt to Meta to free Alt for applications like Blender, two decades of muscle memory aren’t easily retrained, so I kept it as it was before. Unfortunately, this meant that during Alt+Tab it would move the window grid around instead of interacting with it since “I am pressing Alt”. As a remedy, KWin now checks whether a window is movable before stealing mouse events for initiating an unrestricted move operation.

I have always been an opponent to fractional scaling – there are no “half pixels”. Nevertheless, I have now switched my 14″ laptop to use 175% scaling and naturally began fixing all the bugs. Wayland core protocol only supports integer scaling, a client can specify whether a buffer is at 1x or 2x (or 3x, or…) scale, and the compositor matches that up with its output scale. Recently, using the Viewporter and Fractional scale protocol, a compositor can instead announce that a client is supposed to render natively with a scale of – in my case – 210/120. Yet, since fractional scale is a property of an individual window, it doesn’t map well to QScreen or QGuiApplication APIs which look at the output that is still technically at 2x scale.

This manifests itself in blurry or pixelated icons when using QIcon::pixmap without specifying a device pixel ratio, or using qApp->devicePixelRatio(). I fixed both Breeze style and Dolphin to rasterize icons at the scale of the window. Sadly, sometimes an app starts rendering before the fractional scale is set and you end up with a single frame at 2x which is then replaced by another frame at the correct scale. I fixed both KWin and QtWayland to not assume a (potentially incorrect) scale factor before the actual scale factor has been determined but the underlying issue of rendering prematurely still needs to be investigated.

Row of file icons: kde6 (KDE logo), Music (folder with musical note), Public (folder with mannequin), Projects (folder with gears). Top row is pixelated, bottom row is smooth.
Dolphin rendering icons at 175% scale, before and after

On the Qt front I finally figured out why Plasma 6 kept crashing when receiving KDE Connect notifications. Technically, it wasn’t KDE Connect’s fault but it is one of the more prominent users of “resident” notifications. Normally, a notification is removed once it times out because that’s how the notification spec works and if we didn’t, we’d potentially cause memory leaks in apps. However, in order to provide a more interactive notification history, an app can explicitly set the “resident” property and control a notification even after it timed out. When it does, the relevant flag is set on the notification which causes the popup model to filter it out and thus remove the popup. Qt then tried to signal that the property has changed on the popup which was deleted in the meantime, leading to a crash. The fix was basically a one-liner but investigating it was quite a challenge: have you ever tried to print the contents of a QV4::String (to figure out the name of the property it accessed when it crashed) during a post-mortem coredump analysis?

Qt 6.6 Beta 3, I believe, also broke invoking certain methods on attached properties, which Plasma makes heavy use of. This lead to, among other things, System Tray icons not reacting to mouse clicks anymore. Luckily, a bunch of fellow Plasma hackers were on an even more bleeding-edge Qt build than I was, and as a result the issue could be spotted and resolved quickly. Qt 6 also treats trailing null bytes in QByteArray differently from Qt 5, which broke the XDG portal file picker, since it might have tried to start in a folder named “Downloads\0” instead of “Downloads”. Furthermore, Qt 6.6 gained API for reading file time stamps in UTC, saving timezone conversions. This is now used by KConfig and KService and saves like a couple of tens of milliseconds on startup of all our apps. A penny saved is a penny got.

Finally, we have decided on a release timeline for Plasma 6! An Alpha release will be made in November, accompanied by a soft feature freeze. Beta releases will follow throughout December and January, and the final release is slated for February 2024. This makes it even more important that you give Plasma 6 a spin and report – or fix – all the bugs! Check out our Community Wiki for a comprehensive list of open issues and instructions on how to run it. Needless to say you can also Donate to KDE to fund development and the necessary infrastructure.

Discuss this post on KDE Discuss.

Tuesday, 12 September 2023

For the past few days I was at the seaside.

As my better half had some work that she needed to take with her, I also took my new laptop and when she was doing her thing, I tweaked a few small things here and there. Nothing major though, as we were still on vacation.


Not that I game much these days, especially on PC1, but if I already have a Vega 8 graphic card, it would be wasteful not to at least try it.

By default I am booting into Zen kernel, as it is said to provide a smoother experience on laptops/desktops as well as with gaming.

Lutris (and Steam)

Initially installing either Lutris or Steam failed me with a SegFault, but after asking on the forums and digging through Lutris documentation, I managed to get both installed.

Then I added my Steam, GOG and libraries to Lutris. Installing (and launching) games through Lutris is super convenient.

A problem I am still running in with though is a bit weird. Lutris offers a really nifty option to change the keyboard to US when launching a game. That is quite handy for me since my default layout in Neo2.

But the problem is that even after the game ends, (some?) GTK applications – at least Firefox, GIMP – retain US layout even after the game (or even Lutris) ends. So far I could not figure out how to fix this or work around it, apart from simply not using that option.

The few games I tried seem to run fine (e.g. Return to Monkey Island runs perfectly), but I am sure there is some performance tweaking to be made … some other day.

Mouse go whoops!

This was a bit awkward …

I have a Roccat Kone Pure mouse2, which I find to be a great programmable mouse with 12 buttons. It is marketed as a “gaming mouse”, but honestly I use it to bind some keyboard shortcuts to mouse buttons.

As is often the case with these things, to update and modify the firmware on the device itself there is a (no longer maintained, but stable) (semi-)official niche one-man Linux tool – Roccat Tools. The tool still works fine, even though it has not seen an update since 2019.

If you want to write firmware to the (mouse) device, you need write premissions to it, which is obviously and sanely, not the case the default. The packages do provide the correct UDev rules, but you still need to add yourself to the roccat group.

And here is where it got ugly.

I forgot to use --append in the usermod command … yeah, not great. Do not forget to use it.

To fix my stupid mistake, I had to log in as root (luckly I could!) and add myself to the right groups from memory. I hope I got it right 😅


Nowadays I rarely use the pure TTY console, and am typically in a PTY like Konsole or Alacritty.

Regardless, when that happens, I do like having a nice environment, so I did at least some basics.


Default console fonts are not very pretty and I needed to tweak at least the FONT_MAP to get some common Slovenian characters (č, š, ž) to work anyway, so I went font window-shopping.

There are not many console fonts – too limiting and not sexy enough for designers, I assume – but there are a few, and in the end I settled for Spleen3.

Later I noticed that Spleen is the default console font in OpenBSD since 2019, which brings me hope this font will continue to be maintained.

After refreshing my memory with the Arch wiki: Linux Console, I added the following to /etc/vconsole.conf:


I did also consider the following fonts, and here is why I did not chose them:

  • tamzen – especially its PowerLine variant did make my CLI prettier, but č, š, ž support was lacking;
  • terminus – the venerable Terminus was really close to staying my console font of choice, but I just wanted something more fun.


Having a working mouse/touchpad is also a nice thing to have in a console, so I went and installed Consolation. It was as simple as:

yay consolation
systemctl enable consolation.service

GPM probably works fine still, but apparently its code is hard to maintain at this stage and not working great with touchpads, so I tried the much more modern Consolation.

It is very flexible, but out of the box it worked fine enough for me, so I did not mess with it right now. I may later though.

Boot splash screen

Since I had some extra time, I decided to also include a splash screen when booting.

I decided for Plymouth, as it seems more powerful and maintained than the alternatives.

After a simple yay --sync plymouth plymouth-kcm I downloaded and selected my preferred theme through the Plymouth KCM.

Then I needed to enable Plymouth by adding it to Dracut with:


force_drivers+=" amdgpu "
add_dracutmodules+=" plymouth "

… and generating the new sudo dracut-rebuild and reboot.

For some reason without forcing the drivers with force_drivers it would override my font settings with defaults again. Hat-tip to dalto for helping me with that issue.

To actually make it apply, I had to pass the splash kernel parameter to GRUB, as described in Arch Wiki: Kernel parameters. For now I decided not to use quiet, but I may enable it later. Eh, I did go for quiet by the end of the day. Looks nicer and I can always lnav /var/log/boot.log to see the boot logs4.

I considered making the boot silent, but at least for now, I decided not to.

Background in console

I tasted blood.

I wanted to pimp my TTY as much as I did back during my Gentoo days.

I wanted a pretty backround and frame even in my console!

Sadly, it seems there is an issue with modern kernels (5.17 and newer) and the patch that is needed to get that to work. Also FBSplash seems to not have been maintaind in a while, to the extent that even Gentoo removed it.

So, I gave up on that piece of nostalgia. Oh, well, good times …


X11 vs Wayland

After using Plasma on Wayland for a few days and then using it on X11 again, I noticed a few more nice things on Wayland:

  • Touchpad gestures exist on Wayland, but not on X11 – I am surprised to how much I look forward to the gestures being polished, now that I have a large trackpad.
  • Some things – e.g. the pop-down hints in Kate while you type – look much nicer on Wayland, but that we knew.

There are some very big caveats when using Plasma on Wayland right now though, but it is being worked on:

  • Applications do not prompt to save unsaved work, causing data loss – KDE bug № 461176 – this is a big big issue, but is being worked on.
  • When the compositor crashes or restarts, non-Qt apps are killed — work is ongoing to fix this and just recently David ”DeD” Edmundson blogged about great progress on how with Wayland this would not just get fixed, but make sessions much more robust than we have ever seen before, with added bonuses of essentially safe-states for apps, upgrading without logging out, etc. Go read DeD’s blog post, that stuff is mind-blowingly amazing!
  • Global Menu is not supported for non-Qt appsKDE bug № 424485 – I have been using an auto-hiding Global Menu for many years now, to save vertical space, but with a 14" screen, I am OK without it.

For now, I will probably switch between X11 and Wayland, depending on whether the priority of the day is a) to make sure I do not forget to save things I worked on, or b) a more shiny and fluid experience.

Disable hibernate

Since I never suspend do disk (hibernate, S4), I disabled that, so the icon in Plasma menu goes away.

Following Arch Wiki: KDE, I simply created:

/etc/systemd/sleep.conf.d/00-disable-hibernation.conf with the following in it:


Missing packages

While I was adding a few Plasmoids to my desktop, I noticed some were missing, which also caused the TodoList Plasmoid not to work.

After asking on the forums a bit, I installed the whole Plasma metapackage with yay plasma-meta and restarted it. As for KDE Gears, I prefer to install each application separately.

While I was at it, I added a few more KCM modules as well:

yay --sync colord-kde systemd-kcm kcmsystemd kcm-wacomtablet kcm-polkit-kde sddm-kcm plymouth-kcm

What was also missing was spell-checking. Since Sonnet supports several spell-checking back-ends, I installed the Hunspell dictionaries of the languages I typically use. That should also make them available to LibreOffice.

While I was at it I also did yay --sync languagetool libreoffice-extension-languagetool to enable grammar checking in LibreOffice through the awesome LanguageTool.

Make GTK apps look Qt

To provide some better visual consistency between Qt and GTK applications, I installed kde-gtk-config to be able to chose the GTK theme also within KDE, and breeze-gtk as the theme of my choice. I say “some better visual consistency”, because some applications use GTK2, some GTK3, some GTK4, some LibAdwaita directly, so there are more variables than just “GTK”.

I decided against removal of CSD – although, I dislike them – because it seems how they are done and set up is still in flux, so fixing it for GTK3 might break some edge cases, but also still not fix it for GTK4 etc.

There is/was also a way to (try to) force GTK applications to use the KDE file chooser etc. through XDG Desktop Portal, but GNOME says that is not a feature, but a debugging tool, so until that gets introduced as a feature, I decided not to mess with it.

This was as far as I cared to push it, as I did not want things to break. If you want to do more, the Arch Wiki on Qt and GTK is a good starting point.

Plasma-ify Firefox

Firefox is a GTK application I use the most often, and it also has some quirks of its own, so I spend some extra time with it.

First I made sure the plasma-browser-integration package and Plasma integration Firefox add-on are installed. Those make sure that the browser more neatly integrates with Plasma – e.g., tabs and bookmarks show in KRunner, the Media Player plasmoid (better) shows what is playing in Firefox, native download notifications are used, Firefox integrates with KDE Connect, etc.

For the next step I had to make sure that xdg-desktop-portal and xdg-desktop-portal-kde packages are installed.

Then, following the Arch Wiki: Firefox, I added the following to my ~/.mozilla/firefox/????????.default-release/user.js (NB: ???????? is actually a random-looking set of characters and will be different for you than it is for me):

// Enables XDG Desktop Portal integration (e.g. to use KDE Plasma file picker)
user_pref("widget.use-xdg-desktop-portal.file-picker", 1);
user_pref("widget.use-xdg-desktop-portal.mime-handler", 1);
user_pref("widget.use-xdg-desktop-portal.settings", 1);
user_pref("widget.use-xdg-desktop-portal.location", 1);
user_pref("", 1);

// Enables further KDE integration (to disable duplicated entry in Media Player)
user_pref("media.hardwaremediakeys.enabled", false);

Now I get both the open and save file dialogues from Plasma also in Firefox. The above forces a few other things to be pulled from KDE Plasma (through XDG Portals).

The easiest way to force Firefox to use server-side window decorations (e.g. how Plasma does it), is to right-click on its toolbar and select Customize Toolbar. There enable the Title Bar checkbox.5

Since I use Sidebery to organise tabs in vertical tree, I want to hide the default tab bar. To do so, I just added the following to ~/.mozilla/firefox/????????.default-release/chrome/userChrome.css:

/* Hides top tabs toolbar, so Tree Style Tabs are the only tabs available */
#TabsToolbar {
    visibility: collapse !important;

More complex tweaks: Firefox CSS Hacks

If you need more styling hacks, MrOtherGuy maintains a huge selection of more complex ones, together with instructions on Firefox CSS Hacks.

For help, I found the #FirefoxCSS Matrix channel very helpful.

I ultimately – but after a lot trial-and-error, because I initially forgot how I did it a decade ago – did not need MrOtherGuy’s Firefox CSS Hacks, but it is a great resource!

At least for now, I decided to use vanilla Firefox, but might move to SUSE’s Firefox KDE fork down the line, later on (or not, we will see, there seems to be some movement upstream).

Enable Bluetooth

Although Bluez was installed, I could not see any Bluetooth devices in KDE.

The problem was very simply that by default Bluetooth is not enabled on EndeavourOS in SystemD.

A quick fix was to simply run:

systemctl enable bluetooth.service
systemctl start bluetooth.service

Enable KDE Connect

KDE Connect is a great tool.

Initially it did not find my mobile phone, because of the firewall, which is by default enabled on EndeavourOS.

All it took though was to open up the Firewall KCM and there from the list of pre-defined rules find KDE Connect and add it. Super simple 😁


I also noticed that Emoji were missing by default.

To correct that, I installed the otf-openmoji package (with limited success).

Why OpenMoji and not any of the more well known options?

Well, honestly, I have a soft spot for the underdogs. Also some of the designs there just looked cleaner and nicer to me, compared to JoyPixels, Noto or Twemoji.

OpenMoji’s monochrome designs are very clean and nice, but some symbols – like flags – just do not work in monochrome. I hope this gets fixed in the future, so a healthy mix can exist.

For some reason (at least on Arch / EndeavourOS), this Emoji font defaults to the monochrome “Black” version instead of the coloured one, I followed the hint in this comment and added the following to ~/.config/fontconfig/fonts.conf for the “Black” version to be ignored:

<!-- Block OpenMoji Black from the list of fallback fonts. -->
            <patelt name="family">
            <patelt name="style">

… but, this does not seem to work for me. In fact, even deleting the /usr/share/fonts/openmoji/OpenMoji-Black.ttf file did not fix it for me.

What did work for me though was to download the (old bitmap) CBDT version of OpenMoji-color-cbdt.ttf and installing that as a user font.

OpenMoji is open for help

If you like OpenMoji – as I do – and actually have the design skills and knowledge – unlike I do –, it would be great if you contributed to OpenMoji.

Meta key mystery

And, finally, the Meta (a.k.a. Win) key mystery …

What started happeneing was, that seemingly at random times the Meta key would just stop working. Which is really annoying since a lot of shortcuts use it. (e.g. Meta+W for the Overview, Meta+Q for the Activity Manager, Meta+Tab for quick Activity switching, …)

I tried figuring it out myself, but could not. After some time, I did figure out a work-around that it sometimes started working again, if I suspended the machine to RAM (sleep) and then woke it up again. Sometimes this would require several cycles.

So I asked for help on the EndeavourOS forums.

After further communal head-scratching, I wrote an e-mail to Slimbook’s support. And their answer came just a tiny bit quicker as someone else’s (correct) suggestion on the forum. Which is to say, both methods were very fast!

Turns out I am an idiot.

Fn+F2 is hard-coded to disable/enable the Meta key … apparently enough gamers like it that way that several manufacturers have that feature.

So what happened was, that sometimes when I pressed Ctrl+F2 to switch to Virtual Desktop 2, I would inadvertently (also) press Fn, as I am still getting used to the new keyboard. Remember, Ctrl and Fn are famously switched on ThinkPads, which were my main laptop until now.

And as for why putting the laptop to sleep would sometimes fix the issue … Well, the suspend button combination on Slimbook is Fn+F1, so I must have sometimes also pressed F2 in the process sometimes.

Next time

That was quite a chunk of work that I originally intended to do much later.

The laptop did not wake up from suspend to RAM (a.k.a. S3, sleep) a few times, so I am investigating what this is about. I will likely dedicate a separate blog post just for that.

As for the next blog post, it will be either that or something Btrfs or backup related.

hook out → going to the sea was great, but a bit too short

  1. When I play nowadays, it is usually on Nintendo Switch, as it is very convenient to play either on the TV or hand-held. 

  2. In fact, between me and my brother we have four identical ones, so one pair is being used, while the other pair is being repaired. Throughout the years these mice have seen several repairs and mods by now, with different sets of button switches, wheel encoders etc. Perhaps I should publish my take on them, if anyone is interested (drop me a line). What will I do, once – hopefully far away in the future – our Roccat mice finally fail completely, I do not know, but I suspect a trip down the DIY path with something like Ploopy

  3. I also used spleen32x64 11pt as the font in Yakuake, but kept Hack in Konsole

  4. If you have not yet, do check out lnav – it is an awesome log viewer! 

  5. If you do not see that option, you could just tell KWin to force the window title and decorations for all Firefox windows. You can add a new Window Rule through Plasma’s System Settings