BOOL wlf_handle_pointer_motion(freerdp* instance, UwacPointerMotionEvent* ev) { if (!instance || !ev || !instance->input) return FALSE; return freerdp_input_send_mouse_event(instance->input, PTR_FLAGS_MOVE, ev->x, ev->y); }
BOOL wlf_handle_pointer_axis(freerdp* instance, UwacPointerAxisEvent* ev) { rdpInput* input; UINT16 flags = 0; int direction; if (!instance || !ev || !instance->input) return FALSE; input = instance->input; switch (ev->axis) { case WL_POINTER_AXIS_VERTICAL_SCROLL: flags |= PTR_FLAGS_WHEEL; break; case WL_POINTER_AXIS_HORIZONTAL_SCROLL: flags |= PTR_FLAGS_HWHEEL; break; default: return FALSE; } direction = wl_fixed_to_int(ev->value); flags |= 0x0078; /* TODO: Calculate the distance with the provided value size */ if (direction < 0) flags |= PTR_FLAGS_WHEEL_NEGATIVE; return freerdp_input_send_mouse_event(input, flags, ev->x, ev->y); }
BOOL wlf_keyboard_enter(freerdp* instance, UwacKeyboardEnterLeaveEvent* ev) { rdpInput* input; if (!instance || !ev || !instance->input) return FALSE; input = instance->input; return freerdp_input_send_focus_in_event(input, 0) && freerdp_input_send_mouse_event(input, PTR_FLAGS_MOVE, 0, 0); }
BOOL wlf_handle_pointer_buttons(freerdp* instance, UwacPointerButtonEvent* ev) { rdpInput* input; UINT16 flags = 0; UINT16 xflags = 0; if (!instance || !ev || !instance->input) return FALSE; input = instance->input; if (ev->state == WL_POINTER_BUTTON_STATE_PRESSED) { flags |= PTR_FLAGS_DOWN; xflags |= PTR_XFLAGS_DOWN; } switch (ev->button) { case BTN_LEFT: flags |= PTR_FLAGS_BUTTON1; break; case BTN_RIGHT: flags |= PTR_FLAGS_BUTTON2; break; case BTN_MIDDLE: flags |= PTR_FLAGS_BUTTON3; break; case BTN_SIDE: xflags |= PTR_XFLAGS_BUTTON1; break; case BTN_EXTRA: xflags |= PTR_XFLAGS_BUTTON2; break; default: return TRUE; } if ((flags & ~PTR_FLAGS_DOWN) != 0) return freerdp_input_send_mouse_event(input, flags, ev->x, ev->y); if ((xflags & ~PTR_XFLAGS_DOWN) != 0) return freerdp_input_send_extended_mouse_event(input, xflags, ev->x, ev->y); return FALSE; }
BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window window, BOOL app) { rdpInput* input; Window childWindow; input = xfc->context.input; if (!xfc->context.settings->MouseMotion) { if ((state & (Button1Mask | Button2Mask | Button3Mask)) == 0) return TRUE; } if (app) { /* make sure window exists */ if (!xf_AppWindowFromX11Window(xfc, window)) return TRUE; /* Translate to desktop coordinates */ XTranslateCoordinates(xfc->display, window, RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } xf_event_adjust_coordinates(xfc, &x, &y); freerdp_input_send_mouse_event(input, PTR_FLAGS_MOVE, x, y); if (xfc->fullscreen && !app) { XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot, CurrentTime); } return TRUE; }
BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window window, BOOL app) { int flags = 0; BOOL extended = FALSE; rdpInput* input; Window childWindow; if (!xfc || !xfc->context.input) return FALSE; input = xfc->context.input; switch (button) { case Button1: case Button2: case Button3: flags = xfc->button_map[button - BUTTON_BASE]; break; case 6: case 8: case 97: extended = TRUE; flags = PTR_XFLAGS_BUTTON1; break; case 7: case 9: case 112: extended = TRUE; flags = PTR_XFLAGS_BUTTON2; break; default: flags = 0; break; } if (flags != 0) { if (app) { /* make sure window exists */ if (!xf_AppWindowFromX11Window(xfc, window)) return TRUE; /* Translate to desktop coordinates */ XTranslateCoordinates(xfc->display, window, RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } xf_event_adjust_coordinates(xfc, &x, &y); if (extended) freerdp_input_send_extended_mouse_event(input, flags, x, y); else freerdp_input_send_mouse_event(input, flags, x, y); } return TRUE; }
BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window window, BOOL app) { int flags; BOOL wheel; BOOL extended; rdpInput* input; Window childWindow; wheel = FALSE; extended = FALSE; input = xfc->context.input; switch (button) { case Button1: case Button2: case Button3: flags = PTR_FLAGS_DOWN | xfc->button_map[button - BUTTON_BASE]; break; case 4: wheel = TRUE; flags = PTR_FLAGS_WHEEL | 0x0078; break; case 5: wheel = TRUE; flags = PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0078; break; case 8: /* back */ case 97: /* Xming */ extended = TRUE; flags = PTR_XFLAGS_DOWN | PTR_XFLAGS_BUTTON1; break; case 9: /* forward */ case 112: /* Xming */ extended = TRUE; flags = PTR_XFLAGS_DOWN | PTR_XFLAGS_BUTTON2; break; case 6: /* wheel left */ wheel = TRUE; flags = PTR_FLAGS_HWHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0078; break; case 7: /* wheel right */ wheel = TRUE; flags = PTR_FLAGS_HWHEEL | 0x0078; break; default: x = 0; y = 0; flags = 0; break; } if (flags != 0) { if (wheel) { freerdp_input_send_mouse_event(input, flags, 0, 0); } else { if (app) { /* make sure window exists */ if (!xf_AppWindowFromX11Window(xfc, window)) return TRUE; /* Translate to desktop coordinates */ XTranslateCoordinates(xfc->display, window, RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } xf_event_adjust_coordinates(xfc, &x, &y); if (extended) freerdp_input_send_extended_mouse_event(input, flags, x, y); else freerdp_input_send_mouse_event(input, flags, x, y); } } return TRUE; }