diff options
author | Mathias Gumz <akira at fluxbox dot org> | 2011-02-24 15:55:55 (GMT) |
---|---|---|
committer | Mathias Gumz <akira at fluxbox dot org> | 2011-02-24 15:55:55 (GMT) |
commit | 4a161132c2aacdbe4a7039f3f73f870607b5bce0 (patch) | |
tree | 7695badf08e849f81f1492dadf4c7ef62dbf959d | |
parent | 09f99a4674a75a201effdc912d79a28c2dad4225 (diff) | |
download | fluxbox_paul-4a161132c2aacdbe4a7039f3f73f870607b5bce0.zip fluxbox_paul-4a161132c2aacdbe4a7039f3f73f870607b5bce0.tar.bz2 |
better solution for warping transient windows
see #3088856 / 09f99a4674a75a201effdc912d79a28c2dad4225.
at the moment this fix looks side-effect free, time will tell.
-rw-r--r-- | src/Window.cc | 2 | ||||
-rw-r--r-- | 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) { | |||
2455 | frame().height() + 2*frame().window().borderWidth()-1); | 2455 | frame().height() + 2*frame().window().borderWidth()-1); |
2456 | } | 2456 | } |
2457 | 2457 | ||
2458 | if (moved_x && screen().isWorkspaceWarping() && !isTransient() ) { | 2458 | if (moved_x && screen().isWorkspaceWarping()) { |
2459 | unsigned int cur_id = screen().currentWorkspaceID(); | 2459 | unsigned int cur_id = screen().currentWorkspaceID(); |
2460 | unsigned int new_id = cur_id; | 2460 | unsigned int new_id = cur_id; |
2461 | const int warpPad = screen().getEdgeSnapThreshold(); | 2461 | 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) { | |||
103 | if (w == 0) | 103 | if (w == 0) |
104 | return -1; | 104 | return -1; |
105 | 105 | ||
106 | if (w->isFocused() && still_alive) | 106 | // if w is focused and alive, remove the focus ... except if it |
107 | // is a transient window. removing the focus from such a window | ||
108 | // leads in a wild race between BScreen::reassociateWindow(), | ||
109 | // BScreen::changeWorkspaceID(), FluxboxWindow::focus() etc. which | ||
110 | // finally leads to crash. | ||
111 | if (w->isFocused() && !w->isTransient() && still_alive) | ||
107 | FocusControl::unfocusWindow(w->winClient(), true, true); | 112 | FocusControl::unfocusWindow(w->winClient(), true, true); |
108 | 113 | ||
109 | m_windowlist.remove(w); | 114 | m_windowlist.remove(w); |