24#include <winpr/assert.h>
27#include <freerdp/server/proxy/proxy_config.h>
28#include <freerdp/server/proxy/proxy_context.h>
30#include "proxy_modules.h"
33static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
37 if (!freerdp_is_active_state(&pc->context))
39 if (pc->input_state_sync_pending)
41 BOOL rc = freerdp_input_send_synchronize_event(pc->context.input, pc->input_state);
43 pc->input_state_sync_pending = FALSE;
49static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
51 pServerContext* ps =
nullptr;
52 pClientContext* pc =
nullptr;
55 ps = (pServerContext*)input->context;
57 WINPR_ASSERT(ps->pdata);
62 pc->input_state = flags;
63 pc->input_state_sync_pending = TRUE;
65 return pf_server_check_and_sync_input_state(pc);
69static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
71 const proxyConfig* config =
nullptr;
73 pServerContext* ps =
nullptr;
74 pClientContext* pc =
nullptr;
77 ps = (pServerContext*)input->context;
79 WINPR_ASSERT(ps->pdata);
84 config = ps->pdata->config;
87 if (!pf_server_check_and_sync_input_state(pc))
90 if (!config->Keyboard)
94 event.rdp_scan_code = code;
96 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
97 return freerdp_input_send_keyboard_event(pc->context.input, flags, code);
103static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
105 const proxyConfig* config =
nullptr;
107 pServerContext* ps =
nullptr;
108 pClientContext* pc =
nullptr;
111 ps = (pServerContext*)input->context;
113 WINPR_ASSERT(ps->pdata);
118 config = ps->pdata->config;
119 WINPR_ASSERT(config);
121 if (!pf_server_check_and_sync_input_state(pc))
124 if (!config->Keyboard)
129 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
130 return freerdp_input_send_unicode_keyboard_event(pc->context.input, flags, code);
135static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
138 const proxyConfig* config =
nullptr;
139 pServerContext* ps =
nullptr;
140 pClientContext* pc =
nullptr;
143 ps = (pServerContext*)input->context;
145 WINPR_ASSERT(ps->pdata);
150 config = ps->pdata->config;
151 WINPR_ASSERT(config);
153 if (!pf_server_check_and_sync_input_state(pc))
163 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
164 return freerdp_input_send_mouse_event(pc->context.input, flags, x, y);
170static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
172 const proxyConfig* config =
nullptr;
174 pServerContext* ps =
nullptr;
175 pClientContext* pc =
nullptr;
178 ps = (pServerContext*)input->context;
180 WINPR_ASSERT(ps->pdata);
185 config = ps->pdata->config;
186 WINPR_ASSERT(config);
188 if (!pf_server_check_and_sync_input_state(pc))
197 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
198 return freerdp_input_send_extended_mouse_event(pc->context.input, flags, x, y);
202void pf_server_register_input_callbacks(rdpInput* input)
206 input->SynchronizeEvent = pf_server_synchronize_event;
207 input->KeyboardEvent = pf_server_keyboard_event;
208 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
209 input->MouseEvent = pf_server_mouse_event;
210 input->ExtendedMouseEvent = pf_server_extended_mouse_event;