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
Everything else is shared: multi-letter labels, label direction, hide-unmatched,
@@ -734,10 +769,10 @@ green in every cell while an option means nothing, which is exactly how
734
769
|`smooth_cursor.max_duration`| option | ✅ | ✅ | ❌ | cursor movement is not animated on Windows |
735
770
|`smooth_cursor.duration_per_pixel`| option | ✅ | ✅ | ❌ | cursor movement is not animated on Windows |
736
771
|`smooth_cursor.relative_movement_duration`| option | ✅ | ✅ | ❌ | cursor movement is not animated on Windows |
737
-
|`smooth_scroll.enabled`| option | ✅ |❌| ❌ |only the darwin scroll animator reads these; elsewhere the scroll is injected in one step|
738
-
|`smooth_scroll.steps`| option | ✅ |❌| ❌ |only the darwin scroll animator reads these; elsewhere the scroll is injected in one step|
739
-
|`smooth_scroll.max_duration`| option | ✅ |❌| ❌ |only the darwin scroll animator reads these; elsewhere the scroll is injected in one step|
740
-
|`smooth_scroll.duration_per_pixel`| option | ✅ |❌| ❌ |only the darwin scroll animator reads these; elsewhere the scroll is injected in one step|
772
+
|`smooth_scroll.enabled`| option | ✅ |✅| ❌ | the Windows scroll is injected in one step; macOS and Linux animate it, and on X11 the steps are whole wheel notches because X has no smaller scroll to send|
773
+
|`smooth_scroll.steps`| option | ✅ |✅| ❌ | the Windows scroll is injected in one step; macOS and Linux animate it, and on X11 the steps are whole wheel notches because X has no smaller scroll to send|
774
+
|`smooth_scroll.max_duration`| option | ✅ |✅| ❌ | the Windows scroll is injected in one step; macOS and Linux animate it, and on X11 the steps are whole wheel notches because X has no smaller scroll to send|
775
+
|`smooth_scroll.duration_per_pixel`| option | ✅ |✅| ❌ | the Windows scroll is injected in one step; macOS and Linux animate it, and on X11 the steps are whole wheel notches because X has no smaller scroll to send|
741
776
|`--split-word`| mode flag | ✅ | ❌ | ❌ | splitting detected text into words needs the vision strategy, which only macOS has an engine for; elsewhere the flag is refused rather than ignored |
742
777
|`--strategy=vision`| mode flag | ✅ | ❌ | ❌ | no element-detection engine outside macOS answers the vision strategy, so detection returns nothing and no hints appear; use axtree |
743
778
|`hide_cursor`| action | ✅ | ❌ | ❌ | a Wayland client may not hide another client's cursor, and the blessed Linux stack is Wayland; Windows has no equivalent either |
@@ -763,10 +798,16 @@ whatever the [Capability Matrix](#capability-matrix) currently reports
763
798
| Screen-sharing hide | macOS |`platform/darwin/overlay_darwin.m`| NSWindow sharing level is a Quartz concept |
764
799
| Secure input detection | macOS |`platform/darwin/secureinput.go`|`CGSessionCopyCurrentDictionary`, a private API; neither X11 nor Wayland has the concept |
765
800
766
-
Two entries left this table in ADR 0013. **Smooth scroll animation** was
767
-
recorded as needing "a synthesizable continuous scroll event stream"; uinput has
768
-
`REL_WHEEL_HI_RES`, `wl_pointer` axis values are continuous and libei carries
769
-
scroll deltas, so it is a Linux gap pending a spike. The **Vision (OCR) hint
801
+
Two entries left this table in ADR 0013 and neither is coming back.
802
+
**Smooth scroll animation** was recorded as needing "a synthesizable continuous
803
+
scroll event stream"; the spike found one on Wayland — a
804
+
`zwlr_virtual_pointer_v1` axis event with no discrete step count, and libei's
805
+
pixel-precise scroll delta on KWin — and it now animates on every Linux backend,
806
+
with X11 limited to whole notches for the reason footnote ⁴ of the
807
+
[Capability Matrix](#capability-matrix) gives. A limit on one backend is not an
808
+
exclusive: it is that backend's documented limit, which is what
809
+
[ADR 0013](./adr/0013-parity-is-measured-in-words-not-subsystems.md) says the
810
+
non-blessed stacks carry. The **Vision (OCR) hint
770
811
strategy** was recorded as needing macOS-only `VNRequest` APIs; the API is
771
812
macOS-only but the capability is not, so it is a Linux gap too — met by an OCR
772
813
engine linked the way every other native dependency here is, with its language
@@ -794,40 +835,36 @@ command — that means less here than it does on macOS, whether or not the
794
835
795
836
1.`neru docs` — returns `CodeNotSupported` although the tray already opens
796
837
URLs through `xdg-open` in the same repo
797
-
2. Smooth scroll animation — not implemented, and `smooth_scroll.*` is parsed,
798
-
validated and then silently ignored. Spike `REL_WHEEL_HI_RES` (uinput),
799
-
continuous `wl_pointer` axis values and libei scroll deltas before
800
-
committing
801
-
3. Hints search input badge — not drawn; the overlay manager reports
838
+
2. Hints search input badge — not drawn; the overlay manager reports
802
839
`CodeNotSupported` and the query goes on reaching hints through the event
803
840
tap's key stream
804
-
4. Screen capture — no code path anywhere in the tree. Prerequisite for the OCR
841
+
3. Screen capture — no code path anywhere in the tree. Prerequisite for the OCR
805
842
strategy below and the missing half of `ports.Vision`. Take it per backend:
806
843
`wlr-screencopy` on wlroots, `XGetImage` on X11, the portal only for KDE
807
-
5.`vision` hint strategy — no engine. Met by linking one through
844
+
4.`vision` hint strategy — no engine. Met by linking one through
808
845
`#cgo pkg-config`, as every other native dependency here is, with the engine
809
846
added to the required Linux library list and its language data checked at
810
847
use so a missing `tessdata` reports `CodeNotSupported` naming what is
811
848
absent. Note the strategy is wider than OCR: macOS also runs rectangle
812
849
detection and saliency, which no OCR engine answers, so
813
850
`hints.vision.detect_rectangles` and the four `rectangle_*` options are
814
-
declared macOS-only and Linux `vision` is text-only. Needs 4
815
-
6. X11 unmodified scroll — a scroll with no `--modifier` presses nothing, so the
851
+
declared macOS-only and Linux `vision` is text-only. Needs 3
852
+
5. X11 unmodified scroll — a scroll with no `--modifier` presses nothing, so the
816
853
`XTestFakeButtonEvent` still carries whatever the X server records the user as
817
854
physically holding. Binding `Ctrl+J` to a plain `scroll_down` therefore sends
818
855
ctrl+scroll for as long as ctrl is down. macOS forces the empty set onto the
819
856
event instead; a real-key backend has no per-event field to zero, so closing
820
857
this means reading the live key state through `XQueryKeymap` in the C bridge
821
-
7. KDE RemoteDesktop portal grant — does not survive a daemon restart, so the
858
+
6. KDE RemoteDesktop portal grant — does not survive a daemon restart, so the
822
859
consent prompt returns on every start
823
-
8. Grid virtual-pointer indicator — a no-op on Linux, while recursive grid
860
+
7. Grid virtual-pointer indicator — a no-op on Linux, while recursive grid
824
861
draws it on all three platforms
825
-
9.`FocusedWindowBounds` — returns not-found on KWin, so callers silently fall
862
+
8.`FocusedWindowBounds` — returns not-found on KWin, so callers silently fall
826
863
back to the active screen
827
-
10. Wayland global hotkeys — a setup requirement rather than missing code: they
828
-
need `input`-group membership and a CGO build. Failing loudly with the
829
-
remedy, and documenting it as a first-class setup step, is the work
830
-
11. Tail — the tray tooltip is a no-op (dbusmenu carries no such property), the
864
+
9. Wayland global hotkeys — a setup requirement rather than missing code: they
865
+
need `input`-group membership and a CGO build. Failing loudly with the
866
+
remedy, and documenting it as a first-class setup step, is the work
867
+
10. Tail — the tray tooltip is a no-op (dbusmenu carries no such property), the
831
868
tray has one icon for both running and paused states where macOS has two,
832
869
and the `CGO_ENABLED=0` build should announce its boundary once at startup
833
870
rather than failing feature by feature
@@ -1065,13 +1102,23 @@ violation fails `just test` rather than review:
1065
1102
|`*_linux_wayland.go`| Wayland |
1066
1103
|`*_linux_wayland_<compositor>.go`| one compositor family needing a distinct path |
1067
1104
|`*_cgo.go` / `*_nocgo.go`| CGO and pure-Go variants of the same slot |
1105
+
|`*_integration_cgo.go`| cgo scaffolding for an integration test, `//go:build … && integration` so it never ships |
1068
1106
1069
1107
Inside a package that is already one platform (`adapter/*/darwin`,
1070
1108
`adapter/*/linux`, `adapter/platform/windows`, …) the OS token is dropped —
1071
1109
the directory carries it. `overlay/linux/wayland_cgo.go` and
1072
1110
`platform/linux/system_x11_cgo.go` keep only the axes that still vary; a
1073
1111
`system_linux_x11_cgo.go` inside `platform/linux/` would say linux twice.
1074
1112
1113
+
The `*_integration_cgo.go` row exists for one situation and should stay rare:
1114
+
Go rejects `import "C"` in a `_test.go` file outright, so an integration test
1115
+
that needs C — `accessibility/native/linux/scroll_probe_integration_cgo.go`
1116
+
mapping a Wayland window to measure what a compositor delivers — has to put it
1117
+
in a non-test file. The `integration` term is what keeps that file out of every
1118
+
build the product is made from, and the C stays inline in the cgo preamble
1119
+
rather than in a `.c` file beside it, because a `.c` file compiles into the
1120
+
package unconditionally.
1121
+
1075
1122
That is why the four Linux backend rows above hold no files today: every Linux
1076
1123
backend split in the tree lives inside a single-platform directory and has
1077
1124
dropped the token. The rows are the spelling to use if a mixed package ever
0 commit comments