[mutter] x11: Cut some slack to clients doing slow draws/resizes
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] x11: Cut some slack to clients doing slow draws/resizes
- Date: Thu, 5 Mar 2015 16:34:42 +0000 (UTC)
commit 94c3c8f412ce997f1ff5fadb6f9a78f7ba5891c3
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Feb 27 17:00:43 2015 +0100
x11: Cut some slack to clients doing slow draws/resizes
The timer to blacklist the window from frame sync is set at the time of
issuing the sync request, but not removed until the client replies to
the most recent wait serial.
This means that if the client is slowly catching up, the timeout would
fire up regardless of the client slowly updating the alarm to older
values.
Fix this by ensuring the timeout is reset everytime the sync request
counter is updated, to acknowledge the client is not irresponsive,
just slow.
https://bugzilla.gnome.org/show_bug.cgi?id=740424
src/x11/window-x11.c | 72 ++++++++++++++++++++++++++++++-------------------
1 files changed, 44 insertions(+), 28 deletions(-)
---
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index ec3656e..993f99d 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -950,6 +950,23 @@ sync_request_timeout (gpointer data)
}
static void
+reset_sync_request_timeout (MetaWindow *window)
+{
+ if (window->sync_request_timeout_id != 0)
+ g_source_remove (window->sync_request_timeout_id);
+
+ /* We give the window 1 sec to respond to _NET_WM_SYNC_REQUEST;
+ * if this time expires, we consider the window unresponsive
+ * and resize it unsynchonized.
+ */
+ window->sync_request_timeout_id = g_timeout_add (1000,
+ sync_request_timeout,
+ window);
+ g_source_set_name_by_id (window->sync_request_timeout_id,
+ "[mutter] sync_request_timeout");
+}
+
+static void
send_sync_request (MetaWindow *window)
{
XClientMessageEvent ev;
@@ -987,15 +1004,7 @@ send_sync_request (MetaWindow *window)
XSendEvent (window->display->xdisplay,
window->xwindow, False, 0, (XEvent*) &ev);
- /* We give the window 1 sec to respond to _NET_WM_SYNC_REQUEST;
- * if this time expires, we consider the window unresponsive
- * and resize it unsynchonized.
- */
- window->sync_request_timeout_id = g_timeout_add (1000,
- sync_request_timeout,
- window);
- g_source_set_name_by_id (window->sync_request_timeout_id,
- "[mutter] sync_request_timeout");
+ reset_sync_request_timeout (window);
meta_compositor_sync_updates_frozen (window->display->compositor, window);
}
@@ -3338,27 +3347,34 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
window->sync_request_serial = new_counter_value;
meta_compositor_sync_updates_frozen (window->display->compositor, window);
- if (window == window->display->grab_window &&
- 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->sync_request_timeout_id)
+ if (window->sync_request_timeout_id)
{
- meta_topic (META_DEBUG_RESIZING,
- "Alarm event received last motion x = %d y = %d\n",
- window->display->grab_latest_motion_x,
- window->display->grab_latest_motion_y);
-
- g_source_remove (window->sync_request_timeout_id);
- window->sync_request_timeout_id = 0;
+ if (new_counter_value < window->sync_request_wait_serial)
+ {
+ reset_sync_request_timeout (window);
+ }
+ else 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;
- /* This means we are ready for another configure;
- * no pointer round trip here, to keep in sync */
- meta_window_update_resize (window,
- window->display->grab_last_user_action_was_snap,
- window->display->grab_latest_motion_x,
- window->display->grab_latest_motion_y,
- TRUE);
+ if (window == window->display->grab_window &&
+ meta_grab_op_is_resizing (window->display->grab_op))
+ {
+ meta_topic (META_DEBUG_RESIZING,
+ "Alarm event received last motion x = %d y = %d\n",
+ window->display->grab_latest_motion_x,
+ window->display->grab_latest_motion_y);
+
+ /* This means we are ready for another configure;
+ * no pointer round trip here, to keep in sync */
+ meta_window_update_resize (window,
+ window->display->grab_last_user_action_was_snap,
+ window->display->grab_latest_motion_x,
+ window->display->grab_latest_motion_y,
+ TRUE);
+ }
+ }
}
/* If sync was previously disabled, turn it back on and hope
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]