FreeRDP
Loading...
Searching...
No Matches
pf_update.c
1
24#include <freerdp/display.h>
25#include <freerdp/session.h>
26#include <winpr/assert.h>
27#include <winpr/image.h>
28#include <winpr/sysinfo.h>
29
30#include <freerdp/server/proxy/proxy_log.h>
31
32#include "pf_update.h"
33#include <freerdp/server/proxy/proxy_context.h>
34#include "proxy_modules.h"
35
36#define TAG PROXY_TAG("update")
37
38static BOOL pf_server_refresh_rect(rdpContext* context, BYTE count, const RECTANGLE_16* areas)
39{
40 pServerContext* ps = (pServerContext*)context;
41 rdpContext* pc = NULL;
42 WINPR_ASSERT(ps);
43 WINPR_ASSERT(ps->pdata);
44 pc = (rdpContext*)ps->pdata->pc;
45 WINPR_ASSERT(pc);
46 WINPR_ASSERT(pc->update);
47 WINPR_ASSERT(pc->update->RefreshRect);
48 return pc->update->RefreshRect(pc, count, areas);
49}
50
51static BOOL pf_server_suppress_output(rdpContext* context, BYTE allow, const RECTANGLE_16* area)
52{
53 pServerContext* ps = (pServerContext*)context;
54 rdpContext* pc = NULL;
55 WINPR_ASSERT(ps);
56 WINPR_ASSERT(ps->pdata);
57 pc = (rdpContext*)ps->pdata->pc;
58 WINPR_ASSERT(pc);
59 WINPR_ASSERT(pc->update);
60 WINPR_ASSERT(pc->update->SuppressOutput);
61 return pc->update->SuppressOutput(pc, allow, area);
62}
63
64/* Proxy from PC to PS */
65
70static BOOL pf_client_begin_paint(rdpContext* context)
71{
72 pClientContext* pc = (pClientContext*)context;
73 proxyData* pdata = NULL;
74 rdpContext* ps = NULL;
75 WINPR_ASSERT(pc);
76 pdata = pc->pdata;
77 WINPR_ASSERT(pdata);
78 ps = (rdpContext*)pdata->ps;
79 WINPR_ASSERT(ps);
80 WINPR_ASSERT(ps->update);
81 WINPR_ASSERT(ps->update->BeginPaint);
82 WLog_DBG(TAG, "called");
83 return ps->update->BeginPaint(ps);
84}
85
91static BOOL pf_client_end_paint(rdpContext* context)
92{
93 pClientContext* pc = (pClientContext*)context;
94 proxyData* pdata = NULL;
95 rdpContext* ps = NULL;
96 WINPR_ASSERT(pc);
97 pdata = pc->pdata;
98 WINPR_ASSERT(pdata);
99 ps = (rdpContext*)pdata->ps;
100 WINPR_ASSERT(ps);
101 WINPR_ASSERT(ps->update);
102 WINPR_ASSERT(ps->update->EndPaint);
103
104 WLog_DBG(TAG, "called");
105
106 /* proxy end paint */
107 if (!ps->update->EndPaint(ps))
108 return FALSE;
109
110 if (!pf_modules_run_hook(pdata->module, HOOK_TYPE_CLIENT_END_PAINT, pdata, context))
111 return FALSE;
112
113 return TRUE;
114}
115
116static BOOL pf_client_bitmap_update(rdpContext* context, const BITMAP_UPDATE* bitmap)
117{
118 pClientContext* pc = (pClientContext*)context;
119 proxyData* pdata = NULL;
120 rdpContext* ps = NULL;
121 WINPR_ASSERT(pc);
122 pdata = pc->pdata;
123 WINPR_ASSERT(pdata);
124 ps = (rdpContext*)pdata->ps;
125 WINPR_ASSERT(ps);
126 WINPR_ASSERT(ps->update);
127 WINPR_ASSERT(ps->update->BitmapUpdate);
128 WLog_DBG(TAG, "called");
129 return ps->update->BitmapUpdate(ps, bitmap);
130}
131
132static BOOL pf_client_desktop_resize(rdpContext* context)
133{
134 pClientContext* pc = (pClientContext*)context;
135 proxyData* pdata = NULL;
136 rdpContext* ps = NULL;
137 WINPR_ASSERT(pc);
138 pdata = pc->pdata;
139 WINPR_ASSERT(pdata);
140 ps = (rdpContext*)pdata->ps;
141 WINPR_ASSERT(ps);
142 WINPR_ASSERT(ps->update);
143 WINPR_ASSERT(ps->update->DesktopResize);
144 WINPR_ASSERT(context->settings);
145 WINPR_ASSERT(ps->settings);
146 WLog_DBG(TAG, "called");
147 if (!freerdp_settings_copy_item(ps->settings, context->settings, FreeRDP_DesktopWidth))
148 return FALSE;
149 if (!freerdp_settings_copy_item(ps->settings, context->settings, FreeRDP_DesktopHeight))
150 return FALSE;
151 return ps->update->DesktopResize(ps);
152}
153
154static BOOL pf_client_remote_monitors(rdpContext* context, UINT32 count,
155 const MONITOR_DEF* monitors)
156{
157 pClientContext* pc = (pClientContext*)context;
158 proxyData* pdata = NULL;
159 rdpContext* ps = NULL;
160 WINPR_ASSERT(pc);
161 pdata = pc->pdata;
162 WINPR_ASSERT(pdata);
163 ps = (rdpContext*)pdata->ps;
164 WINPR_ASSERT(ps);
165 WLog_DBG(TAG, "called");
166 return freerdp_display_send_monitor_layout(ps, count, monitors);
167}
168
169static BOOL pf_client_send_pointer_system(rdpContext* context,
170 const POINTER_SYSTEM_UPDATE* pointer_system)
171{
172 pClientContext* pc = (pClientContext*)context;
173 proxyData* pdata = NULL;
174 rdpContext* ps = NULL;
175 WINPR_ASSERT(pc);
176 pdata = pc->pdata;
177 WINPR_ASSERT(pdata);
178 ps = (rdpContext*)pdata->ps;
179 WINPR_ASSERT(ps);
180 WINPR_ASSERT(ps->update);
181 WINPR_ASSERT(ps->update->pointer);
182 WINPR_ASSERT(ps->update->pointer->PointerSystem);
183 WLog_DBG(TAG, "called");
184 return ps->update->pointer->PointerSystem(ps, pointer_system);
185}
186
187static BOOL pf_client_send_pointer_position(rdpContext* context,
188 const POINTER_POSITION_UPDATE* pointerPosition)
189{
190 pClientContext* pc = (pClientContext*)context;
191 proxyData* pdata = NULL;
192 rdpContext* ps = NULL;
193 WINPR_ASSERT(pc);
194 pdata = pc->pdata;
195 WINPR_ASSERT(pdata);
196 ps = (rdpContext*)pdata->ps;
197 WINPR_ASSERT(ps);
198 WINPR_ASSERT(ps->update);
199 WINPR_ASSERT(ps->update->pointer);
200 WINPR_ASSERT(ps->update->pointer->PointerPosition);
201 WLog_DBG(TAG, "called");
202 return ps->update->pointer->PointerPosition(ps, pointerPosition);
203}
204
205static BOOL pf_client_send_pointer_color(rdpContext* context,
206 const POINTER_COLOR_UPDATE* pointer_color)
207{
208 pClientContext* pc = (pClientContext*)context;
209 proxyData* pdata = NULL;
210 rdpContext* ps = NULL;
211 WINPR_ASSERT(pc);
212 pdata = pc->pdata;
213 WINPR_ASSERT(pdata);
214 ps = (rdpContext*)pdata->ps;
215 WINPR_ASSERT(ps);
216 WINPR_ASSERT(ps->update);
217 WINPR_ASSERT(ps->update->pointer);
218 WINPR_ASSERT(ps->update->pointer->PointerColor);
219 WLog_DBG(TAG, "called");
220 return ps->update->pointer->PointerColor(ps, pointer_color);
221}
222
223static BOOL pf_client_send_pointer_large(rdpContext* context,
224 const POINTER_LARGE_UPDATE* pointer_large)
225{
226 pClientContext* pc = (pClientContext*)context;
227 proxyData* pdata = NULL;
228 rdpContext* ps = NULL;
229 WINPR_ASSERT(pc);
230 pdata = pc->pdata;
231 WINPR_ASSERT(pdata);
232 ps = (rdpContext*)pdata->ps;
233 WINPR_ASSERT(ps);
234 WINPR_ASSERT(ps->update);
235 WINPR_ASSERT(ps->update->pointer);
236 WINPR_ASSERT(ps->update->pointer->PointerLarge);
237 WLog_DBG(TAG, "called");
238 return ps->update->pointer->PointerLarge(ps, pointer_large);
239}
240
241static BOOL pf_client_send_pointer_new(rdpContext* context, const POINTER_NEW_UPDATE* pointer_new)
242{
243 pClientContext* pc = (pClientContext*)context;
244 proxyData* pdata = NULL;
245 rdpContext* ps = NULL;
246 WINPR_ASSERT(pc);
247 pdata = pc->pdata;
248 WINPR_ASSERT(pdata);
249 ps = (rdpContext*)pdata->ps;
250 WINPR_ASSERT(ps);
251 WINPR_ASSERT(ps->update);
252 WINPR_ASSERT(ps->update->pointer);
253 WINPR_ASSERT(ps->update->pointer->PointerNew);
254 WLog_DBG(TAG, "called");
255 return ps->update->pointer->PointerNew(ps, pointer_new);
256}
257
258static BOOL pf_client_send_pointer_cached(rdpContext* context,
259 const POINTER_CACHED_UPDATE* pointer_cached)
260{
261 pClientContext* pc = (pClientContext*)context;
262 proxyData* pdata = NULL;
263 rdpContext* ps = NULL;
264 WINPR_ASSERT(pc);
265 pdata = pc->pdata;
266 WINPR_ASSERT(pdata);
267 ps = (rdpContext*)pdata->ps;
268 WINPR_ASSERT(ps);
269 WINPR_ASSERT(ps->update);
270 WINPR_ASSERT(ps->update->pointer);
271 WINPR_ASSERT(ps->update->pointer->PointerCached);
272 WLog_DBG(TAG, "called");
273 return ps->update->pointer->PointerCached(ps, pointer_cached);
274}
275
276static BOOL pf_client_save_session_info(rdpContext* context, UINT32 type, void* data)
277{
278 logon_info* logonInfo = NULL;
279 pClientContext* pc = (pClientContext*)context;
280 proxyData* pdata = NULL;
281 rdpContext* ps = NULL;
282 WINPR_ASSERT(pc);
283 pdata = pc->pdata;
284 WINPR_ASSERT(pdata);
285 ps = (rdpContext*)pdata->ps;
286 WINPR_ASSERT(ps);
287 WINPR_ASSERT(ps->update);
288 WINPR_ASSERT(ps->update->SaveSessionInfo);
289
290 WLog_DBG(TAG, "called");
291
292 switch (type)
293 {
294 case INFO_TYPE_LOGON:
295 case INFO_TYPE_LOGON_LONG:
296 {
297 logonInfo = (logon_info*)data;
298 PROXY_LOG_INFO(TAG, pc, "client logon info: Username: %s, Domain: %s",
299 logonInfo->username, logonInfo->domain);
300 break;
301 }
302
303 default:
304 break;
305 }
306
307 return ps->update->SaveSessionInfo(ps, type, data);
308}
309
310static BOOL pf_client_server_status_info(rdpContext* context, UINT32 status)
311{
312 pClientContext* pc = (pClientContext*)context;
313 proxyData* pdata = NULL;
314 rdpContext* ps = NULL;
315 WINPR_ASSERT(pc);
316 pdata = pc->pdata;
317 WINPR_ASSERT(pdata);
318 ps = (rdpContext*)pdata->ps;
319 WINPR_ASSERT(ps);
320 WINPR_ASSERT(ps->update);
321 WINPR_ASSERT(ps->update->ServerStatusInfo);
322
323 WLog_DBG(TAG, "called");
324 return ps->update->ServerStatusInfo(ps, status);
325}
326
327static BOOL pf_client_set_keyboard_indicators(rdpContext* context, UINT16 led_flags)
328{
329 pClientContext* pc = (pClientContext*)context;
330 proxyData* pdata = NULL;
331 rdpContext* ps = NULL;
332 WINPR_ASSERT(pc);
333 pdata = pc->pdata;
334 WINPR_ASSERT(pdata);
335 ps = (rdpContext*)pdata->ps;
336 WINPR_ASSERT(ps);
337 WINPR_ASSERT(ps->update);
338 WINPR_ASSERT(ps->update->SetKeyboardIndicators);
339
340 WLog_DBG(TAG, "called");
341 return ps->update->SetKeyboardIndicators(ps, led_flags);
342}
343
344static BOOL pf_client_set_keyboard_ime_status(rdpContext* context, UINT16 imeId, UINT32 imeState,
345 UINT32 imeConvMode)
346{
347 pClientContext* pc = (pClientContext*)context;
348 proxyData* pdata = NULL;
349 rdpContext* ps = NULL;
350 WINPR_ASSERT(pc);
351 pdata = pc->pdata;
352 WINPR_ASSERT(pdata);
353 ps = (rdpContext*)pdata->ps;
354 WINPR_ASSERT(ps);
355 WINPR_ASSERT(ps->update);
356 WINPR_ASSERT(ps->update->SetKeyboardImeStatus);
357
358 WLog_DBG(TAG, "called");
359 return ps->update->SetKeyboardImeStatus(ps, imeId, imeState, imeConvMode);
360}
361
362static BOOL pf_client_window_create(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
363 const WINDOW_STATE_ORDER* windowState)
364{
365 BOOL rc = 0;
366 pClientContext* pc = (pClientContext*)context;
367 proxyData* pdata = NULL;
368 rdpContext* ps = NULL;
369 WINPR_ASSERT(pc);
370 pdata = pc->pdata;
371 WINPR_ASSERT(pdata);
372 ps = (rdpContext*)pdata->ps;
373 WINPR_ASSERT(ps);
374 WINPR_ASSERT(ps->update);
375 WINPR_ASSERT(ps->update->window);
376 WINPR_ASSERT(ps->update->window->WindowCreate);
377
378 WLog_DBG(TAG, "called");
379 rdp_update_lock(ps->update);
380 rc = ps->update->window->WindowCreate(ps, orderInfo, windowState);
381 rdp_update_unlock(ps->update);
382 return rc;
383}
384
385static BOOL pf_client_window_update(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
386 const WINDOW_STATE_ORDER* windowState)
387{
388 BOOL rc = 0;
389 pClientContext* pc = (pClientContext*)context;
390 proxyData* pdata = NULL;
391 rdpContext* ps = NULL;
392 WINPR_ASSERT(pc);
393 pdata = pc->pdata;
394 WINPR_ASSERT(pdata);
395 ps = (rdpContext*)pdata->ps;
396 WINPR_ASSERT(ps);
397 WINPR_ASSERT(ps->update);
398 WINPR_ASSERT(ps->update->window);
399 WINPR_ASSERT(ps->update->window->WindowUpdate);
400
401 WLog_DBG(TAG, "called");
402 rdp_update_lock(ps->update);
403 rc = ps->update->window->WindowUpdate(ps, orderInfo, windowState);
404 rdp_update_unlock(ps->update);
405 return rc;
406}
407
408static BOOL pf_client_window_icon(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
409 const WINDOW_ICON_ORDER* windowIcon)
410{
411 BOOL rc = 0;
412 pClientContext* pc = (pClientContext*)context;
413 proxyData* pdata = NULL;
414 rdpContext* ps = NULL;
415 WINPR_ASSERT(pc);
416 pdata = pc->pdata;
417 WINPR_ASSERT(pdata);
418 ps = (rdpContext*)pdata->ps;
419 WINPR_ASSERT(ps);
420 WINPR_ASSERT(ps->update);
421 WINPR_ASSERT(ps->update->window);
422 WINPR_ASSERT(ps->update->window->WindowIcon);
423
424 WLog_DBG(TAG, "called");
425 rdp_update_lock(ps->update);
426 rc = ps->update->window->WindowIcon(ps, orderInfo, windowIcon);
427 rdp_update_unlock(ps->update);
428 return rc;
429}
430
431static BOOL pf_client_window_cached_icon(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
432 const WINDOW_CACHED_ICON_ORDER* windowCachedIcon)
433{
434 BOOL rc = 0;
435 pClientContext* pc = (pClientContext*)context;
436 proxyData* pdata = NULL;
437 rdpContext* ps = NULL;
438 WINPR_ASSERT(pc);
439 pdata = pc->pdata;
440 WINPR_ASSERT(pdata);
441 ps = (rdpContext*)pdata->ps;
442 WINPR_ASSERT(ps);
443 WINPR_ASSERT(ps->update);
444 WINPR_ASSERT(ps->update->window);
445 WINPR_ASSERT(ps->update->window->WindowCachedIcon);
446
447 WLog_DBG(TAG, "called");
448 rdp_update_lock(ps->update);
449 rc = ps->update->window->WindowCachedIcon(ps, orderInfo, windowCachedIcon);
450 rdp_update_unlock(ps->update);
451 return rc;
452}
453
454static BOOL pf_client_window_delete(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo)
455{
456 BOOL rc = 0;
457 pClientContext* pc = (pClientContext*)context;
458 proxyData* pdata = NULL;
459 rdpContext* ps = NULL;
460 WINPR_ASSERT(pc);
461 pdata = pc->pdata;
462 WINPR_ASSERT(pdata);
463 ps = (rdpContext*)pdata->ps;
464 WINPR_ASSERT(ps);
465 WINPR_ASSERT(ps->update);
466 WINPR_ASSERT(ps->update->window);
467 WINPR_ASSERT(ps->update->window->WindowDelete);
468
469 WLog_DBG(TAG, "called");
470 rdp_update_lock(ps->update);
471 rc = ps->update->window->WindowDelete(ps, orderInfo);
472 rdp_update_unlock(ps->update);
473 return rc;
474}
475
476static BOOL pf_client_notify_icon_create(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
477 const NOTIFY_ICON_STATE_ORDER* notifyIconState)
478{
479 BOOL rc = 0;
480 pClientContext* pc = (pClientContext*)context;
481 proxyData* pdata = NULL;
482 rdpContext* ps = NULL;
483 WINPR_ASSERT(pc);
484 pdata = pc->pdata;
485 WINPR_ASSERT(pdata);
486 ps = (rdpContext*)pdata->ps;
487 WINPR_ASSERT(ps);
488 WINPR_ASSERT(ps->update);
489 WINPR_ASSERT(ps->update->window);
490 WINPR_ASSERT(ps->update->window->NotifyIconCreate);
491
492 WLog_DBG(TAG, "called");
493 rdp_update_lock(ps->update);
494 rc = ps->update->window->NotifyIconCreate(ps, orderInfo, notifyIconState);
495 rdp_update_unlock(ps->update);
496 return rc;
497}
498
499static BOOL pf_client_notify_icon_update(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
500 const NOTIFY_ICON_STATE_ORDER* notifyIconState)
501{
502 BOOL rc = 0;
503 pClientContext* pc = (pClientContext*)context;
504 proxyData* pdata = NULL;
505 rdpContext* ps = NULL;
506 WINPR_ASSERT(pc);
507 pdata = pc->pdata;
508 WINPR_ASSERT(pdata);
509 ps = (rdpContext*)pdata->ps;
510 WINPR_ASSERT(ps);
511 WINPR_ASSERT(ps->update);
512 WINPR_ASSERT(ps->update->window);
513 WINPR_ASSERT(ps->update->window->NotifyIconUpdate);
514
515 WLog_DBG(TAG, "called");
516 rdp_update_lock(ps->update);
517 rc = ps->update->window->NotifyIconUpdate(ps, orderInfo, notifyIconState);
518 rdp_update_unlock(ps->update);
519 return rc;
520}
521
522static BOOL pf_client_notify_icon_delete(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo)
523{
524 BOOL rc = 0;
525
526 pClientContext* pc = (pClientContext*)context;
527 proxyData* pdata = NULL;
528 rdpContext* ps = NULL;
529 WINPR_ASSERT(pc);
530 pdata = pc->pdata;
531 WINPR_ASSERT(pdata);
532 ps = (rdpContext*)pdata->ps;
533 WINPR_ASSERT(ps);
534 WINPR_ASSERT(ps->update);
535 WINPR_ASSERT(ps->update->window);
536 WINPR_ASSERT(ps->update->window->NotifyIconDelete);
537
538 WLog_DBG(TAG, "called");
539 rdp_update_lock(ps->update);
540 rc = ps->update->window->NotifyIconDelete(ps, orderInfo);
541 rdp_update_unlock(ps->update);
542 return rc;
543}
544
545static BOOL pf_client_monitored_desktop(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo,
546 const MONITORED_DESKTOP_ORDER* monitoredDesktop)
547{
548 BOOL rc = 0;
549 pClientContext* pc = (pClientContext*)context;
550 proxyData* pdata = NULL;
551 rdpContext* ps = NULL;
552 WINPR_ASSERT(pc);
553 pdata = pc->pdata;
554 WINPR_ASSERT(pdata);
555 ps = (rdpContext*)pdata->ps;
556 WINPR_ASSERT(ps);
557 WINPR_ASSERT(ps->update);
558 WINPR_ASSERT(ps->update->window);
559 WINPR_ASSERT(ps->update->window->MonitoredDesktop);
560
561 WLog_DBG(TAG, "called");
562 rdp_update_lock(ps->update);
563 rc = ps->update->window->MonitoredDesktop(ps, orderInfo, monitoredDesktop);
564 rdp_update_unlock(ps->update);
565 return rc;
566}
567
568static BOOL pf_client_non_monitored_desktop(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo)
569{
570 BOOL rc = 0;
571 pClientContext* pc = (pClientContext*)context;
572 proxyData* pdata = NULL;
573 rdpContext* ps = NULL;
574 WINPR_ASSERT(pc);
575 pdata = pc->pdata;
576 WINPR_ASSERT(pdata);
577 ps = (rdpContext*)pdata->ps;
578 WINPR_ASSERT(ps);
579 WINPR_ASSERT(ps->update);
580 WINPR_ASSERT(ps->update->window);
581 WINPR_ASSERT(ps->update->window->NonMonitoredDesktop);
582
583 WLog_DBG(TAG, "called");
584 rdp_update_lock(ps->update);
585 rc = ps->update->window->NonMonitoredDesktop(ps, orderInfo);
586 rdp_update_unlock(ps->update);
587 return rc;
588}
589
590void pf_server_register_update_callbacks(rdpUpdate* update)
591{
592 WINPR_ASSERT(update);
593 update->RefreshRect = pf_server_refresh_rect;
594 update->SuppressOutput = pf_server_suppress_output;
595}
596
597void pf_client_register_update_callbacks(rdpUpdate* update)
598{
599 WINPR_ASSERT(update);
600 update->BeginPaint = pf_client_begin_paint;
601 update->EndPaint = pf_client_end_paint;
602 update->BitmapUpdate = pf_client_bitmap_update;
603 update->DesktopResize = pf_client_desktop_resize;
604 update->RemoteMonitors = pf_client_remote_monitors;
605 update->SaveSessionInfo = pf_client_save_session_info;
606 update->ServerStatusInfo = pf_client_server_status_info;
607 update->SetKeyboardIndicators = pf_client_set_keyboard_indicators;
608 update->SetKeyboardImeStatus = pf_client_set_keyboard_ime_status;
609
610 /* Rail window updates */
611 update->window->WindowCreate = pf_client_window_create;
612 update->window->WindowUpdate = pf_client_window_update;
613 update->window->WindowIcon = pf_client_window_icon;
614 update->window->WindowCachedIcon = pf_client_window_cached_icon;
615 update->window->WindowDelete = pf_client_window_delete;
616 update->window->NotifyIconCreate = pf_client_notify_icon_create;
617 update->window->NotifyIconUpdate = pf_client_notify_icon_update;
618 update->window->NotifyIconDelete = pf_client_notify_icon_delete;
619 update->window->MonitoredDesktop = pf_client_monitored_desktop;
620 update->window->NonMonitoredDesktop = pf_client_non_monitored_desktop;
621
622 /* Pointer updates */
623 update->pointer->PointerSystem = pf_client_send_pointer_system;
624 update->pointer->PointerPosition = pf_client_send_pointer_position;
625 update->pointer->PointerColor = pf_client_send_pointer_color;
626 update->pointer->PointerLarge = pf_client_send_pointer_large;
627 update->pointer->PointerNew = pf_client_send_pointer_new;
628 update->pointer->PointerCached = pf_client_send_pointer_cached;
629}
FREERDP_API BOOL freerdp_settings_copy_item(rdpSettings *dst, const rdpSettings *src, SSIZE_T id)
copies one setting identified by id from src to dst