--- src/bin/vrec-daemon.rs +++ src/bin/vrec-daemon.rs @@ -1,13 +1,6 @@ -pub mod capture; -pub mod encoder; -pub mod ring; -pub mod muxer; -pub mod hotkey; -pub mod debug; - -use capture::{Frame, FrameSource}; -use encoder::VaapiEncoder; -use ring::Packet; -use muxer::Muxer; +use vrec::capture::{Frame, FrameSource}; +use vrec::encoder::VaapiEncoder; +use vrec::ring::Packet; +use vrec::muxer::Muxer; +use vrec::ipc::Command; use ringbuf::HeapRb; use ringbuf::traits::{RingBuffer, Consumer}; use crossbeam_channel::bounded; @@ -15,6 +8,9 @@ use std::env; +use std::os::unix::net::UnixListener; +use std::io::Read; #[tokio::main] async fn main() -> Result<(), Box> { let session_type = env::var("XDG_SESSION_TYPE").unwrap_or_else(|_| "x11".to_string()); @@ -23,10 +19,10 @@ let mut source: Box = if session_type.to_lowercase() == "wayland" { println!("Initializing Wayland capture..."); - Box::new(capture::wayland::WaylandCapture::new().await?) + Box::new(vrec::capture::wayland::WaylandCapture::new().await?) } else { println!("Initializing X11 capture..."); - Box::new(capture::x11::X11Capture::new()?) + Box::new(vrec::capture::x11::X11Capture::new()?) }; @@ -118,10 +114,35 @@ }); - // 5. Hotkey listener - println!("Starting hotkey listener..."); - if let Err(e) = hotkey::run_hotkey_listener(trigger_tx) { - eprintln!("Failed to start hotkey listener: {}", e); + // 5. IPC Unix Socket Listener + let socket_path = format!("{}/vrec.sock", env::var("XDG_RUNTIME_DIR").unwrap_or_else(|_| "/tmp".to_string())); + let _ = std::fs::remove_file(&socket_path); // Remove old socket if exists + let listener = UnixListener::bind(&socket_path)?; + println!("Daemon listening on IPC socket: {}", socket_path); + + for stream in listener.incoming() { + match stream { + Ok(mut stream) => { + let mut len_buf = [0u8; 4]; + if stream.read_exact(&mut len_buf).is_ok() { + let len = u32::from_le_bytes(len_buf) as usize; + let mut payload = vec![0u8; len]; + if stream.read_exact(&mut payload).is_ok() { + if let Ok(cmd) = serde_json::from_slice::(&payload) { + match cmd { + Command::SaveReplay => { + let _ = trigger_tx.try_send(()); + }, + Command::StopDaemon => { + break; + }, + _ => {} + } + } + } + } + } + Err(err) => { + eprintln!("Socket error: {}", err); + } + } }