It's been a long time since the last newsletter, but here's a new one! I'm excited to bring you lots of small improvements to Gio's window and event processing on many platforms.
This newsletter brings you v0.7.1 of Gio and associated repos. The minor version was incremented due to a very small breaking API change in the scroll gesture. The changes since v0.6.0 are mostly bugfixes within the windowing and event processing code.
Since the last newsletter, Gio's window implementation internals and API have been greatly simplified, leading to cleaner code and more predictable interactions.
A massive, long-overdue change to Gio event routing has just landed. This provides much more granular capabilities for applications to manipulate input events and ensures that it is always safe to throw away the contents of a macro, but at the cost of some breaking changes.
The last two months have brought lots of change across Gio, but also kept me so busy that October's newsletter was just folded into November's. Since the last newsletter, we've fixed two major longstanding API design issues within Gio. Now GUIs can react to input events without an extra frame of latency between the event and its delivery, and also Gio window logic now runs on the same goroutine as application window logic, eliminating many opportunities for race conditions. Of course, fixing these problems did require breaking API changes, so see each repo's notes for API migration info.
This month brings us Gio (and Gio-x) v0.3.1, which is the first tagged version to contain no breaking changes. Applications should be able to update from v0.3.0 with no changes.
This month brings us Gio v0.3.0, which features richer integration of custom window decorations on Windows, changes to make text truncation behave consistently, and many other bugfixes.
The past month saw a steady flow of bugfixes and optimizations going into core, but the biggest change is Gio's first-ever tagged release! Gio v0.1.0 (and similar tags in gio-x and gio-example) are now available.
This month saw quite a few font and text improvements and numerous bugfixes across the ecosystem. With support from Plato Team, I focused on making our text stack more efficient with the following results:
This month saw the merge of two notable text features: color bitmap glyph support and automatic shaper-driven text truncation. With these features, we are now able to display color emoji, and we are also able to visually indicate when text with a configured maximum number of lines has been truncated. I'd like to thank Plato Team for supporting this work financially, and Elias for reviewing the mountains of patches it generated.
This month was quiet on the branches, but an exciting and long-requested feature is coming: color glyph rendering. This will allow Gio to display text using many color emoji fonts, as well as some bitmap fonts. I have a working prototype, but editing text with emoji revealed that our text editor desperately needs to support UAX#29 grapheme clusters in order for cursor positioning within emoji to make sense. I'm tackling that problem right now. I'd like to thank Plato Team for supporting this project.
After the enormous pile of features that landed in December, January was a quiet month. We hummed along fixing bugs, adding some small features, and thinking about the future.
First up, I'd like to thank Egon Elbre for implementing an RSS feed for these newsletters. You can find that feed if you prefer to consume content via feeds.
It's seemingly been a quiet month in the Gio project. Not many patches have landed in our repos, and one might almost think that nothing was happening. However, this quiescence is actually the result of Elias and I iterating heavily on Gio's upcoming text API. Adding both font fallback and bidirectional text support to Gio has stretched our text abstractions to the breaking point, so we've had to rethink them this month. That work has primarily been on the gio-patches mailing list, so you won't have seen it unless you're subscribed.
This month Elias upgraded our handling of image scaling by automatically generating mipmaps for all images. This ensures that images look good when downscaled, and also boosts performance when downscaling images. You don't need to make any application changes to take advantage of this new feature.
Elias is settling into a new place in Central America, and is starting to turn a critical eye towards Gio's layout system. He's exploring ways to make Gio layout more flexible, to solve , and to reduce the boilerplate of writing Gio code. There's no concrete proposal to share yet, but I look forward to hearing what comes of this exploration.
This month one of the biggest changes was Egon Elbre's work to eliminate many of Gio's transitive dependencies. He did this by rewriting significant parts of the text segmentation library that we use, as well as figuring out the proper dance to update us to the multi-module version of golang.org/x/exp. The results are a go.sum with 500 fewer lines, and Gio binaries that are 1.5MiB smaller.
This month saw a number of small-but-useful improvements to widget.Editor,
including the ability to filter characters, enforce a maximum length, and
built-in support for undo/redo. Additionally, numerous subtle event processing
bugs were ironed out.
I'm sure you're all wondering "what happened to the material data
table?" Well, good news! This month, Jan's work was merged into gio-x
and the bounty payout is processing right now!
Elias spent the last month reviewing my text work, improving widget
focus traversal, and improving many small details about core. In
particular, there is now a nix-based development environment for gio
available in core's flake.nix file. For details on nix, see:
Elias implemented focus traversal for Gio interfaces this month. This
enables users to navigate between focusable widgets (buttons, editors,
etc) with actions like pressing tab. This single feature has a huge
impact on the ease of using Gio for entering data into form fields and
general keyboard navigation.