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
20.98k stars 880 forks source link

Weird cursor behaviour when moving cursor between desktop and windows #7077

Closed zjeffer closed 2 months ago

zjeffer commented 2 months ago

Regression?

No

System Info and Version

System/Version info ```sh Hyprland, built from branch main at commit 33a5c8ce325e1657ec5571b57e05c6378706f4cd (config: avoid using initial ws tracking for exec-once). Date: Thu Jul 25 15:29:39 2024 Tag: v0.41.2-98-g33a5c8ce, commits: 4984 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 = hyprctl setcursor capitaine-cursors-light 24 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,28 env = XCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_THEME,Nordzy-cursors-white env = HYPRCURSOR_SIZE,64 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

This started happening after I set a custom hyprcursor theme (about a week ago):

env = XCURSOR_SIZE,28
env = XCURSOR_THEME,Nordzy-cursors-white
env = HYPRCURSOR_THEME,Nordzy-cursors-white
env = HYPRCURSOR_SIZE,64

I also followed the Arch wiki to set a custom cursor theme: https://wiki.archlinux.org/title/Cursor_themes#Configuration

This video shows the problem:

https://github.com/user-attachments/assets/f2b94076-4157-45b5-b3b0-dddc7c717f87

How to reproduce

  1. Set a hyprcursor theme
  2. Move the cursor between a window and the desktop
  3. The cursor should change to the default cursor, instead it changes to a different cursor depending on which window was last focused, and what the action was: e.g. resizing firefox and then moving to the desktop will show the resize cursor.

Crash reports, logs, images, videos

In the logs I only see this when I move the cursor between a window and the desktop:

[LOG] [seatmgr] Rejecting a setCursor because the client ain't in focus
zjeffer commented 2 months ago

Hmm, looks like the same behaviour is present when not using hyprcursor. I think it started happening since the aquamarine merge (because around then I also started using hyprcursor). I looked around the existing issues and see some similar ones (like the mouse cursor not being visible, or being very tiny), but I'm not sure it's the same issue.

Kam1k4dze commented 2 months ago

Having the same cursor issues today with fresh default Hyprland-git. System: Arch with Nvidia-555.58.02-9

nktnet1 commented 2 months ago

Related to #6983.

I had the same issue (cursor retaining shape when moving off window), in addition to having a small cursor on wallpaper/kitty terminal.

Documented the workaround for it here:

which fixes both tiny cursor and wrong cursor shape.

The gist is to use a cursor theme that has both xcursor and hyprcursor variants, e.g. rose-pine. You should also ensure that your cursor theme follow the specifications - I tried converting Adwaita theme using hyprcursor-util, but some icons, e.g. top-left resize was missing or lead to cursor mismatch. Potentially related to this issue here:

zjeffer commented 2 months ago

I don't know if it's necessarily related to hyprcursor, though: the issue also happens when not setting a hyprcursor theme.

Either way, I'l try that rose-pine cursor theme and see what happens.

nktnet1 commented 2 months ago

Yeah - have been trying to figure this out myself (was a regression from wlroots-hyprland -> aquamarine). What I posted is only a workaround.

Another potential cause could be the comment by terminal-enlightenment:

The integer you used may be your problem - the sizes available vary by cursor theme. Standard sizes are 24, 32, 48, 64.

Try those first and if you're still having trouble there are a few other things you can try.

regarding the use of nwg-look to set Xcursor size.

zjeffer commented 2 months ago

After installing and activating rose-pine-cursor and rose-pine-hyprcursor, and restarting Hyprland, I notice that no matter what I set my xcursor & hyprcursor theme to, my resize cursor always stays the same theme (and the bug persists).

It seems to use my capitaine-cursors-white theme when I hover over my desktop, and when I resize:

https://github.com/user-attachments/assets/99699aa8-e692-43e9-a377-fb0b2178bf88

I set my cursor to rose-pine using:

And still my capitaine-cursors theme is being used when hovering over the desktop :thinking:

zjeffer commented 2 months ago

Found something: when I set the cursor with hyprctl setcursor rose-pine-hyprcursor 24, it works! It changes my cursor everywhere and the bug disappears.

So why doesn't HYPRCURSOR_THEME work? (tried it in my config with size 24 as well, no difference)

nktnet1 commented 2 months ago

Do you have something similar to this in your ~/.config/hypr/hyprland.conf:

env = HYPRCURSOR_THEME,rose-pine-hyprcursor
env = XCURSOR_SIZE,28
env = HYPRCURSOR_SIZE,28
env = QT_CURSOR_SIZE,28

Also, on a fresh start (without the hyprctl setcursor command), when you view the logs with the command:

grep 'cursor' "$XDG_RUNTIME_DIR/hypr/$(ls -t $XDG_RUNTIME_DIR/hypr | head -n 1)/hyprland.log" | head

Do you see rose-pine being loaded?

For example, it should look similar to this:

[14:09:04.548621332] [hc] CHyprcursorManager: attempting to find theme from env
[14:09:04.548795888] [hc] getFullPathForThemeName: found /usr/share/icons/rose-pine-hyprcursor
[14:09:04.548806885] [hc] Found theme rose-pine-hyprcursor at /usr/share/icons/rose-pine-hyprcursor
zjeffer commented 2 months ago

I'm stupid

My hyprland config contains this line: exec-once = hyprctl setcursor capitaine-cursors-light 24, as well as the HYPRCURSOR_THEME=rose-pine-hyprcursor env var...

Thanks for the help!