[client] spice: don't rely on the cursor position when it's not visible

DXGI DesktopDuplication does not send cursor positional updates when the
cursor is hidden, this happens when dragging a window around or when a
full screen application takes/hides the cursor. If this happened at the
same time as a resolution switch we don't know where the cursor really
is anymore.
This commit is contained in:
Geoffrey McRae 2021-01-04 19:34:10 +11:00
parent 53ae0ea9f1
commit 523accf348

View File

@ -877,6 +877,7 @@ static void handleMouseMoveEvent(int ex, int ey)
return; return;
} }
/* check if the cursor is in the guests viewport */ /* check if the cursor is in the guests viewport */
const bool inView = const bool inView =
ex >= g_state.dstRect.x && ex >= g_state.dstRect.x &&
@ -950,10 +951,12 @@ static void handleMouseMoveEvent(int ex, int ey)
g_cursor.sensY -= delta.y; g_cursor.sensY -= delta.y;
} }
/* if the cursor is not grabbed and warp is possible, check if the translated /* if the cursor is not grabbed and warp is possible, and the cursor is
* guest cursor movement would live the window, and if so move the host cursor * visible check if the translated guest cursor movement would live the window,
* to the exit location and enable it, but only if the target is valid */ * and if so move the host cursor to the exit location and enable it, but only
if (!g_cursor.grab && g_cursor.warpState == WARP_STATE_ON) * if the target is valid */
if (!g_cursor.grab && g_cursor.warpState == WARP_STATE_ON &&
g_cursor.guest.visible) // invisible cursors don't get position updates
{ {
const float fx = (float)(g_cursor.guest.x + g_cursor.guest.hx + delta.x) / const float fx = (float)(g_cursor.guest.x + g_cursor.guest.hx + delta.x) /
g_cursor.scaleX; g_cursor.scaleX;
@ -995,9 +998,6 @@ static void handleMouseMoveEvent(int ex, int ey)
static void handleResizeEvent(unsigned int w, unsigned int h) static void handleResizeEvent(unsigned int w, unsigned int h)
{ {
if (g_state.windowW == w && g_state.windowH == h)
return;
SDL_GetWindowBordersSize(g_state.window, SDL_GetWindowBordersSize(g_state.window,
&g_state.border.y, &g_state.border.y,
&g_state.border.x, &g_state.border.x,