24#include <winpr/assert.h>
29#include <freerdp/server/proxy/proxy_config.h>
31#include "proxy_modules.h"
34static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
38 if (!freerdp_is_active_state(&pc->cctx.context))
40 if (pc->input_state_sync_pending)
42 BOOL rc = freerdp_input_send_synchronize_event(pc->cctx.context.input, pc->input_state);
44 pc->input_state_sync_pending = FALSE;
50static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
53 pServerContext* ps = (pServerContext*)input->context;
55 WINPR_ASSERT(ps->pdata);
57 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
61 pc->input_state = flags;
62 pc->input_state_sync_pending = TRUE;
64 if (!pf_server_check_and_sync_input_state(pc))
70static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
75 pServerContext* ps = (pServerContext*)input->context;
77 WINPR_ASSERT(ps->pdata);
79 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
83 const proxyConfig* config = ps->pdata->config;
86 if (!pf_server_check_and_sync_input_state(pc))
89 if (!config->Keyboard)
93 event.rdp_scan_code = code;
95 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
96 return freerdp_input_send_keyboard_event(pc->cctx.context.input, flags, code);
102static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
107 pServerContext* ps = (pServerContext*)input->context;
109 WINPR_ASSERT(ps->pdata);
111 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
115 const proxyConfig* config = ps->pdata->config;
116 WINPR_ASSERT(config);
118 if (!pf_server_check_and_sync_input_state(pc))
121 if (!config->Keyboard)
126 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
127 return freerdp_input_send_unicode_keyboard_event(pc->cctx.context.input, flags, code);
132static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
137 pServerContext* ps = (pServerContext*)input->context;
139 WINPR_ASSERT(ps->pdata);
141 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
145 const proxyConfig* config = ps->pdata->config;
146 WINPR_ASSERT(config);
148 if (!pf_server_check_and_sync_input_state(pc))
158 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
159 return freerdp_input_send_mouse_event(pc->cctx.context.input, flags, x, y);
165static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
171 pServerContext* ps = (pServerContext*)input->context;
173 WINPR_ASSERT(ps->pdata);
175 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
179 const proxyConfig* config = ps->pdata->config;
180 WINPR_ASSERT(config);
182 if (!pf_server_check_and_sync_input_state(pc))
191 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE_EX, pc->pdata, &event))
192 return freerdp_input_send_extended_mouse_event(pc->cctx.context.input, flags, x, y);
196void pf_server_register_input_callbacks(rdpInput* input)
200 input->SynchronizeEvent = pf_server_synchronize_event;
201 input->KeyboardEvent = pf_server_keyboard_event;
202 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
203 input->MouseEvent = pf_server_mouse_event;
204 input->ExtendedMouseEvent = pf_server_extended_mouse_event;