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