2
* FreeRDP: A Remote Desktop Protocol Client
5
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7
* Licensed under the Apache License, Version 2.0 (the "License");
8
* you may not use this file except in compliance with the License.
9
* You may obtain a copy of the License at
11
* http://www.apache.org/licenses/LICENSE-2.0
13
* Unless required by applicable law or agreed to in writing, software
14
* distributed under the License is distributed on an "AS IS" BASIS,
15
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
* See the License for the specific language governing permissions and
17
* limitations under the License.
22
void rdp_write_client_input_pdu_header(STREAM* s, uint16 number)
24
stream_write_uint16(s, 1); /* numberEvents (2 bytes) */
25
stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
28
void rdp_write_input_event_header(STREAM* s, uint32 time, uint16 type)
30
stream_write_uint32(s, time); /* eventTime (4 bytes) */
31
stream_write_uint16(s, type); /* messageType (2 bytes) */
34
STREAM* rdp_client_input_pdu_init(rdpRdp* rdp, uint16 type)
37
s = rdp_data_pdu_init(rdp);
38
rdp_write_client_input_pdu_header(s, 1);
39
rdp_write_input_event_header(s, 0, type);
43
void rdp_send_client_input_pdu(rdpRdp* rdp, STREAM* s)
45
rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_INPUT, rdp->mcs->user_id);
48
void input_write_synchronize_event(STREAM* s, uint32 flags)
50
stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
51
stream_write_uint32(s, flags); /* toggleFlags (4 bytes) */
54
void input_send_synchronize_event(rdpInput* input, uint32 flags)
57
rdpRdp* rdp = input->context->rdp;
59
s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SYNC);
60
input_write_synchronize_event(s, flags);
61
rdp_send_client_input_pdu(rdp, s);
64
void input_write_keyboard_event(STREAM* s, uint16 flags, uint16 code)
66
stream_write_uint16(s, flags); /* keyboardFlags (2 bytes) */
67
stream_write_uint16(s, code); /* keyCode (2 bytes) */
68
stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
71
void input_send_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
74
rdpRdp* rdp = input->context->rdp;
76
s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SCANCODE);
77
input_write_keyboard_event(s, flags, code);
78
rdp_send_client_input_pdu(rdp, s);
81
void input_write_unicode_keyboard_event(STREAM* s, uint16 code)
83
stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */
84
stream_write_uint16(s, code); /* unicodeCode (2 bytes) */
85
stream_write_uint16(s, 0); /* pad2OctetsB (2 bytes) */
88
void input_send_unicode_keyboard_event(rdpInput* input, uint16 code)
91
rdpRdp* rdp = input->context->rdp;
93
s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_UNICODE);
94
input_write_unicode_keyboard_event(s, code);
95
rdp_send_client_input_pdu(rdp, s);
98
void input_write_mouse_event(STREAM* s, uint16 flags, uint16 x, uint16 y)
100
stream_write_uint16(s, flags); /* pointerFlags (2 bytes) */
101
stream_write_uint16(s, x); /* xPos (2 bytes) */
102
stream_write_uint16(s, y); /* yPos (2 bytes) */
105
void input_send_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
108
rdpRdp* rdp = input->context->rdp;
110
s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSE);
111
input_write_mouse_event(s, flags, x, y);
112
rdp_send_client_input_pdu(rdp, s);
115
void input_write_extended_mouse_event(STREAM* s, uint16 flags, uint16 x, uint16 y)
117
stream_write_uint16(s, flags); /* pointerFlags (2 bytes) */
118
stream_write_uint16(s, x); /* xPos (2 bytes) */
119
stream_write_uint16(s, y); /* yPos (2 bytes) */
122
void input_send_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
125
rdpRdp* rdp = input->context->rdp;
127
s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSEX);
128
input_write_extended_mouse_event(s, flags, x, y);
129
rdp_send_client_input_pdu(rdp, s);
132
void input_send_fastpath_synchronize_event(rdpInput* input, uint32 flags)
135
rdpRdp* rdp = input->context->rdp;
137
/* The FastPath Synchronization eventFlags has identical values as SlowPath */
138
s = fastpath_input_pdu_init(rdp->fastpath, (uint8) flags, FASTPATH_INPUT_EVENT_SYNC);
139
fastpath_send_input_pdu(rdp->fastpath, s);
142
void input_send_fastpath_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
145
uint8 eventFlags = 0;
146
rdpRdp* rdp = input->context->rdp;
148
eventFlags |= (flags & KBD_FLAGS_RELEASE) ? FASTPATH_INPUT_KBDFLAGS_RELEASE : 0;
149
eventFlags |= (flags & KBD_FLAGS_EXTENDED) ? FASTPATH_INPUT_KBDFLAGS_EXTENDED : 0;
150
s = fastpath_input_pdu_init(rdp->fastpath, eventFlags, FASTPATH_INPUT_EVENT_SCANCODE);
151
stream_write_uint8(s, code); /* keyCode (1 byte) */
152
fastpath_send_input_pdu(rdp->fastpath, s);
155
void input_send_fastpath_unicode_keyboard_event(rdpInput* input, uint16 code)
158
rdpRdp* rdp = input->context->rdp;
160
s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_UNICODE);
161
stream_write_uint16(s, code); /* unicodeCode (2 bytes) */
162
fastpath_send_input_pdu(rdp->fastpath, s);
165
void input_send_fastpath_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
168
rdpRdp* rdp = input->context->rdp;
170
s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSE);
171
input_write_mouse_event(s, flags, x, y);
172
fastpath_send_input_pdu(rdp->fastpath, s);
175
void input_send_fastpath_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
178
rdpRdp* rdp = input->context->rdp;
180
s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSEX);
181
input_write_extended_mouse_event(s, flags, x, y);
182
fastpath_send_input_pdu(rdp->fastpath, s);
185
void input_register_client_callbacks(rdpInput* input)
187
rdpRdp* rdp = input->context->rdp;
189
if (rdp->settings->fastpath_input)
191
input->SynchronizeEvent = input_send_fastpath_synchronize_event;
192
input->KeyboardEvent = input_send_fastpath_keyboard_event;
193
input->UnicodeKeyboardEvent = input_send_fastpath_unicode_keyboard_event;
194
input->MouseEvent = input_send_fastpath_mouse_event;
195
input->ExtendedMouseEvent = input_send_fastpath_extended_mouse_event;
199
input->SynchronizeEvent = input_send_synchronize_event;
200
input->KeyboardEvent = input_send_keyboard_event;
201
input->UnicodeKeyboardEvent = input_send_unicode_keyboard_event;
202
input->MouseEvent = input_send_mouse_event;
203
input->ExtendedMouseEvent = input_send_extended_mouse_event;
207
rdpInput* input_new(rdpRdp* rdp)
211
input = (rdpInput*) xzalloc(sizeof(rdpInput));
221
void input_free(rdpInput* input)