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.
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.
mwinMouseButton constants, with the same
values. The glue names none of them and reads a button by its number,
so what it does is unchanged. Maul Unicode 1.1.2 gives the results
1.0.0 gave: it now refuses an iterator no init call set up, and Maul
UI sets up every one it uses. Line breaking costs 1 to 2% more
(#413).muiAccessTree_Apply sized its copy of each array a node points at
as a count times an item's size, unchecked. On a 32-bit target a
count large enough wrapped that size, so the tree copied a few bytes
but kept the whole count, and every adapter that walked the array
read past the copy. Such an update is now refused with
mui_errorCapacity, as for memory run out, and changes nothing
(#399).ACTION_SET_TEXT), as UTF-8, could wrap for a text past
1,431,655,764 UTF-16 units, and the conversion wrote past it. Such a
text is now refused as memory run out, and the host is asked nothing
(#400).GetBoundingRectangles on a text range over 2^30 lines
or more wrapped its array's 32-bit element count and wrote past the
array. It now answers E_OUTOFMEMORY, as when the array cannot be
made (#402).GetText length below
-1 as no limit, and a scroll amount outside the five named ones was
answered S_OK, scrolling the other axis alone. Each is now refused
with E_INVALIDARG, as Navigate already refused an unknown
direction, and changes nothing. UI Automation's own client passes
none of these on, so a screen reader through it is unaffected
(#407).GetCharacterExtents, GetRangeExtents and
GetOffsetAtPoint read a coordinate type past the parent's as the
window's. They now answer InvalidArgs, as the Component methods do
(#410).positionFromPosition:inDirection:offset: negated or added
an extreme offset in signed arithmetic that overflowed, which is
undefined behaviour, and read a direction UIKit does not name as
down. It now gives nil for both, as for a position outside the text
(#408).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.
muiAccessTree_Apply accepted node texts that are not UTF-8, or
that hold a NUL, though maul-ui/access.h says each is UTF-8. The
AT-SPI adapter passes node texts to D-Bus, and libdbus ends the
whole program on a string that is not UTF-8. So a host that sent a
broken label could have its process aborted when an assistive
technology read it. Such an update is now refused with
mui_errorInvalid, counted as misuse, and changes nothing
(#393).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.
MUI_NODISCARD, which marks every function that returns a status,
expanded to nothing under GCC 14 in C23 mode (-std=c23), because
GCC 14 reports its C23 as __STDC_VERSION__ 202000L, not 202311L.
It is now [[nodiscard]] there too, so a host that drops a status
gets a warning, and a host that builds with -Werror gets an error
(#374).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.
mwinRequest_GetDialogFiles, which takes a
truncatedOut argument, and how Android and iOS drops end. The glue
reads neither dialog files nor Window's drops, so what it does is
unchanged
(#369).muiAccessTree_Apply, an update in which two
nodes list each other could be accepted instead of refused with
mui_errorInvalid. The two nodes then stayed held, each the other's
parent and reached from no root, until the tree was destroyed, and
the host was never told they were removed
(#367).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.
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.
docs/user/maul-window.md says it does: d-pad and
stick directions, confirm and cancel, and the shoulders. Window 0.10.0
gave such a pad no buttons, or no axes and hats, and did not add a
pad left with neither; 0.11.0 takes its controls from the first 32
capabilities of the Button and Generic Desktop pages
(#358).textBytesPerWindow posts an input
state reset; before, it was dropped or ended with no reset. On X11
and Wayland, a compose sequence of 64 bytes or more types its text
when it fits, then resets, instead of typing nothing. On a reset the
glue lets go of held modifiers, buttons, pen buttons and touches,
and tells the host to give the block an empty preedit.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.
muiAccessUpdate gains childCount, the length of its children
array. muiNode_BuildAccessUpdate sets it, and muiAccessTree_Apply,
which every adapter's Apply calls, refuses a node whose children
reach past it, a wrapping sum included. With childCount 0 the
length is not stated, so Apply cannot check the children against
it and keeping them in range is the caller's, as before. Positional
initializers of muiAccessUpdate get a missing-field warning
(-Wmissing-field-initializers) until they add childCount; 0
keeps their behaviour
(#344).MUI_MAX_TEXT_BYTES, is no longer laid out with a wrong mask. Up to
1,431,655,765 clusters its mask passed the text limit, and past that
its 32-bit length wrapped (2 bytes at 1,431,655,766 clusters). Such
a password now measures and paints as when memory runs out, counted
by muiTextService_GetLayoutFailureCount, and accessibility does not
read it
(#336).muiAccessTree_Apply refuses, with mui_errorInvalid and no change,
a NULL entry in an update's nodes and a node whose links are counted
with no array. It read through both
(#341).muiAccessTree_Apply with change callbacks no longer reads outside
the tree when an update sends a node again and lets it go in the
same apply: the old root sent with no parent, or a child its parent
stops listing. Such a node is told once, as removed
(#348).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.
muniSegmentIterator_GetWordKind calls words, as ICU's rule status
does, in place of Maul UI's own test for a letter or a number. Word
movements (muiNode_MoveTextPosition, and the keys that move or
delete by word) and muiAccessWord change for segments that hold
these code points and no other letter or number
(#331):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.
mwinEvent.kind and mwinEventKind for type and
mwinEventType), and against Maul Unicode 0.13.0 when it provides
its own
(#324).muiNode_SetWindowCaret stops text input with the
null id, the window now keeps its caret, where it was cleared before,
as Maul Window 0.8.0 does. Text and compositions arrive without
control characters, which Maul Window 0.8.0 drops
(#324).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.
SOVERSION is the major and minor version
(#319).muiRhiRenderer_Record answered
mui_errorPlatform) and drew nothing, for example after a screen's
last text went away. Such a frame now draws
(#322).mui_errorCapacity
(#317).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.
muiTextBlock_SetPreedit took a preedit's caret
unchecked, so a caret past the preedit or inside a character named an
offset outside the composition or inside a character.
muiTextBlock_ShowPreedit refused every caret of a preedit longer
than INT32_MAX with mui_errorInvalid, where the text is refused
for its length with mui_errorLimit. Both calls now take a caret of
-1 (hidden) or a character boundary of the text, and refuse anything
else with mui_errorInvalid before the block changes
(#304).muiNode_RequestWindowKeyboard asked for a plain-text
keyboard for a node that is gone, or for a host without a context,
and answered mui_success. It now refuses them with
mui_errorStale and mui_errorInvalid before it asks Maul Window
for anything; the null id still hides the keyboard
(#308).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.
size_t
wherever they were uint32_t: muiTextBlock_Replace's range and
muiTextSpan; muiTextPosition.offset, muiCompositionSegment, and
the ranges and outputs of muiNode_GetTextRangeRects,
muiTextBlock_FindDeletion, muiTextBlock_SetComposition and
muiTextBlock_GetComposition; muiTextSelection.anchor,
muiTextBlock_EraseTo and muiTextBlock_Compose's caret;
muiAccessWord, muiAccessCluster, muiAccessTextMarks' selection
and lineStarts, muiAccessNode.textLength and muiAccessRequest's
range; muiAccessTree_GetTextRects and
muiAccessTree_GetTextOffsetAt; and muiTextBlock_SetPreedit's
offset. Code that fills or reads them as uint32_t has to use
size_t, and on 64-bit the records holding them grow. An offset past
32 bits is now refused or clamped as any offset past the text is,
where it was cut to 32 bits before and could name another place
(#302).MUI_NO_OFFSET (SIZE_MAX, in maul-ui/base.h) names
an absent offset. Window glue: muiTextBlock_SetPreedit gives its
caret as a size_t, MUI_NO_OFFSET where the input method hides it
or the composition ended, in place of an int32_t with -1
(#302).muiAccessTree_Apply refuses a node whose text is
longer than MUI_MAX_TEXT_BYTES with mui_errorLimit and counts it
as misuse, where it took any uint32_t length before
(#302)." hello", the word at offset 0 or 1 was an empty
string, the word start after offset 0 was offset 0 again, and the
word start before offset 3 was empty. As GTK, Chrome and Firefox do,
and as the other adapters already did, the text's start is now a word
start, so a reader gets the spaces, then hello after them
(#299).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.
muiNode_HitTestText, muiNode_GetTextCaret,
muiNode_GetTextRangeRects and muiNode_MoveTextPosition laid out
a NaN, infinite or negative width as a size. They answered
mui_success with a NaN or infinite caret x or rectangles, and moved
an editing block's scroll to follow a caret laid out at that width.
Each now refuses such a width with mui_errorInvalid before laying
anything out, so its outputs and the editing scroll stay as they
were. muiNode_GetTextCaret also refuses an affinity out of range,
as muiNode_MoveTextPosition already did, where it read one as
downstream
(#290).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.
muiCreateAtspiApp answers mui_errorPlatform, as it does when the
accessibility bus cannot be reached
(#277).mui_empty on the nodes under the theme. The aliases of the context
and of every live theme, taken together, now never form a cycle:
muiToken_SetAlias and muiTheme_SetTokenAlias refuse an alias that
could close one with mui_errorInvalid and count one misuse. This
also refuses some aliases that no nesting of themes would close
(#255).mui_errorCapacity and keeps the text and the
history
(#246).Accessible, Component, Action or Text
interface that ran out of memory answered
org.freedesktop.DBus.Error.InvalidArgs, telling the screen reader
its call was wrong. It now answers NoMemory, as Properties
already did; InvalidArgs is kept for bad arguments
(#278).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.
size_t in
muiTextEvent.length, muiEvent.length and
muiAccessRequest.length, as it already was in every parameter.
Code that fills or reads these fields as uint32_t has to use
size_t. On 64-bit, muiTextEvent grows from 24 to 32 bytes and
muiEvent from 72 to 80, with length now right after text;
muiAccessRequest keeps its 56. Offsets and ranges inside a text stay
uint32_t. muiNode_RouteText refuses a text longer than
MUI_MAX_TEXT_BYTES with mui_errorLimit, and the text guide states
the rule
(#203).muiNotification.detail is replaced by four typed
fields: notificationsDropped for mui_notificationDropped, player
(uint8_t) for the focus kinds, reason (muiDismissReason) for
mui_notificationPopupDismissed and action (muiAccessAction) for
mui_notificationAccessAction. Each is 0 for the other kinds. Code
that read detail reads the field of its kind, with no cast.
muiDismissReason and muiAccessAction are now declared in
maul-ui/context.h; their values stay in maul-ui/popup.h and
maul-ui/access.h. The record grows from 16 to 28 bytes, so a
context takes 12 bytes more for each notification its limit allows
(#225,
#230).muiTextService_GetFailures is now
muiTextService_GetLayoutFailureCount, and muiVirtualList.count is
now itemCount. What each counts is the same
(#212).muiDrawGradient.kind is a muiGradientKind, an
int32_t, instead of a uint32_t. Code that stores or compares it as
uint32_t takes the type instead. The record keeps its 96 bytes and
its layout, and draw lists have the same bytes
(#216).muiDrawSink_GetVisibleRect takes a const muiDrawSink*, so a paint
function holding a const sink can call it without a cast. Callers
with a non-const sink compile unchanged
(#222).muiDropKinds, declared in maul-ui/pointer.h and used by
muiInteractionStyle.accepts, muiContext_OfferDrop and
muiPointerRecord.dropKind. It is still uint32_t, so no caller
changes
(#223).muiTextBlock_Type and muiTextBlock_Paste read a
text past MUI_MAX_TEXT_BYTES, and grew the service's scratch to its
size, before they refused it; a string shorter than the length given
with it was read past its end. Every way a text comes in now refuses
such a length with mui_errorLimit before reading a byte. A
muiTextBlock_Compose refused for its segments, its length or its
fit, or for want of memory, took the selection out anyway; it now
keeps the text, the selection and the undo history. A composition
over a selection goes at the selection's start
(#202).muiNode_HandleEditEvent read through a NULL pointer
for a text event with no text and a nonzero length. It now answers
mui_errorInvalid and counts one misuse
(#210).mui_errorCapacity with the text,
the selection and the history as they were
(#215).muiDrawSink_GetVisibleRect with a NULL output on a live sink counted
no misuse, while the other sink calls count one for a bad argument. It
now counts one on the sink's context
(#228).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.
int32_t for a kind,
mode or choice, and uint32_t for a set of bits. Before, most were
uint8_t or uint16_t, so the structs that hold them change layout:
among others muiLayoutStyle, muiVisualStyle, muiTextStyle,
muiEvent, muiPointerRecord, muiAccessNode, muiCondition,
muiEnvironment and muiTextEditRules grow. muiDrawCommand keeps
its 152 bytes, but an image command's repeatX is four bytes, so its
repeatY moves from offset 89 to 92. muiPropertyMask stays
uint64_t. Every check of a kind refuses -1 and INT32_MIN as well
as values past the last. muiNode_RouteKey refuses a key code above
0xFFFF, and muiNode_MoveTextPosition refuses a starting position
whose affinity is neither value
(#192).muiWorkCounts' styled, sized, measured and painted are now
styleCount, sizeCount, measureCount and paintCount, and
muiPointerRecord.dropped is now recordsDropped. What each counts
is the same
(#193).mui_success or mui_errorBusy: a failure,
mui_empty and a capacity failure alike. Before, it left the array as
it was, or wrote the part of the answer that fit. This covers
muiNode_GetAccessRelation, muiAccessTree_GetShownChildren,
muiAccessTree_GetName, muiAccessTree_GetTextRects,
muiAccessTree_Write, the four muiTextService_Render calls and
muiGlyphAtlas_TakeUpdates. After a capacity failure, ask again with
the count or length the call gives
(#166).mui_errorBusy, because host code
its owner was running made it, writes none of its outputs, single
values and buffers alike. Before, it cleared them, though the call in
progress may have been filling them: for example an allocator calling
muiTextBlock_Undo while text was typed set the outer call's
changed to false. A creation still clears the id it gives on any
failure. A program that read a cleared output after a busy refusal
now reads what was there before the call
(#173).muiTextBlock_ShowPreedit), as Maul Window asks since its
0.6.0. A reset of another window, or a gamepad's, leaves it. The glue
cannot do this itself, because the host hands preedits to its field.
The headers, the user guide and the text sample say and do so
(#161).muiDestroyFont, muiDestroyFontFamily and
muiDestroyTextBlock freed the object's memory before its id went
stale. An allocator's free that read the object back could read freed
memory: muiFontFamily_MatchFace on the family being destroyed read
its freed faces, and muiTextBlock_GetText answered a pointer into
freed text. The id is now stale before any free runs, and such a call
answers mui_errorStale
(#189).mrhiSuggestSurfaceColor)
(#197).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.
muiObject_Verb, where the object
is the kind of the call's first id, or the context or service the call
acts on. Creation, defaults and calls that act on no object keep
muiVerbNoun. Parameters and behaviour are the same unless noted.
muiNode_CapturePointer takes the node before the pointer, and
muiNode_EnableAccess takes a bool in place of the old enable and
disable pair
(#149). Every
new name in this release, with those of the changes below:| 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 |
muiWindowGlueDef.gamepads is now
enableGamepads
(#149).
muiRhiRendererDef.imageContext is now imageUser,
muiWindowGlueDef.gamepadContext is now gamepadUser, and
muiLayoutInput.measureUser is now user, which goes to both the
measure and the baseline functions
(#104).
muiNotification.count is now detail. A dropped pointer record
gives its count in the new muiPointerRecord.dropped, and its
clickCount is 0
(#108).axis take
muiAxis. muiNode_GetScrollThumb takes a muiAxis in place of
bool horizontal, and refuses an unknown axis. A layout style's
textDirection and a condition's direction take
muiInlineDirection. For a condition, inherit holds for either
direction, as "any" did
(#95).mui_errorFormat is
now -8, mui_errorVersion is -7, and mui_errorState is -6. What
mui_errorState used to mean, host code calling back into the object
it serves, is now mui_errorBusy (-10). mui_errorState now answers
the editor's calls on a block that is not editing, which used to be
mui_errorInvalid, and counts no misuse. mui_errorUnsupported (-4)
is new. It answers an atlas getter on an atlas of another format,
which used to be mui_errorInvalid, and a WOFF or WOFF2 font, which
used to be mui_errorFormat. mui_errorLimit (-9) is new too. It
answers a count or size past a published bound, which used to be
mui_errorInvalid, and counts one misuse. Each such bound is now a
MUI_MAX_ or MUI_MIN_ constant, and a context limit can be at most
2^31 - 2
(#126).mui_empty, unless its header says otherwise. A count, length or
image size that a capacity failure reports is still given. The class
getters copy their result only on success. Each output's documentation
says what a failure leaves
(#87).muiTextBlock_SetEditing refuses NULL rules with
mui_errorInvalid. End editing with the new
muiTextBlock_ClearEditing
(#150).muiNode_ComputeLayout
lays such content out as empty, measures it again on the next layout,
and answers mui_errorCapacity. A paint function that could not paint
calls the new muiDrawSink_Fail, so the node is painted again on the
next build, which answers mui_errorCapacity. The text component does
both when memory runs out
(#136).muiTextHost runs, host code
it calls (the service's allocator, FreeType's memory through it, the
clipboard writer) may read the host's context but not change it. A
change answers mui_errorBusy and counts one misuse, and
muiDestroyContext does nothing
(#130).muiState is a uint16_t, so eight states can
be added later without moving anything. The conditions' variants start
at 17 (mui_variantCondition0), and variants 9 to 16 are refused.
muiNode_SetStates refuses a bit that names no state
(#91).muiAtlasFormat is a uint8_t, so a glyph
atlas def's and an atlas page's format are one byte. The constants
keep their names and values
(#88).muiTextBlock_ClearEditing ends a block's editing
(#150).muiNode_IsAccessEnabled tells whether a root's accessibility is on
(#149).muiDrawSink_Fail lets a paint function report that it could not
paint (#136).mui_errorUnsupported, mui_errorLimit and the MUI_MAX_ and
MUI_MIN_ bounds they answer for
(#126).muiTextService_RenderColorGlyph and a colour atlas write past their
memory. Such a glyph is now refused with mui_errorFormat, and the
font's other glyphs draw as before. The PNG decoder counts its sizes
in 64 bits
(#120).mui_errorCapacity. A replace
from a screen reader whose paste failed left the selection moved; it
now restores the selection
(#135).muiNode_SetLayoutStyle. Call muiNode_SetLayoutValues with
MUI_LAYOUT_PROPERTIES
(#108).MUI_MAX_DRAW_STOPS. Use MUI_MAX_GRADIENT_STOPS, which is also 4
(#108).mtwnMakeDecayFromDeceleration, whose logarithm is correctly rounded
more often than maul-ui's own. The rate changes in its last bit for
about 0.9% of deceleration rates; the default, 0.998, is unchanged,
and iOS's "fast" 0.99 moves by one ulp. No fling or drag output moved
in a grid of 60,047 fling frames and 23,780 drags at 0.998 and 0.99,
nor in 320 million sampled offsets at 0.99, but an offset within
about 1e-16 of a float rounding boundary may still round differently
(#66).c x d / (c x + d)
computed in double and rounded once, in place of Maul UI's own float
form. During such a drag the overscroll offset, and so the drawn
transform and the draw list's bytes, can change in the last bits: by
at most 2.4e-4 units, which no screen shows, and toward the exact
value near the limit, where the float form lost precision. Springing
back, flings and scrolling without overscroll are unchanged.
(#50)muiTextBlock_EndComposition no longer loses text: the
kept composition is recorded in the edit history.
(#30)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.
mui_errorVersion before anything else in it is read
(#22).mui_errorFormat and no longer counts as misuse, so every
mui_errorInvalid is now a bug in the host
(#19):muiCreateFont returns mui_errorFormat for font data shorter
than a header or longer than 2^31 - 1 bytes;muiPerformAccessAction returns it for a screen reader's value or
point that is not finite;muiTextPerformAccessAction returns it for offsets that are not
character starts of the text as it is now, or a field no longer
editing.muiDefaultAccessTreeDef,
muiDefaultAtspiAppDef, muiDefaultAriaAdapterDef,
muiDefaultAndroidAdapterDef, muiDefaultNsAdapterDef,
muiDefaultUiaAdapterDef or muiDefaultUikitAdapterDef. They are
static inline in the headers, so they stamp the program's version
(#22).The first release: a retained UI core that lays out, styles, draws, takes input and speaks to screen readers, the same on every platform.
maul-ui-rhi, a reference renderer on Maul RHI, which can also draw
a panel in 3D against the scene's depth.maul-ui-window, the glue to Maul Window: input, gamepads, input
methods, the clipboard, the on-screen keyboard and the platform's
accessibility adapter for a window.clang-cl, macOS, iOS, Android and
the web, with Emscripten or Clang's wasm32-wasi; a static or shared
library, a CMake package and a pkg-config module.MUI_DEF_VERSION is now MUI_ABI_VERSION, and before 1.0 it
carries the whole version, patch included. muiCreateContext and
muiCreateTextService now refuse a def built with the headers of any
other release, another patch release too, with mui_errorVersion.
muiDefaultContextDef and muiDefaultTextServiceDef are inline and
stamp the headers' version, so build against the headers of the exact
library you link.