FreeRDP
Loading...
Searching...
No Matches
mf_client.m
1
20#include <freerdp/config.h>
21
22#include "mfreerdp.h"
23
24#include <winpr/assert.h>
25
26#include <freerdp/constants.h>
27#include <freerdp/utils/signal.h>
28#include <freerdp/client/cmdline.h>
29#include <freerdp/client/aad_helper.h>
30
31#include "MRDPView.h"
32
37static BOOL mfreerdp_client_global_init(void)
38{
39 freerdp_handle_signals();
40 return TRUE;
41}
42
43static void mfreerdp_client_global_uninit(void)
44{
45}
46
47static int mfreerdp_client_start(rdpContext *context)
48{
49 MRDPView *view;
50 mfContext *mfc = (mfContext *)context;
51
52 if (mfc->view == nullptr)
53 {
54 // view not specified beforehand. Create view dynamically
55 mfc->view = [[MRDPView alloc]
56 initWithFrame:NSMakeRect(
57 0, 0,
58 freerdp_settings_get_uint32(context->settings, FreeRDP_DesktopWidth),
59 freerdp_settings_get_uint32(context->settings,
60 FreeRDP_DesktopHeight))];
61 mfc->view_ownership = TRUE;
62 }
63
64 view = (MRDPView *)mfc->view;
65 return [view rdpStart:context];
66}
67
68static int mfreerdp_client_stop(rdpContext *context)
69{
70 mfContext *mfc = (mfContext *)context;
71
72 freerdp_client_common_stop(context);
73
74 if (mfc->view_ownership)
75 {
76 MRDPView *view = (MRDPView *)mfc->view;
77 [view releaseResources];
78 [view release];
79 mfc->view = nil;
80 }
81
82 return 0;
83}
84
85static BOOL mfreerdp_client_new(freerdp *instance, rdpContext *context)
86{
87 mfContext *mfc;
88
89 WINPR_ASSERT(instance);
90
91 mfc = (mfContext *)instance->context;
92 WINPR_ASSERT(mfc);
93
94 mfc->stopEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
95 if (!mfc->stopEvent)
96 return FALSE;
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;
105 return TRUE;
106}
107
108static void mfreerdp_client_free(freerdp *instance, rdpContext *context)
109{
110 mfContext *mfc;
111
112 if (!instance || !context)
113 return;
114
115 mfc = (mfContext *)instance->context;
116 (void)CloseHandle(mfc->stopEvent);
117}
118
119static void mf_scale_mouse_coordinates(mfContext *mfc, UINT16 *px, UINT16 *py)
120{
121 UINT16 x = *px;
122 UINT16 y = *py;
123 UINT32 ww = mfc->client_width;
124 UINT32 wh = mfc->client_height;
125 UINT32 dw = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopWidth);
126 UINT32 dh = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopHeight);
127
128 if (!freerdp_settings_get_bool(mfc->common.context.settings, FreeRDP_SmartSizing) ||
129 ((ww == dw) && (wh == dh)))
130 {
131 y = y + mfc->yCurrentScroll;
132 x = x + mfc->xCurrentScroll;
133
134 y -= (dh - wh);
135 x -= (dw - ww);
136 }
137 else
138 {
139 y = y * dh / wh + mfc->yCurrentScroll;
140 x = x * dw / ww + mfc->xCurrentScroll;
141 }
142
143 *px = x;
144 *py = y;
145}
146
147void mf_scale_mouse_event(void *context, UINT16 flags, UINT16 x, UINT16 y)
148{
149 mfContext *mfc = (mfContext *)context;
150 MRDPView *view = (MRDPView *)mfc->view;
151 // Convert to windows coordinates
152 y = [view frame].size.height - y;
153
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);
157}
158
159void mf_scale_mouse_event_ex(void *context, UINT16 flags, UINT16 x, UINT16 y)
160{
161 mfContext *mfc = (mfContext *)context;
162 MRDPView *view = (MRDPView *)mfc->view;
163 // Convert to windows coordinates
164 y = [view frame].size.height - y;
165
166 mf_scale_mouse_coordinates(mfc, &x, &y);
167 freerdp_client_send_extended_button_event(&mfc->common, FALSE, flags, x, y);
168}
169
170void mf_press_mouse_button(void *context, int button, int x, int y, BOOL down)
171{
172 UINT16 flags = 0;
173 UINT16 xflags = 0;
174
175 if (down)
176 {
177 flags |= PTR_FLAGS_DOWN;
178 xflags |= PTR_XFLAGS_DOWN;
179 }
180
181 switch (button)
182 {
183 case 0:
184 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON1, x, y);
185 break;
186
187 case 1:
188 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON2, x, y);
189 break;
190
191 case 2:
192 mf_scale_mouse_event(context, flags | PTR_FLAGS_BUTTON3, x, y);
193 break;
194
195 case 3:
196 mf_scale_mouse_event_ex(context, xflags | PTR_XFLAGS_BUTTON1, x, y);
197 break;
198
199 case 4:
200 mf_scale_mouse_event_ex(context, xflags | PTR_XFLAGS_BUTTON2, x, y);
201 break;
202
203 default:
204 break;
205 }
206}
207
208int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS *pEntryPoints)
209{
210 WINPR_ASSERT(pEntryPoints);
211
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;
221 return 0;
222}
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.