<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>AksDev - kde</title>
      <link>https://akselmo.dev</link>
      <description>Akseli&#x27;s various rambles and posts about gaming, gamedev, FOSS, programming and other things.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://akselmo.dev/tags/kde/feed.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sun, 01 Mar 2026 17:19:01 +0000</lastBuildDate>
      <item>
          <title>What even are Breeze, QtQuick, QtWidget, Union..?</title>
          <pubDate>Sun, 01 Mar 2026 17:19:01 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>union</category>
            
              <category>themes</category>
            
              <category>qt</category>
            <link>https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/</link>
          <guid>https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/</guid>
          <description>&lt;p&gt;I was asked a good question: What are these things? What are the
differences? I will try to explain what they are in this post, in bit less technical manner.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;I will keep some of the parts bit short here, since I am not 100% knowledgeable
about everything, and I rather people read documentation about it instead of
relying my blogpost. :) But here&#x27;s the basics of it.&lt;&#x2F;p&gt;
&lt;div id=&quot;emote&quot; class=&quot;smug&quot;&gt;
    &lt;img width=&quot;128&quot; id=&quot;emote-face&quot; src=&quot;&#x2F;assets&#x2F;images&#x2F;emotes&#x2F;smug.png&quot; alt=&quot;My lizard fursona making an smug face.&quot;&#x2F;&gt;
    &lt;p id=&quot;emote-text&quot;&gt;It&amp;#x27;s infodump time.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;&lt;h2 id=&quot;qtwidgets&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#qtwidgets&quot; aria-label=&quot;Anchor link for: qtwidgets&quot;&gt;QtWidgets&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;QtWidgets is the &quot;older&quot; way of writing Qt applications.
It&#x27;s mostly C++ and sometimes quite difficult to work with.
It&#x27;s not very flexible.&lt;&#x2F;p&gt;
&lt;p&gt;More information in here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtwidgets-index.html&quot;&gt;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtwidgets-index.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;qstyle&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#qstyle&quot; aria-label=&quot;Anchor link for: qstyle&quot;&gt;QStyle&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;QStyle is the class for making UI elements that follow the style given
for the application. Instead of hardcoding all the styles, we use
QStyle methods for writing things. This is what I was talking about
in my &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;breeze-and-union-preparing&#x2F;&quot;&gt;previous post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;More information in here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qstyle.html&quot;&gt;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qstyle.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;breeze&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#breeze&quot; aria-label=&quot;Anchor link for: breeze&quot;&gt;Breeze&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Breeze is our current style&#x2F;theme. It&#x27;s what defines how things should look like.
Sometimes when we say &quot;Breeze&quot; in QtWidgets context, it means the QStyle of it,
since we do not have other name for it.&lt;&#x2F;p&gt;
&lt;p&gt;Repository: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;qtquick&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#qtquick&quot; aria-label=&quot;Anchor link for: qtquick&quot;&gt;QtQuick&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;QtQuick is the modern way of writing Qt applications.
In QtQuick, we use QML which is a declarative language for writing the
UI components and such. Then we usually have C++ code running the backend
for the application, such as handling data.&lt;&#x2F;p&gt;
&lt;p&gt;More information in here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtquick-index.html&quot;&gt;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtquick-index.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtqml-index.html&quot;&gt;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qtqml-index.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;qqc2-desktop-style&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#qqc2-desktop-style&quot; aria-label=&quot;Anchor link for: qqc2-desktop-style&quot;&gt;qqc2-desktop-style&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;qqc2-desktop-style is the Breeze style for QtQuick applications.
It tells QtQuick applications what certain elements should look like.&lt;&#x2F;p&gt;
&lt;p&gt;Repository: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;qqc2-desktop-style&#x2F;&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;qqc2-desktop-style&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kirigami&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kirigami&quot; aria-label=&quot;Anchor link for: kirigami&quot;&gt;Kirigami&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Kirigami is a set of shared components and items we can utilize in our QtQuick applications.
Instead of rewriting similar items every time for new apps, we use Kirigami
for many things. We call them Kirigami applications since we rely on it quite a lot.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kirigami-and-qqc2-desktop-style&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kirigami-and-qqc2-desktop-style&quot; aria-label=&quot;Anchor link for: kirigami-and-qqc2-desktop-style&quot;&gt;Kirigami and qqc2-desktop-style&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;These two are a bit intermixed. For example, Kirigami provides convenient size units
we have agreed on together, such as &lt;code&gt;Kirigami.Units.smallSpacing&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We then use these units in the qqc2-desktop-style, but in other applications as well:
Both for basic components that QtQuick provides us which are then styled by qqc2-desktop-style,
but also for any custom components one may need to write for an application, if Kirigami
does not provide such.&lt;&#x2F;p&gt;
&lt;div id=&quot;emote&quot; class=&quot;sad&quot;&gt;
    &lt;img width=&quot;128&quot; id=&quot;emote-face&quot; src=&quot;&#x2F;assets&#x2F;images&#x2F;emotes&#x2F;sad.png&quot; alt=&quot;My lizard fursona making an sad face.&quot;&#x2F;&gt;
    &lt;p id=&quot;emote-text&quot;&gt;I wish the two weren&amp;#x27;t so tightly coupled but there&amp;#x27;s probably a reason for that, that has
been decided before my time. (Or it just happened as things tend to go.)&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;&lt;h2 id=&quot;diagram-of-the-current-stack&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#diagram-of-the-current-stack&quot; aria-label=&quot;Anchor link for: diagram-of-the-current-stack&quot;&gt;Diagram of the current stack&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is how the current stack looks like.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;breeze&#x2F;current-situation.svg&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;breeze&#x2F;current-situation.svg&quot; alt=&quot;Diagram of current situation&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;problem-keeping-styles-in-sync&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-keeping-styles-in-sync&quot; aria-label=&quot;Anchor link for: problem-keeping-styles-in-sync&quot;&gt;Problem: Keeping styles in sync&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;As you can see from the diagram, the styles must be kept in sync
by hand. We have to go over each change and somehow sync them.&lt;&#x2F;p&gt;
&lt;div id=&quot;emote&quot; class=&quot;scream&quot;&gt;
    &lt;img width=&quot;128&quot; id=&quot;emote-face&quot; src=&quot;&#x2F;assets&#x2F;images&#x2F;emotes&#x2F;scream.png&quot; alt=&quot;My lizard fursona making an scream face.&quot;&#x2F;&gt;
    &lt;p id=&quot;emote-text&quot;&gt;Not all things have to be kept in sync. This whole thing is rather.. Primitive.
Some parts come from QStyle, some parts are handcrafted, some metrics and spacings can get
out of sync when changed.. But for purposes of &amp;quot;regular person reading this&amp;quot; they need to be
carefully modified by developers to make sure everything looks consistent.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Even bigger problem is that these two (QtWidgets and QtQuick) can behave
very differently, causing a lot of inconsistent look and behavior!&lt;&#x2F;p&gt;
&lt;p&gt;But this is why Union was made.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;union&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#union&quot; aria-label=&quot;Anchor link for: union&quot;&gt;Union&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Union is our own &quot;style engine&quot; on top of these two. Instead of having
to keep two completely different stacks in sync, we feed Union
one single source of truth in form of CSS files, and it then chews the
data out to both QtQuick and QtWidgets apps, making sure the both look
as close to each other as possible!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;breeze&#x2F;union.svg&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;breeze&#x2F;union.svg&quot; alt=&quot;Diagram of what it looks like with Union&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I think it&#x27;s entirely possible to create other outputs for it too, such as GTK style.
Our ideal goal with Union is to have it feed style information even across toolkits eventually,
but first we just aim for these two! :)&lt;&#x2F;p&gt;
&lt;div id=&quot;emote&quot; class=&quot;smile&quot;&gt;
    &lt;img width=&quot;128&quot; id=&quot;emote-face&quot; src=&quot;&#x2F;assets&#x2F;images&#x2F;emotes&#x2F;smile.png&quot; alt=&quot;My lizard fursona making an smile face.&quot;&#x2F;&gt;
    &lt;p id=&quot;emote-text&quot;&gt;And yes the CSS style files are completely customizable by users!
But note that the CSS is not 1-to-1 something one would use to write for web platforms!&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Repository: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;union&#x2F;&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;union&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;note-about-plasma-styles&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#note-about-plasma-styles&quot; aria-label=&quot;Anchor link for: note-about-plasma-styles&quot;&gt;Note about Plasma styles&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Plasma styles are their own thing, which are made entirely out of SVG files.&lt;&#x2F;p&gt;
&lt;p&gt;I do not know if Union will have an output for that as well, or do we just use the qqc2-desktop-style
directly in our Plasma stack (panels, widgets) so we can deprecate the SVG stack. Nothing has been
decided in this front yet as far as I know.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Yeah that&#x27;s a lot of stuff. Over +20 years of KDE we have accumulated so many different
ways of doing things, so of course things will get out of sync.&lt;&#x2F;p&gt;
&lt;p&gt;Union will be a big step in resolving the inconsistencies and allowing users easily to
customize their desktop with CSS files, instead of having to edit two or three different styles
for different engines and then having to compile them all and load them over the defaults.&lt;&#x2F;p&gt;
&lt;p&gt;I hope this post helps open up this a bit. Please see the previous post as well, if you&#x27;re
interested in this work: &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;breeze-and-union-preparing&#x2F;&quot;&gt;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;breeze-and-union-preparing&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;brid.gy&#x2F;publish&#x2F;mastodon&quot;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Breeze QtWidgets style changes to help us prepare for Union</title>
          <pubDate>Sat, 28 Feb 2026 15:40:05 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>breeze</category>
            
              <category>union</category>
            
              <category>theming</category>
            <link>https://akselmo.dev/posts/breeze-and-union-preparing/</link>
          <guid>https://akselmo.dev/posts/breeze-and-union-preparing/</guid>
          <description>&lt;p&gt;We have worked on some spring cleaning for Breeze, which helps us to prepare for
&lt;a href=&quot;https:&#x2F;&#x2F;quantumproductions.info&#x2F;articles&#x2F;2025-02&#x2F;moving-kdes-styling-future&quot;&gt;Union&lt;&#x2F;a&gt; and the changes it brings. This post is a bit more technical.&lt;&#x2F;p&gt;
&lt;p&gt;Help us test things!&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Edit: I made another post that should help explain some of the terminology and such: &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;what-are-breeze-widgets-quick-union&#x2F;&quot;&gt;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;what-are-breeze-widgets-quick-union&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you are running Plasma git master branch, you may have noticed that Breeze has
gotten various (small) changes to it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Note that these changes are NOT in 6.6 branch&lt;&#x2F;strong&gt;, just in master branch. Current
target is &lt;strong&gt;Plasma 6.7&lt;&#x2F;strong&gt; but &lt;strong&gt;that may change (6.8)&lt;&#x2F;strong&gt; if we still have some issues with it!
And to clarify, I do not know when Union releases to wider public yet. These changes will be
most likely before Union.&lt;&#x2F;p&gt;
&lt;p&gt;This all is happening for two reasons:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Bring &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;&quot;&gt;Breeze&lt;&#x2F;a&gt; on-par with the current &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;qqc2-desktop-style&quot;&gt;QtQuick styling&lt;&#x2F;a&gt;, which is our &lt;em&gt;current vision&lt;&#x2F;em&gt; for Breeze&lt;&#x2F;li&gt;
&lt;li&gt;Find out any discrepancies and fix them, to make moving to &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;union&#x2F;&quot;&gt;Union&lt;&#x2F;a&gt; theming more seamless&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;In more technical terms, this means we have made &lt;code&gt;QStyle::PE_PanelItemViewItem&lt;&#x2F;code&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qstyle.html#PrimitiveElement-enum&quot;&gt;docs&lt;&#x2F;a&gt;) more round. This primitive is used in a lot of places.&lt;&#x2F;p&gt;
&lt;p&gt;For example, see the background of the places panel element here:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;places-round.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;places-round.png&quot; alt=&quot;Places panel item background being more rounded&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It looks much more like the items in our System Settings for example, since they&#x27;re rounded too.&lt;&#x2F;p&gt;
&lt;p&gt;However this has not been easy: Due to how QStyle works, we have to add margins to the primitive itself,
otherwise it will be touching the edges of the view, making it look bad.&lt;&#x2F;p&gt;
&lt;p&gt;These changes have made us notice bunch of visual oddities since we have +20 years of cruft across our stack,
working on top of Breeze style without taking QStyle into account. People use completely custom
solutions instead of relying on QStyle, though the QStyle API is not easy to work with so I do understand
why it can be annoying.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-does-using-qstyle-api-matters-in-regards-to-union&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-does-using-qstyle-api-matters-in-regards-to-union&quot; aria-label=&quot;Anchor link for: why-does-using-qstyle-api-matters-in-regards-to-union&quot;&gt;Why does using QStyle API matters in regards to Union?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is all fine and good if we just decide to use Breeze always and forever. But we&#x27;re not!
With Union style engine, people are going to do all kinds of cool things. First of course we just
are trying to make 1-to-1 Breeze &quot;copy&quot; with Union, since it&#x27;s a good target to compare that
everything works.&lt;&#x2F;p&gt;
&lt;p&gt;But when people are going to make their cool new themes with Union, our QtWidgets stack will
not always follow that, due to all the custom things they&#x27;re doing! So we need to minimize custom
styling within QtWidgets apps and frameworks, and make sure they use QStyle APIs, so that Union
can tell them properly what to do.&lt;&#x2F;p&gt;
&lt;p&gt;A more practical example:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;KoolApp directly paints a rectangle with &lt;code&gt;QPainter&lt;&#x2F;code&gt; as a selection background.
&lt;ul&gt;
&lt;li&gt;It&#x27;s a regular rectangle, 90 degree angles.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Union style engine is released to the public and everyone starts making their own themes&lt;&#x2F;li&gt;
&lt;li&gt;Someone makes a theme that makes all selection backgrounds a rounded rectangle&lt;&#x2F;li&gt;
&lt;li&gt;They then open KoolApp and notice nothing changes! Since KoolApp draws its on its own.&lt;&#x2F;li&gt;
&lt;li&gt;Everyone is unhappy. :(&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;However, when KoolApp is updated to use &lt;code&gt;drawPrimitive&lt;&#x2F;code&gt; like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Remove the old background
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F;painter-&amp;gt;setRenderHint(QPainter::Antialiasing);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F;painter-&amp;gt;setPen(Qt::NoPen);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F;painter-&amp;gt;setBrush(color);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F;painter-&amp;gt;drawRect(rect);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Use style API instead
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;style()-&amp;gt;drawPrimitive(QStyle::PE_PanelItemViewItem, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;option, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;painter, this);
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Then for text, add some spacing at start and end so it does not hug the edges of the primitive
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; margin &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;style()-&amp;gt;pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; NOTE: you can use QStyle::SE_ItemViewItemText to get the subelement of the text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; NOTE: If you use HTML to draw rich text, you will have to do adjustments manually!
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F;       Because nothing can be ever easy. :(
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now the background uses what the QStyle gives it,
which in turn is whatever Union has declared for it.&lt;&#x2F;p&gt;
&lt;p&gt;I understand there are cases where someone might want to draw their custom thing,
but if at all possible, please use QStyle API instead! It will make theming
much easier on the long run.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-change-now-why-not-wait-for-union&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-change-now-why-not-wait-for-union&quot; aria-label=&quot;Anchor link for: why-change-now-why-not-wait-for-union&quot;&gt;Why change now? Why not wait for Union?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s better to start catching this all now. It can be more tough to find
the bugs with Union styling later on, because it changes much more than
just one style: It changes the whole styling engine.&lt;&#x2F;p&gt;
&lt;p&gt;When we tinker with Breeze theme to find out these discrepancies, it&#x27;s easier
to spot if the problem is in Breeze theme itself or the application&#x2F;framework
drawing the items. With Union, we can also have a bug in Union too, so
it adds one more layer to the bughunt.&lt;&#x2F;p&gt;
&lt;p&gt;So when Breeze looks fine with apps, we can be sure that any changes Union brings,
it can be either a bug in Union or the style Union is using, instead of having to
&lt;em&gt;also&lt;&#x2F;em&gt; hunt down the bug from application&#x2F;framework.&lt;&#x2F;p&gt;
&lt;p&gt;Think of it as a gradual rollout of changes. :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-call-for-testing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-call-for-testing&quot; aria-label=&quot;Anchor link for: a-call-for-testing&quot;&gt;A call for testing&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The current Breeze style changes we have now in git master branch are already out there
if you&#x27;re using &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;linux&#x2F;&quot;&gt;KDE Linux&lt;&#x2F;a&gt; for example.&lt;&#x2F;p&gt;
&lt;p&gt;What we need is YOU to test out our stack. Test out other peoples Qt apps too.&lt;&#x2F;p&gt;
&lt;p&gt;So please check this VDG issue and join there: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;teams&#x2F;vdg&#x2F;issues&#x2F;-&#x2F;issues&#x2F;118&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;teams&#x2F;vdg&#x2F;issues&#x2F;-&#x2F;issues&#x2F;118&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Read the tasks section, look over what others have shared, share information, etc.
&lt;strong&gt;Report everything in that issue!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Any help is appreciated, from spotting small errors to fixing them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;I doubt our QtWidgets and QtQuick styles can be 1-to-1 without Union&lt;&#x2F;strong&gt;, so
do not worry too much about that. At the moment goal is just to make sure
the &lt;strong&gt;Breeze QStyle is properly utilized.&lt;&#x2F;strong&gt; Perfect is the enemy of good and all that.&lt;&#x2F;p&gt;
&lt;p&gt;I hope this does not cause too much annoyance for our git master branch users, but
if you&#x27;re using master branch, we hope you&#x27;re helping us test too. :)&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s make the movement from separate QtWidgets&#x2F;QtQuick style engines to one unified Union style
engine as seamless as possible. And this will help other QtWidgets styles too, such as Fusion, Kvantum, Klassy,
etc..!&lt;&#x2F;p&gt;
&lt;p&gt;Happy testing!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;brid.gy&#x2F;publish&#x2F;mastodon&quot;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Happy Holidays 2025!</title>
          <pubDate>Sun, 21 Dec 2025 19:03:20 +0000</pubDate>
          <author>Akseli</author>
              <category>cosplay</category>
            
              <category>holidays</category>
            
              <category>kde</category>
            <link>https://akselmo.dev/posts/happy-holidays/</link>
          <guid>https://akselmo.dev/posts/happy-holidays/</guid>
          <description>&lt;p&gt;Happy holidays everyone. &lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;Consider this as your holiday card from me.
I will be taking short break from KDE stuff for now, though I will be around.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;holidays2025&#x2F;holiday_1.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;holidays2025&#x2F;holiday_1.png&quot; alt=&quot;Me wearing my lizard cosplay and chilling in christmas dinosaur shirt&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;holidays2025&#x2F;holiday_2.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;holidays2025&#x2F;holiday_2.png&quot; alt=&quot;Me wearing my lizard cosplay and doing devil horn hand gesture in christmas dinosaur shirt&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;(I tagged KDE so that readers of planet have to see these, mwahaha.)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And happy new year 2026, let&#x27;s hope it gets better from here.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Adding Customizable Frame Contrast to KDE Plasma</title>
          <pubDate>Wed, 29 Oct 2025 20:40:46 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>accessibility</category>
            
              <category>outlines</category>
            
              <category>frames</category>
            
              <category>contrast</category>
            
              <category>colors</category>
            <link>https://akselmo.dev/posts/frame-contrast-settings/</link>
          <guid>https://akselmo.dev/posts/frame-contrast-settings/</guid>
          <description>&lt;p&gt;For a while now, probably two years, I wanted to have support for high-contrast colorschemes in KDE Plasma.&lt;&#x2F;p&gt;
&lt;p&gt;Technically, this was already doable&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;, by just modifying your colorscheme to such colors.
However one thing was lacking: Outlines were calculated automagically with hardcoded value.&lt;&#x2F;p&gt;
&lt;p&gt;Well, no more! Now you can set your own frame contrast value!
And you may ask &quot;Why not change the color completely?&quot; which is a good question and
I will answer that later.&lt;&#x2F;p&gt;
&lt;p&gt;This feature will be in Plasma 6.6. Hopefully. Or if you use &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;linux&#x2F;&quot;&gt;KDE Linux&lt;&#x2F;a&gt; you can
already try it out. :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-settings&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-settings&quot; aria-label=&quot;Anchor link for: the-settings&quot;&gt;The settings&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is how the settings will look like.&lt;&#x2F;p&gt;
&lt;div&gt;


    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame0.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame0.91b6a936bf6e7ad3.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame13.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame13.adb1802f10d09496.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame20.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame20.128c0c15fa1256e1.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame100.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame100.5f833399148e9064.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;

&lt;p&gt;This setting used to be a slider.. And guess what, it did &lt;em&gt;nothing&lt;&#x2F;em&gt; in Breeze style.
It was leftover from Oxygen times. Do not worry though if you use Oxygen style, the
slider value is just percentage now and it will be converted to the value Oxygen uses.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;desktop-examples&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#desktop-examples&quot; aria-label=&quot;Anchor link for: desktop-examples&quot;&gt;Desktop examples&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Some examples how it might look like in desktop setting.&lt;&#x2F;p&gt;
&lt;div&gt;


    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame0_desktop.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame0_desktop.23c74a9c3631dea1.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame13_desktop.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame13_desktop.7152bac045be41ff.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame100_desktop.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame100_desktop.afdeb5e8597bdba9.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;assets&#x2F;images&#x2F;kde&#x2F;frame100_light_desktop.png&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;akselmo.dev&amp;#x2F;processed_images&amp;#x2F;frame100_light_desktop.0c4af81bd7e45d47.png&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;

&lt;p&gt;All items are updated to follow this:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;QtQuick windows (qqc2-desktop-style)&lt;&#x2F;li&gt;
&lt;li&gt;QtWidgets style and decorations (Breeze)&lt;&#x2F;li&gt;
&lt;li&gt;Plasma SVG files (Anything using &lt;code&gt;class: ColorScheme-Frame&lt;&#x2F;code&gt; )&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There&#x27;s still some bugs with panels not always updating immediately,
though we&#x27;re working on fixing them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-not-change-the-whole-color&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-not-change-the-whole-color&quot; aria-label=&quot;Anchor link for: why-not-change-the-whole-color&quot;&gt;Why not change the whole color?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Currently across all of our apps and styles, we do the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Take background color and foreground color&lt;&#x2F;li&gt;
&lt;li&gt;Mix them with previously hardcoded frameContrast value, which was 0.2&lt;&#x2F;li&gt;
&lt;li&gt;Use that as the color for all the frames&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If we wanted this to be recolorable completely, we would have to go through &lt;strong&gt;every single occurence&lt;&#x2F;strong&gt;
of this color mixing. Most apps luckily rely on the styling, but some may have custom things,
for example custom QtQuick Controls that are doing this manually, using the &lt;code&gt;Kirigami.Theme.frameContrast&lt;&#x2F;code&gt;
value.&lt;&#x2F;p&gt;
&lt;p&gt;I think we most likely would have gotten away with it for most apps, but then rest of them would
look wrong, and some of them may not even be KDE apps but are using Kirigami.. So we would need
to tell everyone to do this update, or risk things look broken.&lt;&#x2F;p&gt;
&lt;p&gt;This was the compromise solution: Allow users to change the &lt;code&gt;Kirigami.Theme.frameContrast&lt;&#x2F;code&gt; value to
whatever they wish, even turn it off. :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-lot-of-work&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-lot-of-work&quot; aria-label=&quot;Anchor link for: a-lot-of-work&quot;&gt;A lot of work&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This was a lot of work. In total, it was &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;teams&#x2F;vdg&#x2F;issues&#x2F;-&#x2F;issues&#x2F;108&quot;&gt;8 merge requests&lt;&#x2F;a&gt;
that had to work together and be merged in correct order, etc..&lt;&#x2F;p&gt;
&lt;p&gt;And this is why modifying Breeze in our current stack is so difficult. You have to do many many changes
across the platform.. And make sure that nothing breaks in the process!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;my-first-draft-use-kdeglobals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-first-draft-use-kdeglobals&quot; aria-label=&quot;Anchor link for: my-first-draft-use-kdeglobals&quot;&gt;My first draft: Use kdeglobals&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;First step for me was trying to make this a global configuration value only in &lt;code&gt;~&#x2F;.config&#x2F;kdeglobals&lt;&#x2F;code&gt;,
which every platform would watch for modifications for this particular value.&lt;&#x2F;p&gt;
&lt;p&gt;It worked fine, but it was quite messy, and I had to make sure all the default values across the
stack would be synced. That is annoying for anyone who wants to maybe modify the default value later.
On top of that, I felt like different platforms constantly watching the config file for changes just was
not a good idea..&lt;&#x2F;p&gt;
&lt;h3 id=&quot;second-draft-use-kcolorscheme&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#second-draft-use-kcolorscheme&quot; aria-label=&quot;Anchor link for: second-draft-use-kcolorscheme&quot;&gt;Second draft: Use KColorScheme&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;After chatting with people, we decided it would be best to just add this as a new value into
our KColorScheme library. Instead of all the platforms looking for this configuration change,
only the KColorScheme library did it.&lt;&#x2F;p&gt;
&lt;p&gt;This allowed me to simplify the implementation significantly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;summary-of-changes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary-of-changes&quot; aria-label=&quot;Anchor link for: summary-of-changes&quot;&gt;Summary of changes&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;All in all, I had to do the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Update KColorScheme to load this value from kdeglobals&#x2F;current colorscheme | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kcolorscheme&#x2F;-&#x2F;merge_requests&#x2F;56&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update the settings for plasma-workspace to allow users to change this value | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-workspace&#x2F;-&#x2F;merge_requests&#x2F;5917&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update Breeze window decorations and QtWidgets style to use this value | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;558&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update Kirigami platformtheme to notify any platforms that use it about the changes | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kirigami&#x2F;-&#x2F;merge_requests&#x2F;1940&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update the libplasma library to actually listen for changes to this contrast value and change accordingly | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;libplasma&#x2F;-&#x2F;merge_requests&#x2F;1369&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update qqc2-desktop-style (QtQuick style) to listen for changes to this value and change accordingly | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;qqc2-desktop-style&#x2F;-&#x2F;merge_requests&#x2F;484&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update KSvg library so that the Plasma styles can now use &lt;code&gt;ColorScheme-Frame&lt;&#x2F;code&gt; class to load correct color | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;ksvg&#x2F;-&#x2F;merge_requests&#x2F;80&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update kde-gtk-config to make sure the Breeze GTK theme also updates correctly when value is changed | &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;kde-gtk-config&#x2F;-&#x2F;merge_requests&#x2F;136&quot;&gt;Link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Yeah. It&#x27;s a lot. This took me about a week to work on.&lt;&#x2F;p&gt;
&lt;p&gt;A week to make one number user modifiable.&lt;&#x2F;p&gt;
&lt;p&gt;Now imagine how long it would have taken if I had made the whole color modifiable!&lt;&#x2F;p&gt;
&lt;p&gt;And remember, there&#x27;s tons of legacy code here which rely on each other,
so I could not take shortcuts at places without possibly breaking everything.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;and-that-s-why-union-was-born&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#and-that-s-why-union-was-born&quot; aria-label=&quot;Anchor link for: and-that-s-why-union-was-born&quot;&gt;And that&#x27;s why Union was born&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is why &lt;a href=&quot;https:&#x2F;&#x2F;quantumproductions.info&#x2F;articles&#x2F;2025-02&#x2F;moving-kdes-styling-future&quot;&gt;Union&lt;&#x2F;a&gt; is such an important project when it comes to styling,
and which is why we are most likely NOT going
to modify Breeze much further, aside maintenance: A lot of work for even small changes.&lt;&#x2F;p&gt;
&lt;p&gt;Union lets us have a &quot;single source of truth.&quot; We can change things only in &lt;strong&gt;one place&lt;&#x2F;strong&gt; and (hopefully)
see the visuals update everywhere, be it QtQuick, QtWidgets or Plasma style or whatever we decide to support!
Which means easier to work on styling and iterate on it, designers have easier time collaborating because changes
do not take days.. Etc.&lt;&#x2F;p&gt;
&lt;p&gt;So I am putting more effort in Union from now on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary-and-future&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary-and-future&quot; aria-label=&quot;Anchor link for: summary-and-future&quot;&gt;Summary and future&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I felt this was important change due to accessibility reasons, so I did it. And I am happy that I did, even
if it was tons of work. (And there&#x27;s more left with bugfixing lol.)
This will also help alleviate issues where people feel like our apps are too &quot;framey.&quot; You can now
turn them off (well, you can make their color same as the background color) by setting the contrast to 0%.
I must warn you that setting the value to &lt;strong&gt;0% will probably look broken at some places&lt;&#x2F;strong&gt;, so we will probably
have to add a warning to the color editor that &quot;hey this is not optimal but you can do it lol.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;In short-term future, I want this to be tied to the desktop portal interface for high-contrast accessibility preference:
When user has this enabled, be they on Plasma desktop or not, the applications will maximize
this frame contrast value automatically.&lt;&#x2F;p&gt;
&lt;p&gt;And then, there&#x27;s bug hunting and finding out any weird inconsistencies. If you spot any, please
report them to &lt;a href=&quot;https:&#x2F;&#x2F;bugs.kde.org&quot;&gt;https:&#x2F;&#x2F;bugs.kde.org&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;In long-term, this whole color thing will be rewritten to something much more robust, shinier, fancier and
it will work with Union and everything is nice and beautiful. At least, that&#x27;s what I hope.&lt;&#x2F;p&gt;
&lt;p&gt;I hope people will like this feature, especially those who need high-contrast colors.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The move from Blue Systems to TechPaladin</title>
          <pubDate>Tue, 16 Sep 2025 15:06:34 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>work</category>
            
              <category>ramble</category>
            <link>https://akselmo.dev/posts/bluesystems-to-techpaladin/</link>
          <guid>https://akselmo.dev/posts/bluesystems-to-techpaladin/</guid>
          <description>&lt;p&gt;People have been a bit weirded by what happened during this period. &lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
People have been interested in this after the post by &lt;a href=&quot;https:&#x2F;&#x2F;jriddell.org&#x2F;2025&#x2F;09&#x2F;14&#x2F;adios-chicos-25-years-of-kde&#x2F;&quot;&gt;Jonathan Riddell&lt;&#x2F;a&gt;
was written.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s what I remember from the situation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;order-of-events&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#order-of-events&quot; aria-label=&quot;Anchor link for: order-of-events&quot;&gt;Order of events&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;I get &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;i-got-laid-off&#x2F;&quot;&gt;laid off from previous job&lt;&#x2F;a&gt; in 2023-10-10.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pointieststick.com&#x2F;&quot;&gt;Nate Graham&lt;&#x2F;a&gt; learns of this and invites me to join Blue Systems.
&lt;ul&gt;
&lt;li&gt;I would be joining the team that works with Valve contracts. Cool!&lt;&#x2F;li&gt;
&lt;li&gt;He had no power to really &quot;invite&quot; me but told me that there&#x27;s a good spot I could fill.&lt;&#x2F;li&gt;
&lt;li&gt;I apply and cross my fingers&lt;&#x2F;li&gt;
&lt;li&gt;I get into interview and get hired!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;I work for Blue Systems until ~31.10.2024, renewing the contract yearly.&lt;&#x2F;li&gt;
&lt;li&gt;Blue Systems holds a get-together in late 2024.&lt;&#x2F;li&gt;
&lt;li&gt;I am really bad with traveling due to anxiety and I was still recovering from the Akademy 2024, I skip this get-together.&lt;&#x2F;li&gt;
&lt;li&gt;I get a video call from the get-together, where I&#x27;m told news: &lt;strong&gt;the team that has the Valve contract is being laid off.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;However! We also have this chance to start working with our single contract, Valve, in separate company.
&lt;ul&gt;
&lt;li&gt;Essentially, we, the team that works with Valve, are moving to new company and continue this contract under it&#x27;s name.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;A lot of chatter in work Telegram about how the new company should be governed.&lt;&#x2F;li&gt;
&lt;li&gt;A lot of differences in opinions. Long debates. Talks.
&lt;ul&gt;
&lt;li&gt;Everyone had their own opinions and plans.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;My wife gets really sick and has to spend chunk of December in hospital.
&lt;ul&gt;
&lt;li&gt;I have zero energy for any of the work governance things.&lt;&#x2F;li&gt;
&lt;li&gt;I just wanted to make sure I have job and get my salary.&lt;&#x2F;li&gt;
&lt;li&gt;Thus, I did not really care what the plan was going to be.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Eventually, we decide Nate&#x27;s plan for this is the easiest.
&lt;ul&gt;
&lt;li&gt;More info here &lt;a href=&quot;https:&#x2F;&#x2F;pointieststick.com&#x2F;2025&#x2F;03&#x2F;10&#x2F;personal-and-professional-updates-announcing-techpaladin-software&#x2F;#comment-40233&quot;&gt;Personal and professional updates — announcing Techpaladin Software&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;I would have been fine with whatever plan, as long as I get to keep my job and continue my work and getting paid.&lt;&#x2F;li&gt;
&lt;li&gt;I do not remember any kind of voting or anything like that. We just went with it. Everyone was very tired of this weird situation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;We all just wanted to get back to work.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Time goes by and TechPaladin is ready for continuing the work around March.&lt;&#x2F;li&gt;
&lt;li&gt;I have some small interview about the situation with Nate, and he asks me &lt;strong&gt;if I&#x27;m still interested to join.&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;No contract was made yet with anyone. TechPaladin was barely established at this point.&lt;&#x2F;li&gt;
&lt;li&gt;I assume everyone in Valve team went through this discussion. I do not know anything else.&lt;&#x2F;li&gt;
&lt;li&gt;We had no money to pay for non-Valve related work.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;I end my contract with Blue Systems around March 2025.&lt;&#x2F;li&gt;
&lt;li&gt;I start my contract with TechPaladin around same week.&lt;&#x2F;li&gt;
&lt;li&gt;I still work there!&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;messy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#messy&quot; aria-label=&quot;Anchor link for: messy&quot;&gt;Messy.&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Yeah, it&#x27;s really messy. And I wish it had gone differently. But that&#x27;s how things go.&lt;&#x2F;p&gt;
&lt;p&gt;I have been laid off before, twice.&lt;&#x2F;p&gt;
&lt;p&gt;First time when I was a very fresh programmer, I was suddenly told in middle of day that my contract will end
right before my probation period will end.&lt;&#x2F;p&gt;
&lt;p&gt;Then second time, I went for a leave due to burnout, come back to work, and on same day I&#x27;m told I&#x27;m getting laid off.&lt;&#x2F;p&gt;
&lt;p&gt;It sucked.&lt;&#x2F;p&gt;
&lt;p&gt;So Jonathan, I can sympathize with your feelings about the situation.
I hope you get help for your issues and warmth to your life. Sincerely. I do not have anything bad against you.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-experiences-at-techpaladin&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-experiences-at-techpaladin&quot; aria-label=&quot;Anchor link for: my-experiences-at-techpaladin&quot;&gt;My experiences at TechPaladin&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;TechPaladin has always paid my salary in time.&lt;&#x2F;li&gt;
&lt;li&gt;My contract is completely legal where I live.
&lt;ul&gt;
&lt;li&gt;I&#x27;m sure I could negotiate it into something more shiny with help of lawyers, money and time.&lt;&#x2F;li&gt;
&lt;li&gt;But I trust TechPaladin to not screw me over.&lt;&#x2F;li&gt;
&lt;li&gt;And if they would do so, I would leave immediately and cut my losses.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;I&#x27;ve never been &quot;abused&quot; in any way.
&lt;ul&gt;
&lt;li&gt;People care about me there.&lt;&#x2F;li&gt;
&lt;li&gt;They notice if I&#x27;m burning out (looking at you Dolphin) and help me switch projects.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sure, I might be naive for trusting a company like this.
But I&#x27;m just like this. If I like the people who I work with, I trust them.
This is not the first company I trust like this. It won&#x27;t be the last either, probably.&lt;&#x2F;p&gt;
&lt;p&gt;And I just want to fix bugs in KDE software without having to think about the corporate stuff,
but still have money for food and rent. TechPaladin lets me do that.&lt;&#x2F;p&gt;
&lt;p&gt;In the end, the contract is my choice and this is the choice I&#x27;ve made.
So far so good.&lt;&#x2F;p&gt;
&lt;p&gt;And my friends and family know me. If TechPaladin would go against my values or rights,
all of them would know.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusions&quot; aria-label=&quot;Anchor link for: conclusions&quot;&gt;Conclusions&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Draw your own conclusions.&lt;&#x2F;p&gt;
&lt;p&gt;Or better yet, join KDE to help keep the project running: &lt;a href=&quot;https:&#x2F;&#x2F;community.kde.org&#x2F;Get_Involved&quot;&gt;https:&#x2F;&#x2F;community.kde.org&#x2F;Get_Involved&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Maybe this post helps shine light on things, anyway. Not that I really need to do this, since it&#x27;s all private matters,
but since it&#x27;s been blown open, meh. Might as well. I&#x27;m tired of the &lt;a href=&quot;https:&#x2F;&#x2F;xkcd.com&#x2F;386&#x2F;&quot;&gt;misinformation&lt;&#x2F;a&gt; I&#x27;ve seen around.&lt;&#x2F;p&gt;
&lt;p&gt;glhf.&lt;&#x2F;p&gt;
&lt;p&gt;ps. if some youtuber reads this, hi&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Akademy 2025 - My first talk!</title>
          <pubDate>Sat, 13 Sep 2025 01:32:08 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>akademy</category>
            
              <category>conference</category>
            
              <category>linux</category>
            <link>https://akselmo.dev/posts/akademy-2025/</link>
          <guid>https://akselmo.dev/posts/akademy-2025/</guid>
          <description>&lt;p&gt;Once again, all &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;&quot;&gt;KDE&lt;&#x2F;a&gt; nerds had their yearly gathering around somewhere in the world.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
We call this gathering &lt;a href=&quot;https:&#x2F;&#x2F;akademy.kde.org&#x2F;2025&#x2F;&quot;&gt;Akademy&lt;&#x2F;a&gt; and this year it was in Berlin.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t really have anything in-depth to share, except for my first talk I had.
I spent a lot of time listening to talks and chilling at BoFs. Since I was with my &lt;a href=&quot;https:&#x2F;&#x2F;tecsielity.wordpress.com&#x2F;&quot;&gt;wife&lt;&#x2F;a&gt;,
we also went around Berlin looking for fun things, such as the Aquarium at the zoo.&lt;&#x2F;p&gt;
&lt;p&gt;TL;DR: I don&#x27;t remember much, but I had a lot of fun and &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;clARvO_AthM&quot;&gt;I had my first talk!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-1&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-1&quot; aria-label=&quot;Anchor link for: day-1&quot;&gt;Day 1&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We arrived around ~13.00 at Berlin airport and spent some time getting to
our hotel. After a good nap, we went to the welcome event, where I
had a nice hotdog and chatted with various folks.&lt;&#x2F;p&gt;
&lt;p&gt;It was a bit of a blur, I was so sleepy. But I do remember having fun.&lt;&#x2F;p&gt;
&lt;p&gt;Also I was super happy that our planes were finally on time this year, unlike last time...&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-2&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-2&quot; aria-label=&quot;Anchor link for: day-2&quot;&gt;Day 2&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I arrived to Akademy venue around 9:30 and spent the whole day going to talks
and taking notes of said talks. I will share those notes later in the post.&lt;&#x2F;p&gt;
&lt;p&gt;I also had a lot of discussions with other KDE devs about Union and the like.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-3&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-3&quot; aria-label=&quot;Anchor link for: day-3&quot;&gt;Day 3&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I spent so much time just being anxious about my talk, so that I don&#x27;t remember much else.&lt;&#x2F;p&gt;
&lt;p&gt;I have embedded the talk in here.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;clARvO_AthM?si=LIzmwmMk-iaYMmaz&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;Here&#x27;s also a link to the talk: &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=clARvO_AthM&quot;&gt;Youtube link&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I rushed the talk a bit due to worrying it would take too long, I tend to go &quot;hummmm&quot; a lot..
So I forgot to mention two bits:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The cosplay in the intro slide is what I wish I wore for the talk.. :D&lt;&#x2F;li&gt;
&lt;li&gt;We should warn newcomers about any of the possible negativity their contributions may gather.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Other than that, it went fine I think.&lt;&#x2F;p&gt;
&lt;p&gt;Later in the evening we visited &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;C-base&quot;&gt;c-base&lt;&#x2F;a&gt; and it was really
cool looking hackerspace. Though I was already out of any energy at that point, we left a bit early.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;my-akademy-notes-file&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-akademy-notes-file&quot; aria-label=&quot;Anchor link for: my-akademy-notes-file&quot;&gt;My Akademy Notes file&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Here&#x27;s a link to the notes, excuse my bad handwriting: &lt;a href=&quot;&#x2F;assets&#x2F;misc&#x2F;Akademy2025Notes.pdf&quot;&gt;Akademy 2025 notes.pdf&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-4&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-4&quot; aria-label=&quot;Anchor link for: day-4&quot;&gt;Day 4&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First we went to the aquarium, which was fun. We saw very cool sharks and other huge fish there.
I did not even know Koi fish could grow that big.
We also saw a lot of different lizards, toads and insects. I tried my best to
befriend the iguana in there... But I don&#x27;t think they spoke Finnish.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;2025&#x2F;iguana.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;akademy2025&#x2F;iguana.png&quot; alt=&quot;Me chatting to an iguana&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We then also had a korean sandwich, I bought myself a pair of new cool pants and we visited
a Lego store.&lt;&#x2F;p&gt;
&lt;p&gt;Later in the evening, I went to a dinner with my coworkers, which was really fun.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-5&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-5&quot; aria-label=&quot;Anchor link for: day-5&quot;&gt;Day 5&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Went to more Akademy BoFs. One of the more interesting ones was the BoF around &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;linux&#x2F;&quot;&gt;KDE Linux&lt;&#x2F;a&gt;
so we chatted about it and any related issues with it.&lt;&#x2F;p&gt;
&lt;p&gt;I also went to a BoF around KIO + Sandboxing, to see what we can do to make tools that depend on
KIO work better in sandboxed environment, such as Flatpaks.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly I don&#x27;t have much notes from either, since they were rather speedy and I missed parts of
them all because I was busy tinkering on my KomoDo app.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-6&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-6&quot; aria-label=&quot;Anchor link for: day-6&quot;&gt;Day 6&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;On the last day, we had a scavenger hunt in the morning and then went to a game museum.
I was so exhausted that I couldn&#x27;t even think of walking around Berlin anymore, so I
just joined the game museum part. It was rather cool and I spent some time playing various
arcade games they had set up.&lt;&#x2F;p&gt;
&lt;p&gt;There was also some &quot;PainGame&quot; that was basically pong but with pickups that would cause
actual pain to the other player. The players had to hold their hand on some panel that would
heat up, cause electric shocks and whip the hand with some plastic bit.&lt;&#x2F;p&gt;
&lt;p&gt;Well I tried it and pulled my hand off the moment I felt it heating up. I already had enough
anxiety at the moment, didn&#x27;t need to contribute more to it.&lt;&#x2F;p&gt;
&lt;p&gt;After a pizza at a nice little pizza place, we went back to hotel and slept.&lt;&#x2F;p&gt;
&lt;p&gt;The next morning we went to a plane at 5 am and were soon back home.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ramblings-and-thoughts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ramblings-and-thoughts&quot; aria-label=&quot;Anchor link for: ramblings-and-thoughts&quot;&gt;Ramblings and thoughts&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Berlin is not a good place for me to go to. It&#x27;s very loud, uh.. fragrant and there&#x27;s a lot
of things moving constantly.&lt;&#x2F;p&gt;
&lt;p&gt;My nerves were constantly shot. I kept constantly looking around for bad shit to happen,
I could not relax at all. I managed to &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Masking_(behavior)&quot;&gt;mask&lt;&#x2F;a&gt;
it to the best of my abilities, but that just drained me further.&lt;&#x2F;p&gt;
&lt;p&gt;So, uh, sorry anyone who thought I was rather hard to approach. I was just constantly anxious.
&lt;strong&gt;Akademy itself was really nice&lt;&#x2F;strong&gt; and people there were really friendly and fun, but Berlin
just was too much for me.&lt;&#x2F;p&gt;
&lt;p&gt;I also really enjoyed every single talk and BoF I went to!&lt;&#x2F;p&gt;
&lt;p&gt;I just can&#x27;t deal with big cities well, I suppose.
Next year I will have to limit the time I&#x27;m traveling, preferably ~4 days or so.
Anything more is out of my limits.&lt;&#x2F;p&gt;
&lt;p&gt;Still, looking forward to where it will be next year. :)&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading, I know there wasn&#x27;t much actual knowledge in this blogpost, but maybe
you liked my talk and&#x2F;or my notes.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Various desktop Linux tips for newbies</title>
          <pubDate>Sat, 16 Aug 2025 17:15:24 +0000</pubDate>
          <author>Akseli</author>
              <category>linux</category>
            
              <category>kde</category>
            
              <category>infodump</category>
            
              <category>fedora</category>
            
              <category>kubuntu</category>
            
              <category>bazzite</category>
            
              <category>gaming</category>
            <link>https://akselmo.dev/posts/how-to-linux-2025/</link>
          <guid>https://akselmo.dev/posts/how-to-linux-2025/</guid>
          <description>&lt;p&gt;There has been quite a surge in interest towards desktop Linux lately.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
The userbase, at least according to &lt;a href=&quot;https:&#x2F;&#x2F;www.gamingonlinux.com&#x2F;steam-tracker&#x2F;&quot;&gt;some metrics&lt;&#x2F;a&gt;, seems to be climbing.&lt;&#x2F;p&gt;
&lt;p&gt;I realised today that it&#x27;s been 4 years for me since I did the switch.
I have gathered some know-how that maybe a complete newbie could find useful.
I also try to untangle some jargon I&#x27;ve learned: It may not be exactly technically correct, but
this is meant for a more regular user anyway.&lt;&#x2F;p&gt;
&lt;p&gt;Note: &lt;em&gt;&lt;strong&gt;Do not trust &quot;AI&quot; tools when looking for information.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt; They can lie. They don&#x27;t really &quot;know&quot; anything, they just copy what they see on the internet, and spit it out. Sometimes in wrong orders and contexts.
I will list some resources I trust at the end of the post.&lt;&#x2F;p&gt;
&lt;p&gt;I have also written about this before here: &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;setting-up-kubuntu-for-gaming&#x2F;&quot;&gt;Setting up Kubuntu for gaming&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;That post is quite out of date though, so consider this a supplemental material and sort of upgrade.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;investigate-the-software-you-need&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#investigate-the-software-you-need&quot; aria-label=&quot;Anchor link for: investigate-the-software-you-need&quot;&gt;Investigate the software you need&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There is often times where you can only use specific software on Windows only.
Or specific games with anticheats do not work on Linux; Not all of them though! Just some, especially with kernel level anticheats!.&lt;&#x2F;p&gt;
&lt;p&gt;But for example Photoshop or similar tools do not work on Linux natively. There can be tricks to get them
working.&lt;&#x2F;p&gt;
&lt;p&gt;You would not expect Mac software to work on Windows, right? This is similar kind of situation.&lt;&#x2F;p&gt;
&lt;p&gt;Now Linux can run &lt;strong&gt;some&lt;&#x2F;strong&gt; Windows applications through &lt;a href=&quot;https:&#x2F;&#x2F;usebottles.com&#x2F;&quot;&gt;Bottles&lt;&#x2F;a&gt;, which uses &lt;a href=&quot;https:&#x2F;&#x2F;www.winehq.org&#x2F;&quot;&gt;Wine&lt;&#x2F;a&gt;. But not all.&lt;&#x2F;p&gt;
&lt;p&gt;So, make a list of the Must Have applications you have. Then search for Linux compatibility.&lt;&#x2F;p&gt;
&lt;p&gt;In some cases, you may find alternatives for the application, that work on both Windows and Linux!
When that happens, you can already test it out in Windows and see if it works for your workflow,
and start using that instead. Note that this can take time to learn, but I think it would be worth it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;and-hardware-too&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#and-hardware-too&quot; aria-label=&quot;Anchor link for: and-hardware-too&quot;&gt;And hardware too&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I haven&#x27;t had a problem with incompatible hardware with Linux for long long time, but it&#x27;s still good idea
to check it. For example, if you have Nvidia GPU, you may want to check if the GPU is supported by which drivers,
or if you need to install drivers at all. For AMD&#x2F;Intel GPU users, you&#x27;re in luck, because the drivers are in the Kernel:
This means that you don&#x27;t need to install anything.&lt;&#x2F;p&gt;
&lt;p&gt;If I have had trouble with hardware, it&#x27;s often been audio devices, like headsets that have two separate dials
for sound (mono and stereo), weird bluetooth speakers, etc..&lt;&#x2F;p&gt;
&lt;p&gt;There is a site called &lt;a href=&quot;https:&#x2F;&#x2F;linux-hardware.org&#x2F;&quot;&gt;Linux Hardware&lt;&#x2F;a&gt; you can use to search for compatible parts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;backup-all-your-stuff&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#backup-all-your-stuff&quot; aria-label=&quot;Anchor link for: backup-all-your-stuff&quot;&gt;Backup all your stuff&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Before doing anything to your PC: Backup your data. Backup the photos, the videos, the game save files,
documents, anything you may need. Back them up to a cloud service or external drive.&lt;&#x2F;p&gt;
&lt;p&gt;Make sure those backups work, too.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;distribution-choice-paralysis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#distribution-choice-paralysis&quot; aria-label=&quot;Anchor link for: distribution-choice-paralysis&quot;&gt;Distribution choice paralysis&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Linux distributions are all their own operating systems, they just share the most
central part, that is the &lt;a href=&quot;https:&#x2F;&#x2F;www.kernel.org&#x2F;&quot;&gt;Linux kernel&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Distributions take that kernel, add their own things to it and make it
what they want it to be for their users.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s a lot of distributions. Like, A LOT. So of course it&#x27;ll feel daunting
to choose one.&lt;&#x2F;p&gt;
&lt;p&gt;But there&#x27;s no &quot;wrong&quot; choice. It will probably take time to figure out
which one you like, but honestly, most people will be fine with one that
does it&#x27;s job, stays out of the way and updates without effort.&lt;&#x2F;p&gt;
&lt;p&gt;Everyone has tons of opinions about this. Then there&#x27;s the weird
curmudgeons that tell others their opinion is &quot;wrong.&quot; Those people
are something you can ignore. If it works for you, that&#x27;s all that matters.&lt;&#x2F;p&gt;
&lt;p&gt;After choosing a distribution, you install it to an USB stick (that has nothing important in it,
so NOT the one with your backups!!) with tool like &lt;a href=&quot;https:&#x2F;&#x2F;rufus.ie&#x2F;en&#x2F;&quot;&gt;Rufus&lt;&#x2F;a&gt;,
boot from it at PC startup (varies between motherboards) and get installing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;my-recommended-newbie-distributions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-recommended-newbie-distributions&quot; aria-label=&quot;Anchor link for: my-recommended-newbie-distributions&quot;&gt;My recommended newbie distributions&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To help one get started with choosing, here&#x27;s my recommendations from all the
distributions I&#x27;ve tried on my ~4 year journey.&lt;&#x2F;p&gt;
&lt;p&gt;Do note that gaming is big factor in my computer use, so if the distribution
can&#x27;t game well, it&#x27;s not on this list.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;bazzite&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bazzite&quot; aria-label=&quot;Anchor link for: bazzite&quot;&gt;Bazzite&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Homepage: &lt;a href=&quot;https:&#x2F;&#x2F;bazzite.gg&#x2F;&quot;&gt;https:&#x2F;&#x2F;bazzite.gg&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Bazzite is perfect distribution for anyone starting with Linux.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s made so that user can&#x27;t really break it, due to it&#x27;s nature:
You can&#x27;t really open system files and start modifying them and deleting them.
Then, updates are done in a way that if something goes wrong, you can go to previous version
of the distribution.&lt;&#x2F;p&gt;
&lt;p&gt;On top of that, it makes setting it up very easy with its &lt;a href=&quot;https:&#x2F;&#x2F;docs.bazzite.gg&#x2F;General&#x2F;Installation_Guide&#x2F;&quot;&gt;guides&lt;&#x2F;a&gt;.
And in download section, you select what hardware you have, and what desktop environment you have, so you
know from the get-go that it&#x27;s very likely going to work with your system.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;If you don&#x27;t really know what to choose, go with Bazzite.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h4 id=&quot;fedora-kde&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fedora-kde&quot; aria-label=&quot;Anchor link for: fedora-kde&quot;&gt;Fedora KDE&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Homepage: &lt;a href=&quot;https:&#x2F;&#x2F;fedoraproject.org&#x2F;kde&#x2F;&quot;&gt;https:&#x2F;&#x2F;fedoraproject.org&#x2F;kde&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Fedora KDE is solid. It works, it updates regularly, it plays games I play
really well, and works with development. And then it stays out of the way.
Fedora is also what Bazzite is built on top of.&lt;&#x2F;p&gt;
&lt;p&gt;Fedora however allows you to tinker with the system files and such, as long
as you have access to it. You should not do that if you don&#x27;t know what you&#x27;re doing!
But it&#x27;s possible.&lt;&#x2F;p&gt;
&lt;p&gt;Installation on systems with AMD&#x2F;Intel GPU is really easy and you don&#x27;t need to
install any separate drivers.&lt;&#x2F;p&gt;
&lt;p&gt;With Nvidia GPU, you will likely have to use RPM Fusion repositories, and follow
their guide: &lt;a href=&quot;https:&#x2F;&#x2F;rpmfusion.org&#x2F;Howto&#x2F;NVIDIA&quot;&gt;https:&#x2F;&#x2F;rpmfusion.org&#x2F;Howto&#x2F;NVIDIA&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;So yes, for Nvidia users it can be bit more tinkery.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Fedora KDE is my daily driver&lt;&#x2F;strong&gt; because it works really well with any
development work I do due to it&#x27;s up-to-date system libraries.
And since it&#x27;s regularly updated, if there is a bug, it often gets fixed just
as fast.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;kubuntu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kubuntu&quot; aria-label=&quot;Anchor link for: kubuntu&quot;&gt;Kubuntu&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Homepage: &lt;a href=&quot;https:&#x2F;&#x2F;kubuntu.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;kubuntu.org&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Last but not the least, Kubuntu is a solid distribution as well.
It does not update as frequently as Fedora KDE does, but not everyone
needs such frequent updates, especially for basic daily use.&lt;&#x2F;p&gt;
&lt;p&gt;Kubuntu utilizes same tools and systems as &lt;a href=&quot;https:&#x2F;&#x2F;ubuntu.com&#x2F;&quot;&gt;Ubuntu&lt;&#x2F;a&gt;, which you may
have heard of. So it has a solid community behind it.&lt;&#x2F;p&gt;
&lt;p&gt;When I used Kubuntu, it worked with games really well and I had zero issues with it.
I moved to Fedora due to development stuff, so that&#x27;s why I don&#x27;t use it anymore.&lt;&#x2F;p&gt;
&lt;p&gt;When downloading Kubuntu, make sure to choose &quot;Latest.&quot;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;opinions-and-notes-about-lts-distros&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#opinions-and-notes-about-lts-distros&quot; aria-label=&quot;Anchor link for: opinions-and-notes-about-lts-distros&quot;&gt;Opinions and notes about LTS distros&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;LTS stands for &quot;Long Term Support&quot; or &quot;Long Term Stable.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;This wording has caused a lot of confusion: People tend to think &quot;stable&quot; means it doesn&#x27;t crash.
What it actually means is that &lt;strong&gt;it won&#x27;t change&lt;&#x2F;strong&gt; and that means &lt;strong&gt;the bugs are stable too.&lt;&#x2F;strong&gt;
The only updates it gets are security updates. Bug fixes, especially for software, are really rare.&lt;&#x2F;p&gt;
&lt;p&gt;LTS&#x2F;Stable distributions are perfect for &lt;strong&gt;enterprise environments&lt;&#x2F;strong&gt; or your grandmas PC which you know
she won&#x27;t remember to update.&lt;&#x2F;p&gt;
&lt;p&gt;For regular use, especially gaming use, I would recommend against them: They use LTS kernel that
has support only for specific devices, so if you buy a new shiny GPU and plop it in to system running
on LTS kernel, it very likely does not have support for that new shiny GPU.&lt;&#x2F;p&gt;
&lt;p&gt;Also, when you encounter an annoying bug, be prepared for that bug to stay around until the next LTS release:
Which can mean years!&lt;&#x2F;p&gt;
&lt;p&gt;So unless you really know you &lt;em&gt;need&#x2F;want&lt;&#x2F;em&gt; LTS distribution, choose anything that is &quot;Latest&quot; or frequently updated.
You will have less headaches that way: I learned this the hard way.&lt;&#x2F;p&gt;
&lt;p&gt;Note: Bunch of people have told me that I should have more nuance here. I understand it too,
for some people LTS distribution can be quite perfect. I&#x27;m not saying that one should completely avoid them, either.
But newcomer should, in my honest opinion, try more up-to-date distribution. I think they provide
better experiences, especially for regular desktop use. Bazzite has been really good for this usecase.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;desktop-environments&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#desktop-environments&quot; aria-label=&quot;Anchor link for: desktop-environments&quot;&gt;Desktop environments&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;You may notice that I seem to recommend distros running on &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;&quot;&gt;KDE software&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is because, well, I work on that software and I like it! But people also find it
very easy to learn when they&#x27;re coming from Windows.&lt;&#x2F;p&gt;
&lt;p&gt;When I started Linuxing, I tried &lt;a href=&quot;https:&#x2F;&#x2F;www.gnome.org&#x2F;&quot;&gt;GNOME&lt;&#x2F;a&gt;. It&#x27;s a great desktop environment,
but it&#x27;s far from what Windows is. This was very overwhelming for me, because I was already
learning completely new operating system paradigm, so having also the desktop use change from underneath
was really jarring. I then tried &lt;a href=&quot;https:&#x2F;&#x2F;xfce.org&#x2F;&quot;&gt;XFCE&lt;&#x2F;a&gt;, which is very lightweight and nice to use,
but it lacked some things I wanted, like &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Wayland_(protocol)&quot;&gt;Wayland&lt;&#x2F;a&gt; support.&lt;&#x2F;p&gt;
&lt;p&gt;I then stumbled upon on &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;plasma-desktop&#x2F;&quot;&gt;KDE Plasma&lt;&#x2F;a&gt; and fell in love with it:
I did not have to learn completely new way of using my desktop, but could &lt;em&gt;gradually&lt;&#x2F;em&gt; modify the desktop
to suit my needs. My Plasma setup is &lt;em&gt;far&lt;&#x2F;em&gt; from the defaults nowadays, and Plasma allowed
me to discover what I like on my own pace.&lt;&#x2F;p&gt;
&lt;p&gt;Note that I don&#x27;t think any desktop environment is &quot;bad.&quot; They&#x27;re just different, catering for different
needs.&lt;&#x2F;p&gt;
&lt;p&gt;But for most Windows users, I do recommend KDE Plasma for the above reasons: Less cognitive load
to learn everything.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unlearning-windows&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#unlearning-windows&quot; aria-label=&quot;Anchor link for: unlearning-windows&quot;&gt;Unlearning Windows&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;When moving to desktop Linux, most people are confused by some things, like &quot;Where&#x27;s my C-drive.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Windows has taught many of us specific patterns, and when those patterns do not exist, we tend
to blame the system we&#x27;re using.&lt;&#x2F;p&gt;
&lt;p&gt;What you need to remember is that you&#x27;re not trying to switch to &quot;better Windows.&quot; You&#x27;re
switching to completely different operating system, and you need to try your best at &lt;em&gt;unlearning Windows&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;so-where-is-the-c-and-d-drive&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#so-where-is-the-c-and-d-drive&quot; aria-label=&quot;Anchor link for: so-where-is-the-c-and-d-drive&quot;&gt;So where is the C and D drive&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Instead of having drives like C and D, you mount the drives you have.&lt;&#x2F;p&gt;
&lt;p&gt;You can open terminal and type &lt;code&gt;ls &#x2F;mnt&#x2F;&lt;&#x2F;code&gt; and it shows what drives you have mounted.&lt;&#x2F;p&gt;
&lt;p&gt;Mounting in this case means that it&#x27;s plugged in and browsable.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a shoddy comparison:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;C drive on Windows -&amp;gt; &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;D drive on Windows -&amp;gt; &lt;code&gt;&#x2F;mnt&#x2F;drive-name&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; is called &quot;root directory&quot; and that&#x27;s where everything in the PC resides.&lt;&#x2F;p&gt;
&lt;p&gt;It can get more complicated, and my suggestion is to just leave &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; alone.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to have games on your other drive, check your &lt;code&gt;&#x2F;mnt&#x2F;&lt;&#x2F;code&gt; folder for that
drive. Usually during installation the drive is made for you.&lt;&#x2F;p&gt;
&lt;p&gt;If not, you may have to ask help for the distribution you&#x27;re using.&lt;&#x2F;p&gt;
&lt;p&gt;In Linux, all drives and such are folders, that start from &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;. Instead of
multiple &quot;trees&quot; that start from &quot;C&quot; or &quot;D&quot;, there&#x27;s one big tree that starts from &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-s-home-or&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-home-or&quot; aria-label=&quot;Anchor link for: what-s-home-or&quot;&gt;What&#x27;s &#x2F;home&#x2F; or ~&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;When you open file manager such as &lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;dolphin&#x2F;&quot;&gt;Dolphin&lt;&#x2F;a&gt;, usually
the first folder you see open is &lt;code&gt;&#x2F;home&#x2F;your-username&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is your home folder. Think of it like &quot;my documents&quot; folder in Windows computers.&lt;&#x2F;p&gt;
&lt;p&gt;Keep all your documents, videos, images etc. in here.&lt;&#x2F;p&gt;
&lt;p&gt;When people say &lt;code&gt;~&#x2F;Documents&lt;&#x2F;code&gt;, the &lt;code&gt;~&lt;&#x2F;code&gt; is shorthand for &lt;code&gt;&#x2F;home&#x2F;your-username&#x2F;&lt;&#x2F;code&gt;.
This also works inside terminal, so you can type &lt;code&gt;ls ~&lt;&#x2F;code&gt; to see what&#x27;s inside your home folder,
without having to type the &lt;code&gt;&#x2F;home&#x2F;user&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;can-i-just-keep-my-game-drive-from-windows&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#can-i-just-keep-my-game-drive-from-windows&quot; aria-label=&quot;Anchor link for: can-i-just-keep-my-game-drive-from-windows&quot;&gt;Can I just keep my game drive from Windows?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;When installing Linux, many people tend to ask that if they can just keep the drive
full of games, like &lt;code&gt;D:&lt;&#x2F;code&gt; drive, without formatting it and just use the same
game files.&lt;&#x2F;p&gt;
&lt;p&gt;Well, you sort of can, but Linux is not very fast with it. When Windows formats drives,
it uses something called &lt;code&gt;NTFS&lt;&#x2F;code&gt; for them. Linux has many different ones, but usually it&#x27;s &lt;code&gt;ext4&lt;&#x2F;code&gt; or &lt;code&gt;btrfs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;NTFS&lt;&#x2F;code&gt; drives can be opened and such on Linux, but it can be rather slow.&lt;&#x2F;p&gt;
&lt;p&gt;So my tip is just to back up the game data to something like USB drive and then move them,
or just download the games again. You will be much happier with the performance that way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;do-not-be-afraid-of-terminal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#do-not-be-afraid-of-terminal&quot; aria-label=&quot;Anchor link for: do-not-be-afraid-of-terminal&quot;&gt;Do not be afraid of terminal&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Terminal is that box full of text you can type in. It looks like something from
the 80s&#x2F;90s.. And it can be intimidating.&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t be afraid of it! Terminals are great way to operate on some things because &lt;em&gt;they&#x27;re desktop agnostic!&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This means that if your friend uses GNOME and you use KDE Plasma, and you both have some problem you
have to solve. GNOME and Plasma have different user interfaces, so you can&#x27;t really advice your friend
how to solve that issue on their end.&lt;&#x2F;p&gt;
&lt;p&gt;However, what you &lt;em&gt;can&lt;&#x2F;em&gt; do is solve that issue inside terminal with a command, then share that command with
your friend who can then use it too.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, there&#x27;s a ton more nuance here.. But the above is why it&#x27;s still being used.&lt;&#x2F;p&gt;
&lt;p&gt;Couple important notes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you don&#x27;t understand the command, study it first before running it.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;If the command requires &lt;code&gt;sudo&lt;&#x2F;code&gt; to be run, study it three times before even thinking of running it.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Commands that need &lt;code&gt;sudo&lt;&#x2F;code&gt; to be run mean that they have access to everything on your computer, as they
need a &lt;code&gt;root&lt;&#x2F;code&gt; access. If you don&#x27;t know what you&#x27;re doing, things may break.&lt;&#x2F;p&gt;
&lt;p&gt;Again, this is not something you need to be afraid of, but you should be cautious,
especially when copying commands from the internet!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;report-bugs&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#report-bugs&quot; aria-label=&quot;Anchor link for: report-bugs&quot;&gt;Report bugs!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In Linux world, most things don&#x27;t cost anything. However, if you encounter bugs,
you should report those to the app&#x2F;system you encountered it with.&lt;&#x2F;p&gt;
&lt;p&gt;This helps the bug to get fixed. Sometimes it can take long time, sometimes it can be fixed next day.&lt;&#x2F;p&gt;
&lt;p&gt;But without the bug report, nobody will know.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a post about reporting bugs I wrote: &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;how-i-report-bugs&#x2F;&quot;&gt;How I report bugs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Note: &lt;strong&gt;If you&#x27;re using LTS distribution, report all the bugs to the distribution itself, not the app&#x2F;system!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;avoid-installing-apps-from-internet&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#avoid-installing-apps-from-internet&quot; aria-label=&quot;Anchor link for: avoid-installing-apps-from-internet&quot;&gt;Avoid installing apps from internet&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;On Windows, it&#x27;s common to go to a website and download an exe file there to install something.&lt;&#x2F;p&gt;
&lt;p&gt;On Linux, we prefer using app &quot;stores&quot; where one just types what they want to download and then
download it.&lt;&#x2F;p&gt;
&lt;p&gt;For example in KDE Plasma, we use tool called &lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;discover&#x2F;&quot;&gt;Discover&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of going to internet, open Discover and type the name of the app. If it exists, it&#x27;ll pop-up,
and then you can download it there.&lt;&#x2F;p&gt;
&lt;p&gt;This is safer for the user as the files come from the distribution (or Flathub, more on that later),
so they have been (likely) tested that they work. They also are installed more
cleanly to the system, so you get all the launcher icons and other things.&lt;&#x2F;p&gt;
&lt;p&gt;You &lt;em&gt;can&lt;&#x2F;em&gt; download apps from web pages, and sometimes that&#x27;s the only way to get some apps.
But always first check your distribution app downloader.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;flathub&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#flathub&quot; aria-label=&quot;Anchor link for: flathub&quot;&gt;Flathub&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;flathub.org&#x2F;&quot;&gt;Flathub&lt;&#x2F;a&gt; is the new cool thing that uses &lt;a href=&quot;https:&#x2F;&#x2F;flatpak.org&#x2F;&quot;&gt;Flatpaks&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As a regular user you don&#x27;t need to worry as much what Flatpaks are, but I will explain anyway:
When distributing application between distros, some distros use different package management systems.&lt;&#x2F;p&gt;
&lt;p&gt;This then can get out of hand when you want to share your app with 10 distributions that all use their own
thing. Or they use the same thing but have different library versions.. And this causes headaches.&lt;&#x2F;p&gt;
&lt;p&gt;What Flatpak tries to do is just Make Things Work by adding all that&#x27;s needed to the package, then user
just installs it. Flathub is a central place where people upload their flatpaks.&lt;&#x2F;p&gt;
&lt;p&gt;Flatpaks also have security measures, that can be helpful with some apps. For example Flatpak apps can
be told to not be able to read any other folder than &lt;code&gt;~&#x2F;Downloads&lt;&#x2F;code&gt; etc. Kind of like what Android has with their
permission system.&lt;&#x2F;p&gt;
&lt;p&gt;So, if your system does not have Flathub set up, select your distribution from &lt;a href=&quot;https:&#x2F;&#x2F;flathub.org&#x2F;setup&quot;&gt;here&lt;&#x2F;a&gt;,
and add it to your system.&lt;&#x2F;p&gt;
&lt;p&gt;However I advice to not install Steam through it: Steam works better when it has more access to
your system. So follow your distributions guide for installing Steam in those cases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dualbooting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dualbooting&quot; aria-label=&quot;Anchor link for: dualbooting&quot;&gt;Dualbooting&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you want or need to use Windows for something, it is possible to
set up your PC so that when you power on your PC, it asks you if you want to
use Windows or Linux.&lt;&#x2F;p&gt;
&lt;p&gt;Distributions have their own manuals for that. Be prepared that Windows updates have
been known to meddle with your boot-loader (the thing that shows you the &quot;Windows or Linux?&quot; at startup),
which may cause your PC suddenly boot only to Windows one day.&lt;&#x2F;p&gt;
&lt;p&gt;So, it&#x27;s possible, but you need to do some research about it for the distro you have chosen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;learning-resources&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#learning-resources&quot; aria-label=&quot;Anchor link for: learning-resources&quot;&gt;Learning resources&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Again, &lt;strong&gt;do not rely on AI tools.&lt;&#x2F;strong&gt; They can lie.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, search information from various forums and wikis, such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Main_page&quot;&gt;ArchWiki&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Despite the name, it can be useful for whatever distribution you use!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.protondb.com&#x2F;&quot;&gt;ProtonDB&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Game compatibility with Linux&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.gamingonlinux.com&#x2F;&quot;&gt;GamingOnLinux&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;A lot of gaming related news, and they have section for tracking &lt;a href=&quot;https:&#x2F;&#x2F;www.gamingonlinux.com&#x2F;anticheat&#x2F;&quot;&gt;anti-cheat compatibility&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;atl.wiki&#x2F;&quot;&gt;All Things Linux wiki&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Up and coming new wiki for Linux things&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;old.reddit.com&#x2F;r&#x2F;linuxhardware&#x2F;&quot;&gt;r&#x2F;linuxhardware&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;People ask here often if specific hardware works on Linux&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Then, every project and desktop has often their own forums and wiki pages.
When in doubt, read those. Don&#x27;t be afraid to ask in the forums either, or
in chats like IRC or Matrix.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;anything-else&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anything-else&quot; aria-label=&quot;Anchor link for: anything-else&quot;&gt;Anything else?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Uh, that&#x27;s a lot of stuff. I don&#x27;t remember if I had anything else in mind. I will update this post if
I do remember suddenly something.&lt;&#x2F;p&gt;
&lt;p&gt;I hope this has been useful, however! I can&#x27;t give in-depth guides to everything, because things
can vary between distributions, hardware, desktop environments.. But I hope this can at least
help you get started and helps resolve some questions you have.&lt;&#x2F;p&gt;
&lt;p&gt;If you have any questions, feel free to mail me at &lt;code&gt;linux-newbies@akselmo.dev&lt;&#x2F;code&gt;.
If it&#x27;s something that should deserve it&#x27;s place here, I will update the post.&lt;&#x2F;p&gt;
&lt;p&gt;Anyways, thanks for reading!&lt;&#x2F;p&gt;
&lt;h1 id=&quot;edits&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#edits&quot; aria-label=&quot;Anchor link for: edits&quot;&gt;Edits&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;2025-08-23: Clarified that my notes about LTS are opinions, added Dualbooting section&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Kate and Python Language Server: Basedpyright</title>
          <pubDate>Thu, 14 Aug 2025 00:06:09 +0000</pubDate>
          <author>Akseli</author>
              <category>python</category>
            
              <category>kate</category>
            
              <category>lsp</category>
            
              <category>language-server</category>
            
              <category>kde</category>
            <link>https://akselmo.dev/posts/kate-and-basedpyright/</link>
          <guid>https://akselmo.dev/posts/kate-and-basedpyright/</guid>
          <description>&lt;p&gt;This post is somewhat an update for my older post: &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;kate-python-lsp&#x2F;&quot;&gt;Kate and Python language server&lt;&#x2F;a&gt;&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There seems to be a lot of different Python language servers.. And I just want
one that does all and stays out of the way.&lt;&#x2F;p&gt;
&lt;p&gt;So after moaning about that I was pointed towards &lt;a href=&quot;https:&#x2F;&#x2F;docs.basedpyright.com&#x2F;latest&#x2F;&quot;&gt;basedpyright&lt;&#x2F;a&gt; on Fedi.&lt;&#x2F;p&gt;
&lt;p&gt;Despite the silly name, it works really well, so I set it up for &lt;a href=&quot;https:&#x2F;&#x2F;kate-editor.org&#x2F;&quot;&gt;Kate&lt;&#x2F;a&gt;
editor as I do. Here&#x27;s how.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;install-basedpyright&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#install-basedpyright&quot; aria-label=&quot;Anchor link for: install-basedpyright&quot;&gt;Install basedpyright&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;You may want to use something like &lt;a href=&quot;https:&#x2F;&#x2F;pipx.pypa.io&#x2F;latest&#x2F;&quot;&gt;pipx&lt;&#x2F;a&gt; for this, that&#x27;s at least what I did.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span&gt;pipx install basedpyright
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;pylsp-in-env-sh&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pylsp-in-env-sh&quot; aria-label=&quot;Anchor link for: pylsp-in-env-sh&quot;&gt;pylsp_in_env.sh&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Then add &lt;code&gt;pylsp_in_env.sh&lt;&#x2F;code&gt; to PATH (such as &lt;code&gt;~&#x2F;.local&#x2F;bin&#x2F;&lt;&#x2F;code&gt;) Kate can see:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;cd &lt;&#x2F;span&gt;&lt;span&gt;$path
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;-d&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F;.venv &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F;.venv&#x2F;bin&#x2F;activate
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;-d&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F;venv &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F;venv&#x2F;bin&#x2F;activate
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;elif &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;-f&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F;Pipfile &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span&gt; pipenv run basedpyright-langserver --stdio
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span&gt; 0
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span&gt; basedpyright-langserver --stdio
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As mentioned in the previous post, this is needed to get the proper virtual environment.
I also updated the script to work with Pipfiles.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kate-lsp-settings&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kate-lsp-settings&quot; aria-label=&quot;Anchor link for: kate-lsp-settings&quot;&gt;Kate lsp settings&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Then add this to Kate LSP settings.&lt;&#x2F;p&gt;
&lt;p&gt;I have also kept the &lt;code&gt;pylsp&lt;&#x2F;code&gt; settings there. It doesn&#x27;t harm anything to have them there,
in case you want to change the language server back to &lt;code&gt;python-lsp-server&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;python&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;pylsp_in_env&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;%{Project:NativePath}&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;		],
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;root&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;url&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;docs.basedpyright.com&#x2F;latest&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;highlightingModeRegex&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;^Python$&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;settings&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;basedpyright&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;				&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;analysis&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;typeCheckingMode&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;off&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;				}
&lt;&#x2F;span&gt;&lt;span&gt;			},
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;pylsp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;				&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;plugins&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;pycodestyle&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;						&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;enabled&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;					},
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;ruff&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;						&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;enabled&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span&gt;					}
&lt;&#x2F;span&gt;&lt;span&gt;				}
&lt;&#x2F;span&gt;&lt;span&gt;			}
&lt;&#x2F;span&gt;&lt;span&gt;		}
&lt;&#x2F;span&gt;&lt;span&gt;	}
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can change the &lt;code&gt;typeCheckingMode&lt;&#x2F;code&gt; to different values like &lt;code&gt;basic&lt;&#x2F;code&gt; and &lt;code&gt;recommended&lt;&#x2F;code&gt;
if project demands it. I set it &lt;code&gt;off&lt;&#x2F;code&gt; because with &lt;code&gt;recommended&lt;&#x2F;code&gt; there&#x27;s &lt;em&gt;A LOT&lt;&#x2F;em&gt; of
diagnostics that I usually don&#x27;t need, unless again, the project expects proper type checking.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;done&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#done&quot; aria-label=&quot;Anchor link for: done&quot;&gt;Done!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;And that&#x27;s it. Restart Kate or the Language server inside Kate and as long as Kate can find
the file, it should just start up &lt;code&gt;basedpyright-langserver&lt;&#x2F;code&gt; and work.&lt;&#x2F;p&gt;
&lt;p&gt;I like this language server a lot, but if there&#x27;s other challengers in future, expect me to
make a post about them too.&lt;&#x2F;p&gt;
&lt;p&gt;Until next time!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>KomoDo, my first KDE app</title>
          <pubDate>Thu, 07 Aug 2025 18:38:49 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>apps</category>
            
              <category>komodo</category>
            
              <category>todo.txt</category>
            <link>https://akselmo.dev/posts/komodo-my-first-kde-app/</link>
          <guid>https://akselmo.dev/posts/komodo-my-first-kde-app/</guid>
          <description>&lt;p&gt;During all my time with KDE projects, I&#x27;ve never made an app from scratch.. Except now.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Today my first KDE app ever, &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;utilities&#x2F;komodo&quot;&gt;KomoDo&lt;&#x2F;a&gt;, was released on &lt;a href=&quot;https:&#x2F;&#x2F;flathub.org&#x2F;apps&#x2F;org.kde.komodo&quot;&gt;Flathub&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;komodo.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;komodo.png&quot; alt=&quot;Screenshot of the KomoDo todo.txt application&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a simple todo application for &lt;a href=&quot;http:&#x2F;&#x2F;todotxt.org&#x2F;&quot;&gt;todo.txt format&lt;&#x2F;a&gt; and parses todo.txt
files into a list of cards. One task is one card.&lt;&#x2F;p&gt;
&lt;p&gt;The application has help sections for any of the rules todo.txt format follows, but you can
use as many or as little of them as you want.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to go through in this blogpost about the process, or what I remember of it anyway.
I&#x27;ve always just fixed bugs in Plasma or Frameworks or even in apps like Dolphin, but never made anything from scratch.
So I thought that writing this down might be helpful for someone in similar position.&lt;&#x2F;p&gt;
&lt;p&gt;As with any KDE project, it&#x27;s open source and the repository can be explored right here: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;utilities&#x2F;komodo&quot;&gt;utilities&#x2F;komodo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;starting-up&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#starting-up&quot; aria-label=&quot;Anchor link for: starting-up&quot;&gt;Starting up&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Starting a Qt project using KDE libraries, especially QtQuick, is not that difficult in the end.
KDE has really good documentation for starting up.
I mostly followed this guide to get started: &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;kirigami&#x2F;setup-cpp&#x2F;&quot;&gt;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;kirigami&#x2F;setup-cpp&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There is also guides for &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;kirigami&#x2F;setup-python&#x2F;&quot;&gt;Python&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;kirigami&#x2F;setup-rust&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt; if you wish to use those instead of C++.&lt;&#x2F;p&gt;
&lt;p&gt;I also highly recommend using &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;kirigami&#x2F;setup-cpp&#x2F;#kde-builder&quot;&gt;kde-builder&lt;&#x2F;a&gt; for building
and running the applications. It makes things so much easier.&lt;&#x2F;p&gt;
&lt;p&gt;Other than that, there&#x27;s not much to tell about the setup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-project-itself&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-project-itself&quot; aria-label=&quot;Anchor link for: the-project-itself&quot;&gt;The project itself&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Working on the application was not that bad either. I&#x27;ve worked on various C++ and QML files
during my work on KDE software, so I had easy time getting into the flow.&lt;&#x2F;p&gt;
&lt;p&gt;I think the most difficult part for me was the CMake files: I couldn&#x27;t really understand them or
what they do, I mostly followed what other projects did and replicated them.&lt;&#x2F;p&gt;
&lt;p&gt;This of course caused me to do unnecessary things, like installing libraries I made for the app:
TodoModel which the QML code uses to parse the todo.txt file and generate the view was accidentally installed
among the system libraries, which was not ideal, since I&#x27;m not building a framework.&lt;&#x2F;p&gt;
&lt;p&gt;Luckily with tons of help and reviews from my friends in the KDE fam, we got CMake to build things nicely.
Then with kde-builder the feedback loop of code-&amp;gt;build-&amp;gt;test was fast enough, especially in small app like this,
that I could iterate on the application in a good pace.&lt;&#x2F;p&gt;
&lt;p&gt;I also had a lot of help from a friend with the CI and sysadmin stuff. That side of development is
very confusing to me so I&#x27;m glad with the help. I dunno if you want to be named so I didn&#x27;t, but you know
who you are: Big thanks. :)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;todomodel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#todomodel&quot; aria-label=&quot;Anchor link for: todomodel&quot;&gt;TodoModel&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Since Qt is reliant on the model-view system, I had to make a &quot;model&quot; that parses
the todo.txt file and spits out Todo objects, which can then be parsed
by the QML code, which is the frontend code.&lt;&#x2F;p&gt;
&lt;p&gt;If you have never worked on model-view systems, it can take some time to understand.
To me, the model-view as words was always a bit confusing: I would have understood it better
if it was worded something like data-ui. But tech jargon has always been my weakest point.&lt;&#x2F;p&gt;
&lt;p&gt;The parsing is done by a RegExp nightmare I concocted with help of stack-overflow and tears.&lt;&#x2F;p&gt;
&lt;p&gt;Here it is, in its nightmarish glory, enjoy the nightmare fuel:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;QStringLiteral(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;(?:^[ &amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;t]*(?P&amp;lt;Completion&amp;gt;x))|(?P&amp;lt;Priority&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;([A-Z]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;))|(?:(?P&amp;lt;FirstDate&amp;gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d{4}-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d)[ &amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;t]*(?P&amp;lt;SecondDate&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d{4}-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d)?)|(?P&amp;lt;Projects&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;B&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;+[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;w&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;S]+)|(?P&amp;lt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Contexts&amp;gt;(?&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;s)@[^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;s]+)|(?P&amp;lt;KeyValuePairs&amp;gt;[a-zA-Z]+:[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;S]*)&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yyyeah. It&#x27;s.. Something.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;testing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#testing&quot; aria-label=&quot;Anchor link for: testing&quot;&gt;Testing&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Due to the nightmare fuel that RegExp can be, I decided that unit testing would be great addition.
So I fought with CMake a bit and then made myself a proper parser testing file.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully Qt has nice QTest library that can be used to create tests.
They can be hard to parse at first, but when you understand how they work, they&#x27;re really
quick and easy to work with.&lt;&#x2F;p&gt;
&lt;p&gt;Testing saved my rear a few times during this project, especially when modifying anything parser related.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;look-and-feel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#look-and-feel&quot; aria-label=&quot;Anchor link for: look-and-feel&quot;&gt;Look and feel&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;When the model worked fine, I started concentrating more on the look and feel of the app.&lt;&#x2F;p&gt;
&lt;p&gt;The application went through various phases: At first, everything was done through a dialog, except
viewing the cards. It was kind of distracting that every time you wanted to modify or make new task,
the application would pop things up.&lt;&#x2F;p&gt;
&lt;p&gt;Over time though, I think I got it into a good spot: Most actions can be done in the task list, but when
user wants to delete a task, the app asks the user first if they are sure about it.&lt;&#x2F;p&gt;
&lt;p&gt;Then there is help menu and quick info for syntax related things.&lt;&#x2F;p&gt;
&lt;p&gt;Otherwise there&#x27;s really no settings: I did not want to add any settings if I could avoid it.
The only setting the app saves to config file is the file you opened last time.&lt;&#x2F;p&gt;
&lt;p&gt;I also consulted the &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;hig&#x2F;&quot;&gt;KDE Human Interface Guidelines&lt;&#x2F;a&gt; (HIG) few times, but
it was never &quot;in the way.&quot; It just helped me to make decisions sometimes when I wasn&#x27;t sure what to do with
the design.&lt;&#x2F;p&gt;
&lt;p&gt;Also my lovely wife &lt;a href=&quot;https:&#x2F;&#x2F;scalie.zone&#x2F;@tecsiederp&#x2F;&quot;&gt;@tecsiederp&lt;&#x2F;a&gt; made the application the most adorable icon ever.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;komodo-big-icon.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;komodo-big-icon.png&quot; alt=&quot;Cute green lizard holding a todo sign&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Look at it. Just a lil guy.&lt;&#x2F;p&gt;
&lt;p&gt;Also, if you don&#x27;t get your tasks done, he will get sad. So you better do those tasks!&lt;&#x2F;p&gt;
&lt;p&gt;It just makes me so happy and motivated to work on my tasks when I see this lil guy in my taskbar. :D&lt;&#x2F;p&gt;
&lt;p&gt;The icons however have to follow our guidelines, also mentioned in the &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;hig&#x2F;icons&#x2F;colorful&#x2F;&quot;&gt;HIG&lt;&#x2F;a&gt;.
Luckily my wife is good with SVG files, and if she wasn&#x27;t I already had two people wanting to help me with it, which
I very much appreciated. If I had to make an icon myself, it would.. Not be good. :P&lt;&#x2F;p&gt;
&lt;p&gt;Something I mostly struggled with though was getting a nice syntax highlighting for the task text.
I wanted to use our KSyntaxHighlighting library, but it would not match all colorschemes: Users
may use their own or third party colorscheme for the app, but the syntax highlighter does not have a colorscheme
that matches it.. So it would look bit odd.&lt;&#x2F;p&gt;
&lt;p&gt;So I made my own simple one that appends some color tags to the string, and the QML engine does the rest.
The text can have HTML tags like &lt;code&gt;&amp;lt;span&amp;gt;&lt;&#x2F;code&gt; in it which QML can parse automagically.&lt;&#x2F;p&gt;
&lt;p&gt;I think the app turned out to look pretty good. It also supports keyboard navigation
for getting around the app. (Though there might be some bugs with it still.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;releasing-the-app&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#releasing-the-app&quot; aria-label=&quot;Anchor link for: releasing-the-app&quot;&gt;Releasing the app&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;KDE has documentation for the release process, so I just followed it to the letter.
During the release process, I have to wait for at least 2 weeks for people to give me reviews,
and so they did. And then I fixed things. And some more.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually the app was good to go (though it was never directly told me, it was just implicitly agreed),
and I followed the last bits of relese process, setting up signing keys and such.&lt;&#x2F;p&gt;
&lt;p&gt;And now it exists as a tarball here, so any interested distros can go grab it: &lt;a href=&quot;https:&#x2F;&#x2F;download.kde.org&#x2F;stable&#x2F;komodo&#x2F;1.0.0&#x2F;&quot;&gt;https:&#x2F;&#x2F;download.kde.org&#x2F;stable&#x2F;komodo&#x2F;1.0.0&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I also recommend this patch to go with it, to make sure it doesn&#x27;t install the static libraries in the system:
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;utilities&#x2F;komodo&#x2F;-&#x2F;commit&#x2F;57c6fa82719155bd32cb35b4c64cddae956c53e0&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;utilities&#x2F;komodo&#x2F;-&#x2F;commit&#x2F;57c6fa82719155bd32cb35b4c64cddae956c53e0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;With Flathub, the submission process was rather painless in my opinion. I followed their
&lt;a href=&quot;https:&#x2F;&#x2F;docs.flathub.org&#x2F;docs&#x2F;for-app-authors&#x2F;submission&quot;&gt;requirements and submission documentation&lt;&#x2F;a&gt; and it all just
clicked together. Eventually someone was reviewing my PR and then.. The app is in Flathub.
I had to make a patch for Flathub specifically, but it was also really painless so I didn&#x27;t mind.&lt;&#x2F;p&gt;
&lt;p&gt;What it all mostly took from me is time. Otherwise it was just nice and easy.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;more-apps&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#more-apps&quot; aria-label=&quot;Anchor link for: more-apps&quot;&gt;More apps?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So at least in my experience, the whole process was rather easy. I didn&#x27;t want to go into
nitty gritty details too much.. Because I don&#x27;t remember everything + you can see the source code + the process itself
happens in the open.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m definitely interested in making more KDE apps, but also I have my game project(s).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;And I really want to get back into gamedev. Like spend much more time into it.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At least now I have a todo app which fits my needs to keep track of the gamedev projects. :)&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading! And if you&#x27;re looking for new todo application, give KomoDo a try! :)&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My changes to saving Konsole tab layouts</title>
          <pubDate>Sun, 18 May 2025 14:47:10 +0000</pubDate>
          <author>Akseli</author>
              <category>konsole</category>
            
              <category>kde</category>
            
              <category>terminal</category>
            <link>https://akselmo.dev/posts/konsole-layout-changes/</link>
          <guid>https://akselmo.dev/posts/konsole-layout-changes/</guid>
          <description>&lt;p&gt;I recently made a patch to &lt;a href=&quot;https:&#x2F;&#x2F;konsole.kde.org&#x2F;&quot;&gt;Konsole&lt;&#x2F;a&gt; terminal emulator, that&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
adds to the current tab layout saving system couple more things:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Working directory&lt;&#x2F;li&gt;
&lt;li&gt;Size of splits&lt;&#x2F;li&gt;
&lt;li&gt;Optional command to run&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;You can find the patch here: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;utilities&#x2F;konsole&#x2F;-&#x2F;merge_requests&#x2F;1095&quot;&gt;ViewManager: Save columns, lines and working directory to tabLayout (!1095)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a feature I&#x27;ve seen in other terminal editors, so I wanted to add it to Konsole as well.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Note that this is not in current version of Konsole, but it will be in the next one: 25.07&lt;&#x2F;strong&gt;.
Unless it gets backported, of course.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-tab-layouts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-tab-layouts&quot; aria-label=&quot;Anchor link for: current-tab-layouts&quot;&gt;Current tab layouts&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In Konsole, you can even in current version save your tab layout:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Open Konsole&lt;&#x2F;li&gt;
&lt;li&gt;Split the current view into multiple ones&lt;&#x2F;li&gt;
&lt;li&gt;Go to Menu -&amp;gt; View -&amp;gt; Save tab layout...&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This produces a JSON file like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Orientation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Vertical&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Widgets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;        },
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, as it is currently, it&#x27;s not that useful. The split sizes won&#x27;t be saved,
for example.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-changes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-changes&quot; aria-label=&quot;Anchor link for: my-changes&quot;&gt;My changes&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;My changes now allow you to save the size of the splits and the working directories, like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Orientation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Horizontal&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Widgets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;88&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;33&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;WorkingDirectory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&#x2F;home&#x2F;akseli&#x2F;Repositories&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;        },
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Orientation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Vertical&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Widgets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;                {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;33&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;21&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;WorkingDirectory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&#x2F;home&#x2F;akseli&#x2F;Documents&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;                },
&lt;&#x2F;span&gt;&lt;span&gt;                {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;33&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;WorkingDirectory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&#x2F;home&#x2F;akseli&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;            ]
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see, it saves the Columns, Lines, WorkingDirectory. It also adds empty Command
item, which you can write any command in, like &lt;code&gt;ls -la&lt;&#x2F;code&gt;, or keep it empty.&lt;&#x2F;p&gt;
&lt;p&gt;You can try to use the columns and lines sections to modify the size manually,
but I&#x27;ve noticed it&#x27;s easier just to do it inside Konsole.&lt;&#x2F;p&gt;
&lt;p&gt;Now the old layout file will work too, if the field doesn&#x27;t exist
Konsole won&#x27;t do anything about it.&lt;&#x2F;p&gt;
&lt;p&gt;Note about the command: Konsole basically pretends to type that command in when it loads, so
the commands don&#x27;t need a separate Parameter field or anything like that. You could make the command
something like &lt;code&gt;foo &amp;amp;&amp;amp; bar -t example &amp;amp;&amp;amp; baz --parameter&lt;&#x2F;code&gt;. Konsole then just types
that in and presses enter for you. :)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;more-concrete-example&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#more-concrete-example&quot; aria-label=&quot;Anchor link for: more-concrete-example&quot;&gt;More concrete example&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I made this change because I wanted to run Konsole in following layout:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Orientation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Horizontal&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Widgets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Orientation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Vertical&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Widgets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;                {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;139&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;hx .&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;                },
&lt;&#x2F;span&gt;&lt;span&gt;                {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;139&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;14&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;            ]
&lt;&#x2F;span&gt;&lt;span&gt;        },
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Columns&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;lazygit&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;Lines&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;66&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;SessionRestoreId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With these items I can get the layout splits as I want, with any commands I want.&lt;&#x2F;p&gt;
&lt;p&gt;Then I have a bash script to run this layout in the directory the script is run at:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash
&lt;&#x2F;span&gt;&lt;span&gt;konsole&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt; --separate --hold --workdir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt; --layout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&#x2F;Documents&#x2F;helix-editor.json&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;&amp;amp;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now when I go to any project folder and run this script, it will open the &lt;a href=&quot;https:&#x2F;&#x2F;helix-editor.com&#x2F;&quot;&gt;Helix&lt;&#x2F;a&gt; text editor,
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jesseduffield&#x2F;lazygit&quot;&gt;lazygit&lt;&#x2F;a&gt; and empty split the way I want it, without
having to make these splits manually every time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;konsole&#x2F;splits.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;konsole&#x2F;splits.png&quot; alt=&quot;Preview of Konsole and splits of editor and git&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Sure I could use something like &lt;a href=&quot;https:&#x2F;&#x2F;zellij.dev&#x2F;&quot;&gt;Zellij&lt;&#x2F;a&gt; for this but they have so much things
I don&#x27;t need, I just wanted to split the view and save&#x2F;load that arrangement.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;in-future&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#in-future&quot; aria-label=&quot;Anchor link for: in-future&quot;&gt;In future&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I would like to add a small GUI tool inside Konsole that allows you to customize
these layout easily during save process, such as changing the WorkingDirectory and
Command parameters.&lt;&#x2F;p&gt;
&lt;p&gt;But for now, you&#x27;ll have to do it inside the JSON file, but chances are
when you want to do layouts like this, you&#x27;re comfortable editing these kind
of files anyway.&lt;&#x2F;p&gt;
&lt;p&gt;I hope some others will find this useful as well, for things
like system monitoring etc.&lt;&#x2F;p&gt;
&lt;p&gt;Hope you like it!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Kate and Python language server</title>
          <pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>kate</category>
            
              <category>python</category>
            
              <category>lsp</category>
            
              <category>language-server</category>
            <link>https://akselmo.dev/posts/kate-python-lsp/</link>
          <guid>https://akselmo.dev/posts/kate-python-lsp/</guid>
          <description>&lt;p&gt;As much as I love Kate editor, as I mentioned in my &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;how-i-use-kate-editor&#x2F;&quot;&gt;previous post&lt;&#x2F;a&gt;, setting up Python language server&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
has always been a bit fiddly if you want it to work with
virtual environments.&lt;&#x2F;p&gt;
&lt;p&gt;However thanks to Kate documentation and some Big Think:tm:, I managed to
figure it out, and now I wish to share it.&lt;&#x2F;p&gt;
&lt;p&gt;I could just show the code and that&#x27;s it, but I wanted to write
this so that someone new-ish has easier time to understanding
what to do.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;language-server-python-lsp-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#language-server-python-lsp-server&quot; aria-label=&quot;Anchor link for: language-server-python-lsp-server&quot;&gt;Language server: python-lsp-server&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The language server I am talking about in this instance is the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;python-lsp&#x2F;python-lsp-server&#x2F;#configuration&quot;&gt;python-lsp-server&lt;&#x2F;a&gt;.
VSCode uses something called &lt;a href=&quot;https:&#x2F;&#x2F;marketplace.visualstudio.com&#x2F;items?itemName=ms-python.vscode-pylance&quot;&gt;Pylance&lt;&#x2F;a&gt;, but that&#x27;s proprietary and probably can&#x27;t
ever be made to work with any other editors.
One thing I do miss from Pylance is the easy way to make it work with virtual environments.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Also silly side tangent, I kinda find it weird people call them &quot;LSP&quot; and not &quot;LS&quot; or &quot;language server.&quot;&lt;&#x2F;em&gt;
&lt;em&gt;LSP means Language Server Protocol, which is how the language server talks to your editor..&lt;&#x2F;em&gt;
&lt;em&gt;I mean I know it doesn&#x27;t matter but it&#x27;s a silly pet-peeve.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;python-language-server-plugins&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#python-language-server-plugins&quot; aria-label=&quot;Anchor link for: python-language-server-plugins&quot;&gt;Python language server plugins&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I also want to utilize &lt;a href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;ruff&#x2F;&quot;&gt;ruff&lt;&#x2F;a&gt; which is a nice linter
and formatter for Python. To use it with the language server,
you need to use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;python-lsp&#x2F;python-lsp-ruff&quot;&gt;python-lsp-ruff&lt;&#x2F;a&gt;.
This makes the language server use ruff instead of it&#x27;s own built-in things.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;configurations-for-virtual-environments&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configurations-for-virtual-environments&quot; aria-label=&quot;Anchor link for: configurations-for-virtual-environments&quot;&gt;Configurations for virtual environments&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kate docs actually mention this part. Search the &lt;a href=&quot;https:&#x2F;&#x2F;docs.kde.org&#x2F;stable5&#x2F;en&#x2F;kate&#x2F;kate&#x2F;kate-application-plugin-lspclient.html&quot;&gt;documentation&lt;&#x2F;a&gt; for &lt;code&gt;pylsp_in_env&lt;&#x2F;code&gt;.
It&#x27;s a bash script which we will be making, but with a tiny twist.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bash-script&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bash-script&quot; aria-label=&quot;Anchor link for: bash-script&quot;&gt;Bash script&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We need to create a bash script called &lt;code&gt;pylsp_in_env&lt;&#x2F;code&gt; (or whatever you desire) which Kate will use to figure out the virtual environment before
running the language server.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s rather simple script:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;cd &lt;&#x2F;span&gt;&lt;span&gt;$path
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;-d &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;${&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;}&#x2F;.venv&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;source &lt;&#x2F;span&gt;&lt;span&gt;$1&#x2F;.venv&#x2F;bin&#x2F;activate
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;-d &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;${&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;}&#x2F;venv&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;source &lt;&#x2F;span&gt;&lt;span&gt;$1&#x2F;venv&#x2F;bin&#x2F;activate
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span&gt; pylsp --check-parent-process
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What we do here, instead of the documented example, is to check
where the &lt;code&gt;activate&lt;&#x2F;code&gt; script actually is.
Some people prefer having it &lt;code&gt;.venv&lt;&#x2F;code&gt; and some &lt;code&gt;venv&lt;&#x2F;code&gt; and there&#x27;s other names too I&#x27;m sure.&lt;&#x2F;p&gt;
&lt;p&gt;So we get the path from the command, then source the virtual environment
in right folder, and then execute the &lt;code&gt;pylsp --check-parent-process&lt;&#x2F;code&gt;
as Kate would do by default.&lt;&#x2F;p&gt;
&lt;p&gt;Save this this to your &lt;code&gt;$PATH&lt;&#x2F;code&gt; somewhere so that Kate can see it, or alternatively
add the path to your Kate settings. This PATH setting is in &lt;code&gt;Kate 25.04.0&lt;&#x2F;code&gt; at least.
Don&#x27;t forget to &lt;code&gt;chmod +x .&#x2F;pylsp_in_env&lt;&#x2F;code&gt; so that it has the execution permissions&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kate-lsp-config&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kate-lsp-config&quot; aria-label=&quot;Anchor link for: kate-lsp-config&quot;&gt;Kate LSP config&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Finally, just add this to your Kate LSP config file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;servers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;python&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;pylsp_in_env&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;%{Project:NativePath}&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;            ],
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;root&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;url&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;github.com&#x2F;python-lsp&#x2F;python-lsp-server&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;highlightingModeRegex&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;^Python$&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;settings&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;pylsp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;plugins&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;ruff&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;enabled&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span&gt;                        }
&lt;&#x2F;span&gt;&lt;span&gt;                    }
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;            }
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Of course, if you have more language servers in your config, make sure
to add the above part next to them.&lt;&#x2F;p&gt;
&lt;p&gt;If you don&#x27;t want to use ruff, you can remove the whole &lt;code&gt;settings&lt;&#x2F;code&gt; bit.&lt;&#x2F;p&gt;
&lt;p&gt;What I wanted to note here is that Kate now gives the full path to the python project
using the &lt;code&gt;%{Project:NativePath}&lt;&#x2F;code&gt; argument. There&#x27;s more of these &lt;code&gt;%{}&lt;&#x2F;code&gt; items in Kate, which can be found by scouring the documentation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;done&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#done&quot; aria-label=&quot;Anchor link for: done&quot;&gt;Done!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;That&#x27;s pretty much it. Now restart the language servers from Kate menus, or restart Kate, and Kate is now aware of any of the virtual environments running inside your Python project.&lt;&#x2F;p&gt;
&lt;p&gt;Do note that I have no idea how &lt;code&gt;poetry&lt;&#x2F;code&gt; etc. do this. I think they may need some kind of different script. If I ever need to figure that out, I will extend this post or make new one.&lt;&#x2F;p&gt;
&lt;p&gt;If you read the Kate docs, you may have already understood what to do and done so. I however wanted to share my solution for this, which differs very slightly from the one in the documentation.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading, I hope this helps!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How I use Kate Editor</title>
          <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>kate</category>
            
              <category>editors</category>
            
              <category>programming</category>
            <link>https://akselmo.dev/posts/how-i-use-kate-editor/</link>
          <guid>https://akselmo.dev/posts/how-i-use-kate-editor/</guid>
          <description>&lt;p&gt;I love the &lt;a href=&quot;https:&#x2F;&#x2F;kate-editor.org&#x2F;&quot;&gt;Kate Text editor&lt;&#x2F;a&gt;. I use it for pretty much all the programming projects I do.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt; Kate has been around for long time now, about 20 years! At least earliest blog post for it I could find was &lt;a href=&quot;https:&#x2F;&#x2F;kate-editor.org&#x2F;2004&#x2F;01&#x2F;06&#x2F;writing-a-kate-plugin&#x2F;&quot;&gt;written in 2004.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to go over my workflow with it, why I like it so much and hopefully get more people to try it out.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;kate-view.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;kate-view.png&quot; alt=&quot;My Kate setup&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-i-set-up-my-editor&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-i-set-up-my-editor&quot; aria-label=&quot;Anchor link for: how-i-set-up-my-editor&quot;&gt;How I set up my editor&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Here&#x27;s some settings I find important for my workflow. There&#x27;s tons more
settings to fiddle with, but most of the defaults suffice for me very well.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;plugins-i-use&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#plugins-i-use&quot; aria-label=&quot;Anchor link for: plugins-i-use&quot;&gt;Plugins I use&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Here&#x27;s a list of the plugins I have enabled. Some of them are self-explanatory, some I will go more in detail later.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Build &amp;amp; Run&lt;&#x2F;li&gt;
&lt;li&gt;Color Picker&lt;&#x2F;li&gt;
&lt;li&gt;Colored Brackets&lt;&#x2F;li&gt;
&lt;li&gt;Document Preview&lt;&#x2F;li&gt;
&lt;li&gt;Docment Switcher&lt;&#x2F;li&gt;
&lt;li&gt;External Tools&lt;&#x2F;li&gt;
&lt;li&gt;Formatting&lt;&#x2F;li&gt;
&lt;li&gt;Git Blame&lt;&#x2F;li&gt;
&lt;li&gt;Kate Debugger&lt;&#x2F;li&gt;
&lt;li&gt;LSP Client&lt;&#x2F;li&gt;
&lt;li&gt;Open Link&lt;&#x2F;li&gt;
&lt;li&gt;Project Plugin&lt;&#x2F;li&gt;
&lt;li&gt;Search &amp;amp; Replace&lt;&#x2F;li&gt;
&lt;li&gt;Snippets&lt;&#x2F;li&gt;
&lt;li&gt;Terminal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;move-and-split-views&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#move-and-split-views&quot; aria-label=&quot;Anchor link for: move-and-split-views&quot;&gt;Move and split views&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In Kate, most views are in their own little tabs. You can right click these tabs and select &quot;Own section&quot; which splits them into their own areas. In the screenshot I provided at start, you can see my Projects and Git view being split like this, so they can both be open at the same time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;split-context-menu.png&quot; alt=&quot;Context menu for splitting panels&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Do note that these are saved per session, so sessions can have different splits.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;language-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#language-server&quot; aria-label=&quot;Anchor link for: language-server&quot;&gt;Language server&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In LSP Client settings, you can toggle multiple things I won&#x27;t go into detail in here.
What I do want to mention is the User Server Settings file, which can be edited from this menu.
To override some defaults, you can just copy the default setting from the default tab, put it in your own settings tab and then just change the values.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s my LSP settings: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;kate&#x2F;lspclient&#x2F;settings.json&quot;&gt;dotfiles&#x2F;kate&#x2F;lspclient&#x2F;settings.json&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;debug-adapters&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#debug-adapters&quot; aria-label=&quot;Anchor link for: debug-adapters&quot;&gt;Debug adapters&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Debugger settings work similarly to LSP setting, however you may have to restart Kate to recognize any new changes.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s my DAP settings: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;kate&#x2F;debugger&#x2F;dap.json&quot;&gt;dotfiles&#x2F;kate&#x2F;debugger&#x2F;dap.json&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;formatters&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#formatters&quot; aria-label=&quot;Anchor link for: formatters&quot;&gt;Formatters&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For code formatting, there&#x27;s also it&#x27;s own setting menu, however as of writing this &lt;em&gt;only the languages mentioned in default settings&lt;&#x2F;em&gt; are supported.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to tell formatter to stop autoformatting, you can set it like this, using clang-formatter as example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;clang-format&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;clang-format&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    ],
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;formatModifiedLinesOnly&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;formatOnSave&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here&#x27;s my formatting settings: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;kate&#x2F;formatting&#x2F;settings.json&quot;&gt;dotfiles&#x2F;kate&#x2F;formatting&#x2F;settings.json&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shortcuts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#shortcuts&quot; aria-label=&quot;Anchor link for: shortcuts&quot;&gt;Shortcuts&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Shortcuts are very personal thing and I encourage learning the defaults if at all possible. I have changed mine around a bit, for example &lt;code&gt;Ctrl+Shift+Space&lt;&#x2F;code&gt; for Quick Open and &lt;code&gt;Ctrl+Space&lt;&#x2F;code&gt; for Find action. More of these two later!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;path-setting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#path-setting&quot; aria-label=&quot;Anchor link for: path-setting&quot;&gt;Path setting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Kate can&#x27;t always find language servers for example, if it can&#x27;t resolve your path.
Use this path setting to load binaries from paths like &lt;code&gt;~&#x2F;.local&#x2F;bin&lt;&#x2F;code&gt;. You can find this under Behavior settings at least on Kate 25.04.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sessions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sessions&quot; aria-label=&quot;Anchor link for: sessions&quot;&gt;Sessions&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Sessions are basically group of projects. Do not treat sessions as projects themselves, that will only cause sadness.&lt;&#x2F;p&gt;
&lt;p&gt;I have separated my Work and Personal projects in their own sessions. This means that during work day, I can right click the Kate icon, select Work session, and then Kate will always open for me in that session until I choose Personal session.&lt;&#x2F;p&gt;
&lt;p&gt;In session settings I have set Kate to always open the last used session because of this.&lt;&#x2F;p&gt;
&lt;p&gt;I highly recommend this way of working. You could also have sessions for differently themed projects: Gamedev, web, etc..&lt;&#x2F;p&gt;
&lt;p&gt;Just make sure to create at least one session when starting out, then you can use that as a template for the other sessions in Kate session manager.&lt;&#x2F;p&gt;
&lt;p&gt;When I used to write more notes with Kate, I had it&#x27;s own Notes session with both my Notes folder as a project folder and my blog.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;colorschemes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#colorschemes&quot; aria-label=&quot;Anchor link for: colorschemes&quot;&gt;Colorschemes&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kate uses &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kcolorscheme&quot;&gt;KColorScheme&lt;&#x2F;a&gt; library for it&#x27;s colorscheme needs. You can very easily to copy a ready colorscheme and then start modifying your own changes on top of it.&lt;&#x2F;p&gt;
&lt;p&gt;You can also create a completely new colorscheme if you wish, like I have done here: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;Revontuli&#x2F;src&#x2F;branch&#x2F;main&#x2F;Kate&quot;&gt;Revontuli&#x2F;Kate&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The colorscheme files in the library are their own XML format which is not ideal IMO but it gets the job done.
It would be awesome if Kate supported &lt;a href=&quot;https:&#x2F;&#x2F;tree-sitter.github.io&#x2F;tree-sitter&#x2F;&quot;&gt;tree-sitter&lt;&#x2F;a&gt; but so far I haven&#x27;t heard anyone trying to implement that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;file-quick-switching&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#file-quick-switching&quot; aria-label=&quot;Anchor link for: file-quick-switching&quot;&gt;File quick switching&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I mentioned this earlier in shortcuts section. If you&#x27;re like me and have multiple projects open, you can use the Quick switcher and start typing the filename you need to open.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;quickswitch.png&quot; alt=&quot;Quickswitcher being used&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you just want to open a specific project, you can type &lt;code&gt;project bla&lt;&#x2F;code&gt; and it will find that project for you from your project list.&lt;&#x2F;p&gt;
&lt;p&gt;This is why I have it bound to &lt;code&gt;Ctrl+Shift+Space&lt;&#x2F;code&gt;, so I can just press it and quickly find the file I need.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;action-search&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#action-search&quot; aria-label=&quot;Anchor link for: action-search&quot;&gt;Action search&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is more interesting: Instead of searching for files, you can search for any action Kate has.&lt;&#x2F;p&gt;
&lt;p&gt;For example, if you want to look for terminal related actions, you can type &quot;Terminal&quot; and it lists everything plus any potential shortcuts.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;actionsearch.png&quot; alt=&quot;Action search being used&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact, you can use this in other KDE apps too, like Dolphin or Konsole!&lt;&#x2F;strong&gt; The default key combination for it is &lt;code&gt;ctrl+alt+i&lt;&#x2F;code&gt; but I use it so frequently I set it to &lt;code&gt;ctrl+space&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;build-and-run&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-and-run&quot; aria-label=&quot;Anchor link for: build-and-run&quot;&gt;Build and Run&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The name of this plugin is a bit misleading IMO because it can do so much more than just build.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;build-and-run.png&quot; alt=&quot;Build and run view&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In essence, it&#x27;s a command runner. You can give the command a name, then build command and run command.&lt;&#x2F;p&gt;
&lt;p&gt;For example in the above image, my game project has only one command called &lt;code&gt;build&lt;&#x2F;code&gt; which has build command &lt;code&gt;odin build .&#x2F;src -collection:src=src -debug -out:.&#x2F;build&#x2F;ArtificialRage&lt;&#x2F;code&gt; and run command &lt;code&gt;odin run .&#x2F;src -collection:src=src -debug -out:.&#x2F;build&#x2F;ArtificialRage&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I can then just use the action search to build and run my game project.&lt;&#x2F;p&gt;
&lt;p&gt;For your projects, you can then add file called &lt;code&gt;.kateproject.build&lt;&#x2F;code&gt; in your project root folder, so Kate will pick that up. They&#x27;re just JSON files that look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;target_sets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;cmake_config&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;directory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;&#x2F;home&#x2F;akseli&#x2F;Repositories&#x2F;artificial-rage&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;loaded_via_cmake&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;artificial-rage&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;targets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [
&lt;&#x2F;span&gt;&lt;span&gt;                {
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;build_cmd&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;odin build .&#x2F;src -collection:src=src -debug -out:.&#x2F;build&#x2F;ArtificialRage&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;build&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;run_cmd&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;odin run .&#x2F;src -collection:src=src -debug -out:.&#x2F;build&#x2F;ArtificialRage&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;            ]
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    ]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;.kateproject&lt;&#x2F;code&gt; files can store much more information about the project, but they are not very user facing yet sadly. Something on my eternal to-do list.&lt;&#x2F;p&gt;
&lt;p&gt;Also when running the commands, there&#x27;s &quot;Output&quot; tab that shows the results. It&#x27;s basically view to your terminal, but if you encounter an error or warning, and the output panel can parse the file and location from it,
you can click that item and it will open code at that position where the error&#x2F;warning appeared.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;language-server-1&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#language-server-1&quot; aria-label=&quot;Anchor link for: language-server-1&quot;&gt;Language server&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;As I mentioned above in the settings, Kate does have support for &lt;a href=&quot;https:&#x2F;&#x2F;microsoft.github.io&#x2F;language-server-protocol&#x2F;&quot;&gt;Language Server Protocol&lt;&#x2F;a&gt;, as long as they&#x27;re found from the path Kate looks for them and are configured properly. It&#x27;s very much the same support one would expect in any modern editor.&lt;&#x2F;p&gt;
&lt;p&gt;One thing I do use a bunch thanks to it is looking for references to specific symbol, searching symbols across all my open projects and symbol overview.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;debugger&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#debugger&quot; aria-label=&quot;Anchor link for: debugger&quot;&gt;Debugger&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kate has support for &lt;a href=&quot;https:&#x2F;&#x2F;microsoft.github.io&#x2F;debug-adapter-protocol&#x2F;&quot;&gt;Debug Adapter Protocol&lt;&#x2F;a&gt;, which is the lesser known cousin of Language Server Protocol.&lt;&#x2F;p&gt;
&lt;p&gt;This allows you to debug applications visually with breakpoints, check the stacktrace by using &lt;code&gt;Locals and stack&lt;&#x2F;code&gt; panel, and so on.&lt;&#x2F;p&gt;
&lt;p&gt;As long as the configuration is correct, debug adapter is found in path, and the executable, working directory, etc are given to Kate correctly, it can debug things rather well. The debugger plugin has undergone bunch of polish lately so it&#x27;s rather good for my use, especially with my game projects.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;debug.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;debug.png&quot; alt=&quot;Debugging my game&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For bigger things like debugging whole Plasma desktop, I still use gdb in terminal.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;terminal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#terminal&quot; aria-label=&quot;Anchor link for: terminal&quot;&gt;Terminal&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Speaking of terminal, the terminal is just Konsole running inside it&#x27;s own view. The terminal can be made to follow the folder of the file you&#x27;re editing, and it will share the settings with Konsole.
You can also split the terminal from Kate if you need more views. Terminal tabs also work.&lt;&#x2F;p&gt;
&lt;p&gt;So it&#x27;s essentially just Konsole embedded in Kate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;git-integration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-integration&quot; aria-label=&quot;Anchor link for: git-integration&quot;&gt;Git integration&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The git integration in Kate is simple-but-works. You can diff, stage and discard lines&#x2F;hunks directly from the editor (I use this a lot).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;git-diff.png&quot; alt=&quot;Git diffing&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then of course, you can stage and unstage, commit, push, pull etc. directly from Kate.
As of writing this, you can&#x27;t rebase yet, but for more complex tasks I tend to often use something like &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jesseduffield&#x2F;lazygit&quot;&gt;lazygit&lt;&#x2F;a&gt;, which I highly recommend.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;git-staging.png&quot; alt=&quot;Git staging&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;All of this has inline git blame, so you can see per line who did what and where. This is very handy in projects with multiple devs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;snippets&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#snippets&quot; aria-label=&quot;Anchor link for: snippets&quot;&gt;Snippets&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kate has a snippet plugin that allows one to create simple or super complex snippets, for example for boilerplate.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kate&#x2F;snippet.png&quot; alt=&quot;Snippets tool&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s example for my blog header snippet (don&#x27;t mind the bad JS I wrote it very tired)&lt;&#x2F;p&gt;
&lt;p&gt;The snippet text, that will be pasted into a markdown file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;+++
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;title = &amp;quot;${title}&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;date = ${justDate()}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;aliases = [&amp;quot;&#x2F;${dateUrl()}&#x2F;${lowerFilename()}.html&amp;quot;]
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;taxonomies&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;tags = [&amp;quot;${tag}&amp;quot;,]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;+++
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;My ugly javascript mess for creating dynamic items:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;fileName&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d970ff;&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;fileName&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;fileUrl&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d970ff;&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;encoding&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d970ff;&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;encoding&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;selection&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;view.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;selectedText&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;year&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return new &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getFullYear&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;upper&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;) { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;x.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;toUpperCase&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;lower&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;) { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;x.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;toLowerCase&lt;&#x2F;span&gt;&lt;span&gt;(); }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;today&lt;&#x2F;span&gt;&lt;span&gt;() { 
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;date &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;formatDate&lt;&#x2F;span&gt;&lt;span&gt;(date);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;num&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;num.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padStart&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;0&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;getDateName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span&gt;){
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;names &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Sun&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Mon&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Tue&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Wed&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Thu&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Fri&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;Sat&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;];
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;names[date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getDay&lt;&#x2F;span&gt;&lt;span&gt;()];
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; 2024-06-13 Thu 10:00
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;formatDate&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;dateString &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=     &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;      date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getFullYear&lt;&#x2F;span&gt;&lt;span&gt;(),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getMonth&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getDate&lt;&#x2F;span&gt;&lt;span&gt;()),
&lt;&#x2F;span&gt;&lt;span&gt;    ].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;-&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;dayName &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;getDateName&lt;&#x2F;span&gt;&lt;span&gt;(date);
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=     &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getHours&lt;&#x2F;span&gt;&lt;span&gt;()),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getMinutes&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;span&gt;    ].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;:&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;timeString &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;dateString &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot; &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;dayName &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot; &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;time;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;timeString;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;justDate&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;date &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;dateString &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=     &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;      date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getFullYear&lt;&#x2F;span&gt;&lt;span&gt;(),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getMonth&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getDate&lt;&#x2F;span&gt;&lt;span&gt;()),
&lt;&#x2F;span&gt;&lt;span&gt;    ].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;-&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;dateString;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;dateUrl&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;date &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;dateString &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=     &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;      date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getFullYear&lt;&#x2F;span&gt;&lt;span&gt;(),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getMonth&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;padTo2Digits&lt;&#x2F;span&gt;&lt;span&gt;(date.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;getDate&lt;&#x2F;span&gt;&lt;span&gt;()),
&lt;&#x2F;span&gt;&lt;span&gt;    ].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#838fff;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;#39;&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;dateString;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;lowerFilename&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;lower&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;fileName&lt;&#x2F;span&gt;&lt;span&gt;());
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So yes, you can write Javascript to generate snippets for you, like here I&#x27;ve done with date and time, filename, etc.. It&#x27;s super useful.&lt;&#x2F;p&gt;
&lt;p&gt;You can then use code-completion shortcut and type &lt;code&gt;snippet-namespace:snippet-name&lt;&#x2F;code&gt; and press enter, and it will run the snippet for you. You can make the snippets only appear for files in specific language.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a very very powerful tool for generating simple boilerplate code. Requires some upfront work but after that&#x27;s done, it works wonders.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s also some of my markdown snippets: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;kate&#x2F;Markdown%20Snippets.xml&quot;&gt;dotfiles&#x2F;kate&#x2F;Markdown Snippets.xml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;but-why-do-i-love-it-so&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#but-why-do-i-love-it-so&quot; aria-label=&quot;Anchor link for: but-why-do-i-love-it-so&quot;&gt;But why do I love it so&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kate has basically all the features I need, out of the box, without having to download random extensions or plugins.
Sometimes I just have to enable plugins, maybe write and change some configurations.. But when that&#x27;s done, it&#x27;s all just there and I can start using it.&lt;&#x2F;p&gt;
&lt;p&gt;I tend to back up my configs to my dotfiles git, so I can just in subsequent installs use them immediately.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hang on, VSCode has all of this and more!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;You&#x27;re right, VSCode has a lot of these things too. However with VSCode I&#x27;ve noticed that you have to sometimes download whole language as an extension.
Then, the extensions may clash with each other, especially if you have two extensions that do different things for the same thing: I remember having two CMake extensions where both had something I needed, but they both also overlap in some basic features, so it got very confusing.&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s probably all skill-issue of course. But I like that I don&#x27;t have to download any extensions or plugins or whatever.. I can just import my settings and start working.&lt;&#x2F;p&gt;
&lt;p&gt;VSCode being electron and Microsoft doesn&#x27;t really help my feelings either, especially since some of their extensions like C# and Python are proprietary, and they&#x27;re working on more extensions to be like that:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mstdn.social&#x2F;@msw&#x2F;114281012370795980&quot;&gt;Matt &quot;msw&quot; Wilson: &quot;The latest proprietary #VSCode  extension that no…&quot; - Mastodon 🐘&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20250420193838&#x2F;https:&#x2F;&#x2F;mstdn.social&#x2F;@msw&#x2F;114281012370795980&quot;&gt;Archive.org link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So yeah, I rather use something like Kate that I know will be around for long time and won&#x27;t turn into proprietary mush, nor try to tell me to use their newest &quot;AI&quot; slop tools.&lt;&#x2F;p&gt;
&lt;p&gt;Kate is very much the embodiment of KDE tagline: Simple by Default, Powerful when Needed. It does all I need and allows me to modify it as I need.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve contributed to Kate bunch of times, and every time it has been nice. The maintainers of Kate are very lovely patient people who deal with my nonsense. :)&lt;&#x2F;p&gt;
&lt;p&gt;And that&#x27;s why I love it so much: The people around it, the out of the box experience, the simplicity yet powerfulness..! ❤️&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;kate-editor.org&#x2F;get-it&#x2F;&quot;&gt;Give Kate a try today!&lt;&#x2F;a&gt; :)&lt;&#x2F;p&gt;
&lt;p&gt;If you have any issues with it, report them on &lt;a href=&quot;https:&#x2F;&#x2F;bugs.kde.org&#x2F;&quot;&gt;bugs.kde.org&lt;&#x2F;a&gt;. You can also send wishlist items there. There is also wishlist of things on &lt;a href=&quot;https:&#x2F;&#x2F;discuss.kde.org&#x2F;t&#x2F;kate-hopes-and-dreams-wishlist&#x2F;582&quot;&gt;KDE Discuss&lt;&#x2F;a&gt;, feel free to chat there about it or ask for help in general.&lt;&#x2F;p&gt;
&lt;p&gt;PS. For the modal text editor lovers, Kate does have Vi mode. I use it from time to time, but I prefer Kate as it is to be honest. For my terminal&#x2F;modal editing needs I use &lt;a href=&quot;https:&#x2F;&#x2F;helix-editor.com&#x2F;&quot;&gt;Helix&lt;&#x2F;a&gt; editor, but most of the time I&#x27;m using Kate.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>KURLNavBar and me</title>
          <pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>foss</category>
            
              <category>refactor</category>
            
              <category>visual</category>
            
              <category>software</category>
            
              <category>desktop</category>
            
              <category>design</category>
            
              <category>ui</category>
            
              <category>kio</category>
            
              <category>ux</category>
            <link>https://akselmo.dev/posts/visual-woes/</link>
          <guid>https://akselmo.dev/posts/visual-woes/</guid>
          <description>&lt;p&gt;I made a change to the &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;merge_requests&#x2F;1793&quot;&gt;KURLNavBar according to old mockup&lt;&#x2F;a&gt;,
since we hoped it would be easier to use.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This was a bad idea and made many people angry, at least on &lt;a href=&quot;https:&#x2F;&#x2F;old.reddit.com&#x2F;r&#x2F;kde&#x2F;comments&#x2F;1jdpafa&#x2F;new_dolphin_location_bar_is_really_bad&#x2F;&quot;&gt;Reddit&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Seems to be a &lt;a href=&quot;https:&#x2F;&#x2F;akselmo.dev&#x2F;posts&#x2F;you-dont-need-to-yell&#x2F;&quot;&gt;recurring theme&lt;&#x2F;a&gt; with my visual changes,
though this time wasn&#x27;t nearly as bad as that was.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, I wanted to go over the process around it. Maybe someone else
than me can learn something from this.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;so-what-happened&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#so-what-happened&quot; aria-label=&quot;Anchor link for: so-what-happened&quot;&gt;So, what happened&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;When implementing this &lt;a href=&quot;https:&#x2F;&#x2F;phabricator.kde.org&#x2F;T12308&quot;&gt;mockup&lt;&#x2F;a&gt;,
I was expecting this was something people had been waiting for. It looked
good to me, and since we&#x27;ve been wanting to freshen up Dolphin a bit,
it felt like a good way to start. (This change wasn&#x27;t to Dolphin, but our
framework, so any apps that would use this navbar would get the changes.)&lt;&#x2F;p&gt;
&lt;p&gt;Another reasoning for changes was that there has been many many instances
where people didn&#x27;t even know this field could be clicked!
They didn&#x27;t know  these items are buttons, for example on touch devices.
That&#x27;s where the background idea came from.
And then make the folders look like clickable items, so people
know that, well, they&#x27;re not there just to look pretty.&lt;&#x2F;p&gt;
&lt;p&gt;The work started well enough, though I spent tons of time refactoring and
trying to understand the old codebase. On top of that, we wanted to make
sure it was as close to perfect as possible.&lt;&#x2F;p&gt;
&lt;p&gt;So I added a background first, which was relatively easy, then started modifying the buttons.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to use chevron &lt;code&gt;&amp;gt;&lt;&#x2F;code&gt; style separators between the folders, but
there was no easy way to create a button with this shape. Sure, we could
do it well for Breeze but any other Qt theme might render it weird and wrong,
and that will just cause people report more bugs. So I settled with regular separators.
It was a compromise, but I admit it was a rather bad one in the end.&lt;&#x2F;p&gt;
&lt;p&gt;I worked so much on this part, trying to figure out a good way to make the new buttons
work, following the mockup as close as possible, and I couldn&#x27;t see the usability issues.
This was because I was so entrenched in the work I couldn&#x27;t practically &quot;see the forest for the trees.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;I had tons of good feedback, from visual designers and the like. I wanted to follow
everyones advice, but had to make compromises at some places.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually I got somewhere where we all just liked it enough to push it out to the world.&lt;&#x2F;p&gt;
&lt;p&gt;And yeah, the whole process took ~1 month. You would think this is a simple change, but &lt;em&gt;it never is that simple.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-feedback&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-feedback&quot; aria-label=&quot;Anchor link for: the-feedback&quot;&gt;The feedback&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I was expecting some pushback, as it always happens with visual changes, but I didn&#x27;t
expect it to be this.. energetic?&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, most of the feedback was &quot;it ugly&quot; which &lt;em&gt;gives me nothing actionable to work on!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Saying &quot;it looks bad&quot; doesn&#x27;t help me work on it. It doesn&#x27;t help me fix anything.
I think that frustrated me the most: I wanted to help to fix the situation, but this kind of feedback
just makes me wonder endlessly how to fix it.&lt;&#x2F;p&gt;
&lt;p&gt;Then I saw some actually actionable feedback:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The arrows showed the hierarchy better than the separators
&lt;ul&gt;
&lt;li&gt;I actually agreed with this afterwards, but I couldn&#x27;t get the chevron thing working as mentioned above&lt;&#x2F;li&gt;
&lt;li&gt;I opted for separators because I wanted to keep the button look.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Some thought they were tabs and kept misclicking them instead of tabs
&lt;ul&gt;
&lt;li&gt;This was very good feedback and made me rethink the situation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I am glad I saw those two things in the sea of &quot;it ugly.&quot; It helped me to restructure
the whole thing in my mind and start fixing.&lt;&#x2F;p&gt;
&lt;p&gt;So yeah I do read your feedback. :P&lt;&#x2F;p&gt;
&lt;h1 id=&quot;out-with-the-new-in-with-the-new-but-old&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#out-with-the-new-in-with-the-new-but-old&quot; aria-label=&quot;Anchor link for: out-with-the-new-in-with-the-new-but-old&quot;&gt;Out with the new, in with the new but old&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Here&#x27;s the new iteration: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;merge_requests&#x2F;1842&quot;&gt;KUrlNavigatorButton: Use arrow as separators &lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I saw the value in the old navbar with the arrows, so I brought them back. I wanted
to keep the icons, because I liked the visual flair they added, but they also
added clutter. If I could have had the chevron style buttons as shown in the mockups,
I would have likely kept the icons.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of reworking the old code, I decided to refactor it to best of my abilities:
There was some things we didn&#x27;t need anymore, and some things were a bit buggy due to
miscalculations, so I changed things around and got them into good place.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to remove some items I thought people wouldn&#x27;t use, but in fact I was told
quickly that these are very good things to have, so I kept them around. And this is also
the kind of feedback I like to see!&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re creating custom button components here, so we couldn&#x27;t utilize more &quot;standard&quot; buttons.
That&#x27;s why there was a lot of math and tinkering with padding involved. I did try to utilize the
QStyle methods here though so that it would look okay on any theme, not just Breeze.
There will likely be cases where it won&#x27;t look perfect in custom themes,
but utilizing QStyle allows us to at least try.&lt;&#x2F;p&gt;
&lt;p&gt;After the refactoring, it got easier to work on this and I started to wrap it up with rapid pace.
Instead of a month, it took me around a week.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s not merged yet, but hopefully will be soon. I&#x27;ve been daily driving this
iteration on my system and haven&#x27;t had issues so far.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;so-what-s-the-big-deal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#so-what-s-the-big-deal&quot; aria-label=&quot;Anchor link for: so-what-s-the-big-deal&quot;&gt;So what&#x27;s the big deal?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Yeah, so, why the big deal? Why write a blogpost about this?&lt;&#x2F;p&gt;
&lt;p&gt;I didn&#x27;t expect this change affect so much to my psyche, so I wanted to
talk about this. Maybe some other FOSS devs can relate. I think it&#x27;s
something we should discuss more often, than just the raw results.&lt;&#x2F;p&gt;
&lt;p&gt;I like to think I am good at taking feedback. But after working on something
for a month, then having to throw it all away even I was told it was ok..
It hurt! It was a lot of time spent on a thing that I hoped would make people happy.&lt;&#x2F;p&gt;
&lt;p&gt;I care about the stuff I do. A lot. So yeah, I&#x27;m gonna feel hurt when my work is disliked. And that&#x27;s okay.
Anyone who tells me otherwise can pound sand. Rejecting emotions like these just gets you in worse state over time.
I speak from experience here.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s easy to say &quot;just ignore the negative feedback&quot; but I literally can&#x27;t.
I am so into working on these things, I love
working on KDE applications.. So it does hurt when something that has become such an extension of my
own creativity and passion gets disliked... &lt;em&gt;Even when I haven&#x27;t directly worked on it!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Sure, this all is my
problem to work on and I don&#x27;t expect anyone to treat me with silk gloves and pat my head. Just wanted
to explain it, that&#x27;s all. Maybe someone can relate to this and doesn&#x27;t feel so alone with the problem.
I had the same thing when my games got insulted, where I was even more emotionally
attached to the things, because I had made them myself completely.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, I kept dwelling on it a bit longer than I wished.. But working on the new version was a great outlet.
I noticed old problems, fixed them and the new version is better in many ways.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve noticed that I am not annoyed&#x2F;upset about negative feedback itself, but how it&#x27;s conveyed.
Negative feedback will always be demotivating and bothersome, but when the negative feedback is written
politely and has actually actionable items, it can be rather motivating as well. The &quot;it ugly&quot; feedback has
stronger demotivating feedback, because it&#x27;s not actionable.&lt;&#x2F;p&gt;
&lt;p&gt;I think the key takeaway from all of this is that &lt;strong&gt;mockups can get stale!&lt;&#x2F;strong&gt;
If people like some older mockup, then you change to it suddenly, people may
get very frustrated about it: They either forgot the old mockup, had never seen it,
or they ended up disliking it in actual use.&lt;&#x2F;p&gt;
&lt;p&gt;So it&#x27;s good idea to freshen the mockup before iterating on it: Ask the visual designers
about it one more time, maybe share it with the users and ask their opinion on it.
Sure you can&#x27;t gauge everyone&#x27;s opinion on it, but at least it shouldn&#x27;t be that sudden
to everyone.&lt;&#x2F;p&gt;
&lt;p&gt;This whole ordeal has been very tiring, but that&#x27;s my own fault for not really allowing
myself to take a break from it. I get hyperfixated easily, but again, that&#x27;s my own problem.&lt;&#x2F;p&gt;
&lt;p&gt;So yeah, slight burnout by all of this.
I&#x27;m sure I&#x27;ll be fine, especially after this is merged so it can stop living rent free in my head.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m not blaming anyone for anything. Not even myself. Things happened and we all need to chill.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;hopes-for-future&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hopes-for-future&quot; aria-label=&quot;Anchor link for: hopes-for-future&quot;&gt;Hopes for future&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;There will be many many other times where I or someone else will get it wrong the first time.&lt;&#x2F;p&gt;
&lt;p&gt;So, share your feedback, but don&#x27;t immediatelly go for the nuclear option of removing it all.
With FOSS stuff, we don&#x27;t have these huge QA teams that go yay&#x2F;nay for something..
But everyone is welcome to join help in that regard!&lt;&#x2F;p&gt;
&lt;p&gt;Help us help you with actionable, polite feedback.&lt;&#x2F;p&gt;
&lt;p&gt;And thank you so much for everyone who has done so!&lt;&#x2F;p&gt;
&lt;p&gt;Now I&#x27;m going to try to just let go of this all. It&#x27;s weekend anyway
and I got bunch of games waiting to be played.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading as always!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Desktop icons are surprisingly hard!</title>
          <pubDate>Fri, 08 Nov 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>plasma</category>
            
              <category>desktop</category>
            
              <category>icons</category>
            
              <category>refactor</category>
            
              <category>programming</category>
            <link>https://akselmo.dev/posts/plasma-desktop-icons-positioning-refactor/</link>
          <guid>https://akselmo.dev/posts/plasma-desktop-icons-positioning-refactor/</guid>
          <description>&lt;p&gt;I spent past three weeks working on refactoring and fixing legacy code &lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt; (the oldest of which was from 2013)
that handled positioning Plasma desktop icons, and how this data was saved and loaded.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the merge request if you&#x27;re curious: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-desktop&#x2F;-&#x2F;merge_requests&#x2F;2607&quot;&gt;plasma-desktop: Refactor icon positioner saving and loading&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The existing code worked sometimes, but there were some oddities like race conditions (icon positioning happens in weird order)
and backend code mixed in with frontend code.&lt;&#x2F;p&gt;
&lt;p&gt;Now I am not blaming anyone for this. Code has tendency to get a bit weird, especially over long periods of time,
and &lt;em&gt;especially&lt;&#x2F;em&gt; in open source projects where anyone can tinker with it.&lt;&#x2F;p&gt;
&lt;p&gt;You know how wired earbuds always, &lt;em&gt;always&lt;&#x2F;em&gt; get tangled when you place them in a drawer or your pocket
or something for few seconds? Codebases do the exact same thing, when there are multiple
people writing on things, fixing each others&#x27; bugs. Everyone has a different way of thinking,
so it&#x27;s only natural that things over time get a bit tangled up.&lt;&#x2F;p&gt;
&lt;p&gt;So sometimes you need someone to look at the tangled codebase and try to clear it up a bit.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;reading-code-is-the-hardest-part&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#reading-code-is-the-hardest-part&quot; aria-label=&quot;Anchor link for: reading-code-is-the-hardest-part&quot;&gt;Reading code is the hardest part&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;When going through old code, especially some that has barely any comments, it can take a
very long time to understand what is actually going on. I honestly spent most of my time
trying to understand how the thing even works, what is called when, where the icons positions are updated,
and so on.&lt;&#x2F;p&gt;
&lt;p&gt;When I finally had some understanding of what was happening, I could start cleaning things up.
I renamed a lot of the old methods to be hopefully more descriptive, and moved backend code — like saving
icon positions — from the frontend back to backend.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;screens-and-icons&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#screens-and-icons&quot; aria-label=&quot;Anchor link for: screens-and-icons&quot;&gt;Screens and icons&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Every screen (PC monitor, TV…) tends to have it&#x27;s own quirks.
Some, when connected with display-port adapter, tell your PC it&#x27;s disconnected if your PC goes to
screen saving mode. Some stay connected, but show a blank screen.&lt;&#x2F;p&gt;
&lt;p&gt;One big issue with the icon positions was that when screen got turned off,
it thought there was no screen anymore and started removing items from the desktop.&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s fair. Why show desktop icons on a screen that is non-existent? But
when you have a monitor that tells your PC, &quot;Okay I&#x27;m disconnecting now!&quot; when the PC
says it&#x27;s time to sleep, wrong things would happen.&lt;&#x2F;p&gt;
&lt;p&gt;This condition is now handled by having a check that if the screen is in use or not.
Now when screen is not in use, we just do nothing with the icons. No need to touch them
at all.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;stripes-and-screen-resolution&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stripes-and-screen-resolution&quot; aria-label=&quot;Anchor link for: stripes-and-screen-resolution&quot;&gt;Stripes and screen resolution&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Our icon positioning algorithm uses something called &quot;stripes.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Every resolution has it&#x27;s amount of stripes. Stripes contain an array of icons,
or blank spots.&lt;&#x2F;p&gt;
&lt;p&gt;So if your screen resolution is, let&#x27;s say, &lt;code&gt;1920x1080&lt;&#x2F;code&gt;, we calculate
how many stripes and how many items per stripe will fit on that screen.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#181818;color:#ffffff;&quot;&gt;&lt;code&gt;&lt;span&gt;Stripe1: 1 2 3 4 5 6 7
&lt;&#x2F;span&gt;&lt;span&gt;Stripe2: 1 2 3 4 5 6 7
&lt;&#x2F;span&gt;&lt;span&gt;Stripe3: 1 2 3 4 5 6 7
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;And so on..
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But when you change your screen resolution or scale factor, how many icon stripes you have and how
many icons fit on each stripe will change.&lt;&#x2F;p&gt;
&lt;p&gt;So if you have one of those screens that looks to the system like it&#x27;s been unplugged when it goes into
sleep mode, previously the stripe amount would change to 1 row, 1 column. And the icon positioner would
panics and shove all icons in that &lt;code&gt;1,1&lt;&#x2F;code&gt; slot.&lt;&#x2F;p&gt;
&lt;p&gt;Then when you&#x27;d turn the screen back on, the icon positioner would wonder what just happened and restore
the proper stripe number and size. But by that point it would have lost all our positioning coordinate
data during the shoving of icons in that one miniscule place, so instead it would reset the icon positions…
and this leaves users wondering why their desktop icon arrangement is now gone.&lt;&#x2F;p&gt;
&lt;p&gt;Here we have to also check for the screen being in use or not. But there were other problems.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;saving-icon-positions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#saving-icon-positions&quot; aria-label=&quot;Anchor link for: saving-icon-positions&quot;&gt;Saving icon positions&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;The prior code saved the icon positions every time the positions changed.
Makes sense.&lt;&#x2F;p&gt;
&lt;p&gt;But it didn&#x27;t account for the screen being off… so the icon positions would
get saved while the desktop was in a faulty state. This also causes frustration because someone arranges the icons
how they wish, but then screen does something weird and they&#x27;re now saved in wrong places again.&lt;&#x2F;p&gt;
&lt;p&gt;Our icon positions were updated after almost every draw call, if the positions changed.
So this would mean the saving would happen rather often and no matter what moved them.&lt;&#x2F;p&gt;
&lt;p&gt;We had to separate the user action from computer action. If computer moves the icons,
we ideally do not save their positions, unless something drastic has happened like
resolution change.&lt;&#x2F;p&gt;
&lt;p&gt;The icon positions are saved per resolution, so if you move
icons around while they&#x27;re displayed on a &lt;code&gt;3440x1440&lt;&#x2F;code&gt; screen and then change the resolution to &lt;code&gt;1920x1080&lt;&#x2F;code&gt;,
both will have their own arrangements.
This part of the codebase did not previously work, and it would always override the old configuration,
which caused headache.&lt;&#x2F;p&gt;
&lt;p&gt;So now we only save icon positions when:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The user adds or removes a desktop icon&lt;&#x2F;li&gt;
&lt;li&gt;The user moves a desktop icon&lt;&#x2F;li&gt;
&lt;li&gt;The user changes the desktop resolution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This makes the icon position saving much less random, since it&#x27;s done only after explicit user actions.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;margin-errors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#margin-errors&quot; aria-label=&quot;Anchor link for: margin-errors&quot;&gt;Margin errors&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;The last thing that caused headaches with the icon positioning was that the area available on the desktop
for icons was determined before panels were loaded. When the panels loaded, they would reduce the amount of
space for desktop icons, and that area would constantly resize until everything is ready.&lt;&#x2F;p&gt;
&lt;p&gt;In previous code, this would cause icons to move, which updates positions, which then saves their positions.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s say you arrange your icons nicely, but the next time you boot into plasma, your panels start shoving
the poor icon area around and the icons have to move out of the way… and now they&#x27;re all in the wrong places.&lt;&#x2F;p&gt;
&lt;p&gt;This was already partially fixed by not saving when the computer moves the icons around: we just load the icon
positions when the screen is in use and we are done with listing the icons on the desktop. Part of the margin changes
happen when screen is off.&lt;&#x2F;p&gt;
&lt;p&gt;We still need to fix the loading part; ideally we load the icon area last, so that it gets the margins
it expects and doesn&#x27;t shuffle around while panels are still appearing. But it was out of scope for this merge request.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusions&quot; aria-label=&quot;Anchor link for: conclusions&quot;&gt;Conclusions&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;It may not sound like much, but this was a lot of work. I spent days just thinking about this
problem, trying to understand what is happening now and how to improve it.&lt;&#x2F;p&gt;
&lt;p&gt;Luckily with a lot of help from reviewers and testers I got things to work
much better than it used to. I am quite &quot;all-over-the-place&quot; when I solve problems
so I appreciate the patience they had with me and my questions. :D&lt;&#x2F;p&gt;
&lt;p&gt;What I mostly wished for when working on this were more inline code comments. You don&#x27;t need to
comment the obvious things, but everything else could use something. It&#x27;s hard to gauge
what is obvious and what is not, but that kind of answers the question: If you don&#x27;t know
if it&#x27;s obvious or not, it&#x27;s likely not, so add some comment about it.&lt;&#x2F;p&gt;
&lt;p&gt;I do hope that the desktop icons act more reliably after all these changes. If you spot bugs, do
report them at &lt;a href=&quot;https:&#x2F;&#x2F;bugs.kde.org&#x2F;enter_bug.cgi?product=plasmashell&quot;&gt;https:&#x2F;&#x2F;bugs.kde.org&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading! :)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;PS. The funniest thing to me about all of this is that I do not like having any icons on my desktop. :&#x27;D&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My Akademy 2024 trip</title>
          <pubDate>Sat, 14 Sep 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>akademy</category>
            
              <category>linux</category>
            
              <category>conference</category>
            <link>https://akselmo.dev/posts/akademy-2024/</link>
          <guid>https://akselmo.dev/posts/akademy-2024/</guid>
          <description>&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;akademy.kde.org&#x2F;&quot;&gt;Akademy&lt;&#x2F;a&gt; is this yearly thing where bunch of KDE people go to talk about and work on KDE software.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
I had never been in one before, but this year I managed to make it there! This year Akademy was held at the city of Würzburg.
This was also my first time in Germany, which is the furthest I&#x27;ve ever been from home.&lt;&#x2F;p&gt;
&lt;p&gt;I also had my wife Jenny with me, since if I had gone alone I would have gotten lost in some random mountain somewhere,
or started a new life at the dark corners of Frankfurt airport, completely confused.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;friday-the-day-of-flying-or-so-i-thought&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#friday-the-day-of-flying-or-so-i-thought&quot; aria-label=&quot;Anchor link for: friday-the-day-of-flying-or-so-i-thought&quot;&gt;Friday, the day of flying (or so I thought)&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;On Friday the 6th, we left from Oulu to Helsinki first. Hop on plane at 14.30 and- Oh, a small delay.&lt;&#x2F;p&gt;
&lt;p&gt;Eh, it&#x27;s fine, we hopped on the plane at 16.00 and-...&lt;&#x2F;p&gt;
&lt;p&gt;The flight was canceled.&lt;&#x2F;p&gt;
&lt;p&gt;So, we wait til like 19.30 or something to get to Helsinki. But of course, our flight from Helsinki to Germany had already left!
No worries though, the next flight to Germany would leave soon.&lt;&#x2F;p&gt;
&lt;p&gt;Wait, what do you mean it leaves at 7.00?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Aaaaaaaaaahhhhggggggggggg....&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Well, we got paid airport hotel room with paid dinner and breakfast. So we slept at Helsinki the first night. We were supposed to be at
Würzburg at 23.55 or something, but of course not. Oh well, with some effort I might be able to make to the event, although I would miss
the first few talks.&lt;&#x2F;p&gt;
&lt;p&gt;I had the most saddest (but still good) slab of lasagne at very sad and empty airport hotel restaurant.
Very frustrated by everything. Sure it&#x27;ll get better, right?&lt;&#x2F;p&gt;
&lt;h1 id=&quot;saturday-the-day-of-sleep-deprivation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#saturday-the-day-of-sleep-deprivation&quot; aria-label=&quot;Anchor link for: saturday-the-day-of-sleep-deprivation&quot;&gt;Saturday, the day of sleep deprivation&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;This time the airplane actually started to fly, instead of getting canceled for scandalous airplane activities, and we
were on route to Frankfurt pretty soon. I spent some time in the airplane just working on my &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;artificial-rage&#x2F;src&#x2F;branch&#x2F;move-to-odin&quot;&gt;never-ending game project&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At Frankfurt, we got our luggage and went to the funny ICE train, which was a bit late. Apparently being late is some German train thing,
I don&#x27;t really understand it, but we have similar thing at Finland so it wasn&#x27;t that shocking.&lt;&#x2F;p&gt;
&lt;p&gt;At the train, we were exhausted with our 4h of sleep due to stress not allowing us to sleep, so we just find some seats and sit down. Five
minutes later some chap tells us to go away, so we stay up standing for the next 1h 30min next to the exit doors in some midcabin thing.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to watch some of the Akademy streams at this point, but I was mostly focusing on staying up.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually, we finally reach the Burg of Würz. First impressions were that it looks really nice and.. What the hell is that? A.. mountain?
Wow, they can be THAT tall??? (Authors note: Finland is very, VERY flat).&lt;&#x2F;p&gt;
&lt;p&gt;Also it was hellishly hot. The most I saw was 32 celsius. It was painful, I was sweating all the time and it was not fun.&lt;&#x2F;p&gt;
&lt;p&gt;We walk to our hotel room at Mercure hotel, which was really nice by the way. At this time, Akademy was having an incredible luncheon together,
so me and Jenny decided to find something to eat. We found this place that was all about avocados, and I had something called powerbowl, which was brilliant.&lt;&#x2F;p&gt;
&lt;p&gt;After that, we began to study the incredibly complex thing that is the German bus system and started our trip towards the Akademy venue.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aktually-at-akademy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#aktually-at-akademy&quot; aria-label=&quot;Anchor link for: aktually-at-akademy&quot;&gt;Aktually at Akademy&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Me and my blurry sleep deprived brain walk to the venue and first off I meet familiar people. A lot of familiar people.
Many hugs and &quot;Oh you finally made it!&quot;-s were shared. Jenny was with me there as well and it was fun to introduce her to my friends.&lt;&#x2F;p&gt;
&lt;p&gt;I honestly don&#x27;t remember much about the day. It was quite a blur. But it was cool and I talked &lt;em&gt;a lot.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I stole a lot of stickers and listened some talks, which I can barely remember... But I do remember which ones:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Arjen&#x27;s talk about Union KDE styling theme thing, that is super cool.&lt;&#x2F;li&gt;
&lt;li&gt;Harald talked about of our own new possible shiny OS called KDE OS. Or 🍌 OS. I found this really exciting.&lt;&#x2F;li&gt;
&lt;li&gt;A lot of lighting talks, where Nicole&#x27;s talk about teaching lil kiddos how to install Linux with KDE software on old PC&#x27;s to bring them back alive.
&lt;ul&gt;
&lt;li&gt;I think this talk was my favorite. It was very wholesome, motivating and I&#x27;d like to have similar kind of teaching event at home. No promises, but.. Maybe!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;During this day I also began to give out &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Salty_liquorice&quot;&gt;salmiakki&lt;&#x2F;a&gt; to people, since I had been well prepared.
It was kinda fun to see peoples reactions, especially if they had never heard of it before.&lt;&#x2F;p&gt;
&lt;p&gt;Then it was back to sleep at the hotel.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;sunday-i-managed-to-do-things&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sunday-i-managed-to-do-things&quot; aria-label=&quot;Anchor link for: sunday-i-managed-to-do-things&quot;&gt;Sunday, I managed to do things&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;On sunday I was at Akademy pretty much the whole day. Again, I listened bunch of talks, met more people and we had many good chats
about LTS distros, KDE PIM, Kwin, Flatpak... And many other things I can&#x27;t remember.&lt;&#x2F;p&gt;
&lt;p&gt;I listened Carl&#x27;s KDE Apps Initiative talk which was very motivating for me, since I&#x27;ve wanted to make a KDE app for a while. A gaming related
lil thing.&lt;&#x2F;p&gt;
&lt;p&gt;After the fun group photo and delicious lunch, I chatted more and wandered about the venue.&lt;&#x2F;p&gt;
&lt;p&gt;There was a talk about daily driving Plasma Mobile and I found it very cool, and we had a chat about the Plasma Mobile afterwards. Apparently my
Fairphone 5 could run PostmarketOS with Plasma Mobile pretty well already, but I am not yet ready to commit to such a change with my mobile device.&lt;&#x2F;p&gt;
&lt;p&gt;Last I listened Xaver&#x27;s talk about what color is in computers. I learned that sRGB is a lie and gasped audibly, then heard a lot of words
related to color systems I didn&#x27;t really always understand.. But I found the talk still quite interesting and informative.&lt;&#x2F;p&gt;
&lt;p&gt;The evening was then again a bit of a blur, with sponsors lightning talks and Akademy Awards (congrats to winners btw).&lt;&#x2F;p&gt;
&lt;p&gt;Very interesting day, but I&#x27;ve always been bad when it comes to learning from listening. I learn by doing.&lt;&#x2F;p&gt;
&lt;p&gt;Of course the day wasn&#x27;t complete without me going to wait bus with my t-shirt and shorts (since it was hot again),
and it started pouring like heck. I was soaked when I got to the bus, then at the last stop I had to walk 1km to the hotel
in the rain. Ah well, it was warm so I didn&#x27;t mind too much.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;monday-i-skipped-the-class&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#monday-i-skipped-the-class&quot; aria-label=&quot;Anchor link for: monday-i-skipped-the-class&quot;&gt;Monday, I skipped the class&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;On monday I was so exhausted by Everything:tm: I decided to just chill with my wife and we went around Würzburg, buying food and chocolate.&lt;&#x2F;p&gt;
&lt;p&gt;I spent that day just recharging my social batteries. And I ate some Flammenkuchen, which was &lt;em&gt;delicious!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At some point when Jenny is done editing and uploading her video, I will make separate post for it.
Then you can see what Würzburg is like, and hear what she did during the trip.&lt;&#x2F;p&gt;
&lt;p&gt;Edit: Am lazy but heres the link to the video: https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=05qexeiHNeY&lt;&#x2F;p&gt;
&lt;h1 id=&quot;tuesday-i-flocked-together-with-the-birds&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tuesday-i-flocked-together-with-the-birds&quot; aria-label=&quot;Anchor link for: tuesday-i-flocked-together-with-the-birds&quot;&gt;Tuesday, I flocked together with the birds&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Like on monday, on tuesday as well Akademy had these events called &quot;BoFs&quot; which is abbreviation of Birds of a Feather. Because &quot;Birds of a Feather Flock Together&quot;.
I don&#x27;t know why it&#x27;s called that, but anyhow, I participated a few of them:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;New design system bof
&lt;ul&gt;
&lt;li&gt;Very interesting discussions and ideas even I know nothing about design&lt;&#x2F;li&gt;
&lt;li&gt;I was mostly hoping to help people there with my programmer side of knowhow, as someone who has touched the Breeze styles codebases&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Tiling in kwin bof
&lt;ul&gt;
&lt;li&gt;We mulled over what we could do to make tiling in kwin even better&lt;&#x2F;li&gt;
&lt;li&gt;I have this mini task for myself where I try to make tiles split automatically when a window is dragged on top of the other&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Fedora KDE bof
&lt;ul&gt;
&lt;li&gt;I was just mostly curious whats up with Fedora KDE at the moment&lt;&#x2F;li&gt;
&lt;li&gt;I also wanted to give my praise for Fedora KDE, it&#x27;s been my daily driver for many months now and it&#x27;s been really good&lt;&#x2F;li&gt;
&lt;li&gt;Couple of my friends use it too due to my recommendation and they&#x27;re having good time gaming on it! :)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;To wrap up the evening, I had a fancy dinner with my friends. What was quite a culture shock to me was that after 22.00 the streets
were practically completely empty. It was &lt;em&gt;eerily quiet&lt;&#x2F;em&gt;. At home we would have had few drunks about making noise, but at Germany there was just..
Silence.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;wednesday-to-home-again&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wednesday-to-home-again&quot; aria-label=&quot;Anchor link for: wednesday-to-home-again&quot;&gt;Wednesday, to home again&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Due to having two lizards and them needing a petsitter, and said petsitter not being able to be there the whole week,
we left a bit early so we missed the daytrip and the last bof day.&lt;&#x2F;p&gt;
&lt;p&gt;Bit early being our flight from Frankfurt was leaving around 7.00. So we woke up at 5.00.&lt;&#x2F;p&gt;
&lt;p&gt;And when I wake up I saw a message in my phone saying: &quot;Hi your flight is canceled&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Ah. Fun. If all had gone to plan, we would&#x27;ve been at home around 17.00. But instead, we were home at ~2.00.&lt;&#x2F;p&gt;
&lt;p&gt;We had to live at Frankfurt airport for ~7 hours, saw a lot of police with weapons (it was really scary to me, I&#x27;ve never seen weaponry like.. that openly),
there was some suspicious luggage that got a whole McDonalds covered in &quot;dont go here&quot; tape and more police.&lt;&#x2F;p&gt;
&lt;p&gt;Urghgfhklfg. Scary.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually we luckily made it to Helsinki and then back to Oulu and I didn&#x27;t need to type out this blogpost from some corner of the airport.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusions&quot; aria-label=&quot;Anchor link for: conclusions&quot;&gt;Conclusions&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Akademy was really fun event. I can hardly describe how fun it was. It&#x27;s been quite a blur due to traveling issues
and thus me being completely stressed and exhausted, but I still had many fun chats with everyone.&lt;&#x2F;p&gt;
&lt;p&gt;It was really nice to finally see who the people behind the internet names are and have talks with them, be it just random topics
or KDE topics. I met people who I had never met before and shared many chats, laughs and information with them.&lt;&#x2F;p&gt;
&lt;p&gt;I learned quite a lot about what&#x27;s going on in our KDE ecosystem and even outside of it, how we all interact. But
I think the biggest thing I learned was that events like Akademy are crucial for the motivation and wellbeing of the KDE community.
It helps us stay together, keep our bonds strong, be it KDE folk itself or people working with us, and keep us being awesome at what we do:
Making computers do cool things, for free, for productivity and for fun.&lt;&#x2F;p&gt;
&lt;p&gt;Sorry about no photos, I have basically nothing: I am very bad at taking photos because I simply don&#x27;t remember.&lt;&#x2F;p&gt;
&lt;p&gt;I love KDE and if you love KDE too, and if it&#x27;s at all possible, visiting Akademy is well worth it!&lt;&#x2F;p&gt;
&lt;p&gt;See you at the next one, and apologies for the all-over-the-place-rambly-travel-post. Hope you find it a good read anyway.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>KIO Thumbnailer Support</title>
          <pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>development</category>
            
              <category>linux</category>
            
              <category>kio</category>
            <link>https://akselmo.dev/posts/kio-thumbnailer-support/</link>
          <guid>https://akselmo.dev/posts/kio-thumbnailer-support/</guid>
          <description>&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;&quot;&gt;KIO Framework&lt;&#x2F;a&gt; has gained support for de-facto standard, cross-desktop thumbnail generators.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
This means that we have a support for thumbnails from 3rd party applications!
On Linux systems, many applications that produce some kind of output, such as a 3D file or text document,
ship a thumbnailer file that tells file managers how to create thumbnails of their files.
One specific example I&#x27;ve used here in the images are STL files, for which we don&#x27;t have our own KDE-specific thumbnailer plugin.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;thumbnailbinary&#x2F;stlfiles.png&quot; alt=&quot;Screenshot of various STL file thumbnails&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;thumbnailbinary&#x2F;xeno.png&quot; alt=&quot;Screenshot of a Xenomorph STL files&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;These thumbnailer files are currently used by Nautilus and Thunar,
so we felt like we were missing out and wanted to join the party! :)&lt;&#x2F;p&gt;
&lt;h1 id=&quot;thumbnailer-files&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#thumbnailer-files&quot; aria-label=&quot;Anchor link for: thumbnailer-files&quot;&gt;Thumbnailer files&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Thumbnailer files are simple text files that tell the system what program we should run to generate
a thumbnail. You can check what thumbnailers you have installed by running &lt;code&gt;ls &#x2F;usr&#x2F;share&#x2F;thumbnailers&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For example, the STL thumbnailer file looks like this:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#181818;color:#ffffff;&quot;&gt;&lt;code&gt;&lt;span&gt;[Thumbnailer Entry]
&lt;&#x2F;span&gt;&lt;span&gt;TryExec=stl-thumb
&lt;&#x2F;span&gt;&lt;span&gt;Exec=xvfb-run --auto-servernum -w 0 stl-thumb -f png -s %s %i %o
&lt;&#x2F;span&gt;&lt;span&gt;MimeType=model&#x2F;stl;model&#x2F;x.stl-ascii;model&#x2F;x.stl-binary;application&#x2F;sla;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It tells the software running the thumbnailer what commands to use to generate the thumbnail,
and what mimetypes it supports.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;kde-thumbnailer-plugins&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kde-thumbnailer-plugins&quot; aria-label=&quot;Anchor link for: kde-thumbnailer-plugins&quot;&gt;KDE Thumbnailer Plugins&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;On KDE side, we have used plugins for KIO, that reside in the &lt;code&gt;kio-extras&lt;&#x2F;code&gt; repository.
They work just fine for our usecase in KDE apps, but nobody should need to write a KIO specific plugin
for their application.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-changes-to-kio&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-changes-to-kio&quot; aria-label=&quot;Anchor link for: the-changes-to-kio&quot;&gt;The changes to KIO&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;You can check the &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;merge_requests&#x2F;1651&quot;&gt;merge request&lt;&#x2F;a&gt; for more
in-depth details, but here&#x27;s a summary of how I made it work side-by-side with our plugin system:&lt;&#x2F;p&gt;
&lt;p&gt;We utilize the KIO plugins always first if possible, since we know for sure they work. This is to avoid
any possible regressions and oddities, and to keep the change as unintrusive as possible. When we encounter
a mimetype that is not supported by our plugins, like STL files, we utilize a thumbnailer file instead.&lt;&#x2F;p&gt;
&lt;p&gt;This also means that it&#x27;s transparent to users. &lt;strong&gt;Users do not have to worry which one they have installed.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-make-support-for-thumbnailer-files-then&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-make-support-for-thumbnailer-files-then&quot; aria-label=&quot;Anchor link for: why-make-support-for-thumbnailer-files-then&quot;&gt;Why make support for thumbnailer files then?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;As mentioned earlier, no application should need to create a plugin for KIO just to make their thumbnails
show up in our applications.&lt;&#x2F;p&gt;
&lt;p&gt;Thumbnailer files offer other benefits too, such as easing future transitions, (like from KF6 to KF7); working nicely with sandboxing, and being distributable in Flatpak bundles.&lt;&#x2F;p&gt;
&lt;p&gt;I am also working on moving our own plugins into thumbnailers,
so we get the benefits from that too.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-can-i-test-it-out&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-can-i-test-it-out&quot; aria-label=&quot;Anchor link for: how-can-i-test-it-out&quot;&gt;How can I test it out?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Currently it&#x27;s only in the master branch of KIO, so if you really want to try it out,
you will have to set up KDE Plasma development environment: &lt;a href=&quot;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;building&#x2F;kdesrc-build-setup&#x2F;&quot;&gt;https:&#x2F;&#x2F;develop.kde.org&#x2F;docs&#x2F;getting-started&#x2F;building&#x2F;kdesrc-build-setup&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When inside in the development environment, open Dolphin and enable the thumbnailers from preview settings.&lt;&#x2F;p&gt;
&lt;p&gt;Any help testing it would be very welcome! :)
Let me know of any possible improvements and bugs!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Kate and OrgMode</title>
          <pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>kate</category>
            
              <category>orgmode</category>
            
              <category>notes</category>
            
              <category>productivity</category>
            
              <category>personal</category>
            <link>https://akselmo.dev/posts/kate-and-orgmode/</link>
          <guid>https://akselmo.dev/posts/kate-and-orgmode/</guid>
          <description>&lt;p&gt;I have a very.. unusual notetaking and task setup with &lt;a href=&quot;https:&#x2F;&#x2F;kate-editor.org&#x2F;&quot;&gt;Kate&lt;&#x2F;a&gt;, using &lt;a href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;&quot;&gt;Orgmode&lt;&#x2F;a&gt; files.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
I wanted to showcase it and explain how it works, maybe someone else has similar needs.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a small screenshot of my journal notes, I blurred out some things I didn&#x27;t want to share.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kateorg.png&quot; alt=&quot;Screenshot of my Journal 2024 org mode notes where many items are blurred out&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-orgmode&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-orgmode&quot; aria-label=&quot;Anchor link for: why-orgmode&quot;&gt;Why OrgMode?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I actually prefer markdown much more. I enjoy writing markdown files and it just works in most editors.
However, there is zero markdown note taking apps on android, that allow me to &lt;strong&gt;sync from my nextcloud&lt;&#x2F;strong&gt;
&lt;em&gt;and&lt;&#x2F;em&gt; have &lt;strong&gt;notifications&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I write very journal style notes. I have one big journal file (used to be a file per day before),
where I write down all the interesting things that happened, plus most importantly, my work tasks.&lt;&#x2F;p&gt;
&lt;p&gt;I tried to use calendar with tasks before.. But theres way too much context switching between
notetaking apps, calendars, tasks (and on android you have to have two apps for tasks and calendar!!!).
I was drowning in various apps and windows, constantly hopping around..&lt;&#x2F;p&gt;
&lt;p&gt;All I wanted to do was write down a task in my journal, then have that task notify me on my phone
and on my desktop whenever it was scheduled.&lt;&#x2F;p&gt;
&lt;p&gt;So eventually I found an app called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;orgzly-revived&#x2F;orgzly-android-revived&#x2F;&quot;&gt;Orgzly Revived&lt;&#x2F;a&gt;.
It lets me take the outline style notes where everything is a bulletpoint, with tasks and such, timers, repeats..
And it has the dang phone notifications no other note taking app has. So it&#x27;s perfect. Works awesome for my needs.&lt;&#x2F;p&gt;
&lt;p&gt;Only thing is that it requires Orgmode files. Okay, I can do that. I first used &lt;a href=&quot;https:&#x2F;&#x2F;logseq.com&#x2F;&quot;&gt;Logseq&lt;&#x2F;a&gt; with both
markdown and orgmode files, but it&#x27;s quite slow app, even on my nice PC. And no notifications on mobile of course.&lt;&#x2F;p&gt;
&lt;p&gt;I then realised that I am trying to overcomplicate things. I live a lot of my work life in Kate editor, so I
decided to start using that. I had to update the Orgmode Kate syntax file a bit to make it work better for me
(it&#x27;s been upstreamed now yay), but other than that it works really nicely.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;And why not Emacs? I need an editor, not an OS.&lt;&#x2F;em&gt; Well, jokes aside,
I am just not really into learning yet another
tool for something like note taking. Last time I tried to set up Neovim config that works for me, I just ended up doing everything in Kate.. I wager same would happen with emacs.
I am very happy with Kate, that&#x27;s all. And I contribute to it now and then, so it just makes sense to use it. :)&lt;&#x2F;p&gt;
&lt;p&gt;Now I just sync all my note files through my Nextcloud to my phone and my computers. I have couple scripts
that make figuring out my agenda and have notifications on my PC as well.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;my-kate-setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-kate-setup&quot; aria-label=&quot;Anchor link for: my-kate-setup&quot;&gt;My Kate setup&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;My setup took some time to get together and with couple scripts and snippets it works pretty well.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;First, you need to &lt;code&gt;git clone https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;kate-orgmode.git&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;In there I have couple python and shell scripts, and snippets for Kate&lt;&#x2F;li&gt;
&lt;li&gt;You need to create a &lt;code&gt;.venv&lt;&#x2F;code&gt; for it with &lt;code&gt;python -m venv .venv&lt;&#x2F;code&gt; and then &lt;code&gt;pip install -r requirements.txt&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Check the Readme file for how to use the snippets&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Create session called Notes.
&lt;ul&gt;
&lt;li&gt;In Plasma, you can just search &quot;Notes&quot; in KRunner and open the Notes session, that just opens the files.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Symlink the org mode snippets to &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;ktexteditor_snippets&#x2F;data&#x2F;&lt;&#x2F;code&gt; and make sure they work in Kate
&lt;ul&gt;
&lt;li&gt;Snippets are incredibly powerful in Kate, i recommend using them for many things!&lt;&#x2F;li&gt;
&lt;li&gt;These snippets automate stuff like &quot;worktask&quot; entries.&lt;&#x2F;li&gt;
&lt;li&gt;Unfortunately any timestamps need to be modified by hand, i have not yet had time to make an external tool
that spawns a calendar view and spits out a timestamp.&lt;&#x2F;li&gt;
&lt;li&gt;For example, &quot;worktask&quot; adds a following item.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#ff9233;&quot;&gt;TODO&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#5fff33;&quot;&gt; [#ABC] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;task_name :work:
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;SCHEDULED: &lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;2024-07-07 Sun 21:12&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;DEADLINE: &lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;2024-07-07 Sun 21:12&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :PROPERTIES:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :CREATED:&lt;&#x2F;span&gt;&lt;span&gt; [2024-07-07 Sun 21:12]
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :product:&lt;&#x2F;span&gt;&lt;span&gt; product
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :kdebug: &lt;&#x2F;span&gt;&lt;span style=&quot;text-decoration:underline;color:#33aaff;&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span style=&quot;text-decoration:underline;color:#808080;&quot;&gt;https:&#x2F;&#x2F;bugs.kde.org&#x2F;show_bug.cgi?id=bugid&lt;&#x2F;span&gt;&lt;span style=&quot;text-decoration:underline;color:#33aaff;&quot;&gt;][bugid]]
&lt;&#x2F;span&gt;&lt;span&gt;  :merge-request: UPDATE_ME
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :END:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Add an &quot;external tool&quot; entry for the &lt;code&gt;run-orgagenda.sh&lt;&#x2F;code&gt; item in the files.
&lt;ul&gt;
&lt;li&gt;Set the &quot;Output&quot; setting to &quot;Display in a panel&quot;&lt;&#x2F;li&gt;
&lt;li&gt;For the scripts, make sure they&#x27;re reading right folder (where your notes are)&lt;&#x2F;li&gt;
&lt;li&gt;Now you can press &lt;code&gt;ctrl+alt+i&lt;&#x2F;code&gt; and type &lt;code&gt;Org Agenda&lt;&#x2F;code&gt; and it shows you a fun lil overview in a panel of all your items in agenda&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;In your DE&#x27;s autostart, add the &lt;code&gt;run-orgnotifier.sh&lt;&#x2F;code&gt; script.
&lt;ul&gt;
&lt;li&gt;This will send notification for anything you have set as scheduled or deadline before 30 min, and before&#x2F;after 5 min of the timestamp.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;That should be it for the setup, &lt;strong&gt;the code for these scripts is absolutely horrid&lt;&#x2F;strong&gt;
but you should check that all filepaths match yours etc. I need to clean up the code when I feel like it
but honestly it Just Works:tm: for now.. lol.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;journaling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#journaling&quot; aria-label=&quot;Anchor link for: journaling&quot;&gt;Journaling?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I have one single file that is called &lt;code&gt;Journal-2024&lt;&#x2F;code&gt; and I create new journal every year.
In this journal file, I &lt;strong&gt;prepend&lt;&#x2F;strong&gt; new items on top of the file, like this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;* Daily notes 2024-07-07
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :PROPERTIES:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :CREATED:&lt;&#x2F;span&gt;&lt;span&gt;  [2024-07-07 Sun 21:20]
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :END:
&lt;&#x2F;span&gt;&lt;span&gt;Some notes for this day
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#808080;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;* Some specific subnote for this daily note
&lt;&#x2F;span&gt;&lt;span&gt;blabla
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#ff9233;&quot;&gt;TODO&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#5fff33;&quot;&gt; [#A] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;do this task ples :personal:
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;SCHEDULED: &lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;2024-07-06 Sat 21:22&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;DEADLINE: &lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;2024-07-07 Sun 21:23&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :PROPERTIES:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :CREATED:&lt;&#x2F;span&gt;&lt;span&gt; [2024-07-05 Fri 21:22]
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :END:
&lt;&#x2F;span&gt;&lt;span&gt;blalbla
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#ff9233;&quot;&gt;DONE&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#5fff33;&quot;&gt; [#B] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;ancient task :work:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :PROPERTIES:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :CREATED:&lt;&#x2F;span&gt;&lt;span&gt; [2000-01-01 someDayIdk 21:23]
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt; :END:
&lt;&#x2F;span&gt;&lt;span&gt;its been 24 years
&lt;&#x2F;span&gt;&lt;span&gt;#+BEGIN_SRC code
&lt;&#x2F;span&gt;&lt;span&gt;ancient code
&lt;&#x2F;span&gt;&lt;span&gt;#+END_SRC
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This means that you can just quickly see all the new items. Also in Kate, there&#x27;s a handy
feature for folding all toplevel nodes when you press &lt;code&gt;ctrl+alt+i&lt;&#x2F;code&gt; so you get just list of
all headers. I use it all the time. Folding the nodes only works with the newest ksyntaxhighlighting since
i recently updated the orgmode syntax file to support that lol.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;anything-else&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anything-else&quot; aria-label=&quot;Anchor link for: anything-else&quot;&gt;Anything else&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Any other items go to their respective note files.&lt;&#x2F;p&gt;
&lt;p&gt;For example anything related to programming goes to &quot;Programming notes&quot; file. Then I use
tags for those items to categorize them based on language, framework, etc..&lt;&#x2F;p&gt;
&lt;p&gt;Instead of having many small files, I have multiple big files, where I categorize items with tags.
I can then easily search for items by typing &lt;code&gt;:tag:&lt;&#x2F;code&gt; in the search field in Kate, and it shows me all items
related to that tag. Just, well, remember to tag your items! :D&lt;&#x2F;p&gt;
&lt;h1 id=&quot;wrap-up&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wrap-up&quot; aria-label=&quot;Anchor link for: wrap-up&quot;&gt;Wrap up&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;To wrap it up, this system has made things much easier to remember for me, and I can handle more
complicated tasks like repeating workout tasks with my phone. (I can do it in Kate too but it requires manual number changing).&lt;&#x2F;p&gt;
&lt;p&gt;I wouldn&#x27;t mind changing back to markdown if there was a &lt;strong&gt;markdown app for phone that has actual notifications&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Sorry this post is a bit all over the place, but there&#x27;s really not much more interesting things to share about this.
It&#x27;s just couple scripts reminding me or showing all the items in my agenda, and the rest is snippets in Kate
and writing orgmode files.&lt;&#x2F;p&gt;
&lt;p&gt;And I am quite happy with my system. Maybe it&#x27;ll help you to get some ideas too!&lt;&#x2F;p&gt;
&lt;p&gt;Also please tell me about any markdown note taking apps that have notifications on mobile and desktop, if you know
any. You can ping me on fedi, which you can find on my about section.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Family of free and friendly open source software</title>
          <pubDate>Thu, 02 May 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>development</category>
            
              <category>linux</category>
            
              <category>foss</category>
            <link>https://akselmo.dev/posts/fofafoss/</link>
          <guid>https://akselmo.dev/posts/fofafoss/</guid>
          <description>&lt;p&gt;Or FOFAFOSS. Rolls right off your tongue.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Like in many families, there&#x27;s always a bit of.. turmoil and drama in FOSS.
Something breaks (either on purpose or by accident), people get frustrated.. The usual.
It is kind of to be expected when it comes to very social projects, like let&#x27;s say, Linux desktop environments.&lt;&#x2F;p&gt;
&lt;p&gt;People have their own visions and ways to see things. They often clash. That&#x27;s normal. It&#x27;s quite human.
I do like to think that Linux desktop environments especially are like siblings that have rivalries.&lt;&#x2F;p&gt;
&lt;p&gt;But we got to remember that it&#x27;s not &quot;us vs them&quot; here. We don&#x27;t have the resources to fight each other.
We &lt;em&gt;need&lt;&#x2F;em&gt; to work together even with our incompatible visions sometimes. Otherwise things will keep fracturing
and get even worse.. And nobody gains from that. Well, except the proprietary platforms. :P&lt;&#x2F;p&gt;
&lt;p&gt;In the end we all want to make good software for everyone to use and enjoy.
Let&#x27;s help each other to do that as well as we can.&lt;&#x2F;p&gt;
&lt;p&gt;Nothing wrong with &quot;Oh you made that? Well watch this!&quot; type of friendly rivalry however,
it keeps us doing what we do best. :)&lt;&#x2F;p&gt;
&lt;p&gt;I just wanted to write this down as somekind of reminder that we got to remember to
work together if we want to succeed. Even when frustrated.&lt;&#x2F;p&gt;
&lt;p&gt;And no I am not any high and mighty person to really say this, I have had my own share of frustrations and quips.
This post serves also as a reminder for myself.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s try to work together as well as we can.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Plasma 6 and me</title>
          <pubDate>Sun, 31 Mar 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>development</category>
            
              <category>linux</category>
            
              <category>plasma</category>
            <link>https://akselmo.dev/posts/plasma-6-and-me/</link>
          <guid>https://akselmo.dev/posts/plasma-6-and-me/</guid>
          <description>&lt;p&gt;I&#x27;m bit late to the train of Plasma 6 related posts... But anyway.
I will go through some things I did.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For me working on Plasma 6 was pretty fun, I learned a lot of new things and
fixed bunch of bugs and crashes.&lt;&#x2F;p&gt;
&lt;p&gt;The most resourceful ones can find my merge requests, but I am too lazy to link
them all.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;things-i-did&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#things-i-did&quot; aria-label=&quot;Anchor link for: things-i-did&quot;&gt;Things I did&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Most of the things I did were a lot more in the background. I hunted down a lot of bugs and crashes,
and tried to fix them myself or helped others fix them, in various projects, such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Dolphin&lt;&#x2F;li&gt;
&lt;li&gt;Plasmashell&lt;&#x2F;li&gt;
&lt;li&gt;Kwin&lt;&#x2F;li&gt;
&lt;li&gt;KNS&lt;&#x2F;li&gt;
&lt;li&gt;And probably a lot of more I have already forgot... :D&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;But there was A LOT stuff: Around 100 merge requests in total!
Pretty much all of them got in, thanks to all the reviews and education other KDE developers provided to me! :)&lt;&#x2F;p&gt;
&lt;p&gt;Again, &lt;strong&gt;thanks to everyone who has helped me to work on KDE projects!&lt;&#x2F;strong&gt;
Thanks for your patience with me and all the knowledge you have parted to me. ❤️
I&#x27;ll keep doing my best helping KDE projects, be it bug hunting or feature creation.&lt;&#x2F;p&gt;
&lt;p&gt;I have to say my software testing background has been very useful when it comes down
to hunting down bugs, and I&#x27;ve learned a lot of things about Qt, C++ and QML. Still got much
more to learn though, but that&#x27;s what makes me so excited about programming!&lt;&#x2F;p&gt;
&lt;p&gt;I think one of the most useful things I&#x27;ve learned is how to use GDB. I can&#x27;t provide
anyone a crash course (at least in this blog post) but it is essential when hunting down
weird bugs in plasmashell for example. I love debuggers integrated to editors like using LLDB-DAP in Kate,
but sometimes GDB in terminal is all you can use, so it&#x27;s good idea to learn to use it!&lt;&#x2F;p&gt;
&lt;p&gt;One big thing I worked on with others was fractional scaling related stuff: I didn&#x27;t do any of the Kwin stuff around it,
but I hunted down some weird bugs with window decorations having some weird gaps in them when windows are specific size.
Hunting down all these bugs and weirdness took long time, and we&#x27;re still looking into it, since it seems to be different in every system..
Floating point numbers and computers are very weird combo.&lt;&#x2F;p&gt;
&lt;p&gt;Another more visible thing I did was unifying separator colors and other items, you can find an issue about it here: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;teams&#x2F;vdg&#x2F;issues&#x2F;-&#x2F;issues&#x2F;38&quot;&gt;Frame and outline color consistency and high-contrast setting changes&lt;&#x2F;a&gt;.
I have been bothered by the random differences between some elements, which can be especially noticeable in darker colorschemes,
so I finally sat down and combed through related codebases. There&#x27;s likely more to fix though, but there is now easy way for us to add
high-contrast support for outlining elements! It just needs doing, and I haven&#x27;t had the time.. Yet. :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;things-i-learned&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#things-i-learned&quot; aria-label=&quot;Anchor link for: things-i-learned&quot;&gt;Things I learned&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;GDB is a life saver&lt;&#x2F;li&gt;
&lt;li&gt;Write down notes. All the time.
&lt;ul&gt;
&lt;li&gt;Journaling is a good idea!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Working in open source is a lot about the social aspects!
&lt;ul&gt;
&lt;li&gt;Be nice to people! Duh!&lt;&#x2F;li&gt;
&lt;li&gt;But also don&#x27;t let people walk over you!&lt;&#x2F;li&gt;
&lt;li&gt;Listen to others, and don&#x27;t be afraid to share your opinion.&lt;&#x2F;li&gt;
&lt;li&gt;Ask many questions and write down the answers.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Be patient&lt;&#x2F;li&gt;
&lt;li&gt;Bug triaging is tough, but very important!&lt;&#x2F;li&gt;
&lt;li&gt;Remember to rest (I&#x27;m bad at this)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;things-i-will-do-in-future&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#things-i-will-do-in-future&quot; aria-label=&quot;Anchor link for: things-i-will-do-in-future&quot;&gt;Things I will do in future&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I will continue hunting down various bugs and crashes and fixing them whenever I spot some, or
something is raised to me as &quot;hey this looks like something you could do.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;I have also started working on couple things related to remote desktop:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;network&#x2F;krdc&#x2F;-&#x2F;merge_requests&#x2F;93&quot;&gt;rdp: Proxy and Gateway settings&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;krdp&#x2F;-&#x2F;merge_requests&#x2F;16&quot;&gt;Simple KCM for KRDP&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Last but not least, I have looked into facelifting our dear Breeze theme, just a lil bit. Nothing drastic,
some tell me they don&#x27;t see any change and some do. But hopefully it would make Breeze look
just a lil bit &quot;softer&quot; and &quot;friendlier.&quot; :) You can see them here: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;449&quot;&gt;Slightly rounder elements, slightly lighter outlines&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;All in all I am very happy with my current job working on KDE projects, fixing bugs and creating new cool things.
I also kind of enjoy being a jack-of-all-trades (master of none),
since I get to do a lot of different kinds of stuff, from something more &quot;background&quot;
like KWin and plasmashell to something more visible like Breeze and Dolphin.
Maybe eventually I will specialize around something, but for now I am bit all over the place which is fine by me lol.&lt;&#x2F;p&gt;
&lt;p&gt;I hope that some of my work has helped you as well. :)&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll keep doing my best and learning more. (And hopefully write more blogposts.. lol.)&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Debug symbols for all!</title>
          <pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>development</category>
            
              <category>debugging</category>
            
              <category>linux</category>
            <link>https://akselmo.dev/posts/debug-symbols-for-all/</link>
          <guid>https://akselmo.dev/posts/debug-symbols-for-all/</guid>
          <description>&lt;p&gt;When running Linux software and encountering a crash, and you make a bug&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
report about it (thank you!), you may be asked for backtraces and debug symbols.&lt;&#x2F;p&gt;
&lt;p&gt;And if you&#x27;re not developer you may wonder what in the heck are those?&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to open up this topic a bit, but if you want more technical
in-depth look into these things, internet is full of info. :)&lt;&#x2F;p&gt;
&lt;p&gt;This is more a &lt;strong&gt;guide for any common user&lt;&#x2F;strong&gt; who encounters
this situation and what they can do to get these mystical backtraces and symbols and
magic to the devs.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;backtrace&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#backtrace&quot; aria-label=&quot;Anchor link for: backtrace&quot;&gt;Backtrace&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;When developers ask for a backtrace, they&#x27;re basically asking &quot;what are the steps that caused this crash to happen?&quot;
Debugger software can show this really nicely, line by line. However without correct debug symbols,
the backtrace can be meaningless.&lt;&#x2F;p&gt;
&lt;p&gt;But first, how do you get a backtrace of something?&lt;&#x2F;p&gt;
&lt;p&gt;On systems with systemd installed, you often have a terminal tool called &lt;code&gt;coredumpctl&lt;&#x2F;code&gt;.
This tool can list many crashes you have had with software. When you see something say
&quot;segmentation fault, core dumped&quot;, this is the tool that can show you those core dumps.&lt;&#x2F;p&gt;
&lt;p&gt;So, here&#x27;s a few ways to use it!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-to-see-all-my-crashes-coredumps&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-see-all-my-crashes-coredumps&quot; aria-label=&quot;Anchor link for: how-to-see-all-my-crashes-coredumps&quot;&gt;How to see all my crashes (coredumps)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Just type &lt;code&gt;coredumpctl&lt;&#x2F;code&gt; in terminal and a list opens. It shows you a lot of information and
last the app name.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-to-open-a-specific-coredump-in-a-debugger&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-open-a-specific-coredump-in-a-debugger&quot; aria-label=&quot;Anchor link for: how-to-open-a-specific-coredump-in-a-debugger&quot;&gt;How to open a specific coredump in a debugger&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First, check from the plain &lt;code&gt;coredumpctl&lt;&#x2F;code&gt; list the coredump you want to check out.
Easiest way to deduce it is to check the date and time. After that, there&#x27;s something called &lt;code&gt;PID&lt;&#x2F;code&gt; number, for example &lt;code&gt;12345&lt;&#x2F;code&gt;.
You can close the list by pressing &lt;code&gt;q&lt;&#x2F;code&gt; and then type &lt;code&gt;coredumpctl debug 12345&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This will often open GDB, where you can type &lt;code&gt;bt&lt;&#x2F;code&gt; for it to start printing the backtrace.
You can then copy that backtrace. But there&#x27;s IMO easier way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;can-i-just-get-the-backtrace-automatically-in-a-file&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#can-i-just-get-the-backtrace-automatically-in-a-file&quot; aria-label=&quot;Anchor link for: can-i-just-get-the-backtrace-automatically-in-a-file&quot;&gt;Can I just get the backtrace automatically in a file..?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you only want the latest coredump of the app that crashed on you, then print the backtrace
in a text file that you can just send to devs, here&#x27;s a oneliner to run in terminal:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span&gt;coredumpctl debug APP_NAME_HERE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt; -A &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5fff33;&quot;&gt;&amp;quot;-ex bt -ex quit&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;|&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;tee backtrace.txt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can also use the &lt;code&gt;PID&lt;&#x2F;code&gt; shown earlier in place of the app name, if you want some
specific coredump.&lt;&#x2F;p&gt;
&lt;p&gt;The above command will open the coredump in a debugger, then run &lt;code&gt;bt&lt;&#x2F;code&gt; command, then quit,
and it will write it all down in a file called &lt;code&gt;backtrace.txt&lt;&#x2F;code&gt; that you can share with developers.&lt;&#x2F;p&gt;
&lt;p&gt;As always when using debugging and logging features, &lt;strong&gt;check the file for possible personal data!&lt;&#x2F;strong&gt;
It&#x27;s very unlikely to have anything personal data, BUT it&#x27;s still a good practice to check it!&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a small snippet from a backtrace I have for Kate text editor:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bt&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-bt &quot;&gt;&lt;code class=&quot;language-bt&quot; data-lang=&quot;bt&quot;&gt;&lt;span&gt;#0  __pthread_kill_implementation (threadid=&amp;lt;optimized out&amp;gt;, signo=signo@entry=6, no_tid=no_tid@entry=0)
&lt;&#x2F;span&gt;&lt;span&gt;    at pthread_kill.c:44
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;#18 0x00007f5653fbcdb9 in parse_file
&lt;&#x2F;span&gt;&lt;span&gt;    (table=table@entry=0x19d5a60, file=file@entry=0x19c8590, file_name=file_name@entry=0x7f5618001590 &amp;quot;&#x2F;usr&#x2F;share&#x2F;X11&#x2F;locale&#x2F;en_US.UTF-8&#x2F;Compose&amp;quot;) at ..&#x2F;src&#x2F;compose&#x2F;parser.c:749
&lt;&#x2F;span&gt;&lt;span&gt;#19 0x00007f5653fc5ce0 in xkb_compose_table_new_from_locale
&lt;&#x2F;span&gt;&lt;span&gt;    (ctx=0x1b0cc80, locale=0x18773d0 &amp;quot;en_IE.UTF-8&amp;quot;, flags=&amp;lt;optimized out&amp;gt;) at ..&#x2F;src&#x2F;compose&#x2F;table.c:217
&lt;&#x2F;span&gt;&lt;span&gt;#20 0x00007f565138a506 in QtWaylandClient::QWaylandInputContext::ensureInitialized (this=0x36e63c0)
&lt;&#x2F;span&gt;&lt;span&gt;    at &#x2F;usr&#x2F;src&#x2F;debug&#x2F;qt6-qtwayland-6.6.0-1.fc39.x86_64&#x2F;src&#x2F;client&#x2F;qwaylandinputcontext.cpp:228
&lt;&#x2F;span&gt;&lt;span&gt;#21 QtWaylandClient::QWaylandInputContext::ensureInitialized (this=0x36e63c0)
&lt;&#x2F;span&gt;&lt;span&gt;    at &#x2F;usr&#x2F;src&#x2F;debug&#x2F;qt6-qtwayland-6.6.0-1.fc39.x86_64&#x2F;src&#x2F;client&#x2F;qwaylandinputcontext.cpp:214
&lt;&#x2F;span&gt;&lt;span&gt;#22 QtWaylandClient::QWaylandInputContext::filterEvent (this=0x36e63c0, event=0x7ffd27940c50)
&lt;&#x2F;span&gt;&lt;span&gt;    at &#x2F;usr&#x2F;src&#x2F;debug&#x2F;qt6-qtwayland-6.6.0-1.fc39.x86_64&#x2F;src&#x2F;client&#x2F;qwaylandinputcontext.cpp:252
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first number is the step where we are. Step &lt;code&gt;#0&lt;&#x2F;code&gt; is where the app crashes.
The last step is where the application starts running.
Keep in mind though that even the app crashes at &lt;code&gt;#0&lt;&#x2F;code&gt; that may be just the computer handling the crash,
instead of the actual culprit. The culprit for the crash can be anywhere in the backtrace. So you
have to do some detective work if you want to figure it out. Often crashes happen when some
code execution path goes in unexpected route, and the program is not prepared for that.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Remember that you will, however, need proper debug symbols for this to be useful!&lt;&#x2F;strong&gt;
We&#x27;ll check that out in the next chapter.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;debug-symbols&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#debug-symbols&quot; aria-label=&quot;Anchor link for: debug-symbols&quot;&gt;Debug symbols&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Debug symbols are something that tells
the developer using debugger software, like GDB, what is going on and where.
Without debugging symbols the debugger can only show the developer
more obfuscated data.&lt;&#x2F;p&gt;
&lt;p&gt;I find this easier to show with an example:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Without debug symbols&lt;&#x2F;strong&gt;, this is what the developer sees when reading the backtrace:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#181818;color:#ffffff;&quot;&gt;&lt;code&gt;&lt;span&gt;0x00007f7e9e29d4e8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from &#x2F;lib64&#x2F;libQt5Core.so.5
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or even worse case scenario, where the debugger can&#x27;t read what&#x27;s going on but only can see the
&quot;mangled&quot; names, it can look like this:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#181818;color:#ffffff;&quot;&gt;&lt;code&gt;&lt;span&gt;_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, those are not very helpful. At least the first example tells what file the error is happening in,
but it doesn&#x27;t really tell where. And the second example is just very difficult to understand what&#x27;s going on.
You don&#x27;t even see what file it is.&lt;&#x2F;p&gt;
&lt;p&gt;With &lt;strong&gt;correct debug symbols&lt;&#x2F;strong&gt; installed however, this is what the developer sees:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#181818;color:#ffffff;&quot;&gt;&lt;code&gt;&lt;span&gt;QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fe88c001620, event=0x7fe888002c20) at kernel&#x2F;qcoreapplication.cpp:1064
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see, it shows the file &lt;em&gt;and&lt;&#x2F;em&gt; line. This is super helpful since developers can just
open the file in this location and start mulling it over. No need to guess what line it may have happened,
it&#x27;s right there!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-where-to-get-the-debug-symbols&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#so-where-to-get-the-debug-symbols&quot; aria-label=&quot;Anchor link for: so-where-to-get-the-debug-symbols&quot;&gt;So, where to get the debug symbols?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Every distro has it&#x27;s own way, but KDE wiki has an excellent list of most common operating systems and how to get debug symbols for them:
&lt;a href=&quot;https:&#x2F;&#x2F;community.kde.org&#x2F;Guidelines_and_HOWTOs&#x2F;Debugging&#x2F;How_to_create_useful_crash_reports&quot;&gt;https:&#x2F;&#x2F;community.kde.org&#x2F;Guidelines_and_HOWTOs&#x2F;Debugging&#x2F;How_to_create_useful_crash_reports&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As always, double check with &lt;strong&gt;your distros official documentation&lt;&#x2F;strong&gt; how to proceed. But the above link is a good
starting point!&lt;&#x2F;p&gt;
&lt;p&gt;But basically, your package manager should have them.
If not, you will have to build the app yourself with debug symbols enabled, which is definitely not ideal..
If the above list does not have your distro&#x2F;OS, you may have to ask the maintainers of your distro&#x2F;OS for help with getting the debug symbols installed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wait-which-ones-do-i-download&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wait-which-ones-do-i-download&quot; aria-label=&quot;Anchor link for: wait-which-ones-do-i-download&quot;&gt;Wait, which ones do I download?!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Usually the ones for the app that is crashing. Sometimes you may also need include the libraries the app is using.&lt;&#x2F;p&gt;
&lt;p&gt;There is no real direct answer this, but at the very least, get debug symbols for the app. If developers need
more, they will ask you to install the other ones too.&lt;&#x2F;p&gt;
&lt;p&gt;You can uninstall the debug symbols after you&#x27;re done, but that&#x27;s up to you.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;thanks-for-reading&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#thanks-for-reading&quot; aria-label=&quot;Anchor link for: thanks-for-reading&quot;&gt;Thanks for reading!&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I hope this has been useful! I especially hope the terminal &quot;oneliner&quot; command
mentioned above for printing backtraces quickly into a file is useful for you!&lt;&#x2F;p&gt;
&lt;p&gt;Happy backtracing! :)&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>First week of fulltime KDE</title>
          <pubDate>Sat, 11 Nov 2023 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>personal</category>
            
              <category>kde</category>
            
              <category>software</category>
            <link>https://akselmo.dev/posts/first-week-of-fulltime-kde/</link>
          <guid>https://akselmo.dev/posts/first-week-of-fulltime-kde/</guid>
          <description>&lt;p&gt;Seems getting laid off was pretty good for me after all. Funny how things go sometimes.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A company that works on KDE stuff (and other Linuxy things),
interviewed me for a fun job: &quot;Wanna help us work on KDE Plasma?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;You bet I said YES!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So now I work daily 8 hours a day, 5 days a week, to improve KDE Plasma!
It&#x27;s contract work, but I hope people there like me a lot to keep me around. :)
At least I am planning to be around for the long haul!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Anyway, this was my first week doing this job!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Everyone I work with is really nice and most of them I have already met during my contribution
adventures.&lt;&#x2F;p&gt;
&lt;p&gt;The job itself for now has been about helping finding and fixing bugs in KDE Plasma. I&#x27;ve
mostly concentrated on bugs that can appear when moving from 5 to 6, like migrating configs, etc.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s some other stuff I&#x27;m doing as well, but they&#x27;re not that visible to end user, necessarily.
Like fixing warnings.&lt;&#x2F;p&gt;
&lt;p&gt;I am also focusing on learning the stack and hopefully eventually get to work more on Flatpak related
things and Kwin related things, since those interest me. I am also hoping to help with accessibility,
like high-contrast color schemes and such. And who knows what else I will work on in future!&lt;&#x2F;p&gt;
&lt;p&gt;Also due to my experience in test automation, I have taken on the sidequest to help with that part as well.
I have been quite interested how test automation of Linux desktop apps works, and there&#x27;s quite cool
stuff going on there.&lt;&#x2F;p&gt;
&lt;p&gt;In my &lt;strong&gt;personal&lt;&#x2F;strong&gt; KDE plans, I want to add color customization options for separators, since those can be used
in high contrast themes. But since it would be any custom color the user wants, well, they can
set it to anything. Anyhow, I will first prioritize fixing bugs and learning more.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you so much for the company who took me under their wing. And thanks to my colleagues
for helping me get into this and teaching me things, even when my questions can be a bit dumb at times.. :&#x27;D
You know who you are!&lt;&#x2F;p&gt;
&lt;p&gt;Expect more posts in future about what I learn during this job! :)&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Zephyr - My Breeze fork</title>
          <pubDate>Mon, 25 Sep 2023 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>personal</category>
            
              <category>kde</category>
            
              <category>software</category>
            <link>https://akselmo.dev/posts/zephyr-breeze-fork/</link>
          <guid>https://akselmo.dev/posts/zephyr-breeze-fork/</guid>
          <description>&lt;p&gt;I had the hankering for tinkering the KDE application style. The default style by KDE, &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&quot;&gt;Breeze&lt;&#x2F;a&gt;,
is pretty nice as is, but there are small things I&#x27;d like to modify.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulmcauley&#x2F;klassy&quot;&gt;Klassy&lt;&#x2F;a&gt; which is quite customizable and fun,
but I don&#x27;t really need all of the settings it has.&lt;&#x2F;p&gt;
&lt;p&gt;Then there&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tsujan&#x2F;Kvantum&#x2F;tree&#x2F;master&#x2F;Kvantum&quot;&gt;Kvantum&lt;&#x2F;a&gt; which uses SVG files to
create a theme, but they don&#x27;t follow KDE colorschemes. And I dislike working with SVG files.&lt;&#x2F;p&gt;
&lt;p&gt;Both are brilliant for their usecases, but I wanted just Breeze with few changes.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;fork-time&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fork-time&quot; aria-label=&quot;Anchor link for: fork-time&quot;&gt;Fork time!&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;zephyr&#x2F;screenshot.png&quot; alt=&quot;Screenshot Zephyr style in action&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So, I did what one has to do, forked Breeze and renamed &lt;em&gt;everything&lt;&#x2F;em&gt; Breeze related to Zephyr.
I chose Zephyr because it was synonym for Breeze in Thesaurus lol. Also, it makes sure it&#x27;s last
in the list of the application styles, so people don&#x27;t accidentally confuse it to Breeze.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s link to the repository: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;Zephyr&quot;&gt;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;Zephyr&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Installation help is also there, but feel free to make issue and&#x2F;or merge requests for adding stuff like
what packages one has to install for their distro.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately due to the massive size of the Breeze Gitlab repo,
I didn&#x27;t want to flood Codeberg with the whole history.
So, some of the history got lost. I have mentioned it in the readme file though.&lt;&#x2F;p&gt;
&lt;p&gt;After renaming all the things, the whole thing built and installed surprisingly easily.&lt;&#x2F;p&gt;
&lt;p&gt;I then implemented following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Black outline setting, so the default outline has a black one around it.
&lt;ul&gt;
&lt;li&gt;Why? Idk looks cool. Not really other reason.&lt;&#x2F;li&gt;
&lt;li&gt;Yes, it can be disabled.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Traffic color icons in window deco
&lt;ul&gt;
&lt;li&gt;I am allergic to Apple but the traffic light concept just makes sense to me.&lt;&#x2F;li&gt;
&lt;li&gt;Also can be enabled or disabled&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Customizable style frame and window deco outline colors
&lt;ul&gt;
&lt;li&gt;You can completely change the frame colors.&lt;&#x2F;li&gt;
&lt;li&gt;You can also make them invisible! No outlines, no frames! Fun!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Slightly rounder windows and buttons
&lt;ul&gt;
&lt;li&gt;At some point I will make a setting for these too, but now they&#x27;re applied when the thing is built&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Fitting Plasma style if you use the defaults Zephyr offers (mostly black outlines)
&lt;ul&gt;
&lt;li&gt;The plasma theme buttons do not match the application style in roundness, yet.&lt;&#x2F;li&gt;
&lt;li&gt;I am lazy and avoid working with SVG files as long as I can&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;why&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;Why&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;For fun! For learning! And I wanted to make something that is super close to Breeze (hell, it &lt;em&gt;is&lt;&#x2F;em&gt; Breeze, just few mods),
but still has it&#x27;s own charm and how I like seeing my desktop.&lt;&#x2F;p&gt;
&lt;p&gt;It also can work as a great test bench for others who want to see if they can modify application style.&lt;&#x2F;p&gt;
&lt;p&gt;Just rename anything Zephyr to YourForkNameHere and have fun. But it&#x27;s probably better to fork the original Breeze project :)&lt;&#x2F;p&gt;
&lt;p&gt;Also, when making my own things for Breeze, it&#x27;s nice to just implement them in something similar but different name so I can test
the changes for longer period of time. And if I like the changes I can maybe show them to upstream.&lt;&#x2F;p&gt;
&lt;p&gt;In future, I will make it work with Plasma 6 (unless i feel lazy). Probably will have to fork Breeze then again
and apply my changes. Hopefully it&#x27;s not too big of a change.&lt;&#x2F;p&gt;
&lt;p&gt;Also, I will be working on the actual Breeze in future too! I hope to implement separator colors
for the Plasma colorscheme, so basically you can change the color of all frames and outlines
and whatnot. This kinda helped me to figure how that works as well!&lt;&#x2F;p&gt;
&lt;p&gt;All in all, good project, I keep tinkering with it and it helps me understand the Breeze styling
and Qt in general more.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;revontuli-and-zephyr&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#revontuli-and-zephyr&quot; aria-label=&quot;Anchor link for: revontuli-and-zephyr&quot;&gt;Revontuli and Zephyr&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;My colorscheme &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;Revontuli&quot;&gt;Revontuli&lt;&#x2F;a&gt; works really well together with Zephyr.
So, feel free to give them a go!&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading as usual!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>I made outlines for KDE Breeze window decoration</title>
          <pubDate>Mon, 31 Oct 2022 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>development</category>
            
              <category>software</category>
            
              <category>kde</category>
            <link>https://akselmo.dev/posts/i-made-outlines-for-kde-breeze/</link>
          <guid>https://akselmo.dev/posts/i-made-outlines-for-kde-breeze/</guid>
          <description>&lt;p&gt;Window outlines! Yet another KDE contribution by yours truly! &lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt; This was fun.
Not easy at all, but fun. I&#x27;m pretty happy how they turned out.&lt;&#x2F;p&gt;
&lt;p&gt;Breeze Dark&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_dark.jpg&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_dark.jpg&quot; alt=&quot;Outline Dark&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Breeze Light&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_light.jpg&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_light.jpg&quot; alt=&quot;Outline Light&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I hope Nate you don&#x27;t mind me taking the screenshots from your &lt;a href=&quot;https:&#x2F;&#x2F;pointieststick.com&#x2F;2022&#x2F;10&#x2F;28&#x2F;this-week-in-kde-next-generation-improvements&#x2F;&quot;&gt;blog post&lt;&#x2F;a&gt;, I&#x27;m just.. Lazy. I have no excuse. Lol.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For those who just want to see how it&#x27;s made, here&#x27;s link to the merge request: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;241&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;241&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Also I am probably gonna make couple LOTR references due to talking about binding and light and dark and I&#x27;m sorry about that beforehand.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;but-why-make-them&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#but-why-make-them&quot; aria-label=&quot;Anchor link for: but-why-make-them&quot;&gt;But why make them?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I have big problem making distinctions between windows if they have dark theme and on top of each other. Window shadows are often
dark as well, so the windows just kind of blend into each other and the shadows do not help much. Disable shadows altogether and you got
windows that just disappear into each other. This can even happen with light themes, sometimes the shadows just are not enough.&lt;&#x2F;p&gt;
&lt;p&gt;They also look a bit better with the outlines, in my opinion. They give some kind of &quot;constraint&quot; for the window and they
ease my weird brain.&lt;&#x2F;p&gt;
&lt;p&gt;To sum up, it just makes the windows feel like they&#x27;re their own entities which calms my brain, they look nice and
they stop windows from blending into each other.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-are-they-drawn&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#where-are-they-drawn&quot; aria-label=&quot;Anchor link for: where-are-they-drawn&quot;&gt;Where are they drawn?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First I had to figure out where the hecc I draw these outlines?&lt;&#x2F;p&gt;
&lt;p&gt;Well, I wanted to make them their own thing, separated completely from other elements. But this would&#x27;ve meant
I would need to actually make more in-depth modifications to KDecoration (I think?) and make the outlines their own
draw calls and whatnot.&lt;&#x2F;p&gt;
&lt;p&gt;So instead, I made them play nice with shadows. Basically, the outlines are just part of the shadow drawcall.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;But what happens if shadows are disabled?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Something cheeky happens! I actually draw the shadows with 0% alpha channel!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;    CompositeShadowParams params &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;lookupShadowParams(m_internalSettings-&amp;gt;shadowSize());
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(params.isNone()) {
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; If shadows are disabled, set shadow opacity to 0.
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; This allows the outline effect to show up without the shadow effect.
&lt;&#x2F;span&gt;&lt;span&gt;        params &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;CompositeShadowParams(QPoint(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;), ShadowParams(QPoint(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;), ShadowParams(QPoint(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;));
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So the shadows are always there, they&#x27;re just invisible. But the outlines will show up.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Hold on, you could&#x27;ve just skipped drawing shadows entirely!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Yes, but actually no.&lt;&#x2F;p&gt;
&lt;p&gt;Before shadows are even drawn, they make some very very useful calculations for me. And on top of that, remember that
outlines are part of the shadow drawcall. Outlines are just one more colored part of the shadow, basically.&lt;&#x2F;p&gt;
&lt;p&gt;No shadows, no outlines. In darkness together, I&#x27;ve bound them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bordering-madness&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bordering-madness&quot; aria-label=&quot;Anchor link for: bordering-madness&quot;&gt;Bordering madness&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I get it all look nice and fancy with borders, they look all nice and rounded on bottom border... And then I disable borders.&lt;&#x2F;p&gt;
&lt;p&gt;And everything looks off.&lt;&#x2F;p&gt;
&lt;p&gt;The bottom border disappears completely and leaves a sharp window edge. The outline then rounds behind the window.
It looks bad!!!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_bad.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_bad.png&quot; alt=&quot;Outline Bad&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So, if borders are disabled, we do a magic trick and draw the outline path on our own.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Draw window outline
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; qreal outlineWidth &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1.001&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; qreal penOffset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; outlineWidth &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Titlebar already has an outline, so move the top of the outline on the same level to avoid 2px width on top outline.
&lt;&#x2F;span&gt;&lt;span&gt;    QRectF outlineRect &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; innerRect &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;QMarginsF(penOffset, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;penOffset, penOffset, penOffset);
&lt;&#x2F;span&gt;&lt;span&gt;    qreal cornerSize &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;m_scaledCornerRadius &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    QRectF &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#838fff;&quot;&gt;cornerRect&lt;&#x2F;span&gt;&lt;span&gt;(outlineRect.x(), outlineRect.y(), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;cornerSize&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;cornerSize&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    QPainterPath outlinePath;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    outlinePath.arcMoveTo(cornerRect, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;180&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    outlinePath.arcTo(cornerRect, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;180&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;90&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    cornerRect.moveTopRight(outlineRect.topRight());
&lt;&#x2F;span&gt;&lt;span&gt;    outlinePath.arcTo(cornerRect, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;90&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;90&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Check if border size is &amp;quot;no borders&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(borderSize(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;        outlinePath.lineTo(outlineRect.bottomRight());
&lt;&#x2F;span&gt;&lt;span&gt;        outlinePath.lineTo(outlineRect.bottomLeft());
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        cornerRect.moveBottomRight(outlineRect.bottomRight());
&lt;&#x2F;span&gt;&lt;span&gt;        outlinePath.arcTo(cornerRect, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;90&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;        cornerRect.moveBottomLeft(outlineRect.bottomLeft());
&lt;&#x2F;span&gt;&lt;span&gt;        outlinePath.arcTo(cornerRect, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;270&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;90&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    outlinePath.closeSubpath();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This part was actually fixed by Noah Davis: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;241#note_541478&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;241#note_541478&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So, uh, I&#x27;m not 100% sure what&#x27;s going on here but it seems that:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Draw a rectangle with top left and top right with an arc, since they&#x27;re always rounded&lt;&#x2F;li&gt;
&lt;li&gt;Check if we have border on or off&lt;&#x2F;li&gt;
&lt;li&gt;Draw bottom corners with an arc if borders are on, or draw sharp lines if they&#x27;re off&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I think I got it right..? But I can say, my solution was more messy and I&#x27;m glad it&#x27;s not there. It involved basically blending two rectangles
together. This is &lt;em&gt;much&lt;&#x2F;em&gt; better!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;outline-colors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#outline-colors&quot; aria-label=&quot;Anchor link for: outline-colors&quot;&gt;Outline colors!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The biggest puzzle of this was actually how to get the color for the outlines. We could have just gone with basic
black and white coloring here, but it would be too much contrast in some situations and look jarring to some.&lt;&#x2F;p&gt;
&lt;p&gt;So I started with a simple idea: Take the background color of the window, then light or dim it based on its lightness value (HSL).
If lightness is equal or over 50%, then dim the color. Otherwise lighten it.&lt;&#x2F;p&gt;
&lt;p&gt;At first I used HSV, which caused a bit weird situations.
In HSL, lightness is basically how much the color is lightened or darkened, but in HSV, the value dictates how the color acts under light.
For this situation HSL was better since we&#x27;re not playing with lighting values, but just want to know if the color is &quot;dark&quot; or &quot;light&quot; to our eyes.&lt;&#x2F;p&gt;
&lt;p&gt;Anyhow, here&#x27;s some copy-pasta from the source files:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#181818;color:#ffffff;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;auto&lt;&#x2F;span&gt;&lt;span&gt; s &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;settings();
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;auto&lt;&#x2F;span&gt;&lt;span&gt; c &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;client().toStrongRef();
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#33ffff;&quot;&gt;auto&lt;&#x2F;span&gt;&lt;span&gt; outlineColor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; c-&amp;gt;color(c-&amp;gt;isActive() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span&gt; ColorGroup::Active &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; ColorGroup::Inactive, ColorRole::TitleBar);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Bind lightness between 0.1 and 1.0 so it can never be completely black.
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&#x2F;&#x2F; Outlines only have transparency if alpha channel is supported
&lt;&#x2F;span&gt;&lt;span&gt;    outlineColor.setHslF(outlineColor.hslHueF(),
&lt;&#x2F;span&gt;&lt;span&gt;                         outlineColor.hslSaturationF(),
&lt;&#x2F;span&gt;&lt;span&gt;                         qBound(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0.1&lt;&#x2F;span&gt;&lt;span&gt;, outlineColor.lightnessF(), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;                         s-&amp;gt;isAlphaChannelSupported() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;0.9 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#33ffa0;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff9233;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;Hold on, you said background color of the window, but you&#x27;re using titlebar color?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When using the background color &lt;code&gt;ColorRole::Frame&lt;&#x2F;code&gt; the problem is that when having colored titlebar, the outline color feels
&lt;em&gt;very&lt;&#x2F;em&gt; out of place. It just doesn&#x27;t look good.&lt;&#x2F;p&gt;
&lt;p&gt;But using &lt;code&gt;ColorRole::TitleBar&lt;&#x2F;code&gt; we get a fun colored outline effect when having a separately colored titlebar!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_colored.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;outline_colored.png&quot; alt=&quot;Outline Colored&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Also there&#x27;s the whole &lt;code&gt;qBound(0.1, outlineColor.lightnessF(), 1.0)&lt;&#x2F;code&gt; thing. Like the comment says, if the lightness value is black or very dark,
the outline will also be black or very dark. Binding the lightness avoids situations where the outline
blends into the dark background color.&lt;&#x2F;p&gt;
&lt;p&gt;And of course, finally we check if transparency is enabled and set it accordingly to avoid awkward situations.&lt;&#x2F;p&gt;
&lt;p&gt;But colors are tricky. Some like this solution, some don&#x27;t. I am &lt;em&gt;probably&lt;&#x2F;em&gt; going to make a drop-down setting where people can select
does the outline use background or titlebar color, or are they just off.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;continuous-iteration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#continuous-iteration&quot; aria-label=&quot;Anchor link for: continuous-iteration&quot;&gt;Continuous Iteration&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;My part was done and the outlines got merged! It was long long long ride and I learned a lot. But I&#x27;m super happy I managed to
do this part, now it just needs to be iterated on so we can get something that looks &lt;strong&gt;The Best.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Nate Graham already made the colors &lt;strong&gt;pop&lt;&#x2F;strong&gt; a bit more by fixing the lighten&#x2F;darken values: &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;263&quot;&gt;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;breeze&#x2F;-&#x2F;merge_requests&#x2F;263&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Also there was initially a feature that if the window color was super light, we just didn&#x27;t show outlines at all due to the outlines being so dim
it created a weird blur effect as the outlines were gray, the shadow black and the window white. But with this tweak that doesn&#x27;t need to be done anymore.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s still probably work to be done on this, but the biggest hurdle seems to be over! &lt;em&gt;Knocks on wood&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As I said, I may make the settings section for this, but we&#x27;ll see. I need a short break from KDE contributions, I got my own projects to work on too lol.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s also been talk that we could use the separator (the &lt;code&gt;|&lt;&#x2F;code&gt; thing that separates buttons in menus etc etc) color as the outline color, and make that separator color
modifiable. I think that would make A Lot Of Sense... But I would still keep the outline color as the titlebar color if the titlebar is colored. :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thanks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#thanks&quot; aria-label=&quot;Anchor link for: thanks&quot;&gt;Thanks!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Thanks for reading this ramble. I really enjoyed making this contribution and once again I learned &lt;strong&gt;A LOT&lt;&#x2F;strong&gt;. Open source contributions are great
way to learn new stuff and I&#x27;m happy I get to make stuff like this for KDE. Also I&#x27;ve learned I kinda enjoy writing C++!&lt;&#x2F;p&gt;
&lt;p&gt;And thanks for all the comments and feedback and code reviews and &lt;em&gt;everything&lt;&#x2F;em&gt; anyone did to help me get this outline thing through.
Based on the feedback I&#x27;ve read on Da Internets, this is something many people didn&#x27;t realise they needed!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Uploaded my themes to KDE Store</title>
          <pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>foss</category>
            <link>https://akselmo.dev/posts/uploaded-my-themes-to-kde-store/</link>
          <guid>https://akselmo.dev/posts/uploaded-my-themes-to-kde-store/</guid>
          <description>&lt;p&gt;Hey, just a quick post, I uploaded some themes I&#x27;ve made for Aurorae and Plasma to KDE store.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;They&#x27;re simple themes that follow your colorscheme but are made for dark color schemes.
The accent themes follow your accent color for the outlines.&lt;&#x2F;p&gt;
&lt;p&gt;The reason I made these themes is that I need a strong outline around my windows and other elements: Otherwise all the windows I have just &quot;blend&quot; together no matter how strong shadow I have enabled.&lt;&#x2F;p&gt;
&lt;p&gt;Aurorae Themes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;store.kde.org&#x2F;p&#x2F;1887649&quot;&gt;Without accent color&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;store.kde.org&#x2F;p&#x2F;1887668&quot;&gt;With accent color&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Plasma Themes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;store.kde.org&#x2F;p&#x2F;1887659&quot;&gt;Without accent color&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;store.kde.org&#x2F;p&#x2F;1887679&quot;&gt;With accent color&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here&#x27;s screenshots of them in use:&lt;&#x2F;p&gt;
&lt;p&gt;Without accent outlines:
&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;no_accent.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;no_accent.png&quot; alt=&quot;Non-accented theme&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;With accent outlines:
&lt;a href=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;with_accent.png&quot;&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;with_accent.png&quot; alt=&quot;Accented theme&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And finally, link to the repository: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;aks_themes&quot;&gt;https:&#x2F;&#x2F;codeberg.org&#x2F;akselmo&#x2F;aks_themes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I hope you like them!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>I added some localization settings to KDE</title>
          <pubDate>Thu, 18 Aug 2022 00:00:00 +0000</pubDate>
          <author>Akseli</author>
              <category>kde</category>
            
              <category>software</category>
            
              <category>foss</category>
            <link>https://akselmo.dev/posts/i-added-localization-settings-for-kde/</link>
          <guid>https://akselmo.dev/posts/i-added-localization-settings-for-kde/</guid>
          <description>&lt;p&gt;This was my biggest contribution so far! And it was a bit more involved than I expected,
so I wanted to write down what I learned.&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a screenshot:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;images&#x2F;kde&#x2F;kdecontrib1.png&quot; alt=&quot;KDE Locale settings in system settings, the ones I added are outlined in red&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I added the settings there that are in the red box. I also added the &lt;code&gt;Paper size&lt;&#x2F;code&gt; setting earlier in another
contribution, but it was pretty simple.&lt;&#x2F;p&gt;
&lt;p&gt;This was not, since Qt did not have builtin functions for these three settings: &lt;code&gt;LC_ADDRESS&lt;&#x2F;code&gt;, &lt;code&gt;LC_NAME&lt;&#x2F;code&gt; and &lt;code&gt;LC_TELEPHONE&lt;&#x2F;code&gt;.
I assume it&#x27;s because only &lt;code&gt;glibc&lt;&#x2F;code&gt; has these settings.&lt;&#x2F;p&gt;
&lt;p&gt;Before I go any further, you can look at the commit in here:
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-workspace&#x2F;-&#x2F;commit&#x2F;c7c2a3a85e5b7f74dcb2eadc35defe9e4b55c737&quot;&gt;Add LC_ADDRESS, LC_IDENTIFICATION, LC_NAME and LC_TELEPHONE to region settings&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-settings-part-themselves&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-settings-part-themselves&quot; aria-label=&quot;Anchor link for: the-settings-part-themselves&quot;&gt;The settings part themselves&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Most of the settings was actually easy to implement, since I could follow the old parts of the code and just
reimplement them separately for the &lt;code&gt;LC_ADDRESS&lt;&#x2F;code&gt; and friends.&lt;&#x2F;p&gt;
&lt;p&gt;What gave me most trouble though, were the examples. My post will be mostly about them.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;figuring-out-how-to-parse-stuff&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#figuring-out-how-to-parse-stuff&quot; aria-label=&quot;Anchor link for: figuring-out-how-to-parse-stuff&quot;&gt;Figuring out how to parse stuff&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;To get a nice example to see what the locale you&#x27;re setting looks like, we have to pull the format string
from the locale object&#x2F;file.&lt;&#x2F;p&gt;
&lt;p&gt;For example, Finnish &lt;code&gt;postal_fmt&lt;&#x2F;code&gt; string is &lt;code&gt;%f%N%d%N%b%N%a%N%s %h%t%e%t%r%N%z %T%N%c%N&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Yeah, fun. This website was REALLY helpful during making this: &lt;a href=&quot;https:&#x2F;&#x2F;lh.2xlibre.net&#x2F;locale&#x2F;fi_FI&#x2F;&quot;&gt;https:&#x2F;&#x2F;lh.2xlibre.net&#x2F;locale&#x2F;fi_FI&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Archive it, cherish it.&lt;&#x2F;p&gt;
&lt;p&gt;I was going to make my own silly regexp parser thing, but luckily KDE has something called &lt;code&gt;KMacroExpander::expandMacros&lt;&#x2F;code&gt;,
that takes a hashmap and the format string. I gave the job to that method and it returned a nice parsed string.&lt;&#x2F;p&gt;
&lt;p&gt;However... How to get the correct locale? Now THIS, THIS was pain.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;nl-langinfo-or-nl-langinfo-l&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#nl-langinfo-or-nl-langinfo-l&quot; aria-label=&quot;Anchor link for: nl-langinfo-or-nl-langinfo-l&quot;&gt;nl_langinfo or nl_langinfo_l&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I just wanted to tell the C function that hey, I got this locale, how to get it&#x27;s format string?&lt;&#x2F;p&gt;
&lt;p&gt;After hours of searching, &lt;code&gt;nl_langinfo_l&lt;&#x2F;code&gt; seemed the obvious choice. Except that you need to give it
&lt;code&gt;locale_t&lt;&#x2F;code&gt; struct and I still don&#x27;t know what could give me that struct. There was only ways to make
new locales with &lt;code&gt;newlocale&lt;&#x2F;code&gt; and meanwhile it could duplicate existing locales, it also required &lt;code&gt;locale_t&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I tried to make my own &lt;code&gt;locale_t&lt;&#x2F;code&gt; at first since I couldn&#x27;t find any &lt;code&gt;getlocale_t&lt;&#x2F;code&gt; functions. It was messy
and it didn&#x27;t work, so I just groaned and tried to just use &lt;code&gt;nl_langinfo&lt;&#x2F;code&gt;. What this does is that it gets
the information of the locale that is currently active. Close, but not quite.&lt;&#x2F;p&gt;
&lt;p&gt;Due to being unable to get &lt;code&gt;locale_t&lt;&#x2F;code&gt; anywhere, I decided to do something a bit dirty. I set the locale
that the example is for with &lt;code&gt;setlocale&lt;&#x2F;code&gt;. So when the example is being built, the locale is active, and
thus &lt;code&gt;nl_langinfo&lt;&#x2F;code&gt; can get it&#x27;s data, without me having to create a new &lt;code&gt;locale_t&lt;&#x2F;code&gt; by hand.&lt;&#x2F;p&gt;
&lt;p&gt;It is not ideal solution. I got asked about it many times. But when I asked how to get &lt;code&gt;locale_t&lt;&#x2F;code&gt;,
it was just nowhere to be found. Nobody knew, and I don&#x27;t blame them. I quickly learned this locale stuff
is pretty much dark wizardry that only few understand.&lt;&#x2F;p&gt;
&lt;p&gt;At least the examples were &lt;em&gt;finally&lt;&#x2F;em&gt; working and I didn&#x27;t see any weird side-effects.&lt;&#x2F;p&gt;
&lt;p&gt;If you, my dear reader, know how to get &lt;code&gt;locale_t&lt;&#x2F;code&gt; from &lt;code&gt;QLocale&lt;&#x2F;code&gt;, do share and I&#x27;ll do this the proper way.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-if-the-locales-are-not-generated&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-if-the-locales-are-not-generated&quot; aria-label=&quot;Anchor link for: what-if-the-locales-are-not-generated&quot;&gt;What if the locales are not generated&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;I was told quickly that this will not work, if there&#x27;s no locales generated and all the locale files are still
in the &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;i18n&#x2F;locales&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;So you gotta parse those files. Have fun!&lt;&#x2F;p&gt;
&lt;p&gt;Well, I did actually. It sounded more difficult than it was, but with simple regex I could get the right value:
The locale files in the folder were pretty well formatted, so it was quite easy to regex through it.
I had to just look for the name of the format, for example &lt;code&gt;postal_fmt&lt;&#x2F;code&gt;, then whitespace, then match and capture the value.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, I didn&#x27;t loop through all files, but only the file that matches the locale name. So for &lt;code&gt;fi_FI&lt;&#x2F;code&gt; locale we only
look for the &lt;code&gt;fi_FI&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;getting-language-code-from-the-locale&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#getting-language-code-from-the-locale&quot; aria-label=&quot;Anchor link for: getting-language-code-from-the-locale&quot;&gt;Getting language code from the locale&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;After the examples were done, we wanted to localize the examples to the native language of the locale
the example is shown for. So Finnish address example actually is in Finnish, and not in English.&lt;&#x2F;p&gt;
&lt;p&gt;This felt a bit silly and I feel like there should&#x27;ve been better way to do this.&lt;&#x2F;p&gt;
&lt;p&gt;I could not figure out how to get the locale &lt;em&gt;language shortcode&lt;&#x2F;em&gt; from the locale name.&lt;&#x2F;p&gt;
&lt;p&gt;So the &lt;code&gt;en&lt;&#x2F;code&gt; part of &lt;code&gt;en_US&lt;&#x2F;code&gt;. I couldn&#x27;t find anything that does this in Qt libraries, there were methods
that return the full name of the language but not the first part.&lt;&#x2F;p&gt;
&lt;p&gt;Regex to rescue again, just a simple regex, right? Wrong: &lt;code&gt;([a-z]*)($|[\-]).*&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This regex first looks for and captures as many lowercase letters there are, then ends the capture
when either meeting end of string or &lt;code&gt;\&lt;&#x2F;code&gt; or &lt;code&gt;-&lt;&#x2F;code&gt;. I am not sure why I added the &lt;code&gt;\&lt;&#x2F;code&gt; there but I do remember
the &lt;code&gt;locale.bcp47Name()&lt;&#x2F;code&gt; returning locales with &lt;code&gt;\&lt;&#x2F;code&gt; too. Or I was just sleep deprived.&lt;&#x2F;p&gt;
&lt;p&gt;Anyhow,do share if you have an idea for simpler solution, be it simpler regex or &quot;you should&#x27;ve just used this one
hidden function.&quot;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;some-things-i-learned&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#some-things-i-learned&quot; aria-label=&quot;Anchor link for: some-things-i-learned&quot;&gt;Some things I learned&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Here&#x27;s few things I learned thanks to the reviewers:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Examples should be easy to understand: Instead of having name example like &lt;code&gt;Jane Belle Doe&lt;&#x2F;code&gt; you should have &lt;code&gt;Firstname Middlename Lastname&lt;&#x2F;code&gt;, at least in this context.
This helps the user recognize the name order between locales, since in some locales lastname may be first etc.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Using &lt;code&gt;i18nc&lt;&#x2F;code&gt;: This will give the translators &lt;em&gt;context&lt;&#x2F;em&gt; besides just the string to translate for. Example: &lt;code&gt;i18nc(&quot;This is a contextual translation&quot;, &quot;Hello&quot;)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;const&lt;&#x2F;code&gt; is a friend in C++ (and I assume in C as well). If you have a variable that is initialized once but never modified after, just add &lt;code&gt;const&lt;&#x2F;code&gt; in front of it.
This tells the compiler that &quot;hey this variable won&#x27;t change&quot; and also keeps it from accidentally changing. (Usually.)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Instead of returning empty QString &lt;code&gt;&quot;&quot;&lt;&#x2F;code&gt;, just return &lt;code&gt;{}&lt;&#x2F;code&gt;. Avoids accidental non-empty strings, since the object is empty. Probably other reasons too.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;code&gt;QLatin1String&lt;&#x2F;code&gt; when comparing strings, it&#x27;s usually safer so that the decoding&#x2F;encoding won&#x27;t mess things up.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Feel free to tell me if you know better why some things are like this. Most of these are based on my own experiences.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;So yeah, it was way more involved than I expected. I was honestly expecting Qt having some premade classes and methods
for the locale trio, but nope. So I had to get my hands dirty and do it myself.&lt;&#x2F;p&gt;
&lt;p&gt;I may sound grumpy in text but I legit enjoyed it even it was quite challenging for my tiny brain. I&#x27;ve never really
worked with C++ before due to people scaring me that it&#x27;s a scary spooky hellish language.&lt;&#x2F;p&gt;
&lt;p&gt;Well, it certainly is a bit scary language. But I managed to make something nice with it.&lt;&#x2F;p&gt;
&lt;p&gt;Also there was no need for me to be scared of the review process. It was actually super educational
and I learned a lot from it. I am thankful for all the people who helped me work on this!!&lt;&#x2F;p&gt;
&lt;p&gt;All in all, I&#x27;m proud of myself. I&#x27;m proud that I managed to contribute something small like this.
And I am super excited to find more things to contribute to.&lt;&#x2F;p&gt;
&lt;p&gt;Just no locales anymore. Please.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
