diff --git a/src/backend/wayland/consumer.rs b/src/backend/wayland/consumer.rs index a094bfb..e511599 100644 --- a/src/backend/wayland/consumer.rs +++ b/src/backend/wayland/consumer.rs @@ -95,19 +95,25 @@ impl App { let keyboard: Vk = self.vkm.create_virtual_keyboard(&self.seat, &self.qh, ()); // receive keymap from device - eprintln!("connecting to {}", client.addr); - + eprint!("\rconnecting to {} ", client.addr); + let mut attempts = 0; let data = loop { - match request::request_data(client.addr, Request::KeyMap) { - Some(data) => break data, - None => { - eprint!("."); - io::stderr().flush().unwrap(); - thread::sleep(Duration::from_millis(500)); - } + let result = request::request_data(client.addr, Request::KeyMap); + eprint!("\rconnecting to {} ", client.addr); + for _ in 0..attempts { eprint!("."); } + match result { + Ok(data) => break data, + Err(e) => { eprint!(" - {}", e); } } + io::stderr().flush().unwrap(); + thread::sleep(Duration::from_millis(500)); + attempts += 1; }; + eprint!("\rconnecting to {} ", client.addr); + for _ in 0..attempts { eprint!("."); } + eprintln!(" done! "); + // TODO use shm_open let f = tempfile::tempfile().unwrap(); let mut buf = BufWriter::new(&f); diff --git a/src/request.rs b/src/request.rs index 082f473..dc37481 100644 --- a/src/request.rs +++ b/src/request.rs @@ -4,7 +4,7 @@ use std::{ io::prelude::*, net::{SocketAddr, TcpListener, TcpStream}, sync::{Arc, RwLock}, - thread::{self, JoinHandle}, + thread::{self, JoinHandle}, fmt::Display, }; use memmap::Mmap; @@ -83,47 +83,51 @@ impl Server { } } -pub fn request_data(addr: SocketAddr, req: Request) -> Option> { +#[derive(Debug)] +pub struct BadRequest; + +impl Display for BadRequest { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "BadRequest") + } +} + +impl Error for BadRequest {} + +pub fn request_data(addr: SocketAddr, req: Request) -> Result, Box> { // connect to server let mut sock = match TcpStream::connect(addr) { Ok(sock) => sock, - Err(e) => { - eprintln!("{}", e); - return None; - } + Err(e) => return Err(Box::new(e)), }; // write the request to the socket // convert to u32 let req: u32 = req as u32; if let Err(e) = sock.write(&req.to_ne_bytes()) { - eprintln!("{}", e); - return None; + return Err(Box::new(e)); } if let Err(e) = sock.flush() { - eprintln!("{}", e); - return None; + return Err(Box::new(e)); } // read the response = (len, data) - len 0 means no data / bad request // read len let mut buf = [0u8; 8]; if let Err(e) = sock.read_exact(&mut buf[..]) { - eprintln!("{}", e); - return None; + return Err(Box::new(e)); } let len = usize::from_ne_bytes(buf); // check for bad request if len == 0 { - return None; + return Err(Box::new(BadRequest{})); } // read the data let mut data: Vec = vec![0u8; len]; if let Err(e) = sock.read_exact(&mut data[..]) { - eprintln!("{}", e); - return None; + return Err(Box::new(e)); } - Some(data) + Ok(data) }