Commit graph

294 commits

Author SHA1 Message Date
01fd76e1ce feat: steady jittery wheels with KICK_WHEEL_TICKS
A bouncy old wheel emits a burst of discrete ticks per physical notch,
and each tick stepped one overlay tab, so the selection jumped around.
Discrete ticks now accumulate toward a per-step threshold with net
remainders (a +2/-1 burst leaves +1 instead of jumping), mirroring the
smooth-scroll accumulator: deliberate flicks still skip multiple tabs.

The threshold is KICK_WHEEL_TICKS, read per event like
KICK_REPEAT_DELAY_MS; unset or invalid means 1, today's
one-notch-per-step, so good hardware sees no change. It only affects
overlay cycling, never client scrolling, and the leftover fraction
resets when the overlay hides. The smooth 15px threshold is untouched.

Covered by test_overlay_wheel_ticks_env, which spawns with
KICK_WHEEL_TICKS=3 (via a new _nested_session extra_env knob) and
proves two ticks step nowhere while three step exactly once; it fails
on unpatched code.
2026-09-17 13:48:53 +10:00
3a6fdd4fd4 fix: normalize libinput wheel scale so standalone overlay cycling works
One wheel notch in standalone did nothing with the overlay up: libinput
reports discrete ticks scaled by WLR_POINTER_AXIS_DISCRETE_STEP (x120),
so a single notch ran cycle_tab 120 times -- an even number of wraps on
two tabs, netting zero visible movement while still swallowing the
event. The standalone axis handler now divides by the macro before
calling overlay_handle_axis; the client forward path stays raw since
the wlroots seat divides it back itself. Nested was never affected
(its discrete values already arrive in wire units).

Proven by test_standalone_overlay_wheel_libinput_scale, which drives
one notch through the real standalone handler via a new wltest
--virtual-axis mode and asserts exactly one step (it fails with 120
steps without the fix). wltest also grows the missing
axis_source/stop/discrete pointer handlers, without which libwayland
aborts any test client forwarded a scroll event, plus axis lines in
--pointer-out.
2026-09-17 13:33:31 +10:00
0b9012cd6f feat: cycle overlay tabs with the mouse wheel
Rolling the wheel while the overlay is up now steps through tabs
exactly like Alt+Up/Down: wheel down goes to the next tab, wheel up
to the previous one, wrapping at the ends, previewed live and
committed when Alt is released. Notched wheels step one tab per tick;
smooth touchpad-style scroll accumulates to 15px per step. Horizontal
scroll still goes to clients, and with the overlay down nothing
changes.

Swallowed vertical scroll never reaches clients (both the nested and
standalone axis paths share one overlay_handle_axis gate); wltest
grows axis_source/stop/discrete handlers so forwarded scroll no
longer aborts test clients, plus axis lines in --pointer-out.
2026-09-17 12:33:00 +10:00
a4e5633a27 feat: select overlay windows with the mouse cursor
Moving the cursor over an overlay row now previews that window, the
same as dragging a finger across it; sliding off every row keeps the
last preview. Clicks while the overlay is up do nothing and never
reach clients, and releasing Alt commits the preview.
2026-09-16 22:04:37 +10:00
d91cc8ba8d feat: drag across overlay retargets touch selection 2026-09-16 21:36:57 +10:00
0d65efdd49 feat: select overlay windows by touchscreen tap 2026-09-16 21:22:50 +10:00
57c5cb7912 docs: single-instance panels cannot nest; skip panel test when host owns bus 2026-09-15 23:20:56 +10:00
07ba288b5d feat: --focus-priority favors active window via nice/ionice 2026-09-14 21:33:32 +10:00
0ac7c5c3f6 fix: scrub mode vars from client environments 2026-09-14 11:42:30 +10:00
2a2aa2fbcb feat: standalone autodetect for DM Wayland sessions 2026-09-14 10:58:03 +10:00
2838a5a71e feat: kick-pi defaults KICK_MODE to standalone 2026-09-14 10:21:47 +10:00
6ec0d5f338 revert: drop per-compositor app config shadowing 2026-09-14 09:43:23 +10:00
240c1cea4f feat: per-compositor app config in kick, slim kick-pi 2026-09-14 07:30:04 +10:00
61f9227683 feat: per-compositor GTK controls via shadow config and dconf overlay 2026-09-14 06:49:28 +10:00
67fd2038b2 feat: kick-pi Pi session wrapper and activation environment refresh 2026-09-13 23:44:04 +10:00
87ccc94075 feat: add uninstall.sh mirroring install.sh (leaves libwlroots alone) 2026-09-13 21:25:51 +10:00
c82954cf7d fix: nested Alt+F11 toggles the shown entry, not the chrome 2026-09-13 18:38:02 +10:00
f829156000 fix: size fullscreen entries to the output on every layout 2026-09-13 13:12:57 +10:00
cb362b1519 feat: overlay titles via Pango+Cairo with full Unicode support 2026-09-13 11:59:07 +10:00
51faf6b7f0 test: mark intermittently-failing tests flaky 2026-09-13 09:28:27 +10:00
94884b1ef2 feat: layout and panels follow the shown entry, not the aggregate 2026-09-13 09:19:21 +10:00
e7df8d5396 feat: per-entry fullscreen, host chrome follows shown clients 2026-09-12 12:20:25 +10:00
7494fafb89 test: strip mode-forcing env from nested compositor spawns
A leaked WLR_BACKENDS (e.g. drm,libinput) or KICK_MODE in the ambient environment flips spawned nested compositors to standalone, where the DRM backend fails and every test dies at boot for reasons unrelated to what it asserts. Seen when running the suite from a shell carrying the agent session's own WLR_BACKENDS export. Strip just those two (host connection and socket dir must pass through); precedent: kick-in-kick pops and standalone env -i.
2026-09-12 08:19:55 +10:00
d8048fc556 feat: kick-session login wrapper with per-boot logs, shipped by install.sh 2026-09-12 07:53:02 +10:00
a2b7802ec1 fix: three startup/session crashers exposed by eager hosts and real use
tabs/mru lists init before host_init (sync configure walked garbage); EGL init keeps configured host size (swapchain desync abort); overlay sentinel bump snapshots size (shrank 1px/call to zero, then aborted). Adds motion-burst regression test.
2026-09-12 07:53:02 +10:00
5be0db56f6 fix: make prefix+F11 toggle clients fullscreen in standalone mode 2026-09-11 21:59:44 +10:00
6418f730aa feat: add install.sh and desktop entries for app menu and login sessions 2026-09-11 21:46:43 +10:00
4d57dc29bd fix: silence xwayland/xwm noise when quiet via WLR_SILENT 2026-09-11 11:22:42 +10:00
abd8cf640a fix: hide panels when fullscreen so tabs take whole output 2026-09-11 11:03:35 +10:00
f4cd5f7f92 fix: break sweep loop after tab removal; asan-gate defaults 2026-09-11 09:12:58 +10:00
6601e7801e revert: drop unreachable claim-time graceful close, document why 2026-09-11 08:43:17 +10:00
16c5ed58e5 test: locked abs-pointer pin, rogue second lock surface; fix wltest abs gating 2026-09-11 08:37:27 +10:00
21d686df5d fix: drop stale overlay icon texture on re-resolve 2026-09-11 08:10:01 +10:00
8a69b99ae5 fix: guard output size reads against VT-loss teardown 2026-09-11 08:04:05 +10:00
650ca3ba50 fix: clamp absolute pointer motion to active constraint 2026-09-11 07:57:18 +10:00
4b32697f2b fix: clipboard rebind/finish races, x11 scene leaks, or focus, lock surface 2026-09-11 07:51:05 +10:00
4c7afc66a3 fix: close late-connecting black tabs, sweep only dead placeholders 2026-09-11 07:35:14 +10:00
a83a1d376d test: exclude unreachable-by-design code from coverage 2026-09-10 12:40:19 +10:00
f58418b70d test: tier-2 harness coverage, bell, IME grab/popup, request round-trips, libdecor boot 2026-09-10 11:57:13 +10:00
3a194104a3 test: synth feed drives real host pointer/touch listeners 2026-09-10 10:58:22 +10:00
1aa7665a82 test: coverage.sh builds xdeco and reports even on failure 2026-09-10 10:58:22 +10:00
4e02988c5d test: coverage.sh includes flaky pass in union 2026-09-10 10:22:36 +10:00
1d8a4d4cee test: coverage.sh takes no args, always full serial suite 2026-09-10 10:17:24 +10:00
1a77721177 test: Take _ensure_build out of test_smoke.
- It didn't work with pytest xdist.
- The AI sometimes forgets to build before testing, but it is rare.
2026-09-10 08:52:47 +10:00
be00a95d9f test: Run all tests
- Run most tests in parallel, and then the flaky ones serially.
2026-09-10 08:38:06 +10:00
6b4418ae4f feat: serve xdg-decoration-v1 pinned client-side
Every tab is maximized and kick draws no frames, so new toplevels
are pinned to client-side mode (headerbars keep working) and later
server-side requests are ignored. Pinning happens at map -- set_mode
asserts on a never-committed surface, and decoration-before-commit is
the normal order (calling it in new_toplevel_decoration aborts
wlroots); late binds pin immediately when already initialized.

Adds an xdeco probe (maps one shm-backed toplevel, reports the
configured mode) with a regression test asserting mode=1, tracks it
in build.sh staleness, and covers the global in protocol_globals.
Full suite: 153 passed, 2 skipped.
2026-09-10 03:08:18 +10:00
8bdaa970cc feat: advertise alpha-modifier-v1 (passive surface alpha) 2026-09-10 02:30:55 +10:00
33526c7a4e test: unify _wait_log into Session.wait_for (phase 6)
All 16 assert _wait_log(s, rx, timeout) sites become s.wait_for(rx,
timeout); every caller only asserted truthiness, and both poll the
whole log identically, so behavior is unchanged (failures now report
the pattern plus a log tail instead of a custom one-liner). Sites on
_wait_log's 15s default keep timeout=15.0 explicitly since wait_for
defaults to 20s. The helper is deleted. Full suite: 152 passed,
2 skipped.
2026-09-10 02:10:01 +10:00
838876ff65 test: factor skip guards into _require_* helpers (phase 5)
30 host-Wayland, 6 Xwayland and 5 helper-binary skip guards become
_require_host_wayland() / _require_xwayland() / _require_file(path,
reason). Binary checks keep their own triage messages; os.access
checks and skipif/flaky markers are untouched. Full suite: 152
passed, 2 skipped.
2026-09-10 01:55:51 +10:00
f10fff910c test: factor throwaway wltest clients into _run_wl_client (phase 4)
9 uniform throwaway-client sites (late/tag, third tab, globals
prober, layer bars x2, foreign requester, takeover locker, modifiers
and popup-reposition oneshots) go from Popen + try/finally
terminate/wait to with _run_wl_client(sock, *args, **kw):. Deliberately
untouched: host-side wl-copy (host DISPLAY env), frame/menu X11 pairs
and popup a/b (shared/explicit mid-body lifecycles), the probe (custom
DISPLAY + log-file stdio), and the _oneshot_*/_poll_* helpers.
Full suite: 152 passed, 2 skipped.
2026-09-10 01:49:37 +10:00