diff -up mutter-3.14.4/src/core/display.c.initial-focus mutter-3.14.4/src/core/display.c --- mutter-3.14.4/src/core/display.c.initial-focus 2016-02-04 14:03:35.444859922 -0500 +++ mutter-3.14.4/src/core/display.c 2016-02-04 15:46:05.445776848 -0500 @@ -532,6 +532,7 @@ meta_display_open (void) MetaScreen *screen; int i; guint32 timestamp; + Window old_active_xwindow = None; /* A list of all atom names, so that we can intern them in one go. */ char *atom_names[] = { @@ -905,6 +906,11 @@ meta_display_open (void) display->screen = screen; + if (!meta_is_wayland_compositor ()) + meta_prop_get_window (display, display->screen->xroot, + display->atom__NET_ACTIVE_WINDOW, + &old_active_xwindow); + meta_screen_init_workspaces (screen); enable_compositor (display); @@ -921,44 +927,17 @@ meta_display_open (void) */ if (!meta_is_wayland_compositor ()) meta_screen_manage_all_windows (screen); - - { - Window focus; - int ret_to; - - /* kinda bogus because GetInputFocus has no possible errors */ - meta_error_trap_push (display); - - /* FIXME: This is totally broken; see comment 9 of bug 88194 about this */ - focus = None; - ret_to = RevertToPointerRoot; - XGetInputFocus (display->xdisplay, &focus, &ret_to); - - /* Force a new FocusIn (does this work?) */ - - /* Use the same timestamp that was passed to meta_screen_new(), - * as it is the most recent timestamp. - */ - if (focus == None || focus == PointerRoot) - /* Just focus the no_focus_window on the first screen */ - meta_display_focus_the_no_focus_window (display, - display->screen, - timestamp); - else - { - MetaWindow * window; - window = meta_display_lookup_x_window (display, focus); - if (window) - meta_display_set_input_focus_window (display, window, FALSE, timestamp); - else - /* Just focus the no_focus_window on the first screen */ - meta_display_focus_the_no_focus_window (display, - display->screen, - timestamp); - } - - meta_error_trap_pop (display); - } + + if (old_active_xwindow != None) + { + MetaWindow *old_active_window = meta_display_lookup_x_window (display, old_active_xwindow); + if (old_active_window) + meta_window_focus (old_active_window, timestamp); + else + meta_display_focus_the_no_focus_window (display, display->screen, timestamp); + } + else + meta_display_focus_the_no_focus_window (display, display->screen, timestamp); meta_idle_monitor_init_dbus (); @@ -2047,6 +2026,9 @@ meta_display_update_active_window_hint ( { gulong data[1]; + if (display->closing) + return; /* Leave old value for a replacement */ + if (display->focus_window) data[0] = display->focus_window->xwindow; else