diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 316d3f4a5..0ee181151 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -23,6 +23,7 @@ #include #include +#include #include "rdp.h" #include "input.h" @@ -393,6 +394,46 @@ DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count return nCount; } +/* Resend mouse cursor position to prevent session lock in prevent-session-lock mode */ +static BOOL freerdp_prevent_session_lock(rdpContext* context) +{ + WINPR_ASSERT(context); + WINPR_ASSERT(context->input); + + rdp_input_internal* in = input_cast(context->input); + + UINT32 FakeMouseMotionInterval = + freerdp_settings_get_uint32(context->settings, FreeRDP_FakeMouseMotionInterval); + if (FakeMouseMotionInterval && in->lastInputTimestamp) + { + struct timespec ts = { 0 }; + if (timespec_get(&ts, TIME_UTC) == 0) + return FALSE; + if (ts.tv_sec - in->lastInputTimestamp > FakeMouseMotionInterval) + { + WLog_Print(context->log, WLOG_DEBUG, + "fake mouse move: x=%d y=%d lastInputTimestamp=%d " + "FakeMouseMotionInterval=%d", + in->lastX, in->lastY, in->lastInputTimestamp, FakeMouseMotionInterval); + + BOOL status = freerdp_input_send_mouse_event(context->input, PTR_FLAGS_MOVE, in->lastX, + in->lastY); + if (!status) + { + if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) + WLog_Print(context->log, WLOG_ERROR, + "freerdp_prevent_session_lock() failed - %" PRIi32 "", status); + + return FALSE; + } + + return status; + } + } + + return TRUE; +} + BOOL freerdp_check_event_handles(rdpContext* context) { WINPR_ASSERT(context); @@ -430,6 +471,8 @@ BOOL freerdp_check_event_handles(rdpContext* context) return FALSE; } + status = freerdp_prevent_session_lock(context); + return status; }