diff --git a/Cargo.toml b/Cargo.toml index cfe97687..7d4ff3af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -97,6 +97,7 @@ features = [ "backend_drm", "backend_gbm", "backend_egl", + "backend_libei", "backend_libinput", "backend_session_libseat", "backend_udev", diff --git a/src/lib.rs b/src/lib.rs index f7282942..d0bf28b7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,6 +43,7 @@ pub mod dbus; pub mod debug; pub mod hooks; pub mod input; +pub mod libei; mod logger; pub mod session; pub mod shell; @@ -179,6 +180,8 @@ pub fn run(hooks: crate::hooks::Hooks) -> Result<(), Box> { // init backend backend::init_backend_auto(&display, &mut event_loop, &mut state)?; + libei::listen_eis(&event_loop.handle()); + if let Err(err) = theme::watch_theme(event_loop.handle()) { warn!(?err, "Failed to watch theme"); } diff --git a/src/libei.rs b/src/libei.rs new file mode 100644 index 00000000..c0c1ed3e --- /dev/null +++ b/src/libei.rs @@ -0,0 +1,46 @@ +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(); +}