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 if (!pf_server_check_and_sync_input_state(pc))
71static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
73 const proxyConfig* config =
nullptr;
75 pServerContext* ps =
nullptr;
76 pClientContext* pc =
nullptr;
79 ps = (pServerContext*)input->context;
81 WINPR_ASSERT(ps->pdata);
86 config = ps->pdata->config;
89 if (!pf_server_check_and_sync_input_state(pc))
92 if (!config->Keyboard)
96 event.rdp_scan_code = code;
98 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
99 return freerdp_input_send_keyboard_event(pc->context.input, flags, code);
105static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
107 const proxyConfig* config =
nullptr;
109 pServerContext* ps =
nullptr;
110 pClientContext* pc =
nullptr;
113 ps = (pServerContext*)input->context;
115 WINPR_ASSERT(ps->pdata);
120 config = ps->pdata->config;
121 WINPR_ASSERT(config);
123 if (!pf_server_check_and_sync_input_state(pc))
126 if (!config->Keyboard)
131 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
132 return freerdp_input_send_unicode_keyboard_event(pc->context.input, flags, code);
137static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
140 const proxyConfig* config =
nullptr;
141 pServerContext* ps =
nullptr;
142 pClientContext* pc =
nullptr;
145 ps = (pServerContext*)input->context;
147 WINPR_ASSERT(ps->pdata);
152 config = ps->pdata->config;
153 WINPR_ASSERT(config);
155 if (!pf_server_check_and_sync_input_state(pc))
165 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
166 return freerdp_input_send_mouse_event(pc->context.input, flags, x, y);
172static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
174 const proxyConfig* config =
nullptr;
176 pServerContext* ps =
nullptr;
177 pClientContext* pc =
nullptr;
180 ps = (pServerContext*)input->context;
182 WINPR_ASSERT(ps->pdata);
187 config = ps->pdata->config;
188 WINPR_ASSERT(config);
190 if (!pf_server_check_and_sync_input_state(pc))
199 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
200 return freerdp_input_send_extended_mouse_event(pc->context.input, flags, x, y);
204void pf_server_register_input_callbacks(rdpInput* input)
208 input->SynchronizeEvent = pf_server_synchronize_event;
209 input->KeyboardEvent = pf_server_keyboard_event;
210 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
211 input->MouseEvent = pf_server_mouse_event;
212 input->ExtendedMouseEvent = pf_server_extended_mouse_event;