[GH-ISSUE #368] Scroll doesn't work on Windows > Hyprland #198

Closed
opened 2026-05-05 22:13:31 -06:00 by gitea-mirror · 4 comments
Owner

Originally created by @ZepsiZola on GitHub (Jan 29, 2026).
Original GitHub issue: https://github.com/feschber/lan-mouse/issues/368

I have miraculously been able to set up lan-mouse to work between my Windows desktop and my Nixos/Hyprland laptop, despite minimal and contradicting documentation.

When using keyboard + touchpad from my hyprland laptop I can use the scroll and modifier keys on the windows (client)

However, when using the keyboard + mouse from my Windows desktop, the scroll and modifier keys are not sent to the Hyprland laptop.

I understand the modifier keys I guess, since I've never used an app on windows that stopped me from pressing the windows key to exit, but the scroll wheel? Why's that not passed through?

Any help would be appreciated.

Originally created by @ZepsiZola on GitHub (Jan 29, 2026). Original GitHub issue: https://github.com/feschber/lan-mouse/issues/368 I have miraculously been able to set up lan-mouse to work between my Windows desktop and my Nixos/Hyprland laptop, despite minimal and contradicting documentation. When using keyboard + touchpad from my hyprland laptop I can use the scroll and modifier keys on the windows (client) However, when using the keyboard + mouse from my Windows desktop, the scroll and modifier keys are not sent to the Hyprland laptop. I understand the modifier keys I guess, since I've never used an app on windows that stopped me from pressing the windows key to exit, but the scroll wheel? Why's that not passed through? Any help would be appreciated.
Author
Owner

@victorgilalejandria commented on GitHub (Feb 4, 2026):

I installed the one from pacman (v0.10.0-1.1) on Linux and cargo on the mac (v0.10.0), and the scroll is working. but using the master branch and compiling didn't work. I have Hyprland > macOS.

<!-- gh-comment-id:3848366565 --> @victorgilalejandria commented on GitHub (Feb 4, 2026): I installed the one from pacman (v0.10.0-1.1) on Linux and cargo on the mac (v0.10.0), and the scroll is working. but using the master branch and compiling didn't work. I have Hyprland > macOS.
Author
Owner

@BlueAlder commented on GitHub (Feb 12, 2026):

I am also running into the same issue going from Hyprland > Hyprland. This might be a dupe of #355

In the TRACE logs on the recieving Hyprland instance I can see the emulation event running, but the scroll doesn't occur.

I tried running wev and can see there is an event, but not a scroll event. Not sure what is going on.

Here is the output from the receiving hyprland instance. This is on 0.10.0

[2026-02-11T23:01:07Z INFO  lan_mouse::config] using config: "/home/someuser/.config/lan-mouse/config.toml"
[2026-02-11T23:01:07Z DEBUG lan_mouse::config] Some(ConfigToml { capture_backend: None, emulation_backend: None, port: None, frontend: None, release_bind: Some([KeyA, KeyS, KeyD, KeyF]), left: None, right: Some(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }), top: None, bottom: None })
[2026-02-11T23:01:07Z DEBUG lan_mouse] Config { capture_backend: None, emulation_backend: None, frontend: Cli, port: 4242, clients: [(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }, Right)], daemon: false, release_bind: [KeyA, KeyS, KeyD, KeyF], test_capture: false, test_emulation: false }
[2026-02-11T23:01:07Z INFO  lan_mouse] release bind: [KeyA, KeyS, KeyD, KeyF]
[2026-02-11T23:01:07Z INFO  lan_mouse::config] using config: "/home/someuser/.config/lan-mouse/config.toml"
[2026-02-11T23:01:07Z DEBUG lan_mouse::config] Some(ConfigToml { capture_backend: None, emulation_backend: None, port: None, frontend: None, release_bind: Some([KeyA, KeyS, KeyD, KeyF]), left: None, right: Some(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }), top: None, bottom: None })
[2026-02-11T23:01:07Z DEBUG lan_mouse] Config { capture_backend: None, emulation_backend: None, frontend: Cli, port: 4242, clients: [(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }, Right)], daemon: true, release_bind: [KeyA, KeyS, KeyD, KeyF], test_capture: false, test_emulation: false }
[2026-02-11T23:01:07Z INFO  lan_mouse] release bind: [KeyA, KeyS, KeyD, KeyF]
[2026-02-11T23:01:07Z INFO  lan_mouse] Press [KeyA, KeyS, KeyD, KeyF] to release the mouse
[2026-02-11T23:01:07Z DEBUG lan_mouse_ipc::listen] remove socket: "/run/user/773360/lan-mouse-socket.sock"
[2026-02-11T23:01:07Z INFO  lan_mouse::server::emulation_task] creating input emulation...
[2026-02-11T23:01:07Z INFO  input_emulation] using emulation backend: wlroots
[2026-02-11T23:01:07Z INFO  lan_mouse::dns] resolving (0) `giraffe` ...
[2026-02-11T23:01:07Z WARN  input_capture] input-capture-portal input capture backend unavailable: error creating input-capture-portal backend: `xdg-desktop-portal: `A portal frontend implementing `org.freedesktop.portal.InputCapture` was not found``
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> requested registry
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] wl_output global
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] wl_output global
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> roundtrip 1 done
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: []
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: []
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Name { name: "DP-1" }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Description { description: "HP Inc. HP Z27n G2 6CM93506B9 (DP-1)" }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalPosition { x: 1920, y: 0 }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalSize { width: 2560, height: 1440 }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) })]
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Name { name: "eDP-1" }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Description { description: "InfoVision Optoelectronics (Kunshan) Co.,Ltd China 0x8C44  (eDP-1)" }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalPosition { x: 0, y: 0 }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalSize { width: 1920, height: 1200 }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) }), (WlOutput { id: ObjectId(wl_output@15, 16), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "eDP-1", position: (0, 0), size: (1920, 1200) })]
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> roundtrip 2 done
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] OutputInfo {
        name: "DP-1",
        position: (
            1920,
            0,
        ),
        size: (
            2560,
            1440,
        ),
    }
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] OutputInfo {
        name: "eDP-1",
        position: (
            0,
            0,
        ),
        size: (
            1920,
            1200,
        ),
    }
[2026-02-11T23:01:07Z INFO  input_capture] using capture backend: layer-shell
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] edges: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, 4480), (WlOutput { id: ObjectId(wl_output@15, 16), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, 1920)]
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] outputs: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) })]
[2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] creating window output: WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, size: (2560, 1440)
[2026-02-11T23:01:07Z INFO  lan_mouse::dns] giraffe: adding ip 192.168.86.67
[2026-02-11T23:01:07Z DEBUG lan_mouse::server] handle frontend request: Sync
[2026-02-11T23:01:07Z DEBUG lan_mouse::server] frontend: Sync
lan-mouse > emulation status: Enabled
lan-mouse > capture status: Enabled
lan-mouse > changed port to 4242
lan-mouse > [2026-02-11T23:01:14Z TRACE lan_mouse::server::emulation_task] Enter(0)             <-<-<-<------ 192.168.86.67:4242
[2026-02-11T23:01:14Z DEBUG lan_mouse::server] state => Receiving

<SNIP to scroll event>

[2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, 120)  <-<-<-<------ 192.168.86.67:4242
[2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, 120) => emulate
[2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] ping                 <-<-<-<------ 192.168.86.67:4242
[2026-02-11T23:01:17Z TRACE lan_mouse::server::network_task] pong                 ------>->->-> 192.168.86.67:4242
[2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] ping                 <-<-<-<------ 192.168.86.67:4242
[2026-02-11T23:01:18Z TRACE lan_mouse::server::network_task] pong                 ------>->->-> 192.168.86.67:4242
[2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, -120) <-<-<-<------ 192.168.86.67:4242
[2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, -120) => emulate
<!-- gh-comment-id:3887894342 --> @BlueAlder commented on GitHub (Feb 12, 2026): I am also running into the same issue going from Hyprland > Hyprland. This might be a dupe of #355 In the TRACE logs on the recieving Hyprland instance I can see the emulation event running, but the scroll doesn't occur. I tried running `wev` and can see there is an event, but not a scroll event. Not sure what is going on. Here is the output from the receiving hyprland instance. This is on 0.10.0 ``` [2026-02-11T23:01:07Z INFO lan_mouse::config] using config: "/home/someuser/.config/lan-mouse/config.toml" [2026-02-11T23:01:07Z DEBUG lan_mouse::config] Some(ConfigToml { capture_backend: None, emulation_backend: None, port: None, frontend: None, release_bind: Some([KeyA, KeyS, KeyD, KeyF]), left: None, right: Some(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }), top: None, bottom: None }) [2026-02-11T23:01:07Z DEBUG lan_mouse] Config { capture_backend: None, emulation_backend: None, frontend: Cli, port: 4242, clients: [(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }, Right)], daemon: false, release_bind: [KeyA, KeyS, KeyD, KeyF], test_capture: false, test_emulation: false } [2026-02-11T23:01:07Z INFO lan_mouse] release bind: [KeyA, KeyS, KeyD, KeyF] [2026-02-11T23:01:07Z INFO lan_mouse::config] using config: "/home/someuser/.config/lan-mouse/config.toml" [2026-02-11T23:01:07Z DEBUG lan_mouse::config] Some(ConfigToml { capture_backend: None, emulation_backend: None, port: None, frontend: None, release_bind: Some([KeyA, KeyS, KeyD, KeyF]), left: None, right: Some(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }), top: None, bottom: None }) [2026-02-11T23:01:07Z DEBUG lan_mouse] Config { capture_backend: None, emulation_backend: None, frontend: Cli, port: 4242, clients: [(TomlClient { capture_backend: None, hostname: Some("giraffe"), host_name: None, ips: Some([192.168.86.67]), port: None, activate_on_startup: Some(true), enter_hook: None }, Right)], daemon: true, release_bind: [KeyA, KeyS, KeyD, KeyF], test_capture: false, test_emulation: false } [2026-02-11T23:01:07Z INFO lan_mouse] release bind: [KeyA, KeyS, KeyD, KeyF] [2026-02-11T23:01:07Z INFO lan_mouse] Press [KeyA, KeyS, KeyD, KeyF] to release the mouse [2026-02-11T23:01:07Z DEBUG lan_mouse_ipc::listen] remove socket: "/run/user/773360/lan-mouse-socket.sock" [2026-02-11T23:01:07Z INFO lan_mouse::server::emulation_task] creating input emulation... [2026-02-11T23:01:07Z INFO input_emulation] using emulation backend: wlroots [2026-02-11T23:01:07Z INFO lan_mouse::dns] resolving (0) `giraffe` ... [2026-02-11T23:01:07Z WARN input_capture] input-capture-portal input capture backend unavailable: error creating input-capture-portal backend: `xdg-desktop-portal: `A portal frontend implementing `org.freedesktop.portal.InputCapture` was not found`` [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> requested registry [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] wl_output global [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] wl_output global [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> roundtrip 1 done [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Name { name: "DP-1" } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Description { description: "HP Inc. HP Z27n G2 6CM93506B9 (DP-1)" } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalPosition { x: 1920, y: 0 } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalSize { width: 2560, height: 1440 } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) })] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Name { name: "eDP-1" } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - Description { description: "InfoVision Optoelectronics (Kunshan) Co.,Ltd China 0x8C44 (eDP-1)" } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalPosition { x: 0, y: 0 } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] xdg-output - LogicalSize { width: 1920, height: 1200 } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] updating windows [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] output info: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) }), (WlOutput { id: ObjectId(wl_output@15, 16), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "eDP-1", position: (0, 0), size: (1920, 1200) })] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] ==============> roundtrip 2 done [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] OutputInfo { name: "DP-1", position: ( 1920, 0, ), size: ( 2560, 1440, ), } [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] OutputInfo { name: "eDP-1", position: ( 0, 0, ), size: ( 1920, 1200, ), } [2026-02-11T23:01:07Z INFO input_capture] using capture backend: layer-shell [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] edges: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, 4480), (WlOutput { id: ObjectId(wl_output@15, 16), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, 1920)] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] outputs: [(WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, OutputInfo { name: "DP-1", position: (1920, 0), size: (2560, 1440) })] [2026-02-11T23:01:07Z DEBUG input_capture::layer_shell] creating window output: WlOutput { id: ObjectId(wl_output@12, 15), version: 4, data: Some(ObjectData { .. }), backend: WeakBackend { inner: WeakInnerBackend { state: (Weak) } } }, size: (2560, 1440) [2026-02-11T23:01:07Z INFO lan_mouse::dns] giraffe: adding ip 192.168.86.67 [2026-02-11T23:01:07Z DEBUG lan_mouse::server] handle frontend request: Sync [2026-02-11T23:01:07Z DEBUG lan_mouse::server] frontend: Sync lan-mouse > emulation status: Enabled lan-mouse > capture status: Enabled lan-mouse > changed port to 4242 lan-mouse > [2026-02-11T23:01:14Z TRACE lan_mouse::server::emulation_task] Enter(0) <-<-<-<------ 192.168.86.67:4242 [2026-02-11T23:01:14Z DEBUG lan_mouse::server] state => Receiving <SNIP to scroll event> [2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, 120) <-<-<-<------ 192.168.86.67:4242 [2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, 120) => emulate [2026-02-11T23:01:17Z TRACE lan_mouse::server::emulation_task] ping <-<-<-<------ 192.168.86.67:4242 [2026-02-11T23:01:17Z TRACE lan_mouse::server::network_task] pong ------>->->-> 192.168.86.67:4242 [2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] ping <-<-<-<------ 192.168.86.67:4242 [2026-02-11T23:01:18Z TRACE lan_mouse::server::network_task] pong ------>->->-> 192.168.86.67:4242 [2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, -120) <-<-<-<------ 192.168.86.67:4242 [2026-02-11T23:01:18Z TRACE lan_mouse::server::emulation_task] scroll-120 (0, -120) => emulate ```
Author
Owner

@BlueAlder commented on GitHub (Feb 12, 2026):

I looked into this a bit more and found that this has been fixed, but I have been using the release v0.10.0 which was released in 2024.

This is the fix #239. I have built from source and confirmed it works now.

<!-- gh-comment-id:3888558811 --> @BlueAlder commented on GitHub (Feb 12, 2026): I looked into this a bit more and found that this has been fixed, but I have been using the release v0.10.0 which was released in 2024. This is the fix #239. I have built from source and confirmed it works now.
Author
Owner

@feschber commented on GitHub (Feb 13, 2026):

Great to hear! There will be a new release, soon :)

<!-- gh-comment-id:3896752386 --> @feschber commented on GitHub (Feb 13, 2026): Great to hear! There will be a new release, soon :)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/lan-mouse#198
No description provided.