Newsletter, June 2026
Windows Platform Polish

This month, we’ve seen a bunch of small fixes and improvements to Gio’s support for Windows, particularly how we integrate with the system IME (Input Method Engine, e.g. for composing non-latin text using a latin keyboard) and how we integrate with window management. The results should be a nicer experience for all Windows users, and a handful of other bugfixes on other platforms.

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.1

We thank Qian Nian, Kevin Yuan, and Jeff Williams for the many improvements to supporting Windows better this month. Longstanding issues with widget hover state, IME, clipboard handling, graphics initialization, and more are all resolved.

Qian Nian:

  • widget/material: add hover state to window decorations. acf56355
  • app: [Windows] restore double-click restore for custom title bars. Keep custom move areas mapped to HTCAPTION even when the window is maximized so custom title bars preserve the standard Windows behavior where double-click restores the window. 15335a2b
  • io/input: support direct pointer leave events. Allow platform backends to send pointer.Leave directly. The router delivers it to entered handlers so hover state is cleared normally. 06307313
  • app: [Windows] avoid default IME composition window. Mark WM_IME_STARTCOMPOSITION as handled after positioning the IME composition and candidate windows. a8fe2748
  • widget,io,app: draw IME composition underline. Track IME composition range updates as key.CompositionEvent and route them to the focused editor. Draw a thin underline under the current composition range using the editor text material. e4932e16
  • app: [Windows] don’t make raised windows topmost. Use HWND_TOP instead of HWND_TOPMOST in ActionRaise so raising a window no longer pins it on top. 30dc7ff2
  • app: [Windows] support TopMost option. 51914097
  • app: update TopMost comment. 1a5fa17a
  • widget/material: add hover state to window decorations. acf56355

Kevin Yuan:

  • internal/egl: fix loadEGL caching error on Windows. loadEGL used sync.Once incorrectly: the error returned by loadDLLs was assigned to a local variable inside loadEGL, so on the second call Do would not run and the function would return nil even though the DLLs were never loaded. This caused a nil pointer dereference when callers proceeded to use _eglGetDisplay and other uninitialized function pointers. d52632b4
  • app: [Windows] don’t propagate WM_WINDOWPOSCHANGED to DefWindowProc. DefWindowProc handles WM_WINDOWPOSCHANGED by sending WM_SIZE and WM_MOVE messages, which would lead us to handle resizes twice. caccb608

Jeff Williams:

  • app: gracefully handle Windows clipboard read errors. 3eab8069

Elias Naur:

  • ap/internal/windows: change type of HWND_TOPMOST to syscall.Handle. 9e18cb93

End

Thanks for reading!

Chris Waldon