From last Friday to Wednesday I was in Berlin to attend the combined 2024 KDE Goals
sprint that was graciously hosted by MBition. Compared to previous goals sprints
where there were separate sprints Goal this year was different as all three happened
at once in the same area. This allowed attendees to freely switch around the different
topics and enables more collaboration opportunities. Lets see how that worked out for
me.
Most of my time I actually spent in the context of the accessibility goal. I became
part of a discussion of how QML comboboxes in general and the Kirigami Add-ons date
picker is lacking in the accessibility departement. As the discussion went to how
the default representation of a standard combobox could be improved, the question
was raised if it would still be possible to do something special for customized
comboboxes. This lead to prototyping on the date picker with the first approach
being to forego the built in support in QtQuick and implement the relevant interfaces
manually like one would do for QtWidgets. This was a lot of boring boilerplate code
but it proved that this option is available for very specialized use cases.
The solution we came up with in the end for our use cases was to provide the required
properties and roles in a proxy Item that exposes the actual controls to the accessibility tools.
On the automatization front I was involved in creating two new CI checks. The first
one is a reuse lint check that only checks new files for compliance which enables
older projects to enforce coverage at least for new files. The second was an idea
that came up during sprint that we could detect untranslated strings in QML files
as these are usually to text properties. While it will never catch all cases during
testing we found already some problematic cases in Plasma repositories. We discussed also
some other points from the idea list such as a cherry-pick bot like the Qt Project
uses and automatic updating the fix version field on bugzilla but these innocuous
looking problems have some corner cases which require some more thought.
To the Sustainable Software goal I contributed the least. But together with Aleix
and Joseph we debugged why the VNC setup of the KDE Eco Lab machine did not work
anymore and fixed it. So in the end I interacted with all three goals.
The combined sprint was a nice experience and facilitated many discussion about
the Goals but as always also about other KDE topics as is unavoidable when KDE
community members are put together in a room. However I feel while it enabled
people to jump around the different goals I am wary that in my opinion this setup removes a bit
of focus from each goal compared to dedicated sprints.
Thanks to Mbition for hosting us and as a reminder your donations to KDE e.V
make sprints such as these possible.
Qt 5.15 introduced “Automatic Type Registration”. With it, a C++ class can be marked as “QML_ELEMENT” to be automatically registered to the QML engine. Qt 6 takes this to the next level and builds all of its tooling around the so-called QML Modules. Let’s talk about what this new infrastructure means to your application in practice and how to benefit from it in an existing project.
The Kubuntu Team is happy to announce that Kubuntu 24.04 has been released, featuring the ‘beautiful’ KDE Plasma 5.27 simple by default, powerful when needed.
Codenamed “Noble Numbat”, Kubuntu 24.04 continues our tradition of giving you Friendly Computing by integrating the latest and greatest open source technologies into a high-quality, easy-to-use Linux distribution.
Note: For upgrades from 23.10, there may a delay of a few hours to days between the official release announcements and the Ubuntu Release Team enabling upgrades.
Hi, I'm Jakob and this is my new KDE blog. Let's see how this goes
as I haven't blogged for literally decades.
I started working on Plasma code sometime last year and hope to play a tiny part in
setting the stage for world domination improving user experiences like
so many other awesome and dedicated contributors do every week.
My Plasma contributions started out with a few rounds of build improvements and bug fixes
initially. Before long though, I decided to realize my lifelong dream of a friendly and usable
Energy Saving settings page. Thus started a journey into the code of Plasma's power management
service, internally known as PowerDevil.
Quick recap: As a service, PowerDevil is mainly responsible for two rough areas.
It will suspend Plasma sessions when the time is right, and also,
It adjusts backlight brightness levels of your display and monitors, including the ability to
turn them off altogether.
In terms of user interfaces, the Energy Saving module in System Settings allows you to set
different suspend/shutdown behaviors and brightness adjustments for different power states:
on AC power, on battery, and on low battery. Ad-hoc adjustments to the same settings can also
be made with two applets in your system tray: Power and Battery, as well as Brightness and Color.
Let's have a look at some of the work that went into Plasma 6.0 in this area. I'm about two months
late for a 6.0 news blog, but Fedora 40 KDE Spin is just
out as the first major Linux distro on a semi-annual release cycle to feature Plasma 6. So maybe
not terrible timing. We'll also have a look at some of what's been brewing for 6.1 so far.
You may have seen some of this across a number of different "This Week in KDE" blog posts,
but then again maybe you haven't!
System Settings & Config Data
I'm quite happy with the way the new settings worked out. It also took a while to get there.
A year earlier, I posted an outlandish proposal
to radically change the Energy Saving page. It's too long and boring and unworkable to cover here.
However, it made me think long and hard about all the different ways that the settings page could
look like, what its controls must be able to represent. It also made me aware that
another UI rework
had already been in the works previously, which didn't get merged.
Nothing is ever as easy as one hopes it to be. A substantial redesign of the settings page would
require rewriting the UI with modern Qt Quick / QML code, as opposed to the rather unwieldy
Qt Widgets that the old UI was using at the time. As I learned, a settings module based on
Qt Quick also wants more knowledge about its underlying configuration data. Things such as:
"what's the default value for this setting", or "if you click this checkbox a second time
can we disable the Reset button again".
PowerDevil had lots of config data and was using old infrastructure in non-standard ways to access
it. The service would generate a new config file on first run, with all of its default values
written to ~/.config/powermanagementprofilesrc. After creating this config file, it had no clue
which of the values were defaults and which were your own customized settings. In Plasma 5.x,
pressing the "Defaults" button would open a dialog to warn you that all of your changes will be
thrown away immediately and can't be recovered if you proceed. Compare that to other modules,
which let you press "Defaults" and "Reset" as much as you want until you decide finally "Apply".
Before even attempting to improve the UI itself, a series of changes was necessary in the code
that reads and interprets config files. I got there by extracting and improving one small
bite after another from the extensive but ultimately unmerged earlier attempt. A steady stream of
small, easy-to-review patches will win the race eventually.
The result is this. Power management settings are now only written if you change away from the
default values. If you checked the "Highlight Changed Settings" option, System Settings will be
able to show which of your Energy Saving settings have been modified compared to the defaults.
You can transfer your SSD from a laptop to a PC and the suspend/shutdown defaults will now reflect
the new system's capabilities. Extra config files for the various power states and activities have
been migrated to ~/.config/powerdevilrc.
Building on these changes, the UI rework got merged just in time for Plasma 6.0. I think it's
significantly cleaner than it used to be, while at the same time there are still things I'd like
to change about it. Eventually I'd like to configure my "laptop lid closed" action only once,
instead of applying the same change across all three power states. The "custom script" controls
make more sense for laptops with different power states than for desktop PCs, where the current
design can be a little confusing. Screen and keyboard brightness should ideally move to the
Display Configuration and Keyboard settings modules. We'll get there eventually.
Special thanks to Nicolas Fella and Nate Graham
for their repeated, kind & thoughtful code reviews. Throughout this project and really everywhere
else in KDE. Getting (or giving!) that kind of feedback makes a huge difference.
Moved & Removed Functionality
The UI rework would have been harder if Nicolas hadn't also simplified PowerDevil in other areas.
One is that WiFi, WWAN and Bluetooth are gone from Energy Saving, they were more confusing there
than they were helpful. Switching wireless devices on or off can still be done through the system
tray applets, or the WiFi/Bluetooth modules in System Settings.
Plasma 5.27 and earlier allowed you to set a full power management settings profile if a given
Activity is currently active. It's still possible in Plasma 6.0 to block automatic sleep or
screen turn-off. Those settings have moved to the Activities settings module, where they can be
configured as part of each individual Activity. Entire pages of power management settings cannot be
controlled through Activities anymore in 6.0 though. If these capabilities ever end up returning,
it will be with a different code architecture and a different UI.
Natalie Clarius has invested lots of time into system tray applets. Instead of a single
"Battery and Brightness" applet and a separate "Night Light" applet, the brightness settings in
Plasma 6.0 are now colocated with Night Light as "Brightness and Color" applet. This leaves the
"Power and Battery" applet by itself, which displays battery status (including peripheral battery,
if your mouse or keyboard supports this) and can configure power profiles on the fly
(if power-profile-daemon is installed).
New & Improved Functionality
In Plasma 5.x, you were able to configure how long the system should be idle before the display
gets turned off. For Plasma 6.0, Jonathan Haney added a setting to configure a shorter turn-off
duration on the lock screen. You won't be reading long web pages and PDFs on the lock screen so
you might as well avoid distractions and save some power. This setting can be reduced all the way
to zero seconds so that the screen turns off immediately when locking the session.
I spent some time to make this work reliably on both Wayland and X11.
We still need to streamline the settings UI a bit, in line with the "simple by default, powerful
when needed" mantra.
Brightness can be increased or decreased in 5% steps by pressing brightness up/down keys, which are
usually found on laptop keyboards. In Plasma 6.0, brightness steps can also be controlled in
1% steps by pressing Shift in addition to the brightness key.
We merged a number of bug fixes to improve reliability of automatic brightness adjustments.
Restoring keyboard backlights works better now after waking up from system sleep, dimming after a
period of inactivity is less fragile, fading to black before the screen is turned off won't flicker
when a mouse move interrupts the fade at the wrong time. If (lib)ddcutil or PowerDevil's use of it
makes trouble with controlling external monitor brightness via DDC/CI, it can be disabled by
setting a POWERDEVIL_NO_DDCUTIL=1 environment variable for the PowerDevil service on startup.
There is now an OSD switcher for power profiles (i.e. Power Save, Balanced, Performance) that will
pop up when the battery function key on some laptop keyboards is pressed, or Meta+B.
In Plasma 5.27, you could configure a custom script to run when entering or exiting a power state
(AC, battery, low battery) or after a period of inactivity in this current power state.
In Plasma 6.0, you can configure a custom script for each of these "run conditions" in each
power state. So you can run a script to activate something when you plug in the laptop, and disable
it again when removing the power plug.
Auto-suspend after inactivity, laptop lid closure and power button presses now each allow you to
select "Sleep" vs. "Hibernate" as their respective suspend actions. The "Hybrid sleep" option and
the confusingly placed "Sleep, then hibernate after a period of inactivity" checkbox are now part
of a separate drop-down that lets you choose alternative sleep modes. Less confusing than before,
although there's more work needed now to make this updated categorization consistent across the
entire desktop, like on the logout screen.
Functionality that just keeps working!
For years, the UPower daemon had marked its laptop lid detection functionality as deprecated, to be
removed in a future release. Plasma's power management service relies on UPower, and Plasma would have
soon lost the ability to react to lid closure events. UPower had already removed this code from
their unreleased development codebase, it was only a matter of time until the next official version
would be released to break lid handling everywhere. So I started working on a replacement,
but getting full coverage across different platforms (X11 vs. Wayland, systemd vs. not-systemd)
is quite a bit of effort and there were lots more kinks to figure out.
So I am very happy that UPower has indeed
released a new version,
one that puts the lid detection code back in for the benefit of upstream users such as Plasma,
GNOME and various window managers that have also relied on their lid detection functionality.
Better yet, it's meant to stay this time around. Things will just keep working as they do now!
It's great to have this kind of system-level functionality available in common infrastructure
such as UPower so we don't each have to implement substandard knock-offs individually.
On the monitor brightness front, recent versions of libddcutil have introduced a feature that
prevents two independent programs from talking to the same monitor simultaneously. Due to the way
that our background service has traditionally been using libddcutil, Plasma 6.0 sessions have been
hogging libddcutil's monitor handles. Users who like to perform other operations with DDC/CI,
for example through the ddcutil command-line program, would find it non-functional. Starting with
Plasma 6.0.4, our DDC/CI code was restructured so that a monitor is only hogged for the short time
it takes to change the brightness. ddcutil works again as intended in a Plasma session.
Beyond 6.0
The System Settings module will be renamed from "Energy Saving" to "Power Management". This used to
be the name of the entire category containing the "Energy Saving", "Advanced Power Settings" and
"Activity Power Settings" modules. After the redesign, there is only one module left and it can be
called by the arguably more appropriate name.
After the Plasma 6.0 feature freeze went into effect, Bogdan Onofriichuk significantly improved
the code for external monitor brightness handling via DDC/CI (using libddcutil).
Starting with 6.1, the power management service will recognize at runtime when monitors are
connected or disconnected. Previously, only a single monitor detection was done on startup and
if you changed your monitor configuration afterwards, brightness controls in Plasma would have
no effect on newly plugged-in monitors.
Brightness via DDC/CI will not be animated anymore in order to minimize the risk of shortened
monitor lifespans. The chance of this happening is hard to verify for someone not in the
monitor industry, but we'll follow the example of monitor manufacturers' own helper applets and
apply newly adjusted monitor brightness values only after a half-second delay.
Brightness animations of internal laptop backlights, on the other hand, are going to get more
responsive when dragging the brightness slider in the applet or holding down the brightness key.
We've done more work on cleaning up the display code, with the goal of allowing per-monitor
brightness controls as opposed to the single brightness slider of current Plasma releases.
After raising the minimum brightness value to "the lowest value that's higher than 0%" to stop
screens from inadvertently turning off, we'll lower it back down to an exact 0 where it's safe to
do so. We also want to move the core of screen brightness control into KWin, which will be able to
do more awesome things such as adjust brightness on OLED screens that don't even have a backlight
to control. No guarantees when any of this will be ready to ship, but it's a lot closer now than
just a few months ago.
How You Can Help
There are a lot of edge cases and system configurations that could still be handled in a better way.
Device interactions can be hairy, they will often differ from one system to another. What might
work well on my system can break on someone else's. You can use the power of having a
different setup to do things that a number of KDE developers cannot. If you're running into issues
with suspend, brightness and other things that PowerDevil may have a hand in, check out
the new README file.
Consider helping with bug triage! PowerDevil on KDE's bug tracker has a service component
with lots of reported bugs, as well as a component for the System Settings module
with fewer bugs and quite a few wishlist items. The service component includes some very old bug
reports which may or may not fully apply to Plasma 6.0 anymore.
Read this if you're interested in
helping us determine the amount of developer love still required for different bug reports.
Also if you rock at figuring out how to reproduce issues reliably, when the original reporter
wasn't able to find a conclusive pattern by themselves.
And of course, if you're a developer, feel free to fix a problem and submit a merge request.
Some issues aren't straightforward to resolve. We'll work through them eventually.
Probably. I'm a volunteer just like most of you, so no promises whatsoever.
You can also donate to KDE so they can continue to do
helpful things like paying Natalie to work on hardware integration, or (if the approval gods
are kind) hopefully subsizing my travel costs to Akademy 2024.
If you've been following my previous blog posts, you may recall that I've been working on adding multi-format rendering support to Kdenlive. This feature allows users to export their videos in different aspect ratios, such as horizontal (16:9), vertical (9:16), and square (1:1), catering to the requirements of various platforms and use cases.
In the previous blog, I talked about the core implementation of the aspect ratio conversion logic, which calculates the necessary cropping parameters to achieve the desired format.
My Progess so far…
> Temporary File Handling and Refactoring
I initially implemented QTemporaryFile for cross-platform handling of temporary files, replacing hardcoded temp paths. However, this approach involved creating a new temporary file each time the method was called, which was inefficient. Based on the mentor's feedback, I refactored the code to create an empty QTemporaryFile object and only set it up with a specific file template when an aspect ratio change is required. This improved the efficiency of the temporary file handling.1
> User Interface
My next goal was to create user interface elements where the user can select the desired aspect ratio, and then connect them to the backend logic, which I discussed in my first blog.
First, I added a setAspectRatio method in the RenderRequest class to store the selected aspect ratio.
In the render widget's file, I added a new row with a label and a combo box for selecting the aspect ratio. In the rendering widget's constructor. Then, in the rendering widget's constructor, I created the combo box with the available options:
Profiles with width or height that are not a multiple of 2 cause crashes. I've fixed the issue by ensuring that the video profile width and height are multiples of 2.
[libx264 @ 0x733910204380] width not divisible by 2 (607x1080)
I tried to find the reason behind why we need width and height as divisible of 2 in the first place.
As required by x264, the “divisible by 2 for width and height” is needed for YUV 4:2:0 chroma subsampled outputs. 4:2:2 would need “divisible by 2 for width”, and 4:4:4 does not have these restrictions. However, most non-FFmpeg based players can only properly decode 4:2:0, so that is why you often see ffmpeg commands with the -pix_fmt yuv420p option when outputting H.264 video. --source
Finally, the selected aspect ratio is retrieved from the combo box and passed to the setAspectRatio method of the RenderRequest object:
With these changes, users can now select the desired aspect ratio from the combo box in the rendering widget before exporting their video.
> What I learned:
It was a learning experience; I've gained confidence to work on a large codebase and navigate through it, a better understanding of object-oriented programming (OOP) concepts, and the realization that I needed to get better at it. I learned the importance of efficient resource management, such as handling temporary files and much more. Beyond code, I learned how to better communicate with the mentors.
I'm grateful to the mentors who provided guidance and support throughout the project, helping me overcome the challenges I faced.
The invisible seafaring industry that keeps the internet afloat
Tags: tech, internet, infrastructure
Very fascinating piece. This shows the underappreciated job of maintaining the subsea cables needed for the Internet to function and how extreme the conditions can be. Definitely a peculiar life for the folks in that trade… also shows the repairs are clearly underfunded and that not enough people are embracing this career. And now, add geopolitics to the mix, it should make you wonder how all of this work at all and for how long it’ll keep working.
Funny side project. This shows well many of the challenges one should expect when working on mixed reality projects. It’s also nice to see how the ecosystem matured for such features in the browser.
Definitely this. Listen and write down issues before you start to complain. There might be reasons why things are as they are. Take the time to understand them and refine to have a better feedback.
Tags: tech, work, life, management, burnout, health
A good reminder that mental health can be hard to keep in check in our profession. Pay attention to how you feel, anxiety is a sneaky foe. Lots can be done to improve if taken care of early enough.
Marknote uses QTextDocument for its WYSIWYG
text editor. This is surpringly quite powerful and thanks to some code borrowed
from KMail rich text editor, it wasn’t hard to implement huge part of the
markdown specification.
But while QTextDocument is great, I hit quickly some limits. This is why I
started fixing some of them and I already have some patches up for review in Qt.
This is easy to change in the app itself and this is already the case in
Marknote and NeoChat table rendering, but by default I believe Qt should
provides a nice style so that apps don’t need to figure out how to overwrite
the default style.
While working on this, I also noticed that the border-collapse property was not
supported by the layout engine in QtQuick and only in QtWidget. This resulted
in the border of the tables to be twice as thick as they should be. This was
fortunately fixed by a simple patch:
https://codereview.qt-project.org/c/qt/qtdeclarative/+/554151 (merged!)
Responsive images
A width and an height can be assigned to an image in a QTextDocument by using
the respectives html attributes <img height="500" width="500" \>.This works
correctly when the window size is known and static but less so then the window
can be resized as will be the user. A common technique in web design is to add
the following styles to the website:
img{max-width:100%;}
And while QTextDocument support some CSS properties, max-width wasn’t
implemented. Adding the support for more properties in the HTML and CSS
parser is quite simple as it was just forwarding the value of the max-width
attribute to the QTextImageHandler, and a bit complicated was the handling of
the % unit as previously only px and em was supported by Qt.
Hopefully these patches will be reviewed and merged soon. Afterward I want
to add support for a few more CSS properties like: border-radius for images
and some other elements, as well the border-{width, style, color} properties
for paragraphs to better support <blockquote /> (important when displaying
emails).
Linux with X11 and now Wayland is for a long time the primary system on that Kate work happens.
Over the years it was, like most of the KDE applications, ported to various BSD variants.
Be it some mainstream Linux distribution like Fedora or a niche one like NixOS, Kate is available as binary package.
You love BSD?
From FreeBSD to OpenBSD, you can get a Kate package via your normal package system.
And in the normal case, you can just build it from source on your own, all needed patches should be in our repositories upstream.
If that is not the case for your system, please help to upstream them.
Below the current state of the master branch compiled on NixOS unstable with Wayland.
How to compile Kate on your own on a Unix like system and start to help to develop it can be found out here.
Since several years there are activities in the KDE community to provide our libraries and applications for Windows.
Even if that is a non-free platform, we can reach out to new users and developers that might later be then even interested to switch a full open platform.
Progress is slow, but steady.
We have Kate and some other applications in the official Windows Store and nightly build for more of them.
With reasonable effort you can develop Kate on Windows with Craft.
Below the current state of the master branch running on Windows 11 inside VirtualBox.
If you like to try that, use the nighly installer linked on the Kate website.
Naturally there are more than the above mentioned operating systems around.
Beside the mobile ones like Android and iOS that are not that interesting for Kate, many other desktop operating systems exist.
Even if the Kate team itself doesn’t put active work it them, that doesn’t mean Kate can’t run there.
Without any active work on our side, for example a Kate port for Haiku was done.
Some one-liner patches for that got even upstreamed.
If you work on some port of our stuff and need to upstream stuff, please contact us.
Even if you work on a non-mainstream system, as long as the patches are not too intrusive, we are interested to have them.
Naturally the most of our developers are working on the Linux or some BSD.
That means the other systems are always in need of more people to help out, both on the programming and testing side.
For Kate, testing should be easy, grab a nighly build for Windows or macOS on the Kate website.
Or even better, get Craft running, that will make it easier to contribute, too.
One recent topic that needs love is the removal of DBus for Windows/macOS/Android and other systems that don’t use it normally.
If you are up to help with that, here that is coordinated.
The current state is already sufficient that the nightly builds of Kate no longer hang on e.g. macOS, but still some frameworks like KIO will need more work.
Just don’t get that wrong, DBus is great on the Linux or BSD systems that use it natively, but it is a pain on systems that have no notion of DBus and leads there to hangs or the spawning of unwanted processes.
Beside that, the usefulness is low there, as there are no services on the bus to communicate with anyways.