Skip to main content

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