* input: implement follow_mouse_shrink
Add a new config option `input:follow_mouse_shrink` (INT, 0-300, default 0)
that shrinks inactive window hitboxes by the specified number of pixels for
focus detection purposes. This creates a dead zone in gaps between windows
where moving the cursor will not trigger a focus change.
The shrink only applies to inactive (non-focused) windows and only during
mouse-move focus checks (follow_mouse = 1). Click and scroll interactions
are unaffected — clicking on a window in the shrunk area still works
normally once the window is focused.
Closes#9973
* tests: add integration test for follow_mouse_shrink
* Add test for movewindowgroup
* groups: Fix `movewindoworgroup` moving into group
Fixes `CKeybindManager::moveWindowIntoGroup` to
remove a window from a group before attempting
to add it to another group. Addresses #13843.
But the animation of moving a window from a group
into another group now looks weird: as if the
whole target group is being moved.
* monitor: ensure swapchain is updated before mode test
* monitor: ensure swapchain update via helper for all mode set paths
* monitor: fix formatting
* monitor: move swapchain helper to CMonitorState
* monitor: move swapchain helper to CMonitorState
fail to build from source
```
src/managers/screenshare/CursorshareSession.cpp:8:10:
fatal error: hyprgraphics/egl/Egl.hpp: No such file or directory
```
* subsurface: use geometry-aware damage and recurse into nested trees
Replace per-surface damageSurface() calls in recheckDamageForSubsurfaces()
with box-based damage that tracks each subsurface's last known global
position and size. When geometry changes, both the old and new areas are
damaged to correctly clear stale pixels and paint the new location.
Additionally, recurse into child subsurfaces so that nested subsurface
trees are properly damage-checked, with a depth limit of 32 to guard
against cycles. Cached geometry is invalidated on map/unmap to avoid
stale comparisons across surface lifecycle transitions.
* clang-format
* xwayland: prefer monitor-aware hover coords
Introduce monitor-aware XWayland coordinate helpers and keep the X11 hover path anchored to the main surface box while preserving detailed debug logging, reducing dependence on nearest-monitor guesses in layout-sensitive input paths.
* xwayland: use window monitor for reported coords
Report X11 window positions through the window's known monitor instead of the generic nearest-monitor heuristic so boundary-aligned outputs keep stable XWayland coordinates.
* xwayland: use window monitor for real position restore
Convert XWayland geometry back into compositor space using the window's current monitor when available so vertically offset layouts do not round-trip through the wrong output.
* xwayland: use window monitor for unmanaged geometry
Restore override-redirect X11 geometry through the window's known monitor so helper windows and popups avoid nearest-monitor misclassification on offset layouts.
* xwayland: remove monitor conversion debug logging
Drop the temporary XWayland hover and coordinate conversion diagnostics now that the monitor-selection bug is confirmed and the window-monitor based conversions fix the issue.
* xwayland: drop unrelated focused-motion change
Remove the exploratory X11-specific pointer focus scaling from InputManager so the monitor mapping fix stays narrowly scoped to the XWayland coordinate conversion changes that actually resolve the bug.
* clang-format XWaylandManager
Adds GTest unit tests for CDamageRing in src/helpers/DamageRing.hpp.
Covers:
- setSize: initial full damage, same-size no-op, resize re-damage, zero-size
- damage: in-bounds accept, empty/out-of-bounds reject, partial clip
- damageEntire: normal path and zero-size no-op
- rotate: clears current, preserves as previous, wraps beyond ring length
- getBufferDamage: age<=0 and age>ring return full screen, age=1 current only,
age=2 accumulates previous, full ring accumulation, coalescing fallback,
empty ring returns empty
- hasChanged: false initially, true after damage/damageEntire, false after
rotate, false for out-of-bounds damage
27 new test cases, all passing.
* misc: silence warnings about ignoring return value on reads
silence warnings on ignored return values on read() and print an error
if it occurs.
* misc: silence warnings about ignoring return value on writes
silence warnings on ignored return values on write() and print an error
where we can, or pass them the maybe_unused attribute.
* misc: silence warnings about ignoring return value on pipe
silence warnings on ignored return value on pipe(), print an error and
exit on failure.