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