Another slow cycle, same as last time. Still, a few new things to showcase. Sidebars The most visible addition is the new sidebar widget. This is a bit confusing, because we already had widgets for creating windows with sidebars - AdwNavigationSplitView and AdwOverlaySplitView , but nothing to actually put into the sidebar pane. The usual recommendation is to build your own sidebar using…
Another six months have passed, and with that comes another libadwaita release to go with GNOME 49. This cycle doesn't have a lot of changes due to numerous IRL circumstances I've been dealing with, but let's look at them anyway. Shortcuts dialog Last cycle GTK deprecated GtkShortcutsWindow and all of the related classes. Unfortunately, this left it with no replacement, despite being widely used.…
New cycle, new libadwaita version. Let's look at the changes. Toggle groups Last time I mentioned that Maximiliano 's toggle groups were ready by the end of the last cycle but it was too late to get them into 1.6. AdwToggleGroup a replacement for the specific pattern of using multiple exclusive instances of GtkToggleButton in a box. Compared to a box it provides a clearer styling and simpler to…
I finally got distracted enough to finish my website that has been saying "under construction" for over a year, since I set up this server for my Sharkey instance. I've wanted to do this for a while - one, so that I actually have a home page, and two, so that I can move my blog here instead of using WordPress. Setup Initially I wanted to use a static generator like Hugo, but then I discovered that…
Lately I’ve been working on touch controls overlays in Highscore 1 , and quickly found out that previewing them across different screen sizes is rather tedious. Currently we have two ways of testing UIs on a different screen size – resize the window, or run the app on that device. Generally when developing, I do the former since it’s faster, but what dimensions do I resize to? HIG lists the…
Recently, I got a Steam Deck OLED. Obviously, one of the main reasons for that is to run a certain yet to be announced here emulation app on it, so I installed Bazzite instead of SteamOS, cleaned up the preinstalled junk and got a clean desktop along with the Steam session/gaming mode. For the most part, it just works (in desktop mode, at least), but there was one problematic area: input. Gamepad…
Well, it’s time for another release. Last cycle wasn’t particularly exciting, only featuring the new dialogs and a few smaller changes, but this one should be more interesting. So let’s look at what’s new. Bottom sheet Last cycle libadwaita got new dialogs, which can be presented as bottom sheets on mobile, and I mentioned that they will also be available as a standalone widget in future – so…
This cycle GTK got a lot of updates to its CSS engine. I started this work as part of the Sovereign Tech Fund initiative , and later on Matthias Clasen joined in and we ended up splitting the work on colors. Let’s go through the changes, as well as how they affect GTK, libadwaita and apps. Variables The most notable addition is CSS variables, more correctly known as custom properties . Since…
Well, another cycle has passed. This one was fairly slow, but nevertheless has a major new feature. Adaptive Dialogs The biggest feature this time is the new dialog widgetry. Traditionally, dialogs have been separate windows. While this approach generally works, we never figured out how to reasonably support that on mobile. There was a downstream patch for auto-maximizing dialogs, which in turn…
It's that time of year again, so let's look at what's new. New Adaptive Widgets I've already talked about them in my last blog post , so I won't go into details this time. Breakpoints Libadwaita 1.4 introduces a breakpoint system, allowing to change UI in arbitrary ways depending on the window size. Breakpoints can be used with AdwWindow , AdwApplicationWindow , or with AdwBreakpointBin if you…
TL;DR: The current adaptive widgets have significant problems and have all been replaced and deprecated. You may want to port your apps, the migration guide is here . Over the past year, I’ve been working on replacing the old adaptive widgets in libadwaita, and as of a few days ago the last pieces have landed. The Problems ( kgx:356880 ) : Gtk-WARNING **: 16:38:18.039: Allocating size to AdwFlap…
Another cycle, another release. Let's take a look at what's new. Banners AdwBanner is a brand new widget that replaces GtkInfoBar . Jamie started implementing it before 1.2 was released, but we were already in the API freeze so it was delayed to this cycle instead. While it looks more or less the same as GtkInfoBar , it's not a direct replacement. AdwBanner has a title and optionally one button.…
Elastic is a new spring animation editor app. Ever since 1.0, libadwaita has had spring animations . These animations aren't controlled with a duration and an easing function, but instead with physical properties: damping ratio (or optionally damping), mass, stiffness and initial velocity, as well as epsilon. While this allows for a lot of control over the animation, it can be pretty hard to…
So, half a year after 1.1, libadwaita 1.2 has been released. While it doesn't contain everything I had planned (since I ended up being mostly unavailable for about half of the cycle for reasons outside my control), it still has a bunch of additions, so let's take a look at the changes. Entry Rows First, we have a widget that was planned for 1.0, but didn't make it because it still needed work.…
Libadwaita 1.1 and Libhandy 1.6 are now released to match the upcoming GNOME 42. Libadwaita 1.1 Since Libadwaita 1.0 was released just a few months ago, 1.1 doesn't contain a lot of features, but still has a few. Header Suffixes Christopher Davis implemented header suffixes for AdwPreferencesGroup , allowing to put a widget next to the group's title and subtitle: The "Add Picture…" button is a…
Libadwaita 1.0 has been released, just at the end of the year. Libadwaita is a GTK 4 library implementing the GNOME HIG, complementing GTK. For GTK 3 this role has increasingly been played by Libhandy, and so Libadwaita is a direct Libhandy successor. You can read more in Adrien's announcement . What's New Since Libadwaita is a Libhandy successor, it includes most features from it in one form or…
TL;DR GNOME will have a system-wide dark style preference in 42. Please update your apps to support it, see the instructions . Dark style preference in GNOME 42. Separate dark and light screenshots Lately, I've been working on having a proper dark style preference in GNOME. It's a frequently requested feature, but also hard to get right. elementary UX architect Cassidy James Blaede did a good…
You might have noticed that a lot of icons in GNOME 41 have been redrawn to be larger. They are still 16×16, but take up more of the space within the canvas. Compare: This was a preparation for a larger change that has just landed in the main branch in libadwaita: buttons in header bars and a few other widgets have no background now, matching this mockup . For example, this is how the recent GTK4…
In GNOME 40, Epiphany will feature a new tab bar. This isn’t just a restyling of the old one, but a ground-up rewrite. But why was this needed? Static vs dynamic GNOME apps use tabs in a lot of different ways, but they can be roughly divided into two categories. I will refer to them as static and dynamic tabs. Static tabs They are completely immutable, each tab contains a title label and they…
I wanted to start this blog post with "It's that time of year again", but looks like Michael beat me to it . So, let's take a look at some of the changes in GNOME Games 3.38: retro-gtk 1.0 The library Games uses to implement Libretro frontend, retro-gtk , has been overhauled this cycle. I've already covered the major changes in previous blog post , but to recap: Cores now run in a separate…
Recently, I've been working on a few widgets for libhandy to provide applications more flexibility with how to handle their titlebars. But doesn't GTK already allow this? Let's take a look. First, GTK has a widget called GtkHeaderBar . It looks like a titlebar, has a close button, a title, a subtitle and allows to add widgets at the left or right sides, or to replace title and subtitle with a…
Yesterday, I released GNOME Games 3.35.90, so we're in feature freeze for 3.36.0. Let's take a look at the changes during the 3.35.x cycle: Faster collection loading For a long time, Games loaded collection asynchronously using Vala async functions. While it didn't block the UI completely, it was still slow and caused frequent UI stalls until it loaded completely. In 3.36, collection loading uses…
This is part 3 of a mini-series. Part 1 , Part 2 . Last time I wrote about adding a back/forward swipe gesture to HdyLeaflet . That work has been finished and is available in libhandy 0.0.12. Porting apps To enable the gesture in an application using leaflets, the following needs to be done: 1. Syncing leaflet animation Currently apps that use leaflets in both titlebar and content area just change…
This is part 2 of a mini-series. Part 1 , Part 3 . Shortly after the WebKit gesture was merged, I started experimenting with making this gesture more widely available. The first step was porting it to Vala and decoupling from WebKit. Since I wrote this part of the gesture tracker from scratch anyway, it was simple and straightforward. The resulting playground project was also used as a convenient…
This is part 1 of a mini-series. Part 2 , Part 3 . Re-publishing, the original post is too old to show up on Planet GNOME at this point. It was published on August, 8th initially. I'm a big fan of responsive touchpad gestures. For the last half a year (mostly January, February and during the summer) I've been working on improving gestures in many areas throughout GNOME. In this series I will do a…
A year ago, Adrien Plazas stepped down as a maintainer, so Games 3.32.0 was released without an accompanying blog post, since I didn't have a blog at the time. Now it's time to make up for it with a blog post about 3.34.0. GSoC and savestates As part of his GSoC project , Andrei Lişiţă implemented a savestate manager. Savestates are a common feature in game emulators, that work similarly to…
GNOME Games has been participating in Google Summer of Code for many years, and this one is no exception. This time Andrei Lişiţă a.k.a. Yetizone was implementing a savestate manager. Andrei 's work involved redoing $XDG_DATA_HOME/gnome-games/ directory layout, writing a migrator for existing data, reworking the app to support having multiple savestates at once, implementing on-demand loading and…