/* Polydoro - Pomodoro widget for polybar and friends * Copyright (C) 2025 Vidhu Kant Sharma * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ use std::os::unix::net::UnixListener; use std::io::{BufRead, BufReader}; use std::thread; use std::sync::mpsc::Sender; pub enum Command { Run, Pause, Toggle, // conditional run/pause Skip, SoftReset, HardReset, Reset, // conditional soft/hard reset Notify, // toggle notifications on/off } pub fn start_command_listener(tx: Sender) -> thread::JoinHandle<()> { thread::spawn(move || { // check if a socket already exists (only one daemon allowed!) let sock = "/tmp/polydorocmd.sock"; if std::fs::metadata(sock).is_ok() { eprintln!("socket {} already exists, is another daemon running?", sock); std::process::exit(1); } // all OK, create a sock let listener = UnixListener::bind(sock).expect("failed to bind socket /tmp/polydorocmd.sock"); for stream in listener.incoming() { match stream { Ok(s) => { let mut reader = BufReader::new(s); let mut buf = String::new(); if let Ok(_) = reader.read_line(&mut buf) { let msg = match buf.trim() { "run" => Command::Run, "pause" => Command::Pause, "toggle" => Command::Toggle, "skip" => Command::Skip, "soft-reset" => Command::SoftReset, "hard-reset" => Command::HardReset, "reset" => Command::Reset, "notify" => Command::Notify, &_ => Command::Run, // doesn't matter, pretty sure it won't ever hit this case }; let _ = tx.send(msg).unwrap(); } }, Err(_) => {} } } }) }