B1: Fix memory leak in ns_ax_scan_interactive_spans — [spans copy]
returned +1 retained object never released by caller.
Now returns [[spans copy] autorelease].
B2: Remove dead function ns_ax_utf16_length_for_buffer_range —
defined but never called anywhere in the patch.
B3: Add specpdl unwind protection in
EmacsAccessibilityInteractiveSpan setAccessibilityFocused: —
if Fselect_window signals, block_input is now always matched
by unblock_input via record_unwind_protect_void.
W2: Document ns_ax_event_is_line_nav_key fragility in README
Known Limitations (raw keycodes vs command symbols).
W4: Add comment for #include intervals.h (TEXT_PROP_MEANS_INVISIBLE).
M3: accessibilityBoundsForRange: on EmacsView now delegates to the
focused EmacsAccessibilityBuffer for accurate per-range geometry,
with cursor-rect fallback for Zoom.
M4: Add <NSAccessibility> protocol conformance to
EmacsAccessibilityBuffer @interface declaration.
W1: Expanded commit message listing all new types, functions, DEFSYM
additions, and threading model.
8 methods were missing thread guards: accessibilityNumberOfCharacters,
accessibilitySelectedText, accessibilityStringForRange:,
accessibilityLineForIndex:, accessibilityRangeForLine:,
accessibilityRangeForIndex:, accessibilityVisibleCharacterRange,
setAccessibilitySelectedTextRange:.
All AX getters now consistently dispatch_sync to main thread.
GC safety comment added to InteractiveSpan setAccessibilityFocused:.
- Explicitly set dirvish-hide-details t
- Keep dired-mode-hook as primary trigger
- Add dired-after-readin-hook as failsafe (catches late buffer setup)
- Remove dirvish-directory-view-mode-hook (dirvish handles via its own var)
dirvish-override-dired-mode may bypass dired-mode-hook.
Add hook to dirvish-directory-view-mode-hook as well.
Toggle details with ( in dired/dirvish buffers.
Remove file-time and file-size from default dirvish-attributes so
screen reader reads only filenames. Add D keybinding to toggle
full details on/off in dirvish buffers.
SelectedTextChanged → only for selection changes (mark active)
AnnouncementRequested → only for cursor moves (char/line)
Never both for the same event. Fixes double-speech globally.
- SelectedTextChanged posted only for focused element: prevents completion
buffer from triggering double-speech (old-candidate + new-candidate)
- AnnouncementRequested for char navigation restored (evil block cursor fix):
posted AFTER SelectedTextChanged so VoiceOver cancels its own reading
and uses our explicit char-at-point announcement
- Priority: Medium (was High)
- Remove static Lisp_Object locals; use DEFSYM in syms_of_nsterm (GC-safe)
- Replace Lisp calls in accessibilityIndexForCharpos / charposForAccessibilityIndex
with NSString composed-character traversal (thread-safe, no Lisp needed)
- isAccessibilityFocused reads cachedPoint instead of marker_position off-thread
- Remove double-announcement: character nav uses only SelectedTextChanged
- Line announcement priority: High → Medium (avoid suppressing VO feedback)
- Remove 'extern Lisp_Object last_command_event' - last_command_event
is a macro in globals.h (expands to globals.f_last_command_event),
so an extern declaration conflicts with the existing
'extern struct emacs_globals globals'
- Replace invalid C escape sequences '\C-n' and '\C-p' with
('n' & 0x1f) and ('p' & 0x1f) respectively