20#include <freerdp/config.h>
24#include <winpr/assert.h>
26#include <freerdp/constants.h>
27#include <freerdp/utils/signal.h>
28#include <freerdp/client/cmdline.h>
29#include <freerdp/client/aad_helper.h>
37static BOOL mfreerdp_client_global_init(
void)
39 freerdp_handle_signals();
43static void mfreerdp_client_global_uninit(
void)
47static int mfreerdp_client_start(rdpContext *context)
52 if (mfc->view ==
nullptr)
56 initWithFrame:NSMakeRect(
58 freerdp_settings_get_uint32(context->settings, FreeRDP_DesktopWidth),
59 freerdp_settings_get_uint32(context->settings,
60 FreeRDP_DesktopHeight))];
61 mfc->view_ownership = TRUE;
65 return [view rdpStart:context];
68static int mfreerdp_client_stop(rdpContext *context)
72 freerdp_client_common_stop(context);
74 if (mfc->view_ownership)
77 [view releaseResources];
85static BOOL mfreerdp_client_new(freerdp *instance, rdpContext *context)
89 WINPR_ASSERT(instance);
94 mfc->stopEvent = CreateEvent(
nullptr, TRUE, FALSE,
nullptr);
97 context->instance->PreConnect = mac_pre_connect;
98 context->instance->PostConnect = mac_post_connect;
99 context->instance->PostDisconnect = mac_post_disconnect;
100 context->instance->AuthenticateEx = mac_authenticate_ex;
101 context->instance->VerifyCertificateEx = mac_verify_certificate_ex;
102 context->instance->VerifyChangedCertificateEx = mac_verify_changed_certificate_ex;
103 context->instance->LogonErrorInfo = mac_logon_error_info;
104 instance->GetAccessToken = client_failsafe_get_access_token;
108static void mfreerdp_client_free(freerdp *instance, rdpContext *context)
112 if (!instance || !context)
116 (void)CloseHandle(mfc->stopEvent);
119static void mf_scale_mouse_coordinates(
mfContext *mfc, UINT16 *px, UINT16 *py)
123 UINT32 ww = mfc->client_width;
124 UINT32 wh = mfc->client_height;
129 ((ww == dw) && (wh == dh)))
131 y = y + mfc->yCurrentScroll;
132 x = x + mfc->xCurrentScroll;
139 y = y * dh / wh + mfc->yCurrentScroll;
140 x = x * dw / ww + mfc->xCurrentScroll;
147void mf_scale_mouse_event(
void *context, UINT16 flags, UINT16 x, UINT16 y)
152 y = [view frame].size.height - y;
154 if ((flags & (PTR_FLAGS_WHEEL | PTR_FLAGS_HWHEEL)) == 0)
155 mf_scale_mouse_coordinates(mfc, &x, &y);
156 freerdp_client_send_button_event(&mfc->common, FALSE, flags, x, y);
159void mf_scale_mouse_event_ex(
void *context, UINT16 flags, UINT16 x, UINT16 y)
164 y = [view frame].size.height - y;
166 mf_scale_mouse_coordinates(mfc, &x, &y);
167 freerdp_client_send_extended_button_event(&mfc->common, FALSE, flags, x, y);
170void mf_press_mouse_button(
void *context,
int button,
int x,
int y, BOOL down)
177 flags |= PTR_FLAGS_DOWN;
178 xflags |= PTR_XFLAGS_DOWN;
184 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON1, x, y);
188 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON2, x, y);
192 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON3, x, y);
196 mf_scale_mouse_event_ex(context, xflags | PTR_XFLAGS_BUTTON1, x, y);
200 mf_scale_mouse_event_ex(context, xflags | PTR_XFLAGS_BUTTON2, x, y);
208int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS *pEntryPoints)
210 WINPR_ASSERT(pEntryPoints);
212 pEntryPoints->Version = 1;
213 pEntryPoints->Size =
sizeof(RDP_CLIENT_ENTRY_POINTS_V1);
214 pEntryPoints->GlobalInit = mfreerdp_client_global_init;
215 pEntryPoints->GlobalUninit = mfreerdp_client_global_uninit;
216 pEntryPoints->ContextSize =
sizeof(
mfContext);
217 pEntryPoints->ClientNew = mfreerdp_client_new;
218 pEntryPoints->ClientFree = mfreerdp_client_free;
219 pEntryPoints->ClientStart = mfreerdp_client_start;
220 pEntryPoints->ClientStop = mfreerdp_client_stop;
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.