7
#include <freerdp/freerdp.h>
10
#include "xf_keyboard.h"
13
xf_handle_event_Expose(xfInfo * xfi, XEvent * xevent)
20
if (xevent->xexpose.window == xfi->wnd)
22
x = xevent->xexpose.x;
23
y = xevent->xexpose.y;
24
cx = xevent->xexpose.width;
25
cy = xevent->xexpose.height;
26
XCopyArea(xfi->display, xfi->backstore, xfi->wnd, xfi->gc_default,
33
xf_handle_event_VisibilityNotify(xfInfo * xfi, XEvent * xevent)
35
if (xevent->xvisibility.window == xfi->wnd)
37
xfi->unobscured = xevent->xvisibility.state == VisibilityUnobscured;
43
xf_handle_event_MotionNotify(xfInfo * xfi, XEvent * xevent)
48
if (xevent->xmotion.window == xfi->wnd)
50
x = xevent->xmotion.x;
51
y = xevent->xmotion.y;
52
xfi->inst->rdp_send_input(xfi->inst, RDP_INPUT_MOUSE, PTRFLAGS_MOVE, x, y);
56
XSetInputFocus(xfi->display, xfi->wnd, RevertToPointerRoot, CurrentTime);
62
xf_handle_event_ButtonPress(xfInfo * xfi, XEvent * xevent)
68
if (xevent->xbutton.window == xfi->wnd)
73
switch (xevent->xbutton.button)
76
device_flags = PTRFLAGS_DOWN | PTRFLAGS_BUTTON1;
77
param1 = xevent->xbutton.x;
78
param2 = xevent->xbutton.y;
81
device_flags = PTRFLAGS_DOWN | PTRFLAGS_BUTTON3;
82
param1 = xevent->xbutton.x;
83
param2 = xevent->xbutton.y;
86
device_flags = PTRFLAGS_DOWN | PTRFLAGS_BUTTON2;
87
param1 = xevent->xbutton.x;
88
param2 = xevent->xbutton.y;
91
device_flags = PTRFLAGS_WHEEL | 0x0078;
94
device_flags = PTRFLAGS_WHEEL | PTRFLAGS_WHEEL_NEGATIVE | 0x0088;
97
if (device_flags != 0)
99
xfi->inst->rdp_send_input(xfi->inst, RDP_INPUT_MOUSE, device_flags,
107
xf_handle_event_ButtonRelease(xfInfo * xfi, XEvent * xevent)
113
if (xevent->xbutton.window == xfi->wnd)
118
switch (xevent->xbutton.button)
121
device_flags = PTRFLAGS_BUTTON1;
122
param1 = xevent->xbutton.x;
123
param2 = xevent->xbutton.y;
126
device_flags = PTRFLAGS_BUTTON3;
127
param1 = xevent->xbutton.x;
128
param2 = xevent->xbutton.y;
131
device_flags = PTRFLAGS_BUTTON2;
132
param1 = xevent->xbutton.x;
133
param2 = xevent->xbutton.y;
136
if (device_flags != 0)
138
xfi->inst->rdp_send_input(xfi->inst, RDP_INPUT_MOUSE, device_flags,
146
xf_handle_event_KeyPress(xfInfo * xfi, XEvent * xevent)
151
XLookupString((XKeyEvent *) xevent, str, sizeof(str), &keysym, NULL);
153
xf_kb_set_keypress(xevent->xkey.keycode, keysym);
154
if (xfi->fs_toggle && xf_kb_handle_special_keys(xfi, keysym))
157
xf_kb_send_key(xfi, RDP_KEYPRESS, xevent->xkey.keycode);
162
xf_skip_key_release(xfInfo * xfi, XEvent * xevent)
166
if (XPending(xfi->display))
168
memset(&next_event, 0, sizeof(next_event));
169
XPeekEvent(xfi->display, &next_event);
170
if (next_event.type == KeyPress)
172
if (next_event.xkey.keycode == xevent->xkey.keycode)
182
xf_handle_event_KeyRelease(xfInfo * xfi, XEvent * xevent)
184
if (xf_skip_key_release(xfi, xevent))
188
xf_kb_unset_keypress(xevent->xkey.keycode);
189
xf_kb_send_key(xfi, RDP_KEYRELEASE, xevent->xkey.keycode);
194
xf_handle_event_FocusIn(xfInfo * xfi, XEvent * xevent)
196
if (xevent->xfocus.mode == NotifyGrab)
201
XGrabKeyboard(xfi->display, xfi->wnd, True, GrabModeAsync, GrabModeAsync, CurrentTime);
208
xf_handle_event_FocusOut(xfInfo * xfi, XEvent * xevent)
210
if (xevent->xfocus.mode == NotifyUngrab)
213
xfi->focused = False;
214
if (xevent->xfocus.mode == NotifyWhileGrabbed)
215
XUngrabKeyboard(xfi->display, CurrentTime);
221
xf_handle_event_MappingNotify(xfInfo * xfi, XEvent * xevent)
223
if (xevent->xmapping.request == MappingModifier)
225
XFreeModifiermap(xfi->mod_map);
226
xfi->mod_map = XGetModifierMapping(xfi->display);
232
xf_handle_event_ClientMessage(xfInfo * xfi, XEvent * xevent)
234
Atom protocol_atom = XInternAtom(xfi->display, "WM_PROTOCOLS", True);
235
Atom kill_atom = XInternAtom(xfi->display, "WM_DELETE_WINDOW", True);
237
if ((xevent->xclient.message_type == protocol_atom)
238
&& ((Atom) xevent->xclient.data.l[0] == kill_atom))
240
printf("xf_handle_event: ClientMessage user quit received\n");
248
xf_handle_event_EnterNotify(xfInfo * xfi, XEvent * xevent)
250
xfi->mouse_into = True;
253
XSetInputFocus(xfi->display, xfi->wnd, RevertToPointerRoot, CurrentTime);
256
XGrabKeyboard(xfi->display, xfi->wnd, True, GrabModeAsync, GrabModeAsync, CurrentTime);
262
xf_handle_event_LeaveNotify(xfInfo * xfi, XEvent * xevent)
264
xfi->mouse_into = False;
265
XUngrabKeyboard(xfi->display, CurrentTime);
270
xf_handle_event(xfInfo * xfi, XEvent * xevent)
275
switch (xevent->type)
278
rv = xf_handle_event_Expose(xfi, xevent);
280
case VisibilityNotify:
281
rv = xf_handle_event_VisibilityNotify(xfi, xevent);
284
rv = xf_handle_event_MotionNotify(xfi, xevent);
287
rv = xf_handle_event_ButtonPress(xfi, xevent);
290
rv = xf_handle_event_ButtonRelease(xfi, xevent);
293
rv = xf_handle_event_KeyPress(xfi, xevent);
296
rv = xf_handle_event_KeyRelease(xfi, xevent);
299
rv = xf_handle_event_FocusIn(xfi, xevent);
302
rv = xf_handle_event_FocusOut(xfi, xevent);
305
rv = xf_handle_event_EnterNotify(xfi, xevent);
308
rv = xf_handle_event_LeaveNotify(xfi, xevent);
311
DEBUG("xf_handle_event: NoExpose\n");
314
DEBUG("xf_handle_event: GraphicsExpose\n");
316
case ConfigureNotify:
317
DEBUG("xf_handle_event: ConfigureNotify\n");
320
DEBUG("xf_handle_event: MapNotify\n");
323
DEBUG("xf_handle_event: ReparentNotify\n");
326
rv = xf_handle_event_MappingNotify(xfi, xevent);
329
/* the window manager told us to quit */
330
rv = xf_handle_event_ClientMessage(xfi, xevent);
333
printf("xf_handle_event unknown event %d\n", xevent->type);