[Spice-commits] vdagent/vdagent.cpp

Frediano Ziglio fziglio at kemper.freedesktop.org
Tue Aug 30 16:16:15 UTC 2016


 vdagent/vdagent.cpp |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

New commits:
commit 9c561ca8feb220b5c64cf46b41df73b40b6e93c7
Author: Sameeh Jubran <sameeh at daynix.com>
Date:   Tue Aug 30 17:59:41 2016 +0300

    Update the displays only when needed
    
    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>

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();
     }
 


More information about the Spice-commits mailing list