Skip to content

gui_toolkit 0.42.0

Choose a tag to compare

@sachahjkl sachahjkl released this 26 Oct 18:16
· 368 commits to master since this release
v0.42.0
5334471

Added

  • Accessibility: screen readers read the toolkit's windows (ui/a11y.odin, platform/a11y.odin, platform/a11y_diff.odin, platform/a11y_accesskit.odin (Windows), platform/a11y_stub.odin, native/a11y, docs/accessibility.md). Each build turns the boxes into an accessibility tree (boxes with a role or text; layout boxes left out; ids are the boxes' keys; bounds, focus, states, values, actions) and AccessKit 0.25 exposes it through UI Automation (WM_GETOBJECT). Built only once an assistive technology asked for the window; only the nodes that changed are sent (platform.A11y_Diff). Every widget gives its role, name and states (buttons, check boxes, radios, switches, sliders, steppers, progress, segmented, chips, dropdowns, tabs, fields and text editors with text runs and caret, lists and virtual lists, menus and menu bars, tooltips, toasts as live regions, modals, splitters, accordions, cards, form rows, title bar and caption buttons, status bar, labels, paragraphs, rich paragraphs with their links). The app names its own boxes with ui.a11y(info) (next box) or ui.a11y_set(box, info); ui.a11y_wanted(), ui.a11y_active, ui.a11y_tree, ui.a11y_find, ui.a11y_stats. Requests of assistive technologies (invoke, toggle, select, expand / collapse, focus, set value, increment / decrement, text selection, scrolling, context menu) arrive as the same signals as input; the others in ui.a11y_requests(); ui.a11y_request(key, action), ui.a11y_numeric_request, ui.a11y_inject (tests). Trees of the app's own (documents) are grafted under a node (A11y_Info.graft) and sent with platform.a11y_send. ui.set_window_button_names (translated caption buttons). Platform: a11y_state, a11y_send, a11y_take_request, a11y_available, the update writer (a11y_node, a11y_children, a11y_str...); Event_Kind.Accessibility. Compiled in with -define:A11Y_ACCESSKIT=true (tools\build_a11y.ps1 builds build\a11y\gt_a11y.lib; A11Y_NATIVE_LINK=false when the program's own Rust library carries it). Every update is checked against a mirror of the tree before AccessKit sees it (a broken update is refused, not a crash); text runs and text selections are made safe for AccessKit's text code. ui.a11y_box_text (the text a box shows to a reader). ui.a11y_focus_on(key): the readers' focus on a graft node while the app's view has the keyboard (a focus on a graft whose tree is not there yet waits for it in the adapter).
  • tools/uia: a small UI Automation client (COM IUIAutomation): elements, control types, names, states, values, invoke / toggle / select / expand / set value / focus. tools/uia_probe: the same as a command, for end-to-end tests of applications (a hidden window works).
  • Tests: tests/a11y (the tree, incremental updates, requests; with -define:A11Y_ACCESSKIT=true, a hidden window read and driven through UI Automation). CI runs both.