Forgot to add demon.rs; Make event recording work

timeout_old
Tassilo Horn 4 years ago
parent 33ac104836
commit 25eaa19998
  1. 2
      src/bin/swayrd.rs
  2. 59
      src/demon.rs
  3. 3
      src/ipc.rs

@ -14,7 +14,7 @@ fn main() {
let win_props_for_ev_handler = win_props.clone(); let win_props_for_ev_handler = win_props.clone();
let subscriber_handle = let subscriber_handle =
thread::spawn(|| demon::monitor_window_events(win_props_for_ev_handler)); thread::spawn(move || demon::monitor_window_events(win_props_for_ev_handler));
let subscriber_result = subscriber_handle.join(); let subscriber_result = subscriber_handle.join();
match subscriber_result { match subscriber_result {

@ -0,0 +1,59 @@
use crate::ipc;
use serde_json::Deserializer;
use std::collections::HashMap;
use std::process as proc;
use std::sync::Arc;
use std::sync::RwLock;
use std::time::{SystemTime, UNIX_EPOCH};
pub fn monitor_window_events(win_props: Arc<RwLock<HashMap<ipc::Id, ipc::WindowProps>>>) {
let child = proc::Command::new("swaymsg")
.arg("--monitor")
.arg("--raw")
.arg("-t")
.arg("subscribe")
.arg("[\"window\"]")
.stdout(proc::Stdio::piped())
.spawn()
.expect("Failed to subscribe to window events");
let stdout: std::process::ChildStdout = child.stdout.unwrap();
let stream = Deserializer::from_reader(stdout).into_iter::<ipc::WindowEvent>();
for res in stream {
match res {
Ok(win_ev) => handle_window_event(win_ev, win_props.clone()),
Err(err) => panic!("{:?}", err),
}
}
}
fn handle_window_event(
ev: ipc::WindowEvent,
win_props: Arc<RwLock<HashMap<ipc::Id, ipc::WindowProps>>>,
) {
match ev.change {
ipc::WindowEventType::Focus => {
let mut write_lock = win_props.write().unwrap();
if let Some(mut wp) = write_lock.get_mut(&ev.container.id) {
wp.last_focus_time = get_epoch_time_as_millis();
} else {
write_lock.insert(
ev.container.id,
ipc::WindowProps {
last_focus_time: get_epoch_time_as_millis(),
},
);
}
}
ipc::WindowEventType::Close => {
win_props.write().unwrap().remove(&ev.container.id);
}
_ => (),
}
}
fn get_epoch_time_as_millis() -> u128 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Couldn't get epoch time!")
.as_millis()
}

@ -215,7 +215,8 @@ pub struct WindowEvent {
pub container: Node, pub container: Node,
} }
#[derive(Debug)]
pub struct WindowProps { pub struct WindowProps {
/// Milliseconds since UNIX epoch. /// Milliseconds since UNIX epoch.
last_focus_time: u128, pub last_focus_time: u128,
} }

Loading…
Cancel
Save