mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-14 00:14:11 +09:00
[client,common] add setting FreeRDP_MonitorOverrideFlags
use this mask to mark monitor settings set from command line.
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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" },
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user