parent
33ac104836
commit
25eaa19998
3 changed files with 62 additions and 2 deletions
@ -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() |
||||
} |
Loading…
Reference in new issue