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.72k stars 900 forks source link

Opening certain applications moves the cursor to [0,0] causing the application to also move to that position on launch #7089

Closed zjeffer closed 2 months ago

zjeffer commented 3 months ago

Regression?

Yes

System Info and Version

System/Version info ```sh Hyprland, built from branch main at commit 04b40ea2ec85dd1d74ff18edc046a233b65024ac (CI: only run once for PRs with branches from original repo (7075)). Date: Sat Jul 27 21:17:05 2024 Tag: v0.41.2-114-g04b40ea2, commits: 5000 flags: (if any) System Information: System name: Linux Node name: zjeffer Release: 6.10.1-arch1-1 Version: #1 SMP PREEMPT_DYNAMIC Wed, 24 Jul 2024 22:25:43 +0000 GPU information: 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104M [GeForce RTX 3070 Mobile / Max-Q] [10de:24dd] (rev a1) (prog-if 00 [VGA controller]) NVRM version: NVIDIA UNIX x86_64 Kernel Module 555.58.02 Tue Jun 25 01:39:15 UTC 2024 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: split-monitor-workspaces by Duckonaut ver 1.1.0 ======Config-Start====== Config File: /home/zjeffer/.config/hypr/hyprland.conf: Read Succeeded # ################################################################### # ██╗ ██╗██╗ ██╗██████╗ ██████╗ ██╗ █████╗ ███╗ ██╗██████╗ # ██║ ██║╚██╗ ██╔╝██╔══██╗██╔══██╗██║ ██╔══██╗████╗ ██║██╔══██╗ # ███████║ ╚████╔╝ ██████╔╝██████╔╝██║ ███████║██╔██╗ ██║██║ ██║ # ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══██╗██║ ██╔══██║██║╚██╗██║██║ ██║ # ██║ ██║ ██║ ██║ ██║ ██║███████╗██║ ██║██║ ╚████║██████╔╝ # ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═════╝ # ################################################################### $HYPR_FOLDER = ~/.config/hypr $APP_FOLDER = $HYPR_FOLDER/apps $CONFIG_FOLDER = $HYPR_FOLDER/configs source = $CONFIG_FOLDER/env.conf source = $CONFIG_FOLDER/general.conf source = $CONFIG_FOLDER/animations.conf source = $CONFIG_FOLDER/decoration.conf source = $CONFIG_FOLDER/monitors.conf source = $CONFIG_FOLDER/window_rules.conf source = $CONFIG_FOLDER/keybinds.conf source = $CONFIG_FOLDER/input.conf source = $CONFIG_FOLDER/workspace_rules.conf source = $CONFIG_FOLDER/plugins.conf # Execute your favorite apps at launch exec-once = xhost + local: exec-once = /usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = hyprpaper --config $APP_FOLDER/hyprpaper.conf exec-once = nm-applet exec-once = dunst exec-once = ~/.config/activePlayer/mediaplayers.sh 2>~/.config/activePlayer/.mediaplayer.err exec-once = hyprpm reload -n -v 2>&1 >> ~/hyprpm.log exec-once = ydotoold exec-once = bash $APP_FOLDER/waybar/launch.sh exec-once = swayosd-server # this should always be at the bottom # exec-once = dbus-update-activation-environment --systemd --all Config File: /home/zjeffer/.config/hypr/configs/env.conf: Read Succeeded # Some default env vars. env = XCURSOR_SIZE,32 env = XCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_SIZE,32 env = LIBVA_DRIVER_NAME,nvidia env = XDG_SESSION_TYPE,wayland env = GBM_BACKEND,nvidia-drm env = __GLX_VENDOR_LIBRARY_NAME,nvidia env = SDL_VIDEODRIVER,wayland env = _JAVA_AWT_WM_NONREPARENTING,1 env = __GL_GSYNC_ALLOWED,0 env = __GL_VRR_ALLOWED,0 env = __GLX_VENDOR_LIBRARY_NAME,nvidia env = WLR_DRM_NO_ATOMIC,1 env = GBM_BACKEND,nvidia-drm env = XDG_CURRENT_DESKTOP,Hyprland env = QT_AUTO_SCREEN_SCALE_FACTOR,1 env = QT_QPA_PLATFORM,wayland env = QT_QPA_PLATFORMTHEME,qt6ct env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 env = DESKTOP_SESSION,gnome env = MOZ_ENABLE_WAYLAND,1 # gtk env = GDK_BACKEND,wayland # xdg stuff env = XDG_CONFIG_HOME,$HOME/.config env = XDG_CACHE_HOME,$HOME/.cache env = XDG_DATA_HOME,$HOME/.local/share env = XDG_DATA_DIRS,/usr/local/share:/usr/share env = XDG_CONFIG_DIRS,/etc/xdg # environment variables to use in configs env = EWW_CONFIG_DIR,$HOME/.config/eww env = APP_FOLDER,$HOME/.config/hypr/apps env = PLUGIN_FOLDER,$HOME/.local/share/hyprload/plugins/bin Config File: /home/zjeffer/.config/hypr/configs/general.conf: Read Succeeded general { # See https://wiki.hyprland.org/Configuring/Variables/ for more gaps_in = 5 gaps_out = 10 border_size = 4 col.active_border = rgba(5e81acff) col.inactive_border = rgba(00000000) layout = dwindle } 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 preserve_split = true # you probably want this } misc { vrr = 2 no_direct_scanout = false render_ahead_of_time = false focus_on_activate = true force_default_wallpaper = 0 initial_workspace_tracking = 0 } debug { overlay = false disable_logs = false disable_time = false error_limit = 1 error_position = 2 # bottom } opengl { nvidia_anti_flicker = true } Config File: /home/zjeffer/.config/hypr/configs/animations.conf: Read Succeeded animations { enabled = true # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more animation = windows, 1, 1, default animation = windowsOut, 1, 2, default animation = border, 1, 5, default animation = borderangle, 1, 8, default animation = fade, 1, 3, default animation = workspaces, 1, 4, default animation = specialWorkspace, 1, 4, default, slidevert } Config File: /home/zjeffer/.config/hypr/configs/decoration.conf: Read Succeeded decoration { # See https://wiki.hyprland.org/Configuring/Variables/ for more rounding = 5 blur { enabled = true size = 15 passes = 2 ignore_opacity = true new_optimizations = true } drop_shadow = true shadow_range = 4 shadow_render_power = 3 col.shadow = rgba(2e3440ee) col.shadow_inactive = rgba(00000000) } Config File: /home/zjeffer/.config/hypr/configs/monitors.conf: Read Succeeded # See https://wiki.hyprland.org/Configuring/Monitors/ monitor=desc:California Institute of Technology 0x1600, 2560x1600@165.018997, 1920x0, 1 monitor=desc:Acer Technologies K222HQL T0EEE0018512, 1920x1080, 4480x0, 1 monitor=desc:Philips Consumer Electronics Company PHL 240V5A UK01715035811, 1920x1080, 0x0, 1 monitor=desc:DENON Ltd. DENON-AVR 0x01010101, preferred, auto, 1, mirror, desc:California Institute of Technology 0x1600 # Denon # monitor=desc:DENON Ltd. DENON-AVR 0x01010101, preferred, auto, 1 # Denon monitor=,preferred,auto,1 Config File: /home/zjeffer/.config/hypr/configs/window_rules.conf: Read Succeeded windowrulev2 = float, title:^(Open Folder)$ windowrulev2 = float, title:^(Open File)$ windowrulev2 = float, title:^(Save As)$ windowrulev2 = float, title:^(Friends List)$ windowrulev2 = float, title:^(File Operation Progress)$ windowrulev2 = float, title:^(Firefox — Sharing Indicator)$ windowrulev2 = suppressevent fullscreen,float, title:^(Extension: (Bitwarden - Free Password Manager) - — Mozilla Firefox)$ windowrulev2 = suppressevent fullscreen,float, title:^(Extension: (Bitwarden - Free Password Manager) - Bitwarden — Mozilla Firefox)$ # windowrulev2 = suppressevent fullscreen,tile,class:^(libreoffice.*)$ windowrulev2 = float, class:^(flameshot)$ windowrulev2 = noanim, float, class:^(Rofi)$ windowrulev2 = float, class:^(org.gnome.Calculator)$ # opacity windowrulev2 = opacity 0.85, class:[gG]nome-terminal* windowrulev2 = opacity 0.85, class:kitty windowrulev2 = opacity 0.90, initialTitle:^(Spotify( Premium)?)$ windowrulev2 = opacity 0.90, class:Code windowrulev2 = opacity 0.90, class:Code - Insiders windowrulev2 = opacity 0.90, class:code-url-handler windowrulev2 = opacity 0.90, class:code-insiders-url-handler windowrulev2 = opacity 0.80, class:[Tt]hunar windowrulev2 = opacity 0.70, class:Dunst windowrulev2 = opacity 0.95, class:discord # flameshot workaround windowrulev2=move 0 0,title:^(flameshot) windowrulev2=suppressevent fullscreen,title:^(flameshot) # steam friends list workaround windowrulev2 = stayfocused, title:^()$,class:^(steam)$ windowrulev2 = minsize 200 500, initialTitle:^(Friends List)$,initialClass:^(steam)$ # jellyfin media player # windowrulev2 = tile, initialClass:^(Jellyfin Media Player)$ windowrulev2 = tile, initialTitle:^(Jellyfin Media Player)$ Config File: /home/zjeffer/.config/hypr/configs/keybinds.conf: Read Succeeded # See https://wiki.hyprland.org/Configuring/Keywords/ for more $mainMod = SUPER # window control bind = $mainMod, W, killactive, bind = $mainMod SHIFT, W, exec, kill -9 $(hyprctl activewindow -j | jq -r '.pid') bind = $mainMod CTRL SHIFT, Escape, exit, bind = $mainMod, S, togglefloating, bind = $mainMod, F, fullscreen bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, J, togglesplit, # dwindle # reload hyprland and send a inotify reload to waybar at .config/waybar/config.json bind = $mainMod, Escape, exec, hyprctl reload && hyprpm reload && sleep 0.5 && touch -m $APP_FOLDER/waybar/config.jsonc # applications bindr =$mainMod, space, exec, pkill rofi || ~/.config/rofi/bin/launcher_colorful bind = $mainMod, return, exec, kitty bind = $mainMod SHIFT, return, togglespecialworkspace bind = $mainMod, Z, exec, firefox bind = $mainMod SHIFT, Z, exec, chromium bind = $mainMod, X, exec, thunar bind = $mainMod, A, exec, /usr/bin/spotify bind = $mainMod, Q, exec, code bind = $mainMod, D, exec, discord bind = ,Print,exec, grimblast copy area bind = $mainMod, Print, exec, grimblast copy output bind = $mainMod SHIFT, C, exec, hyprpicker -a -f hex bind = CTRL SHIFT, Escape, exec, gnome-system-monitor # Move focus with mainMod + arrow keys bind = $mainMod, left, movefocus, l bind = $mainMod, right, movefocus, r bind = $mainMod, up, movefocus, u bind = $mainMod, down, movefocus, d # move window with arrow keys bind = $mainMod SHIFT, left, movewindow, l bind = $mainMod SHIFT, right, movewindow, r bind = $mainMod SHIFT, up, movewindow, u bind = $mainMod SHIFT, down, movewindow, d # Tabbed windows bind = $mainMod, g, togglegroup # Switch workspaces with mainMod + [0-5] bind = $mainMod, 1, split-workspace, 1 bind = $mainMod, 2, split-workspace, 2 bind = $mainMod, 3, split-workspace, 3 bind = $mainMod, 4, split-workspace, 4 bind = $mainMod, 5, split-workspace, 5 # Move active window to a workspace with mainMod + SHIFT + [0-5] bind = $mainMod SHIFT, 1, split-movetoworkspacesilent, 1 bind = $mainMod SHIFT, 2, split-movetoworkspacesilent, 2 bind = $mainMod SHIFT, 3, split-movetoworkspacesilent, 3 bind = $mainMod SHIFT, 4, split-movetoworkspacesilent, 4 bind = $mainMod SHIFT, 5, split-movetoworkspacesilent, 5 # Scroll through existing workspaces with mainMod + scroll bind = $mainMod, mouse_down, workspace, r+1 bind = $mainMod, mouse_up, workspace, r-1 # focus with left/right bracket bind = $mainMod, bracketleft, workspace, r-1 bind = $mainMod, bracketright, workspace, r+1 # move with shift + left/right bracket bind = $mainMod SHIFT, bracketleft, movetoworkspace, r-1 bind = $mainMod SHIFT, bracketright, movetoworkspace, r+1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow # media keys bindle = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ bindle = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bind =, XF86AudioMute, exec, wpctl set-mute @DEFAULT_SINK@ toggle bind =, XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle bind =, XF86AudioPlay, exec, ~/.config/activePlayer/control.sh play-pause bind =, XF86AudioPrev, exec, ~/.config/activePlayer/control.sh previous bind =, XF86AudioNext, exec, ~/.config/activePlayer/control.sh next bind =, XF86AudioStop, exec, ~/.config/activePlayer/control.sh stop bind = SHIFT, XF86AudioPrev, exec, ~/.config/activePlayer/control.sh skipBackward bind = SHIFT, XF86AudioNext, exec, ~/.config/activePlayer/control.sh skipForward # brightness binde = , XF86MonBrightnessUp, exec, brightnessctl -d nvidia* set +10% binde = , XF86MonBrightnessDown, exec, brightnessctl -d nvidia* set 10%- # screen lock bindl= , switch:on:Lid Switch, exec, $APP_FOLDER/swaylock/lock.sh && sleep 2 && systemctl suspend-then-hibernate bind = $mainMod, L, exec, hyprlock # forward and back with mouse buttons bind = $mainMod, 123, exec, ydotool key 159:1 159:0 bind = $mainMod, 122, exec, ydotool key 158:1 158:0 # forward global shortcuts bind = $mainMod SHIFT, N, pass, ^(io\.github\.nuttyartist\.notes)$ # passthrough mainMod to virtual machine bind = $mainMod, O, submap, passthru submap = passthru bind = $mainMod, I, submap, reset submap = reset # # ### swayosd ### bind = , XF86AudioRaiseVolume, exec, swayosd-client --output-volume bind = , XF86AudioLowerVolume, exec, swayosd-client --output-volume # # Sink volume toggle mute # bind = , XF86AudioMute, exec, swayosd-client --output-volume mute-toggle # # Source volume toggle mute # bind = , XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle # # Brightness raise # bind = , XF86MonBrightnessUp, exec, swayosd-client --brightness raise # # Brightness lower # bind = , XF86MonBrightnessDown, exec, swayosd-client --brightness lower Config File: /home/zjeffer/.config/hypr/configs/input.conf: Read Succeeded # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ input { kb_layout = us kb_variant = kb_model = kb_options = kb_rules = follow_mouse = 1 touchpad { clickfinger_behavior = true scroll_factor = 0.25 middle_button_emulation = true tap-and-drag = true } sensitivity = -0.5 # -1.0 - 1.0, 0 means no modification. numlock_by_default = 1 repeat_rate = 50 repeat_delay = 200 accel_profile = flat } cursor { no_hardware_cursors = true } # Per-device config # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more device { name = msft0001:00-04f3:31ad-touchpad sensitivity = 0.4 accel_profile = flat natural_scroll = true } gestures { # See https://wiki.hyprland.org/Configuring/Variables/ for more workspace_swipe = true } misc { } Config File: /home/zjeffer/.config/hypr/configs/workspace_rules.conf: Read Succeeded # generated by split-monitor-workspaces plugin source = /tmp/hyprland-workspace-rules workspace = special:special, on-created-empty:kitty, gapsout:96 Config File: /tmp/hyprland-workspace-rules: Read Succeeded workspace = 6,monitor:DP-2,persistent:true workspace = 7,monitor:DP-2,persistent:true workspace = 8,monitor:DP-2,persistent:true workspace = 9,monitor:DP-2,persistent:true workspace = 10,monitor:DP-2,persistent:true workspace = 11,monitor:HDMI-A-1,persistent:true workspace = 12,monitor:HDMI-A-1,persistent:true workspace = 13,monitor:HDMI-A-1,persistent:true workspace = 14,monitor:HDMI-A-1,persistent:true workspace = 15,monitor:HDMI-A-1,persistent:true workspace = 16,monitor:eDP-1,persistent:true workspace = 17,monitor:eDP-1,persistent:true workspace = 18,monitor:eDP-1,persistent:true workspace = 19,monitor:eDP-1,persistent:true workspace = 20,monitor:eDP-1,persistent:true Config File: /home/zjeffer/.config/hypr/configs/plugins.conf: Read Succeeded plugin { split-monitor-workspaces { count = 5 keep_focused = 1 enable_notifications = 0 } } ======Config-End======== ```

Description

There's a bug (since aquamarine) where some windows will always open on the left-most monitor, and teleport the cursor to the top-left position ([0,0] I'm guessing). This happens to some XWayland windows like Spotify and Discord, but it also happens to vscode (every time) and firefox (only when another firefox window is already open; first launch of firefox doesn't reproduce the bug).

https://github.com/user-attachments/assets/bfc0782b-518a-424b-8f69-9237d34827a8

In this video I open firefox twice with a keybind. The first time it opens fine. The second time, the cursor jumps to the top left of the monitor. The third time, the same thing happens and the window spawns at the bottom left instead of where I put my mouse. If I open Firefox on a different monitor, the second window and the cursor will both jump to the left-most monitor and the top-left corner.

I notice when running Hyprland through the debugger and having a firefox window already open in the main hyprland session, if I launch Firefox in the debug session then Firefox opens in the main session on the left monitor. If Firefox is not already running in the main session, it will open fine inside the debug session.

How to reproduce

  1. Launch one of the applications described above (on any monitor)
  2. Regardless of the monitor currently focused, the window will open on the left-most monitor. The cursor will move to the top-left position (0,0) of the monitor.

Crash reports, logs, images, videos

Minimal log with just opening Firefox twice: hyprland.log

bisect: 016da234d0e852de3ef20eb2e89ac58d2a85f6e7 is first bad commit Interestingly, with that commit the issue starts happening with Spotify, but not with Firefox. 99088eaed806d9268967baf09bc09cdb987c5357 is the commit that makes it happen for Firefox too.

gervasetuxworth commented 3 months ago

This started happening for me too today. Exact same symptoms as you described with the same apps effected in the same way.

Also, for me, it is the middle of a 3-monitor setup that the apps are spawning on (monitor 2, workspace 2, 0,0 in layout).

jacekpoz commented 3 months ago

I have this too, 2 monitors

firefox opens on the left monitor, puts the cursor in the monitor's top left corner rnote opens on the correct monitor but still moves the cursor to the top left corner of the left one everything else behaves like usual

zjeffer commented 3 months ago
Application Behaviour
Firefox ❌ Bug occurs only when at least one firefox window is already open
Visual Studio Code ❌ Bug occurs
Kitty ✅ works fine
Jellyfin Media Player (XWayland) ✅ works fine
Thunar ✅ works fine
Spotify ❌ Bug occurs
Discord ❌ Bug occurs
gnome-calculator ❌ Bug occurs
obs ✅ works fine
Qt creator ✅ works fine
GIMP ❌ Bug occurs
Blender ✅ works fine
Boabab (Gnome's disk usage analyzer) ❌ Bug occurs
Element ❌ Bug occurs

Hopefully this helps a bit with debugging what kind of applications trigger the issue. Seems like gnome apps and electron apps are most affected?

vaxerski commented 3 months ago

has to be some config option, I can't repro

zjeffer commented 3 months ago

Possibly initial_workspace_tracking? I set it to 0, I'll test again with 1 (the default) soon.

zjeffer commented 3 months ago

The problem is with focus_on_activate. When set to true, the bug occurs.

vaxerski commented 3 months ago

thanks

zakk4223 commented 3 months ago

My notes on this from another issue:

https://github.com/hyprwm/Hyprland/issues/6495#issuecomment-2187274529

gulafaran commented 3 months ago

is this now fixed with #7286 ? since focus_on_activate relied on cursor warping and we moved the hook to monitorAdded and the calculations for the monitors is now correct?

zjeffer commented 3 months ago

I'm currently on c5feee1e357f3c3c59ebe406630601c627807963, it's not fixed with focus_on_activate=true.

gulafaran commented 3 months ago

Okey thanks

zakk4223 commented 3 months ago

It's some weirdness with ordering of X11 events and surface creation. It started happening with the replacement xwayland implementation in hyprland. I never did figure out what it really was; the code in hyprland and wlroots looks pretty much identical, but for some reason the surface creation happens fast enough in wlroots that you never get a _NET_ACTIVATE_WINDOW before then.

vaxerski commented 2 months ago

check now, I am jojo

zjeffer commented 2 months ago

Fixed, thanks!