From bcc817382addf2d60b5ba0f76c25bd44fe8c828c Mon Sep 17 00:00:00 2001 From: tcmal Date: Wed, 28 Aug 2024 21:34:33 +0100 Subject: Fix issues when currently focused window is killed --- src/clients/mod.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src/clients') diff --git a/src/clients/mod.rs b/src/clients/mod.rs index 47eb094..dcce37a 100644 --- a/src/clients/mod.rs +++ b/src/clients/mod.rs @@ -16,7 +16,7 @@ use xcb::{ GetWindowAttributes, InputFocus, MapRequestEvent, PropMode, SetInputFocus, UnmapNotifyEvent, Window, }, - xinerama, Extension, + xinerama, BaseEvent, Extension, }; pub use client::*; @@ -118,10 +118,19 @@ impl WM<'_> { /// When a window is unmapped, update its state. pub(crate) fn handle_unmap_notify(&mut self, e: &UnmapNotifyEvent) { - if let Some(c) = self.clients.find_client_mut(e.window()) { - let cookie = c.set_withdrawn(&self.conn, true); - // The above may fail if the window has already been destroyed - just discard the error here. - let _ = self.conn.check_request(cookie); + if !e.is_from_send_event() { + if let Some(c) = self.clients.find_client_mut(e.window()) { + let cookie = c.set_withdrawn(&self.conn, true); + // The above may fail if the window has already been destroyed - just discard the error here. + let _ = self.conn.check_request(cookie); + } + if self + .clients + .focused() + .is_some_and(|c| c.window() == e.window()) + { + self.clients.unfocus_destroyed(); + } } } } @@ -263,6 +272,13 @@ impl ClientState { old.set_border(conn, conn.colours.border_normal()); buttons::grab(conn, old.window(), false); } + self.focused_client = None; + } + + /// Unfocus the currently focused window, if it exists, without doing any of the X11 parts. + /// This is used when a focused window is destroyed or unmapped + pub fn unfocus_destroyed(&mut self) { + self.focused_client = None; } /// Go to the next or previous window in the current monitor, looping around if needed -- cgit v1.2.3