Changelog

All notable changes to this project are recorded here, grouped as Added, Changed, Fixed, Removed and Security. The project uses Semantic Versioning. From 1.0.0 a program that builds against 1.y builds against any later 1.z, the ABI holds within a minor version, and results change only in a minor release, whose entry says what changes, or in a patch release correcting one to what the documentation promised. maul-ui-rhi and maul-ui-window sit outside that promise until Maul RHI and Maul Window reach 1.0. Before 1.0.0, any release could change the API, the ABI and every data format.

1.3.5 (2026-11-05)

This release makes the accessibility tree and the platform adapters refuse sizes and values they took unchecked: on a 32-bit target some sizes wrapped and let a copy or a conversion write past its buffer, and some values an assistive technology client sends were read as others. It also moves maul-ui-window to Maul Window 0.14.0 and the library to Maul Unicode 1.1.2. The API and the ABI are those of 1.3.4, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images, motion curves and the accessibility tree built from a context. maul-ui-window follows Maul Window and sits outside the 1.x promise until Window reaches 1.0.

Changed

Fixed

1.3.4 (2026-11-05)

This release makes the accessibility tree refuse node texts that are not UTF-8, which could end a program through D-Bus, and moves maul-ui-window to Maul Window 0.13.0, from 0.12.0. The API and the ABI are those of 1.3.3, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images, motion curves and the accessibility tree built from a context. maul-ui-window follows Maul Window and sits outside the 1.x promise until Window reaches 1.0.

Changed

Fixed

1.3.3 (2026-11-05)

This release makes a C program built with GCC 14 in its C23 mode warn when it drops a status Maul UI returns, as Clang and C++17 compilers already did. The API and the ABI are those of 1.3.2, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images, motion curves and the accessibility tree.

Fixed

1.3.2 (2026-11-04)

This release moves maul-ui-window to Maul Window 0.12.0, from 0.11.0, and fixes five internal counters that, after 2^32 events, read an old stamp as current again. The API and the ABI are those of 1.3.1, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images, motion curves and the accessibility tree. maul-ui-window follows Maul Window and sits outside the 1.x promise until Window reaches 1.0.

Changed

Fixed

The stamps are now 64-bit, so the records that keep them in the access tree, the AT-SPI adapter, popups and the glyph table take 4 to 8 bytes more each, and each atlas plot 4.

1.3.1 (2026-11-04)

This release moves maul-ui-window to Maul Window 0.11.0, from 0.8.0, and the text component to Maul Unicode 1.0.0, from 0.13.0. The glue's gamepad navigation now reaches Windows HID pads with many controls, and Window's fixes to clipboard reads, input method text and compositions reach the glue. The API and the ABI are those of 1.3.0, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images, motion curves and the accessibility tree. maul-ui-window follows Maul Window and sits outside the 1.x promise until Window reaches 1.0.

Changed

Fixed

1.3.0 (2026-11-04)

This release states the length of an accessibility update's children array, so the access tree checks every update the library builds against it, and fixes a password's mask past the text limit and two ways the access tree read through or outside an update. The API grows by one field at the end of muiAccessUpdate. Layouts, styles, draw lists, line breaks, shaped text, glyph images and motion curves are those of 1.2.0.

Changed

Fixed

1.2.0 (2026-11-03)

This release changes which text segments count as words, for word movement and for the words a screen reader steps through, to follow Unicode's word properties as ICU does, and takes Maul Tween 1.0.0. The API and ABI are those of 1.1.0, and so are layouts, styles, draw lists, line breaks, shaped text, glyph images and motion curves.

Changed

1.1.0 (2026-11-03)

This release moves Maul UI to Maul Window 0.8.0 and Maul Unicode 0.13.0. The API and ABI are those of 1.0.0, and so are layouts, styles, draw lists, line breaks, shaped text and glyph images: Maul Unicode 0.13.0 carries the same Unicode 18.0.0 data, and the one result it changes, Greek and Armenian case conversion, is one Maul UI does not use. The window glue, maul-ui-window, sits outside the 1.x promise until Maul Window reaches 1.0 and follows Maul Window 0.8.0's API; its one change in behavior is the caret below.

Changed

1.0.0 (2026-11-03)

This is the first stable release. From here a program that builds against 1.y builds against any later 1.z and means the same, the ABI holds within a minor version, and results (layouts, styles, draw-list bytes, accessibility trees, line breaks, shaped text, glyph images and motion curves) change only in a minor release whose notes say so, or in a patch release correcting one to what the documentation promised. The reference renderer, maul-ui-rhi, and the window glue, maul-ui-window, follow Maul RHI and Maul Window and sit outside that promise until both reach 1.0. The API is that of 0.7.1, and so are layouts, styles, draw lists, shaped text and glyph images; a program built against 0.7.1 is built again, as against any release before 1.0. The two fixes below are the renderer's.

Changed

Fixed

0.7.1 (2026-11-03)

This release fixes two checks in the Maul Window glue and takes Maul Tween 0.16.0. A preedit's caret is now checked the same way in both calls that take one, and asking for the keyboard for a node that is gone is refused. The API and ABI are the same as in 0.7.0, and so are layouts, styles, draw lists, shaped text and glyph images. A context reserves 8 bytes more for each transition and animation its limits allow.

Changed

Fixed

0.7.0 (2026-11-03)

This release gives every byte offset into a text the size_t of the text's length, an item of the API review before 1.0.0 (#297). A program written for 0.6 has to rebuild against the new headers and hold offsets, ranges and lengths into a text as size_t. The AT-SPI adapter now reads the characters before a text's first word as a word. Layouts, draw lists, shaped text and glyph images are the same as in 0.6.2, and so is every result for an offset inside 32 bits.

Changed

Fixed

0.6.2 (2026-11-02)

This release fixes what the 1.0.0 hardening pass (#233) found in the text queries a host calls with a content box width: they now refuse a width that is no size instead of answering NaN or infinite positions. The API and ABI are the same as in 0.6.1. Layouts, draw lists, shaped text and glyph images are the same.

Fixed

0.6.1 (2026-11-01)

This release fixes what the 1.0.0 hardening pass (#233) found. A virtual list no longer hides items after one estimated far above its measure, token aliases can no longer form a cycle through themes, an undo history past 4 GiB no longer overwrites itself, and the AT-SPI adapter no longer leaks or answers InvalidArgs when memory runs out. The API and ABI are the same as in 0.6.0. Layouts, draw lists, shaped text and glyph images are the same, except a virtual list's offsets as said below. Debug and sanitizer builds now check more of the library's internal invariants; Release builds do not.

Changed

Fixed

0.6.0 (2026-10-31)

This release finishes the review of Maul UI's API before 1.0.0 (#199) and builds against Maul RHI 0.15.0. A program written for 0.5 has to rebuild against the new headers, rename the counters listed below, read a notification's typed fields instead of its detail, and give a string's length in event and request records as size_t. Typing, pasting and deleting beside a composition, and edits that run out of memory, no longer lose text or undo history. Layouts, draw lists, shaped text and glyph images are the same as in 0.5.0.

Changed

Fixed

0.5.0 (2026-10-31)

Maul UI now follows the Maul family's rules for enumeration types, counter names and the outputs of a call that does not succeed, and builds against Maul RHI 0.14.0. A program written for 0.4 has to rebuild against the new headers, rename the counters listed below, and stop reading the part of an answer a call wrote before it failed. Layouts, draw lists, shaped text and glyph images have the same content as in 0.4.0, but a draw command's image record lays out its repeat fields differently.

Changed

Fixed

0.4.0 (2026-10-30)

Maul UI now follows the Maul family's rules for names, results and outputs, and builds against the latest Maul Tween, Maul Unicode, Maul RHI and Maul Window. A program written for 0.3 has to change the names and result checks listed under Changed and Removed. Apart from the fixes below, layouts, shaped text and glyph images are the same as in 0.3.3. Draw lists have the same content, but a box record is now 132 bytes.

Changed

0.3 0.4
muiResultName muiGetResultName
muiAccessRoleName muiGetAccessRoleName
muiNodeIdOfAccess muiGetNodeOfAccessId
muiAccessIdOf muiNode_GetAccessId
muiGetContextMisuse muiContext_GetMisuse
muiGetWorkCounts muiContext_GetWorkCounts
muiNextNotification muiContext_TakeNotification
muiNextPointerRecord muiContext_TakePointerRecord
muiDispatchPointerRecord muiContext_DispatchPointerRecord
muiPerformAccessAction muiContext_PerformAccessAction
muiGetDrawList muiContext_GetDrawList
muiSetClickRule muiContext_SetClickRule
muiSetDragThreshold muiContext_SetDragThreshold
muiSetScrollRule muiContext_SetScrollRule
muiSetContextEnvironment muiContext_SetEnvironment
muiGetContextEnvironment muiContext_GetEnvironment
muiSetAccessTextFunction muiContext_SetAccessTextFunction
muiSetEventFunction muiContext_SetEventFunction
muiFocus_Set muiContext_SetFocus
muiFocus_Get muiContext_GetFocus
muiPointer_ReleaseCapture muiContext_ReleasePointerCapture
muiPointer_GetState muiContext_GetPointerState
muiPointer_Offer muiContext_OfferDrop
muiPointer_SetCapture(context, pointer, nodeId) muiNode_CapturePointer(context, nodeId, pointer)
muiComputeLayout muiNode_ComputeLayout
muiIsUpdatePending muiNode_IsUpdatePending
muiBuildDrawList muiNode_BuildDrawList
muiBuildAccessUpdate muiNode_BuildAccessUpdate
muiHitTest muiNode_HitTest
muiFocus_Move muiNode_MoveFocus
muiFocus_MoveToward muiNode_MoveFocusToward
muiKeyInput muiNode_RouteKey
muiTextInput muiNode_RouteText
muiNavigationInput muiNode_RouteNavigation
muiWheelInput muiNode_RouteWheel
muiPointerInput muiNode_RoutePointer
muiAccess_Enable(context, rootId) muiNode_EnableAccess(context, rootId, true)
muiAccess_Disable(context, rootId) muiNode_EnableAccess(context, rootId, false)
muiNode_SetItem muiNode_BindVirtualItem
muiNode_ClearItem muiNode_UnbindVirtualItem
muiNode_GetItem muiNode_GetBoundVirtualItem
muiSetTokenValue muiToken_SetValue
muiSetTokenAlias muiToken_SetAlias
muiGetTokenValue muiToken_GetValue
muiTextHitTest muiNode_HitTestText
muiTextGetCaret muiNode_GetTextCaret
muiTextGetRangeRects muiNode_GetTextRangeRects
muiTextMove muiNode_MoveTextPosition
muiTextEditEvent muiNode_HandleEditEvent
muiTextEditMove muiNode_MoveEditCaret
muiTextEditPress muiNode_HandleEditPress
muiTextEditDrag muiNode_HandleEditDrag
muiTextPerformAccessAction muiPerformTextAccessAction
muiTextEditDef, muiDefaultTextEditDef muiTextEditRules, muiDefaultTextEditRules
muiTextBaseline muiMeasureTextBaseline
muiAccessTextOf muiReadAccessText
muiGetTextServiceMisuse muiTextService_GetMisuse
muiGetTextServiceFailures muiTextService_GetFailures
muiSetDefaultFont muiTextService_SetDefaultFont
muiSetFallbackFonts muiTextService_SetFallbackFonts
muiRenderGlyph muiTextService_RenderGlyph
muiRenderColorGlyph muiTextService_RenderColorGlyph
muiRenderGlyphField muiTextService_RenderGlyphField
muiRenderGlyphMultiField muiTextService_RenderGlyphMultiField
muiGlyphAtlas_Get muiGlyphAtlas_GetGlyph
muiGlyphAtlas_GetColor muiGlyphAtlas_GetColorGlyph
muiGlyphAtlas_GetField muiGlyphAtlas_GetGlyphField
muiGlyphAtlas_GetMultiField muiGlyphAtlas_GetGlyphMultiField
muiGlyphAtlas_NextFrame muiGlyphAtlas_BeginFrame
muiGetAccessTreeMisuse muiAccessTree_GetMisuse
muiAccessTree_Count muiAccessTree_GetNodeCount
muiGetAndroidAdapterMisuse muiAndroidAdapter_GetMisuse
muiGetAriaAdapterMisuse muiAriaAdapter_GetMisuse
muiGetAtspiAppMisuse muiAtspiApp_GetMisuse
muiGetNsAdapterMisuse muiNsAdapter_GetMisuse
muiGetUiaAdapterMisuse muiUiaAdapter_GetMisuse
muiGetUikitAdapterMisuse muiUikitAdapter_GetMisuse
muiAriaActionFunction, muiAtspiActionFunction, muiAndroidActionFunction, muiNsActionFunction, muiUiaActionFunction, muiUikitActionFunction, muiWindowAccessActionFunction muiAccessActionFunction
muiRangeAxis, muiListAxis (mui_rangeHorizontal, mui_listVertical, ...) muiAxis (mui_axisHorizontal, mui_axisVertical)
muiTextDirection (mui_textInherit, mui_textLeftToRight, mui_textRightToLeft), muiDirectionMatch (mui_directionAny, ...) muiInlineDirection (mui_inlineInherit, mui_inlineLeftToRight, mui_inlineRightToLeft)
mui_popupNone, mui_popupMenu, mui_popupListBox, mui_popupTree, mui_popupGrid, mui_popupDialog (aria-haspopup) mui_hasPopupNone, mui_hasPopupMenu, mui_hasPopupListBox, mui_hasPopupTree, mui_hasPopupGrid, mui_hasPopupDialog
muiRange (a condition's interval) muiInterval
muiWindowSetComposition muiTextBlock_SetPreedit
muiWindowCompose muiTextBlock_ShowPreedit
muiWindowGlue_Paste muiTextBlock_PasteFromWindow
muiWindowGlue_WriteClipboard muiWriteWindowClipboard
muiWindowGlue_SetCaret muiNode_SetWindowCaret
muiWindowGlue_SetTextCaret muiNode_SetWindowTextCaret
muiWindowGlue_RequestKeyboard muiNode_RequestWindowKeyboard
muiWindowAccess_HasAdapter muiWindowAccess_IsAdapterCreated

Added

Fixed

Removed

0.3.3 (2026-10-25)

Fixed

0.3.2 (2026-10-25)

Fixed

Changed

0.3.1 (2026-10-25)

Fixed

Changed

0.3.0 (2026-10-25)

Changed

0.2.1 (2026-10-25)

Fixed

0.2.0 (2026-10-24)

Changed

Fixed

0.1.0 (2026-10-24)

A release of fixes that change the API: a program built against 0.0.1 must be rebuilt, and code that compares results to mui_errorInvalid may need to look for mui_errorFormat instead.

Changed

Removed

Fixed

0.0.1 (2026-10-23)

The first release: a retained UI core that lays out, styles, draws, takes input and speaks to screen readers, the same on every platform.

Added

Changed