diff --git a/Cargo.toml b/Cargo.toml index b396ede..98fb852 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,10 @@ bindgen = "0.69.4" name = "ufkbd-gnome" path = "src/ufkbd_gnome.rs" +[[bin]] +name = "ufkbd-sxmo" +path = "src/ufkbd_sxmo.rs" + [[bin]] name = "ufkbd-wl" path = "src/ufkbd_wl.rs" diff --git a/src/ufkbd_sxmo.rs b/src/ufkbd_sxmo.rs new file mode 100644 index 0000000..433809e --- /dev/null +++ b/src/ufkbd_sxmo.rs @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Copyright (c) 2024, Richard Acayan. All rights reserved. + */ + +mod core; +mod wayland; + +use crate::core::Layout; +use crate::wayland::Dispatcher; +use polling::Event; +use polling::Events; +use polling::Poller; +use std::mem; +use std::path::Path; +use std::time::Instant; +use wayland_client::globals; + +pub struct VisibilityManager(); + +impl VisibilityManager { + pub fn set_visible(&self, _visible: bool) + { + // SXMO manages visibility + } +} + +fn main() +{ + let conn = wayland_client::Connection::connect_to_env().unwrap(); + + let (globals, mut queue) = globals::registry_queue_init::(&conn) + .expect("Registry required"); + + let layouts = Path::new("/usr/share/unfettered-keyboard/layouts"); + let layout = Layout::load(layouts, "latn_qwerty_us.xml") + .expect("Layout should be loadable"); + let mut dispatcher = Dispatcher::new(layout, queue.handle(), &globals).unwrap(); + dispatcher.set_osk(VisibilityManager()); + + let gfx = dispatcher.graphics(); + let mut gfx = gfx.lock().unwrap(); + gfx.display_mut().show(); + mem::drop(gfx); + + let wl_evt = Event::readable(0); + + let mut events = Events::new(); + let poller = Poller::new().unwrap(); + + loop { + conn.flush().unwrap(); + + let guard = queue.prepare_read().unwrap(); + let fd = guard.connection_fd(); + let timer = dispatcher.button().next_time().map(|t| t - Instant::now()); + + unsafe { + poller.add(&fd, wl_evt).unwrap(); + } + + events.clear(); + poller.wait(&mut events, timer).unwrap(); + poller.delete(fd).unwrap(); + + if !events.is_empty() { + // This may still emit EWOULDBLOCK errors. + let _ = guard.read(); + queue.dispatch_pending(&mut dispatcher).unwrap(); + } + + dispatcher.dispatch_timers(); + } +}