hyprwm / Hyprland

Hyprland is an independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks.
https://hyprland.org
BSD 3-Clause "New" or "Revised" License
21.94k stars 914 forks source link

Resized qt popups have an incorrect input region #6682

Open outfoxxed opened 5 months ago

outfoxxed commented 5 months ago

Regression?

Yes

System Info and Version

System/Version info ```sh > hyprctl systeminfo Hyprland, built from branch at commit e4d09aa3a9de9a9e71c10bf4b6800585b3db9a4c (). Date: 2024-06-25 Tag: , commits: e4d09aa3a9de9a9e71c10bf4b6800585b3db9a4c flags: (if any) System Information: System name: Linux Node name: msi Release: 6.6.35 Version: #1-NixOS SMP PREEMPT_DYNAMIC Fri Jun 21 12:38:50 UTC 2024 GPU information: 07:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] [1002:1638] (rev c5) (prog-if 00 [VGA controller]) os-release: ANSI_COLOR="1;34" BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues" BUILD_ID="24.11.20240624.2893f56" DOCUMENTATION_URL="https://nixos.org/learn.html" HOME_URL="https://nixos.org/" ID=nixos IMAGE_ID="" IMAGE_VERSION="" LOGO="nix-snowflake" NAME=NixOS PRETTY_NAME="NixOS 24.11 (Vicuna)" SUPPORT_URL="https://nixos.org/community.html" VERSION="24.11 (Vicuna)" VERSION_CODENAME=vicuna VERSION_ID="24.11" plugins: hy3 by outfoxxed ver 0.1 ```

Description

When a qt popup is resized, it uses xdg_surface::set_window_geometry to change the size of the surface (or maybe just attaching a new resized dmabuf? not sure). While the surface resizes visually the input region breaks and becomes centered in the popup.

In fc72df8e58bc127442a245f2f29a3246acf77cce this broke, though it has some additional annoyances that were fixed so I'd probably debug it against a more recent version.

How to reproduce

Use the following quickshell tester (guaranteed to work with https://git.outfoxxed.me/outfoxxed/quickshell/commit/d7149d564117e3cbb8075ecdc39b073b8f11d32e). quickshell -p tester.qml.

tester.qml ```qml import Quickshell import QtQuick import QtQuick.Controls ShellRoot { FloatingWindow { id: fw Button { anchors.centerIn: parent text: "show popup" onClicked: popup.visible = !popup.visible } PopupWindow { id: popup parentWindow: fw relativeX: parentWindow.width / 2 relativeY: parentWindow.height width: 200 height: 200 Rectangle { anchors.fill: parent color: ma.containsMouse ? "red" : "white" MouseArea { id: ma anchors.fill: parent hoverEnabled: true Button { text: "bigger" onClicked: { popup.width += 100 popup.height += 100 } } } } } } } ```

Crash reports, logs, images, videos

https://github.com/hyprwm/Hyprland/assets/83010835/311b05e0-f65f-4f1c-bbba-7a5665cddbf1

Relevant WAYLAND_DEBUG snippet ``` [3026936.247] wl_pointer@24.button(102233, 33579265, 272, 0) [3026936.289] wl_pointer@24.frame() [3026936.509] -> wp_viewport@52.set_destination(300, 200) [3026936.532] -> xdg_surface@49.set_window_geometry(0, 0, 300, 200) [3026936.568] -> wp_viewport@52.set_destination(300, 300) [3026936.579] -> xdg_surface@49.set_window_geometry(0, 0, 300, 300) [3026936.919] -> wl_surface@43.frame(new id wl_callback@54) [3026937.068] wl_buffer@58.release() [3026937.088] -> wl_buffer@58.destroy() [3026937.098] wl_callback@57.done(102232) [3026937.727] -> zwp_linux_dmabuf_v1@32.create_params(new id zwp_linux_buffer_params_v1@57) [3026937.762] -> zwp_linux_buffer_params_v1@57.add(fd 26, 0, 0, 1536, 33554432, 412531459) [3026937.771] -> zwp_linux_buffer_params_v1@57.add(fd 27, 1, 589824, 512, 33554432, 412531459) [3026937.776] -> zwp_linux_buffer_params_v1@57.create_immed(new id wl_buffer@56, 300, 300, 875713089, 0) [3026937.780] -> zwp_linux_buffer_params_v1@57.destroy() [3026937.784] -> wl_surface@43.attach(wl_buffer@56, 0, 0) [3026937.787] -> wl_surface@43.damage(0, 0, 2147483647, 2147483647) [3026937.791] -> wl_surface@43.commit() [3026937.794] -> wl_display@1.sync(new id wl_callback@61) [3026938.160] wl_display@1.delete_id(58) [3026938.166] wl_display@1.delete_id(57) [3026938.169] wl_display@1.delete_id(61) [3026948.647] wl_display@1.delete_id(54) [3026948.654] wl_callback@54.done(33579277) [3026948.683] -> wl_surface@43.frame(new id wl_callback@54) [3026948.711] wl_buffer@55.release() [3026948.716] -> wl_buffer@55.destroy() [3026948.721] wl_callback@61.done(102233) [3026948.725] -> zwp_linux_dmabuf_v1@32.create_params(new id zwp_linux_buffer_params_v1@61) [3026948.745] -> zwp_linux_buffer_params_v1@61.add(fd 26, 0, 0, 1536, 33554432, 412531459) [3026948.753] -> zwp_linux_buffer_params_v1@61.add(fd 27, 1, 589824, 512, 33554432, 412531459) [3026948.758] -> zwp_linux_buffer_params_v1@61.create_immed(new id wl_buffer@57, 300, 300, 875713089, 0) [3026948.761] -> zwp_linux_buffer_params_v1@61.destroy() [3026948.765] -> wl_surface@43.attach(wl_buffer@57, 0, 0) [3026948.769] -> wl_surface@43.damage(0, 0, 2147483647, 2147483647) [3026948.774] -> wl_surface@43.commit() [3026948.778] -> wl_display@1.sync(new id wl_callback@58) [3026948.988] wl_display@1.delete_id(55) [3026949.000] wl_display@1.delete_id(61) ```
outfoxxed commented 3 months ago

no, this type of resize doesn't go through xdg positioner