[Spice-devel] [PATCH VDAgent-win v2] Update the displays only when needed
Frediano Ziglio
fziglio at redhat.com
Tue Aug 30 16:15:48 UTC 2016
>
> This patch updates the display configurations only when needed.
> Currently vdagent updates the display configurations almost on every
> "VD_AGENT_MONITORS_CONFIG" request, this approach is redundant as some
> "VD_AGENT_MONITORS_CONFIG" requests don't apply any change to the
> display configurations.
>
> A good example of why this is needed, is the 'resize-guest' feature of
> the spice-widget which when enabled causes the client to send periodic
> "VD_AGENT_MONITORS_CONFIG" requests in order to resize the guest even
> when no change is required. Prior to this patch the screen would
> periodically flicker when using Virt-manager or Spicy due to this issue.
>
> Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
Acked-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> vdagent/vdagent.cpp | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> index b4a3426..cde29e6 100644
> --- a/vdagent/vdagent.cpp
> +++ b/vdagent/vdagent.cpp
> @@ -644,6 +644,7 @@ bool VDAgent::handle_mon_config(VDAgentMonitorsConfig*
> mon_config, uint32_t port
> VDAgentMessage* reply_msg;
> VDAgentReply* reply;
> size_t display_count;
> + bool update_displays(false);
>
> _updating_display_config = true;
>
> @@ -656,6 +657,7 @@ bool VDAgent::handle_mon_config(VDAgentMonitorsConfig*
> mon_config, uint32_t port
> if (i >= mon_config->num_of_monitors) {
> vd_printf("%d. detached", i);
> mode->set_attached(false);
> + update_displays = true;
> continue;
> }
> VDAgentMonConfig* mon = &mon_config->monitors[i];
> @@ -663,16 +665,24 @@ bool VDAgent::handle_mon_config(VDAgentMonitorsConfig*
> mon_config, uint32_t port
> mon->y, !!(mon_config->flags &
> VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS));
> if (mon->height == 0 && mon->depth == 0) {
> vd_printf("%d. detaching", i);
> + update_displays = mode->get_attached() ? true : update_displays;
> mode->set_attached(false);
> continue;
> }
> - mode->set_res(mon->width, mon->height, mon->depth);
> - if (mon_config->flags & VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS) {
> + if (mode->get_height() != mon->height || mode->get_width() !=
> mon->width || mode->get_depth() != mon->depth) {
> + mode->set_res(mon->width, mon->height, mon->depth);
> + update_displays = true;
> + }
> + if (mon_config->flags & VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS &&
> (mode->get_pos_x() != mon->x || mode->get_pos_y() != mon->y)) {
> mode->set_pos(mon->x, mon->y);
> + update_displays = true;
> + }
> + if (!mode->get_attached()) {
> + mode->set_attached(true);
> + update_displays = true;
> }
> - mode->set_attached(true);
> }
> - if (display_count) {
> + if (update_displays) {
> _desktop_layout->set_displays();
> }
>
Frediano
More information about the Spice-devel
mailing list