unfettered-keyboard/src/main.rs
2024-07-18 20:32:55 -04:00

59 lines
1.6 KiB
Rust

// 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::<Dispatcher>(&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();
}
}