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