fix: Status-Text-Suche liest auch das AT-SPI-Text-Interface

Der 'wird ueberprueft'-Text wurde trotz sichtbar auf dem Screenshot nie
gefunden - GtkLabel exponiert seinen Text ueblicherweise nicht ueber
.name/.description (bleiben oft leer), sondern nur ueber das separate
Text-Interface (queryText().getText(0, -1)). _node_text() sammelt jetzt
alle drei Quellen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Thomas Stallinger 2026-08-29 18:02:09 +02:00
parent 4bf1992eb9
commit dfb8c2fc72

View File

@ -117,8 +117,41 @@ VALIDATION_TEXT_MARKERS = (
)
def _node_text(node):
"""Sammelt allen aus einem Accessible auslesbaren Text: .name,
.description UND (falls unterstuetzt) das separate Text-Interface.
WICHTIG (real beim Testen entdeckt, 29.08.2026): ein einfaches GtkLabel
exponiert seinen sichtbaren Text ueblicherweise NICHT ueber .name/
.description (die bleiben dort oft leer) sondern ausschliesslich ueber
das AT-SPI-Text-Interface (queryText().getText(0, -1)) - ohne diesen
dritten Zugriffsweg fand find_showing_text() den sichtbar angezeigten
Status-Text nie, obwohl er laut Screenshot die ganze Zeit auf dem Schirm
stand."""
parts = []
try:
if node.name:
parts.append(node.name)
except Exception:
pass
try:
if node.description:
parts.append(node.description)
except Exception:
pass
try:
text_iface = node.queryText()
content = text_iface.getText(0, -1)
if content:
parts.append(content)
except NotImplementedError:
pass
except Exception:
pass
return " ".join(parts).strip().lower()
def find_showing_text(node, needle, depth=0):
"""Sucht ein sichtbares Accessible, dessen Name ODER Beschreibung den
"""Sucht ein sichtbares Accessible, dessen Text (siehe _node_text()) den
Suchtext enthaelt - unabhaengig von seiner Rolle (Label/Expander/...),
da Ubiquitys Status-Panel-Text nicht zuverlaessig unter derselben Rolle
exponiert sein muss. Bei Unsicherheit ueber den Sichtbarkeitsstatus
@ -126,15 +159,7 @@ def find_showing_text(node, needle, depth=0):
Klick mitten in die Pruefung setzen)."""
if node is None or depth > MAX_DEPTH:
return False
try:
name = (node.name or "").strip().lower()
except Exception:
name = ""
try:
desc = (node.description or "").strip().lower()
except Exception:
desc = ""
if needle in name or needle in desc:
if needle in _node_text(node):
try:
state = node.getState()
return state.contains(pyatspi.STATE_SHOWING)