diff --git a/client/SDL/sdl_touch.cpp b/client/SDL/sdl_touch.cpp index 328a35a70..811b9cc26 100644 --- a/client/SDL/sdl_touch.cpp +++ b/client/SDL/sdl_touch.cpp @@ -202,8 +202,7 @@ BOOL sdl_handle_mouse_motion(SdlContext* sdl, const SDL_MouseMotionEvent* ev) WINPR_ASSERT(ev); sdl->input.mouse_focus(ev->windowID); - const BOOL relative = - freerdp_settings_get_bool(sdl->context()->settings, FreeRDP_MouseUseRelativeMove); + const BOOL relative = freerdp_client_use_relative_mouse_events(sdl->common()); INT32 x = relative ? ev->xrel : ev->x; INT32 y = relative ? ev->yrel : ev->y; sdl_scale_coordinates(sdl, ev->windowID, &x, &y, TRUE, TRUE); @@ -269,8 +268,7 @@ BOOL sdl_handle_mouse_button(SdlContext* sdl, const SDL_MouseButtonEvent* ev) break; } - const BOOL relative = - freerdp_settings_get_bool(sdl->context()->settings, FreeRDP_MouseUseRelativeMove); + const BOOL relative = freerdp_client_use_relative_mouse_events(sdl->common()); INT32 x = relative ? 0 : ev->x; INT32 y = relative ? 0 : ev->y; sdl_scale_coordinates(sdl, ev->windowID, &x, &y, TRUE, TRUE); diff --git a/client/X11/xf_input.c b/client/X11/xf_input.c index 3ea620f4e..189ac3bf4 100644 --- a/client/X11/xf_input.c +++ b/client/X11/xf_input.c @@ -198,7 +198,7 @@ static BOOL register_raw_events(xfContext* xfc, Window window) settings = xfc->common.context.settings; WINPR_ASSERT(settings); - if (freerdp_settings_get_bool(settings, FreeRDP_MouseUseRelativeMove)) + if (freerdp_client_use_relative_mouse_events(&xfc->common)) { XISetMask(mask_bytes, XI_RawMotion); XISetMask(mask_bytes, XI_RawButtonPress); @@ -798,8 +798,8 @@ int xf_input_event(xfContext* xfc, const XEvent* xevent, XIDeviceEvent* event, i break; case XI_RawButtonPress: case XI_RawButtonRelease: - xfc->xi_rawevent = xfc->common.mouse_grabbed && - freerdp_settings_get_bool(settings, FreeRDP_MouseUseRelativeMove); + xfc->xi_rawevent = + xfc->common.mouse_grabbed && freerdp_client_use_relative_mouse_events(&xfc->common); if (xfc->xi_rawevent) { @@ -809,8 +809,8 @@ int xf_input_event(xfContext* xfc, const XEvent* xevent, XIDeviceEvent* event, i } break; case XI_RawMotion: - xfc->xi_rawevent = xfc->common.mouse_grabbed && - freerdp_settings_get_bool(settings, FreeRDP_MouseUseRelativeMove); + xfc->xi_rawevent = + xfc->common.mouse_grabbed && freerdp_client_use_relative_mouse_events(&xfc->common); if (xfc->xi_rawevent) { diff --git a/client/common/client.c b/client/common/client.c index abf26dd10..778c158bb 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -2132,3 +2132,14 @@ BOOL freerdp_client_is_pen(rdpClientContext* cctx, INT32 deviceid) return FALSE; } + +BOOL freerdp_client_use_relative_mouse_events(rdpClientContext* ccontext) +{ + WINPR_ASSERT(ccontext); + + const rdpSettings* settings = ccontext->context.settings; + const BOOL useRelative = freerdp_settings_get_bool(settings, FreeRDP_MouseUseRelativeMove); + const BOOL haveRelative = freerdp_settings_get_bool(settings, FreeRDP_HasRelativeMouseEvent); + const BOOL ainput = ccontext->ainput != NULL; + return useRelative && (haveRelative || ainput); +} diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 3960f8cad..855687965 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -267,6 +267,15 @@ extern "C" FREERDP_API BOOL freerdp_client_send_mouse_event(rdpClientContext* cctx, UINT64 mflags, INT32 x, INT32 y); + /** @brief this function checks if relative mouse events are supported and enabled for this + * session. + * + * @param cctx The \b rdpClientContext to check + * + * @return \b TRUE if relative mouse events are to be sent, \b FALSE otherwise + */ + FREERDP_API BOOL freerdp_client_use_relative_mouse_events(rdpClientContext* cctx); + FREERDP_API BOOL freerdp_client_send_button_event(rdpClientContext* cctx, BOOL relative, UINT16 mflags, INT32 x, INT32 y);