From 4a161132c2aacdbe4a7039f3f73f870607b5bce0 Mon Sep 17 00:00:00 2001 From: Mathias Gumz Date: Thu, 24 Feb 2011 16:55:55 +0100 Subject: better solution for warping transient windows see #3088856 / 09f99a4674a75a201effdc912d79a28c2dad4225. at the moment this fix looks side-effect free, time will tell. --- src/Window.cc | 2 +- src/Workspace.cc | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Window.cc b/src/Window.cc index e5e9f37..51a66df 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2455,7 +2455,7 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { frame().height() + 2*frame().window().borderWidth()-1); } - if (moved_x && screen().isWorkspaceWarping() && !isTransient() ) { + if (moved_x && screen().isWorkspaceWarping()) { unsigned int cur_id = screen().currentWorkspaceID(); unsigned int new_id = cur_id; const int warpPad = screen().getEdgeSnapThreshold(); diff --git a/src/Workspace.cc b/src/Workspace.cc index 3da8162..a162b4c 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -103,7 +103,12 @@ int Workspace::removeWindow(FluxboxWindow *w, bool still_alive) { if (w == 0) return -1; - if (w->isFocused() && still_alive) + // if w is focused and alive, remove the focus ... except if it + // is a transient window. removing the focus from such a window + // leads in a wild race between BScreen::reassociateWindow(), + // BScreen::changeWorkspaceID(), FluxboxWindow::focus() etc. which + // finally leads to crash. + if (w->isFocused() && !w->isTransient() && still_alive) FocusControl::unfocusWindow(w->winClient(), true, true); m_windowlist.remove(w); -- cgit v0.11.2