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
19.95k stars 849 forks source link

Scrolling with the virtual cursor is choppy #7974

Open matejdro opened 5 hours ago

matejdro commented 5 hours ago

Already reported ? *

Regression?

No

System Info and Version

System/Version info ```sh Hyprland, built from branch at commit 0f594732b063a90d44df8c5d402d658f27471dfe (props: bump version to 0.43.0). Date: Sun Sep 8 16:48:21 2024 Tag: v0.43.0, commits: 5196 flags: (if any) System Information: System name: Linux Node name: KOMP Release: 6.10.10-arch1-1 Version: #1 SMP PREEMPT_DYNAMIC Thu, 12 Sep 2024 17:21:02 +0000 GPU information: 28:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 [Radeon RX 6950 XT] [1002:73a5] (rev c0) (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: hypreasymotion by Zakk ver 1.0 ======Config-Start====== Config File: /home/matej/.config/hypr/hyprland.conf: Read Succeeded # This is an example Hyprland config file. # Refer to the wiki for more information. # https://wiki.hyprland.org/Configuring/Configuring-Hyprland/ # Please note not all available settings / options are set here. # For a full list, see the wiki # You can split this configuration into multiple files # Create your files separately and then link them to this file like this: # source = ~/.config/hypr/myColors.conf ################ ### MONITORS ### ################ # See https://wiki.hyprland.org/Configuring/Monitors/ monitor=,preferred,auto,auto ################### ### MY PROGRAMS ### ################### # See https://wiki.hyprland.org/Configuring/Keywords/ # Set programs that you use $terminal = kitty $fileManager = dolphin $menu = rofi -show drun ################# ### AUTOSTART ### ################# # Autostart necessary processes (like notifications daemons, status bars, etc.) # Or execute your favorite apps at launch like this: # exec-once = $terminal # exec-once = nm-applet & # exec-once = waybar & hyprpaper & firefox ############################# ### ENVIRONMENT VARIABLES ### ############################# # See https://wiki.hyprland.org/Configuring/Environment-variables/ env = XCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24 ##################### ### LOOK AND FEEL ### ##################### # Refer to https://wiki.hyprland.org/Configuring/Variables/ # https://wiki.hyprland.org/Configuring/Variables/#general general { gaps_in = 5 gaps_out = 20 border_size = 2 # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg col.inactive_border = rgba(595959aa) # Set to true enable resizing windows by clicking and dragging on borders and gaps resize_on_border = false # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on allow_tearing = false layout = dwindle } # https://wiki.hyprland.org/Configuring/Variables/#decoration decoration { rounding = 10 # Change transparency of focused and unfocused windows active_opacity = 1.0 inactive_opacity = 1.0 drop_shadow = true shadow_range = 4 shadow_render_power = 3 col.shadow = rgba(1a1a1aee) # https://wiki.hyprland.org/Configuring/Variables/#blur blur { enabled = true size = 3 passes = 1 vibrancy = 0.1696 } } # https://wiki.hyprland.org/Configuring/Variables/#animations animations { enabled = true # 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 } # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more dwindle { pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below preserve_split = true # You probably want this } # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more master { new_status = master } # https://wiki.hyprland.org/Configuring/Variables/#misc misc { force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( } ############# ### INPUT ### ############# input { # https://wiki.hyprland.org/Configuring/Variables/#input kb_layout = si-with-better-dead-keys kb_variant = kb_model = kb_options = caps:swapescape follow_mouse = 1 sensitivity = 0 # -1.0 - 1.0, 0 means no modification. touchpad { natural_scroll = false } } # https://wiki.hyprland.org/Configuring/Variables/#gestures gestures { workspace_swipe = false } # Example per-device config # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more device { name = epic-mouse-v1 sensitivity = -0.5 } #################### ### KEYBINDINGSS ### #################### # See https://wiki.hyprland.org/Configuring/Keywords/ $mainMod = SUPER # Sets "Windows" key as main modifier # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more bind = $mainMod, Q, exec, $terminal bind = $mainMod, C, killactive, bind = $mainMod, M, exit, bind = $mainMod, E, exec, $fileManager bind = $mainMod, V, togglefloating, bind = $mainMod, R, exec, $menu bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, J, togglesplit, # dwindle # 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 # Switch workspaces with mainMod + [0-9] 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 # Move active window to a workspace with mainMod + SHIFT + [0-9] 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 # Example special workspace (scratchpad) bind = $mainMod, S, togglespecialworkspace, magic bind = $mainMod SHIFT, S, movetoworkspace, special:magic # Scroll through existing workspaces with mainMod + scroll bind = $mainMod, mouse_down, workspace, e+1 bind = $mainMod, mouse_up, workspace, e-1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow ############################## ### WINDOWS AND WORKSPACES ### ############################## # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules # Example windowrule v1 # windowrule = float, ^(kitty)$ # Example windowrule v2 # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ windowrulev2 = suppressevent maximize, class:.* # You'll probably like this. binde = , o, exec, wlrctl pointer scroll 1 0 ======Config-End======== ```

Description

I want to scroll active window with a keyboard. The best way to do this appears to be emulate mouse's scrollwheel using wlrctl. But Hyprland does not appear to work with it well.

How to reproduce

  1. Install https://git.sr.ht/~brocellous/wlrctl
  2. Bind virtual pointer scroll to a key, for example bind = , o, exec, wlrctl pointer scroll 1 0
  3. Focus a scrollable window
  4. Press bound key repeatedly
  5. Note that scrolling is very choppy, it scrolls once and then waits a while before scrolling again. Additionally, scrolled amount (first argument of the scroll command) does not appear to have any effect, Hyprland always scrolls for the same amount.

Crash reports, logs, images, videos

Wayland debug from a scroll action ```sh [2499016.108] {Default Queue} -> wl_display#1.get_registry(new id wl_registry#2) [2499016.128] {Default Queue} -> wl_display#1.sync(new id wl_callback#3) [2499016.234] {Display Queue} wl_display#1.delete_id(3) [2499016.243] {Default Queue} wl_registry#2.global(1, "wl_seat", 9) [2499016.249] {Default Queue} -> wl_registry#2.bind(1, "wl_seat", 7, new id [unknown]#4) [2499016.256] {Default Queue} wl_registry#2.global(2, "wl_data_device_manager", 3) [2499016.262] {Default Queue} wl_registry#2.global(3, "wl_compositor", 6) [2499016.267] {Default Queue} wl_registry#2.global(4, "wl_subcompositor", 1) [2499016.273] {Default Queue} wl_registry#2.global(5, "wl_shm", 1) [2499016.278] {Default Queue} wl_registry#2.global(6, "wp_viewporter", 1) [2499016.284] {Default Queue} wl_registry#2.global(7, "wp_tearing_control_manager_v1", 1) [2499016.289] {Default Queue} wl_registry#2.global(8, "wp_fractional_scale_manager_v1", 1) [2499016.294] {Default Queue} wl_registry#2.global(9, "zxdg_output_manager_v1", 3) [2499016.299] {Default Queue} wl_registry#2.global(10, "wp_cursor_shape_manager_v1", 1) [2499016.304] {Default Queue} wl_registry#2.global(11, "zwp_idle_inhibit_manager_v1", 1) [2499016.309] {Default Queue} wl_registry#2.global(12, "zwp_relative_pointer_manager_v1", 1) [2499016.314] {Default Queue} wl_registry#2.global(13, "zxdg_decoration_manager_v1", 1) [2499016.320] {Default Queue} wl_registry#2.global(14, "wp_alpha_modifier_v1", 1) [2499016.325] {Default Queue} wl_registry#2.global(15, "zwlr_gamma_control_manager_v1", 1) [2499016.330] {Default Queue} wl_registry#2.global(16, "ext_foreign_toplevel_list_v1", 1) [2499016.335] {Default Queue} wl_registry#2.global(17, "zwp_pointer_gestures_v1", 3) [2499016.341] {Default Queue} wl_registry#2.global(18, "zwlr_foreign_toplevel_manager_v1", 3) [2499016.346] {Default Queue} wl_registry#2.global(19, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1) [2499016.351] {Default Queue} wl_registry#2.global(20, "zwp_text_input_manager_v1", 1) [2499016.357] {Default Queue} wl_registry#2.global(21, "zwp_text_input_manager_v3", 1) [2499016.362] {Default Queue} wl_registry#2.global(22, "zwp_pointer_constraints_v1", 1) [2499016.367] {Default Queue} wl_registry#2.global(23, "zwlr_output_power_manager_v1", 1) [2499016.372] {Default Queue} wl_registry#2.global(24, "xdg_activation_v1", 1) [2499016.377] {Default Queue} wl_registry#2.global(25, "ext_idle_notifier_v1", 1) [2499016.382] {Default Queue} wl_registry#2.global(26, "ext_session_lock_manager_v1", 1) [2499016.388] {Default Queue} wl_registry#2.global(27, "zwp_input_method_manager_v2", 1) [2499016.393] {Default Queue} wl_registry#2.global(28, "zwp_virtual_keyboard_manager_v1", 1) [2499016.398] {Default Queue} wl_registry#2.global(29, "zwlr_virtual_pointer_manager_v1", 2) [2499016.404] {Default Queue} -> wl_registry#2.bind(29, "zwlr_virtual_pointer_manager_v1", 2, new id [unknown]#5) [2499016.410] {Default Queue} wl_registry#2.global(30, "zwlr_output_manager_v1", 4) [2499016.416] {Default Queue} wl_registry#2.global(31, "org_kde_kwin_server_decoration_manager", 1) [2499016.422] {Default Queue} wl_registry#2.global(32, "hyprland_focus_grab_manager_v1", 1) [2499016.427] {Default Queue} wl_registry#2.global(33, "zwp_tablet_manager_v2", 1) [2499016.432] {Default Queue} wl_registry#2.global(34, "zwlr_layer_shell_v1", 5) [2499016.437] {Default Queue} wl_registry#2.global(35, "wp_presentation", 1) [2499016.442] {Default Queue} wl_registry#2.global(36, "xdg_wm_base", 6) [2499016.447] {Default Queue} wl_registry#2.global(37, "zwlr_data_control_manager_v1", 2) [2499016.452] {Default Queue} wl_registry#2.global(38, "zwp_primary_selection_device_manager_v1", 1) [2499016.457] {Default Queue} wl_registry#2.global(39, "xwayland_shell_v1", 1) [2499016.462] {Default Queue} wl_registry#2.global(40, "zwlr_screencopy_manager_v1", 3) [2499016.468] {Default Queue} wl_registry#2.global(41, "hyprland_toplevel_export_manager_v1", 2) [2499016.473] {Default Queue} wl_registry#2.global(42, "hyprland_global_shortcuts_manager_v1", 1) [2499016.478] {Default Queue} wl_registry#2.global(43, "xdg_dialog_v1", 1) [2499016.483] {Default Queue} wl_registry#2.global(44, "wp_drm_lease_device_v1", 1) [2499016.488] {Default Queue} wl_registry#2.global(45, "wp_linux_drm_syncobj_manager_v1", 1) [2499016.493] {Default Queue} wl_registry#2.global(46, "wl_drm", 2) [2499016.498] {Default Queue} wl_registry#2.global(47, "zwp_linux_dmabuf_v1", 5) [2499016.503] {Default Queue} wl_registry#2.global(48, "wl_output", 4) [2499016.509] {Default Queue} wl_registry#2.global(49, "wl_output", 4) [2499016.514] {Default Queue} wl_callback#3.done(5337) [2499016.519] {Default Queue} -> zwlr_virtual_pointer_manager_v1#5.create_virtual_pointer(wl_seat#4, new id zwlr_virtual_pointer_v1#3) [2499016.528] {Default Queue} -> zwlr_virtual_pointer_v1#3.axis_source(1) [2499016.533] {Default Queue} -> zwlr_virtual_pointer_v1#3.axis(1286975, 0, 1.00000000) [2499016.540] {Default Queue} -> zwlr_virtual_pointer_v1#3.frame() [2499016.545] {Default Queue} -> zwlr_virtual_pointer_v1#3.axis_source(1) [2499016.550] {Default Queue} -> zwlr_virtual_pointer_v1#3.axis_stop(1286975, 0) [2499016.555] {Default Queue} -> zwlr_virtual_pointer_v1#3.frame() [2499016.561] {Default Queue} -> wl_display#1.sync(new id wl_callback#6) [2499016.797] {Display Queue} wl_display#1.delete_id(6) [2499016.802] {Default Queue} discarded wl_seat#4.name("Hyprland") [2499016.805] {Default Queue} discarded wl_seat#4.capabilities(3) [2499016.810] {Default Queue} wl_callback#6.done(5337) [2499016.814] {Default Queue} -> zwlr_virtual_pointer_v1#3.destroy() ```
Agent00Ming commented 4 hours ago
name description type default
emulate_discrete_scroll Emulates discrete scrolling from high resolution scrolling events. 0 disables it, 1 enables handling of non-standard events only, and 2 force enables all scroll wheel events to be handled int 1

https://wiki.hyprland.org/Configuring/Variables/#input

Your scroll events are getting caught in this so tweak it to your liking. Some apps don't play nice without discrete events but YMMV.