Repository navigation
GUI.Forms 0.2.1440, built and tested from commit feacf6d42b5d.
Downloads
| Program | Platform | Archive | Installer |
|---|---|---|---|
| GUI.Forms Gallery | Linux arm64 (Ubuntu 24.04 or compatible) | gui-forms-gallery-0.2.1440-linux-arm64.tar.gz |
gui-forms-gallery-0.2.1440-linux-arm64.deb |
| GUI.Forms Explore (preview) | Linux arm64 (Ubuntu 24.04 or compatible) | gui-forms-explore-0.2.1440-linux-arm64.tar.gz |
gui-forms-explore-0.2.1440-linux-arm64.deb |
| GUI.Forms Correspondence | Linux arm64 (Ubuntu 24.04 or compatible) | gui-forms-correspondence-0.2.1440-linux-arm64.tar.gz |
gui-forms-correspondence-0.2.1440-linux-arm64.deb |
| GUI.Forms Gallery | Linux x64 (Ubuntu 24.04 or compatible) | gui-forms-gallery-0.2.1440-linux-x64.tar.gz |
gui-forms-gallery-0.2.1440-linux-x64.deb |
| GUI.Forms Explore (preview) | Linux x64 (Ubuntu 24.04 or compatible) | gui-forms-explore-0.2.1440-linux-x64.tar.gz |
gui-forms-explore-0.2.1440-linux-x64.deb |
| GUI.Forms Correspondence | Linux x64 (Ubuntu 24.04 or compatible) | gui-forms-correspondence-0.2.1440-linux-x64.tar.gz |
gui-forms-correspondence-0.2.1440-linux-x64.deb |
| GUI.Forms Gallery | macOS (Apple silicon, macOS 14 or later) | gui-forms-gallery-0.2.1440-macos-arm64.zip |
gui-forms-gallery-0.2.1440-macos-arm64.pkg |
| GUI.Forms Explore (preview) | macOS (Apple silicon, macOS 14 or later) | gui-forms-explore-0.2.1440-macos-arm64.zip |
gui-forms-explore-0.2.1440-macos-arm64.pkg |
| GUI.Forms Correspondence | macOS (Apple silicon, macOS 14 or later) | gui-forms-correspondence-0.2.1440-macos-arm64.zip |
gui-forms-correspondence-0.2.1440-macos-arm64.pkg |
| GUI.Forms Gallery | Windows x64 | gui-forms-gallery-0.2.1440-windows-x64.zip |
gui-forms-gallery-0.2.1440-windows-x64-setup.exe |
| GUI.Forms Explore (preview) | Windows x64 | gui-forms-explore-0.2.1440-windows-x64.zip |
gui-forms-explore-0.2.1440-windows-x64-setup.exe |
| GUI.Forms Correspondence | Windows x64 | gui-forms-correspondence-0.2.1440-windows-x64.zip |
gui-forms-correspondence-0.2.1440-windows-x64-setup.exe |
SDK
gui-forms-sdk-0.2.1440-source.tar.gz is this commit's source with the pinned third-party sources it builds from. Unpack it and run python3 tools/build_sdk.py --target <platform> --prefix <dir> to build and install GUI.Forms for your host; SDK_MANIFEST.json lists what it carries and what a build still downloads (docs/user/install.md).
SHA256SUMS.txt lists every download's digest.
Caveats
- macOS bundles are ad hoc signed (
codesign --sign -), not Developer ID signed or notarized; Gatekeeper asks before the first launch (right-click, Open). - Windows executables and installers are unsigned; SmartScreen shows a warning until publisher reputation exists.
- Linux programs need an X11 display (XWayland works). The DEB declares the X11/ATK dependencies; the tar archive needs the same libraries.
- Fonts ship with each program; no host fonts are read.
Test and smoke receipts attached: ctest-linux-arm64.xml, ctest-linux-x64.xml, ctest-macos-arm64.xml, ctest-windows-x64.xml, packages-linux-arm64.json, packages-linux-x64.json, packages-macos-arm64.json, packages-windows-x64.json, smoke-linux-arm64.json, smoke-linux-x64.json, smoke-macos-arm64.json, smoke-windows-x64.json.
Focus
0.2 is the "Verified" series. Each item in it has a recorded gate: tests
that measure it on every host it applies to (Windows x64, macOS arm64, Linux
x64 and Linux arm64), and a record under results/ saying what was
measured. The demonstration programs are the same three as in 0.1: the
control Gallery, the fixture-backed Explore preview and the Correspondence
mail mockup.
Breaking changes
- The CMake package is 0.2. Its version file accepts only the same minor
version, sofind_package(GUIForms 0.1 ...)no longer finds it. Ask for
find_package(GUIForms 0.2 CONFIG ...). The shared libraries still carry
SOVERSION 0, and as in 0.1 there is no binary promise between releases:
rebuild against each new SDK. - Images are admitted by format, not only as PNG.
ImageRegistry::load_imageandreplace_imagetake an encoded file and
choose the decoder by its signature; PNG is the only format admitted (CNG,
admitted in 0.2.0, was removed afterwards). Image resources and their views
reportImageMetadata(width, height, alpha and decoded byte count) in
place ofPngMetadata, which onlyvalidate_pngreports now.
load_pngandreplace_pngremain, for PNG only. - Optional values replace
has_*flags where the flag could disagree
with the value beside it:ErrorProviderChange::has_erroris gone; it was always
!error.empty().ImageAttributesSnapshot::color_matrixis astd::optional, and
has_color_matrixis gone.HostClipboardImageResult::imageis astd::optional, andhas_image
is gone.- In stx_vorbis,
OggPacket::granuleandpage_granule, and
OggStreamEnd::granule, are optionals;has_granuleand
page_has_granuleare gone.
- Removed: active surfaces (ADR-016).
Window::activate_surface,
Control::on_frame,MetricsSnapshot::active_surface_count,
maximum_active_surface_countandactive_surface_ticks,
FramePollResult::active_surface_ticks,maximum_active_surfacesand
minimum_active_surface_intervalare gone. Animate with an
AnimationTimermember: its tick damages what it changed and returns
AnimationTickResult, and it waits for the control's next paint. For work
that is not drawing, such as a press-and-hold repeat or a poll, use
Window::schedule_ui_timerand stop it yourself. Aschedule_paint
deadline now only repaints its control; it calls nothing. - Removed:
Command::set_key_tipandCommandState::key_tip. The ribbon
has no KeyTips, and nothing else read them.
Consumer migration
- TextBox passes Enter and Escape on (f333fb1, 4f0be17), as in Windows
Forms, so the window's accept and cancel buttons, menus, docking and
containers receive them. A single-line box consumes Enter only while it
has something to accept (an open suggestion list, an appended completion,
or an input-method composition). It consumes Escape only while it has
something to cancel (the same, or a selection drag). Otherwise it raises
neithercommittednorcancelledfor those keys.- A box that is an edit session and relied on
committed()or
cancelled()firing for plain Enter or Escape must opt in:
set_accepts_enter(true)andset_accepts_escape(true). The box then
raises the event and stops the key there. - A multi-line box still takes Enter to insert a newline.
- Known affected consumers: File Manager had five such boxes, and
SwiftEdit's CSV editor has the same pattern. - The in-tree editors (BreadcrumbTrail, ColorValueEditor, InstrumentRack,
PropertyList and TokenBox editors, the Linux host's dialog fields and
the demoboard's search box) already opt in.
- A box that is an edit session and relied on
Other changes
Controls
- Controls are articulated. Each registry control declares its named parts
and states in one schema (manifests/control-schema.json), and its parts
publish their geometry. A test lays out every Gallery page and reads each
part's geometry from it. When the gate was recorded, that covered 60 of 60
controls (results/2026-10-13-t1-anatomy-gate).
Accessibility
- Verified on every host through the platform's own accessibility API.
Client tests read the whole Gallery as an assistive technology would and
compare every control with the semantic tree it publishes: role, name, state,
value and actions. Each control's default action is performed through the
same API. Windows is read through MSAA and UI Automation, Linux through
AT-SPI and macOS through AX. Windows gains a UI Automation provider.
Records:results/2026-10-19-a-w1-msaa-gallery,
results/2026-10-20-a-w3-uia-gallery,
results/2026-10-20-a-l2-linux-galleryandresults/2026-10-20-a-macos. - Text fields expose editable text ranges on every host (ATK Text, UI
Automation TextPattern and the AppKit text attributes), each with client
tests. - Every native host advertises
HostCapability::accessibility.
Fonts
-
Families that applications ask for map to bundled faces. The table is
assets/fonts/font-substitution.json:- Metric-compatible: Calibri to Carlito, Arial to Arimo, Times New
Roman to Tinos and Courier New to Cousine. Every advance is identical in
font units, every line break is the same, and line height is within 1 px
at every measured size. - Nearest: Microsoft Sans Serif to Arimo, Tahoma, Segoe UI and Segoe UI
Semibold to Selawik, and Consolas to Portsmouth Mono. The mean line width
is within 5% of the reference face at every measured size.
Every pair is measured against the Windows reference face on all four
hosts (results/2026-10-23-f-font-substitution). - Metric-compatible: Calibri to Carlito, Arial to Arimo, Times New
-
Four styles pass only under a named, measured exception:
- Calibri bold italic: 2 of 90 line-break sets differ.
- Arial bold: one advance differs (U+00B5).
- Arial bold italic: 4 of 90 line-break sets differ.
- Tahoma bold: lines are 7.05% shorter at the worst size.
-
Arimo, Tinos and Selawik are bundled, under the SIL Open Font License.
-
resolve_font_familyreports how each request was resolved: by the
family's own name, a substitution, an alias, a generic name, or the
content family when nothing matches. A host face is used only under its
own name, never in place of another family.
Images and compression
- One zlib, owned by the project (stx_zlib), and an owned PNG codec
(stx_png) on every host. CI checks the link map of every static archive
the toolkit links, and Skia's, and fails on any other zlib, FreeType's
bundled gzip or libpng. - Windows no longer decodes images through WIC, and windowscodecs is no
longer linked. - PNG is the only image format, for resources, the clipboard and
GUI.Drawing alike. - stx_conv's CONV interpolation prepares the sized variants of image faces:
enlargements use the CONV interpolant, and reductions use pixel-area
averaging. - The compression and image code is free of GPL-licensed code.
Engine core
- The engine core of the 0.3 theme engine is sealed. On all four hosts,
144 primitive images and 308 feature-sample images were pixel-identical,
with no differences between hosts (results/2026-10-23-t2-engine-gate). - Baking work is held to an effort budget.
- The idle checks count no frames once a window settles: an idle window
draws nothing.
Themes and text masks
Theme::createtakes itsThemeDefinitionby const reference.
Existing calls still compile, and the definition is copied into the theme.TextMaskLimitgainscache_entries. The mask cache's entry count had
been reported asmetadata_bytes.
Build and CI
- GUI.Forms builds through template_harness. The shared CI tools (reuse,
compiler caches, the Windows toolchain, the checkers) moved to
malkuth-software/template_harness,
pinned byharness.lock; their oldtools/paths forward to it (see
docs/building/template-harness.md).
Release pipeline
- As in 0.1, each program is built, tested, packaged and smoke-launched on
macOS, Windows and Linux runners before anything is uploaded. - Each release now also carries the source SDK,
gui-forms-sdk-<version>-source.tar.gz, listed inSHA256SUMS.txt. It
holds the release commit's tree, the pinned HarfBuzz, FreeType,
libunibreak and miniaudio sources, andSDK_MANIFEST.json. Build GUI.Forms
for your own platform with `tools/build_sdk.py --target --prefix ` (see docs/user/install.md, "The source SDK"). It replaces the four per-platform binary SDK archives that briefly accompanied 0.2 releases. tools/build_sdk.py --features allbuilds one SDK that serves every
product. It adds the text masks and the audio loop transport, which now
install as theTextMasksandAudioLoopTransportpackage components
(find_package(GUIForms COMPONENTS TextMasks AudioLoopTransport)). Before,
installing them was refused. The default set is unchanged.
It also installs the pinned FreeType and HarfBuzz that the text engine
links, as static libraries with their headers and licences, exported as
theFreeTypeandHarfBuzzcomponents (GUIForms::FreeType,
GUIForms::HarfBuzz), for products that call them directly.
Known limits
- macOS: the bundle is ad hoc signed (
codesign --sign -), not Developer ID
signed or notarized. Gatekeeper asks for confirmation on first launch;
right-click, Open, or allow it in System Settings, Privacy & Security. - Windows: the executable and installer are unsigned; SmartScreen shows
"Windows protected your PC" until the publisher reputation exists. Choose
More info, Run anyway. - Linux: X11 is required (XWayland works); the DEB declares X11, Xcursor and
ATK dependencies. - Explore (preview) is still a fixture-backed proving slice;
file_manager_demoboard/STATUS.mdstates what is measured. - Fonts ship with each program. A family that the substitution table does
not name is taken from the host only when the host has a face of exactly
that name; otherwise the bundled content face (Carlito) is used.