FreeRDP
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 
38 static 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 
51 static 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 
70 static 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 
91 static 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 
116 static 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 
132 static 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 
154 static 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 
169 static 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 
187 static 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 
205 static 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 
223 static 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 
241 static 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 
258 static 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 
276 static 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 
310 static 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 
327 static 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 
344 static 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 
362 static 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 
385 static 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 
408 static 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 
431 static 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 
454 static 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 
476 static 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 
499 static 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 
522 static 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 
545 static 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 
568 static 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 
590 void 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 
597 void 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
Definition: settings_str.c:429