Add full mouse support on windows (#11)

This commit is contained in:
Ferdinand Schober
2023-06-11 14:32:29 +02:00
committed by GitHub
parent 57b0d898c1
commit 929ac1c643

View File

@@ -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<Client>) {
loop {
match event_rx.recv().expect("event receiver unavailable").0 {
@@ -46,8 +100,11 @@ pub fn run(event_rx: Receiver<(Event, ClientHandle)>, _clients: Vec<Client>) {
} => {
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 {