From 0407bebf4b2a0100a3545aa0c9548886fcee3d62 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sat, 18 Jan 2025 10:09:49 +0100 Subject: [PATCH] [client,sdl] fix sdl2 multi monitor settings --- client/SDL/SDL2/sdl_monitor.cpp | 36 +++++++++++++++------------------ 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/client/SDL/SDL2/sdl_monitor.cpp b/client/SDL/SDL2/sdl_monitor.cpp index e60edd82f..a0da35c3d 100644 --- a/client/SDL/SDL2/sdl_monitor.cpp +++ b/client/SDL/SDL2/sdl_monitor.cpp @@ -196,10 +196,7 @@ static BOOL sdl_apply_display_properties(SdlContext* sdl) return TRUE; const UINT32 numIds = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds); - if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorDefArray, nullptr, numIds)) - return FALSE; - if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorCount, numIds)) - return FALSE; + std::vector monitors; for (UINT32 x = 0; x < numIds; x++) { @@ -265,26 +262,25 @@ static BOOL sdl_apply_display_properties(SdlContext* sdl) const UINT32 rdp_orientation = ORIENTATION_LANDSCAPE; #endif - auto monitor = static_cast( - freerdp_settings_get_pointer_array_writable(settings, FreeRDP_MonitorDefArray, x)); - WINPR_ASSERT(monitor); + rdpMonitor monitor = {}; /* windows uses 96 dpi as 'default' and the scale factors are in percent. */ const auto factor = ddpi / 96.0f * 100.0f; - monitor->orig_screen = x; - monitor->x = rect.x; - monitor->y = rect.y; - monitor->width = rect.w; - monitor->height = rect.h; - monitor->is_primary = x == 0; - monitor->attributes.desktopScaleFactor = static_cast(factor); - monitor->attributes.deviceScaleFactor = 100; - monitor->attributes.orientation = rdp_orientation; - monitor->attributes.physicalWidth = scale(WINPR_ASSERTING_INT_CAST(uint32_t, rect.w), hdpi); - monitor->attributes.physicalHeight = - scale(WINPR_ASSERTING_INT_CAST(uint32_t, rect.h), vdpi); + monitor.orig_screen = x; + monitor.x = rect.x; + monitor.y = rect.y; + monitor.width = rect.w; + monitor.height = rect.h; + monitor.is_primary = x == 0; + monitor.attributes.desktopScaleFactor = static_cast(factor); + monitor.attributes.deviceScaleFactor = 100; + monitor.attributes.orientation = rdp_orientation; + monitor.attributes.physicalWidth = scale(WINPR_ASSERTING_INT_CAST(uint32_t, rect.w), hdpi); + monitor.attributes.physicalHeight = scale(WINPR_ASSERTING_INT_CAST(uint32_t, rect.h), vdpi); + monitors.push_back(monitor); } - return TRUE; + return freerdp_settings_set_monitor_def_array_sorted(settings, monitors.data(), + monitors.size()); } static BOOL sdl_detect_single_window(SdlContext* sdl, UINT32* pMaxWidth, UINT32* pMaxHeight)