From: Daniel P. Berrange Date: Mon, 18 Dec 2017 19:12:23 +0000 (+0000) Subject: ui: refactor code for determining if an update should be sent to the client X-Git-Tag: v2.11.1~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5af9f2504fa2bc393b5b2d49ff1a85e5e11016bc;p=thirdparty%2Fqemu.git ui: refactor code for determining if an update should be sent to the client The logic for determining if it is possible to send an update to the client will become more complicated shortly, so pull it out into a separate method for easier extension later. Signed-off-by: Daniel P. Berrange Reviewed-by: Darren Kenny Reviewed-by: Marc-André Lureau Message-id: 20171218191228.31018-9-berrange@redhat.com Signed-off-by: Gerd Hoffmann (cherry picked from commit 0bad834228b9ee63e4239108d02dcb94568254d0) Signed-off-by: Michael Roth --- diff --git a/ui/vnc.c b/ui/vnc.c index 51fbf0449d8..6ae002cd361 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -961,6 +961,25 @@ static int find_and_clear_dirty_height(VncState *vs, return h; } +static bool vnc_should_update(VncState *vs) +{ + switch (vs->update) { + case VNC_STATE_UPDATE_NONE: + break; + case VNC_STATE_UPDATE_INCREMENTAL: + /* Only allow incremental updates if the output buffer + * is empty, or if audio capture is enabled. + */ + if (!vs->output.offset || vs->audio_cap) { + return true; + } + break; + case VNC_STATE_UPDATE_FORCE: + return true; + } + return false; +} + static int vnc_update_client(VncState *vs, int has_dirty) { VncDisplay *vd = vs->vd; @@ -975,13 +994,7 @@ static int vnc_update_client(VncState *vs, int has_dirty) } vs->has_dirty += has_dirty; - if (vs->update == VNC_STATE_UPDATE_NONE) { - return 0; - } - - if (vs->output.offset && !vs->audio_cap && - vs->update != VNC_STATE_UPDATE_FORCE) { - /* kernel send buffers are full -> drop frames to throttle */ + if (!vnc_should_update(vs)) { return 0; }