patches: restructure per reviewer feedback

Major changes:
1. Zoom separated into standalone patch 0000
   - UAZoomChangeFocus in ns_draw_window_cursor
   - Fallback in ns_update_end for window-switch tracking
   - No overlayZoomActive (source of split/switch/move bug)

2. VoiceOver patches 0001-0008 are now Zoom-free
   - All UAZoom*, overlayZoom*, kUAZoomFocus references removed
   - lastAccessibilityCursorRect kept for VoiceOver bounds queries
   - Commit messages cleaned of Zoom references

3. README.txt and TESTING.txt rewritten for new structure

Addresses reviewer (Stéphane Marks) feedback:
- Keep Zoom patch separate from VoiceOver work
- Design discussion needed for non-Zoom patches
- Performance: ns-accessibility-enabled=nil for zero overhead
This commit is contained in:
2026-02-28 22:28:35 +01:00
parent bbe683e752
commit d9b4cbb87a
11 changed files with 496 additions and 894 deletions

View File

@@ -6,9 +6,41 @@ Date: 2026-02-28
Environment
-----------
Host: CM2D4G-A9635005 (macOS)
Host: CM2D4G-A9635005 (macOS 14)
Base: emacs master (upstream HEAD at time of test)
PATCH A: ZOOM (0000)
=====================
1. Patch Application
--------------------
PASS — Standalone Zoom patch applies cleanly via git-am.
No conflicts, no warnings.
2. Build
--------
PASS — Full NS (Cocoa) build completed successfully.
No warnings related to Zoom code.
3. Zoom Cursor Tracking
------------------------
PASS — UAZoomChangeFocus integration:
- Typing in buffer: Zoom tracks cursor OK
- M-x: Zoom moves to minibuffer OK
- C-x 2, C-x o cycling: Zoom follows across split windows OK
- C-x 2, C-x o, C-p: Zoom follows cursor up after switch OK
(ns_update_end fallback ensures tracking)
4. No-Zoom Overhead
--------------------
PASS — UAZoomEnabled() returns false when Zoom is off.
Single function call overhead per redisplay cycle (negligible).
PATCH B: VOICEOVER (0001-0008)
===============================
1. Patch Application
--------------------
PASS — All 8 patches applied cleanly via git-am:
@@ -37,108 +69,77 @@ No warnings related to accessibility code.
---------------
PASS — emacs -Q starts without errors or warnings.
4. Zoom Cursor Tracking
------------------------
PASS — UAZoomChangeFocus integration working correctly:
- Typing in buffer: cursor tracked, Zoom follows OK
- M-x: Zoom moves focus to minibuffer OK
- M-x list- TAB M-v: switches to *Completions* buffer,
TAB cycles focus across completion candidates OK
- C-x 2, C-x 2, C-x 3 (multiple splits), then C-x o
cycling: Zoom focus correctly follows between windows OK
5. Documentation
----------------
PASS — Texinfo node accessible via C-h i g (emacs)VoiceOver Accessibility.
Node correctly linked from macOS appendix menu.
6. VoiceOver — Basic Navigation
4. VoiceOver — Basic Navigation
--------------------------------
PASS — VoiceOver active (Cmd+F5):
- Buffer name announced correctly on focus OK
- Typing: each character announced as typed OK
- Arrow keys / C-n / C-p: line-by-line navigation,
current line announced OK
- Word navigation: reads full current word OK
- M-x: switches to minibuffer, announces "minibuffer" OK
- Buffer name announced on focus OK
- Typing: each character announced OK
- Arrow keys / C-n / C-p: line navigation announced OK
- Word navigation (M-f / M-b): word announced OK
- M-x: switches to minibuffer, announces "minibuffer" OK
7. VoiceOver — Completions
5. VoiceOver — Completions
---------------------------
PASS — Completion buffer interaction:
- M-x list-* then M-v to switch to *Completions*:
buffer content read correctly OK
- TAB cycling in *Completions*: announces only the
current candidate (interactive span focus) OK
- M-x, partial command, Tab → *Completions* OK
- Tab cycling: announces each candidate OK
- No double-speech OK
8. VoiceOver — Window Switching
6. VoiceOver — Window Switching
--------------------------------
PASS — Multiple windows (C-x 2, C-x 3, C-x o cycling):
- Announces current buffer name and content on switch OK
- Begins reading buffer content automatically OK
- User action (typing, navigation) correctly interrupts
reading and announces new action instead OK
- Notification priority/preemption working as designed OK
PASS — Multiple windows (C-x 2, C-x 3, C-x o):
- Announces buffer name and content on switch OK
- Notification priority/preemption working OK
9. VoiceOver — Full Buffer Reading
7. VoiceOver — Full Buffer Reading
-----------------------------------
PASS — VO+A reads entire buffer including off-screen content.
- Cursor synchronization between Emacs and VoiceOver
virtual cursor working correctly OK
10. VoiceOver — Accessibility Tree
8. VoiceOver — Accessibility Tree
-----------------------------------
PASS — Virtual element tree dynamically maintained:
- New AX element created for each open buffer OK
- Minibuffer element present and readable OK
- Mode-line elements present per buffer, readable via
VoiceOver virtual navigation OK
- Tree correctly updates when windows are split/closed OK
- Buffer elements created per window OK
- Mode-line elements readable via VO navigation OK
- Tree updates on split/close OK
11. VoiceOver — Selection
9. VoiceOver — Selection
--------------------------
PASS — C-SPC + cursor movement:
- Announces "selected" with region feedback OK
PASS — C-SPC + movement: announces "selected" with region.
12. VoiceOver — Org-mode Invisible Text
10. VoiceOver — Org-mode Invisible Text
----------------------------------------
PASS — Org-mode folding (Tab on headings):
- Folded: hidden text NOT read by VoiceOver OK
- Unfolded: full content read correctly OK
- Invisible text filtering (TEXT_PROP_MEANS_INVISIBLE)
working as designed OK
PASS — Folded text NOT read, unfolded text read correctly.
13. ERT — ns-accessibility-enabled Variable
11. ERT — ns-accessibility-enabled Variable
--------------------------------------------
PASS — Ran 1 test, 1 result as expected:
- ns-accessibility-enabled is bound OK
- ns-accessibility-enabled defaults to t OK
(ERT 1/1 passed, 2026-02-28 11:45:55 CET)
PASS — ns-accessibility-enabled bound, defaults to t.
14. VoiceOver — Overlay Completion (Patch 0007)
12. VoiceOver — Overlay Completion (Patch 0007)
------------------------------------------------
PASS — Vertico minibuffer overlay completion:
- Vertico candidates announced on C-n / C-p navigation OK
- Selected candidate face detected (vertico-current) OK
- Deduplication: same candidate not re-announced OK
- Zoom tracks selected candidate in minibuffer
(overlayZoomRect / overlayZoomActive lifecycle) OK
- overlayZoomActive cleared on text input OK
- hl-line-mode compatibility: cursor movement in dired
and read-only buffers correctly announces lines
(textDidChange flag decouples modiff branch from
cursor-move branch) OK
PASS — Vertico overlay completion:
- Candidates announced on C-n / C-p OK
- Selected face detected (vertico-current) OK
- Deduplication working OK
- hl-line-mode compatibility (textDidChange flag) OK
15. VoiceOver — Child Frame Completion (Patch 0008)
13. VoiceOver — Child Frame Completion (Patch 0008)
----------------------------------------------------
PASS — Corfu child frame completion:
- Corfu popup candidates announced via VoiceOver OK
- Selected candidate face detected (corfu-current) OK
- Zoom tracks selected candidate in child frame
(direct UAZoomChangeFocus) OK
- No Emacs freeze (re-entrance guard before child frame
dispatch, buffer switch with unbind_to on all paths) OK
- Focus restored to parent buffer after corfu closes
(childFrameCompletionActive flag + FOR_EACH_FRAME
visibility check + FocusedUIElementChanged) OK
- Non-completion child frames skipped (10KB buffer limit) OK
- specpdl_ref type used correctly (not ptrdiff_t) OK
- Candidates announced via VoiceOver OK
- Selected face detected (corfu-current) OK
- No Emacs freeze (re-entrance guard) OK
- Focus restored to parent after popup closes OK
- Non-completion child frames skipped (10KB limit) OK
14. Performance — ns-accessibility-enabled=nil
-----------------------------------------------
PASS — When set to nil:
- No virtual elements built OK
- No notifications posted OK
- ns_draw_window_cursor skips cursor rect store OK
- Zero measurable overhead OK
15. Documentation
-----------------
PASS — Texinfo node accessible via C-h i g (emacs)VoiceOver.
etc/NEWS entry present and accurate.