1use crate::prelude::*;
2use enigo::{Axis, Button, Coordinate, Direction, Enigo, Mouse as EnigoMouse, Settings};
3
4#[derive(Debug, Clone)]
6pub struct Mouse;
7
8impl Mouse {
9 fn enigo() -> Result<Enigo> {
11 Ok(Enigo::new(&Settings::default())?)
12 }
13
14 pub fn coords() -> Result<(i32, i32)> {
16 let enigo = Self::enigo()?;
17 enigo.location().map_err(From::from)
18 }
19
20 pub fn display_size() -> Result<(i32, i32)> {
22 let enigo = Self::enigo()?;
23 enigo.main_display().map_err(From::from)
24 }
25
26 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 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 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 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 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 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 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 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 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}