diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index 9ee7b8e8cc..3d65675a01 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -1008,6 +1008,29 @@ dynamic_monitor_data_first(intptr_t id, int chan_id, char *data, int bytes, return 0; } +/******************************************************************************/ +static const int MAXIMUM_MONITOR_SIZE + = sizeof(struct monitor_info) * CLIENT_MONITOR_DATA_MAXIMUM_MONITORS; + +/******************************************************************************/ +static void +sync_dynamic_monitor_data(struct xrdp_wm *wm, + struct display_size_description *description) +{ + struct display_size_description *display_sizes + = &(wm->client_info->display_sizes); + + display_sizes->monitorCount = description->monitorCount; + display_sizes->session_width = description->session_width; + display_sizes->session_height = description->session_height; + g_memcpy(display_sizes->minfo, + description->minfo, + MAXIMUM_MONITOR_SIZE); + g_memcpy(display_sizes->minfo_wm, + description->minfo_wm, + MAXIMUM_MONITOR_SIZE); +} + /******************************************************************************/ static int process_dynamic_monitor_description(struct xrdp_wm *wm, @@ -1041,6 +1064,18 @@ process_dynamic_monitor_description(struct xrdp_wm *wm, description->session_width, description->session_height); return 0; } + if (description->session_width + == wm->client_info->display_sizes.session_width + && description->session_height + == wm->client_info->display_sizes.session_height) + { + LOG(LOG_LEVEL_WARNING, "process_dynamic_monitor_description:" + " Not resizing. Already this size. (w: %d x h: %d)", + description->session_width, + description->session_height); + sync_dynamic_monitor_data(wm, description); + return 0; + } // TODO: Unify this logic with server_reset error = libxrdp_reset(wm->session, @@ -1141,17 +1176,7 @@ process_dynamic_monitor_description(struct xrdp_wm *wm, mm->encoder = xrdp_encoder_create(mm); } - wm->client_info->display_sizes.monitorCount = description->monitorCount; - wm->client_info->display_sizes.session_width = description->session_width; - wm->client_info->display_sizes.session_height = description->session_height; - g_memcpy(wm->client_info->display_sizes.minfo, - description->minfo, - sizeof(struct monitor_info) - * CLIENT_MONITOR_DATA_MAXIMUM_MONITORS); - g_memcpy(wm->client_info->display_sizes.minfo_wm, - description->minfo_wm, - sizeof(struct monitor_info) - * CLIENT_MONITOR_DATA_MAXIMUM_MONITORS); + sync_dynamic_monitor_data(wm, description); return 0; }