Fix ConEvent deserialization issue

In a workspace Reload event, both current and old workspace are actually null.
timeout_old
Tassilo Horn 4 years ago
parent 47d47f47f5
commit dcfe4ccc99
  1. 8
      src/client.rs
  2. 8
      src/con.rs
  3. 21
      src/demon.rs
  4. 5
      src/ipc.rs

@ -54,11 +54,11 @@ pub fn exec_swayr_cmd(cmd: &SwayrCommand) {
} }
} }
fn focus_window_by_id(id: &ipc::Id) { fn focus_window_by_id(id: ipc::Id) {
util::swaymsg(&[format!("[con_id={}]", id).as_str(), "focus"]); util::swaymsg(&[format!("[con_id={}]", id).as_str(), "focus"]);
} }
fn quit_window_by_id(id: &ipc::Id) { fn quit_window_by_id(id: ipc::Id) {
util::swaymsg(&[format!("[con_id={}]", id).as_str(), "kill"]); util::swaymsg(&[format!("[con_id={}]", id).as_str(), "kill"]);
} }
@ -67,7 +67,7 @@ pub fn switch_window() {
let windows = con::get_windows(&root); let windows = con::get_windows(&root);
if let Some(window) = con::select_window("Switch to window", &windows) { if let Some(window) = con::select_window("Switch to window", &windows) {
focus_window_by_id(&window.get_id()) focus_window_by_id(window.get_id())
} }
} }
@ -94,7 +94,7 @@ pub fn switch_workspace_or_window() {
con::WsOrWin::Ws { ws } => { con::WsOrWin::Ws { ws } => {
util::swaymsg(&["workspace", "number", ws.get_name()]); util::swaymsg(&["workspace", "number", ws.get_name()]);
} }
con::WsOrWin::Win { win } => focus_window_by_id(&win.get_id()), con::WsOrWin::Win { win } => focus_window_by_id(win.get_id()),
} }
} }
} }

@ -39,8 +39,8 @@ pub struct Window<'a> {
} }
impl Window<'_> { impl Window<'_> {
pub fn get_id(&self) -> &ipc::Id { pub fn get_id(&self) -> ipc::Id {
&self.node.id self.node.id
} }
pub fn get_app_name(&self) -> &str { pub fn get_app_name(&self) -> &str {
@ -288,8 +288,8 @@ impl Workspace<'_> {
self.node.name.as_ref().unwrap() self.node.name.as_ref().unwrap()
} }
pub fn get_id(&self) -> &ipc::Id { pub fn get_id(&self) -> ipc::Id {
&self.node.id self.node.id
} }
pub fn is_scratchpad(&self) -> bool { pub fn is_scratchpad(&self) -> bool {

@ -53,10 +53,10 @@ fn update_last_focus_time(
} }
fn remove_con_props( fn remove_con_props(
id: &ipc::Id, id: ipc::Id,
con_props: Arc<RwLock<HashMap<ipc::Id, ipc::ConProps>>>, con_props: Arc<RwLock<HashMap<ipc::Id, ipc::ConProps>>>,
) { ) {
con_props.write().unwrap().remove(id); con_props.write().unwrap().remove(&id);
} }
fn handle_con_event( fn handle_con_event(
@ -72,7 +72,7 @@ fn handle_con_event(
update_last_focus_time(container.id, con_props) update_last_focus_time(container.id, con_props)
} }
ipc::WindowEventType::Close => { ipc::WindowEventType::Close => {
remove_con_props(&container.id, con_props) remove_con_props(container.id, con_props)
} }
_ => handled = false, _ => handled = false,
}, },
@ -82,12 +82,17 @@ fn handle_con_event(
old: _, old: _,
} => match change { } => match change {
ipc::WorkspaceEventType::Init | ipc::WorkspaceEventType::Focus => { ipc::WorkspaceEventType::Init | ipc::WorkspaceEventType::Focus => {
println!("WsEv"); update_last_focus_time(
update_last_focus_time(current.id, con_props) current
} .expect("No current in Init or Focus workspace event")
ipc::WorkspaceEventType::Empty => { .id,
remove_con_props(&current.id, con_props) con_props,
)
} }
ipc::WorkspaceEventType::Empty => remove_con_props(
current.expect("No current in Empty workspace event").id,
con_props,
),
_ => handled = false, _ => handled = false,
}, },
} }

@ -229,8 +229,9 @@ pub enum ConEvent {
}, },
WorkspaceEvent { WorkspaceEvent {
change: WorkspaceEventType, change: WorkspaceEventType,
current: Box<Node>, // On a reload event, current and old are both null.
// If the old was empty, it'll be killed => "old": null current: Option<Box<Node>>,
// If the old was empty, it'll be killed => "old": null.
old: Option<Box<Node>>, old: Option<Box<Node>>,
}, },
} }

Loading…
Cancel
Save