FreeRDP
Loading...
Searching...
No Matches
pf_input.c
1
24#include <winpr/assert.h>
25
26#include "pf_input.h"
27#include "pf_client.h"
28#include "pf_server.h"
29#include <freerdp/server/proxy/proxy_config.h>
30
31#include "proxy_modules.h"
32
33WINPR_ATTR_NODISCARD
34static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
35{
36 WINPR_ASSERT(pc);
37
38 if (!freerdp_is_active_state(&pc->cctx.context))
39 return FALSE;
40 if (pc->input_state_sync_pending)
41 {
42 BOOL rc = freerdp_input_send_synchronize_event(pc->cctx.context.input, pc->input_state);
43 if (rc)
44 pc->input_state_sync_pending = FALSE;
45 }
46 return TRUE;
47}
48
49WINPR_ATTR_NODISCARD
50static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
51{
52 WINPR_ASSERT(input);
53 pServerContext* ps = (pServerContext*)input->context;
54 WINPR_ASSERT(ps);
55 WINPR_ASSERT(ps->pdata);
56
57 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
58 if (!pc)
59 return TRUE;
60
61 pc->input_state = flags;
62 pc->input_state_sync_pending = TRUE;
63
64 if (!pf_server_check_and_sync_input_state(pc))
65 return TRUE;
66 return TRUE;
67}
68
69WINPR_ATTR_NODISCARD
70static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
71{
72 proxyKeyboardEventInfo event = WINPR_C_ARRAY_INIT;
73
74 WINPR_ASSERT(input);
75 pServerContext* ps = (pServerContext*)input->context;
76 WINPR_ASSERT(ps);
77 WINPR_ASSERT(ps->pdata);
78
79 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
80 if (!pc)
81 return TRUE;
82
83 const proxyConfig* config = ps->pdata->config;
84 WINPR_ASSERT(config);
85
86 if (!pf_server_check_and_sync_input_state(pc))
87 return TRUE;
88
89 if (!config->Keyboard)
90 return TRUE;
91
92 event.flags = flags;
93 event.rdp_scan_code = code;
94
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);
97
98 return TRUE;
99}
100
101WINPR_ATTR_NODISCARD
102static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
103{
104 proxyUnicodeEventInfo event = WINPR_C_ARRAY_INIT;
105
106 WINPR_ASSERT(input);
107 pServerContext* ps = (pServerContext*)input->context;
108 WINPR_ASSERT(ps);
109 WINPR_ASSERT(ps->pdata);
110
111 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
112 if (!pc)
113 return TRUE;
114
115 const proxyConfig* config = ps->pdata->config;
116 WINPR_ASSERT(config);
117
118 if (!pf_server_check_and_sync_input_state(pc))
119 return TRUE;
120
121 if (!config->Keyboard)
122 return TRUE;
123
124 event.flags = flags;
125 event.code = code;
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);
128 return TRUE;
129}
130
131WINPR_ATTR_NODISCARD
132static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
133{
134 proxyMouseEventInfo event = WINPR_C_ARRAY_INIT;
135
136 WINPR_ASSERT(input);
137 pServerContext* ps = (pServerContext*)input->context;
138 WINPR_ASSERT(ps);
139 WINPR_ASSERT(ps->pdata);
140
141 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
142 if (!pc)
143 return TRUE;
144
145 const proxyConfig* config = ps->pdata->config;
146 WINPR_ASSERT(config);
147
148 if (!pf_server_check_and_sync_input_state(pc))
149 return TRUE;
150
151 if (!config->Mouse)
152 return TRUE;
153
154 event.flags = flags;
155 event.x = x;
156 event.y = y;
157
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);
160
161 return TRUE;
162}
163
164WINPR_ATTR_NODISCARD
165static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
166{
167 proxyMouseExEventInfo event = WINPR_C_ARRAY_INIT;
168
169 WINPR_ASSERT(input);
170
171 pServerContext* ps = (pServerContext*)input->context;
172 WINPR_ASSERT(ps);
173 WINPR_ASSERT(ps->pdata);
174
175 pClientContext* pc = proxy_data_get_client_context(ps->pdata);
176 if (!pc)
177 return TRUE;
178
179 const proxyConfig* config = ps->pdata->config;
180 WINPR_ASSERT(config);
181
182 if (!pf_server_check_and_sync_input_state(pc))
183 return TRUE;
184
185 if (!config->Mouse)
186 return TRUE;
187
188 event.flags = flags;
189 event.x = x;
190 event.y = y;
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);
193 return TRUE;
194}
195
196void pf_server_register_input_callbacks(rdpInput* input)
197{
198 WINPR_ASSERT(input);
199
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;
205}