mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-12 07:40:55 +03:00
Previously when the output buffer was overwhelmed, additional events were submitted until the outgoing buffer filled up, which causes the wayland-connection to 'break' and not accept further attempts to flush() the socket.
58 lines
1.6 KiB
Rust
58 lines
1.6 KiB
Rust
use std::ptr;
|
|
use x11::{xlib, xtest};
|
|
|
|
use crate::{
|
|
client::ClientHandle,
|
|
event::Event, consumer::EventConsumer,
|
|
};
|
|
|
|
pub struct X11Consumer {
|
|
display: *mut xlib::Display,
|
|
}
|
|
|
|
impl X11Consumer {
|
|
pub fn new() -> Self {
|
|
let display = unsafe {
|
|
match xlib::XOpenDisplay(ptr::null()) {
|
|
d if d == ptr::null::<xlib::Display>() as *mut xlib::Display => None,
|
|
display => Some(display),
|
|
}
|
|
};
|
|
let display = display.expect("could not open display");
|
|
Self { display }
|
|
}
|
|
|
|
fn relative_motion(&self, dx: i32, dy: i32) {
|
|
unsafe {
|
|
xtest::XTestFakeRelativeMotionEvent(self.display, dx, dy, 0, 0);
|
|
xlib::XFlush(self.display);
|
|
}
|
|
}
|
|
}
|
|
|
|
impl EventConsumer for X11Consumer {
|
|
fn consume(&mut self, event: Event, _: ClientHandle) {
|
|
match event {
|
|
Event::Pointer(pointer_event) => match pointer_event {
|
|
crate::event::PointerEvent::Motion {
|
|
time: _,
|
|
relative_x,
|
|
relative_y,
|
|
} => {
|
|
self.relative_motion(relative_x as i32, relative_y as i32);
|
|
}
|
|
crate::event::PointerEvent::Button { .. } => {}
|
|
crate::event::PointerEvent::Axis { .. } => {}
|
|
crate::event::PointerEvent::Frame {} => {}
|
|
},
|
|
Event::Keyboard(_) => {}
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
fn notify(&mut self, _: crate::client::ClientEvent) {
|
|
// for our purposes it does not matter what client sent the event
|
|
}
|
|
}
|
|
|