Blame SOURCES/focus-a-window-when-starting.patch

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