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