From 541051f256e4cc8b3d8cb0fe7c85c7c4b6e1f1b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Polykanine?= Date: Tue, 8 Sep 2026 23:01:13 +0200 Subject: [PATCH] Record what the listening pass actually found The whole script has now been walked by ear, so the documentation says what was heard rather than what was hoped. Right-to-left is no longer an open question. It was verified against a real Hebrew catalog - Hebrew text in the menus, the column headers and the rows, Hebrew mnemonics through the collision validator, submenu direction, and the mirrored tree beside the list. What remains unverified is narrower and now stated as such: a machine whose Windows display language is itself right-to-left, which is a different test from switching language inside a left-to-right system. The mirrored tree earned a sentence of its own, because it was wrong until today and the reason is easy to hit again: RightToLeft is an ambient property and RightToLeftLayout is not, so a control can right-align its text without ever flipping its arrow keys. Multiple selection was the surprise. It is announced well on all three readers - extending, moving the focus without extending, and selecting everything at once. The one shortfall is that none of them names the mode the way they say "multi select list box" for a list box, which appears to be decided by control class rather than by anything the control reports: a multi-select list view, a single-select one and a multi-select list box all measured identical MSAA state. Written down as unresolved rather than guessed at. The listening script gains a step for it, and MultiSelect gains its own bullet in the README. It was buried mid-sentence in a list of eight properties and was missed three separate times by someone reading that list, which is a good enough reason to move it. Claude-Session: https://claude.ai/code/session_01TJ8i7jHmkUjVCjVccLp6Hf --- README.md | 32 ++++++++++++++++++++++++-------- samples/NoteBook/LISTENING.md | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 054fddc..08b5d4b 100644 --- a/README.md +++ b/README.md @@ -223,13 +223,17 @@ carry covers what a list-driven application actually uses: * **Content** — `Items`, `Columns`, and per-column `Width` with the `AutoSizeToContent` / `AutoSizeToHeader` constants for widths measured rather than guessed. -* **Selection** — `SelectedItems`, `FocusedItem`, `MultiSelect`, `ClearSelection`, - `EnsureVisible`, and `Selected` / `Focused` on a row, both settable before the control has - a window so a list populated during form construction comes up on the right row. +* **Selection** — `SelectedItems`, `FocusedItem`, `ClearSelection`, `EnsureVisible`, and + `Selected` / `Focused` on a row, both settable before the control has a window so a list + populated during form construction comes up on the right row. +* **Multiple selection** — `MultiSelect`, off by default as on a WinForms `ListView`. Turning + it on gives the usual keyboard vocabulary: Shift with the arrows to extend, Ctrl with them to + move the focus without extending, Ctrl+Space to add the focused row. Screen readers announce + all three correctly, so this is a mode worth using rather than one to avoid. * **Appearance** — `BackColor` and `ForeColor`, per-row `ForeColor`, `BorderStyle`, and a - column's `Alignment` and `SortOrder` arrow, both settable at any time. Left alone, the colors follow the system - theme: light, dark and high contrast, and a switch between them while the application is - running. + column's `Alignment` and `SortOrder` arrow, both settable at any time. Left alone, the colors + follow the system theme: light, dark and high contrast, and a switch between them while the + application is running. * **Hit testing and layout** — `GetItemAt`, `GetItemBounds`, `SetInsertionMark` / `ClearInsertionMark` for a drop indicator during a reorder, and `BeginUpdate` / `EndUpdate` for bulk changes. @@ -296,11 +300,23 @@ French and Ukrainian catalogs. The menus are verified by ear with **JAWS**, **NVDA** and **Narrator**, and behave as expected on all three. -`NativeListView` is verified on the same three. Every WinForms-based variation reads only the +`NativeListView` is verified on the same three, in single and multiple selection alike. +Extending a selection, moving the focus without extending it, and selecting every row at once +are all announced correctly. The one shortfall is that no reader names the mode: a stock list +box is announced as a "multi select list box" and there is no equivalent wording for a list +view, so the behavior is described well while the mode itself never is. Every WinForms-based variation reads only the first column on all of them; the real `SysListView32` reads every column on all of them. Reports from other configurations are welcome. -RTL rendering is implemented but has not been verified against a real RTL locale. +Right-to-left rendering is verified against a real right-to-left catalog: the sample's Hebrew +translation, with Hebrew text in the menus, the column headers and the rows, and Hebrew +mnemonics through the collision validator. Submenu direction and the mirrored tree beside the +list both behave, the latter only once the tree is told to mirror — `RightToLeft` is an ambient +property and `RightToLeftLayout` is not, so a control that right-aligns its text has not +necessarily flipped its arrow keys. + +What has not been checked is a machine whose Windows display language is itself right-to-left, +which is a different test from switching language inside a left-to-right system. ## Building from source diff --git a/samples/NoteBook/LISTENING.md b/samples/NoteBook/LISTENING.md index 8e2d009..1964669 100644 --- a/samples/NoteBook/LISTENING.md +++ b/samples/NoteBook/LISTENING.md @@ -94,7 +94,40 @@ window that WinForms does not own. This is the step most likely to fail. - Right-click a **column header**. A different menu should open — the one about columns. - Right-click a **row**. The note menu should open instead. -## 6. A language change, and right to left +## 6. Multiple selection + +Open. The list is multi-select and nothing here is settled - this step exists to find out what +readers actually do with it, not to confirm something already known. Whatever you hear is the +result, including "nothing". + +- With focus on a row, hold **Shift** and press **Down arrow** to extend the selection. You + should hear the row you moved to. Whether you also hear that it was *added to* a selection, + and whether any reader tells you how many rows are now selected, is exactly what is being + measured. +- Press **Ctrl+Down arrow** a few times to move the focus without changing the selection, then + **Ctrl+Space** to add that row. A reader that does not distinguish these two is telling you + something worth writing down: the focus rectangle and the selection are separate things, and + a user who cannot hear which one moved cannot use this mode. +- Open the context menu with **Shift+F10** and choose **Select All**. Listen for whether the + new state is announced at all, or whether the list goes silent after a command that changed + every row in it. +- Shift-click and Ctrl-click with the mouse and compare. Readers sometimes announce a + mouse-driven selection change differently from a keyboard-driven one. + +Worth trying on all three readers, because this is the area where they diverge most. + +What has been heard so far, September 2026: selection behavior is announced well, on all three. +Extending, moving the focus without extending, and selecting everything at once all come across. + +The one gap is the label rather than the behavior. Readers announce a stock multi-select list +box as a "multi select list box", and there appears to be no equivalent wording for a list view +from any of them - so the mode itself is never named, however well its effects are described. +Whether that can be influenced from the control is unresolved: a multi-select list view, a +single-select one and a multi-select list box were all measured reporting identical MSAA state, +which suggests readers decide this from the control class rather than from anything the control +reports. If you can confirm that with a speech viewer, it is worth knowing. + +## 7. A language change, and right to left This is the part of the library with the least real-world verification, and the reason the sample ships a Hebrew catalog rather than only a layout switch: mirroring English text proves