Newsletter, September 2026
Linux IME and Cancellable Window Close

After another month of community effort, I’m pleased to announce Gio v0.10.3! This release brings support for Input Method Engines (IME) on Linux for both X11 and Wayland. On X11, ibus is specifically supported, whereas on Wayland we now implement the zwp_text_input_v3 interface and will automatically use it on compositors that implement the server side. Effectively, Linux users now can enjoy the same ease of text composition as our other platforms.

Additionally, it is now possible to cancel the close of an application window on desktop platforms (Windows, macOS, and Linux). This feature is unavailable on mobile and WASM. Read below for more details.

Sponsorship

These past few months, Gio thanks the following organizations and community members for their ongoing support!

Supporting the whole team:

Supporting a maintainer:

  • Kristian Mide via GitHub Sponsorship of Elias.
  • Dmitri Shuralyov via GitHub Sponsorship of Elias.
  • anedel via GitHub Sponsorship of Elias.
  • A number of anonymous community members supporting both Elias and Chris.

Sponsorship money given to Gio enables Elias and I to cover the costs of running Gio’s infrastructure, to pay for some of our time spent maintaining and improving Gio, and to plan for funding significant feature work. You can support Gio by contributing on OpenCollective or GitHub Sponsors.

gioui.org@v0.10.3

This month, qiannian polished our windows integration heavily, primarily addressing issues in manipulating the size and position of application windows.

qiannian also contributed the long-awaited feature of window close cancellation. Now when a user requests window close, the window will emit an app.ClosingEvent on supported platforms (Windows, macOS, Linux). If an application ignores this event, nothing will change and the application window will close. If an application calls the Abort() method on this event, the close will be cancelled and the window will remain open.

Alessandro Arzilli contributed support for the ibus IME running under X11, while at the same time bigwolfe implemented support for zwp_text_input_v3 on Wayland.

Many other contributors provided small features or bugfixes this month, check them out below.

Changes by Author

qiannian:

  • app: [Windows] fix custom decoration restore on secondary displays. Use the proposed window rectangle in WM_NCCALCSIZE when choosing the monitor. During restore, the current window rectangle can still be at the minimized position, which otherwise selects the primary monitor. a5280e4f
  • app: cancel pointer input when window loses focus. Cancel pointer input when a window loses focus so ongoing gestures do not remain active after focus changes. 968f366c
  • app: fix Windows modifier key state. ee153476
  • app: map Windows numpad keys. c7517b7d
  • app: [Windows] support per-monitor DPI. Set Per-Monitor V2 awareness on each locked window thread so Gio does not change the process-wide DPI context. 152bd0d6
  • app: report close requests before closing. Desktop close actions now emit ClosingEvent before closing a window. Applications retain the existing behavior by doing nothing, or call Abort while handling the event when a confirmation is needed. f50d82f5
  • app: [Windows] hide maximize button when MaxSize is set. Maximizing a window with MaxSize moves the bounded window to the top-left corner instead of filling the work area. Hide the maximize button for such windows. dbfe0280
  • widget: add Editor and Selectable PaintSelectionWhenUnfocused. The selection highlight is hidden when the widget loses focus, even though the selection itself is retained. While a context menu opened from a selection has taken focus, the selection is thus invisible while still being operated on. 08c90034

Chris Waldon:

  • text: provide new go-text script hint. When resolving a font face for a given run of text, go-text/typesetting now wants us to hint about the script of the text in order to give a higher- quality result. This change ensures that we properly provide this hint, eliminating some text regressions in font fallback that were introduced when we updated our typesetting version without providing the script hint. dee6153c
  • text: use iterators to segment paragraphs. This commit overhauls the front-end of the text shaping stack to abstract the difference between string input and reader input behind an iter.Seq. This makes the segmentation process easier to reason about, and also helps me get my head back into the shaper codebase for other possible improvements. 5f567c93
  • text: fix staticcheck warnings in tests. 49fa70b6
  • text: use upstream text segmentation implementation. This commit switches us to use the go-text-provided segmentation algorithm. This splits on bidi boundaries, script boundaries, and font boundaries just like our prior implementation did. This commit also drops a test for our custom logic that is already tested in the upstream implementation. 27c1ab81
  • text: update to latest go-text release. 6cc1cf3e

aarzilli:

  • app/internal/xkb: return symbol from DispatchKey. 29340785
  • app: support IME on linux/x11/ibus. Linux has two display servers x11 and wayland and many possible input method protocols (ibus, fcitx, uim, xim, etc). The two most commonly used ones seem to be ibus and fcitx and fcitx5 has an ibus frontend therefore this commit implements the ibus protocol. bd4018e9
  • app: [Wayland] add Toplevel to WaylandViewEvent. Exports xdg_toplevel object to WaylandViewEvent, necessary to use things such as the xdg-toplevel-icon protocol. 89d957c8

Walter Werner Schneider:

  • op/clip: do not stroke empty paths. A Stroke clip for an empty path, or one that contains only Move and MoveTo commands should not draw anything. Before this change, a square the size of the Stroke.Width would be centered on its origin. dc7e6295
  • internal/gl: prefer newer libs. The shader debug information can not be used to debug shader code in renderdoc when using older ES versions. de75fc65

Sam Sticklen:

  • widget: make editor support control+arrow word navigation. ab27d6c3
  • widget: allow selection to clear at edge of textbox with arrow key. 0573d3c9

Elias Naur:

  • gpu/internal/rendertest/refs: update reference images. Commit 2253f8af changes the output of strokes, but didn’t refresh the corresponding reference images. 84191806
  • app/internal/ibus: don’t build under GOOS=js. github.com/godbus/dbus/v5 doesn’t build under GOOS=js: 2aef11ee

zjzhang:

  • app: [macOS] allow GioView to become first responder alongside external views. Allow GioView on macOS to become first responder so it can accept keyboard and IME events. This matters when the window also contains non-Gio views such as a WkWebView that competes with GioView during automatic focus selection. Without it, click in the gio region will never give it keyboard focus. c035a619

bigwolfe:

  • app: [Wayland] add IME support. Wayland currently handles text input as key events, so input methods cannot provide preedit text, commits, or surrounding-text edits. 32ce16bc

gioui.org/x@v0.10.3

Qiannian implemented a picker for choosing folders on Windows, macOS, and Linux! This is now part of the explorer package.

Changes by Author

qiannian:

  • explorer: add Windows folder picker. 57e5211
  • explorer: fix Windows file dialog filters. e342b93
  • explorer: add macOS folder picker. 0dfc896
  • explorer: add Linux folder picker. 961f4a7

Chris Waldon:

  • go.*: update Gio to v0.10.3. 428afa5

gioui.org/example@v0.10.3

Chris Waldon:

  • go.*: update Gio and Gio-x to v0.10.3. 3bafd9e

gioui.org/cmd@v0.10.3

Tobias made a number of excellent fixes to the gogio CLI that are now available in a tagged release.

Changes by Author

Tobias Gesellchen:

  • gogio: fix the Windows file version resource layout. VS_FIXEDFILEINFO stores each of the four version components in one 16-bit half of the dwFileVersionMS/dwFileVersionLS pair. buildWindows left the major component unshifted, which moved every component one slot to the right and dropped the version code entirely: -version 0.18.0.0 ended up as 0.0.18.0, and the default -version 1.0.0.1 as 0.1.0.0. 64b6dec
  • gogio: set the bundle version in the macOS Info.plist. setInfo put the version into the template data but the template never referenced it, so -version had no effect on a macOS bundle at all: the generated Info.plist carried no CFBundleShortVersionString and no CFBundleVersion. bfcd8a5
  • gogio: test that version codes may exceed 16 bits. The fourth version field maps to android:versionCode, which is a plain build counter and routinely larger than the 16 bits a Windows version resource component gets. Pin that down, so the range check added in the next commit is scoped to the platforms that need one, rather than to parseSemver. a15f862
  • gogio: reject versions Windows cannot represent. Both the VS_FIXEDFILEINFO fields and the manifest assembly identity give each of the four version components 16 bits. A larger component silently overflowed into its neighbour, so -version 0.0.1.20241024 produced a binary claiming to be 0.0.309.55936 and a manifest Windows refuses to parse. 226ec33

End

Thanks for reading!

Chris Waldon