Skip to content

Tuesday, 9 May 2023

While at the 2023 Plasma Sprint at the Tuxedo Computers office in Augsburg, Germany, I created a patch to add ButtonSegment, SegmentedControl and SegmentSeparator to Qt Quick Controls 6.6: https://codereview.qt-project.org/c/qt/qtdeclarative/+/476564

The patch has not been merged yet and may change significantly.

ButtonSegment is a Button subclass with an edges property that can be used to specify which edges are exposed to the outside of the group. The base flags available are NoEdges (0), TopEdge (Qt::TopEdge), LeftEdge (Qt::LeftEdge), RightEdge (Qt::RightEdge) and BottomEdge (Qt::BottomEdge). Why the outside and not the inside? It doesn’t matter a whole lot, it’s just what I decided to do. My thoughts were "These are the edges where extra visuals will be." There are also flag combination values like AllEdges, TopLeftEdges, TopRightEdges, BottomLeftEdges and BottomRightEdges to make your lines of code shorter.

SegmentedControl is a Control subclass with flat and down properties. This control doesn’t actually do much. Its main purpose is for providing a way to define unified graphics for a segmented button group (e.g., macOS Big Sur has a background underneath all of the button segments). flat can be used to define flat and raised appearances. down can be used to define a unified pressed/down appearance (e.g., a shadow used by a unified raised background could disappear when any segment is pressed). down does not change in response to ButtonSegment::down changes by default. You must set that up yourself. There are ways to make this behavior more automatic, but I have not used them yet. I might make the behavior more automatic because otherwise it will be difficult to support down when button segments are created from delegate components.

SegmentSeparator is a Control subclass that has orientation, vertical and horizontal properties. It has the same API as ToolSeparator. Its purpose is to provide styling for separators between button segments.

Automatic Behavior VS Boilerplate Code

Unlike similar controls provided by Flutter (SegmentedButton) and AppKit (NSSegmentedControl), there is no built-in API for getting/setting the current selected button(s), index(es) or other value(s) from segments. This isn’t a big problem in QML because it is easy to add the additional behaviors or properties you need. You can even choose the ones that suit your use cases the best. Don’t forget that you have ButtonGroup, ActionGroup, Repeater, ListView, GridView and various ways to define models.

Some, maybe even many of you may have felt a bit disappointed after reading the paragraph above. You may have been thinking something along the lines of "Why doesn’t it just do what I want without having to write extra code?" It’s a good question. When people (including myself) try to reduce the amount of code they need to write by making controls do things automatically, they often cause more harm than good. If the problems were obvious and the temptation wasn’t so strong, then people (including myself) wouldn’t make those kinds of mistakes over and over. What often happens is that controls that were intended to be generally useful become more specialized for certain use cases and the people implementing the automatic behavior don’t realize it until they discover that a valid use case they weren’t thinking about has become more difficult or even impossible to support. There are examples of great automatic behavior out there and specialized components where a lack of flexibility is completely acceptable. My point is that people should be careful when implementing automatic behavior. I chose greater flexibility at the cost of requiring users to write more code.

Example Code

This creates three independently checkable segments in a row.

SegmentedControl {
    id: control

    ButtonGroup {
        buttons: control.contentItem.children
        exclusive: false
    }

    contentItem: Row {
        spacing: control.spacing

        ButtonSegment {
            edges: ButtonSegment.TopLeftEdges | ButtonSegment.BottomLeftEdges
            checkable: true
            text: qsTr("Segment 1")
        }

        SegmentSeparator {}

        ButtonSegment {
            edges: ButtonSegment.TopEdge | ButtonSegment.BottomEdge
            checkable: true
            text: qsTr("Segment 2")
        }

        SegmentSeparator {}

        ButtonSegment {
            edges: ButtonSegment.TopRightEdges | ButtonSegment.BottomRightEdges
            checkable: true
            text: qsTr("Segment 3")
        }
    }
}

Planned Supported Styles

Friday, 5 May 2023

OMEMO logo

It’s finally there: Kaidan with end-to-end encryption via OMEMO 2, Automatic Trust Management and support of XMPP Providers! Most of the work has been funded by NLnet via NGI Zero PET and NGI Assure with public money provided by the European Commission. We would also like to thank Radically Open Security (especially Christian Reitter) for a quick security evaluation during the NGI Zero project.

Even if Kaidan is making good progress, please keep in mind that it is not yet a stable app. Do not expect it to work well on all supported systems. Moreover, we do currently not consider Kaidan’s security as good as the security of the dominating chat apps.

There is a new overview of features Kaidan supports. Have a look at that or at the changelog for more details.

Encryption

All messages sent by Kaidan can be encrypted now. If a contact supports the same encryption, Kaidan enables it by default. Therefore, you do not have to enable it by yourself. And you will also never need to worry about enabling it for new contacts. But it is possible to disable it for each contact at any time.

Additionally, all metadata that is encryptable, such as typing notifications, is encrypted too. The new Automatic Trust Management (ATM) makes trust management easier than before. The details are explained in a previous post.

We worked hard on covering as many corner cases as possible. Encrypted sessions are initialized in the background to reduce the loading time. Kaidan even tries to repair sessions broken by other chat apps. But if you discover any strange behavior, please let us know!

We decided to focus on future technologies. Thus, Kaidan does not support OMEMO versions older than 0.8.1. Unfortunately, many other clients do not support the latest version yet. They only encrypt the body (text content) of a message, which is not compatible with newer OMEMO versions and ATM. But we hope that other client developers will follow our lead soon.

Screenshot of Kaidan in widescreen Screenshot of Kaidan

XMPP Providers

Kaidan introduced an easy registration in version 0.5. It used an own list of XMPP providers since then. The new project XMPP Providers arose from that approach. That project is intended to be used by various applications and services.

Kaidan is now one of them. It uses XMPP Providers for its registration process instead of maintaining an own list of providers. Try it out and see how easy it can be to get an XMPP account with Kaidan!

Changelog

This release adds the following features:

  • End-to-end encryption with OMEMO 2 for messages, files and metadata including an easy trust management
  • XMPP Providers support for an easy onboarding
  • Message reactions for sending emojis upon a message
  • Read markers showing which messages a contact has read
  • Message drafts to send entered messages later after switching chats or restarting Kaidan
  • Message search for messages that are not yet loaded
  • New look of the chat background and message bubbles including grouped messages from the same author
  • Chat pinning for reordering chats
  • Public group chat search (without group chat support yet)
  • New contact and account details including the ability to change the own profile picture
  • Restored window position on start

Download

Or install Kaidan from your distribution:

Packaging status

Tuesday, 2 May 2023

This new entry will cover ways to configure global preferences for Maui Apps and Maui Shell.

MauiMan

MauiMan stands for Maui Manager, and exists for setting, saving, and syncing the configuration preferences for the Maui Apps ecosystem. These configurations are global, and some of them can be overridden by the apps themselves, but more about that later. To store the configurations MauiMan uses the MauiMan.conf config file, located at your local config path: for example ~/.config/Maui/MauiMan.conf.

(!) The settings modifications are only written/saved when using the MauiMan API directly.

MauiMan consists of two parts, a (1) background server that syncs and broadcasts the preference properties changes to all the running Maui Apps, and a (2) public API, that allows app developers to easily hook their apps to the system preferences. The MauiMan server program is named MauiManServer and uses the DBus IPC.

The public API and the server are divided into modules: for different setting categories, such as Theme, Background, Accessibility, FormFactor, etc…

Using MauiMan to configure Maui Apps.

To configure existing preferences, there are different ways to do it, from a graphical interface to editing a text file or even hooking to the public API directly (for developers), in the following sections we’ll cover all the possible ways.

The ideal way to set the configurations, from a user perspective, is to use the Maui Settings application, which exposes all the MauiMan preferences in a graphical manner; although, some of the settings presented are “curated” to use predefined sane values, for example, not allowing to set the border-radius of elements to an unfitting value rendering the interface unusable. This means that with this approach you dont get full control over the values of the properties in all the cases, but you are less prompt to mess up.

Maui Settings also exposes other settings for other system stuff, such as Networks, Sound, Notifications, etc. If any of the needed servers to sync configurations are offline, Maui Settings warns you about it and allows you to launch the server daemon with a single click.

(!) Keep in mind that Maui Settings is still under heavy development and most modules are still not implemented.

 

 

Another way to do interact with MauiMan is by using DBus directly. For this one can use a graphical application and navigate to org.mauiman.Manager and then dive into the existing modules for modifying the properties.

(!) Using this approach will not save the changes made: it will keep the changes in memory as long as the MauiManServer daemon is running, but once the process is restarted those changes will be lost since changes to the MauiMan properties are only saved when using the MauiMan public API.

 

 

Another apporach is to manually edit the MauiMan.conf file. It has a couple downsides:

  • The changes won’t be made live.
  • Changes won’t be loaded until MauiManServer process has been restarted since MauiManServer saves in memory the properties and only loads preferences from the config file on startup.

Using this config file is a convenient way to set default values for distributions shipping Maui apps, so they can be styled for the distribution. This config file is located at:

~/.config/Maui/MauiMan.conf

Here’s a snapshot of the config file contents:

[Accessibility]
SingleClick=false

[Background]
DimWallpaper=false
FitWallpaper=false
ShowWallpaper=true
SolidColor=#ffff00
SourceDir=file:///usr/share/wallpapers/Cask
Wallpaper=file:///usr/share/wallpapers/Cask/Cloudy Noon - 5K (16:10).jpg

[FormFactor]
PreferredMode=0

[InputDevices]
KeyboardLayout=us

[Screen]
Orientation=1
ScaleFactor=1

[Theme]
AccentColor=#000
BorderRadius=12
CustomColorScheme=Amethyst
DefaultFont="Noto Sans,10,-1,0,50,0,0,0,0,0,Regular"
EnableCSD=true
EnableEffects=true
IconSize=16
IconTheme=Colloid
MarginSize=4
MonospacedFont="xos4 Terminus,12,-1,7,50,0,0,0,0,0,Regular"
PaddingSize=4
SpacingSize=4
StyleType=1
WindowControlsTheme=CadiumGloss

 

Accessing these MauiMan properties is also possible from an application side too: for developers there is the MauiMan public library which exposes all the properties trough a public API. So if you need to know about the current workspace background image source, you could hook to MauiMan::BackgroundManager::wallpaper()  and even connect to wallpaperChanged signal to know in real time when the wallpaper has been changed.

 

#include <MauiMan/backgroundmanager.h>

void func()
{
auto wallpaper = MauiMan::BackgroundManager().wallpaperSource();
}

 

Most of the properties are already quickly accessible via MauiKit Style object,  (for apps developed using MauiKit) which besides syncing to MauiMan changes can also override these properties with in-app specific values and if needed clear those using undefined to return using the MauiMan values.

For example, for setting the style type as dark for an app, despite the global preference being different:

​​​​Maui.ApplicationWindow
{
Maui.Style.styleType: Maui.Style.Dark
}

​and to reset the value back to the global system preference:

​​​​Maui.ApplicationWindow
{
Maui.Style.styleType: undefined
}​ ​​​

CaskServer

To configure Maui Shell preferences and expose those to any other processes, there is CaskServer, which as MauiMan, has two components: a CaskServer daemon for syncing/broadcasting the properties changes and the public library.

The public library allows apps to request Cask to draw custom shadows, title bar colors, and more privacy settings, via the Chrome and Screenshot modules. More modules include Shell, Power, Profiles, and Notifications.

The Shell module allows tweaking the Cask elements such as dock, panels, launcher, popups, etc preferences.

Some of these properties can be modified from Maui Settings, while others, such as properties from the Chrome module, are specific for a given app, so an individual app can be hooked to the Chrome module via the CaskServer library to perform changes to the available properties.

(!) CaskServer as Maui Settings and Maui Shell is still under heavy development and isn’t stable enough yet for commercial use, keep this in mind if you decide to give it a try.

The CaskServer configuration file is located at :

~/.config/Maui/CaskServer.conf


More detailed information about configuring Cask and Maui Shell will soon be shared, as development progresses.

​​​​​​

To follow the Maui Project’s development or say hi, you can join us on Telegram: https://t.me/mauiproject.

We are present on Twitter and Mastodon:

New release schedule

The post Configuring Maui appeared first on MauiKit — #UIFramework.

Monday, 1 May 2023

A month has passed since my last monthly post about my work as KDE Software Platform Engineer. What have I been up to since then?

As usual not everything I did ended up as committed code. A lot of my work is reviewing other people’s code, discussing ideas, and generally being useful to the community.

One area I’ve been focussing on is our infrastructure for global shortcuts. These are currently handled by the KGlobalAccel framework. This frameworks contains the runtime component that manages global shortcuts as well as an application-facing library to interact with the runtime. The runtime and interface library being in the same project has caused us some issues in the past. To address these the runtime part is now split out into a separate project and part of the Plasma group. You can read up more details on this here. This change also allowed for some further changes that made launching applications from global shortcuts both simpler code-wise and more robust. I have also worked on another set of changes that will address some of the pain points that are currently present in our global shortcuts system. While doing that I also addressed some issues I found in the underlying KDE Frameworks libraries.

Another area I worked on is notifications. One thing I did there was reducing the API surface of the KNotification class by hiding internal API that shouldn’t be exposed to application developers. I also proposed a revamped API for specifying notification actions. The new API is both easier to use for application developers and easier to extend with new features in the future.

With a small API change to KStatusNotifierItem, our class for implementing system tray icons, it is now easier for QML applications to fully make use of its capabilities. The API to set an associated window previously was only really usable for QtWidgets apps, now it can be used for QML apps too.

In some Plasma news: Plasma now uses the C++20 standard. This allows us to use some nifty new C++ features. One big one that comes to mind are coroutines, which have the potential to massively simplify parts of our code. Getting there required some tweaks to make our code and our dependencies fully C++20-compliant.

Talking about dependencies: With our move to Qt6 all of our Qt-based dependencies need to make that move too. appstream-qt, the library that powers e.g. Discover is now ready for that too. I helped integrating that into our build infrastructure. Another project with such dependencies is our online accounts system. It depends on libraries like libaccounts-qt and signond, which I’m working on porting to Qt6.

Last weekend I attended the Linux App Summit in Brno, Czech Republic. It was a lovely event that allowed me to get in touch with both people from KDE and our partner organizations like GNOME and Flathub.

To support the work I and many other people do in KDE please consider donating to KDE e.V. Your donations make my work as KDE Software Platform Engineer possible. Thank you for that!

Sunday, 30 April 2023

Here’s my KDE contributions for this month! It’s a little bit shorter than I’d like, but I’m still trying to find a nice balance between $work and KDE.

Extra CMake Modules

I put up MRs for a bunch of small fixes related to the QML module:

These haven’t been merged yet though, I still need to clean them up and give them some polish next month.

Dr. Konqi

I didn’t work on the new UI this month unfortunately, but I did submit two MRs:

Just like ECM this will be in my queue to merge these next month!

Krita.org

[Feature] I finally merged the improved dark mode I started a while ago, for the new Krita.org website! Thanks to everyone, especially Phu and Scott for being patient with me. I can’t wait to see this live soon :-)

Tokdoon

[Feature] I added support for the new Maximize component, which doesn’t change anything functionality-wise but makes our code leaner:

Screenshot of the Maximize component in action!

[Feature] I also pushed along the MR to use the SearchPopupField component from Kirigami Add-ons too, which is another change that doesn’t change anything functionally but will make the code much leaner.

[Feature] Interaction icons were overhauled, not just visually but also their layout has improved. Below is a screenshot of a mobile sized window, where the icons now spread out which will make them easier to tap (I plan on increasing the size on mobile too!)

Screenshot of the new icons in mobile layout

[Feature] The amount of characters you have left is now shown in the composer, which should load from your server (I don’t have anything but a 500-char limit to test with though):

The character count shows up in the bottom-left

[Feature] It’s not merged yet, but I’m adding overhauling how you view posts on profile pages! It has the usual separation of “Posts”, “Replies” and “Media” tabs but you can hide boosts too:

The new profile tabs and post options

[Feature] As a cherry on top, I added icons to some of the menus which makes them easier to quickly navigate:

Example of the new icon filled menu

Some more minor changes:

Keysmith

[Bugfix] I did some touching up work for Keysmith late this month: I fixed a bunch of binding loops, and added better keyboard navigation.

[Feature] I also added a passive notification when you copy the code to your clipboard too:

Example of the notification

There doesn’t appear to be an active maintainer, so I’ll get another reviewer and merge them next month. I also cleaned up some duplicate bugs, and moved some spam off of the tracker.

Kirigami

[Bugfix] While debugging Tokodon, I fixed a rare case where a Kirigami application using our QQC2 Desktop style could crash when closing. This same “fix” could apply to Breeze style too, it warrants further investigation :-)

[Feature] I realized that NavigationTabBar doesn’t have it’s own page on the gallery, so I proposed a new one in Kirigami gallery:

New page thumbnail in Kirigami Gallery

[Bugfix] I’m still looking for people who might know why PlaceholderMessage fails handling overflow, which creates some recursive rearranges. It might be a Qt upstream issue, so it’s another thing to investigate soon!

Friday, 28 April 2023

It’s already two years since I last looked at KDE git history. As I decribed in the latest edition, this is inspired by the work of Hans Petter Jansson for GNOME and use the tool he made (fornalder).

fornalder is a formidable tool. It is easy to use and the documentation in the readme is great. I don’t know if this is because it was programmed in Rust but fornalder was also blazingly fast and most of the time spent during this analysis was spent on cloning the repos.

These stats include all the extragear, plasma, frameworks and release service repository as well as most of the KDE websites and a few KDE playground projects I had on my hard drive. For example, it doesn’t includes most of the unmaintained projects (e.g. kdepimlibs, koffice, plasma-mediacenter, …). Also important to note, is that this doesn’t include translations at all, since they are stored in SVN and added in the git repository with a script which remove authorship information.

I also removed manually all the scripted commits and I merged the contributions from “Laurent Montel” with “Montel Laurent” as well as the one from various contributors whose name changed.

Active Contributors

Number of contributors by years
Number of contributors by years

The explaination for the colors is described by Hans Petter Janssson in his blog post by:

The stacked histogram above shows the number of contributors who touched the project on a yearly basis. Each contributor is assigned to a generational cohort based on the year of their first contribution. The cohorts tend to shrink over time as people leave.

There’s a special “drive-by” cohort (in a fetching shade of off-white) for contributors who were only briefly involved, meaning all their activity fits in a three-month window. It’s a big group. In a typical year, it numbers 200-400 persons who were not seen before or since. Most of them contribute a single commit.

In 2022, the number of active decreased slightly compared to 2021 and 2020, which might be due to the fact that the pandemic ended and people spend less time on their PC contributing to open source projects (which provided an huge boost in 2019/2020).

Commits Count

Number of commits by years
Number of commits by years

In 2022, the number of commits decreased as well, which can be attributed to the smaller number of overall contributors and a bit less activity from some long time contributors.

But I would not worry too much about these numbers as we are still above the 2019 level (pre-gitlab and pandemic) and looking already at the numbers for the first few months of 2023 it’s increasing again.

Conclusion

I would say that KDE is in relatively good health. This is particularly impressive for a project with little corporate backing and with mostly volunteers.

In 2023, we are also finalizing the transition to Qt6 and KF6 with a first release of KF6 and Plasma 6 around the end of this year, begining of next year.

There is no better time to get involved or to consider making a donation!

You can play with raw data in the form of a sqlite dabase (>200Mb)

Thursday, 27 April 2023

The FOSSASIA Summit 2023, held from April 13-15 at the Lifelong Learning Institute in Singapore, As an exhibitor for KDE at the FOSSASIA Summit 2023, I had an incredible experience showcasing our latest projects, networking with industry professionals, and engaging with attendees from all walks of life. I was thrilled to be part of such an esteemed gathering of like-minded individuals, all of whom were dedicated to advancing the field of open-source software development.

For context, FOSSASIA is an organization developing open source software applications and open hardware together with a global community from its base in Asia. Its goal is to provide access to open technologies, science applications and knowledge that improve people’s lives. FOSSASIA was established 2009 by Hong Phuc Dang and Mario Behling. Visit https://fossasia.org to learn more about the summit.

Getting back to the activities, our booth at the exhibition hall was bustling with activity throughout the three-day event, as developers, engineers, students, and enthusiasts stopped by to learn more about our latest offerings. I was particularly proud to showcase our flagship product, the Plasma desktop environment, along with KDE Connect, Dolphin, Konsole and other applications and tools that we have developed for the open-source community.

As I explained the features and benefits of our software to attendees, I was struck by the level of interest and enthusiasm that they showed for our products. It was clear to me that we are making a real difference in the lives of users around the world.

Beyond showcasing our products, the event was filled with informative keynote sessions and panel discussions, featuring speakers from around the world who shared their experiences and insights on open-source software development. As an exhibitor, I was particularly impressed by the discussions on collaboration and the importance of building sustainable communities around open-source projects. It was clear to me that the open-source community is dedicated to advancing the field of software development in a collaborative and sustainable way, and I am proud to be a part of that community.

In addition to networking with other industry professionals, I also had the opportunity to engage with potential users of our software. I was delighted to see the level of interest and enthusiasm from attendees, many of whom were eager to learn more about our software and its features. As I explained the benefits of using open-source software, I was struck by the level of curiosity and enthusiasm that attendees showed for our products.

I also met some old accomplices from KDE and local technical communities from Delhi. Anu Mittal, now working at a company in Singapore, attended the conference and also spent time with me, manning the booth and talking to many visitors at our booth about KDE software. I also met Raju Devidas, a Debian developer who has been contributing to Debian for more than a decade. He was manning the Debian booth along with a few other developers from Sri Lanka.

Overall, the FOSSASIA Summit 2023 was a resounding success for me as an exhibitor for KDE. I was able to showcase our latest products, engage with attendees, and collaborate with other industry professionals. I look forward to participating in future FOSSASIA Summits and continuing to contribute to the growth and development of the open-source community.

You can find the event photos here. I hope that these photos will help you experience some of the highlights of the summit!

I will post a few photos from the album above.

Gallery

I would like to extend my heartfelt gratitude to KDE e.V. for sponsoring my visit to the FOSSASIA Summit 2023 as an exhibitor for KDE. Without their support, I would not have had the opportunity to showcase our latest products and engage with attendees at this important event. Their continued support for the development of open-source software and the promotion of collaborative communities is truly inspiring, and I am honored to be a part of the KDE community. I look forward to continuing to contribute to the success and growth of our community, and I am grateful for their support in helping me make this visit to FOSSASIA Summit a resounding success.

Saturday, 22 April 2023

Arianna 1.0.1 🔗

Carl Schwan CarlSchwan 12:00 +00:00
RSS

I’m happy to announce the first bugfix release of Arianna. This release contains a lot of improvements to the accessibility of Arianna. Thanks a lot to @bgtlover@linuxrocks.online who reported many accessibility issues. Aside from fixing some bugs in Arianna, this also resulted in fixes in Kirigami, Kirigami Addons and Qt, which are on a seperate release schedule so not every bug fixes is already available. I’ll write a seperate blog post which will go into the technical details.

Aside from the accessibility fixes, this release fixes a few crashes when parsing some books. Thanks to those who tried Arianna and reported bugs (with backtrace!).

And finally, this release also improve the translations coverage, with for example Galician being one of the new supported language.

Get Involved

If you are interested in helping, don’t hesitate to reach out in the Arianna matrix channel (#arianna:kde.org) and I will be happy to guide you.

I also regularly post about my progress on Arianna (and other KDE apps) on my Mastodon account, so don’t hesitate to follow me there ;)

And in case, you missed it, as a member of KDE’s fundraising working group, I need to remind you that KDE e.V., the non-profit behind the KDE community accepts donations.

Packager section

You can find the package on download.kde.org and it has been signed with my GPG key.

Friday, 21 April 2023

New Falkon version 23.04.0 is being released as part of KDE Gear.

Notable changes

There is a handful of changes in this release.

KWallet

The format under which the passwords are stored has changed from Binary to Map. The passwords can now be viewed from within KWalletManager and even edited. While editing and adding new ones I would be careful with the data field and updated that as well. (This is some Falkon password internal mechanic) The Folder under which the passwords are stored changed from Falkon to FalkonPasswords. This was done to not overwrite the old passwords and potentialy ruin them during the migration to new format.

Support for dark color scheme

Note: This is NOT browser dark mode support.

Falkon internal pages now respect the dark color scheme, if it is forced through chromium flags in environment variable.

A small demonstration can be seen below. The color scheme might not be the best since it was designed on display with weird color settings.

Falkon: Light and Dark styled page
Falkon: Light and Dark styled page

Changelog

  • Look for spellchecking dictionaries at location specified by QTWEBENGINE_DICTIONARIES_PATH environment variable
  • Show QtWebEngine version on Falkon Config page
  • Implement prefers-color-scheme (dark mode) for internal pages
  • Add option to enable GPU acceleration (by Hao Chi Kiang)
  • PyFalkon: addBookmark - make C++ own parameters (fixes potential crash)
  • KWallet: Store passwords in a map format
  • History: Don’t delete all items under dates when filtering
  • AdBlock: Workaround for “Blocked content” page
  • AddressBar: Search with default search engine by default
  • Fix crash when adding new folder to the bookmark toolbar
  • Fix: Bookmarks folder disappears when moving it onto itself

Download: ffalkon-23.04.0.tar.xz (sig signed with EBC3FC294452C6D8)

Recently I started using KTimeTracker to record the time I spent working, and I really like it. So far it’s the only productivity app that meets my needs. So I began playing with porting it to Qt6.

I’m weak with algorithms, but I know my way with building programs. I made a long fluff post about compilation, even. So I was feeling confident that I would make at least some progress.