This commit is contained in:
Schrottkatze 2026-08-31 15:10:20 +02:00
commit d506f48b6f
2 changed files with 14 additions and 31 deletions

View file

@ -39,6 +39,7 @@ in
pkgs.typst pkgs.typst
# `typed` dependencies # `typed` dependencies
pkgs.zathura
pkgs.mupdf pkgs.mupdf
pkgs.inotify-tools pkgs.inotify-tools
]; ];

View file

@ -1,8 +1,10 @@
#![feature(lock_value_accessors)] #![feature(lock_value_accessors)]
use std::{ use std::{
fs,
hint::spin_loop,
io, io,
path::Path, path::Path,
process::{Command, exit}, process::{Command, Stdio, exit},
sync::{ sync::{
Arc, Condvar, Mutex, Arc, Condvar, Mutex,
atomic::{AtomicBool, AtomicU32, Ordering}, atomic::{AtomicBool, AtomicU32, Ordering},
@ -48,14 +50,22 @@ fn main() -> std::io::Result<()> {
let pdf_path_ = pdf_path.clone(); let pdf_path_ = pdf_path.clone();
let mupdf_pid_ = Arc::clone(&mupdf_pid); 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(); let pair_mupdf = pair.clone();
thread::spawn(move || { thread::spawn(move || {
let mut mupdf = Command::new(&viewer); let mut mupdf = Command::new(&viewer);
mupdf.arg(&pdf_path_); mupdf
.arg(&pdf_path_)
.stdout(Stdio::null())
.stderr(Stdio::null());
loop { loop {
if !fs::exists(&pdf_path_).unwrap() {
spin_loop();
continue;
}
let Ok(mut mupdf) = mupdf.spawn() else { let Ok(mut mupdf) = mupdf.spawn() else {
break; 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::<notify::Result<Event>>();
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? // the editor?
let pair_editor = pair.clone(); let pair_editor = pair.clone();
let editor_pid_ = editor_pid.clone(); let editor_pid_ = editor_pid.clone();