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 return pf_server_check_and_sync_input_state(pc);
66}
67
68WINPR_ATTR_NODISCARD
69static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
70{
71 const proxyConfig* config = nullptr;
72 proxyKeyboardEventInfo event = WINPR_C_ARRAY_INIT;
73 pServerContext* ps = nullptr;
74 pClientContext* pc = nullptr;
75
76 WINPR_ASSERT(input);
77 ps = (pServerContext*)input->context;
78 WINPR_ASSERT(ps);
79 WINPR_ASSERT(ps->pdata);
80
81 pc = ps->pdata->pc;
82 WINPR_ASSERT(pc);
83
84 config = ps->pdata->config;
85 WINPR_ASSERT(config);
86
87 if (!pf_server_check_and_sync_input_state(pc))
88 return TRUE;
89
90 if (!config->Keyboard)
91 return TRUE;
92
93 event.flags = flags;
94 event.rdp_scan_code = code;
95
96 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
97 return freerdp_input_send_keyboard_event(pc->context.input, flags, code);
98
99 return TRUE;
100}
101
102WINPR_ATTR_NODISCARD
103static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
104{
105 const proxyConfig* config = nullptr;
106 proxyUnicodeEventInfo event = WINPR_C_ARRAY_INIT;
107 pServerContext* ps = nullptr;
108 pClientContext* pc = nullptr;
109
110 WINPR_ASSERT(input);
111 ps = (pServerContext*)input->context;
112 WINPR_ASSERT(ps);
113 WINPR_ASSERT(ps->pdata);
114
115 pc = ps->pdata->pc;
116 WINPR_ASSERT(pc);
117
118 config = ps->pdata->config;
119 WINPR_ASSERT(config);
120
121 if (!pf_server_check_and_sync_input_state(pc))
122 return TRUE;
123
124 if (!config->Keyboard)
125 return TRUE;
126
127 event.flags = flags;
128 event.code = code;
129 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
130 return freerdp_input_send_unicode_keyboard_event(pc->context.input, flags, code);
131 return TRUE;
132}
133
134WINPR_ATTR_NODISCARD
135static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
136{
137 proxyMouseEventInfo event = WINPR_C_ARRAY_INIT;
138 const proxyConfig* config = nullptr;
139 pServerContext* ps = nullptr;
140 pClientContext* pc = nullptr;
141
142 WINPR_ASSERT(input);
143 ps = (pServerContext*)input->context;
144 WINPR_ASSERT(ps);
145 WINPR_ASSERT(ps->pdata);
146
147 pc = ps->pdata->pc;
148 WINPR_ASSERT(pc);
149
150 config = ps->pdata->config;
151 WINPR_ASSERT(config);
152
153 if (!pf_server_check_and_sync_input_state(pc))
154 return TRUE;
155
156 if (!config->Mouse)
157 return TRUE;
158
159 event.flags = flags;
160 event.x = x;
161 event.y = y;
162
163 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
164 return freerdp_input_send_mouse_event(pc->context.input, flags, x, y);
165
166 return TRUE;
167}
168
169WINPR_ATTR_NODISCARD
170static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
171{
172 const proxyConfig* config = nullptr;
173 proxyMouseExEventInfo event = WINPR_C_ARRAY_INIT;
174 pServerContext* ps = nullptr;
175 pClientContext* pc = nullptr;
176
177 WINPR_ASSERT(input);
178 ps = (pServerContext*)input->context;
179 WINPR_ASSERT(ps);
180 WINPR_ASSERT(ps->pdata);
181
182 pc = ps->pdata->pc;
183 WINPR_ASSERT(pc);
184
185 config = ps->pdata->config;
186 WINPR_ASSERT(config);
187
188 if (!pf_server_check_and_sync_input_state(pc))
189 return TRUE;
190
191 if (!config->Mouse)
192 return TRUE;
193
194 event.flags = flags;
195 event.x = x;
196 event.y = y;
197 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
198 return freerdp_input_send_extended_mouse_event(pc->context.input, flags, x, y);
199 return TRUE;
200}
201
202void pf_server_register_input_callbacks(rdpInput* input)
203{
204 WINPR_ASSERT(input);
205
206 input->SynchronizeEvent = pf_server_synchronize_event;
207 input->KeyboardEvent = pf_server_keyboard_event;
208 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
209 input->MouseEvent = pf_server_mouse_event;
210 input->ExtendedMouseEvent = pf_server_extended_mouse_event;
211}