diff --git a/src/backend/consumer/windows.rs b/src/backend/consumer/windows.rs index 1b2391b..ffcd112 100644 --- a/src/backend/consumer/windows.rs +++ b/src/backend/consumer/windows.rs @@ -3,7 +3,16 @@ use std::sync::mpsc::Receiver; use crate::event::{KeyboardEvent, PointerEvent}; use winapi::{ self, - um::winuser::{INPUT, INPUT_MOUSE, LPINPUT, MOUSEEVENTF_MOVE, MOUSEINPUT}, + um::winuser::{INPUT, INPUT_MOUSE, LPINPUT, MOUSEEVENTF_MOVE, MOUSEINPUT, + MOUSEEVENTF_LEFTDOWN, + MOUSEEVENTF_RIGHTDOWN, + MOUSEEVENTF_MIDDLEDOWN, + MOUSEEVENTF_LEFTUP, + MOUSEEVENTF_RIGHTUP, + MOUSEEVENTF_MIDDLEUP, + MOUSEEVENTF_WHEEL, + MOUSEEVENTF_HWHEEL, + }, }; use crate::{ @@ -11,16 +20,7 @@ use crate::{ event::Event, }; -fn rel_mouse(dx: i32, dy: i32) { - let mi = MOUSEINPUT { - dx, - dy, - mouseData: 0, - dwFlags: MOUSEEVENTF_MOVE, - time: 0, - dwExtraInfo: 0, - }; - +fn send_mouse_input(mi: MOUSEINPUT) { unsafe { let mut input = INPUT { type_: INPUT_MOUSE, @@ -35,6 +35,60 @@ fn rel_mouse(dx: i32, dy: i32) { } } +fn rel_mouse(dx: i32, dy: i32) { + let mi = MOUSEINPUT { + dx, + dy, + mouseData: 0, + dwFlags: MOUSEEVENTF_MOVE, + time: 0, + dwExtraInfo: 0, + }; + send_mouse_input(mi); +} + +fn mouse_button(button: u32, state: u32) { + let dw_flags = match state { + 0 => match button { + 0x110 => MOUSEEVENTF_LEFTUP, + 0x111 => MOUSEEVENTF_RIGHTUP, + 0x112 => MOUSEEVENTF_MIDDLEUP, + _ => return + } + 1 => match button { + 0x110 => MOUSEEVENTF_LEFTDOWN, + 0x111 => MOUSEEVENTF_RIGHTDOWN, + 0x112 => MOUSEEVENTF_MIDDLEDOWN, + _ => return + } + _ => return + }; + let mi = MOUSEINPUT { + dx: 0, dy: 0, // no movement + mouseData: 0, + dwFlags: dw_flags, + time: 0, + dwExtraInfo: 0, + }; + send_mouse_input(mi); +} + +fn scroll(axis: u8, value: f64) { + let event_type = match axis { + 0 => MOUSEEVENTF_WHEEL, + 1 => MOUSEEVENTF_HWHEEL, + _ => return + }; + let mi = MOUSEINPUT { + dx: 0, dy: 0, + mouseData: (-value * 15.0) as i32 as u32, + dwFlags: event_type, + time: 0, + dwExtraInfo: 0, + }; + send_mouse_input(mi); +} + pub fn run(event_rx: Receiver<(Event, ClientHandle)>, _clients: Vec) { loop { match event_rx.recv().expect("event receiver unavailable").0 { @@ -46,8 +100,11 @@ pub fn run(event_rx: Receiver<(Event, ClientHandle)>, _clients: Vec) { } => { rel_mouse(relative_x as i32, relative_y as i32); } - PointerEvent::Button { .. } => {} - PointerEvent::Axis { .. } => {} + PointerEvent::Button { time:_, button, state } => { mouse_button(button, state)} + PointerEvent::Axis { time:_, axis, value } => { + println!("axis: {axis}, value: {value}"); + scroll(axis, value) + } PointerEvent::Frame {} => {} }, Event::Keyboard(keyboard_event) => match keyboard_event {