More thorough handling of source indication. Part of #326041.

2006-01-09  Elijah Newren  <newren@gmail.com>

	More thorough handling of source indication.  Part of #326041.

	* src/window.c (window_activate): new function based off the old
	meta_window_activate but which also takes source indication into
	account, (meta_window_active): just call window_activate() with
	the necessary source indication to get the behavior wanted,
	(meta_window_client_message): check source indication too for
	_net_active_window messages

	* src/window.h (enum MetaClientType): convenience enum for source
	indication handling
This commit is contained in:
Elijah Newren 2006-01-10 05:44:40 +00:00 committed by Elijah Newren
parent 0f8add8b37
commit a4d1c6fd61
3 changed files with 73 additions and 26 deletions

View File

@ -1,3 +1,17 @@
2006-01-09 Elijah Newren <newren@gmail.com>
More thorough handling of source indication. Part of #326041.
* src/window.c (window_activate): new function based off the old
meta_window_activate but which also takes source indication into
account, (meta_window_active): just call window_activate() with
the necessary source indication to get the behavior wanted,
(meta_window_client_message): check source indication too for
_net_active_window messages
* src/window.h (enum MetaClientType): convenience enum for source
indication handling
2006-01-09 Elijah Newren <newren@gmail.com> 2006-01-09 Elijah Newren <newren@gmail.com>
Make the taskbar less flash happy and fix up some related stacking Make the taskbar less flash happy and fix up some related stacking

View File

@ -2354,19 +2354,28 @@ unminimize_window_and_all_transient_parents (MetaWindow *window)
meta_window_foreach_ancestor (window, unminimize_func, NULL); meta_window_foreach_ancestor (window, unminimize_func, NULL);
} }
void static void
meta_window_activate (MetaWindow *window, window_activate (MetaWindow *window,
guint32 timestamp) guint32 timestamp,
MetaClientType source_indication)
{ {
gboolean can_ignore_outdated_timestamps;
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"_NET_ACTIVE_WINDOW message sent for %s at time %lu.\n", "_NET_ACTIVE_WINDOW message sent for %s at time %lu "
window->desc, (unsigned long)timestamp); "by client type %u.\n",
window->desc, (unsigned long)timestamp, source_indication);
/* Older EWMH spec didn't specify a timestamp, so it can be 0 and we /* Older EWMH spec didn't specify a timestamp; we decide to honor these only
* have to treat that as a new request. * if the app specifies that it is a pager.
*
* Update: Unconditionally honor 0 timestamps for now; we'll fight
* that battle later. Just remove the "FALSE &&" in order to only
* honor 0 timestamps for pagers.
*/ */
can_ignore_outdated_timestamps =
(timestamp != 0 || (FALSE && source_indication != META_CLIENT_TYPE_PAGER));
if (XSERVER_TIME_IS_BEFORE (timestamp, window->display->last_user_time) && if (XSERVER_TIME_IS_BEFORE (timestamp, window->display->last_user_time) &&
timestamp != 0) can_ignore_outdated_timestamps)
{ {
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"last_user_time (%lu) is more recent; ignoring " "last_user_time (%lu) is more recent; ignoring "
@ -2377,8 +2386,12 @@ meta_window_activate (MetaWindow *window,
return; return;
} }
if (timestamp == 0) /* For those stupid pagers, get a valid timestamp and show a warning */
if (timestamp == 0) {
meta_warning ("meta_window_activate called by a pager with a 0 timestamp; "
"the pager needs to be fixed.\n");
timestamp = meta_display_get_current_time_roundtrip (window->display); timestamp = meta_display_get_current_time_roundtrip (window->display);
}
meta_window_set_user_time (window, timestamp); meta_window_set_user_time (window, timestamp);
@ -2403,6 +2416,21 @@ meta_window_activate (MetaWindow *window,
meta_window_focus (window, timestamp); meta_window_focus (window, timestamp);
} }
/* This function exists since most of the functionality in window_activate
* is useful for Metacity, but Metacity shouldn't need to specify a client
* type for itself. ;-)
*/
void
meta_window_activate (MetaWindow *window,
guint32 timestamp)
{
/* We're not really a pager, but the behavior we want is the same as if
* we were such. If we change the pager behavior later, we could revisit
* this and just add extra flags to window_activate.
*/
window_activate (window, timestamp, META_CLIENT_TYPE_PAGER);
}
/* Manually fix all the weirdness explained in the big comment at the /* Manually fix all the weirdness explained in the big comment at the
* beginning of meta_window_move_resize_internal() giving positions * beginning of meta_window_move_resize_internal() giving positions
* expected by meta_window_constrain (i.e. positions & sizes of the * expected by meta_window_constrain (i.e. positions & sizes of the
@ -4548,25 +4576,23 @@ meta_window_client_message (MetaWindow *window,
else if (event->xclient.message_type == else if (event->xclient.message_type ==
display->atom_net_active_window) display->atom_net_active_window)
{ {
MetaClientType source_indication;
guint32 timestamp;
meta_verbose ("_NET_ACTIVE_WINDOW request for window '%s', activating\n", meta_verbose ("_NET_ACTIVE_WINDOW request for window '%s', activating\n",
window->desc); window->desc);
if (event->xclient.data.l[0] != 0) source_indication = event->xclient.data.l[0];
{ timestamp = event->xclient.data.l[1];
/* Client supports newer _NET_ACTIVE_WINDOW with a
* convenient timestamp
*/
meta_window_activate (window,
event->xclient.data.l[1]);
} if (source_indication > META_CLIENT_TYPE_MAX_RECOGNIZED)
else source_indication = META_CLIENT_TYPE_UNKNOWN;
{
/* Client using older EWMH _NET_ACTIVE_WINDOW without a if (timestamp == 0)
* timestamp /* Client using older EWMH _NET_ACTIVE_WINDOW without a timestamp */
*/ timestamp = meta_display_get_current_time (window->display);
meta_window_activate (window, meta_display_get_current_time (window->display));
} window_activate (window, timestamp, source_indication);
return TRUE; return TRUE;
} }

View File

@ -58,6 +58,13 @@ typedef enum
META_MAXIMIZE_VERTICAL = 1 << 1 META_MAXIMIZE_VERTICAL = 1 << 1
} MetaMaximizeFlags; } MetaMaximizeFlags;
typedef enum {
META_CLIENT_TYPE_UNKNOWN = 0,
META_CLIENT_TYPE_APPLICATION = 1,
META_CLIENT_TYPE_PAGER = 2,
META_CLIENT_TYPE_MAX_RECOGNIZED = 2
} MetaClientType;
struct _MetaStruts struct _MetaStruts
{ {
/* struts */ /* struts */