On Phosh, the EWOULDBLOCK error may be emitted when reading from the Wayland socket, which is not fatal. Ignore errors encountered while reading, as fatal errors would be emitted by other operations in the main loop.
67 lines
1.7 KiB
Rust
67 lines
1.7 KiB
Rust
// 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::path::Path;
|
|
use std::time::Instant;
|
|
use wayland_client::globals;
|
|
|
|
pub struct VisibilityManager();
|
|
|
|
impl VisibilityManager {
|
|
pub fn set_visible(&self, _visible: bool)
|
|
{
|
|
unreachable!();
|
|
}
|
|
}
|
|
|
|
fn main()
|
|
{
|
|
let conn = wayland_client::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 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();
|
|
}
|
|
}
|