|
|
||
|---|---|---|
| .forgejo/workflows | ||
| src | ||
| .envrc | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| cliff.toml | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
acfs
Mount the AT-SPI2 accessibility tree as a read-only FUSE filesystem.
Repository: https://dev.thewordnerd.info/nolan/acfs
Installation
With a Rust toolchain:
cargo install --git https://dev.thewordnerd.info/nolan/acfs
To upgrade, re-run with --force.
Or with Nix:
nix profile install git+https://dev.thewordnerd.info/nolan/acfs
To upgrade:
nix profile upgrade acfs --refresh
Usage
Mount to a temporary directory:
$ acfs
Mounted at: /tmp/acfs-a1b2c3
Press Ctrl+C to unmount and exit.
Mount to a specific path:
$ acfs ./a11y
Mounted at: /home/user/a11y
Press Ctrl+C to unmount and exit.
Enable verbose logging:
$ acfs -v # info
$ acfs -vv # debug
$ acfs -vvv # trace
Filesystem Structure
Each accessible application appears as a directory at the mount root. Within each application, the accessibility tree is exposed as nested directories with property files:
/tmp/acfs-xxx/
├── firefox-1.45/
│ ├── name # "Firefox"
│ ├── role # "application"
│ ├── states # ["enabled", "sensitive", ...]
│ ├── interfaces/ # Supported AT-SPI interfaces
│ ├── events.json.sock -> /run/user/.../events.sock
│ └── frame-2/
│ ├── name
│ ├── role
│ └── ...
└── gnome-terminal-1.20/
└── ...
The events.json.sock symlink points to a Unix socket that streams JSON-formatted accessibility events for that subtree.
Warning: Some development tools (IDEs, game engines, build systems) recursively scan the current working directory. Mounting within a project directory can cause these tools to traverse the entire accessibility tree, saturating D-Bus with lookups. The default temporary directory avoids this issue.
License
MIT