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