patches: review fixes — defvar, method extraction, GC safety, window_end_valid

Review-based improvements:
- ns-accessibility-enabled DEFVAR_BOOL (disable AX overhead)
- window_end_valid guard in ns_ax_window_end_charpos
- GC safety comments on Lisp_Object ObjC ivars
- postAccessibilityNotificationsForFrame split into 4 methods
- block_input in ns_ax_completion_text_for_span
- Fplist_get predicate comment
- macos.texi VoiceOver section with defvar docs
- README updated with USER OPTION + REVIEW CHANGES sections
This commit is contained in:
2026-02-27 17:51:39 +01:00
parent b83a061322
commit d408a542e5
3 changed files with 524 additions and 439 deletions

View File

@@ -3,10 +3,10 @@ EMACS NS VOICEOVER ACCESSIBILITY PATCH
patch: 0001-ns-implement-AXBoundsForRange-for-macOS-Zoom-cursor-.patch
0002-doc-add-VoiceOver-accessibility-section-to-macOS-app.patch
author: Martin Sukany <martin@sukany.cz>
files: src/nsterm.h (+105 lines)
src/nsterm.m (+2846 ins, -151 del, +2695 net)
doc/emacs/macos.texi (+46 lines)
etc/NEWS (+11 lines)
files: src/nsterm.h (+119 lines)
src/nsterm.m (+3024 ins, -147 del, +2877 net)
doc/emacs/macos.texi (+53 lines)
etc/NEWS (+13 lines)
OVERVIEW
@@ -114,6 +114,18 @@ ARCHITECTURE
accessibilityAttributeValue:forParameter: API.
USER OPTION
-----------
ns-accessibility-enabled (DEFVAR_BOOL, default t):
When nil, the accessibility virtual element tree is not built, no
notifications are posted, and ns_draw_phys_cursor skips the Zoom
update. This eliminates accessibility overhead entirely on systems
where assistive technology is not in use. Guarded at three entry
points: postAccessibilityUpdates, ns_draw_phys_cursor, and
windowDidBecomeKey.
THREADING MODEL
---------------
@@ -615,4 +627,38 @@ TESTING CHECKLIST
26. Open an org-mode file with many folded sections. Verify that
folded (invisible) text is not announced during navigation.
REVIEW CHANGES (post initial implementation)
---------------------------------------------
The following changes were made based on maintainer-style code review:
1. ns_ax_window_end_charpos: added window_end_valid guard. Falls
back to BUF_ZV when the window has not been fully redisplayed,
preventing stale data in AX getters called before next redisplay.
2. GC safety documentation: detailed comment on lispWindow ivar
explaining why staticpro is not needed (windows reachable from
frame tree, GC only on main thread, AX getters dispatch to main).
3. ns-accessibility-enabled (DEFVAR_BOOL): new user option to
disable accessibility entirely. Guards three entry points.
4. postAccessibilityNotificationsForFrame: extracted from one ~200
line method into four focused helpers:
- postTextChangedNotification: (typing echo)
- postFocusedCursorNotification:direction:granularity:markActive:
oldMarkActive: (focused cursor/selection)
- postCompletionAnnouncementForBuffer:point: (completions)
- postAccessibilityNotificationsForFrame: (orchestrator, ~60 lines)
5. ns_ax_completion_text_for_span: added block_input/unblock_input
with specpdl unwind protection for signal safety.
6. Fplist_get third-argument comment (PREDICATE, not default value).
7. Documentation: macos.texi section updated with
ns-accessibility-enabled variable reference. etc/NEWS updated.
-- end of README --