47 lines
1.7 KiB
Rust
47 lines
1.7 KiB
Rust
|
|
use reis::calloop::EisListenerSource;
|
||
|
|
use reis::eis;
|
||
|
|
use smithay::reexports::reis;
|
||
|
|
|
||
|
|
use smithay::backend::libei::{EiInput, EiInputEvent};
|
||
|
|
use smithay::input::keyboard::XkbConfig;
|
||
|
|
use smithay::reexports::calloop;
|
||
|
|
|
||
|
|
use crate::state::State;
|
||
|
|
|
||
|
|
pub fn listen_eis(handle: &calloop::LoopHandle<'static, State>) {
|
||
|
|
let listener = match eis::Listener::bind_auto() {
|
||
|
|
Ok(listener) => listener,
|
||
|
|
Err(err) => {
|
||
|
|
tracing::error!("Failed to bind EI listener socket: {}", err);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
unsafe { std::env::set_var("LIBEI_SOCKET", listener.path()) };
|
||
|
|
|
||
|
|
let listener_source = EisListenerSource::new(listener);
|
||
|
|
let handle_clone = handle.clone();
|
||
|
|
handle
|
||
|
|
.insert_source(listener_source, move |context, _, _| {
|
||
|
|
let source = EiInput::new(context);
|
||
|
|
handle_clone
|
||
|
|
.insert_source(source, |event, connection, data| match event {
|
||
|
|
EiInputEvent::Connected => {
|
||
|
|
let seat = connection.add_seat("default");
|
||
|
|
// TODO config
|
||
|
|
let _ = seat.add_keyboard("virtual keyboard", XkbConfig::default());
|
||
|
|
seat.add_pointer("virtual pointer");
|
||
|
|
seat.add_pointer_absolute("virtual absoulte pointer");
|
||
|
|
seat.add_touch("virtual touch");
|
||
|
|
}
|
||
|
|
EiInputEvent::Disconnected => {}
|
||
|
|
EiInputEvent::Event(event) => {
|
||
|
|
data.process_input_event(event);
|
||
|
|
}
|
||
|
|
})
|
||
|
|
.unwrap();
|
||
|
|
Ok(calloop::PostAction::Continue)
|
||
|
|
})
|
||
|
|
.unwrap();
|
||
|
|
}
|