Today I was doing some experiments with qmllint hoping it would help us make QML code more robust.
I created a very simple test which is basically a single QML file that creates an instance of an object I've created from C++.
But when running qmllint via the all_qmllint target it tells me
Warning: Main.qml:14:9: No type found for property "model". This may be due to a missing import statement or incomplete qmltypes files. [missing-type]
model: null
^^^^^
Warning: Main.qml:14:16: Cannot assign literal of type null to QAbstractItemModel [incompatible-type]
model: null
^^^^
Which is a relatively confusing error, since it first says that it doesn't know what the model property is, but then says "the model property is an QAbstractItemModel and you can't assign null to it"
I might be busy early next month, so I’m posting this a few days early so I get it out of the way! I managed to do a lot of big stuff this month, and pretty happy with my pace. I still have way too many open MRs though, I really need to get that sorted.
Sorry about the shoddiness of some of the screenshots. We are the midst of our Qt6 transition, and sometimes my Breeze is broken and fell back to a built-in Qt theme. I promise it won’t look that ugly in a couple of months!
I redid the
Accessibility KCM to make it look a bit nicer, by using the newer sidebar view we use in other KCMs. This still needs some in the oven, though.
The new settings page.Better notification controls!
High character count posters rejoice, as
the status composer is now usable for you! This will also appear in 23.08, so you don’t have to wait until the next major release.
The status composer now scrolls if it needs to.
The alignment of the top row of buttons in posts is
ever so slightly fixed now so it looks prettier, and has better clickable areas.
If you were ever frustrated with logging into Tokodon, fear not as in the next release
the entire process is redone. I rewrote the entire UX to be way more user friendly, less buggy and it supports some cool features like a integrated authorization flow and registration!
The new registration page. You can’t view the server rules yet, but that will be added soon!
Tokodon will now show you a visible warning and explain why your account did not log in, instead of kicking you back to the login page like before:
An example of a login error. It’s even actionable!
Finally, a few
media attachment improvements such as media attachments being blacked out if the blurhash is missing (which happens, apparently) and an “Alt” tag that shows up in the top right if the image has alt text. Saves me a click or two, and especially useful for video.
The CategorizedSettings component got some fixes as well, including the
ability to filter out invisible actions (useful for hiding certain pages on other platforms, e.g. Android.) and
fixing the stuck checked state. There’s still a lot of work to do on this component, but it’s a start!
We are
trying to adopt qmlformat in KDE. I spend a unreasonable amount of time fixing formatting, so it would be nice to have it automatically happen like we already use clang-format for with C++. I have managed to make some really good headway here, and squash lots of little nagging bugs we have hit. These have not been merged into Qt yet, but I hope we can get them reviewed soon. (If you have approver rights, I would appreciate if you took a look!)
Web-Search-Keywords in KRunner, tales of optimizations
In my last blog post about performance in KRunner I wrote about the applications and system settings runners. I did lots of further investigation and work, some of which is still in progress and not merged yet. When looking at the benchmark results in the amazing tool Hotspot, I noticed that operations in the “Web Search Keywords” runner were surprisingly heavy in terms of CPU usage.
Looking at the graph, one could see there being two nearly identical callstacks that are responsible for parsing desktop files, which contain the search keywords, texts, and URLs. This of course doesn't really make sense, because they were not changed while benchmarking.
The issue was quite simple: When the class where the parsed desktop files are stored is instantiated, the desktop files are loaded. In the method to load configuration, we read some settings like the default shortcut, but also reload the keywords. And due to the config being loaded after the class is created, it is done twice. The solution is trivial: Suppress the parsing when loading the config for the first time. In case we read the config a second time, it is due to us having changed settings or have added new keywords. Then we of course want to reload all entries.
Profiling excerpt from the match-method, which produces results for your typed query
The other, far more tricky issue was that while we were only supposed to have one central engine for interacting with the web search keywords, we in fact had two of them! Meaning, while we have halved the times the desktop files are loaded, it is still done twice needlessly.
Profiling excerpt from all plugins being loaded (main thread)
After some debugging, I noticed that the class was compiled into two different plugins. Surprising is that the QGLOBALSTATIC macro does not really result in a global singleton, because it is being compiled into different plugins. Once that was clear, the fix was straightforward: Create a small helper-library that includes the necessary files and use this library in the two plugins. This also means that we don't build the containing classes twice, which should decrease build times. Loading the keywords took ~90 milliseconds on my system. On systems with a weaker CPU and without a SSD, this would take even longer. Because the loading was done twice in the main thread, KRunner startup should be a bit less sluggish.
Hopefully you enjoyed this read, and I am eager to further work on optimizing KRunner & Frameworks.
So today will be the official date when my Gsoc journey comes to an end. However this only marks a new beginning in my open-source journey with KDE. From the day I first made my contribution for KDE to today, I have learned a lot during this time and this has been possible only due to the incredible community we have at KDE. I'd like to extend thanks to both my mentors and especially Carl Schwan who has helped me grow a lot during this time.
Now talking about the GSoC with KDE, I worked on improving Mail Integrations in Merkuro(formerly Kalendar). The initial plan was changed to accommodate my speed of understanding KDE pim services and API, The project is not complete yet. I plan to work more on this to make Merkuro one of the top email clients of choice for people. A detailed report of my GSoC adventure can be found here along with my immediate plans for the contributions I plan to make to KDE. Thanks for following along !
I had the hankering for tinkering the KDE application style. The default style by KDE, Breeze,
is pretty nice as is, but there are small things I'd like to modify.
There's Klassy which is quite customizable and fun,
but I don't really need all of the settings it has.
Then there's Kvantum which uses SVG files to
create a theme, but they don't follow KDE colorschemes. And I dislike working with SVG files.
Both are brilliant for their usecases, but I wanted just Breeze with few changes.
Fork time!
So, I did what one has to do, forked Breeze and renamed everything Breeze related to Zephyr.
I chose Zephyr because it was synonym for Breeze in Thesaurus lol. Also, it makes sure it's last
in the list of the application styles, so people don't accidentally confuse it to Breeze.
Installation help is also there, but feel free to make issue and/or merge requests for adding stuff like
what packages one has to install for their distro.
Unfortunately due to the massive size of the Breeze Gitlab repo,
I didn'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.
After renaming all the things, the whole thing built and installed surprisingly easily.
I then implemented following:
Black outline setting, so the default outline has a black one around it.
Why? Idk looks cool. Not really other reason.
Yes, it can be disabled.
Traffic color icons in window deco
I am allergic to Apple but the traffic light concept just makes sense to me.
Also can be enabled or disabled
Customizable style frame and window deco outline colors
You can completely change the frame colors.
You can also make them invisible! No outlines, no frames! Fun!
Slightly rounder windows and buttons
At some point I will make a setting for these too, but now they're applied when the thing is built
Fitting Plasma style if you use the defaults Zephyr offers (mostly black outlines)
The plasma theme buttons do not match the application style in roundness, yet.
I am lazy and avoid working with SVG files as long as I can
Why
For fun! For learning! And I wanted to make something that is super close to Breeze (hell, it is Breeze, just few mods),
but still has it's own charm and how I like seeing my desktop.
It also can work as a great test bench for others who want to see if they can modify application style.
Just rename anything Zephyr to YourForkNameHere and have fun. But it's probably better to fork the original Breeze project :)
Also, when making my own things for Breeze, it'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.
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's not too big of a change.
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!
All in all, good project, I keep tinkering with it and it helps me understand the Breeze styling
and Qt in general more.
Revontuli and Zephyr
My colorscheme Revontuli works really well together with Zephyr.
So, feel free to give them a go!
The topic of sponsored work comes up surprisingly often. Now, many KDE developers are already sponsored by businesses to work on KDE software, either on a full-time-work basis, or for specific areas of work. But what’s less common is for a specific person to sponsor another specific person to work on a specific bug or feature. I’m talking about short-term gigs paying most likely a few hundred euros or less. This can work well for getting persistent bugs in the yellow boxes fixed. It does happen, but it’s not as common as I think anyone would like! There’s a lot of untapped potential here, I think.
So today I’d like to announce the creation of a “Sponsored work” category in the KDE forum! This is a place for people to come together for the purpose of sponsoring work on individual bugs or features. If you’re willing to sponsor work for something, post about it here. If you’re open to these kinds of micro-sponsorship opportunities, look for them here!
Since we are a free software community, sometimes concerns about money and sponsored work arise. Therefore, let me bring up an additional option, originally thought up by Jakob Petsovits the last time someone offered to sponsor work: offer an option to donate the sponsorship money to KDE e.V.! This option can be more motivating for passionate KDE developers who don’t personally need the money, and might otherwise ignore such opportunities.
On the subject of donating to KDE e.V., we have a fancy new donation web page that makes it much easier to set up recurring donations! This being too hidden was been a very valid complaint in the recent past, so it’s wonderful to see a better UX here. This work was done by Carl Schwan, Paul Brown, and others at this weekend’s Promo Sprint–which is itself funded by KDE e.V.
And at this point, KDE e.V. is funding quite a lot of initiatives. Sprints have come roaring back, and we’re sponsoring people to represent KDE at more external events than ever before. We also have a whole bunch of employees and contractors doing meaningful technical work on core KDE software. It’s a lot!
Needless to say, this isn’t cheap. KDE e.V. has been funding this major expansion by deliberately spending down its reserves for a few years to avoid getting in trouble with the German tax authorities for having too much money (yes, really; this is actually a thing). But that can’t last forever! We’re going to need help to sustain this level of financial activity.
On Thursday and Friday evenings, I went to the Matrix Community Summit at C-Base
in Berlin with Tobias. It was the occasion to meet a few other Matrix
developers particularly the Nheko developer, MTRNord and a few other devs
whom I only knew by nickname. It was great even though I could only spend a
few hours there. Tobias stayed longer and will be able to blog more about
the event.
Photo of the C-Base showing a lot of electronical equipements
During the weekend, instead of going to the Matrix summit, I participated to
the KDE Promo sprint with Paul, Aniqa, Niccolo, Volker, Joseph. Aron also
joined us via video call on Saturday. This event was also in Berlin at the KDAB
officem which we are very thankful for hosting us.
This sprint was the perfect occasion to move forward with many of our pending
tasks. I mainly worked on web-related projects as I tried to work on a few items
on my large todo list.
We now have an updated donation page, which includes the new donnorbox widget.
Donnorboy is now our preferred way to make recurring donations and recurring
donations are vital to the success of KDE. Check it out!
Screenshot of the website KDE.org/community/donations
With Paul, we also looked at the next KDE For-pages. Two of them
are now done and we will publish them in the coming weeks. There are plans for
a few more and if you want to get involved there, this is the
phabricator task to follow.
I also updated the KDE For Kids with the help of
Aniqa. It now features the book Ada & Zangemann from Matthias Kirschner
and Sandra Brandstätter that sensibilise kids to Free Software. Let me know if you have
other books suggestions for kids around Free Software and KDE that we can
include on our websites.
This was only a short version of all the things we did during this sprint, I will
let the others blog about what they did. More blog posts will certainly pop up
on planet.kde.org soon.
The sprint would have been only possible thanks to the generous donation from
our users, so consider making a donation today!
Your donation also helps to pay for the cost of hosting conferences, server
infrastructure, and maintain KDE software.
After joining the Hub 5 video recording event and making a video about it, I couldn't miss the Nextcloud Conference! So, let's talk a bit about what I saw and heard.
Of course, the very first thing was the announcement of the new Hub 6. This mainly focused on (a) ways to work in a healthy way, e.g. by turning off notifications outside work hours, postponing e-mails, and so on; and (b) ethical AI integration. In this context, "ethical" means that (1) the training data should be freely available and (2) the model should be run locally so that you don't have to send your data to e.g. OpenAI. They announced a LLM called Nextcloud Assistant which would run locally and do stuff like summarizing emails. I'm quite excited to see how that goes.
The place was really cool as well. I spent most time in the kitchen area, which had a great view of the talk area, and had some nice tables I could use for hacking. Which I did: I will do videos about this very soon, but I'm happy to report I managed to build I couple of KDE Plasma features while eating Nextcloud-provided cookies. Living the best life.
Soon enough, some even cooler talks came along.
The coolest one in my humble opinion was The fourth sector by Simon Phipps. He talked about representing what we do - Open Source™ - to large governmental institutions such as EU. Of course, he covered some of the legislations that are coming soon, such as the CRA (I had just published a video about it, so it was particularly interesting :-). If you're intrigued by this, fear not: I will have a video about this talk specifically soon.
But of course, I wasn't the only KDE developer.
I only snapped a picture of Carl, but actually there were at least a couple more. And there are even blogposts about that, so check those out too:
I also met a lot of super cool Nextcloud people, and we chatted quite a lot, it was super cool. Big thanks to Brent @ Linux Unplugged for telling me everything about how he does podcasting and showing me the Framework laptop around. I had to run away to the airport without being able to say "bye" to anyone, though, so please forgive me!
So, what's going to happen now?
Well, firstly, I will record and publish the video about Simon's talk. I will also start scripting a video specifically about Hub 6, though I haven't had the chance to test all of its functionalities yet, and I want the video to cover those as well. So, great news: lots of Nextcloud content is coming soon and it's going to be as cool as ever. Fun fact: I actually do use Nextcloud to organize everything in my Youtube channel!
Thanks everybody for tuning in, and see you soon with more content on my main page!