summaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/window.c b/src/window.c
index 5af689ce..ab9cfff5 100644
--- a/src/window.c
+++ b/src/window.c
@@ -967,6 +967,8 @@ meta_window_free (MetaWindow *window)
if (window->display->focus_window == window)
window->display->focus_window = NULL;
+ if (window->display->previously_focused_window == window)
+ window->display->previously_focused_window = NULL;
meta_window_unqueue_calc_showing (window);
meta_window_unqueue_move_resize (window);
@@ -4022,7 +4024,29 @@ meta_window_client_message (MetaWindow *window,
event->xclient.data.l[0]);
if (event->xclient.data.l[0] == IconicState &&
window->has_minimize_func)
- meta_window_minimize (window);
+ {
+ meta_window_minimize (window);
+
+ /* If the window being minimized was the one with focus,
+ * then we should focus a new window. We often receive this
+ * wm_change_state message when a user has clicked on the
+ * tasklist on the panel; in those cases, the current
+ * focus_window is the panel, but the previous focus_window
+ * will have been this one. This is a special case where we
+ * need to manually handle focusing a new window because
+ * meta_window_minimize will get it wrong.
+ */
+ if (window->display->focus_window &&
+ (window->display->focus_window->type == META_WINDOW_DOCK ||
+ window->display->focus_window->type == META_WINDOW_DESKTOP) &&
+ window->display->previously_focused_window == window)
+ {
+ meta_topic (META_DEBUG_FOCUS,
+ "Focusing default window because of minimization of former focus window %s, which was due to a wm_change_state client message\n",
+ window->desc);
+ meta_workspace_focus_default_window (window->screen->active_workspace, window);
+ }
+ }
return TRUE;
}
@@ -4397,6 +4421,8 @@ meta_window_notify_focus (MetaWindow *window,
meta_topic (META_DEBUG_FOCUS,
"* Focus --> NULL (was %s)\n", window->desc);
+ window->display->previously_focused_window =
+ window->display->focus_window;
window->display->focus_window = NULL;
window->has_focus = FALSE;
if (window->frame)