24#include <winpr/assert.h>
26#include <freerdp/message.h>
31#include <freerdp/server/proxy/proxy_config.h>
33#include "proxy_modules.h"
36static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
40 if (!freerdp_is_active_state(&pc->cctx.context))
42 if (pc->input_state_sync_pending)
44 BOOL rc = freerdp_input_send_synchronize_event(pc->cctx.context.input, pc->input_state);
46 pc->input_state_sync_pending = FALSE;
52static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
55 pServerContext* ps = (pServerContext*)input->context;
57 WINPR_ASSERT(ps->pdata);
59 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
63 return pf_client_post_message(pc, MakeMessageId(Input, SynchronizeEvent), flags,
nullptr);
67static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
72 pServerContext* ps = (pServerContext*)input->context;
74 WINPR_ASSERT(ps->pdata);
76 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
80 const proxyConfig* config = ps->pdata->config;
83 if (!config->Keyboard)
87 event.rdp_scan_code = code;
89 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
90 return pf_client_post_message(pc, MakeMessageId(Input, KeyboardEvent), flags,
97static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
102 pServerContext* ps = (pServerContext*)input->context;
104 WINPR_ASSERT(ps->pdata);
106 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
110 const proxyConfig* config = ps->pdata->config;
111 WINPR_ASSERT(config);
113 if (!config->Keyboard)
118 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
119 return pf_client_post_message(pc, MakeMessageId(Input, UnicodeKeyboardEvent), flags,
120 (
void*)(
size_t)code);
125static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
130 pServerContext* ps = (pServerContext*)input->context;
132 WINPR_ASSERT(ps->pdata);
134 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
138 const proxyConfig* config = ps->pdata->config;
139 WINPR_ASSERT(config);
148 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
149 return pf_client_post_message(pc, MakeMessageId(Input, MouseEvent), flags,
150 (
void*)(
size_t)(((UINT32)x << 16) | y));
156static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
162 pServerContext* ps = (pServerContext*)input->context;
164 WINPR_ASSERT(ps->pdata);
166 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
170 const proxyConfig* config = ps->pdata->config;
171 WINPR_ASSERT(config);
179 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE_EX, pc->pdata, &event))
180 return pf_client_post_message(pc, MakeMessageId(Input, ExtendedMouseEvent), flags,
181 (
void*)(
size_t)(((UINT32)x << 16) | y));
185BOOL pf_client_process_input_message(pClientContext* pc,
const wMessage* msg)
190 const UINT32 type = GetMessageType(msg->id);
191 if (type == Input_SynchronizeEvent)
193 pc->input_state = (UINT32)(
size_t)msg->wParam;
194 pc->input_state_sync_pending = TRUE;
197 if (!pf_server_check_and_sync_input_state(pc))
200 rdpInput* input = pc->cctx.context.input;
201 const UINT16 flags = (UINT16)(
size_t)msg->wParam;
202 const UINT32 arg = (UINT32)(
size_t)msg->lParam;
203 const UINT16 x = (UINT16)(arg >> 16);
204 const UINT16 y = (UINT16)(arg & 0xFFFF);
208 case Input_SynchronizeEvent:
210 case Input_KeyboardEvent:
211 return freerdp_input_send_keyboard_event(input, flags, (UINT8)arg);
212 case Input_UnicodeKeyboardEvent:
213 return freerdp_input_send_unicode_keyboard_event(input, flags, (UINT16)arg);
214 case Input_MouseEvent:
215 return freerdp_input_send_mouse_event(input, flags, x, y);
216 case Input_ExtendedMouseEvent:
217 return freerdp_input_send_extended_mouse_event(input, flags, x, y);
223void pf_server_register_input_callbacks(rdpInput* input)
227 input->SynchronizeEvent = pf_server_synchronize_event;
228 input->KeyboardEvent = pf_server_keyboard_event;
229 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
230 input->MouseEvent = pf_server_mouse_event;
231 input->ExtendedMouseEvent = pf_server_extended_mouse_event;