call_end

    • Pl chevron_right

      Christian Hergert: Getting Started with Foundry

      news.movim.eu / PlanetGnome • 21 September • 2 minutes

    In addition to all the Libdex 1.0 fanfare, Foundry has also reached 1.0 for GNOME 49. That doesn’t mean it’s complete, but it does mean that what is there I feel pretty confident about from an API/ABI standpoint.

    If you have a project that works in GNOME Builder, it is a good time to test it out with Foundry! To get started you need to “initialize” a Foundry project similar to what you do with Git. This creates a minimal skeleton structure that Foundry will use for the project.

    cd myapp/
    foundry init

    At this point, you should have a .foundry/ directory in your project. Foundry will try to store everything it knows about your project in there. That includes settings, builds, cache, and tmp files. It also sets up a .gitignore file so that only the things you’re interested end up getting committed to the project’s git repository.

    Now we can build the project.

    foundry build

    Foundry will do all the same sort of SDK setup, cross-container build pipelines, and build system management that GNOME Builder does.

    To run the project, just run the following. It will handle building first if necessary too.

    foundry run

    If using a Flatpak manifest as your build configuration (you can check with foundry config list ) then it will handle all the same sort of details that Builder does.

    Building with Libfoundry

    Of course the command line tool is great for when you are needing to quickly do something in a terminal. But perhaps you want to integrate Foundry features into your own application or tools? Everything in the command line tool is available via libfoundry .

    To open an existing project with libfoundry, using just a directory to start, we can discover the `.foundry` directory location.

    g_autofree char *state_dir = NULL;
    DexFuture *future;
    
    future = foundry_context_discover (g_get_current_dir (), NULL);
    state_dir = dex_await_string (future, &error);

    We can use that information to load the project.

    g_autoptr(FoundryContext) context = NULL;
    DexFuture *future;
    
    future = foundry_context_new (state_dir, NULL, 0, NULL);
    context = dex_await_object (future, &error);

    To run a build we need to get the build manager service. That is available from the context with the :build-manager property.

    g_autoptr(FoundryBuildManager) build_manager = NULL;
    
    build_manager = foundry_context_dup_build_manager (context);

    One thing you’ll notice in Foundry is that many getters take a reference to the returned value. This is because Foundry heavily uses fibers and it is always better to own your objects when you cross fiber suspension points. This is where the dup_ prefix comes from instead of get_ .

    Building the project is quite simple too. Just await until it has completed.

    dex_await (foundry_build_manager_build (build_manager), &error);

    Running with Libfoundry

    To run is quite similar. Except you use the run manager instead of the build manager.

    g_autoptr(FoundryRunManager) run_manager = NULL;
    
    run_manager = foundry_context_dup_run_manager (context);
    dex_await (foundry_run_manager_run (run_manager), &error));

    There are of course more detailed ways to do this if you need precise control over things like where the project is deployed, such as to an external device. Or perhaps you want to control what command is run. The run manager and build manager also allows controlling the PTY that is used for both operations.

    Hopefully that is just enough to get you excited about using the tooling. The API has been obsessed over but it could use more documentation of which this is the infancy.

    • Pl chevron_right

      This Week in GNOME: #217 Mahjongg Sundays

      news.movim.eu / PlanetGnome • 21 September • 6 minutes

    Update on what happened across the GNOME project in the week from September 14 to September 21.

    GNOME Core Apps and Libraries

    GLib

    The low-level core library that forms the basis for projects such as GTK and GNOME.

    Philip Withnall says

    Tobias Stoeckmann continues to grind away at fixing various integer overflow corner cases in GLib, making the library more reliable for everyone when your program gets into a weird corner case. This week: string utility functions 🎉

    GNOME Circle Apps and Libraries

    Mahjongg

    Match tiles and clear the board

    Tobias Bernard says

    Mahjongg was accepted into Circle! It’s one the historical GNOME games, but thanks to Mat’s work over the past few cycles it looks very fresh and clean nowadays. Congratulations 🥳

    https://apps.gnome.org/Mahjongg

    mahjongg_banner.CKSQnLWW_92g8D.webp

    Mat says

    Mahjongg 49.0 has been released, and is available on Flathub . This release contains a bunch of improvements:

    • New app icon (Tobias Bernard)
    • Save and restore active games on startup (François Godin)
    • Adjust theme contrast in dark and high contrast modes
    • Shake unselectable tiles when clicking them
    • Replace help docs with Game Rules dialog
    • Add confirmation dialog for layout change during active game
    • Rename ‘Difficult’ layout to ‘Taipei’
    • Remove Date column from Scores dialog to leave more space for player name
    • Fix text entry focus when recycling rows in Scores dialog
    • Reduce frame drops when using the Cairo renderer
    • Use Rsvg directly instead of GdkPixbuf for asset loading
    • Several performance optimizations related to Scores dialog
    • Translation updates

    mahjongg-screenshot-1.zDzlk6d7_EnWHU.webp

    mahjongg-screenshot-2.C9x4RV38_ZkjQn2.webp

    Déjà Dup Backups

    A simple backup tool.

    Michael Terry announces

    Déjà Dup Backups 49.0 is finally out! This is a big one - Restic by default, restoring by file manager, and a big UI refresh.

    Read more here: https://discourse.gnome.org/t/deja-dup-49-0-released/31441

    Third Party Projects

    Alain says

    Planify 4.14 released

    We are excited to announce the release of Planify 4.14, which comes with major new features, performance improvements, and important bug fixes.

    Highlights of this release include:

    • Rewritten CalDAV backend with support for Radicale, Baïkal, and other CalDAV servers — thanks to @byquanton.
    • Fixed memory leaks when completing or deleting tasks, and during CalDAV synchronization — thanks to @markochk.
    • New view cache system that automatically frees unused memory when views are not in use.
    • Added customizable sidebar filters: Tomorrow, Someday, Recurring, No label, and All tasks.
    • Improved synchronization: Planify now respects the task order from Nextcloud and Todoist, with a new reordering algorithm.
    • Work in progress to make WebKit and Evolution dependencies optional, paving the way for Windows and macOS support — thanks to @byquanton.
    • Spell checker support in task descriptions.
    • Fixed bug when moving tasks with subtasks in Nextcloud/CalDAV projects.
    • Updated themes (Light, Dark, Dark Blue) and improved task design for better readability.
    • Labels and indicators for notes, reminders, and subtasks are now aligned to the right of task titles.
    • Added a quick-add button to every task list.
    • New completion animation and updated sound when finishing tasks.
    • Completion notification added, so users can easily review completed tasks.

    Planify 4.14 is available now on Flathub: https://flathub.org/apps/io.github.alainm23.planify

    Read the full announcement here: https://useplanify.com/blog#planify-414-is-here

    macOS.CUWha81I_ZdzUXI.webp

    windows.C52ejkEd_1Ef7jW.webp

    Alexander Vanhee says

    Everyone makes mistakes, that’s why in Gradia you will be able to edit both positioning and properties like color and size of already drawn elements. This saves you the trouble of having to redo the placement. Follow future developments on Github .

    xjuan reports

    Casilda 1.0 released! A simple wayland compositor widget for GTK 4

    Release notes:

    • Add dmabuf support (Val Packett)
    • Added vapi generation (PaladinDev)
    • Add library soname (Benson Muite)
    • Implement GtkScrollable iface
    • Add get_client_socket_fd()
    • Add spawn_async()
    • Remove bg-color property
    • Render windows and popups directly in snapshot()
    • Position windows on center of widget
    • Improve transient windows handling

    Read more about it at https://blogs.gnome.org/gtk/2025/09/15/casilda-1-0-released/

    casilda.oNBSZNjy_Z1dpHiG.webp

    Mahyar Darvishi reports

    SSH Studio v1.2.2 is out!

    SSH-Studio is a new desktop app for managing your ~/.ssh/config without needing to dive into terminal editors. It makes working with SSH easier by letting you search, edit, and validate hosts in a clean interface.

    The app also comes with a raw/diff view for advanced edits, inline error checking, quick actions like copy or test connection, and even a simple SSH key manager. Automatic backups ensure your config stays safe while you experiment.

    Check it out on Flathub

    key-generator.CxLdiIdG_Zk7WU2.webp

    ssh_studio.Bzi4-AZ0_1uk3X3.webp

    Raw-diff.B5cmuL7c_ZhchJb.webp

    GNOME Websites

    Guillaume Bernard announces

    Starting with GNOME 49, Damned Lies now follows the GNOME release cycle. Even if Damned Lies is continuously deployed, it helps track the changes and will surely motivate developments, as we have a deadline!

    For this cycle, as explained in a previous TWIG, we switched authentication to a 3rd party-based system that works like a charm. You can connect with your GNOME SSO account.

    Amongst a few changes in the user interface and some bug fixes, we now send notifications in both HTML and plain text. Some elements of the Vertimus workflow have also been fixed, resulting in more stable contributions and better error messages to help translators, reviewers, and committers debug the situation themselves without requiring them to open an issue on Damned Lies’ issue tracker.

    Most of the work was done in the background. The code responsible for computing statistics, POT file generation, and Git repositories has been refactored. This is the most important part of this cycle, as it was a requirement to implement other new features: asynchronous Git commits and pushes, and asynchronous refresh of statistics. The number of tests increased from around 300 to more than 500 for the same code coverage.

    The existing code is now more stable, and Damned Lies can be continuously deployed without fear. And that’s the case. Did you even notice all the silent updates in September?

    Miscellaneous

    sadlyascii says

    do you maintain a flatpak of an app that uses media codecs? if you do, please upgrade it to the new runtime org.gnome.Platform//49 (org.freedesktop.Platform//25.08)! the older versions download some codecs directly from cisco’s servers, and cisco has geoblocked some places, including the whole Ukraine. so your flatpak might be failing to install for people there, see for details: https://github.com/cisco/openh264/issues/3886

    Ada Magicat ❤️🧡🤍🩷💜 says

    Valentin added a firewall to GNOME OS . This protects your computer from other devices on the network. By default we use a lax policy to ensure most applications work, but you can change it for more security. Check out the relevant section in our security hardening guide .

    We also greatly improved our Nvidia driver support. The driver was in poor condition, but after lots of fixes most features should now work.

    If you play games or make use of features like CUDA we would appreciate your help in testing more hardware and applications. GNOME OS is still pre-release software, but if you are interested in testing you can follow the installation instructions here . After installing, enable the Nvidia driver by running:

    sudo updatectl enable nvidia-driver --now

    Next, reboot and test your favourite game or CUDA application. If you find any issues, feel free to report them here .

    Note : We use the new “open” kernel modules by Nvidia, so only 2000 and 1600 series cards or newer work with GNOME OS.

    GNOME Foundation

    Allan Day announces

    Another weekly GNOME Foundation update is available, covering highlights from the last seven days. Highlights include the GNOME 49 release, a new fundraising committee, and self-hosting our Matrix homeserver.

    That’s all for this week!

    See you next week, and be sure to stop by #thisweek:gnome.org with updates on your own projects!

    • Pl chevron_right

      Allan Day: GNOME Foundation Update, 2025-09-19

      news.movim.eu / PlanetGnome • 19 September • 2 minutes

    Another week, another GNOME Foundation update! This week was slightly quieter than the last two, but there’s still plenty going on. Here are some of the highlights.

    GNOME 49

    GNOME 49 was released this week ! Huge congratulations to the GNOME community. It’s a really strong release and the release notes are a testament to everyone’s hard work .

    It’s notable that some of the new features in this release have been in the works for much longer than 6 months – in some cases, probably years. This speaks to an amazing level of dedication by the contributors involved.

    Given that this is a GNOME Foundation update, I am obliged to mention the role our organisation played in the release. By providing the project’s development infrastructure, organising events where planning discussions happen, and providing other general support to the project, we played a significant role in the making of GNOME 49.

    Our goal is to increase the amount of support we provide for GNOME development, but we can only do that with the support of donors. So, if you want to help GNOME, donate today .

    Fundraising committee

    Maria Majadas, who is our current board chair, has organised the first meeting of the new fundraising committee this week. I’m hugely grateful to Maria for taking on this important task, and it’s exciting to see our community fundraising effort starting to take shape. Hopefully there will be more details to share once the committee has had its first meeting.

    Lawyering

    We have a few legal questions that we’re looking to get answers to right now, around requirements for our governance arrangements. That led me to have conversations with a few lawyers this week.

    The GNOME Foundation has the good fortune of being able to tap into a network of legal advisors who are also open source experts, and who are very supportive of our organisation. I find it very humbling that we have this support, and I think we can be very grateful to have friends in the legal space.

    Matrix hosting

    Historically, Element Matrix Services (EMS) has generously hosted GNOME’s Matrix homeserver. However, this week Bart has started the process of moving our Matrix service to our own infrastructure. This will offer a few advantages in the future, such as integration with our SSO. Stay tuned for updates as the migration rolls out.

    Bookkeeper meeting

    We had our monthly meeting with our bookkeeper this week, which was great as usual. We love our bookkeeper! She helps us to keep our accounts in order, address issues as they come up, and makes sure that we are ready for our annual tax filings. Accounting is a big part of what the GNOME Foundation does, and our books are in great shape thanks to this work.

    Message ends

    Thanks for reading! See you next week.

    • Pl chevron_right

      Sebastian Wick: Integrating libdex with GDBus

      news.movim.eu / PlanetGnome • 18 September • 5 minutes

    Writing asynchronous code in C has always been a challenge. Traditional callback-based approaches, including GLib’s async/finish pattern, often lead to the so-called callback hell that’s difficult to read and maintain. The libdex library offers a solution to this problem, and I recently worked on expanding the integration with GLib’s GDBus subsystem.

    The Problem with the Sync and Async Patterns

    Writing C code involving tasks which can take non-trivial amount of time has traditionally required choosing between two approaches:

    1. Synchronous calls - Simple to write but block the current thread
    2. Asynchronous callbacks - Non-blocking but result in callback hell and complex error handling

    Often the synchronous variant is chosen to keep the code simple, but in a lot of cases, blocking for potentially multiple seconds is not acceptable. Threads can be used to prevent the other threads from blocking, but it creates parallelism and with it the need for locking. It also can potentially create a huge amount of threads which mostly sit idle.

    The asynchronous variant has none of those problems, but consider a typical async D-Bus operation in traditional GLib code:

    static void
    on_ping_ready (GObject      *source_object,
                   GAsyncResult *res,
                   gpointer      data)
    {
      g_autofree char *pong = NULL;
    
      if (!dex_dbus_ping_pong_call_ping_finish (DEX_BUS_PING_PONG (source_object),
                                                &pong,
                                                res, NULL))
        return; // handle error
    
      g_print ("client: %s\n", pong);
    }
    
    static void
    on_ping_pong_proxy_ready (GObject      *source_object,
                              GAsyncResult *res,
                              gpointer      data)
    {
      DexDbusPingPong *pp dex_dbus_ping_pong_proxy_new_finish (res, NULL);
      if (!pp)
        return; // Handle error
    
      dex_dbus_ping_pong_call_ping (pp, "ping", NULL,
                                    on_ping_ready, NULL);
    }
    

    This pattern becomes unwieldy quickly, especially with multiple operations, error handling, shared data and cleanup across multiple callbacks.

    What is libdex?

    Dex provides Future-based programming for GLib. It provides features for application and library authors who want to structure concurrent code in an easy to manage way. Dex also provides Fibers which allow writing synchronous looking code in C while maintaining the benefits of asynchronous execution.

    At its core, libdex introduces two key concepts:

    • Futures : Represent values that will be available at some point in the future
    • Fibers : Lightweight cooperative threads that allow writing synchronous-looking code that yields control when waiting for asynchronous operations

    Futures alone already simplify dealing with asynchronous code by specefying a call chain ( dex_future_then() , dex_future_catch() , and dex_future_finally() ), or even more elaborate flows ( dex_future_all() , dex_future_all_race() , dex_future_any() , and dex_future_first() ) at one place, without the typical callback hell. It still requires splitting things into a bunch of functions and potentially moving data through them.

    static DexFuture *
    lookup_user_data_cb (DexFuture *future,
                         gpointer   user_data)
    {
      g_autoptr(MyUser) user = NULL;
      g_autoptr(GError) error = NULL;
    
      // the future in this cb is already resolved, so this just gets the value
      // no fibers involved 
      user = dex_await_object (future, &error);
      if (!user)
        return dex_future_new_for_error (g_steal_pointer (&error));
    
      return dex_future_first (dex_timeout_new_seconds (60),
                               dex_future_any (query_db_server (user),
                                               query_cache_server (user),
                                               NULL),
                               NULL);
    }
    
    static void
    print_user_data (void)
    {
      g_autoptr(DexFuture) future = NULL;
    
      future = dex_future_then (find_user (), lookup_user_data_cb, NULL, NULL);
      future = dex_future_then (future, print_user_data_cb, NULL, NULL);
      future = dex_future_finally (future, quit_cb, NULL, NULL);
    
      g_main_loop_run (main_loop);
    }
    

    The real magic of libdex however lies in fibers and the dex_await() function, which allows you to write code that looks synchronous but executes asynchronously. When you await a future, the current fiber yields control, allowing other work to proceed while waiting for the result.

    g_autoptr(MyUser) user = NULL;
    g_autoptr(MyUserData) data = NULL;
    g_autoptr(GError) error = NULL;
    
    user = dex_await_object (find_user (), &error);
    if (!user)
      return dex_future_new_for_error (g_steal_pointer (&error));
    
    data = dex_await_boxed (dex_future_first (dex_timeout_new_seconds (60),
                                              dex_future_any (query_db_server (user),
                                                              query_cache_server (user),
                                                              NULL),
                                              NULL), &error);
    if (!data)
      return dex_future_new_for_error (g_steal_pointer (&error));
    
    g_print ("%s", data->name);
    

    Christian Hergert wrote pretty decent documentation , so check it out!

    Bridging libdex and GDBus

    With the new integration, you can write D-Bus client code that looks like this:

    g_autoptr(DexDbusPingPong) *pp = NULL;
    g_autoptr(DexDbusPingPongPingResult) result = NULL;
    
    pp = dex_await_object (dex_dbus_ping_pong_proxy_new_future (connection,
                                                                G_DBUS_PROXY_FLAGS_NONE,
                                                                "org.example.PingPong",
                                                                "/org/example/pingpong"),
                           &error);
    if (!pp)
      return dex_future_new_for_error (g_steal_pointer (&error));
    
    res = dex_await_boxed (dex_dbus_ping_pong_call_ping_future (pp, "ping"), &error);
    if (!res)
      return dex_future_new_for_error (g_steal_pointer (&error));
    
    g_print ("client: %s\n", res->pong);
    

    This code is executing asynchronously, but reads like synchronous code. Error handling is straightforward, and there are no callbacks involved.

    On the service side, if enabled, method handlers will run in a fiber and can use dex_await() directly, enabling complex asynchronous operations within service implementations:

    static gboolean
    handle_ping (DexDbusPingPong       *object,
                 GDBusMethodInvocation *invocation,
                 const char            *ping)
    {
      g_print ("service: %s\n", ping);
    
      dex_await (dex_timeout_new_seconds (1), NULL);
      dex_dbus_ping_pong_complete_ping (object, invocation, "pong");
    
      return G_DBUS_METHOD_INVOCATION_HANDLED;
    }
    
    static void
    dex_dbus_ping_pong_iface_init (DexDbusPingPongIface *iface)
    {
      iface->handle_ping = handle_ping;
    }
    
    pp = g_object_new (DEX_TYPE_PING_PONG, NULL);
    dex_dbus_interface_skeleton_set_flags (DEX_DBUS_INTERFACE_SKELETON (pp),
                                           DEX_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_FIBER);
    

    This method handler includes a 1-second delay, but instead of blocking the entire service, it yields control to other fibers during the timeout.

    The merge request contains a complete example of a client and service communicating with each other.

    Implementation Details

    The integration required extending GDBus’s code generation system. Rather than modifying it directly, the current solution introduces a very simple extension system to GDBus’ code generation.

    The generated code includes:

    • Future-returning functions : For every _proxy_new() and _call_$method() function, corresponding _future() variants are generated
    • Result types : Method calls return boxed types containing all output parameters
    • Custom skeleton base class : Generated skeleton classes inherit from DexDBusInterfaceSkeleton instead of GDBusInterfaceSkeleton , which implements dispatching method handlers in fibers

    Besides the GDBus code generation extension system, there are a few more changes required in GLib to make this work. This is not merged at the time of writing, but I’m confident that we can move this forward.

    Future Directions

    I hope that this work convinces more people to use libdex! We have a whole bunch of existing code bases which will have to stick with C in the foreseeable future, and libdex provides tools to make incremental improvements. Personally, I want to start using in in the xdg-desktop-portal project.

    • Pl chevron_right

      Michael Meeks: 2025-09-18 Thursday

      news.movim.eu / PlanetGnome • 18 September

    • Up early, tech planning call, admin, lunch with Julia. Partner call, dug through bugs and patches, UX/Design stand-up.
    • Pl chevron_right

      Michael Meeks: 2025-09-17 Wednesday

      news.movim.eu / PlanetGnome • 17 September

    • Up early, good breakfast. Off to the venue, day of catch-up chats, product management bits, video recording, and more; fun.
    • Published the next strip: on the joys of deciding whom to contract in a tender
    • Flight back; RyanAir: pay for extra leg-room, get a different plane, and crushed into a tiny slot instead; tried to work.
    • Pl chevron_right

      Jakub Steiner: HDR Wallpapers

      news.movim.eu / PlanetGnome • 17 September • 1 minute

    GNOME 49 brought another round of changes to the default wallpaper set — some new additions, and a few removals too. Not just to keep the old GNOME Design loves to delete things trope alive, but to make room for fresh work and reduce stylistic overlap.

    Our goal has always been to provide a varied collection of abstract wallpapers. (Light/dark photographic sets are still on the wish list — we’ll get there, promise! 😉). When we introduce new designs, some of the older ones naturally have to step aside.

    We’ve actually been shipping wallpapers in high bit depth formats for quite a while, even back when the GNOME display pipeline (based on gdk-pixbuf) was limited to 8-bit output. That changed in GNOME 49. Thanks to Sophie’s Glycin, we now have a color-managed pipeline that makes full use of modern hardware — even if you’re still on an SDR display.

    So what does that mean for wallpapers? Well, with HDR displays (using OLED or Mini-LED panels), you can push brightness and contrast to extremes — bright enough to feel like a flashlight in your face. That’s great for games and movies, but it’s not something you want staring back at you from the desktop all day. With wallpapers, subtlety matters.

    The new set takes advantage of wider color gamuts (Display P3 instead of sRGB) and higher precision (16-bit per channel instead of 8-bit). That translates to smoother gradients, richer tones, and more depth — without the blinding highlights. Think of it as HDR done tastefully: more range to play with, but in service of calm, everyday visuals rather than spectacle.

    Personally, I still think HDR makes the most sense today in games, videos, and fullscreen photography, where those deep contrasts and bright highlights can really shine. On the desktop, apps and creative tools still need to catch up. Blender, for instance, already shows it’s colormanaged HDR preview pipeline on macOS, and HDR display support is expected to land for Wayland in Blender 5.0.

    • Pl chevron_right

      Christian Hergert: Status Week 37

      news.movim.eu / PlanetGnome • 15 September • 7 minutes

    VTE

    • Little back-and-forth on what we can do to improve a11y further with VTE. Prototype’d a way to extract hyperlinks and provide them into AccessibleText, however that is not the right place.

      We really need an implementation of the at-spi hyperlink API in GTK so that VteTerminal may implement it.

    • Merged a number of a11y fixes provided by Lukáš Tyrychtr which fix some of my original a11y implementation to follow the at-spi expectations better.

      Also added one of my own to fix a potential uint underrun when describing runs thanks to long to uint conversion.

    Ptyxis

    • Got a report of a bit of undesirable behavior when closing a window where close-able tabs are closed before showing the the special close dialog.

      It’s all more complex than I wish it was, because there are multiple ways we can enter that flow. Additionally, the asynchronous nature of closing tabs makes that state a bit “split brain” as it exists now. We may want to implement a “session” object to manage this stuff all in one place going forward.

    • When showing multiple tabs the “visual bell” background did not cover the entire headerbar. Quick CSS fix that.

    • Sebastian Wick needed a terminal with the Terminal Intents implemented so I took a crack at implementing that in Ptyxis. That allowed forward-progress on implementing the GLib side of things.

      Doing so found a couple of things we want to address in the upcoming FreeDesktop terminal intent “standard” and thankfully they’ve been moving that forward (including the Ptyxis-side).

    Libpeas

    • libpeas distro packaging was failing on the testsuite for Lua due to LGI not supporting girepository-2.0. Libpeas 2.x doesn’t use girepository at runtime, so this is relegated to the testsuite.

      For now, I’ve just disabled the Lua tests since they can’t possibly work due to that girepository usage.

      Some months back I provided patches for LGI to support girepository-2.0 but the project seems unmaintained and therefore hard for anyone to really say “yes merge this”.

      You can find some more information from Victoria Lacroix at https://www.vtrlx.ca/posts/2025/lgi-fork/

    Builder

    • They don’t get much testing during development so we had a small build regression on i686.

    • Spent a bunch of time on what will hopefully become Builder 50. This is a major rewrite on top of Foundry, Foundry-Gtk, and what will become Foundry-Adw in the 1.1 release of Foundry.

      It is hard to describe how remarkably small this will make Builder as a project compared to previous versions. So much complexity in the Builder code-base was in response to all the async/finish flows required to keep things smooth. But now that we have libdex and libfoundry, it’s just so easy to implement that sort of magic.

    Libdex

    • Sebastian Wick had some great ideas on integrating libdex with gdbus-codegen. Discussed a few different ways we could go forward to make something ergonomic. It would be nice to implement both consuming as proxies and providing as skeletons with futures.

    Libpanel

    • I noticed that the bottom corner buttons in Builder were not aligning with the external rounded corners of the window. That was fallout from a previous cleanup so fixed that up before release.

    Template-GLib

    • Thanks to early testing by distributors we found an issue in the testsuite which was exercising GObject Introspection integration. It broke on 32-bit because the gsize parameters are different and I never implemented auto-casting of integers of different sizes.

      So if you did a call like GLib.utf8_substring(str, i64(3), i64(-1)) and were on 32-bit that would fail since the offset / length parameters are glong which is sized differently.

      The quick fix that will still allow for errors to propagate was to implement auto up/down casting of numbers so long as they will fit in the destination type. Otherwise, you’ll fail the cast operation and errors propagate as necessary.

      This fix landed shortly before 3.38.0 but was tested on numerous architectures before release.

    Foundry

    • Learned that even command-line tools get appdata now days so I went ahead and implemented that for the foundry CLI tool.

    • We now dynamically link foundry binary. Originally I had plans to statically link it so that we can send it to a remote system and run it as a bridge. Since we aren’t there yet anyway, it doesn’t make sense to enforce that and/or make distributions patch it out.

    • FoundryBuildManager got a :busy property which makes it much easier to implement UI like Builder has where you show a build button or a stop button based on status.

      It also got a new stop() method/ GAction for that too. This is a lot harder than it looks because you need to plumb through a cancellable to all of the build pipeline API which is going to be awaiting the first future of [cancellable, some_op] .

      Was extremely happy to see it work on the first try which means I’ve done something right in the libdex design.

    • Once I did the above, adding a rebuild action and method was quite easy. We have all the necessary plumbing to either call an action or await a method future and get the same result.

    • A last minute API was added to create a producer from a consumer PTY fd. Hopefully using this new nomenclature is not so confusing for people used to ancient PTY terminology which I know is extremely confusing to begin with. But we gotta move past those antiquated terms (which I wont repeat here) as they are both morally wrong and technically inaccurate.

    • The FoundryFileManager can now automatically discover content-type when provided a filename. This vastly simplifies API usage when you have one-or-the-other to get a symbolic icon. Since we override many icons from the system, that is just a necessary abstraction.

    • FoundrySearchResult got an :icon property which means it’s basically usable to search UI now. Though there are not many FoundrySearchProvider s yet as they will land for 1.1.

    • A new context.file-manager-show GAction is provided which allows you to pass a uri as a "s" -typed GVariant . I feel stupid for not doing this a decade ago in Builder and quite frankly, it should probably just exist in GTK.

    • Libpanel/Builder has this nice “Action Muxer” API for years now and that is exported in Foundry too so we can use it in libfoundry-gtk and libfoundry-adw. It’s extremely handy when the built-in action support in GTK is not enough.

    • Foundry has a SQLite database of extended attributes on URIs when the underlying file-system does not support extended attributes. I made a little boo-boo there so made that to actually work.

    • Talked to dmalcom about supporting SARIF in Foundry for GNOME 50. They (the GCC project) would really like to see more consumers of it and Foundry is an obvious place to put that.

      It doesn’t look terribly difficult and it should allow us to drop the whole “regex parsing of PTY content” if done right.

    Foundry-Gtk

    • Fixed palette parsing and color application to VteTerminal.

    • Imported all the Ptyxis terminal palettes which can now be represented as a FoundryTerminalPaletteSet and FoundryTerminalPalette .

      Ultimately, what this means is if you link against libfoundry and libfoundry-gtk you could functionally create your own Ptyxis replacement in very little code (assuming you don’t use an agent on the host OS like Ptyxis does).

      Just use the FoundrySdk as your container abstraction (which you can query using FoundrySdkManager ) and FoundryTerminal with FoundryTerminalPaletteSet .

    • You can now list/find available palettes with a GListModel API in the form of foundry_terminal_list_palette_sets() and foundry_terminal_find_palette_set() . Each set has an easy light/dark property you can use based on your needs.

    • The file-search plugin now properly implements the load() vfunc for search results so you can implement preview/opening in apps.

    Foundry-Adw

    • A ton of work on the workspace, page, and panel APIs for 1.1. I’m really trying to find a way to re-use this across a number of applications such as Builder, Drafting, Sysprof, and more.

    Releases

    • gnome-text-editor 49.0

    • gtksourceview 5.18.0

    • sysprof 49.0

    • gnome-builder 49.0

    • ptyxis 49.0

    • libdex 1.0.0

    • foundry 1.0.0

    • libpanel 1.10.2

    • template-glib 3.38.0

    • d-spy 49.0 (thanks to Jordan for the 49.1 w/ CI fixed)

    • gom 0.5.4

    • libpeas 2.2.0

    • manuals 49.0

    Other

    • Team coffee hour, shared some battle wounds of trying to use AI for a pahole wrapper which fixed all my class structs to be cacheline aligned. Was just faster to write the damn code.

    • Pl chevron_right

      Gedit Technology blog: Mid-September News

      news.movim.eu / PlanetGnome • 15 September • 1 minute

    Misc news about the gedit text editor, mid-September edition! (Some sections are a bit technical).

    Next version will be released when Ready

    While the release of GNOME 49.0 was approaching (it's this week!), I came to the conclusion that it's best for gedit to wait more, and to follow the Debian way of releasing software: when it's Ready. "Ready" with an uppercase letter 'R'!

    So the question is: what is not ready? Two main things:

    • The rework of the file loading and saving: it is something that takes time, and I prefer to be sure that it'll be a solid solution.
    • The question about the Python support for implementing plugins. Time will tell what is the answer.

    Rework of the file loading and saving (next steps)

    Work continues to refactor that part of the code, both in libgedit-gtksourceview and gedit.

    I won't go into too much technical details this time. But what the previous developer (Ignacio Casal Quinteiro, aka nacho) wrote (in 2011) in a comment at the top of a class is "welcome to a really big headache."

    And naturally, I want to improve the situation. For a long time this class was used as a black box, using only its interface. Time has come to change things! It takes time, but I already see the end of the tunnel and I have good hopes that the code will be better structured. I intend to write about it more once finished.

    But I can reveal that there is already a visible improvement: loading a big file (e.g. 200 MB) is now super fast! Previously, it could take one minute to load such file, with a progress bar shown and a Cancel button. Now there is not enough time to even click on (or to see) the Cancel button! (I'm talking about local files, for remote files with a slow network connection, the progress bar is still useful).

    To be continued...

    If you appreciate the work that I do, you can send a thank-you donation . Your support is much appreciated! For years to come, it will be useful for the project.