diff options
author | Tomas Frydrych <tf@linux.intel.com> | 2009-08-08 17:59:01 +0100 |
---|---|---|
committer | Thomas Thurman <tthurman@gnome.org> | 2010-05-02 11:46:51 -0400 |
commit | b272c4ca7f3a784d011eea5c3fd348011f8558b3 (patch) | |
tree | b21ac4a89db7e9c6d854d2ace1554d34ed797bd7 /src | |
parent | f7e4514b76f7204bf86c545995ce0cfb2a461e87 (diff) | |
download | metacity-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.c | 30 |
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 */ |