FreeRDP
Loading...
Searching...
No Matches
client_rails.c
1
2#include <winpr/cast.h>
3
4#include <freerdp/freerdp.h>
5#include <freerdp/client/rail.h>
6
7#include "rail_main.h"
8
9UINT client_rail_server_start_cmd(RailClientContext* context)
10{
11 WINPR_ASSERT(context);
12 railPlugin* rail = context->handle;
13 WINPR_ASSERT(rail);
14 WINPR_ASSERT(rail->rdpcontext);
15
16 const rdpSettings* settings = rail->rdpcontext->settings;
17 WINPR_ASSERT(settings);
18
20 settings, FreeRDP_RemoteAppFeatureFlags) };
21
22 if (freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled))
23 clientStatus.flags |= TS_RAIL_CLIENTSTATUS_AUTORECONNECT;
24 else
25 clientStatus.flags &= ~TS_RAIL_CLIENTSTATUS_AUTORECONNECT;
26
27 UINT status = context->ClientInformation(context, &clientStatus);
28
29 if (status != CHANNEL_RC_OK)
30 return status;
31
32 if (freerdp_settings_get_bool(settings, FreeRDP_RemoteAppLanguageBarSupported))
33 {
34 RAIL_LANGBAR_INFO_ORDER langBarInfo;
35 langBarInfo.languageBarStatus = 0x00000008; /* TF_SFT_HIDDEN */
36 status = context->ClientLanguageBarInfo(context, &langBarInfo);
37
38 /* We want the language bar, but the server might not support it. */
39 switch (status)
40 {
41 case CHANNEL_RC_OK:
42 case ERROR_BAD_CONFIGURATION:
43 break;
44 default:
45 return status;
46 }
47 }
48
49 const UINT32 w = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth);
50 const UINT32 h = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight);
51
52 const RAIL_SYSPARAM_ORDER sysparam = {
53 .params = SPI_MASK_SET_HIGH_CONTRAST | SPI_MASK_SET_MOUSE_BUTTON_SWAP |
54 SPI_MASK_SET_KEYBOARD_PREF | SPI_MASK_SET_DRAG_FULL_WINDOWS |
55 SPI_MASK_SET_KEYBOARD_CUES | SPI_MASK_SET_WORK_AREA,
56 .highContrast.flags = 0x7E,
57 .workArea.right = WINPR_ASSERTING_INT_CAST(UINT16, w),
58 .workArea.bottom = WINPR_ASSERTING_INT_CAST(UINT16, h)
59 };
60
61 status = context->ClientSystemParam(context, &sysparam);
62
63 if (status != CHANNEL_RC_OK)
64 return status;
65
66 const char* RemoteApplicationFile =
67 freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationFile);
68 const char* RemoteApplicationCmdLine =
69 freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationCmdLine);
70
71 char argsAndFile[520] = WINPR_C_ARRAY_INIT;
72 RAIL_EXEC_ORDER exec = WINPR_C_ARRAY_INIT;
73 if (RemoteApplicationFile && RemoteApplicationCmdLine)
74 {
75 (void)_snprintf(argsAndFile, ARRAYSIZE(argsAndFile), "%s %s", RemoteApplicationCmdLine,
76 RemoteApplicationFile);
77 exec.RemoteApplicationArguments = argsAndFile;
78 }
79 else if (RemoteApplicationFile)
80 exec.RemoteApplicationArguments = RemoteApplicationFile;
81 else
82 exec.RemoteApplicationArguments = RemoteApplicationCmdLine;
83 exec.RemoteApplicationProgram =
84 freerdp_settings_get_string(settings, FreeRDP_RemoteApplicationProgram);
85 exec.RemoteApplicationWorkingDir =
86 freerdp_settings_get_string(settings, FreeRDP_ShellWorkingDirectory);
87 return context->ClientExecute(context, &exec);
88}
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.