patches: add 0008 fix overlay announcement bugs
- AnnouncementRequested to NSApp (not self) - Compare line faces via Fequal (find selected candidate) - SelectedTextChanged before announcement (interrupt speech)
This commit is contained in:
84
patches/0008-ns-fix-overlay-candidate-announcement.patch
Normal file
84
patches/0008-ns-fix-overlay-candidate-announcement.patch
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
From 988b041f1fe0dc730014fdac82e746412a5afc70 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Martin Sukany <martin@sukany.cz>
|
||||||
|
Date: Sat, 28 Feb 2026 14:41:42 +0100
|
||||||
|
Subject: [PATCH] ns: fix overlay candidate announcement for VoiceOver
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Fix three bugs in patch 0007:
|
||||||
|
|
||||||
|
1. Post AnnouncementRequested to NSApp, not self. VoiceOver ignores
|
||||||
|
announcements from non-application elements.
|
||||||
|
|
||||||
|
2. Fix face detection: compare each line's face against the first
|
||||||
|
line's face using Fequal. The previous code matched ANY non-nil
|
||||||
|
face, but all Vertico lines have faces — the selected candidate
|
||||||
|
is the one with a DIFFERENT face (e.g. vertico-current).
|
||||||
|
|
||||||
|
3. Post SelectedTextChanged before AnnouncementRequested to interrupt
|
||||||
|
VoiceOver's current speech, matching the pattern used by the
|
||||||
|
existing postFocusedCursorNotification.
|
||||||
|
|
||||||
|
* src/nsterm.m (ns_ax_selected_overlay_text): Collect line
|
||||||
|
boundaries, compare face of each line against first line's face
|
||||||
|
via Fequal, return the distinctly-faced line.
|
||||||
|
(EmacsAccessibilityBuffer postAccessibilityNotificationsForFrame:):
|
||||||
|
Post SelectedTextChanged then AnnouncementRequested to NSApp.
|
||||||
|
---
|
||||||
|
src/nsterm.m | 32 ++++++++++++++++++++++++++------
|
||||||
|
1 file changed, 26 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nsterm.m b/src/nsterm.m
|
||||||
|
index c7bba5b..43d30f9 100644
|
||||||
|
--- a/src/nsterm.m
|
||||||
|
+++ b/src/nsterm.m
|
||||||
|
@@ -8956,19 +8956,39 @@ ns_ax_completion_text_for_span (EmacsAccessibilityBuffer *elem,
|
||||||
|
properties. Completion frameworks highlight the current
|
||||||
|
candidate with a text face (e.g. vertico-current,
|
||||||
|
icomplete-selected-match). */
|
||||||
|
+ NSString *candidate
|
||||||
|
NSString *candidate
|
||||||
|
= ns_ax_selected_overlay_text (b, BUF_BEGV (b), BUF_ZV (b));
|
||||||
|
if (candidate)
|
||||||
|
{
|
||||||
|
- NSDictionary *info = @{
|
||||||
|
- NSAccessibilityAnnouncementKey: candidate,
|
||||||
|
- NSAccessibilityPriorityKey:
|
||||||
|
- @(NSAccessibilityPriorityHigh)
|
||||||
|
+ /* Post SelectedTextChanged first to interrupt VoiceOver,
|
||||||
|
+ then AnnouncementRequested with candidate text.
|
||||||
|
+ Target NSApp for announcements (Apple docs require it). */
|
||||||
|
+ NSDictionary *moveInfo = @{
|
||||||
|
+ @"AXTextStateChangeType":
|
||||||
|
+ @(ns_ax_text_state_change_selection_move),
|
||||||
|
+ @"AXTextChangeElement": self
|
||||||
|
};
|
||||||
|
ns_ax_post_notification_with_info (
|
||||||
|
self,
|
||||||
|
- NSAccessibilityAnnouncementRequestedNotification,
|
||||||
|
- info);
|
||||||
|
+ NSAccessibilitySelectedTextChangedNotification,
|
||||||
|
+ moveInfo);
|
||||||
|
+
|
||||||
|
+ candidate = [candidate
|
||||||
|
+ stringByTrimmingCharactersInSet:
|
||||||
|
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
||||||
|
+ if ([candidate length] > 0)
|
||||||
|
+ {
|
||||||
|
+ NSDictionary *annInfo = @{
|
||||||
|
+ NSAccessibilityAnnouncementKey: candidate,
|
||||||
|
+ NSAccessibilityPriorityKey:
|
||||||
|
+ @(NSAccessibilityPriorityHigh)
|
||||||
|
+ };
|
||||||
|
+ ns_ax_post_notification_with_info (
|
||||||
|
+ NSApp,
|
||||||
|
+ NSAccessibilityAnnouncementRequestedNotification,
|
||||||
|
+ annInfo);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
||||||
Reference in New Issue
Block a user