// SPDX-License-Identifier: GPL-3.0-only /* * Copyright (c) 2024, Richard Acayan. All rights reserved. */ extern crate polling; mod wayland; mod core; use core::Layout; use polling::Event; use polling::Events; use polling::Poller; use std::path::Path; use std::time::Instant; use wayland::Dispatcher; use wayland::wayland_client::Connection; use wayland::wayland_client::globals; fn main() { let conn = 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(); let wl_evt = Event::readable(0); let poller = Poller::new().unwrap(); let mut events = Events::new(); loop { queue.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() { guard.read().unwrap(); queue.dispatch_pending(&mut dispatcher).unwrap(); } dispatcher.dispatch_timers(); } }