You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 688dd2b
Browse filesBrowse the repository at this point in the historyBrowse files
Linux had none: the selector fell through to the null backend while the
capability matrix claimed "backend tests" for Linux X11. AT-SPI2 is a D-Bus
protocol rather than a library, which is what makes it reachable without a
new dependency — pyatspi and gi.repository.Atspi are distribution packages
built against the system introspection data and cannot be installed into a
virtual environment, so depending on them would be depending on something
most users cannot get.
The D-Bus client written for the portal handshake moves from linux_wayland/
to utils/dbus_client/ to make that possible: utils/ sits above the per-OS
packages, so an accessibility backend reaching down into a platform backend
to borrow its D-Bus code would invert the layering. The old path re-exports
it, so the portal code is untouched; the client's own tests follow it, since
a shim forwarding private names too would be a second copy of the surface to
keep in step.
Verifying it against a real bus and a real GTK application immediately found
a gap in that client: it could not demarshal signed integers. The portal
never needed one, and AT-SPI reports a component's extents as four signed
values, because a window on a monitor left of or above the primary one is at
a negative coordinate — so the backend could read a tree but not where
anything in it was. The whole fixed-width numeric set marshals now, except
UNIX_FD, which stays an error on purpose: it is an index into a descriptor
array this client does not receive, so returning it would hand a caller a
number that addresses nothing.
The x11-verification job grew a third script for it, against zenity on a
D-Bus-activated accessibility bus. Neither half can be mocked usefully — an
application only appears on the bus if its toolkit bridge loaded, and the
tree's shape is the toolkit's business.
Because AT-SPI is a bus rather than a display protocol, this is the one
capability where Wayland is not the restricted case: the same bus serves both
Linux sessions.
Copy file name to clipboardExpand all lines: CLAUDE.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@
5
5
AutoControl (`je_auto_control`) is a cross-platform GUI automation framework: mouse and keyboard control, image recognition, OCR, accessibility-tree and VLM element location, action scripting, and report generation behind one API. Backends: Windows (Win32 ctypes), macOS (pyobjc/Quartz), Linux X11 (python-Xlib), Linux Wayland (libei / ydotool), Android (adb), iOS (WebDriverAgent).
-**[architecture_explore.md](architecture_explore.md)** is the per-module map — read it before changing structure; it lists all 308`utils/` subpackages, every GUI tab, and file-level tables for the large subsystems.
8
+
-**[architecture_explore.md](architecture_explore.md)** is the per-module map — read it before changing structure; it lists all 309`utils/` subpackages, every GUI tab, and file-level tables for the large subsystems.
9
9
10
10
## Architecture
11
11
@@ -18,7 +18,7 @@ AutoControl (`je_auto_control`) is a cross-platform GUI automation framework: mo
18
18
| Template Method |`utils/generate_report/`| HTML / JSON / XML share collect → format → write. |
19
19
| Backend seam |`backends/` under `accessibility`, `ocr`, `vision`, `llm`, `agent`, `hotkey`, `usb`, `usbip`| Abstract base + concrete impls + null fallback, so dependency-free environments still import. |
@@ -68,7 +68,7 @@ The map is only useful while it matches the tree, so **update it in the same cha
68
68
69
69
Never adjust one by hand: the counts are `len(text.splitlines())` (what `wc -l` reports), and hand-editing is how the document ended up quoting the same subsystem at two sizes at once — most tables had been counting a phantom trailing line per file while §1 and §8 counted correctly.
70
70
71
-
- A new `utils/` subpackage needs a row in **exactly one** §5.4 theme table — the tables partition all 308 subpackages; appearing twice or not at all is a defect.
71
+
- A new `utils/` subpackage needs a row in **exactly one** §5.4 theme table — the tables partition all 309 subpackages; appearing twice or not at all is a defect.
72
72
- A new subsystem over ~1,000 lines also needs a file-level table in §5.4.17.
73
73
- Keep the header's scan date, version, and branch current.
74
74
-`README.md` and both translations under `README/` cite the same figures (command / subpackage / tab / MCP-tool / example counts) — update all three alongside the map.
0 commit comments