[client,common] add setting FreeRDP_MonitorOverrideFlags

use this mask to mark monitor settings set from command line.
This commit is contained in:
akallabeth
2025-04-07 21:23:14 +02:00
parent 6f8dddd5a9
commit 7e11df73ba
8 changed files with 66 additions and 25 deletions

View File

@@ -198,37 +198,37 @@ UINT sdlDispContext::sendLayout(const rdpMonitor* monitors, size_t nmonitors)
WINPR_ASSERT(settings);
std::vector<DISPLAY_CONTROL_MONITOR_LAYOUT> layouts;
layouts.resize(nmonitors);
layouts.reserve(nmonitors);
for (size_t i = 0; i < nmonitors; i++)
{
auto monitor = &monitors[i];
auto layout = &layouts[i];
DISPLAY_CONTROL_MONITOR_LAYOUT layout = {};
layout->Flags = (monitor->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0);
layout->Left = monitor->x;
layout->Top = monitor->y;
layout->Width = WINPR_ASSERTING_INT_CAST(uint32_t, monitor->width);
layout->Height = WINPR_ASSERTING_INT_CAST(uint32_t, monitor->height);
layout->Orientation = ORIENTATION_LANDSCAPE;
layout->PhysicalWidth = monitor->attributes.physicalWidth;
layout->PhysicalHeight = monitor->attributes.physicalHeight;
layout.Flags = (monitor->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0);
layout.Left = monitor->x;
layout.Top = monitor->y;
layout.Width = WINPR_ASSERTING_INT_CAST(uint32_t, monitor->width);
layout.Height = WINPR_ASSERTING_INT_CAST(uint32_t, monitor->height);
layout.Orientation = ORIENTATION_LANDSCAPE;
layout.PhysicalWidth = monitor->attributes.physicalWidth;
layout.PhysicalHeight = monitor->attributes.physicalHeight;
switch (monitor->attributes.orientation)
{
case 90:
layout->Orientation = ORIENTATION_PORTRAIT;
case ORIENTATION_PORTRAIT:
layout.Orientation = ORIENTATION_PORTRAIT;
break;
case 180:
layout->Orientation = ORIENTATION_LANDSCAPE_FLIPPED;
case ORIENTATION_LANDSCAPE_FLIPPED:
layout.Orientation = ORIENTATION_LANDSCAPE_FLIPPED;
break;
case 270:
layout->Orientation = ORIENTATION_PORTRAIT_FLIPPED;
case ORIENTATION_PORTRAIT_FLIPPED:
layout.Orientation = ORIENTATION_PORTRAIT_FLIPPED;
break;
case 0:
case ORIENTATION_LANDSCAPE:
default:
/* MS-RDPEDISP - 2.2.2.2.1:
* Orientation (4 bytes): A 32-bit unsigned integer that specifies the
@@ -237,14 +237,23 @@ UINT sdlDispContext::sendLayout(const rdpMonitor* monitors, size_t nmonitors)
*
* So we default to ORIENTATION_LANDSCAPE
*/
layout->Orientation = ORIENTATION_LANDSCAPE;
layout.Orientation = ORIENTATION_LANDSCAPE;
break;
}
layout->DesktopScaleFactor =
freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor);
layout->DeviceScaleFactor =
freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor);
layout.DesktopScaleFactor = monitor->attributes.desktopScaleFactor;
layout.DeviceScaleFactor = monitor->attributes.deviceScaleFactor;
auto mask = freerdp_settings_get_uint64(settings, FreeRDP_MonitorOverrideFlags);
if ((mask & FREERDP_MONITOR_OVERRIDE_ORIENTATION) != 0)
layout.Orientation = freerdp_settings_get_uint16(settings, FreeRDP_DesktopOrientation);
if ((mask & FREERDP_MONITOR_OVERRIDE_DESKTOP_SCALE) != 0)
layout.DesktopScaleFactor =
freerdp_settings_get_uint32(settings, FreeRDP_DesktopScaleFactor);
if ((mask & FREERDP_MONITOR_OVERRIDE_DEVICE_SCALE) != 0)
layout.DeviceScaleFactor =
freerdp_settings_get_uint32(settings, FreeRDP_DeviceScaleFactor);
layouts.emplace_back(layout);
}
if (!settings_changed(layouts))

View File

@@ -46,8 +46,6 @@ class sdlDispContext
[[nodiscard]] bool handle_display_event(const SDL_DisplayEvent* ev);
[[nodiscard]] bool handle_window_event(const SDL_WindowEvent* ev);
[[nodiscard]] UINT32 scale_factor() const;
private:
UINT DisplayControlCaps(UINT32 maxNumMonitors, UINT32 maxMonitorAreaFactorA,
UINT32 maxMonitorAreaFactorB);

View File

@@ -3557,6 +3557,14 @@ static int parse_reconnect_cookie_options(rdpSettings* settings, const COMMAND_L
return 0;
}
static BOOL set_monitor_override(rdpSettings* settings, uint64_t flag)
{
const FreeRDP_Settings_Keys_UInt64 key = FreeRDP_MonitorOverrideFlags;
uint64_t mask = freerdp_settings_get_uint64(settings, key);
mask |= flag;
return freerdp_settings_set_uint64(settings, key, mask);
}
static int parse_scale_options(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_A* arg)
{
WINPR_ASSERT(settings);
@@ -3576,6 +3584,9 @@ static int parse_scale_options(rdpSettings* settings, const COMMAND_LINE_ARGUMEN
return COMMAND_LINE_ERROR;
if (!freerdp_settings_set_uint32(settings, FreeRDP_DeviceScaleFactor, (UINT32)val))
return COMMAND_LINE_ERROR;
if (!set_monitor_override(settings, FREERDP_MONITOR_OVERRIDE_DESKTOP_SCALE |
FREERDP_MONITOR_OVERRIDE_DEVICE_SCALE))
return fail_at(arg, COMMAND_LINE_ERROR);
break;
default:
@@ -3601,6 +3612,8 @@ static int parse_scale_device_options(rdpSettings* settings, const COMMAND_LINE_
case 180:
if (!freerdp_settings_set_uint32(settings, FreeRDP_DeviceScaleFactor, (UINT32)val))
return COMMAND_LINE_ERROR;
if (!set_monitor_override(settings, FREERDP_MONITOR_OVERRIDE_DEVICE_SCALE))
return fail_at(arg, COMMAND_LINE_ERROR);
break;
default:
@@ -5368,6 +5381,8 @@ static int parse_command_line(rdpSettings* settings, const COMMAND_LINE_ARGUMENT
if (!freerdp_settings_set_uint16(settings, FreeRDP_DesktopOrientation, (UINT16)val))
return fail_at(arg, COMMAND_LINE_ERROR);
if (!set_monitor_override(settings, FREERDP_MONITOR_OVERRIDE_ORIENTATION))
return fail_at(arg, COMMAND_LINE_ERROR);
}
CommandLineSwitchCase(arg, "old-license")
{
@@ -5386,6 +5401,8 @@ static int parse_command_line(rdpSettings* settings, const COMMAND_LINE_ARGUMENT
FreeRDP_DesktopScaleFactor, 100, 500);
if (rc != 0)
return fail_at(arg, rc);
if (!set_monitor_override(settings, FREERDP_MONITOR_OVERRIDE_DESKTOP_SCALE))
return fail_at(arg, COMMAND_LINE_ERROR);
}
CommandLineSwitchCase(arg, "scale-device")
{

View File

@@ -341,6 +341,11 @@ extern "C"
(CLIPRDR_FLAG_LOCAL_TO_REMOTE | CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES | \
CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES)
/* Commandline helper defines */
#define FREERDP_MONITOR_OVERRIDE_ORIENTATION (1 << 0) /** @since version 3.14.2 */
#define FREERDP_MONITOR_OVERRIDE_DESKTOP_SCALE (1 << 1) /** @since version 3.14.2 */
#define FREERDP_MONITOR_OVERRIDE_DEVICE_SCALE (1 << 2) /** @since version 3.14.2 */
/* ARC_CS_PRIVATE_PACKET */
typedef struct
{

View File

@@ -115,7 +115,10 @@ struct rdp_settings
SETTINGS_DEPRECATED(ALIGN64 BOOL SupportEdgeActionV2); /* 151 */
SETTINGS_DEPRECATED(ALIGN64 BOOL SupportSkipChannelJoin); /* 152 */
SETTINGS_DEPRECATED(ALIGN64 UINT16 SupportedColorDepths); /* 153 */
UINT64 padding0192[192 - 154]; /* 154 */
SETTINGS_DEPRECATED(ALIGN64 UINT64 MonitorOverrideFlags); /** 154
* @since version 3.14.2
*/
UINT64 padding0192[192 - 155]; /* 155 */
/* Client/Server Security Data */
SETTINGS_DEPRECATED(ALIGN64 BOOL UseRdpSecurityLayer); /* 192 */

View File

@@ -2630,6 +2630,9 @@ UINT64 freerdp_settings_get_uint64(WINPR_ATTR_UNUSED const rdpSettings* settings
switch (id)
{
case FreeRDP_MonitorOverrideFlags:
return settings->MonitorOverrideFlags;
case FreeRDP_ParentWindowId:
return settings->ParentWindowId;
@@ -2658,6 +2661,10 @@ BOOL freerdp_settings_set_uint64(WINPR_ATTR_UNUSED rdpSettings* settings,
switch (id)
{
case FreeRDP_MonitorOverrideFlags:
settings->MonitorOverrideFlags = cnv.c;
break;
case FreeRDP_ParentWindowId:
settings->ParentWindowId = cnv.c;
break;

View File

@@ -450,6 +450,7 @@ static const struct settings_str_entry settings_map[] = {
{ FreeRDP_MonitorLocalShiftY, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_MonitorLocalShiftY" },
{ FreeRDP_XPan, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_XPan" },
{ FreeRDP_YPan, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_YPan" },
{ FreeRDP_MonitorOverrideFlags, FREERDP_SETTINGS_TYPE_UINT64, "FreeRDP_MonitorOverrideFlags" },
{ FreeRDP_ParentWindowId, FREERDP_SETTINGS_TYPE_UINT64, "FreeRDP_ParentWindowId" },
{ FreeRDP_AadServerHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AadServerHostname" },
{ FreeRDP_AcceptedCert, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AcceptedCert" },

View File

@@ -354,6 +354,7 @@ static const size_t int32_list_indices[] = {
#define have_uint64_list_indices
static const size_t uint64_list_indices[] = {
FreeRDP_MonitorOverrideFlags,
FreeRDP_ParentWindowId,
};