[metacity] Use correct timestamp for focus stealing prevention



commit b272c4ca7f3a784d011eea5c3fd348011f8558b3
Author: Tomas Frydrych <tf linux intel com>
Date:   Sat Aug 8 17:59:01 2009 +0100

    Use correct timestamp for focus stealing prevention
    
    When window initially maps, use the more recent of NET_WM_USER_TIME and
    startup notification timestamps to compare against last known user action to
    decide whether to focus the window or not. Once we show the window, clear
    the initial_timestamp_set flag, so the startup notification timestamp is not
    taken into account again.
    
    Based on patch for metacity by Alexander Larsson
    
    http://bugzilla.gnome.org/show_bug.cgi?id=573922

 src/core/window.c |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index ebbb047..9af5283 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -1881,13 +1881,22 @@ intervening_user_event_occurred (MetaWindow *window)
   /* To determine the "launch" time of an application,
    * startup-notification can set the TIMESTAMP and the
    * application (usually via its toolkit such as gtk or qt) can
-   * set the _NET_WM_USER_TIME.  If both are set, then it means
-   * the user has interacted with the application since it
-   * launched, and _NET_WM_USER_TIME is the value that should be
-   * used in the comparison.
+   * set the _NET_WM_USER_TIME.  If both are set, we need to be
+   * using the newer of the two values.
+   *
+   * See http://bugzilla.gnome.org/show_bug.cgi?id=573922
    */
-  compare = window->initial_timestamp_set ? window->initial_timestamp : 0;
-  compare = window->net_wm_user_time_set  ? window->net_wm_user_time  : compare;
+  compare = 0;
+  if (window->net_wm_user_time_set &&
+      window->initial_timestamp_set)
+    compare =
+      XSERVER_TIME_IS_BEFORE (window->net_wm_user_time,
+                              window->initial_timestamp) ?
+      window->initial_timestamp : window->net_wm_user_time;
+  else if (window->net_wm_user_time_set)
+    compare = window->net_wm_user_time;
+  else if (window->initial_timestamp_set)
+    compare = window->initial_timestamp;
 
   if ((focus_window != NULL) &&
       XSERVER_TIME_IS_BEFORE (compare, focus_window->net_wm_user_time))
@@ -2325,6 +2334,15 @@ meta_window_show (MetaWindow *window)
                   window->desc);
       invalidate_work_areas (window);
     }
+
+  /*
+   * Now that we have shown the window, we no longer want to consider the
+   * initial timestamp in any subsequent deliberations whether to focus this
+   * window or not, so clear the flag.
+   *
+   * See http://bugzilla.gnome.org/show_bug.cgi?id=573922
+   */
+  window->initial_timestamp_set = FALSE;
 }
 
 /* XXX META_EFFECT_*_UNMAP */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]