window: always disarm XSYNC watchdog when X client responds

At the moment we only disarm the watchdog timer set up for SYNC counter
requests if we're in the middle of a resize operation.

It's possible that the resize operation finished prematurely by the user
letting go of the mouse before the client responded.  If that happens, when the
client finally updates mutter will erroneously still have the watchdog timer
engaged from before until it times out, leading to resizes for the next second
or so to not get processed, and the client to get blacklisted from future sync
requests.
This commit is contained in:
Ray Strode 2018-02-28 16:54:14 -05:00 committed by Ray Strode
parent ebff7fd7f4
commit 3488015d17

View File

@ -3496,20 +3496,23 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
window->sync_request_serial = new_counter_value; window->sync_request_serial = new_counter_value;
meta_compositor_sync_updates_frozen (window->display->compositor, window); meta_compositor_sync_updates_frozen (window->display->compositor, window);
if (new_counter_value >= window->sync_request_wait_serial && window->sync_request_timeout_id)
{
if (!window->extended_sync_request_counter || new_counter_value % 2 == 0)
{
g_source_remove (window->sync_request_timeout_id);
window->sync_request_timeout_id = 0;
}
if (window == window->display->grab_window && if (window == window->display->grab_window &&
meta_grab_op_is_resizing (window->display->grab_op) && meta_grab_op_is_resizing (window->display->grab_op) &&
new_counter_value >= window->sync_request_wait_serial && (!window->extended_sync_request_counter || new_counter_value % 2 == 0))
(!window->extended_sync_request_counter || new_counter_value % 2 == 0) &&
window->sync_request_timeout_id)
{ {
meta_topic (META_DEBUG_RESIZING, meta_topic (META_DEBUG_RESIZING,
"Alarm event received last motion x = %d y = %d\n", "Alarm event received last motion x = %d y = %d\n",
window->display->grab_latest_motion_x, window->display->grab_latest_motion_x,
window->display->grab_latest_motion_y); window->display->grab_latest_motion_y);
g_source_remove (window->sync_request_timeout_id);
window->sync_request_timeout_id = 0;
/* This means we are ready for another configure; /* This means we are ready for another configure;
* no pointer round trip here, to keep in sync */ * no pointer round trip here, to keep in sync */
meta_window_update_resize (window, meta_window_update_resize (window,
@ -3518,6 +3521,7 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
window->display->grab_latest_motion_y, window->display->grab_latest_motion_y,
TRUE); TRUE);
} }
}
/* If sync was previously disabled, turn it back on and hope /* If sync was previously disabled, turn it back on and hope
* the application has come to its senses (maybe it was just * the application has come to its senses (maybe it was just