Another problem exposed and fixed on Slint.

This commit is contained in:
Storm Dragon committed 2026-11-01 22:49:08 -05:00
1 parent 92d6ad3cc4
commit 6df27c88de
3 files changed
+21 -10

No files matched your search

+17 -10
View File
@@ -229,6 +229,22 @@ func (adapter *Adapter) captureNativeEventSnapshot(event *C.AtspiEvent, target *
return snapshot, popupFor
}
// nativeWindowDescription runs on the GLib owner for both toolkit events and
// foreground recovery. A table can acquire focus before its frame cache is ready.
func nativeWindowDescription(window *C.AtspiAccessible, eventType, role string) string {
description := C.atspi_accessible_get_description(window, nil)
if (description == nil || C.GoString(description) == "") &&
(role == "table" || role == "table cell") &&
(eventType == WindowActivatedEvent || eventType == FocusEvent || eventType == FocusedStateEvent) {
C.g_free(C.gpointer(description))
C.atspi_accessible_clear_cache_single(window)
description = C.atspi_accessible_get_description(window, nil)
}
result := sanitizeSnapshotField(C.GoString(description))
C.g_free(C.gpointer(description))
return result
}
// enrichNativeWindowEvent queries and releases the window on the GLib owner.
// It applies foreground, tab/document, table, and prompt state in query order.
func (adapter *Adapter) enrichNativeWindowEvent(event *C.AtspiEvent, target *C.AtspiAccessible, eventType string, snapshot Snapshot, focusEvent *Event) {
@@ -271,16 +287,7 @@ func (adapter *Adapter) enrichNativeWindowEvent(event *C.AtspiEvent, target *C.A
}
if !focusEvent.ForegroundMismatch && window != nil &&
(eventType == WindowActivatedEvent || snapshot.Role == "table" || snapshot.Role == "table cell") {
description := C.atspi_accessible_get_description(window, nil)
if (description == nil || C.GoString(description) == "") &&
(snapshot.Role == "table" || snapshot.Role == "table cell") &&
(eventType == WindowActivatedEvent || eventType == FocusEvent || eventType == FocusedStateEvent) {
C.g_free(C.gpointer(description))
C.atspi_accessible_clear_cache_single(window)
description = C.atspi_accessible_get_description(window, nil)
}
focusEvent.WindowDescription = sanitizeSnapshotField(C.GoString(description))
C.g_free(C.gpointer(description))
focusEvent.WindowDescription = nativeWindowDescription(window, eventType, snapshot.Role)
}
if !focusEvent.ForegroundMismatch &&
(eventType == WindowActivatedEvent || eventType == FocusEvent || eventType == FocusedStateEvent ||
@@ -341,6 +341,7 @@ func (adapter *Adapter) recoverForeground() {
name := C.atspi_accessible_get_name(window, nil)
event.WindowTitle = sanitizeSnapshotField(C.GoString(name))
C.g_free(C.gpointer(name))
event.WindowDescription = nativeWindowDescription(window, event.Type, snapshot.Role)
if snapshot.Role == "tree table" || snapshot.Role == "table cell" {
if labels := C.cthulhu_collect_simple_prompt_text(window); labels != nil {
event.WindowMessage = sanitizeSnapshotField(C.GoString(labels))
+3
View File
@@ -845,6 +845,9 @@ locked:
if event.Source.Name != "Alpha" {
t.Fatalf("unlock focus = %q, want Alpha", event.Source.Name)
}
if event.WindowDescription != "Select an item and press Enter to open it." {
t.Fatalf("recovered window description = %q", event.WindowDescription)
}
return
}
case <-ctx.Done():