diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2016-03-23 17:11:08 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2016-03-24 16:55:58 +0100 |
commit | ec6bfc00f81afddbdcc0fac86d7039385d89c6b6 (patch) | |
tree | 11623a1011717061bf66c3565035b8d76762820b | |
parent | 962ebf97e706df657793c45cfe58b1f17f3abb38 (diff) |
main: don't update display timer for unchanged config
With virgl, set_monitor_ready() may be called each time the scanout is
updated to set the monitor area. This will call
spice_main_update_display(), and keep the timer postponed even if the
monitor configuration didn't change. Treat unchanged configuration as a
no-op and keep configuration timer unchanged. This fixes monitor
autoconfig with virgl (when the display is regularly updated).
It also solves/avoids problems with a guest running on wayland when the
"resize-guest" property is TRUE.
Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=1266484
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r-- | src/channel-main.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/channel-main.c b/src/channel-main.c index 8dd580a..4a1f58a 100644 --- a/src/channel-main.c +++ b/src/channel-main.c @@ -121,6 +121,14 @@ typedef enum { DISPLAY_ENABLED, } SpiceDisplayState; +typedef struct { + int x; + int y; + int width; + int height; + SpiceDisplayState display_state; +} SpiceDisplayConfig; + struct _SpiceMainChannelPrivate { enum SpiceMouseMode mouse_mode; bool agent_connected; @@ -140,13 +148,7 @@ struct _SpiceMainChannelPrivate { guint agent_msg_pos; uint8_t agent_msg_size; uint32_t agent_caps[VD_AGENT_CAPS_SIZE]; - struct { - int x; - int y; - int width; - int height; - SpiceDisplayState display_state; - } display[MAX_DISPLAY]; + SpiceDisplayConfig display[MAX_DISPLAY]; gint timer_id; GQueue *agent_msg_queue; GHashTable *file_xfer_tasks; @@ -2688,10 +2690,15 @@ void spice_main_update_display(SpiceMainChannel *channel, int id, g_return_if_fail(id < SPICE_N_ELEMENTS(c->display)); - c->display[id].x = x; - c->display[id].y = y; - c->display[id].width = width; - c->display[id].height = height; + SpiceDisplayConfig display = { + .x = x, .y = y, .width = width, .height = height, + .display_state = c->display[id].display_state + }; + + if (memcmp(&display, &c->display[id], sizeof(SpiceDisplayConfig)) == 0) + return; + + c->display[id] = display; if (update) update_display_timer(channel, 1); |