Block resize if already this size.
While this feature is part of other branches for testing EGFX
integration, it somehow never made it into devel. This should fix
for real this time!
@@ -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;
}
