KDE Planet - Latest News

  • This Week in KDE Apps: Python bindings (2024/11/18 07:20)
    Welcome to a new issue of "This Week in KDE Apps"! Every week we cover as much as possible of what's happening in the world of KDE apps. This week, we release the first beta of what will become KDE Gear 24.12.0. If your distro provides testing package, please help with testing. Meanwhile, and as part of the 2024 end-of-year fundraiser, you can "Adopt an App" in a symbolic effort to support your favorite KDE app. This week, we are particularly grateful to George Fakidis, tmpod, Paxriel for showing their support for Okular; Ian Lohmann, Anthony Perrett, Linus Seelinger and Nils Martens for Dolphin, Erik Bernoth for Arianna and Daniel Lloyd-Miller and mdPlusPlus for KDE Connect. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. So consider donating today! Getting back to all that's new in the KDE App scene, let's dig in! Global Changes KWidgetsAddons, a collection of add-on widgets for QtWidgets, and KUnitConversion now have Python bindings. (Manuel Alcaraz Zambrano, KDE Frameworks 6.9.0. Link 1 and link 2) Call to ActionKDE has over 70 frameworks, we need your help to add Python bindings to the relevant remaining frameworks. See metatask. The "About" page of Kirigami applications now provides helpful "Copy" button that lets you copy system information, which can be useful when filling a bug report. The same feature was also implemented for QtWidgets-based applications. (Carl Schwan, Kirigami Addons 1.6.0 and KDE Frameworks 6.9. Link for Kirigami apps and link for QtWidget apps) Additionally Joshua added icons to the "Getting involved", "Donate", and other actions for the Kirigami version. (Joshua Goins, Kirigami Addons 1.6.0. Link) The "share" context menu of many applications can now copy the data to clipboard. (Aleix Pol Gonzalez, Frameworks 6.9.0. Link) Alligator RSS feed reader Alligator now lets you bookmark your favorite posts. (Soumyadeep Ghosh, 25.04.0. Link) The selected feed will also now be highlighted correctly and the text of an article can now be selected and copied. (Soumyadeep Ghosh, 24.12.0. Link and link 2) AudioTube YouTube Music app Fix parsing certain playlists. (Eren Karakas, 24.12.0. Link) Clock Keep time and set alarms Fix a crash of the Clock Daemon when waking up. (Devin Lin, 24.12.0. Link) digiKam Photo Management Program Digikam 8.5.0 is out! This releases improves the Face Management system, adds colored labels to identify important items, increases its list of supported languages to 61, and fixes over 160 bugs. Read the full announcement Dolphin Manage your files When Dolphin is started on a location which does not report a storage size (for example "remote", or "bluetooth") the status bar will no longer pointlessly show a empty storage size indicator for a split second before hiding it again. (Felix Ernst, 25.04.0. Link) Gwenview Image Viewer We fixed a bug where indexed-color or monochrome-palette images (e.g. from pngquant) would render with garbled colors or black and white noise when zoomed. (Tabby Kitten, 24.12.0. Link) KDE Itinerary Digital travel assistant Itinerary's Matrix integration now uses encrypted Matrix rooms by default and Itinerary can now do session verification, which is going to be mandatory in the future. (Volker Krause, 25.04.0. Link 1 and link 2). Volker also fixed various small issues with the Matrix integration (too many to list them all) and backported these fixes for the 24.12.0 release. Kate Advanced Text Editor It is now possible to disable the autocompletion popup which appears when you are just typing. (Waqar Ahmed, 25.04.0. BUG 476620) KCalc Scientific calculator We redesigned the bit edit feature of KCalc. (Tomasz Bojczuk, 25.04.0. Link) Kdenlive Video editor Several Kdenlive effects got the capacity to animate their parameters with keyframes. (Bernd Jordan, Julius Künzel, and Massimo Stella, 25.04.0. Link 1, link 2, link 3 and link 4) Keysmith Two-factor code generator for Plasma Mobile and Desktop Keysmith can now import OTPs from andOTP's backup files. (Martin Reboredo, 25.04.0, Link) Akonadi Background service for KDE PIM apps Fixed a crash when migrating old iCal entries in Akonadi to be properly tagged. (Daniel Vrátil, 24.12.0. Link) Fix style of configuration dialogs for Akonadi agents on platforms other than Plasma. (Laurent Montel, 24.12.0. Link) Port away IMAP resource from KWallet and use QtKeychain instead. This ensures your email's credentials are correctly stored and retrieved on other platforms like Windows. (Carl Schwan, 24.12.0. Link) KMail A feature-rich email application Reduce temporary memory allocation by 25% when starting KMail. If you are curious how, the merge requests are super interesting. (Volker Krause, 24.12.0. Link 1, link 2, and link 3) Kodaskanna A multi-format 1D/2D code scanner Kodaskanna was ported to Qt6/KF6. (Friedrich W. H. Kossebau. Link) KRDC Connect with RDP or VNC to another computer We added various options related to security of the RDP connection and the redirection of smartcards to the remote host. (Roman Katichev, 25.04.0. Link) Kup Backup scheduler for KDE's Plasma desktop We rephrased all yes/no buttons in Kup's notifications to use more descriptive names. (Nate Graham, 25.04.0. Link) NeoChat Chat on Matrix When receiving stickers with NeoChat, they will be displayed with a more appropriate size (256x256px). Same with custom emoticons, which are now displayed with the same height as the rest of the message. (Joshua Goins, 24.12.0. Link) We don't show the filename underneath images anymore, and also make the download file dialog fill out the filename by default. (Joshua Goins, 24.12.0. Link 1 and link 2) We redesigned the list of accounts in the welcome page. Now we show the display name and avatar of your accounts there, which makes it easier to recognize. (Joshua Goins, 24.12.0. Link) We rearranged the room, file and message context menus. (Joshua Goins, 24.12.0. Link 1 and link 2) Tokodon Browse the Fediverse Add "Open in Browser" action to profile pages. (Sean Baggaley, 24.12.0. Link) Fix various issues on Android, most prominently ensure all icons required by Tokodon are packaged correctly. (Joshua Goins, 24.12.0) ... And Everything Else This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment. For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors. Get Involved The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable. You can help KDE by becoming an active community member and getting involved. 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. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things. You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. To get your application mentioned here, please ping us in invent or in Matrix. Thanks to Tobias Fella and Michael Mischurow for the proofreading.
  • Testing application first use experience (2024/11/16 10:15)
    When working on an application it’s not uncommon to be testing with your own configuration and data, and often more in a power-user setup of that application. While that has advantages it’s easy to lose sight of how the application looks and behaves when first opened in a clean environment. Testing in a clean environment Testing the first use experience is technically easy, you just have to delete the entire application state and configuration, or create a new user account. However that’s very cumbersome and thus wont be done regularly. Fortunately there are more convenient and less invasive shortcuts. Isolated XDG environment For many applications we get very far already by separating the XDG directories. That includes configuration files, application data and state as well as cached data. This means creating four new directories and pointing the following environment variables to one of those: XDG_CACHE_HOME (cached data) XDG_CONFIG_HOME (configuration files) XDG_DATA_HOME (application data) XDG_STATE_HOME (application state) Running an application in such an environment will make it not see any of its existing state and configuration (without destroying that). That is, as long as the entire state and configuration is actually stored in those locations. A somewhat common exception is credential storage in a platform service like Secret Service or KWallet. Those wont be isolated and depending on the application you might not get a clean first use state or you might be risking damaging the existing state. Multi-instance Akonadi Other services used by an applications might need special attention as well. A particularly complex one in this context is Akonadi, as it contains a lot of configuration, state and data. Fortunately Akonadi has built-in support for running multiple isolated instances for exactly that reason. All we need is setting the AKOANDI_INSTANCE environment variable to a unique name and we get our own separated instance. Automation Given the above building blocks we can create a little wrapper script that launches a given application in a clean ephemeral environment: import os import subprocess import sys import tempfile xdgHome = tempfile.TemporaryDirectory(prefix='testing-') for d in ['CACHE', 'CONFIG', 'DATA', 'STATE']: os.mkdir(os.path.join(xdgHome.name, d)) os.environ[f"XDG_{d}_HOME"] = os.path.join(xdgHome.name, d) os.environ['AKONADI_INSTANCE'] = 'testing' subprocess.call(sys.argv[1:]) subprocess.call(['akonadictl', '--instance', 'testing', 'stop', '--wait']) xdgHome.cleanup() I’ve been using this on Itinerary since some time, and it became additionally useful with the introduction of Appium-based UI tests, as those run in a similarly isolated environment. If you need something slightly longer living, launching a shell with this wrapper is also possible. In that you then can launch your application multiple times, e.g. for testing whether changes are persisted correctly. Limitations There’s one unsolved issue with how this isolates applications though: D-Bus. Applications claiming a unique D-Bus service name wont be able to run alongside a second instance this way, so you will have to shut down an already running instance during testing. In most cases that’s not a big deal, but quite inconvenient when working on one of your main communication apps. I looked at two possible ways to isolate D-Bus (both relatively easy to integrate in a wrapper script): xdg-dbus-proxy: This can limit access to certain host services, but has no way of having a second isolated instance of a service. Running a separate D-Bus session bus: Having a second instance of a service is no problem then, but we have no way to access host services anymore (which means also no credential storage service etc). Neither of those help with the applications I work on, but they might nevertheless be viable in other scenarios. Overall, the more entangled an application is in platform state, the harder it becomes to achieve this kind of isolation, and the more you’ll need to customize how to do this. It quickly pays off though, an easy and always available way to quickly test things in a clean state has been super helpful.
  • This Week in Plasma: Discover and System Monitor with a side of WINE (2024/11/16 04:00)
    This week no major new features were merged, so we focused on polishing up what we already have and fixing bugs. That's right, Phoronix readers; we do in fact regularly do this! And let me also remind folks about our ongoing 2024 fundraiser: in it, you can adopt a KDE app to have your name displayed as an official supporter of that app. If you love KDE or its apps, this is a great way to show your appreciation. We're almost halfway to our year-end goal with 6 weeks to go. That's not bad, but I know we can get there quickly and unlock the stretch goals. So check it out! And after that, check out this stuff too: Notable UI Improvements When using a color scheme with Header colors such as Breeze Light and Breeze Dark, the color scheme editor no longer confusingly offers the opportunity to edit the Titlebar colors, which aren't used for such color schemes. Instead, you need to edit the Header colors. (Akseli Lahtinen, 6.2.4. Link) The System Tray no longer shows tooltips for items in the hidden/expanded view that would be identical to the visible text of the item being hovered with the pointer. (Nate Graham, 6.2.4. Link) The first time you use Plasma to create a network hotspot, it gets assigned a random password by default, rather than no password. (Albert Astals Cid, 6.3.0. Link) In KRunner-powered searches, you can now jump between categories using the Page Up/Page Down and Ctrl+Up/Ctrl+Down. (Alexander Lohnau, 6.3.0. Link 1 and link 2) Implemented support for the "Highlight changed settings" feature for most of System Settings' Drawing Tablet page. (Joshua Goins, 6.3.0. Link) Discover now shows installation progress more accurately when downloading an app that also requires downloading any new Flatpak runtimes. (Harald Sitter, 6.3.0. Link) When you have multiple Brightness and Color widgets, adjusting the screen brightness in one of them now mirrors this change to all of them, so they stay in sync. (Jakob Petsovits, 6.2.4. Link) Added a new symbolic icon for WINE, which allows the category that WINE creates in Kickoff to use a symbolic icon that matches all the others. Also improved the existing colorful icon to better match the upstream branding. (Andy Betts, Frameworks 6.9. Link) Notable Bug Fixes Speaking of WINE, we fixed a recent regression that caused WINE windows to display black artifacts around them. (Vlad Zahorodnii, 6.2.4. Link) The feature to save a customized Plasma System Monitor widget as a new preset once again works. And we added an autotest to make sure it doesn't break again! (Arjen Hiemstra, 6.2.4. Link) Fixed an extremely strange issue that could cause an actively focused XWayland window to lose the ability to receive keyboard and pointer input when the screen was locked using the Meta+L keyboard shortcut. (Adam Nydahl, 6.2.4. Link) Fixed a recent regression that caused System Monitor to stop gathering statistics for some ARM-based CPUs. (Hector Martin, 6.2.4. Link) Discover once again allows you to update update-able add-ons acquired using the "Get New [thing]" windows, which had gotten broken in the initial release of Plasma 6. (Harald Sitter, 6.3.0. Link 1 and link 2) Fixed a case where the real session restoration feature in the X11 session wouldn't restore everything correctly. (David Edmundson, 6.3.0. Link) Fixed a visual glitch affecting Kirigami's SwipeListItem component which would give it the wrong background color when using Breeze Dark and other similar color schemes, and could be prominently seen on Discover's Settings page. (Marco Martin, Frameworks 6.9. Link) Fixed a major Qt regression that caused the lock and login screens to become non-functional under various circumstances. (Olivier De Cannière, Qt 6.8.1, but distros will be back-porting it to their Qt 6.8.0 packages soon, if they haven't already. Link) Fixed a Qt regression that caused the error dialog on "Get New [Thing]" windows to be visually broken until the window was resized. (David Edmundson, Qt 6.8.1. Link) Fixed another Qt regression that caused clicking on a virtual desktop to switch to it in KWin's overview effect to stop working after you use the Desktop Cube at least once. (David Edmundson, Qt 6.8.1. Link) Other bug information of note: 2 Very high priority Plasma bugs (down from 4 last week). Current list of bugs 36 15-minute Plasma bugs (down from 37 last week). Current list of bugs 119 KDE bugs of all kinds fixed over the last week. Full list of bugs Notable in Performance & Technical We've re-enabled the ability to turn on HDR mode when using version 565.57.1 or later of the NVIDIA driver for NVIDIA GPU users, or version 6.11 or later of the Linux kernel for Intel GPU users. These are the versions of those pieces of software that have fixed the worst bugs affecting HDR on those GPUs. (Xaver Hugl, 6.2.4. Link 1 and link 2) Fixed a performance issue that affected users of multi-monitor setups while using a VR headset. (Xaver Hugl, 6.2.4. Link) Reduced the slowness and lag that you could experience when drag-selecting over a hundred items on the desktop. (Akseli Lahtinen, 6.3.0. Link) Implemented support for the xdg_toplevel_icon Wayland protocol in KWin. (David Edmundson, 6.3.0. Link) 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. You can help KDE by becoming an active community member and getting involved somehow. 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: Filter and confirm bug reports, maybe even identify their root cause Contribute designs for wallpapers, icons, and app interfaces Design and maintain websites Translate user interface text items into your own language Promote KDE in your local community …And a ton more things! You can also help us by donating to our yearly fundraiser! Any monetary contribution — however small — will help us cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world. To get a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.
  • digiKam 8.5.0 is released (2024/11/16 00:00)
    Dear digiKam fans and users, After five months of active maintenance and many weeks triaging bugs, the digiKam team is proud to present version 8.5.0 of its open source digital photo manager. Generalities More than 160 bugs have been fixed and we spent a lot of time contacting users to validate changes in pre-release versions to confirm fixes before deploying the program to production.
  • Web Review, Week 2024-46 (2024/11/15 15:47)
    Let’s go for my web review for the week 2024-46. No GPS required: our app can now locate underground trains Tags: tech, mobile, sensors, gps, transportation Now this is definitely a smart trick to estimate position in tunnels. https://blog.transitapp.com/go-underground/ OpenAI, Google and Anthropic Are Struggling to Build More Advanced AI - Bloomberg Tags: tech, ai, machine-learning, gpt More signs of the generative AI companies hitting a plateau… https://www.bloomberg.com/news/articles/2024-11-13/openai-google-and-anthropic-are-struggling-to-build-more-advanced-ai Releasing the largest multilingual open pretraining dataset Tags: tech, ai, machine-learning, gpt, data, copyright, licensing It shouldn’t be, but it is a big deal. Having such training corpus openly available is one of the big missing pieces to build models. https://simonwillison.net/2024/Nov/14/releasing-the-largest-multilingual-open-pretraining-dataset/#atom-blogmarks Everything I’ve learned so far about running local LLMs Tags: tech, ai, machine-learning, gpt, foss This is an interesting and balanced view. Also nice to see that local inference is really getting closer. This is mostly a UI problem now. https://nullprogram.com/blog/2024/11/10/ When Machine Learning Tells the Wrong Story Tags: tech, cpu, hardware, security, privacy, research Fascinating research about side-channel attacks. Learned a lot about them and website fingerprinting here. Also interesting the explanations of how the use of machine learning models can actually get in the way of proper understanding of the side-channel really used by an attack which can prevent developing actually useful counter-measures. https://jackcook.com/2024/11/09/bigger-fish.html Abusing Ubuntu 24.04 features for root privilege escalation Tags: tech, linux, security Nice chain of attacks. This shows more than one vulnerability needs to be leveraged to lead to root access. This provides valuable lessons. https://snyk.io/blog/abusing-ubuntu-root-privilege-escalation/ Way too many ways to wait on a child process with a timeout Tags: tech, unix, linux, system The title says it all. This is very fragmented and there are several options to fulfill the task. Knowing the tradeoffs can be handy. https://gaultier.github.io/blog/way_too_many_ways_to_wait_for_a_child_process_with_a_timeout.html The CVM Algorithm Tags: tech, databases, algorithm This is a nice view into how a query planner roughly works and a nice algorithm which can be used internally to properly estimate the number of distinct values in a column. https://buttondown.com/jaffray/archive/the-cvm-algorithm/ Mergiraf Tags: tech, version-control, git, tools, conflict Looks like a nice way to improve handling of merge conflicts. I’ll test this one out. https://mergiraf.org/ Opposite of Cloud Native is? Tags: tech, cloud, complexity, vendor-lockin, self-hosting Definitely a good post. No you don’t have to go all in with cloud providers and signing with your blood. It’s often much more expensive for little gain but much more complexity and vendor lock in. https://mkennedy.codes/posts/opposite-of-cloud-native-is-stack-native/ Booleans Are a Trap Tags: tech, design, type-systems Avoiding boolean parameters in library APIs should be a well known advice by now. Still they should probably be avoided when modeling domain types as well. https://katafrakt.me/2024/11/09/booleans-are-a-trap/ Complex for Whom? Tags: tech, design, complexity Good musing about complexity. Very often we need to move it around, the important question is where should it appear. For sure you don’t want it scattered everywhere. https://notes.billmill.org/link_blog/2024/11/Complex_forWhom.html What makes concurrency so hard? Tags: tech, distributed, complexity Interesting reasoning about what is hard in systems with concurrency. It’s definitely about the state space of the system and the structure of that space. https://buttondown.com/hillelwayne/archive/what-makes-concurrency-so-hard/ Algorithms we develop software by Tags: tech, programming, craftsmanship, engineering, problem-solving Interesting musing on the heuristics we use when solving problems. There are good advices in there to make progress and become a better developer. https://grantslatton.com/software-pathfinding Bye for now!
  • KDE Gear 24.12 Beta Testing (2024/11/15 14:26)
    KDE Gear is our release service for many apps such as mail and calendaring supremo Kontact, geographers dream Marble, social media influencing Kdenlive and dozens of others. KDE needs you to test that your favourite feature has been added and your worst bug has been squished. You can do this with KDE neon Testing edition, built from the Git branches which get used to make releases from. You can download the ISO and try it on spare hardware or on a virtual machine to test them out. But maybe you don’t want the faff of installing a distro. Containers give an easier way to test thanks to Distrobox. Install Distrobox on your normal computer. Make sure Docker or podman are working. Download the container with distrobox create -i invent-registry.kde.org/neon/docker-images/plasma:testing-all Then start it withdistrobox enter all-testingAnd voila it will mount the necessary bits to get Wayland connections working and keep your home directory available and you can run say kontact and test the beta for the mail app.
  • Conclusion of KDE and Google Summer of Code 2024 (2024/11/15 00:00)
    All of KDE's Google Summer of Code (GSoC) projects are complete. GSoC is a program where students or people who are new to Free and Open Source software make programming contributions to an open source project. This post summarizes the outcomes of KDE project participating in GSoC 2024. Projects Arianna Port Arianna to Foliate-js: Ajay Chauhan worked on porting Arianna from epub.js to use Foliate-js. The work will hopefully be merged soon. A screenshot of Arianna using Foliate-js to render a table of contents (Courtesy of Ajay Chauhan, CC BY-NC-SA 4.0) Frameworks Python bindings for KDE Frameworks: Manuel Alcaraz Zambrano, implemented Python bindings for KWidgetAddons, KUnitConversion, KCoreAddons, KGuiAddons, KI18n, KNotifications, and KXmlGUI. This was done using Shiboken. In addition, Manuel wrote a tutorial on how to generate Python bindings using Shiboken. The complicated set of merge requests are still being reviewed, and Manuel continues to interact with the KDE community. Unit conversion example created using Python and KUnitConversion (Courtesy of Manuel Alcaraz Zambrano, CC BY-NC-SA 4.0) KDE Connect Update SSHD library in KDE Connect Android app The main aim of ShellWen Chen's project was to update Apache Mina SSHD from 0.14.0 to 2.12.1. The older version has a few listed vulnerabilities. The newer library required additional code to enable it to work on older Android phones, up to Android API 21. KDE Games Implementing a computerized opponent for the Mancala variant Bohnenspiel: João Gouveia created Mankala engine, a library to enable easy creation of Mancala games. The engine contains implementations for two Mancala games, Bohnenspiel and Oware. Both games contain computerized opponents, João also started on a QtQuick graphical user interface. The games are functional, but additional investigation on computerized opponents may help improve their effectiveness. Image of text user interface for Bohnenspiel (Courtesy of João Gouveia, CC BY-SA 4.0) Kdenlive Improved subtitling support for Kdenlive: Subtitling support has been improved for Kdenlive. Chengkun Chen added support for using the Advanced SubStation (ASS) file format and for converting SubRip files to ASS files. To support this format, Chengkun Chen also made subtitling editor improvements. The work has been merged in the main repository. Documentation has been written, and will hopefully be merged soon. The new Style Editor Widget (Courtesy of Chengkun Chen, CC BY-SA 4.0) Krita Creating Pixel Perfect Tool for Krita: Ken Lo worked on implementing Pixel Perfect lines in Krita. As explained by Ricky Han, such algorithms remove corner pixels from L shaped blocks and ensure the thinnest possible line is 1 pixel wide. Implementing such algorithms well is of use not only in Krita, but also in rendering web graphics where user screen resolutions can vary significantly. The algorithm was implemented to work in close to real time while lines are drawn, rather than as a post processing step. Ken Lo's work has been merged into Krita. An image showing that pixel perfect lines are obtained most of the time (Courtesy of Ken Lo, CC BY 4.0) Labplot Improve Python Interoperability with LabPlot Israel Galadima worked on improving Python support in LabPlot. Shiboken was used for this and it is now possible to call some of LabPlot functions from Python and integrate these into other applications. An image of a plot produced using Python bindings to Labplot (Courtesy of Israel Galadima, CC BY-SA 4.0) 3D Visualization for LabPlot: Kuntal Bar added 3D graphing capabilities to LabPlot. This was done using QtGraphs. The work has yet to be merged, but there are many nice examples of 3D plots for bar charts, scatter and surface plots. A 3D bar chart (Courtesy of Kuntal Bar, MIT license) Okular Forms/Javascript support improvement for Okular: Pratham Gandhi worked on improving the forms/Javascript support in Okular. Around 25 requests have been merged to improve various features, some in the backend and some directly visible, such as fixing the size of the radio buttons or check boxes, or the one pictured below to improve the handling of floating numbers in different locales. An image of showing an incorrect total sum calculation fixed during GSoC (Courtesy of Pratham Gandhi, CC BY-SA 4.0) Snaps Improving Snap Ecosystem in KDE: Snaps are self contained linux application packging formats. Soumyadeep Ghosh worked on improving the tooling necessary to make KDE applications easily available in the Snap Store. In addition, Soumyadeep improved packaging of a number of KDE Snap packages, and packaged MarkNote. Finally, Soumyadeep created Snap KCM, a graphical user interface to manage permissions that Snaps have when running. Snap KCM (Courtesy of Soumyadeep Ghosh, CC BY-NC-SA 4.0) Next Steps The 2024 GSoC period is finally over for KDE. A big thank you to all the mentors and contributors who have participated in GSoC! We look forward to your continuing participation in free and open source software communities and in contributing to KDE.
  • MinGW and Side-by-Side Manifests (2024/11/14 15:44)
    Qt Creator 14 has removed support for its Python 2 pretty printers.
  • Presenting privact at KDE Akademy (2024/11/14 15:25)
    Earlier this year I had the pleasure of visiting the KDE Akademy 2024 in Würzburg. It had been a few years since my last visit to Akademy and it was great to see old friends and meet new ones. Besides socializing, my main task was to talk to as many KDE people as possible about the privact project and its integration into KDE. Knowing the KDE community, not surprisingly this resulted in lots of interesting discussions. Most importantly, I gave a talk about the current state of privact’s integration with KUserFeedback. If you missed it, here is the recording: As a follow-up, we had 2 BoFs on Monday to discuss the next steps. Felix was kind enough to join me to provide more technical developer insights than I can give. As a first teaser for you: In the short term, the privact approach will allow KDE to do proper user research, thereby enabling us to do data-driven UX without compromising user privacy. In the longer term, privact aims to restore digital privacy for everyone, even outside of KDE, even outside of FLOSS. You can learn more in upcoming posts or on the privact homepage. The individual feedback on the privact approach during Akademy was very good, which is why we now want to start communicating with the larger KDE community. So this post is not only to report about my attendance at Akademy, but also to start blogging again on Planet KDE and to check if the aggregation works. Hello World Planet KDE!
  • Qt Creator 15 RC released (2024/11/14 12:45)
    We are happy to announce the release of Qt Creator 15 RC!
  • Metafont, MetaPost and Malayalam font (2024/11/14 12:21)
    At the International TeX Users Group Conference 2023 (TUG23) in Bonn, Germany, I presented a talk about using Metafont (and its extension Metapost) to develop traditional orthography Malayalam fonts, on behalf of C.V. Radhakrishnan and K.H. Hussain, who were the co-developers and authors. And I forgot to post about it afterwards — as always, life gets in between. In early 2022, CVR started toying with Metafont to create a few complicated letters of Malayalam script and he showed us a wonderful demonstration that piqued many of our interest. With the same code base, by adjusting the parameters, different variations of the glyphs can be generated, as seen in a screenshot of that demonstration: 16 variations of the same character ഴ generated from same Metafont source. Hussain, quickly realizing that the characters could be programmatically assembled from a set of base/repeating components, collated an excellent list of basic shapes for Malayalam script. Excerpts from the Malayalam character basic shape components documented by K.H. Hussain. I bought a copy of ‘The Metafontbook’ and started learning and experimenting. We found soon that Metafont, developed by Prof. Knuth in the late 1970’s, generates bitmap/raster output; but its extension MetaPost, developed by his Ph.D. student John Hobby, generates vector output (postscript) which is required for opentype fonts. We also found that ‘Metatype1’ developed by Bogusław Jackowski et al. has very useful macros and ideas. We had a lot of fun programmatically generating the character components and assembling them, splicing them, sometimes cutting them short, and transforming them in all useful manner. I have developed a new set of tools to generate the font from the vector output (SVG files) generated by MetaPost, which is also used in later projects like Chingam font. At the annual TUG conference 2023 in Bonn, Germany, I have presented our work, and we received good feedback. There were three presentations about Metafont itself at the conference. Among others, I also had the pleasure to meet Linus Romer who shared some ideas about designing variable width reph-shapes for Malayalam characters. The video of the presentation is available in YouTube. The article was published in the TUGboat conference proceedings (volume 44): https://www.tug.org/TUGboat/tb44-2/tb137radhakrishnan-malayalam.pdf Postscript (no pun intended): after the conference, I visited some of my good friends in Belgium and Netherlands. En route, my backpack with passport, identity cards, laptop, a phone and money etc. was stolen at Liège. I can’t thank enough my friends at Belgium and back at home for their unbridled care, support and help, on the face of a terrible affliction. On the day before my return, the stolen backpack with everything except the money was found by the railway authorities and I was able to claim it just in time. I made yet another visit to the magnificent Plantin–Moretus Museum (it holds the original Garamond types!), where I myself could ink and print a metal typeset block of sonnet by Christoph Plantijn in 1575, which now hangs at the office of a good friend.
  • Setting C++ Defines with CMake (2024/11/13 09:00)
    The goal When building C++ code with CMake, it is very common to want to set some pre-processor defines in the CMake code. For instance, we might want to set the project’s version number in a single place, in CMake code like this: project(MyApp VERSION 1.5) This sets the CMake variable PROJECT_VERSION to 1.5, which we can then use to pass -DMYAPP_VERSION_STRING=1.5 to the C++ compiler. The about dialog of the application can then use this to show the application version number, like this: const QString aboutString = QStringLiteral("My App version: %1").arg(MYAPP_VERSION_STRING); QMessageBox::information(this, "My App", aboutString); Similarly, we might have a boolean CMake option like START_MAXIMIZED, which the user compiling the software can set to ON or OFF: option(START_MAXIMIZED "Show the mainwindow maximized" OFF) If it’s ON, you would pass -DSTART_MAXIMIZED, otherwise nothing. The C++ code will then use #ifdef. (We’ll see that there’s a better way.) #ifdef START_MAXIMIZED w.showMaximized(); #else w.show(); #endif The common (but suboptimal) solution A solution that many people use for this is the CMake function add_definitions. It would look like this: add_definitions(-DMYAPP_VERSION_STRING="${PROJECT_VERSION}") if (START_MAXIMIZED) add_definitions(-DSTART_MAXIMIZED) endif() Technically, this works but there are a number of issues. First, add_definitions is deprecated since CMake 3.12 and add_compile_definitions should be used instead, which allows to remove the leading -D. More importantly, there’s a major downside to this approach: changing the project version or the value of the boolean option will force CMake to rebuild every single .cpp file used in targets defined below these lines (including in subdirectories). This is because add_definitions and add_compile_definitions ask to pass -D to all cpp files, instead of only those that need it. CMake doesn’t know which ones need it, so it has to rebuild everything. On large real-world projects, this could take something like one hour, which is a major waste of time. A first improvement we can do is to at least set the defines to all files in a single target (executable or library) instead of “all targets defined from now on”. This can be done like this: target_compile_definitions(myapp PRIVATE MYAPP_VERSION_STRING="${PROJECT_VERSION}") if(START_MAXIMIZED) target_compile_definitions(myapp PRIVATE START_MAXIMIZED) endif() We have narrowed the rebuilding effect a little bit, but are still rebuilding all cpp files in myapp, which could still take a long time. The recommended solution There is a proper way to do this, such that only the files that use these defines will be rebuilt; we simply have to ask CMake to generate a header with #define in it and include that header in the few cpp files that need it. Then, only those will be rebuilt when the generated header changes. This is very easy to do: configure_file(myapp_config.h.in myapp_config.h) We have to write the input file, myapp_config.h.in, and CMake will generate the output file, myapp_config.h, after expanding the values of CMake variables. Our input file would look like this: #define MYAPP_VERSION_STRING "${PROJECT_VERSION}" #cmakedefine01 START_MAXIMIZED A good thing about generated headers is that you can read them if you want to make sure they contain the right settings. For instance, myapp_config.h in your build directory might look like this: #define MYAPP_VERSION_STRING "1.5" #define START_MAXIMIZED 1 For larger use cases, we can even make this more modular by moving the version number to another input file, say myapp_version.h.in, so that upgrading the version doesn’t rebuild the file with the showMaximized() code and changing the boolean option doesn’t rebuild the about dialog. If you try this and you hit a “file not found” error about the generated header, that’s because the build directory (where headers get generated) is missing in the include path. You can solve this by adding set(CMAKE_INCLUDE_CURRENT_DIR TRUE) near the top of your CMakeLists.txt file. This is part of the CMake settings that I recommend should always be set; you can make it part of your new project template and never have to think about it again. There’s just one thing left to explain: what’s this #cmakedefine01 thing? If your C++ code uses #ifdef, you want to use #cmakedefine, which either sets or doesn’t set the define. But there’s a major downside of doing that — if you forget to include myapp_config.h, you won’t get a compile error; it will just always go to the #else code path. We want a solution that gives an error if the #include is missing. The generated header should set the define to either 0 or 1 (but always set it), and the C++ code should use #if. Then, you get a warning if the define hasn’t been set and, because people tend to ignore warnings, I recommend that you upgrade it to an error by adding the compiler flag -Werror=undef, with gcc or clang.  Let me know if you are aware of an equivalent flag for MSVC. if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(myapp PRIVATE -Werror=undef) endif() And these are all the pieces we need. Never use add_definitions or add_compile_definitions again for things that are only used by a handful of files. Use configure_file instead, and include the generated header. You’ll save a lot of time compared to recompiling files unnecessarily. I hope this tip was useful. For more content on CMake, we curated a collection of resources about CMake with or without Qt. Check out the videos. To get into this topic even in more detail, watch this complimentary video on YouTube: About KDAB If you like this article and want to read similar material, consider subscribing via our RSS feed. Subscribe to KDAB TV for similar informative short video content. KDAB provides market leading software consulting and development services and training in Qt, C++ and 3D/OpenGL. Contact us. The post Setting C++ Defines with CMake appeared first on KDAB.
  • API documentation porting sprint (2024/11/13 00:00)
    It was once said over the grapevine that: "Our C++ API documentation has some issues, our QML API documentation has a lot of issues." And it was true, but that is to change soon! As you might know, there is an ongoing effort to port our documentation from Doxygen to QDoc, and you can help with that. This is a task that has been adopted by the Streamlined Application Development Experience championed by Nicolas Fella and Nate Graham as part of the KDE Goals initiative. We would like to invite you to join our porting sprint effort to finish this task. On November 14th at 1PM UTC, we'll be hanging out in the Matrix room working on this. Hope to see you there. Some prerequisites: Ability to use a terminal Extra disk space (30GB minimum) Some familiarity with APIs Check out the instructions prepared by Thiago Sueto on how to get started porting a project to QDoc.
  • Krita Monthly Update - Edition 20 (2024/11/12 00:00)
    Welcome to the @Krita-promo team's October 2024 development and community update. Development Report Android-only Krita 5.2.8 Hotfix Release Krita 5.2.6 was reported to crash on startup on devices running Android 14 or later. This was caused by issues with an SDK update required for release on the Play Store, so a temporary 5.2.7 release reverting it was available from the downloads page only. However, the issue has now been resolved and 5.2.8 is rolling out on the Play Store. Note that 5.2.8 raises the minimum supported Android version to Android 7.0 (Nougat). Community Bug Hunt Started The development team has declared a "Bug Hunt Month" running through November, and needs the community's help to decide what to do with each and every one of the hundreds of open bug reports on the bug tracker. Which reports are valid and need to be fixed? Which ones need more info or are already resolved? Read the bug hunting guide and join in on the bug hunt thread on the Krita-Artists forum. Community Report October 2024 Monthly Art Challenge Results For the "Buried, Stuck, or otherwise Swallowed" theme, 16 members submitted 18 original artworks. And the winner is… Tomorrow, contest… I’m so finished by @mikuma_poponta! The November Art Challenge is Open Now For the November Art Challenge, @mikuma_poponta has chosen "Fluffy" as the theme, with the optional challenge of making it "The Ultimate Fluffy According to Me". See the full brief for more details, and get comfortable with this month's theme. Featured Artwork Best of Krita-Artists - September/October 2024 8 images were submitted to the Best of Krita-Artists Nominations thread, which was open from September 14th to October 11th. When the poll closed on October 14th, moderators had to break a four-way tie for the last two spots, resulting in these five wonderful works making their way onto the Krita-Artists featured artwork banner: Sapphire by @Dehaf Sci-Fi Spaceship by @NAKIGRAL Oracular Oriole by @SylviaRitter Air Port by @agarad Dancing with butterflies 🦋 by @Kichirou_Okami Best of Krita-Artists - October/November 2024 Nominations were accepted until November 11th. The poll is now open until November 14th. Don't forgot to vote! Ways to Help Krita Krita is Free and Open Source Software developed by an international team of sponsored developers and volunteer contributors. Visit Krita's funding page to see how user donations keep development going, and explore a one-time or monthly contribution. Or check out more ways to Get Involved, from testing, coding, translating, and documentation writing, to just sharing your artwork made with Krita. The Krita-promo team has put out a call for volunteers, come join us and help keep these monthly updates going. Notable Changes Notable changes in Krita's development builds from Oct. 10 - Nov. 12, 2024. Stable branch (5.2.9-prealpha): Layers: Fix infinite loop when a clone layer is connected to a group with clones, and a filter mask triggers an out-of-bounds update. (Change, by Dmitry Kazakov) General: Fix inability to save a document after saving while the image is busy and then canceling the busy operation. (bug report) (Change, by Dmitry Kazakov) Resources: Fix crash when re-importing a resource after modifying it. (bug report) (Change, by Dmitry Kazakov) Brush Presets: Fix loading embedded resources from .kpp files. (bug report, bug report, bug report) (Change, by Dmitry Kazakov) Brush Tools: Fix the Dynamic Brush Tool to not use the Freehand Brush Tool's smoothing settings which it doesn't properly support. (bug report) (Change, by Mathias Wein)(Change, by Dmitry Kazakov) Recorder Docker: Prevent interruption of the Text Tool by disabling recording while it is active. (bug report) (Change, by Dmitry Kazakov) File Formats: EXR: Possibly fix saving EXR files with extremely low alpha values. (Change, by Dmitry Kazakov) File Formats: EXR: Try to keep color space profile when saving EXR of incompatible type. (Change, by Dmitry Kazakov) File Formats: EXR: Fix bogus offset when saving EXR with moved layers. (Change, by Dmitry Kazakov) File Formats: JPEG-XL: Fix potential lockup when loading multi-page images. (Change, by Rasyuqa A H) Keyboard Shortcuts: Set the default shortcut for Zoom In to = instead of +. (bug report) (Change, by Halla Rempt) Brush Editor: Make the Saturation and Value brush options' graph and graph labels consistently agree on the range being -100% to 100% with 0% as neutral. (bug report) (Change, by Dmitry Kazakov) Unstable branch (5.3.0-prealpha): Bug fixes: Vector Layers: Fix endlessly slow rendering of vector layers with clipping masks. (bug report) (Change, by Dmitry Kazakov) Layers: Fix issue with transform masks on group layers not showing until visibility change, and visibility change of passthrough groups with layer styles causing artifacts. (bug report) (Change, by Dmitry Kazakov) Brush Editor: Fix crash when clearing scratchpad while it's busy rendering a resource-intensive brushstroke. (bug report) (Change, by Dmitry Kazakov) File Formats: EXR: Add GUI option for selecting the default color space for EXR files. (Change, by Dmitry Kazakov) Transform Tool: Liquify: Move the Move/Rotate/Scale/Offset/Undo buttons to their own spot instead of alongside unrelated options, to avoid confusion. (bug report) (Change, by Emmet O'Neill) Move Tool: Fix Force Instant Preview in the Move tool to be off by default. (CCbug report) (Change, by Halla Rempt) Pop-Up Palette: Fix lag in selecting a color in the Pop-Up Palette. (bug report) (Change, by Dmitry Kazakov) Scripting: Fix accessing active node state from the Python scripts. (bug report) (Change, by Dmitry Kazakov) Usabillity: Remove unnecessary empty space at the bottom of Transform, Move and Crop tool options. (bug report) (Change, by Dmitry Kazakov) Nightly Builds Pre-release versions of Krita are built every day for testing new changes. Get the latest bugfixes in Stable "Krita Plus" (5.2.9-prealpha): Linux - Windows - macOS (unsigned) - Android arm64-v8a - Android arm32-v7a - Android x86_64 Or test out the latest Experimental features in "Krita Next" (5.3.0-prealpha). Feedback and bug reports are appreciated!: Linux - Windows - macOS (unsigned) - Android arm64-v8a - Android arm32-v7a - Android x86_64 Have feedback? Join the discussion of this post on the Krita-Artists forum!
  • Of Color and Software (2024/11/11 19:34)
    It’s been a minute! We have been hard at work making sure our design system keeps moving forward. For the past weeks, we have made significant progress in the space of color creation and icons. There is also an easter egg in the form of PenPot. Read the rest! As previously mentioned, we restructured our color palettes to have set color variations at various levels. We will combine those colors into tokens that will be named something like this: pd.sys.color.red50 Meaning: PD: Plasma Design SYS: System token (We also have reference tokens and component tokens, .ref. and .com. respectively) Color: Token type red50: color name + color value Note that as we follow Material design guidelines for these colors, we have a collection of 100 different color shades for a given color. Depending on the needs of the system or changes in design, we could decide to not use red50 but we would like more intensity. So we would choose red49, or red48, and so on. The color variable name would change accordingly. This set up would allow designers and developers to understand the kind of token they are working with and it would be the same language for both developer and designer. In Figma and PenPot, designers have the ability to name tokens however they like. I opted for keeping token names as we are recommending them for the Plasma system. That way there is good consistency. This week, we consolidated these colors and we added them to the list of tokens in Figma and PenPot. However, there is still more to be done in the form of documentation for our Plasma developer team. We are still working through it, making sure we are accurate in the request for development. Additionally, this week we had the pleasure to meet with Pablo Ruiz, CEO at PenPot. Mike, one of our team members met Pablo recently and spoke of our Plasma Next project. This led to a meeting to discuss the needs that our team currently has for developing a design system. The team at PenPot is excited to partner with our KDE team and the Plasma Next initiative. They have generously offered a few resources to help. This couldn’t come at a better time as very recently we have been hitting gaps in our team knowledge when it comes to developing design systems. This process is a first for our desktop system and we want to get it right. With the help of the PenPot team and the changes they are making to the application, this should be easier. As such, we also decided to request prioritization for some of our tickets that would allow us to set up and migrate our Figma assets into PenPot and eventually, share these with the community at large. Today, we are not close to releasing a full design system for others to use, but we are making good progress. Stay tuned! We also moved into the process of editing 16px icons. Given that we already have new icons in the 24px collection that we can leverage, we cut the design time in half or more. We don’t have to brainstorm new icons, we mostly just have to edit the 24px icon and adapt it to a 16px version. This work just barely started but we are making good progress. One area that is still up in the air is our colorful icons. Given we edited the monochrome icons, this calls for editing colorful icons as well. We have received many suggestions on what kind of colorful style we should follow. I would like to extend that invitation. If you have seen or created amazing colorful icons and would like to suggest that style for us at Plasma, send us a comment! That’s it for this week. Good progress so far!
  • This Week in KDE Apps: Adopt an App (2024/11/10 08:20)
    Welcome to a new issue of "This Week in KDE Apps"! Every week we cover as much as possible of what's happening in the world of KDE apps. This week, we released KDE Gear 24.08.3 and we are preparing the 24.12.0 release with the beta planned for next week. The final release will happen on December 12th, but, meanwhile, and as part of the 2024 end-of-year fundraiser, you can "Adopt an App" in a symbolic effort to support your favorite KDE app. This week, we are particularly grateful to @petejones@hcommons.social, @DaisyLee@mastodon.social and Karcsesz for showing their support for Tokodon; manchicken for Merkuro and fat_malama, Alexandru Traistaru and Neeko iko for KDE Connect. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. So consider donating today! Getting back to all that's new in the KDE App scene, let's dig in! Alligator RSS feed reader The user can no longer open the feed details page multiple times (Soumyadeep Ghosh, 24.12.0, link). Falkon Web Browser It is now possible to open a context menu with Greasemonkey (Juraj Oravec, 24.12.0, link). Greasemonkey lets you run little scripts that make on-the-fly changes to web page content. Juraj also removed the advertised FTP support in Falkon as the support for FTP was removed from Chromium. (Juraj Oravec, 24.12.0, link) Dolphin Manage your files We no longer ask password twice when entering the Dolphin's admin mode (kio-admin) (Felix Ernst, 24.12.0, link). Felix also improved the keyboard navigation in the toolbar, now the elements are focused in the right order (Felix Ernst, 24.12.0. link 1 and link 2). KDE Itinerary Digital travel assistant Itinerary can now show you a map of the whole trip (Volker Krause, 24.12.0, link). And display some statistics about your trip, for example the CO2 emission, the distance travelled and the costs (if available) (Volker Krause, 24.12.0, link). Finally, the alignment of timeline elements in Itinerary is now much more consistent (Carl Schwan, 24.12.0, link). Okular View and annotate documents When loading PDF files with Ink annotation containing an empty path, Okular won't crash. You shouldn't be able to create such annotations with Okular anyway, but some PDF files out there do contains such annotations (Albert Astals Cid, 24.12.0, link). We also no longer hide the signing UI prematurely and now ensure it is visible until the signing process is actually finished (Nicolas Fella, 24.12.0, link). Finally we fixed a small memory leak in Okular's latex support (Nil Admirari, 24.12.0, link). Kaffeine Multimedia Player Kaffeine got ported to Qt6/KF6 (Tobias Klausmann, 24.12.0, link). Calculator A feature rich calculator Kalk will now correctly handle pressing the Esc key and clear the input field like many other calculator applications do, instead of creating strange characters in the input area (Devin Lin, 24.12.0, link). Kasts Podcast application Bart de Vries fixed password loading for synchronisation services on Windows (Bart De Vries, 24.12.0 link). Kate Advanced Text Editor The performance of displaying the build output has been improved (Waqar Ahmed, 24.12.0 link). KDevelop Featureful, plugin-extensible IDE for C/C++ and other programming languages We addressed certain annoyances when working with the flatpak runtime. This included, for example, improving the handling of .flatpak-manifest.json files which we use in KDE for storing application's Flatpak manifest (Aleix Pol Gonzalez, 24.12.0 link). KMail A feature-rich email application KMail and other PIM applications can now be compiled on Windows (Ingo Klöcker and Laurent Montel link 1 and link 2). Having KDE PIM applications work well on Windows is still in early stages of development. There is still a lot of work required to make Kontact a good experience on that platform. KMix Sound Mixer KMix got ported to Qt6/KF6 (Jonathan Marten, 24.12.0 link). Krita Digital Painting, Creative Freedom SVGs with clip masks now render faster (Dmitry Kazakov, link). Konsole Use the command line interface Konsole now always creates a cgroup hierarchy when creating new process. This prevents entire applications getting killed in an Out-Of-Memory (OOM) scenarios when a tab consumes too much RAM (David Redondo, 24.12.0, link). David also ensured the subprocess of Konsole are correctly mapped to Konsole's .desktop file (link). Kwave Sound editor Kwave now provides a better visual indication when playback is paused (Mark Penner, 24.12.0, link). NeoChat Chat on Matrix We improved the network proxy's config page look to make it more consistent with the other config pages (Joshua Goins, 24.12.0, link). Joshua Goins and Olivier Beard improved the link preview. Now clicking anywhere on the link preview will take you to the linked webpage (Joshua Goins, 24.12.0, link). The separator shown to the left of the preview and quoted text also got stylish rounded corners (Olivier Beard, 24.12.0, link). NeoChat now hides non-standard rooms from the room list as most of the time they are used exclusively for holding data (e.g. trip group information from Itinerary) and not meant to be interacted with (Joshua Goins, 24.12.0, link). We also improved the way polls look (Carl Schwan, 24.12.0, link). And made sending messages and inserting newline shortcuts configurable (Eren Karakas, 24.12.0, link). Tokodon Browse the Fediverse Right clicking on a link on a post will now show a context menu allowing users to copy or share the URL directly (Arran Ubels, 24.12.0, link). And all this too... The layout of the About dialog of applications using QtWidgets has been improved (Carl Schwan, KDE Frameworks 6.10.0, link). Before After ... And Everything Else This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment. For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors. Get Involved The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable. You can help KDE by becoming an active community member and getting involved. 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. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things. You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. To get your application mentioned here, please ping us in invent or in Matrix.
  • New Video by Ramon Miranda: Seamless Templates (2024/11/10 00:00)
    We've released a new video! ..Templates! you can create them with Krita to save time in your digital paintings and be more focused on your artwork. They are seamless, they are useful, and they are really easy to generate. So let´s go with another supercool feature of Krita. Check out the video for download links for the templates themselves!
  • September and October in KDE PIM (2024/11/09 19:25)
    Here's our bi-monthly update from KDE's personal information management applications team. This report covers progress made in September and October 2024. Since the last report, 24 people have contributed over 1100 changes to the KDE PIM code base. We also released a two bugfix releases of the KDE PIM Suite with the Gear releases 24.08.1 and 24.08.2 Please note this is the last bi-monthly blog post for KDE PIM. We will continue to work on KDE PIM but weekly improvements to KDE PIM are now included in the This Week in KDE Apps blog. Akademy The KDE PIM team was at Akademy from the 7th to the 12th of September in Würzburg (Germany). We hosted again a PIM BoF. We covered a few topics and made plans. In particular we touched upon contributions blockers, we hope the milestone system will help and also working on the amount of repositories which are not part of KDE Frameworks. Things are progressing in the right direction but slowly. Feel free to reach out to help! Milestones Talking about the milestones. You can see what we got in store on the Gitlab board. Some of them are progressing nicely like the resurrection of Kontact for Windows or the port away from QCA. If you see anything you fancy and you would like to help, reach out to us on the #kontact:kde.org Matrix channel! Applications Itinerary Our travel assistance app Itinerary got a new two-level trip/timeline view, an extended public transport location search, a new full trip map view and better Android platform integration. Read more in its own bi-monthly update. KAlarm David has been working on fixing bugs around sound handling. In particular, repeating audio alarms only playing once have been fixed. Likewise the failure to play sound files using libVLC on some systems is gone. Also the backend to play sound can be changed at build time, it can use VLC or MPV. But that's not the only bugs which got squashed. It's now possible to wake from suspend when using RTC wake and a crash has been fixed affecting systems where the kernel supports alarm timers. Last but not least, the GUI has been improved around the run mode options in the preferences dialog. Merkuro Claudio has been busy fixing regressions and improving the stability of Merkuro. Notably, maps are now displayed again (if the event contains coordinates). Also, the collection combobox in the editors are now initialized with a valid collection and filtering features have been repaired. KAddressBook and KOrganizer The general improvements to support Plasma Activities is still on going. It is not enabled by default as it requires Akonadi Resources support to become really useful and the corresponding changes are not there yet. KMail On the KMail front the search has been greatly improved. There is now a custom syntax usable in the search text field. One can now use keywords like subject:, body:, to, from, has:attachment, is:important, is:replied and so on to make more precise queries. For instance one could write "from:vkrause@kde.org to:kde-pim@kde.org is:important" to get only the emails from Volker on the kde-pim mailing list which are also flagged as important.
  • Fedora KDE Enabling Third Party Repositories (2024/11/09 16:23)
    As you may know, Fedora KDE 41 was released a couple of weeks ago. I wanted to talk about a special feature that our colleague @farchord (with support from upstream developer @Nate Graham) has brought to our Fedora KDE distribution:Enabling Third Party Repositories With A Single Click! Thanks to the flexibility of plasma-welcome we can offer this feature Right after installing Fedora and on first login you will be presented with the Plasma Welcome window: Before you click on Skip , you can go through the different slides to read about KDE and Fedora and also to decide whether you want to contribute with anonymous metrics or not (note: I personally do not): Here is where the interesting part comes in, on the next slide: With a simple click of a button you will enable the most commonly requested by our users Third Party Repositories like rpmfusion! (note: you will be asked for your administrator password) Once the request is processed, the message will change to: That’s it! You have successfully enabled Third Party Repositories without needing to modify any file or running any command whatsoever Before you do anything with your system and your new configuration, I will strongly recommend to update your system via Plasma Discover : Proceed with all the update and reboot to get the latest and shiniest from our repositories. Finally, to verify that the Third Party software is available, you can check: And that is it! Enjoy!This is all thanks to farchord, siosm , aleasto and ngraham‘s work!
  • Ubuntu Summit 2024: A joyful experience filled with sorrow (2024/11/09 07:35)
    Has this ever occurred to you? The most joyful moments of your life got filled with sorrow, a grief of loss… Let’s talk about the Ubuntu Summit first, my international conference and solo travel outside my country. Probably I am the first from my entire extended family to visit a European country. My parents, well-wishers everyone was so happy. Only person didn’t know much about this, my maternal grandfather, whom I called (yes, “called”, he left us on 27th October 2024) Dada. Let me tell you about the summit first.
  • This Week in Plasma: Everything You Wanted and More (2024/11/09 04:00)
    This week was full of major feature work and UI polishing, in addition to a lot of bug-fixing! I'm pretty sure everyone will find something to be excited about here: Notable New Features You can now swap the functions of drawing tablet pen buttons if you like the function performed by one of the buttons, but not which button activates it. (Joshua Goins, 6.3.0. Link) Info Center now shows all of your GPUs, not just one of them. And they are now indicated in a fancy way! (Harald Sitter, 6.3.0. Link 1 and link 2) Discover now shows you when apps are either packaged directly by their developer, or verified by a trusted third party. (Aleix Pol Gonzalez, 6.3.0. Link) The Printers widget now shows each printer's print queue inline, right there in the widget! (Kai Uwe Broulik, 6.3.0. Link) The Task Manager widget now lets you configure whether the "I'm playing audio" icons that appear in the corner of tasks can be clicked to mute the audio. In addition, the audio controls now always appear in the window preview thumbnails, and can't be accidentally disabled. (Petar Margetic, 6.3.0. Link) When you've set up your system to reboot into the bootloader menu the next time it reboots (and not the firmware screen; that case was already handled), the logout screen how indicates this. (Nikolay Kochulin, 6.3.0. Link) Notable UI Improvements When you put a pie chart style System Monitor widget on a really skinny panel, the percentage circle in the center now looks nice, rather than being jagged and overly bold. (Arjen Hiemstra, 6.2.4. Link) Made the progress indicators on Discover's Updates page more readable. (Nate Graham, 6.2.4. Link) The Keyboard Indicator widget now indicates when modifier keys are "latched" or "locked", as they can be when using certain accessibility settings. (Nicolas Fella, 6.3.0. Link) Removed the "Settings" launcher menu category! Now all of its contents have been moved into the "System" category. This reduces the number of categories that don't offer meaningful grouping. (Nate Graham, 6.3.0. Link) The Printers widget now shows a little busy spinner for any printers that are currently printing, to make them easier to pick out among others when there are a lot of printers available. (Kai Uwe Broulik. 6.3.0. Link) Widgets placed on the desktop are now very slightly translucent, just like the popups of widgets placed on the panel. (Marco Martin, 6.3.0. Link) When for some reason the system time zone is set incorrectly or not set at all, the Digital Clock widget now tells you what's going on and offers you the chance to fix it yourself instead of just being broken. (Niccolò Venerandi, 6.3.0. Link) Added a distinct Breeze icon for System Settings' Shortcuts page. (Joshua Goins, Frameworks 6.9. Link) Improved the Breeze icon shown on password dialogs. (Kai Uwe Broulik, Frameworks 6.9. Link) Notable Bug Fixes Fixed a case where KWin would crash when plugging in external screens. (Xaver Hugl, 6.2.3. Link) Fixed a regression caused by a version 0.22 of the power-profiles-daemon service that caused power profiles to not be registered properly by Plasma's Power and Battery widget until you manually restarted the Powerdevil service. (Méven Car, 6.2.3. Link) Discover's auto-update feature once again works for Flatpak apps. (Harald Sitter, 6.2.4. Link) The speaker test window on System Settings' Audio page now always fits its content, no matter what the name of the device or its audio profile may be. (Ismael Asensio, 6.2.4. Link) Fixed a strange issue that would make GTK 4 apps look too dark when using HDR mode. Now they're a bit too light, but this is a GTK 4 bug. (Xaver Hugl, 6.2.4. Link) Plasma panels in "fit content" mode are now compatible with flexible spacers; placing one on a panel no longer causes it to slowly grow to its full width when Plasma starts up — which was hilarious, but wrong. (Niccolò Venerandi, 6.2.4. Link) Fixed a small visual glitch in KWin's Overview effect that caused windows dragged-and-dropped onto the desktop bar to strangely glide off screen. (Marco Martin, 6.2.4. Link) Did a major code refactor and bug-fixing spree for desktop icon positioning, which fixes almost all of the outstanding bug reports about icons moving around, and also adds autotests to validate the fixes! You can read more about it here, too. (Akseli Lahtinen, 6.3.0. Link) Alt key accelerators for items in the Global Menu widget now work on Wayland. (Nicolas Fella, 6.3.0. Link) Performing a major system update using Discover no longer makes a pointless and invisible authentication prompt appear behind the logout window when you try to reboot to complete the update. (Alessandro Astone, PackageKit 1.3.1. Link) Other bug information of note: 4 Very high priority Plasma bug (same as last week). Current list of bugs 37 15-minute Plasma bugs (down from 40 last week). Current list of bugs 106 KDE bugs of all kinds fixed over the last week. Full list of bugs Notable in Performance & Technical The feature to let you record the screen without re-approval if it's the same as one you did last time now also works when using rectangular region recordings. (David Redondo, 6.3.0. Link) Implemented support for the Wayland system bell protocol. (David Redondo, 6.3.0. Link) 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. You can help KDE by becoming an active community member and getting involved somehow. 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: Filter and confirm bug reports, maybe even identify their root cause Contribute designs for wallpapers, icons, and app interfaces Design and maintain websites Translate user interface text items into your own language Promote KDE in your local community …And a ton more things! You can also help us by donating to our yearly fundraiser! Any monetary contribution — however small — will help us cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world. To get a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.
  • Qt Wayland Tablet Improvents (2024/11/08 22:50)
    A few weeks ago Qt 6.8 was released, delivering many fixes and improvements for our software. Some of them were contributed by yours truly, and in this post I want to highlight some of them. They relate to graphics tablet/stylus input on Wayland. Before we go into the fixes let’s have a quick overview of the flow of tablet input events on Wayland: The genesis of input events is in the kernel driver for the particular tablet, which talks to the hardware (via USB, bluetooth etc). The kernel passes events to userspace via the evdev system. On the userspace side a Wayland compositor reads those events. Most compositors leverage libinput for this, a library that transforms raw evdev events into something more usable for the compositor while applying some cleaning and configuration. The compositor then delivers events to native Wayland applications using the tablet-v2 protocol. For legacy XWayland applications the compositor uses this protocol to send events to XWayland, which translates them into things X11 apps understand. The compositor can apply useful transformations to the input, like which area of the screen the tablet is mapped to, changing the pressure curve of the pen, or binding buttons to keyboard shortcuts. The application then processes the events, potentially leveraging a UI toolkit like Qt. Qt creates QTabletEvent object for incoming Wayland events and delivers those to all UI elements. In case no UI element reacts to the event Qt will synthesize a mouse event from the tablet event and deliver that to the UI elements. That way most controls like buttons and menus don’t need special code to handle tablet input. Only when doing very low-level input handling or when needing tablet-specific interactions (like reacting to different pressure values) application developers need to explicitly handle tablet events in their code. Most UI toolkits will work somewhat similar to this. If an application doesn’t react to tablet input at all please file a bug against the application. Qt Wayland had support for tablet input for a few years now, so what exactly needed fixing? The first thing is cursors. In Wayland the application tells the compositor which cursor to use. This can be done either by specifying a surface (i.e. an image) or a named cursor shape. Guess which one Qt used? That’s right: Neither. It just didn’t specify a cursor at all. The result depends on the compositor: KWin would display a cross-hair cursor as a fallback, which is ~okay, but not the cursor the application developer asked for. On other compositors I’ve tested there will be no cursor visible at all, which isn’t okay at all. For Qt 6.8 I implemented the missing cursor support, so now tablets get the same cursor as mouse input (unless of course the application developer wants a different cursor for tablet input). Another thing that affected mostly non-Plasma users is client-side decorated windows. On Plasma Qt applications usually use the server-side decoration provided by KWin, but e.g. on GNOME Qt is responsible for drawing and handling window decorations. For this Qt features a plugin system so different decorations with different look-and-feels can be swapped out. Unfortunately those decorations didn’t handle tablet input at all, so it wasn’t possible to move around or close windows using a tablet stylus. I fixed this by pretending the tablet input is mouse input to the decorations, which was a simple yet effective solution for the issue. If there is ever a need for decorations to treat tablet input different to mouse input we can revisit this. Talking about moving windows, a feature most KDE apps have (even if off-by-default these days) is dragging any empty area to move the window. This wasn’t working when using a stylus. Why? For that we need to look at how this works on a Wayland level. The xdg-shell protocol (the one responsible for most application windows) has a move request that asks the compositor to start a move interaction for the window. As part of the request the application must pass a serial, which is a number that corresponds to the last input event the application has received. To avoid applications suddenly deciding to move in the background compositors usually only allow move requests as a result of direct user input, so this serial must match the last input event. Qt wraps this move request inside the QWindow::startSystemMove function. The problem was that Qt didn’t keep track of the serial it received as part of tablet input, so when starting the move it would pass a wrong serial and the compositor (rightfully) refused the move. A few extra lines later the serial was tracked properly and moving windows with a stylus worked, just in time for Nate to disable the feature by default. The same problem also affected drag-and-drop. When starting a drag with a stylus Qt now passes the correct serial, making drag-and-drop work (at least on the Qt side, there currently is a bug on the KWin side that prevents this from working). The last fix for today relates to how applications react to the tablet events. Sometimes applications process clicks differently depending on what keyboard modifiers are pressed. For example pressing Ctrl while clicking on files in Dolphin allows to select multiple files. For this to work Qt conveniently delivers the active modifiers with every input event. Alas for tablet input the modifiers got lost along the way, so it wasn’t possible to select multiple files using a stylus. One small fix later it works as expected. That’s all the Wayland tablet related fixes for today. If you find more issues in Qt/KDE apps related to tablet input on Wayland please report them on bugs.kde.org and I’ll look into them. That’s not all there is about Wayland tablet improvements though. Fully in the spirit of the “We care about your input!” Goal there are exiting things happening on the KWin/Plasma side that I’ve been involved in. Stay tuned for more! In my position of Software Platform Engineer at KDE I work on common building blocks for KDE software, like Qt and KDE Frameworks. This work is possible thanks to your generous donations. Check out our end-of-the-year fundraiser if you’d like to see more work like this.
  • KDE Gear 24.12 branches created (2024/11/08 18:29)
    Make sure you commit anything you want to end up in the KDE Gear 24.12 releases to themNext Dates:   November 14, 2024: 24.12 freeze and beta (24.11.80) tagging and release  November 28, 2024: 24.12 RC (24.11.90) tagging and release  December  5, 2024: 24.12 tagging  December 12, 2024: 24.12 releasehttps://community.kde.org/Schedules/KDE_Gear_24.12_Schedule
  • Web Review, Week 2024-45 (2024/11/08 14:01)
    Let’s go for my web review for the week 2024-45. Voted in America? This Site Doxed You Tags: tech, democracy I didn’t know the voting rolls were public record in the US… this is a really bad idea. https://www.404media.co/voted-in-america-this-site-doxed-you/ One weird trick to get the whole planet to send abuse complaints to your best friend(s) Tags: tech, networking, security, protocols Looks like there are people out there to get Tor relays down… and they found a smart networking trick I’d expect to not work anymore. https://delroth.net/posts/spoofed-mass-scan-abuse/ XMPP: the forgotten gem of Instant Messaging Tags: tech, xmpp, ux Could XMPP make a come back if the user experience was better? https://adele.pages.casa/md/blog/xmpp-the-forgotten-gem-of-instant-messaging.md A conceptual model of ATProto and ActivityPub Tags: tech, protocols, fediverse, governance, decentralized Interesting explanation of the different visions and governance behind ActivityPub and ATProto. https://fediversereport.com/a-conceptual-model-of-atproto-and-activitypub/ A Map of Sync Tags: tech, syncing, data Interesting dimensions to use when classifying syncing solutions and to see which ones will meet your constraints. https://stack.convex.dev/a-map-of-sync DuckDB over Pandas/Polars Tags: tech, databases, data-science A good reminder that I should probably evaluate DuckDB for some of my tooling. https://pgrs.net/2024/11/01/duckdb-over-pandas-polars/ Why systemd is a problem for embedded Linux Tags: tech, systemd, embedded This is a good point. systemd is kind of turning into a monoculture, but what are we loosing? Indeed, right now things could be better on deeply embedded systems (I insist on the “deep embedded” here which is often more limited in resources). Unlike the author I think they could be improved and they don’t quite apply to a good chunk of recent embedded platforms though. https://kevinboone.me/systemd_embedded.html How the New sqlite3_rsync Utility Works Tags: tech, databases, sqlite, tools, syncing If you wonder how the protocol is designed and how the actual implementation works, this is a nice introduction. Clearly it’s helped by the size of that program which is fairly small. https://nochlin.com/blog/how-the-new-sqlite3_rsync-utility-works C++, Complexity, and Compiler Bugs Tags: tech, c++, complexity Good illustration of how the C++ language complexity is out of hands. https://azeemba.com/posts/cpp-complexity-compiler-bugs.html Having fun with modern C++ – Daniel Lemire’s blog Tags: tech, c++ Still, C++ improved in recent years. The problem is that we tend to stick too much to the old constructs we already know and that things keep piling up but nothing is removed. https://lemire.me/blog/2024/11/02/having-fun-with-modern-c/ smolweb HTML specification Tags: tech, html, accessibility, low-tech, complexity A nice subset of HTML to ensure better accessibility and reduced complexity. https://smolweb.org/specs/index.html HTML link, or button, that is the question Tags: tech, web, frontend, html Each has a use, they shouldn’t be conflated. It makes for poor user experience and accessibility otherwise. https://marijkeluttekes.dev/blog/articles/2024/11/04/html-link-or-button-that-is-the-question/ Long Distance Relationships Tags: tech, remote-working, management, product-management A bit biased toward stable product teams only. Still, there are good tips which are more widely applicable here. This gives a good idea of the management of a distributed team of remote workers. https://matt.blwt.io/post/long-distance-relationships/ Bye for now!
  • Desktop icons are surprisingly hard! (2024/11/08 00:00)
    I spent past three weeks working on refactoring and fixing legacy code (the oldest of which was from 2013) that handled positioning Plasma desktop icons, and how this data was saved and loaded. Here's the merge request if you're curious: plasma-desktop: Refactor icon positioner saving and loading The existing code worked sometimes, but there were some oddities like race conditions (icon positioning happens in weird order) and backend code mixed in with frontend code. Now I am not blaming anyone for this. Code has tendency to get a bit weird, especially over long periods of time, and especially in open source projects where anyone can tinker with it. You know how wired earbuds always, always get tangled when you place them in a drawer or your pocket or something for few seconds? Codebases do the exact same thing, when there are multiple people writing on things, fixing each others' bugs. Everyone has a different way of thinking, so it's only natural that things over time get a bit tangled up. So sometimes you need someone to look at the tangled codebase and try to clear it up a bit. Reading code is the hardest part When going through old code, especially some that has barely any comments, it can take a very long time to understand what is actually going on. I honestly spent most of my time trying to understand how the thing even works, what is called when, where the icons positions are updated, and so on. When I finally had some understanding of what was happening, I could start cleaning things up. I renamed a lot of the old methods to be hopefully more descriptive, and moved backend code — like saving icon positions — from the frontend back to backend. Screens and icons Every screen (PC monitor, TV…) tends to have it's own quirks. Some, when connected with display-port adapter, tell your PC it's disconnected if your PC goes to screen saving mode. Some stay connected, but show a blank screen. One big issue with the icon positions was that when screen got turned off, it thought there was no screen anymore and started removing items from the desktop. That's fair. Why show desktop icons on a screen that is non-existent? But when you have a monitor that tells your PC, "Okay I'm disconnecting now!" when the PC says it's time to sleep, wrong things would happen. This condition is now handled by having a check that if the screen is in use or not. Now when screen is not in use, we just do nothing with the icons. No need to touch them at all. Stripes and screen resolution Our icon positioning algorithm uses something called "stripes." Every resolution has it's amount of stripes. Stripes contain an array of icons, or blank spots. So if your screen resolution is, let's say, 1920x1080, we calculate how many stripes and how many items per stripe will fit on that screen. Stripe1: 1 2 3 4 5 6 7 Stripe2: 1 2 3 4 5 6 7 Stripe3: 1 2 3 4 5 6 7 And so on.. But when you change your screen resolution or scale factor, how many icon stripes you have and how many icons fit on each stripe will change. So if you have one of those screens that looks to the system like it's been unplugged when it goes into sleep mode, previously the stripe amount would change to 1 row, 1 column. And the icon positioner would panics and shove all icons in that 1,1 slot. Then when you'd turn the screen back on, the icon positioner would wonder what just happened and restore the proper stripe number and size. But by that point it would have lost all our positioning coordinate data during the shoving of icons in that one miniscule place, so instead it would reset the icon positions… and this leaves users wondering why their desktop icon arrangement is now gone. Here we have to also check for the screen being in use or not. But there were other problems. Saving icon positions The prior code saved the icon positions every time the positions changed. Makes sense. But it didn't account for the screen being off… so the icon positions would get saved while the desktop was in a faulty state. This also causes frustration because someone arranges the icons how they wish, but then screen does something weird and they're now saved in wrong places again. Our icon positions were updated after almost every draw call, if the positions changed. So this would mean the saving would happen rather often and no matter what moved them. We had to separate the user action from computer action. If computer moves the icons, we ideally do not save their positions, unless something drastic has happened like resolution change. The icon positions are saved per resolution, so if you move icons around while they're displayed on a 3440x1440 screen and then change the resolution to 1920x1080, both will have their own arrangements. This part of the codebase did not previously work, and it would always override the old configuration, which caused headache. So now we only save icon positions when: The user adds or removes a desktop icon The user moves a desktop icon The user changes the desktop resolution This makes the icon position saving much less random, since it's done only after explicit user actions. Margin errors The last thing that caused headaches with the icon positioning was that the area available on the desktop for icons was determined before panels were loaded. When the panels loaded, they would reduce the amount of space for desktop icons, and that area would constantly resize until everything is ready. In previous code, this would cause icons to move, which updates positions, which then saves their positions. So let's say you arrange your icons nicely, but the next time you boot into plasma, your panels start shoving the poor icon area around and the icons have to move out of the way… and now they're all in the wrong places. This was already partially fixed by not saving when the computer moves the icons around: we just load the icon positions when the screen is in use and we are done with listing the icons on the desktop. Part of the margin changes happen when screen is off. We still need to fix the loading part; ideally we load the icon area last, so that it gets the margins it expects and doesn't shuffle around while panels are still appearing. But it was out of scope for this merge request. Conclusions It may not sound like much, but this was a lot of work. I spent days just thinking about this problem, trying to understand what is happening now and how to improve it. Luckily with a lot of help from reviewers and testers I got things to work much better than it used to. I am quite "all-over-the-place" when I solve problems so I appreciate the patience they had with me and my questions. :D What I mostly wished for when working on this were more inline code comments. You don't need to comment the obvious things, but everything else could use something. It's hard to gauge what is obvious and what is not, but that kind of answers the question: If you don't know if it's obvious or not, it's likely not, so add some comment about it. I do hope that the desktop icons act more reliably after all these changes. If you spot bugs, do report them at https://bugs.kde.org. Thanks for reading! :) PS. The funniest thing to me about all of this is that I do not like having any icons on my desktop. :'D
Enter your comment. Wiki syntax is allowed:
U I X M L
 
  • news/planet/kde.txt
  • Last modified: 2021/10/30 11:41
  • by 127.0.0.1