Better late than never! After quite a few requests, here’s the second part of my backpacking adventure through the Balkans from back in July. If you missed the first part, you can check it out here.
After leaving Croatia, I traveled to the central Balkan countries: Bosnia and Herzegovina and Serbia.
Mostar
Since there were no trains from Split to Mostar, I took the bus instead.
Stop on the middle of the road
Landscape from the bus
In Mostar, I stayed at another Hostel called Taso’s House. It was a small hostel
but the host made us discover the whole Herzegovina region and explained us a lot
of things about his country, the complex political situation there and how it
was to grow up in Mostar during the war.
The old bridge of Mostar
View from the old bridge
Bunker for airplanes build during the Yugoslavia time
Town next to Mostar called Blagaj
Another view of Blagaj
Two rivers merging together and creating some waterfalls
The same two rivers
Old Bosnian village
The Kravice Falls
The group of people I spent my time in Mostar
View from Mostar in the evening
Close view from the old bridge
I only stayed there for two nights, and I regret not staying a bit longer or
visiting the genocide museum, which I’d heard great things about.
Sarajevo
The next stop on my trip was Sarajevo, the capital of Bosnia and Herzegovina. I
booked a train ticket online, and this is what I got. It was slightly tricky to
import into KDE Itinerary, but the train ride itself was very enjoyable.
Interestingly, although the train has both first- and second-class coaches, all
tickets are sold as second class, and passengers are free to sit in the
first-class coaches — which I did. 😉
Sarajevo itself was beautiful, and I took the cable car up into the mountains
to visit the old Winter Olympics park. I even ended up appearing on the
city’s television YouTube channel
as a sort of side quest, along with three Australians.
River in Sarajevo
Taking the cable car
Old Bobsleigh
Old destroyed building by the war
View from the old destroyed building
View of Sarajevo
A copper shop (there was a lot of them in Bosnia)
Belgrade
Afterward, I went to Serbia — more precisely, to the capital, Belgrade. I took
a night bus, which turned out to be a bit stressful. I almost missed it because
I didn’t have one euro in cash to pay a surprising platform fee to enter the bus
station. Then, at the border around 2 a.m., I was the only one who had to go
through a full luggage check.
In Belgrade itself, I didn’t do much. I spent a lot of time at the hostel
talking with other travelers and petting the hostel cat. I was a bit shocked by
the amount of military propaganda I saw everywhere in the city.
Me before taking the bus
Cool place in Belgrade full of bars
The citadel. There was a massive amount of old war machines next to it.
Ice tea
Matcha <3
A orthodox church
The crypt of orthodox church
Soviet style monument about the second world war
The cutest cat ever <3
Niš
On my way to Bulgaria, I made a short stop in Niš, in southern Serbia. It’s one
of the largest cities in the country and has a strong Turkish influence.
Entrance of the old Turkish fortrest in Nis
The other side of the entrance of this fortrest
Selfie of me :)
Sofia
My next stop was Sofia, the capital of Bulgaria. Since there are no longer any
passenger trains running between Niš and Sofia, I took an old bus from Niš
across the Serbian and Bulgarian countryside, but the ride was confortable.
I only stayed one day in Sofia and scrolled the city with some people I
meet in my hostel.
I visited the ‘Red Flat’, which was a time capsule of how
a flat looked during the end of the comunism time. This was quite a retro experience.
I also ended up visiting more orthodox churches.
A train
Morning Matcha <3
The living room of the 'Red Flat'
The bedroom room of the 'Red Flat'
Another gigantic orthodox church
Istanbul
The last stop on my trip was Istanbul. I took the night train there, which
turned out to be a bad experience — we ended up waiting four hours at the
border, and the whole process was quite inefficient.
Istanbul itself was amazing. I had originally planned to stay only three days
before heading back to Bucharest, but I found a cheap flight (€50 with luggage)
back to Berlin, so I ended up staying a total of six days. I stayed at a hostel
called Second Home Hostel, which turned out to be a
really fun place. The staff were extremely friendly, I met a lot of amazing
people there, and we went out partying almost every night.
I also meet Jon Worth who was working on his
#CrossBorderRail project and was at the same time in Istanbul.
The night train I took
Me at 2 in the morning waiting for border check
Me in front the Hagia Sophia
One more hostel cat :)
Small cute street
Lot of olives
Nice food but I can't remember what was inside, just that it was vegetarian and with some rice
More cute street
Interior of a mosque
The spice market
I drank some chai so many times a day
And there was cats everywhere
Famous umbrella street
Beach during a day trip
Istanbul by night
View from a ferry to the other side of Istanbul
The group of people I hanged with during this trip
Prince island
One of the biggest wood structure of the world: Büyükada Greek Orphanage
The Blue Mosque
The Blue Mosque inside
Sunset
Selfie on a ferry
Selfie after going to a hammam/turkish bath
And now back to the reality but I am already looking forward to my next
backpacking trip.
A script element has been removed to ensure Planet works properly. Please find it in the original post.A script element has been removed to ensure Planet works properly. Please find it in the original post.
One of the key problems we identified with previous KDE neon releases was that only user edition was receiving any meaningful testing. This often lead to a situation where problems were identified only when user edition was being readied for public release and bug squashing was hurried and therefore less than ideal.
To try and fix this problem, a dev archive named stable was created (this happened in Novemeber 24) and the daily builds for the neon testing are now uploaded there. Various automated and manual tests are run and when we are happy (usually at least on a weekly basis), the archive is snapshot out to the public facing testing archive. This is the same process that is utilised for KDE neon user edition which is snapshot from the dev based release archive.
So hopefully users of KDE neon testing and user editions have seen improved stability and less critical bugs over the last year. Live ISO’s are available to try at https://neon.kde.org/download
"This Week in KDE Apps" is back! It's been a long time since the last issue, but every week, we cover as much as possible of what's happening in the world of KDE apps.
Getting back to all that's new in the KDE App scene, let's dig in!
Yuki Joou improved the handling of sender information in the mail viewer header (25.12.0 - link). She also fixed the mail composer not showing the right sender address (25.12.0 - link).
Merkuro Calendar Manage your tasks and events with speed and ease
Yuki also worked on Merkuro Calendar and fixed adding sub-items to tasks (25.12.0 - link), added a menu button to show/hide all calendars from an account (25.12.0 - link), and made sure we are only showing one refresh button in the account context menu (25.12.0 - link)
Supporting PIM libraries
Volker Krause made some more parts of the KMime API const correct and adapted various parts of the PIM codebase to that.
Allen Winter made Akonadi prefer MariaDB to MySQL when both are available (25.12.0 - link).
I’m delighted to announce the new 6.1.0 release of KPhotoAlbum, the photo management software for KDE/Linux!
This is the first new release of our new KF6/Qt6 port, and it brings some fine-tuning, but we could also bring forward the code apart from bugfixes. here's the ChangeLog:
Added
Add command line option --config
Add command line option --save-and-quit
Add home and end key shortcuts to date bar
Add option to append description text when changing multiple image descriptions (#470433)
Show visual feedback when setting a rating in the viewer (#509964)
Changed
index.xml file format version bumped to “11”: The new file format version improves the “compressed” file format and handles arbitrary category names correctly. Positionable tags are also now stored natively in the “compressed” file format with far less overhead.
Disable “View” actions when not appropriate (#505185)
It's been another few weeks of progress on the KWin GameController Plugin and I've got a lot to share! After spending the previous weeks setting up the foundation, I've progressed things forward by improving the logic a bit more, creating a few integration tests, integrating it into System Settings, and making sure it runs well on real hardware like the steamdeck.
The primary change was splitting up GameController into two classes. The new one being GenericInputDevice which lives in emulatedInputDevice.{cpp/h}. This allowed me to separate the GameController logic responsible for emulating keyboard and mouse into it's own separate class. Now GameController wrapper class is just responsible for monitoring controller input, resetting idle timer on user activity, and logging.
GenericInputDevice
GenericInputDevice is a class that inherits from InputDevice and is used to emulated Keyboard/Mouse in order to send those inputs through KWins input pipeline. The input_events come from GameController and get processed exactly like they were previously. Each GameController has access to an instance of GenericInputDevice to make its own calls. In the near future I plan on creating a static instance of this class for all GameController to access.
// Inside Gamecontroller construct
m_inputdevice=std::make_unique<EmulatedInputDevice>();KWin::input()->addInputDevice(m_inputdevice.get());..// GameController Event Handling Function
voidGameController::handleEvdevEvent(){input_eventev;for(;;){constintrc=libevdev_next_event(m_evdev.get(),LIBEVDEV_READ_FLAG_NORMAL,&ev);if(rc==0){logEvent(&ev);input()->simulateUserActivity();if(m_usageCount==0||isTestEnvironment)m_inputdevice->emulateInputDevice(ev);..// EmulatedInputDevice
voidEmulatedInputDevice::emulateInputDevice(constinput_event&ev){m_ev=ev;if(ev.type==EV_KEY){qCDebug(KWIN_GAMECONTROLLER)<<"Face button pressed: Simulating User Activity";evkeyMapping();}elseif(m_ev.type==EV_ABS){qCDebug(KWIN_GAMECONTROLLER)<<"Analog buttons pressed: Simulating User Activity";evabsMapping();}}voidEmulatedInputDevice::evkeyMapping(){boolstate=m_ev.value?true:false;std::chrono::microsecondstime=std::chrono::seconds(m_ev.time.tv_sec)+std::chrono::microseconds(m_ev.time.tv_usec);switch(m_ev.code){caseBTN_SOUTH:// A button → Enter
sendKeySequence(QKeySequence(Qt::Key_Return),state,time);break;caseBTN_EAST:// B button → Escape
sendKeySequence(QKeySequence(Qt::Key_Escape),state,time);break;caseBTN_NORTH:// X button → Virtual Keyboard
// TO-DO toggle Virtual Keyboard not working on my distro ( Kubuntu )
EmulatedInputDevice::toggleVirtualKeyboard(QStringLiteral("forceActivate"));caseBTN_WEST:// Y button → Space
sendKeySequence(QKeySequence(Qt::Key_Space),state,time);break;caseBTN_TL:// L button → Ctrl
sendKeySequence(QKeySequence(Qt::Key_Control),state,time);break;caseBTN_TR:// R button → Alt
sendKeySequence(QKeySequence(Qt::Key_Alt),state,time);break;caseBTN_START:// START button → Meta
sendKeySequence(QKeySequence(Qt::Key_Meta),state,time);break;caseBTN_SELECT:// SELECT
break;// Add more button mappings here as needed
default:break;}}..
Integration Test: Qt Test
Part of the requirements for proposing significant contributions to KWin is creating integration test. This provides some assurance that things, like core functionality of the plugin, won't break so easily in the future as new code gets added. For testing KWin, uses the Qt Test Framework. Learning how to use the framework to create my own tests has been fairly simple and straightforward. Still, what exactly to test, and how to test it, was not so straightforward.
I learned along the way that I'd be creating integration tests, instead of unit tests. The tests don't reference the plugins directly; instead, they test the effect of the plugins on the system overall. That meant that things which required an instance of the plugin to test were not possible in this case. That included testing hotplug capability, or the number of applications that the plugin thinks have opened an input device. Thankfully there were few very important functionalities that could be tested!
Those include:
// Test system idle time reset. Prevents suspend
voidtestResetIdleTime();// Test Controller To Keyboard Input Emulation
voidtestKeyboardMapping();// Test Controller To Pointer/Mouse Input Emulation
voidtestPointerMapping();
I took a lot of inspiration from the buttonrebind_test.cpp.
System Settings KCM
It was agreed upon early on that this plugin would be opt-in, giving the user to enable and disable it when they choose. For that I created a KDE Control Module or KCM. Or better put, I built on the existing Game Controller KCM :) I added a new UI element, a toggle, for users to enable and disable the plugin. On the backend, I added a Q_PROPERTY, pluginEnabled, which is responsible for checking the kwinrc Plugin configs, and writing to them, in order to manage the state of this plugin. This is what it currently looks like (subject to change):
Handling Lizard Mode
This was probably one of the most daunting parts of the project for me when I first started. I knew that steamOS had its own way of handling input coming from the Steam Deck controller which has nothing to do with KDE or Steam app. This is what allows the controller to work for navigating the device in game and desktop mode. It's what is refered to as "Lizard Mode". The controller -> keyboard/pointer rebinds that I implemented was based off of the rebinds of this Lizard mode. Ideally using a controller to navigate desktop feels/works the same across all devices on KDE.
It's important that this new plugin not disrupt the current input system for the steamdeck. Originally I was warned that opening the fd for this device would cause Lizard mode to be disabled, which would mean I would have to either:
A: Find a way to disable Lizard mode and implement it from scratch...
B: Figure out what disabled Lizard mode on FD open and how to prevent / enable it as needed.
or C: Just change the flag for opening the controller fd and everything works just fine :)
Yup. After some testing and the smallest change I've had to make all project the Steam Deck controller was able to be detected by the plugin as well as its input detected! Even better than that, and not sure why I did not put this together before, Steam Deck already maps its input to keyboard/mouse. Duh. So this gamepad plugin doesn't need to worry about mapping and of Steam Deck input to just use it prevent system sleep when activity from that controller is detected.
During my testing, I discovered that Steam Deck shows up on the system as 5 different controllers. Each having their own purpose, one to handle analog input (triggers, trackpads, sticks) another to handle face buttons & D-pad, another for keyboard, etc.. These are used by the system depending on the users needs. Again, this made life a lot easier. This are logs from evtest and gamecontroller plugin:
At the start of this project I had adopted a child. Some of you reading this post might have met my child. It's named. It had been drifting inside the KDE community some time, looking for someone to take care of it. But it never happened, and thus time just went on, and on.
As some put it:
Wow this is an ELEVEN (!) year old bug.
This issue is so old it can go to middle school.
and my favorite
Is there any hope that this bug will be fixed before the heat death of the universe?
By the time I met Bug328987, it had been around for ≈12 years. But still! In the eyes of KDE, it was a young, bright eyed, workflow-breaking bug, like all the bugs out there, and it had potential to be fixed! After months of back and forth with mentors, living in KDE matrix server like it were my personal Discord server, and learning how to not do things in the code base - I'm proud to say gamecontroller plugin properly addresses Bug328987. Bringing to an end its more than a decade long journey. They grow up so fast.
What’s next from here
Integration into Kwin Proper: "Draft" label has been removed from MR and is ready for review.
Final Fixes and Touch-up: Get Virtual Keyboard working, KCM toggle hot-plug, improve analog -> pointer emulation.
Beyond Keywords: How I Built a Semantic Search Engine for Any Video Ever tried to find a specific moment in a long video? You might remember the scene vividly—a character gives a crucial speech, or there’s a beautiful, silent shot of a landscape—but you can’t remember the exact timestamp. You end up scrubbing back and forth, wasting minutes, or even hours, trying to pinpoint that one moment.
Traditional video search relies on titles, descriptions, and manual tags.
The highlight of this release is the playlist, which got a lot of features:
multiple playlists through tabs (Muhammet Sadık Uğursoy)
drag and drop reordering (Muhammet Sadık Uğursoy)
add files and folders through drag and drop (Muhammet Sadık Uğursoy)
filtering (Muhammet Sadık Uğursoy)
option to control playback behavior when a file ends: repeat playlist, repeat file, stop after last file in playlist, stop after current fille and play a random item
Another big change is to the Mouse settings, now you can use a mouse button + modifier key combo (ctrl + left click, shift + scroll up/down etc.).
Feature requests and bugs should be posted on bugs.kde.org, ignoring the bug report template can result in your report being ignored.
Changelog
1.5.0
Known issues
On Windows the Shortcuts and Custom Commands settings pages don't work.
Features
Settings
General
added single instance setting to play new file when appending to the playlist
removed the "File dialog location setting"
Playlist: added settings to control playback behavior
Mouse
changed to allow modifier keys
added support for Mouse Forward and Back buttons
Subtitles: if a relative folder name in the Load subtitle from list starts with an * (asterisk) then subtitles will be searched in all folders contaning the folder name.
Example: If the Load subtitle from list contains an entry *sub and you have the following folders next to the video file subs, more subs and subtitles all of these folders will be searched.
the settings window now has a minimum width and height
PlayList
added support for multiple playlists
items can be reordered manually through drag and dropdown
items can be selected, ctrl+click to select multiple items, shift+click to select a range
items can be filtered
added setings to control playback behavior when a file ends
when saving the playlist the file extension is set to m3u
can add files and folders through drag and drop
multiple files can be added through the option in the header
hide playlist when mouse leaves window while maximized, prevents opening the playlist when moving mouse to another monitor
Playback
if a file can't be played now an error is shown and playback stops instead of trying to play the next file (prevents a potential infinite loop when no file in the playlist can be played)
can play files starting with a dot (hidden files)
an error is shown when failing to get youtube playlist
Other
mpris: add support for Shuffle and LoopStatus
changed the action selection popup to use Kirigami.SearchDialog
replaced the spinning icon with a progress bar and label
the drop area of the video is split in 2 parts now
top part always appends to the default playlist
bottom part clears the default playlist and adds the dropped files and folders, when only one file is dropped it behaves as the open file action (clears the playlist and loads sibling files if enabled in settings)
recent files are now stored in a sqlite database
time positions used to restore videos are also stored in the database
sleep is blocked on Windows too
all strings should be translatable now
Bugfixes
fixed the loop action, osd was not showing and progress bar was not highlighting the loop range
before loading check that the file exists
fixed loading wrong subtitles when using recursive subs
fixed the progress bar getting taller when the chapters menu becomes visible
fixed a bug where the video would pause after clicking the progress/seek bar
Beginning of 2025 I was searching through the version history of Qt OPC UA - trying to find out when a certain issue got introduced. At some point I was curious: How long does this thing go back?! Turns out that the first git commit is dated 25th of September 2015. Which means we have been doing this for over 10 years now!
Kirigami Addons is a collection of supplementary components for Kirigami
applications. Version 1.10.0 is a relatively minor release, introducing KirigamiApp
and some improvements on Android regarding the new edge-to-edge support introduced in Android 15.
New Features
Aleix Pol Gonzalez added a KirigamiApp component which removes quite a bit of boilerplate to setup a Kirigami applications.
It now looks like this and will setup theming, crash reporting and more automatically in one place:
intmain(intargc,char*argv[]){KirigamiApp::Appapp(argc,argv);KirigamiAppkapp;// Set up KAboutData
// QCommandLineParser creation and processing
if(!kapp.start("org.kde.myapp",u"Main",newQQmlApplicationEngine)){return-1;}returnapp.exec();}
Bug fixes
Volker Krause added edge-to-edge support to the BottomDrawer and the MaximizedComponents.
First maintenance release of the 25.08 series is out continuing the focus on stability and polish with many fixes for crashes and regressions as well as user interface and usability improvements.
Some packaging issues caused a small delay for this release announcement, sorry for the inconvenience.
Thanks to all the people who help make Kdenlive more stable by reporting bugs, providing patches or sending constructive feedback.