display: Consolidate code calling XSetInputFocus into a new function

At the same time, rename set_focus_window and add a comment so we're
not confused about which function does what.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
This commit is contained in:
Jasper St. Pierre 2013-05-23 15:54:39 -04:00
parent df8234c5e3
commit 2ca2838548

View File

@ -1854,9 +1854,9 @@ get_input_event (MetaDisplay *display,
} }
static void static void
set_focus_window (MetaDisplay *display, update_focus_window (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
gulong serial) gulong serial)
{ {
display->focus_serial = serial; display->focus_serial = serial;
@ -1896,6 +1896,66 @@ set_focus_window (MetaDisplay *display,
meta_display_update_active_window_hint (display); meta_display_update_active_window_hint (display);
} }
static gboolean
timestamp_too_old (MetaDisplay *display,
guint32 *timestamp)
{
/* FIXME: If Soeren's suggestion in bug 151984 is implemented, it will allow
* us to sanity check the timestamp here and ensure it doesn't correspond to
* a future time (though we would want to rename to
* timestamp_too_old_or_in_future).
*/
if (*timestamp == CurrentTime)
{
*timestamp = meta_display_get_current_time_roundtrip (display);
return FALSE;
}
else if (XSERVER_TIME_IS_BEFORE (*timestamp, display->last_focus_time))
{
if (XSERVER_TIME_IS_BEFORE (*timestamp, display->last_user_time))
return TRUE;
else
{
*timestamp = display->last_focus_time;
return FALSE;
}
}
return FALSE;
}
static void
request_xserver_input_focus_change (MetaDisplay *display,
MetaScreen *screen,
Window xwindow,
guint32 timestamp)
{
MetaWindow *meta_window;
if (timestamp_too_old (display, &timestamp))
return;
meta_window = meta_display_lookup_x_window (display, xwindow);
meta_error_trap_push (display);
update_focus_window (display,
meta_window,
XNextRequest (display->xdisplay));
XSetInputFocus (display->xdisplay,
xwindow,
RevertToPointerRoot,
timestamp);
meta_error_trap_pop (display);
display->last_focus_time = timestamp;
display->active_screen = screen;
if (meta_window == NULL || meta_window != display->autoraise_window)
meta_display_remove_autoraise_callback (display);
}
static void static void
handle_window_focus_event (MetaDisplay *display, handle_window_focus_event (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
@ -2001,8 +2061,8 @@ handle_window_focus_event (MetaDisplay *display,
if (display->server_focus_serial >= display->focus_serial) if (display->server_focus_serial >= display->focus_serial)
{ {
set_focus_window (display, focus_window, update_focus_window (display, focus_window,
display->server_focus_serial); display->server_focus_serial);
} }
} }
@ -2055,9 +2115,9 @@ event_callback (XEvent *event,
{ {
meta_topic (META_DEBUG_FOCUS, "Earlier attempt to focus %s failed\n", meta_topic (META_DEBUG_FOCUS, "Earlier attempt to focus %s failed\n",
display->focus_window->desc); display->focus_window->desc);
set_focus_window (display, update_focus_window (display,
meta_display_lookup_x_window (display, display->server_focus_window), meta_display_lookup_x_window (display, display->server_focus_window),
display->server_focus_serial); display->server_focus_serial);
} }
modified = event_get_modified_window (display, event); modified = event_get_modified_window (display, event);
@ -5699,83 +5759,16 @@ sanity_check_timestamps (MetaDisplay *display,
} }
} }
static gboolean
timestamp_too_old (MetaDisplay *display,
MetaWindow *window,
guint32 *timestamp)
{
/* FIXME: If Soeren's suggestion in bug 151984 is implemented, it will allow
* us to sanity check the timestamp here and ensure it doesn't correspond to
* a future time (though we would want to rename to
* timestamp_too_old_or_in_future).
*/
if (*timestamp == CurrentTime)
{
meta_warning ("Got a request to focus %s with a timestamp of 0. This "
"shouldn't happen!\n",
window ? window->desc : "the no_focus_window");
*timestamp = meta_display_get_current_time_roundtrip (display);
return FALSE;
}
else if (XSERVER_TIME_IS_BEFORE (*timestamp, display->last_focus_time))
{
if (XSERVER_TIME_IS_BEFORE (*timestamp, display->last_user_time))
{
meta_topic (META_DEBUG_FOCUS,
"Ignoring focus request for %s since %u "
"is less than %u and %u.\n",
window ? window->desc : "the no_focus_window",
*timestamp,
display->last_user_time,
display->last_focus_time);
return TRUE;
}
else
{
meta_topic (META_DEBUG_FOCUS,
"Received focus request for %s which is newer than most "
"recent user_time, but less recent than "
"last_focus_time (%u < %u < %u); adjusting "
"accordingly. (See bug 167358)\n",
window ? window->desc : "the no_focus_window",
display->last_user_time,
*timestamp,
display->last_focus_time);
*timestamp = display->last_focus_time;
return FALSE;
}
}
return FALSE;
}
void void
meta_display_set_input_focus_window (MetaDisplay *display, meta_display_set_input_focus_window (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
gboolean focus_frame, gboolean focus_frame,
guint32 timestamp) guint32 timestamp)
{ {
if (timestamp_too_old (display, window, &timestamp)) request_xserver_input_focus_change (display,
return; window->screen,
focus_frame ? window->frame->xwindow : window->xwindow,
meta_error_trap_push (display); timestamp);
display->focus_serial = XNextRequest (display->xdisplay);
meta_topic (META_DEBUG_FOCUS, "XSetInputFocus(%s, %u) with serial %lu\n",
window->desc, timestamp, display->focus_serial);
XSetInputFocus (display->xdisplay,
focus_frame ? window->frame->xwindow : window->xwindow,
RevertToPointerRoot,
timestamp);
meta_error_trap_pop (display);
display->last_focus_time = timestamp;
display->active_screen = window->screen;
if (window != display->autoraise_window)
meta_display_remove_autoraise_callback (window->display);
set_focus_window (display, window, display->focus_serial);
} }
void void
@ -5783,7 +5776,7 @@ meta_display_request_take_focus (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
guint32 timestamp) guint32 timestamp)
{ {
if (timestamp_too_old (display, window, &timestamp)) if (timestamp_too_old (display, &timestamp))
return; return;
meta_topic (META_DEBUG_FOCUS, "WM_TAKE_FOCUS(%s, %u)\n", meta_topic (META_DEBUG_FOCUS, "WM_TAKE_FOCUS(%s, %u)\n",
@ -5818,22 +5811,10 @@ meta_display_focus_the_no_focus_window (MetaDisplay *display,
MetaScreen *screen, MetaScreen *screen,
guint32 timestamp) guint32 timestamp)
{ {
if (timestamp_too_old (display, NULL, &timestamp)) request_xserver_input_focus_change (display,
return; screen,
screen->no_focus_window,
display->focus_serial = XNextRequest (display->xdisplay); timestamp);
meta_topic (META_DEBUG_FOCUS, "Focusing no_focus_window at %u with serial %lu\n",
timestamp, display->focus_serial);
XSetInputFocus (display->xdisplay,
screen->no_focus_window,
RevertToPointerRoot,
timestamp);
display->last_focus_time = timestamp;
display->active_screen = screen;
meta_display_remove_autoraise_callback (display);
set_focus_window (display, NULL, display->focus_serial);
} }
void void