Skip to content

Release August 3, 2026

Choose a tag to compare

@github-actions github-actions released this 03 Aug 15:03
· 149 commits to main since this release

Gum Release — August 3, 2026

A follow-up release to August 2, 2026. It focuses on two areas: keyboard/gamepad focus navigation (a new opt-in arrow-key mode plus a batch of spatial-navigation accuracy fixes) and Gum tool startup/responsiveness.

Breaking Changes

  • Source-linkers only. MonoGameGum.csproj's iOS and Android target frameworks flipped from opt-out (ExcludeIOS/ExcludeAndroid) to opt-in (IncludeIOS/IncludeAndroid). If you source-link MonoGameGum.csproj and deliberately build the mobile targets, pass -p:IncludeIOS=true and/or -p:IncludeAndroid=true. Desktop-only source-linkers need no change — and on a .NET 9+ SDK this is the fix for the mobile-workload errors that previously had no project-level workaround. NuGet consumers are unaffected: Gum.MonoGame still ships both mobile targets. (#4296)

For more information, see the upgrade guide: https://docs.flatredball.com/gum/gum-tool/upgrading/migrating-to-2026-august

Biggest Changes

Keyboard Arrow-Key Focus Navigation

Arrow keys can now move focus between controls, opting into the same direction-based ("spatial") navigation the gamepad D-pad and stick already had — or plain tab-order navigation, whichever the container declares. This is opt-in: assign FrameworkElement.UpKeyCombos / DownKeyCombos / LeftKeyCombos / RightKeyCombos, since Slider, ListBox, and TextBox already claim the arrow keys for their own value/selection/caret behavior. Controls that opt out of gamepad Left/Right (like Slider) get the same protection from keyboard Left/Right automatically. See https://docs.flatredball.com/gum/code/events-and-interactivity/tabbing-moving-focus

Spatial Navigation Now Picks the Control You Meant

Direction-based focus navigation picked the wrong neighbor in several common layouts. Fixed in this release: the candidate cone narrowed from a 90° hemisphere to 45°, so pressing Left can no longer land on something that's really above or below; candidates are now scored by true rectangle-to-rectangle gap instead of distance to the origin's center, so a narrow button directly under a full-width Slider is no longer skipped; a stick push now snaps to its nearest cardinal so SpatialNavigationUp/Down/Left/Right overrides apply to stick input, not just clean D-pad presses; and those overrides now also apply on diagonal presses instead of being silently bypassed whenever a second direction was held.

Faster Gum Tool Startup and Snappier Variables Tab

A profiling pass on cold start found most of the time in two plugin project-load handlers doing overlapping full-project walks. Both are gone from the load path: the file watcher no longer resolves every text instance's font just to decide which directories to watch (~1050 ms → ~50 ms on a 51-screen project), and the missing-font scan is now deferred off the load path entirely rather than blocking first paint (it was 550–1400 ms). The scan itself also got ~28% cheaper. Separately, clicking between instances in the same screen or component dropped from 150–400 ms to roughly 30–90 ms, and the Windows tool now publishes with ReadyToRun to cut first-call JIT warmup.

Gum Tool

  • Project load is noticeably faster on larger projects: the file-watch setup no longer resolves every text instance's effective font just to build its watch directory list, cutting that step from ~1050 ms to ~50 ms on a 51-screen project. (#4294)
  • The load-time scan for missing fonts is no longer part of project load — it now runs after the window paints, so a large project opens without waiting on it. Fonts that really are missing are still generated on demand when text using them renders. (#4300)
  • That same font scan also got ~28% cheaper by skipping state/instance combinations the state doesn't touch. (#4297)
  • Selecting a different instance in the tree view within the same screen or component now updates the Variables tab in roughly 30–90 ms instead of 150–400 ms, by retargeting the existing rows in place instead of rebuilding the whole grid. (#4281)
  • Fixed keyboard navigation in the tree view (arrow keys, Home/End, PageUp/PageDown) moving the highlight without actually changing the selection — the Variables tab never updated when navigating by keyboard. (#4281)
  • The Windows tool is now published with ReadyToRun, precompiling native code ahead of time to reduce first-call JIT warmup. (#4285)
  • Added opt-in startup timing instrumentation for diagnosing slow startup — set GUM_STARTUP_TIMING=1 to write a phase-by-phase timing log to %TEMP%\gum_startup_timing.log. Off by default, and it replaces a previous diagnostic that wrote a temp file on every project load whether you wanted it or not. (#4291)

Gum Runtimes

  • Arrow keys can now move focus between controls — see Biggest Changes. (#4279)
  • Fixed direction-based (spatial) focus navigation picking a perpendicular neighbor over a correctly aligned one, by tightening the direction cone from 90° to 45°. (#4276)
  • Fixed a narrow control directly above or below a wide one (e.g. a button under a full-width Slider) being excluded from spatial navigation, by measuring the true gap between the two rectangles instead of the distance to the wide control's center. (#4292)
  • Fixed Sliders being unusable under gamepad spatial navigation: pushing the stick left or right stole focus instead of adjusting the Slider's value, and a Slider's own internal Thumb could steal focus away from the Slider itself. (#4278)
  • SpatialNavigationUp/Down/Left/Right overrides now also apply to left-stick pushes, not just clean D-pad presses. (#4276)
  • Fixed assigning a control to its own SpatialNavigationUp/Down/Left/Right — the documented way to block navigation in that direction — unfocusing the control instead of blocking. (#4299)
  • Fixed those same direction overrides being silently bypassed on diagonal presses (e.g. Up+Right held on the same frame). (#4301)
  • MonoGameGum.csproj no longer forces the iOS and Android target frameworks into desktop-only builds when source-linked on a .NET 9+ SDK, which previously produced mobile-workload errors with no project-level fix. Mobile targets are now opt-in via -p:IncludeIOS=true / -p:IncludeAndroid=true, matching KniGum — see Breaking Changes. The published Gum.MonoGame NuGet package still ships both mobile targets. (#4296)

What's Changed

  • Honor spatial navigation direction overrides on diagonal presses (#4301)
  • Move the load-time missing-font scan off the project-load path (#4300)
  • Make self-reference block spatial navigation direction instead of unfocusing (#4298) (#4299)
  • Skip font collection for state/instance pairs the state does not touch (#4297)
  • Make MonoGameGum's mobile TFMs opt-in, matching KniGum (#4296)
  • Stop enumerating font-cache files when computing file-watch directories (#4294)
  • Skip CI on docs-only changes (#4295)
  • Consolidate MonoGame/KNI/FNA setup into one packages+init section (#4293)
  • Add env-gated startup timing instrumentation to profile cold start (#4291)
  • Fix spatial navigation excluding narrow candidates directly below/above a wide origin (#4292)
  • Publish Gum tool with ReadyToRun to reduce first-call JIT warmup (#4285)
  • Skip full variable-grid rebuild when only the selected instance changes (#4281)
  • Fix unusable sliders under spatial gamepad navigation (#4278)
  • Add opt-in keyboard arrow-key focus navigation (#4272) (#4279)
  • Rework showcase page as a table grouped by game (#4277)
  • Tighten spatial navigation cone to 45 degrees and honor overrides for stick input (#4276)
  • Document Silk.NET.Input.Sdl NotSupportedException gotcha (#4275)
  • Add August 2026 migration doc for GetAbsoluteWidth/Height rename (#4271)

Full Changelog: Release_August_02_2026...Release_August_03_2026