summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Frydrych <tf@linux.intel.com>2009-08-08 17:59:01 +0100
committerThomas Thurman <tthurman@gnome.org>2010-05-02 11:46:51 -0400
commitb272c4ca7f3a784d011eea5c3fd348011f8558b3 (patch)
treeb21ac4a89db7e9c6d854d2ace1554d34ed797bd7 /src
parentf7e4514b76f7204bf86c545995ce0cfb2a461e87 (diff)
downloadmetacity-b272c4ca7f3a784d011eea5c3fd348011f8558b3.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/core/window.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/core/window.c b/src/core/window.c
index ebbb0472..9af5283d 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 */