pc_remote/input/
mouse.rs

1use crate::prelude::*;
2use enigo::{ Axis, Button, Coordinate, Direction, Enigo, Mouse as EnigoMouse, Settings, };
3
4/// The mouse emulator
5#[derive(Debug)]
6pub struct Mouse {
7    enigo: Enigo,
8}
9
10impl Mouse {
11    /// Creates a new mouse emulator
12    pub fn new() -> Result<Self> {
13        Ok(Self {
14            enigo: Enigo::new( &Settings::default() )?,
15        })
16    }
17
18    /// Returns current mouse coordinates
19    pub fn coords(&mut self) -> Result<(i32, i32)> {
20        self.enigo.location().map_err(From::from)
21    }
22
23    /// Returns screen resolution (width, height)
24    pub fn display_size(&mut self) -> Result<(i32, i32)> {
25        self.enigo.main_display().map_err(From::from)
26    }
27
28    /// Move mouse vertically
29    pub fn move_to(&mut self, x: i32, y: i32) -> Result<()> {
30        self.enigo.move_mouse(x, y, Coordinate::Abs).map_err(From::from)
31    }
32
33    /// Move mouse horizontally (relative)
34    pub fn move_relative(&mut self, x: i32, y: i32) -> Result<()> {
35        self.enigo.move_mouse(x, y, Coordinate::Rel).map_err(From::from)
36    }
37
38    /// Move mouse to center
39    pub fn move_to_center(&mut self) -> Result<()> {
40        let (w, h) = self.display_size()?;
41        let (x, y) = (w / 2, h / 2);
42        
43        self.enigo.move_mouse(x, y, Coordinate::Abs).map_err(From::from)
44    }
45
46    /// Press the left mouse button
47    pub fn press_left(&mut self) -> Result<()> {
48        self.enigo.button(Button::Left, Direction::Press).map_err(From::from)
49    }
50
51    /// Release the left mouse button (uses after 'hold_left' method)
52    pub fn release_left(&mut self) -> Result<()> {
53        self.enigo.button(Button::Left, Direction::Release).map_err(From::from)
54    }
55
56    /// Press the right mouse button
57    pub fn press_right(&mut self) -> Result<()> {
58        self.enigo.button(Button::Right, Direction::Press).map_err(From::from)
59    }
60
61    /// Release the right mouse button (uses after 'hold_right' method)
62    pub fn release_right(&mut self) -> Result<()> {
63        self.enigo.button(Button::Right, Direction::Release).map_err(From::from)
64    }
65
66    /// Scroll horizontally
67    pub fn scroll_x(&mut self, delta: i32) -> Result<()> {
68        self.enigo.scroll(delta, Axis::Horizontal).map_err(From::from)
69    }
70
71    /// Scroll vertically
72    pub fn scroll_y(&mut self, delta: i32) -> Result<()> {
73        self.enigo.scroll(delta, Axis::Vertical).map_err(From::from)
74    }
75}