mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-10-09 05:21:47 +00:00
* fix(wayland): place a portal stream at the only output of its size xdg-desktop-portal-hyprland reports every stream at (0, 0). With no output at the origin, sort_streams dropped the stream; with an output of another size there, the stream took its origin and skipped try_fix_logical_size, so the client sent physical pixels from the wrong origin and the pointer landed on another output. With more than one output, a stream whose position is not the origin of an output of its size (a rotated output counts in either orientation) now takes the origin of the only output of that size; with several outputs of that size, or none, the position is kept. A position found by try_fill_positions names an output of its size, or no output has its size, so later calls keep it while the outputs and the measured size do not change. Refs #15731 * fix(wayland): reconcile portal positions with measured sizes only The first commit corrected any position that named no output of the stream size, trusting the size. That size is the portal size when get_res() fails, and it can be the mode of another output, so a correct portal position could move onto the wrong output. A stream now records whether its position came from the portal and whether its resolution was measured, and a portal position is overridden only by a measured size. Streams without a portal position go through try_fill_positions as before; one it leaves unresolved, such as a rotated output whose transposed size no mode matches, now takes the origin of the only output of its size. Refs #15731 * fix(wayland): only a measured size moves a stream position The reconciliation after try_fill_positions let a position through to corrected_origin unless the portal had sent it. A position that try_fill_positions restored from its cache is not from the portal, so when get_res() failed and the size was the portal size, a cached (1920, 0) with a 1440x900 portal size moved to the 1440x900 output at (0, 0), and with both outputs shared sort_streams dropped one of the streams. Only a measured size moves a position now, whatever its source, so position_from_portal goes away.