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_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; }