|
| 1 | +use reis::calloop::EisListenerSource; |
| 2 | +use reis::eis; |
| 3 | +use smithay::reexports::reis; |
| 4 | + |
| 5 | +use smithay::backend::libei::{EiInput, EiInputEvent}; |
| 6 | +use smithay::input::keyboard::XkbConfig; |
| 7 | +use smithay::reexports::calloop; |
| 8 | + |
| 9 | +use crate::state::State; |
| 10 | + |
| 11 | +pub fn listen_eis(handle: &calloop::LoopHandle<'static, State>) { |
| 12 | + let listener = match eis::Listener::bind_auto() { |
| 13 | + Ok(listener) => listener, |
| 14 | + Err(err) => { |
| 15 | + tracing::error!("Failed to bind EI listener socket: {}", err); |
| 16 | + return; |
| 17 | + } |
| 18 | + }; |
| 19 | + |
| 20 | + unsafe { std::env::set_var("LIBEI_SOCKET", listener.path()) }; |
| 21 | + |
| 22 | + let listener_source = EisListenerSource::new(listener); |
| 23 | + let handle_clone = handle.clone(); |
| 24 | + handle |
| 25 | + .insert_source(listener_source, move |context, _, _| { |
| 26 | + let source = EiInput::new(context); |
| 27 | + handle_clone |
| 28 | + .insert_source(source, |event, connection, data| match event { |
| 29 | + EiInputEvent::Connected => { |
| 30 | + let seat = connection.add_seat("default"); |
| 31 | + // TODO config |
| 32 | + let _ = seat.add_keyboard("virtual keyboard", XkbConfig::default()); |
| 33 | + seat.add_pointer("virtual pointer"); |
| 34 | + seat.add_pointer_absolute("virtual absoulte pointer"); |
| 35 | + seat.add_touch("virtual touch"); |
| 36 | + } |
| 37 | + EiInputEvent::Disconnected => {} |
| 38 | + EiInputEvent::Event(event) => { |
| 39 | + data.process_input_event(event); |
| 40 | + } |
| 41 | + }) |
| 42 | + .unwrap(); |
| 43 | + Ok(calloop::PostAction::Continue) |
| 44 | + }) |
| 45 | + .unwrap(); |
| 46 | +} |
0 commit comments