From 4b2d65e977d8869277db5e0f9a5fd10af2f0d720 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Thu, 10 Apr 2025 09:09:30 +0200 Subject: [PATCH] [server,shadow] add option to hide mouse cursor --- include/freerdp/server/shadow.h | 1 + server/shadow/cli/shadow.c | 4 +++- server/shadow/shadow_client.c | 11 ++++++++++- server/shadow/shadow_server.c | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/freerdp/server/shadow.h b/include/freerdp/server/shadow.h index d92c021f0..af8319815 100644 --- a/include/freerdp/server/shadow.h +++ b/include/freerdp/server/shadow.h @@ -179,6 +179,7 @@ extern "C" size_t maxClientsConnected; BOOL SupportMultiRectBitmapUpdates; /** @since version 3.13.0 */ + BOOL ShowMouseCursor; /** @since version 3.14.2 */ }; struct rdp_shadow_surface diff --git a/server/shadow/cli/shadow.c b/server/shadow/cli/shadow.c index 464abd9e4..6f1ee8b40 100644 --- a/server/shadow/cli/shadow.c +++ b/server/shadow/cli/shadow.c @@ -48,6 +48,8 @@ int main(int argc, char** argv) NULL, NULL, -1, NULL, "An address to bind to. Use '[]' for IPv6 addresses, e.g. '[::1]' for " "localhost" }, + { "server-side-cursor", COMMAND_LINE_VALUE_BOOL, NULL, NULL, NULL, -1, NULL, + "hide mouse cursor in RDP client." }, { "monitors", COMMAND_LINE_VALUE_OPTIONAL, "<0,1,2...>", NULL, NULL, -1, NULL, "Select or list monitors" }, { "max-connections", COMMAND_LINE_VALUE_REQUIRED, "", 0, NULL, -1, NULL, @@ -148,7 +150,7 @@ int main(int argc, char** argv) if ((status = shadow_server_parse_command_line(server, argc, argv, shadow_args)) < 0) { - shadow_server_command_line_status_print(server, argc, argv, status, shadow_args); + status = shadow_server_command_line_status_print(server, argc, argv, status, shadow_args); goto fail; } diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 06f6c4da2..66b9805db 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -2179,7 +2179,16 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes if (client->activated) { IFCALL(update->pointer->PointerNew, context, &pointerNew); - IFCALL(update->pointer->PointerCached, context, &pointerCached); + if (client->server->ShowMouseCursor) + { + IFCALL(update->pointer->PointerCached, context, &pointerCached); + } + else + { + POINTER_SYSTEM_UPDATE pointer_system = { 0 }; + pointer_system.type = SYSPTR_NULL; + IFCALL(update->pointer->PointerSystem, context, &pointer_system); + } } break; diff --git a/server/shadow/shadow_server.c b/server/shadow/shadow_server.c index 837ca38d4..138a5d2c7 100644 --- a/server/shadow/shadow_server.c +++ b/server/shadow/shadow_server.c @@ -244,6 +244,10 @@ int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** a { server->mayInteract = arg->Value ? TRUE : FALSE; } + CommandLineSwitchCase(arg, "server-side-cursor") + { + server->ShowMouseCursor = arg->Value ? TRUE : FALSE; + } CommandLineSwitchCase(arg, "mouse-relative") { const BOOL val = arg->Value ? TRUE : FALSE;