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
18.31k stars 761 forks source link

Last focused XWayland window believes it still has focus when focus is moved to a Wayland surface #6468

Open Ghosthree3 opened 1 month ago

Ghosthree3 commented 1 month ago

Bug or Regression?

Bug

System Info and Version

System/Version info ```sh Hyprland, built from branch main at commit a9d7befc36f2890f080d02b8c04b678778ded080 (formats: fixup for legacy_renderer builds). Date: Thu Jun 13 07:29:24 2024 Tag: v0.41.0-21-ga9d7befc, commits: 4815 flags: (if any) System Information: System name: Linux Node name: milkbar Release: 6.9.3-arch1-1 Version: #1 SMP PREEMPT_DYNAMIC Fri, 31 May 2024 15:14:45 +0000 GPU information: 0b:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] [1002:731f] (rev c1) (prog-if 00 [VGA controller]) 0c:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU104 [GeForce RTX 2070 SUPER] [10de:1e84] (rev a1) (prog-if 00 [VGA controller]) os-release: NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="38;2;23;147;209" HOME_URL="https://archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://gitlab.archlinux.org/groups/archlinux/-/issues" PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/" LOGO=archlinux-logo plugins: ======Config-Start====== Config File: /home/ghost/.config/hypr/hyprland.conf: Read Succeeded # Hyprland config file # Environmental variables env = XDG_SESSION_TYPE,wayland env = XDG_SESSION_DESKTOP,Hyprland env = XDG_CURRENT_DESKTOP,Hyprland env = GDK_BACKEND,wayland,x11 env = QT_QPA_PLATFORM,wayland;xcb env = QT_AUTO_SCREEN_SCALE_FACTOR,1 env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 env = QT_QPA_PLATFORMTHEME,qt6ct #env = SDL_VIDEODRIVER,x11 env = CLUTTER_BACKEND,wayland env = MOZ_ENABLE_WAYLAND,1 env = ECORE_EVAS_ENGINE,wayland_egl env = ELM_ENGINE,wayland_egl env = _JAVA_AWT_WM_NONREPARENTING,1 env = NO_AT_BRIDGE,1 env = XCURSOR_SIZE,24 exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP #monitor = DP-1, 1920x1080@144, 1440x0 , 1 #monitor = DP-2, 1440x900@60 , 0x340 , 1 monitor = DP-1, 1920x1080@144, 1920x0 , 1 monitor = DP-2, 1920x1080@60 , 0x100 , 1 monitor = DP-3, 1440x900@60 , 3840x320, 1 # Source a file (multi-file configs) # source = ~/.config/hypr/myColors.conf # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ input { kb_layout = us kb_variant = kb_model = kb_options = kb_rules = numlock_by_default = true follow_mouse = 1 touchpad { natural_scroll = false } sensitivity = -0.75 # -1.0 - 1.0, 0 means no modification. } general { # See https://wiki.hyprland.org/Configuring/Variables/ for more border_size = 0 gaps_in = 0 gaps_out = 0 col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg col.inactive_border = rgba(595959aa) layout = dwindle } decoration { # See https://wiki.hyprland.org/Configuring/Variables/ for more rounding = 0 blur { enabled = false #size = 3 #passes = 1 } drop_shadow = false #shadow_range = 4 #shadow_render_power = 3 #col.shadow = rgba(1a1a1aee) } animations { enabled = false # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = myBezier, 0.05, 0.9, 0.1, 1.05 animation = windows, 1, 7, myBezier animation = windowsOut, 1, 7, default, popin 80% animation = border, 1, 10, default animation = borderangle, 1, 8, default animation = fade, 1, 7, default animation = workspaces, 1, 6, default } dwindle { # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below preserve_split = true # you probably want this } master { # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more new_is_master = true } gestures { # See https://wiki.hyprland.org/Configuring/Variables/ for more workspace_swipe = false } misc { force_default_wallpaper = 0 } binds { movefocus_cycles_fullscreen = false } # Example per-device config # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more #device:epic-mouse-v1 { # sensitivity = -0.5 #} # Example windowrule v1 # windowrule = float, ^(kitty)$ # Example windowrule v2 # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more windowrulev2 = noborder,onworkspace:1 windowrulev2 = opacity 0.0 override,class:^(xwaylandvideobridge)$ windowrulev2 = noanim,class:^(xwaylandvideobridge)$ windowrulev2 = noinitialfocus,class:^(xwaylandvideobridge)$ windowrulev2 = maxsize 1 1,class:^(xwaylandvideobridge)$ windowrulev2 = noblur,class:^(xwaylandvideobridge)$ # See https://wiki.hyprland.org/Configuring/Keywords/ for more $mainMod = SUPER # Workspace Bindings bind = $mainMod, 1, workspace, 1 bind = $mainMod, 2, workspace, 2 bind = $mainMod, 3, workspace, 3 bind = $mainMod, 4, workspace, 4 bind = $mainMod, 5, workspace, 5 bind = $mainMod, 6, workspace, 6 bind = $mainMod, 7, workspace, 7 bind = $mainMod, 8, workspace, 8 bind = $mainMod, 9, workspace, 9 bind = $mainMod, 0, workspace, 10 bind = $mainMod, KP_End, workspace, 11 bind = $mainMod, KP_Down, workspace, 12 bind = $mainMod, KP_Next, workspace, 13 bind = $mainMod, KP_Left, workspace, 14 bind = $mainMod, KP_Begin, workspace, 15 bind = $mainMod, KP_Right, workspace, 16 bind = $mainMod, KP_Home, workspace, 17 bind = $mainMod, KP_Up, workspace, 18 bind = $mainMod, KP_Prior, workspace, 19 bind = $mainMod, KP_Insert, workspace, 20 bind = $mainMod SHIFT ALT, left, movecurrentworkspacetomonitor, l bind = $mainMod SHIFT ALT, right, movecurrentworkspacetomonitor, r bind = $mainMod SHIFT ALT, up, movecurrentworkspacetomonitor, u bind = $mainMod SHIFT ALT, down, movecurrentworkspacetomonitor, d bind = $mainMod, mouse_down, workspace, e-1 bind = $mainMod, mouse_up, workspace, e+1 # Window Bindings bind = $mainMod SHIFT, 1, movetoworkspace, 1 bind = $mainMod SHIFT, 2, movetoworkspace, 2 bind = $mainMod SHIFT, 3, movetoworkspace, 3 bind = $mainMod SHIFT, 4, movetoworkspace, 4 bind = $mainMod SHIFT, 5, movetoworkspace, 5 bind = $mainMod SHIFT, 6, movetoworkspace, 6 bind = $mainMod SHIFT, 7, movetoworkspace, 7 bind = $mainMod SHIFT, 8, movetoworkspace, 8 bind = $mainMod SHIFT, 9, movetoworkspace, 9 bind = $mainMod SHIFT, 0, movetoworkspace, 10 bind = $mainMod SHIFT, KP_End, movetoworkspace, 11 bind = $mainMod SHIFT, KP_Down, movetoworkspace, 12 bind = $mainMod SHIFT, KP_Next, movetoworkspace, 13 bind = $mainMod SHIFT, KP_Left, movetoworkspace, 14 bind = $mainMod SHIFT, KP_Begin, movetoworkspace, 15 bind = $mainMod SHIFT, KP_Right, movetoworkspace, 16 bind = $mainMod SHIFT, KP_Home, movetoworkspace, 17 bind = $mainMod SHIFT, KP_Up, movetoworkspace, 18 bind = $mainMod SHIFT, KP_Prior, movetoworkspace, 19 bind = $mainMod SHIFT, KP_Insert, movetoworkspace, 20 bind = $mainMod, left, movefocus, l bind = $mainMod, right, movefocus, r bind = $mainMod, up, movefocus, u bind = $mainMod, down, movefocus, d bind = $mainMod SHIFT, left, movewindow, l bind = $mainMod SHIFT, right, movewindow, r bind = $mainMod SHIFT, up, movewindow, u bind = $mainMod SHIFT, down, movewindow, d bind = $mainMod, R, submap, resize submap = resize binde = SHIFT, left, resizeactive, -10 0 binde = SHIFT, right, resizeactive, 10 0 binde = SHIFT, up, resizeactive, 0 -10 binde = SHIFT, down, resizeactive, 0 10 binde = , left, resizeactive, -5 0 binde = , right, resizeactive, 5 0 binde = , up, resizeactive, 0 -5 binde = , down, resizeactive, 0 5 binde = ALT, left, resizeactive, -1 0 binde = ALT, right, resizeactive, 1 0 binde = ALT, up, resizeactive, 0 -1 binde = ALT, down, resizeactive, 0 1 bind = , escape, submap, reset submap = reset bind = $mainMod SHIFT, Q, killactive bind = $mainMod, F, fullscreen bind = $mainMod, E, togglesplit # dwindle bind = $mainMod, P, pseudo # dwindle bind = $mainMod SHIFT, SPACE, togglefloating bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow # Media Bindings binde = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% #increase sound volume binde = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% #decrease sound volume bind = , XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle # mute sound bind = , XF86AudioPlay, exec, playerctl play bind = , XF86AudioPause, exec, playerctl pause bind = , XF86AudioNext, exec, playerctl next bind = , XF86AudioPrev, exec, playerctl previous # Program Bindings bind = $mainMod, Return, exec, kitty #bind = $mainMod, D, exec, kickoff bind = $mainMod, D, exec, tofi-run | xargs hyprctl dispatch exec bind = $mainMod SHIFT, M, exit bind = , PRINT, exec, hyprshot -m region -o /tmp -f $(date +%s%3N).png bind = ALT, PRINT, exec, hyprshot -m window -o /tmp -f $(date +%s%3N).png bind = $mainMod, PRINT, exec, hyprshot -m output -o /tmp -f $(date +%s%3N).png # Global Hotkeys #bindn = , Control_L, pass, ^(discord)$ bindn = , F10, pass, ^(com\.obsproject\.Studio)$ # Startup Programs exec-once = /usr/lib/polkit-kde-authentication-agent-1 exec-once = xwaylandvideobridge exec-once = mako exec-once = waybar exec-once = easyeffects --gapplication-service exec-once = sleep 3 && keepassxc exec-once = [workspace 1 silent] librewolf exec-once = [workspace 9 silent] brave exec-once = [workspace 7 silent] discord exec-once = [workspace 3 silent] kitty exec-once = [workspace 8 silent] kitty exec-once = pactl set-sink-volume @DEFAULT_SINK@ 85% exec-once = pactl set-sink-volume easyeffects_sink 100% exec-once = pactl set-source-volume @DEFAULT_SOURCE@ 85% exec-once = pactl set-source-volume easyeffects_source 100% exec-once = send-ctrl-to-xwayland /dev/input/by-id/usb-04d9_USB_Keyboard-event-kbd # Hacks #windowrulev2 = nomaximizerequest,class:(mpv) ======Config-End======== ```

Description

The last XWayland window to be focused when moving focus to a Wayland window behaves as if it is still focused until a new, different, XWayland window gains focus. See video demo.

https://github.com/hyprwm/Hyprland/assets/6110140/caf136a8-3709-42ee-b5ee-b6dd1509a8e7

Here I have three windows open, Runelite (XWayland) on the left, and two Kitty terminals (Wayland top right, XWayland bottom right).

When I move focus from the XWayland terminal to the Wayland terminal you can see that the cursor block remains filled, as if the window still has focus. By contrast, whenever I move focus off of the Wayland terminal the cursor always becomes unfilled as it no longer has focus.

When I hover the buttons along the right side edge of the Runelite window they become 'highlighted'. If I then move focus to the Wayland Kitty window, the last hovered button will continue to act as if it is being hovered.

Whenever I move focus into whichever XWayland window does not currently have focus the previously focused XWayland window correctly becomes unfocused, the cursor becomes unfilled, the buttons become unhighlighted.

This is probably a regression from the XWayland rewrite, but I am unable to check because I seem to be unable to build older commits now (checking out 4cdddcf on a fresh recursive clone and running make all results in an error, even this commit built fine only a few days ago).

How to reproduce

Open three terminals, one Wayland two XWayland, with cursors that indicate whether the window is focused or not and cycle focus between them in different orders while observing their cursors.

Crash reports, logs, images, videos

No response

Nama commented 1 month ago

Can confirm this happens since v0.41.0. Tested with discord and signal-desktop.

vaxerski commented 1 month ago

patch.txt try this

Ghosthree3 commented 1 month ago

Seems to partially work. The XWayland Kitty window now behaves correctly, unfilling its cursor no matter which window I move focus to. But the Runelite window still maintains a hovered/highlighted state on its side buttons when moving focus into the Wayland Kitty window, and immediately unhighlights them the moment I move focus to the XWayland Kitty window.

vaxerski commented 1 month ago

can you post the xprop of the runelite window when it should be unfocused?

How to: run xprop -root note the IDs in _NET_CLIENT_LIST, one of them is your game run xprop -id <id> until you find your game window (note stuff like WM_CLASS or WM_NAME, they will help you identify the window) post the xprop of runelite when it should be unfocused.

Ghosthree3 commented 1 month ago

Here is the xprop of the Runelite window when it should be unfocused, unfocused.txt

What's interesting is that I actually checked the xprop both when moving focus from Runelite to a Wayland window, where unfocus fails, and then to an XWayland window, where the Runelite window then correctly unfocuses, the xprop is identical for both. In case it matters, when focused, the only difference in the xprop is that instead of being unset, _NET_WM_STATE(ATOM) is set to _NET_WM_STATE_FOCUSED.

Trimutex commented 1 month ago

Not sure how much this helps to debug it, but adding a border size of at least 1 to the window fixes the issue on my end.

Ghosthree3 commented 1 month ago

Not sure how much this helps to debug it, but adding a border size of at least 1 to the window fixes the issue on my end.

I tested this and I believe it to actually not be the case. I think what is actually happening is that if your mouse enters the border of the Runelite window, you are no longer hovering the side buttons, but the window itself is still selected, so it updates. You can see it still happens if you hover a button then move focus to a Wayland window with the keyboard, or move the mouse across the border (1px) quick enough for it not to register you were there. Also, I can't force resize updates (see #6469) when doing so, whether my mouse registers touching the border or not.

vaxerski commented 1 month ago

patch.txt try this

Ghosthree3 commented 1 month ago

No luck unfortunately, same behavior as last patch.

vaxerski commented 1 month ago

does it still have the FOCUSED atom?

Ghosthree3 commented 1 month ago

Under what case? The value of _NET_WM_STATE(ATOM) is the same in all cases as it was with the previous patch. Focused: _NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED Focus moved from Runelite to a Wayland Kitty terminal: _NET_WM_STATE(ATOM) = Focus moved from Runelite to an XWayland Kitty terminal: _NET_WM_STATE(ATOM) =

The value is the same (unset) in the case I move either to a Wayland or XWayland window, but it only acts as if it has lost focus when I focus another XWayland window still (again, the original patch does fix just XWayland Kitty having this problem, and likely many other XWayland windows also).

vaxerski commented 1 month ago

I'll commit the patch then, dunno why your game still believes it has focus then