Skip to content

Thursday, 11 June 2026

Structure of code and logic for tournaments in the Mankala Engine.

So, we want the tournaments to be able to:

  • Create custom game rooms (with different variants, number of players, and time limit)
  • Join the rooms with room codes.
  • Create elimination brackets for players.
  • Have empty slots filled with computerized opponents.
  • A scoreboard after the game for final rankings.

The tournament is going to be part of the Multiplayer variant. For that, when a person clicks on Multiplayer game mode, they will be asked to select from the given two options of a casual 1 to 1 game or another a tournament. Then they will be asked to either create a room or join the room with the code.

Key elements to implement:

  • Room codes will be created by mapping XMPP MUC JIDs (e.g., A3F7K2 → tournament-a3f7k2@conference.server.com).
  • Fill computerized opponents: When it is detected that there is an absence of required players, the game will be filled with computer opponents in all the empty spots, just like we have for the vs AI game mode.

Here is an example of how the tournaments.cpp can be implemented:

class TournamentManager : public QObject {
    Q_OBJECT
    Q_PROPERTY(QVariantList tournaments READ getTournaments NOTIFY tournamentsChanged)
    Q_PROPERTY(QVariantMap activeTournament READ getActiveTournament NOTIFY activeTournamentChanged)
    
public:
    // --- Tournament duration ---
    Q_INVOKABLE QString createTournament(
        const QString& variant,       // "Bohnenspiel", "Oware", "Pallanguli"
        int maxPlayers,               // eg. 4, 8, 16
        int durationDays,             // tournament duration
        const QString& organizerJid   // creator's XMPP JID
    );
    
    Q_INVOKABLE void joinTournament(const QString& roomCode, const QString& playerJid);
    Q_INVOKABLE void startTournament(const QString& tournamentId);
    
    // --- Match management ---
    Q_INVOKABLE void reportMatchResult(const QString& matchId, 
                                        const QString& winnerJid);
    Q_INVOKABLE void advanceBracket(const QString& tournamentId);
    
    // --- Computer Opponents ---
    Q_INVOKABLE void fillEmptySlots(const QString& tournamentId);
    
    // --- Room codes ---
    Q_INVOKABLE QString generateRoomCode();
    Q_INVOKABLE QString resolveRoomCode(const QString& code);

signals:
    void tournamentsChanged();
    void activeTournamentChanged();
    void matchReady(const QString& matchId, const QString& player1, const QString& player2);
    void tournamentComplete(const QString& tournamentId, const QVariantList& rankings);
    void playerJoined(const QString& playerJid);
};

For filling empty spaces we can use the logic as:

struct Match {
    QString matchId;
    QString player1Jid;   // empty string = unfilled slot
    QString player2Jid;
    QString winnerJid;
    int round;            // 0 = first round, 1 = quarter-finals, etc.
    int position;         // position within the round
    bool isAIMatch;       // true if one/both players are computer
};

class TournamentBracket {
public:
    void initialize(int playerCount);              // builds bracket tree
    void seedPlayers(const QStringList& playerJids); 
    void fillWithAI();                             // fills empty slots
    Match getNextMatch() const;
    void recordResult(const QString& matchId, const QString& winnerJid);
    bool isComplete() const;
    QVariantList getRankings() const;
    
private:
    std::vector<std::vector<Match>> m_rounds;  // rounds[0] = first round, etc.
    int m_totalRounds;
};

At the end of the elimination cycle and the tournament bracket, we can get the results and show them on our created leaderboard page with the XMPP icons, usernames, and the number of games the players won.

What more can be added?

I plan to research more on whether we can store and display these games in the player profiles and create a communication channel for the players and spectators during the ongoing game, which could be both text and voice chat using XMPP and other relevant communication protocols.

Thanks for reading. 👀

Wednesday, 10 June 2026

This is a weekly update from my Google Summer of Code 2026 project with KDE, improving effect widgets in Kdenlive.

Week 2 was about getting feedback and doing it right.

After opening the draft MR for the Curves Widget, my mentor Jean-Baptiste reviewed the approach and suggested a cleaner architecture. The original implementation packed all 4 channel parameters into a single compound parameter. JB's feedback: each channel should be its own separate av_curve parameter in the effect XML, and AssetParameterView should share one CurveParamWidget across all of them; similar to how m_mainKeyframeWidget works for keyframe parameters.

This was a significant refactor but the result is much cleaner:

  • avfilter_curves.xml now has 4 separate parameters; av.master, av.r, av.g, av.b, each with its own name and description
  • AssetParameterView creates the CurveParamWidget on the first av_curve param, then calls addAvCurveTab() for each subsequent one
  • Each tab is tied to its own model index; valueChanged fires per-parameter independently
  • serializeAllChannels() is gone entirely;each channel just emits its own value

All four tabs (All, R, G, B) are working correctly. Per-channel state is preserved when switching tabs. Project save and restore works. The MR is now updated with the refactored approach and waiting for JB's review.

The All tab applies a curve to all channels simultaneously:

Curves widget — All tab

Switching to the R tab adjusts only the red channel independently:

Curves widget — R tab with red tint

Week 3 is already underway; the MR is pushed and waiting for JB's review. More updates next Sunday.

Monday, 8 June 2026

E.P. Unny is a notable Indian political cartoonist, who worked/works with famed Shankar’s Weekly and news papers such as The Hindu and Indian Express.

Since 2020, all his cartoons (also 2025, 2026 so far) are published — every week — open-access by Sayahna Foundation.

Unny was using a font based on his handwriting style for the cartoons, designed by K.H. Hussain of Rachana. Recently, a new font designed by Varshini KVSS & ‘Kandam Collective’ is developed by Rachana Institute of Typography to use in the cartoons, and it is released as open source — see the specimen and download links.

The character set of the font is Latin only. There are plenty of alternate glyphs (for upper case and lower cases of i, j, l, g, etc. — for instance check the double ‘l’ in ‘Intelligence’ on the specimen above). Such characters are rendered alternately to give a feel of the randomness that handwriting evokes.

The source (and issue tracking) are available at RIT fonts repository.

Sunday, 7 June 2026

digiKam 9.1.0 Preview Canvas Displaying an HEIF Photo Taken With Apple 15 Pro

Dear digiKam fans and users,

After three months of active development, bug triage, and feature integration, the digiKam team is proud to announce the stable release of digiKam 9.1.0. This version builds on the foundation of 9.0.0, introducing new features, performance improvements, and a significant number of bug fixes to enhance stability, usability, and workflow efficiency. This release focuses on database migration, preview enhancements, advanced search, and usability improvements across the board.

Saturday, 6 June 2026

Size Maters 🔗

Nuno Pinheiro pinheiro 21:40 +00:00
RSS

So… more Oxygen icons 🙂

This weekend I been filling some of the more obvious holes in the icon set and recently these 2 landed.

The first one is for KeepSecret, the application that is replacing the old KWallet.

Security icons are funny. There are only so many ways to draw "keep your stuff safe" before you end up with another lock icon. Or a key. Or a lock pretending not to be a lock.

I ended up going with a small vault door. Which is basically also a lock pretending not to be a lock but at least it looks kinda cool, and more important I think it looks as smart as our users are...

The other one is for generic package managers.

And apparently software still arrives in wooden crates. 😀

I dont know who started this visual convention but after all these years I kinda stopped questioning it. Software packages are boxes. Everybody understands boxes. Lets move on, and debate the real important things such as the relevance of the save icon as a flopy device 😉

One thing that I love about icon design is how different the process becomes depending on size.

At large sizes you can spend hours messing around with materials, reflections, shadows and tiny details.

At small sizes all that disappears and suddenly you are fighting for every pixel. trying to keep the meanigfull details and creating a source svg monster in Oxygen repo 😀

I think icon design is really just the art of deciding what can be removed before the whole thing falls apart.

Talking about things that may or may not fall apart…

I've also been spending some time exploring styling in QML and thinking about possible future directions for O².

Nothing concrete yet.

Mostly experiments.

Some ideas are sensible.

Some ideas are absolutely not sensible. On propose 😀

The main goal is realy to show range of things I would ike to see available on Union.

Those are usually the interesting ones.

Right now I'm more interested in exploring the range of possibilities than deciding what a final result should look like. There are some surprisingly fun things hidden in there.

If all goes well we will soonish publish a video with KDAB showing some of these experiments and crazy ideas.

Or at least the ones that dont completely explode before then 😉

So stay tuned.

And as always, thanks for using Oxygen.

This old project still finding new excuses to keep going.

The second maintenance release of the 26.04 series is out with the usual batch of bug fixes and improvements for workflow and stability. This update comes with fixes to rendering, timeline editing, project file handling, and Windows, MacOS, AppImage and Flatpak packaging.

One noteworthy bug closed in this version is a fix on Windows to finally allow exporting your videos to a network drive, closing a 4-year-old bug.

Head to our download section to get the latest binaries, or check the updates from your package manager. Please note that for Linux only AppImage and Flatpak are supported by the Kdenlive team.

For the full changelog continue reading on kdenlive.org.

Welcome to a new issue of This Week in Plasma!

This week the team continued polishing Plasma 6.7 for its release later in the month. As such, this week saw mostly bug fixing.

Notable UI improvements

Plasma 6.7

Hovering over a partially-visible item in the Kickoff Application Launcher widget no longer unexpectedly automatically scrolls the view to show the entire item. (Christoph Wolk, KDE Bugzilla #426015)

Spectacle’s feature to automatically copy the screenshot to the clipboard is now temporarily turned off while extracting text via OCR, so that the extracted text makes it onto the clipboard instead. (Tobias Fella, KDE Bugzilla #520758)

When launching an app from a terminal window, the animated launch feedback effect now ends after the app launches, as expected. (Nicolas Fella, Vlad Zahorodnii, and Akseli Lahtinen, KDE Bugzilla #459986)

Plasma 6.8

Notifications about connected devices having low battery power are now shown in full-screen apps so you won’t miss them, just like notifications for the internal battery being low. (Jan Bidler, plasma-workspace MR #6623)

The Peek at Desktop and Window Aperture effects now respect the system-wide animation speed setting. (Sudip Datta, KDE Bugzilla #490531)

Frameworks 6.27

KRunner now assumes you mean US pints rather than Imperial pints when you convert to or from them, since pints are still official in the USA. (Nate Graham, kunitconversion MR #86)

After After
Before Before

Disk sizes displayed in various places now fully respect your preference regarding storage units. (Tobias Fella, KDE Bugzilla #518493)

Notable bug fixes

Plasma 6.6.6

Fixed a case where Plasma could crash while refreshing the list of nearby wireless networks. (David Edmundson, KDE Bugzilla #519739)

Fixed an issue that reset custom tiling layouts on portrait-rotated monitors after restarting the system. (Hynek Schlindenbuch, KDE Bugzilla #514355)

Searching for an app in the Kicker Application Menu widget and launching one that isn’t the first item in the search results list no longer launches it twice. (Christoph Wolk, KDE Bugzilla #521001)

Plasma 6.7

Fixed a regression in VNC-based screen sharing that prevented the Ctrl and Alt modifier from being sent to the machine being controlled. (David Edmundson, KDE Bugzilla #519690)

Fixed an issue that could make Plasma freeze if you quickly switch months in the Digital Clock widget by dragging on the calendar view multiple times in quick succession. (Sander Wolswijk, KDE Bugzilla #511028)

Made the Task Manager Widget’s “Move to Desktop” feature work on grouped tasks. (Hynek Schlindenbuch, KDE Bugzilla #520777)

Fixed two issues with the Grouping widget: not re-appearing instantly after undoing deleting it, and a phantom header remaining visible after removing the last app from it. (Tobias Fella, KDE Bugzilla #517044 and KDE Bugzilla #517043)

Fixed a variety of issues with icons or list items not properly reversing themselves when using a right-to-left language like Arabic or Hebrew. (Tobias Fella and Akseli Lahtinen, KDE Bugzilla #518932, KDE Bugzilla #518909, KDE Bugzilla #518935, KDE Bugzilla #518835, and KDE Bugzilla #518837)

Made System Settings raise and focus its window as expected when launched using a higher-than-default level of focus stealing prevention. (Kai Uwe Broulik, systemsettings MR #408)

Frameworks 6.27

Switching between light and dark Global Themes no longer sometimes results in various UI elements in Plasma only changing their colors halfway. (Marco Martin, KDE Bugzilla #503671)

Fixed an issue saving and retrieving config data in cases where a setting has been given a system-wide default value by the OS vendor that differs from KDE’s own default value. (Nicolas Fella, KDE Bugzilla #509416)

Fixed various related issues with network shares auto-mounted using systemd, including the trash not working properly, and appearing strangely in GUI apps. (Oliver Schramm, KDE Bugzilla #518012)

Fixed an issue that made it impossible to rename files on the desktop via the “Suggest new name” feature in the overwrite dialog. (Akseli Lahtinen, KDE Bugzilla #509461)

How you can help

KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.

Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team!

Beyond that, you can help KDE by directly getting involved in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.

You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.

To get a new Plasma feature or a bug fix mentioned here

Push a commit to the relevant merge request on invent.kde.org.

Thursday, 4 June 2026

This week, I completed the port of KeepSecret's actions to the new org.kde.kirigami.actioncollection API from kirigami-app-components, a recently introduced library developed by Marco Martin (notmart).

Before working on this task, actions were defined separately throughout the UI. With ActionCollection, I could define each action once in a central place and then reuse it wherever it was needed. This makes the code easier to maintain and also integrates KeepSecret with KDE's standard shortcut system, allowing users to configure shortcuts through the usual KDE interface.

The main change was creating a dedicated Actions.qml file with AC.ActionCollectionManager as the root element. Inside it, actions are now centrally defined across three collections — one for the wallet list, one for wallet contents, and one for item details. These include actions such as New Wallet, New Entry, Search, Lock, Unlock, Copy Password, Save, Revert, and Delete.

During review, additional actions were added, dependencies were simplified, and Flatpak build issues were addressed. Since kirigami-app-components is still very new, some CI and packaging adjustments were needed before everything built correctly.

The merge request !29 has now been reviewed, approved, and merged into KeepSecret.

Next up is the Import/Export feature — I'll be studying KeepSecret's wallet data structures and designing the file format this week.

Hello Reader!

In case you don't know me (quite likely 😆), I am Ojas Maheshwari (@the_epicman:matrix.org) and I am currently working in the Google Summer of Code program for the KDE community on a project about Font Subsetting in Poppler under my mentor Albert Astals Cid.

Community Bonding

If I am being honest, I had already bonded with the Poppler community before GSoC started 😅

I had a lot of conversations with Albert, Sune, lbaudin and ats, and they already helped me a lot with my technical problems with my contributions prior to GSoC :D

However, I also managed to bond with other fellow GSoC contributors this summer so it's a win in my book :D

Week 1

I learnt a lot about how PDF files work this week.

Technical terms like Indirect Objects, Default Appearance, Appearance Streams which used to sound confusing to me before finally clicked.

I got more comfortable with traversing and using PDF data structures such as Objects, Arrays, Dicts, Streams etc.

The Happy News is that I got the Font Subsetting to work for FreeText Annotations.

I have raised a Draft MR which should be ready-to-review by end of this week and my plan is to get it fully correct and merged first and then move on to doing the same thing for forms.

A picture of my IDE containing my work
Code screenshot to make the blog look cooler

How it works

If you are interested to know what my current approach is:

  • The whole subsetting runs only when the user saves the document.

  • We go over all resources (for now, just FreeText annotations) that were modified, and call a subsetFonts method on them.

  • This is a method implemented by every class that needs subsetting, and inside this method we pass the data on what "font" renders what part of the "text" to our FontSubsetter::getSubsetFonts.

std::map<Ref, Ref> FontSubsetter::getSubsetFonts(const std::map<std::shared_ptr<const GfxFont>, std::string> &fontMappings) const
  • The function generates the subset font objects and adds them to the PDF and returns mappings of old font refs and newer font refs. The subsetting happens using a library called "Harfbuzz".

  • Then the subsetFonts function simply replaces the older refs with the newer ones inside the font subdictionary of the appearance stream of the annotation.

Thanks for reading

Although this blog might look small, it took me more than 1.5 hours to write this because I kept writing and deleting things. I am hoping I get better at writing blogs in the future.

But anyways, thanks for reading!
And have a great day !
Byee 😃!

Luis Cañas Díaz and I shared lessons from our BI journey at the Eclipse Foundation SDV webinar — from open source to automotive. Methodology, real use cases, and hard-won lessons on data, metrics, and insights.