diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 1bacd50d9..ed467afb7 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2896,6 +2896,10 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { settings->GrabKeyboard = enable; } + CommandLineSwitchCase(arg, "grab-mouse") + { + settings->GrabMouse = enable; + } CommandLineSwitchCase(arg, "unmap-buttons") { settings->UnmapButtons = enable; diff --git a/client/common/cmdline.h b/client/common/cmdline.h index 065cfc5ee..30dc4121b 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -180,6 +180,7 @@ static const COMMAND_LINE_ARGUMENT_A args[] = { { "gp", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "Gateway password" }, { "grab-keyboard", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "Grab keyboard" }, + { "grab-mouse", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "Grab mouse" }, { "gt", COMMAND_LINE_VALUE_REQUIRED, "[rpc|http|auto]", NULL, NULL, -1, NULL, "Gateway transport type" }, { "gu", COMMAND_LINE_VALUE_REQUIRED, "[[\\]|[@]]", NULL, NULL, -1, diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 6bf222dd9..070611d51 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -718,6 +718,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_PercentScreenUseWidth (1556) #define FreeRDP_PercentScreenUseHeight (1557) #define FreeRDP_DynamicResolutionUpdate (1558) +#define FreeRDP_GrabMouse (1559) #define FreeRDP_SoftwareGdi (1601) #define FreeRDP_LocalConnection (1602) #define FreeRDP_AuthenticationOnly (1603) @@ -1195,7 +1196,8 @@ struct rdp_settings ALIGN64 BOOL PercentScreenUseWidth; /* 1556 */ ALIGN64 BOOL PercentScreenUseHeight; /* 1557 */ ALIGN64 BOOL DynamicResolutionUpdate; /* 1558 */ - UINT64 padding1601[1601 - 1559]; /* 1559 */ + ALIGN64 BOOL GrabMouse; /* 1559 */ + UINT64 padding1601[1601 - 1560]; /* 1560 */ /* Miscellaneous */ ALIGN64 BOOL SoftwareGdi; /* 1601 */ diff --git a/libfreerdp/cache/pointer.c b/libfreerdp/cache/pointer.c index 010df1703..42acf65da 100644 --- a/libfreerdp/cache/pointer.c +++ b/libfreerdp/cache/pointer.c @@ -68,6 +68,9 @@ static BOOL update_pointer_position(rdpContext* context, !pointer_position) return FALSE; + if (!context->settings->GrabMouse) + return TRUE; + pointer = context->graphics->Pointer_Prototype; return IFCALLRESULT(TRUE, pointer->SetPosition, context, pointer_position->xPos, pointer_position->yPos); diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 2e49b8923..a4fb31d28 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -228,6 +228,9 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id) case FreeRDP_GrabKeyboard: return settings->GrabKeyboard; + case FreeRDP_GrabMouse: + return settings->GrabMouse; + case FreeRDP_HasExtendedMouseEvent: return settings->HasExtendedMouseEvent; @@ -802,6 +805,10 @@ BOOL freerdp_settings_set_bool(rdpSettings* settings, size_t id, BOOL val) settings->GrabKeyboard = val; break; + case FreeRDP_GrabMouse: + settings->GrabMouse = val; + break; + case FreeRDP_HasExtendedMouseEvent: settings->HasExtendedMouseEvent = val; break; diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c index 699c94b2d..810fad5cd 100644 --- a/libfreerdp/common/settings_str.c +++ b/libfreerdp/common/settings_str.c @@ -86,6 +86,7 @@ static const struct settings_str_entry settings_map[] = { { FreeRDP_GfxSmallCache, 0, "FreeRDP_GfxSmallCache" }, { FreeRDP_GfxThinClient, 0, "FreeRDP_GfxThinClient" }, { FreeRDP_GrabKeyboard, 0, "FreeRDP_GrabKeyboard" }, + { FreeRDP_GrabMouse, 0, "FreeRDP_GrabMouse" }, { FreeRDP_HasExtendedMouseEvent, 0, "FreeRDP_HasExtendedMouseEvent" }, { FreeRDP_HasHorizontalWheel, 0, "FreeRDP_HasHorizontalWheel" }, { FreeRDP_HasMonitorAttributes, 0, "FreeRDP_HasMonitorAttributes" }, diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 23f5f059b..1bcba6ec1 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -316,6 +316,7 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->Workarea = FALSE; settings->Fullscreen = FALSE; settings->GrabKeyboard = TRUE; + settings->GrabMouse = TRUE; settings->Decorations = TRUE; settings->RdpVersion = RDP_VERSION_10_7; settings->ColorDepth = 16; diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index c44018e47..b81c64232 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -75,6 +75,7 @@ static const size_t bool_list_indices[] = { FreeRDP_GfxSmallCache, FreeRDP_GfxThinClient, FreeRDP_GrabKeyboard, + FreeRDP_GrabMouse, FreeRDP_HasExtendedMouseEvent, FreeRDP_HasHorizontalWheel, FreeRDP_HasMonitorAttributes,