Skip to content

Commit a63b8a3

Browse files
committed
More work on pointer.
1 parent 40894e1 commit a63b8a3

File tree

7 files changed

+68
-12
lines changed

7 files changed

+68
-12
lines changed

.github/workflows/rust.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030

3131
build: cargo build --verbose --no-default-features --features wayland
3232
# Keyboard not implemented in wayland
33-
test: WAYLAND_DISPLAY=wl-test-env cargo test --verbose --no-default-features --features=serialize,wayland -- --skip test_keyboard_state
33+
test: WAYLAND_DISPLAY=wl-test-env cargo test --verbose --no-default-features --features=serialize,wayland -- --skip test_keyboard_state --skip test_listen_and_simulate --skip test_grab
3434
- variant: macos-latest
3535
os: macos-latest
3636
build: cargo build --verbose

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ serde = {version = "1.0", features = ["derive"], optional=true}
1818
lazy_static = "1.4"
1919

2020
[features]
21-
default = ["x11"]
21+
default = []
2222
serialize = ["serde"]
2323
unstable_grab = ["evdev-rs", "epoll", "inotify"]
2424
wayland = ["input", "input-linux"]

src/linux/wayland/grab.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ where
367367
add_device_to_epoll_from_inotify_event(epoll_fd, event, &mut devices)?;
368368
}
369369
} else {
370-
// Input device recieved event
370+
// Input device received event
371371
let device_idx = event.data as usize;
372372
let device = devices.get(device_idx).unwrap();
373373
while device.has_event_pending() {

src/linux/wayland/listen.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
extern crate libc;
22
use super::keycodes::key_from_code;
33
use crate::rdev::{Event, ListenError};
4-
use crate::EventType;
4+
use crate::{Button, EventType};
55
use input::event::keyboard::{KeyState, KeyboardEventTrait};
6+
use input::event::pointer::{Axis, ButtonState};
7+
use input::event::PointerEvent;
68
use input::{Event as LibEvent, Libinput, LibinputInterface};
79
use libc::{O_RDONLY, O_RDWR, O_WRONLY};
810
use std::fs::{File, OpenOptions};
@@ -22,7 +24,40 @@ fn convert_type(libevent: LibEvent) -> Option<EventType> {
2224
KeyState::Released => Some(EventType::KeyRelease(k)),
2325
}
2426
}
25-
_ => None,
27+
LibEvent::Pointer(PointerEvent::Button(btn)) => {
28+
let rdev_btn = match btn.button() {
29+
272 => Some(Button::Left),
30+
273 => Some(Button::Right),
31+
274 => Some(Button::Middle),
32+
_ => None,
33+
};
34+
if let Some(rdev_btn) = rdev_btn {
35+
let state: ButtonState = btn.button_state();
36+
match state {
37+
ButtonState::Pressed => Some(EventType::ButtonPress(rdev_btn)),
38+
ButtonState::Released => Some(EventType::ButtonRelease(rdev_btn)),
39+
}
40+
} else {
41+
None
42+
}
43+
}
44+
LibEvent::Pointer(PointerEvent::Motion(btn)) => Some(EventType::MouseMove {
45+
// TODO Convert to absolute X, Y
46+
x: btn.dx(),
47+
y: btn.dy(),
48+
}),
49+
LibEvent::Pointer(PointerEvent::MotionAbsolute(btn)) => Some(EventType::MouseMove {
50+
x: btn.absolute_x(),
51+
y: btn.absolute_y(),
52+
}),
53+
LibEvent::Pointer(PointerEvent::ScrollWheel(btn)) => Some(EventType::Wheel {
54+
delta_x: -(btn.scroll_value_v120(Axis::Horizontal) / 120.0) as i64,
55+
delta_y: -(btn.scroll_value_v120(Axis::Vertical) / 120.0) as i64,
56+
}),
57+
lib => {
58+
dbg!(format!("Received unhandlded event {lib:?}"));
59+
None
60+
}
2661
}
2762
}
2863
fn convert(libevent: LibEvent) -> Option<Event> {

src/linux/wayland/simulate.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@ impl Handle {
3030
uinput.set_relbit(RelativeAxis::X).unwrap();
3131
uinput.set_relbit(RelativeAxis::Y).unwrap();
3232
uinput.set_relbit(RelativeAxis::Wheel).unwrap();
33+
uinput.set_relbit(RelativeAxis::WheelHiRes).unwrap();
3334

3435
// Enable all keys
3536
for key in UKey::iter() {
3637
uinput.set_keybit(key).unwrap();
3738
}
39+
// Enable all keys
40+
for rel in RelativeAxis::iter() {
41+
uinput.set_relbit(rel).unwrap();
42+
}
3843

3944
let input_id = InputId {
4045
bustype: input_linux::sys::BUS_VIRTUAL,
@@ -116,21 +121,30 @@ impl Handle {
116121
}
117122
EventType::MouseMove { x, y } => {
118123
let time = Self::get_current_time();
124+
let reset_x = RelativeEvent::new(time, RelativeAxis::X, i32::MIN);
125+
let reset_x: input_event = InputEvent::from(reset_x).into();
126+
let reset_y = RelativeEvent::new(time, RelativeAxis::Y, i32::MIN);
127+
let reset_y: input_event = InputEvent::from(reset_y).into();
128+
let rsync = SynchronizeEvent::new(time, SynchronizeKind::Report, 0);
129+
let rsync: input_event = InputEvent::from(rsync).into();
130+
119131
let event_x = RelativeEvent::new(time, RelativeAxis::X, *x as i32);
120132
let event_x: input_event = InputEvent::from(event_x).into();
121133
let event_y = RelativeEvent::new(time, RelativeAxis::Y, *y as i32);
122134
let event_y: input_event = InputEvent::from(event_y).into();
123135
let sync = SynchronizeEvent::new(time, SynchronizeKind::Report, 0);
124136
let sync: input_event = InputEvent::from(sync).into();
125137
handle
126-
.write(&[event_x, event_y, sync])
138+
.write(&[reset_x, reset_y, rsync, event_x, event_y, sync])
127139
.map_err(|_| SimulateError)?;
128140
}
129141
EventType::Wheel { delta_x, delta_y } => {
130142
let time = Self::get_current_time();
131-
let event_x = RelativeEvent::new(time, RelativeAxis::Wheel, *delta_x as i32);
143+
let event_x =
144+
RelativeEvent::new(time, RelativeAxis::WheelHiRes, (*delta_x * 120) as i32);
132145
let event_x: input_event = InputEvent::from(event_x).into();
133-
let event_y = RelativeEvent::new(time, RelativeAxis::Wheel, *delta_y as i32);
146+
let event_y =
147+
RelativeEvent::new(time, RelativeAxis::WheelHiRes, (*delta_y * 120) as i32);
134148
let event_y: input_event = InputEvent::from(event_y).into();
135149
let sync = SynchronizeEvent::new(time, SynchronizeKind::Report, 0);
136150
let sync: input_event = InputEvent::from(sync).into();

src/linux/x11/grab.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ where
367367
add_device_to_epoll_from_inotify_event(epoll_fd, event, &mut devices)?;
368368
}
369369
} else {
370-
// Input device recieved event
370+
// Input device received event
371371
let device_idx = event.data as usize;
372372
let device = devices.get(device_idx).unwrap();
373373
while device.has_event_pending() {

tests/listen_and_simulate.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ fn sim_then_listen(events: &mut dyn Iterator<Item = EventType>) -> Result<(), Bo
3535
let recv = EVENT_CHANNEL.1.lock()?;
3636
for event in events {
3737
simulate(&event)?;
38-
let recieved_event = recv.recv_timeout(second).expect("No events to recieve");
39-
assert_eq!(recieved_event.event_type, event);
38+
let received_event = recv
39+
.recv_timeout(second)
40+
.expect(&format!("No events to receive {event:?}"));
41+
assert_eq!(received_event.event_type, event);
4042
}
4143
Ok(())
4244
}
@@ -47,10 +49,15 @@ fn test_listen_and_simulate() -> Result<(), Box<dyn Error>> {
4749
// wait for user input from keyboard to stop
4850
// (i.e. the return/enter keypress to run test command)
4951
thread::sleep(Duration::from_millis(50));
52+
// On wayland we need to open libuinput and the hooks take
53+
// some time to install, this forces the handle to get installed
54+
simulate(&EventType::MouseMove { x: 0.0, y: 0.0 })?;
55+
thread::sleep(Duration::from_millis(50));
5056

5157
let events = vec![
5258
//TODO: fix sending shift keypress events on linux
53-
//EventType::KeyPress(Key::ShiftLeft),
59+
EventType::KeyPress(Key::ShiftLeft),
60+
EventType::KeyRelease(Key::ShiftLeft),
5461
EventType::KeyPress(Key::KeyS),
5562
EventType::KeyRelease(Key::KeyS),
5663
EventType::ButtonPress(Button::Right),

0 commit comments

Comments
 (0)