diff --git a/modules/media/typst.nix b/modules/media/typst.nix index 59c6638..ef8a024 100644 --- a/modules/media/typst.nix +++ b/modules/media/typst.nix @@ -39,6 +39,7 @@ in pkgs.typst # `typed` dependencies + pkgs.zathura pkgs.mupdf pkgs.inotify-tools ]; diff --git a/programs/typed/src/main.rs b/programs/typed/src/main.rs index 32a3e7b..bcb7e0c 100644 --- a/programs/typed/src/main.rs +++ b/programs/typed/src/main.rs @@ -1,8 +1,10 @@ #![feature(lock_value_accessors)] use std::{ + fs, + hint::spin_loop, io, path::Path, - process::{Command, exit}, + process::{Command, Stdio, exit}, sync::{ Arc, Condvar, Mutex, atomic::{AtomicBool, AtomicU32, Ordering}, @@ -48,14 +50,22 @@ fn main() -> std::io::Result<()> { let pdf_path_ = pdf_path.clone(); let mupdf_pid_ = Arc::clone(&mupdf_pid); - let viewer = args.viewer.unwrap_or("mupdf-x11".to_string()); + let viewer = args.viewer.unwrap_or("zathura".to_string()); let pair_mupdf = pair.clone(); thread::spawn(move || { let mut mupdf = Command::new(&viewer); - mupdf.arg(&pdf_path_); + mupdf + .arg(&pdf_path_) + .stdout(Stdio::null()) + .stderr(Stdio::null()); loop { + if !fs::exists(&pdf_path_).unwrap() { + spin_loop(); + continue; + } + let Ok(mut mupdf) = mupdf.spawn() else { break; }; @@ -75,34 +85,6 @@ fn main() -> std::io::Result<()> { } }); - let pdf_path_ = pdf_path.clone(); - let mupdf_pid_ = Arc::clone(&mupdf_pid); - thread::spawn(move || { - let (tx, rx) = channel::>(); - let mut watcher = notify::recommended_watcher(tx).unwrap(); - - let _ = watcher.watch(Path::new(&pdf_path_), RecursiveMode::NonRecursive); - - loop { - let p = rx.recv(); - - match p { - Ok(Ok(e)) if e.kind.is_modify() || e.kind.is_create() => { - let mupdf_pid = mupdf_pid_.load(Ordering::Relaxed); - if mupdf_pid != 0 { - let mut kill = Command::new("kill"); - - let _ = kill.arg("-1").arg(mupdf_pid.to_string()).spawn(); - } - } - Ok(Ok(e)) if e.kind.is_remove() => { - let _ = watcher.watch(Path::new(&pdf_path_), RecursiveMode::NonRecursive); - } - _ => {} - } - } - }); - // the editor? let pair_editor = pair.clone(); let editor_pid_ = editor_pid.clone();