50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
use nanoserde::{DeBin, SerBin};
|
|
use std::{io::Read, path::Path, sync::mpsc};
|
|
|
|
pub const DEFAULT_FIFO: &str = "/tmp/deerwm";
|
|
|
|
#[derive(PartialEq, Clone, Debug, DeBin, SerBin)]
|
|
pub enum Command {
|
|
Nothing,
|
|
Quit,
|
|
}
|
|
|
|
/// Starts a thread that recieves commands from the fifo specified.
|
|
pub fn command_reciever(fifo_path: &str) -> mpsc::Receiver<Command> {
|
|
let (tx, rx) = mpsc::channel();
|
|
|
|
// Open FIFO to listen for commands on
|
|
if Path::new(fifo_path).exists() {
|
|
std::fs::remove_file(fifo_path).unwrap();
|
|
}
|
|
unix_named_pipe::create(fifo_path, None).expect("failed to create fifo");
|
|
let mut cmd_fifo =
|
|
unix_named_pipe::open_read(fifo_path).expect("failed to open fifo for reading");
|
|
|
|
// Spawn the recieving thread
|
|
std::thread::spawn(move || {
|
|
let mut cmd_buf = [0; 256];
|
|
let mut quit = false;
|
|
while !quit {
|
|
// Read data from fifo
|
|
if let Ok(n) = cmd_fifo.read(&mut cmd_buf) {
|
|
// Do not bother trying to parse if there is no data
|
|
if n > 0 {
|
|
// Try to parse bytes into `Command`
|
|
// TODO: try to handle the case of more than one command being in the buffer???
|
|
if let Ok(cmd) = Command::de_bin(&mut 0, &cmd_buf[..n]) {
|
|
println!("Received: {:?}", cmd);
|
|
if cmd == Command::Quit {
|
|
quit = true;
|
|
}
|
|
|
|
tx.send(cmd).unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
rx
|
|
}
|