mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-12-24 14:41:53 +00:00
[client] spice: calculate the entry point delta correctly
This commit is contained in:
parent
d61d7699e5
commit
5802bfb5eb
1 changed files with 50 additions and 56 deletions
|
@ -77,7 +77,6 @@ struct AppState state;
|
|||
struct AppParams params = { 0 };
|
||||
|
||||
static void handleMouseMoveEvent(int ex, int ey);
|
||||
static void alignMouseWithHost();
|
||||
|
||||
static void lgInit()
|
||||
{
|
||||
|
@ -818,7 +817,7 @@ static void handleMouseMoveEvent(int ex, int ey)
|
|||
return;
|
||||
|
||||
state.curLastX = state.curLocalX = ex;
|
||||
state.curLastY = state.curLocalX = ey;
|
||||
state.curLastY = state.curLocalY = ey;
|
||||
state.haveCurLocal = true;
|
||||
|
||||
if (state.warpState == WARP_STATE_ACTIVE &&
|
||||
|
@ -833,43 +832,62 @@ static void handleMouseMoveEvent(int ex, int ey)
|
|||
|
||||
/* if we don't have the current cursor pos just send cursor movements */
|
||||
if (!state.haveCursorPos)
|
||||
{
|
||||
if (state.grabMouse)
|
||||
{
|
||||
state.cursorInView = true;
|
||||
spice_mouse_motion(delta.x, delta.y);
|
||||
if ((state.haveCursorPos || state.grabMouse) &&
|
||||
(ex < 100 || ex > state.windowW - 100 ||
|
||||
ey < 100 || ey > state.windowH - 100))
|
||||
{
|
||||
if (ex < 100 || ex > state.windowW - 100 ||
|
||||
ey < 100 || ey > state.windowH - 100)
|
||||
warpMouse(state.windowW / 2, state.windowH / 2);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ex < state.dstRect.x ||
|
||||
ex > state.dstRect.x + state.dstRect.w ||
|
||||
const bool inView = !(
|
||||
ex < state.dstRect.x ||
|
||||
ex >= state.dstRect.x + state.dstRect.w ||
|
||||
ey < state.dstRect.y ||
|
||||
ey > state.dstRect.y + state.dstRect.h)
|
||||
{
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
state.cursorInView = false;
|
||||
state.updateCursor = true;
|
||||
ey >= state.dstRect.y + state.dstRect.h);
|
||||
|
||||
if (params.useSpiceInput && !params.alwaysShowCursor)
|
||||
state.drawCursor = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!state.cursorInView)
|
||||
/* if the cursor is to move in/outside the display area */
|
||||
if (state.cursorInView != inView)
|
||||
{
|
||||
state.cursorInView = inView;
|
||||
|
||||
if (inView)
|
||||
{
|
||||
/* cursor moved in */
|
||||
if (params.hideMouse)
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
|
||||
state.cursorInView = true;
|
||||
state.updateCursor = true;
|
||||
state.drawCursor = true;
|
||||
|
||||
if (state.warpState == WARP_STATE_OFF)
|
||||
state.warpState = WARP_STATE_ON;
|
||||
|
||||
/* convert guest to local and calculate the delta */
|
||||
const int lx = (state.cursor.x / state.scaleX) + state.dstRect.x;
|
||||
const int ly = (state.cursor.y / state.scaleY) + state.dstRect.y;
|
||||
delta.x = ex - lx;
|
||||
delta.y = ey - ly;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* cursor moved out */
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
state.updateCursor = true;
|
||||
if (params.useSpiceInput && !params.alwaysShowCursor)
|
||||
state.drawCursor = false;
|
||||
}
|
||||
}
|
||||
else if (inView)
|
||||
{
|
||||
if (ex < 100 || ex > state.windowW - 100 ||
|
||||
ey < 100 || ey > state.windowH - 100)
|
||||
warpMouse(state.windowW / 2, state.windowH / 2);
|
||||
}
|
||||
|
||||
if (state.scale && params.scaleMouseInput && !state.grabMouse)
|
||||
|
@ -892,14 +910,6 @@ static void handleMouseMoveEvent(int ex, int ey)
|
|||
state.sensY -= delta.y;
|
||||
}
|
||||
|
||||
if ((state.haveCursorPos || state.grabMouse) &&
|
||||
(ex < 100 || ex > state.windowW - 100 ||
|
||||
ey < 100 || ey > state.windowH - 100))
|
||||
{
|
||||
warpMouse(state.windowW / 2, state.windowH / 2);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!state.grabMouse && state.warpState == WARP_STATE_ON)
|
||||
{
|
||||
const SDL_Point newPos = {
|
||||
|
@ -929,23 +939,6 @@ static void handleMouseMoveEvent(int ex, int ey)
|
|||
DEBUG_ERROR("failed to send mouse motion message");
|
||||
}
|
||||
|
||||
static void alignMouseWithHost()
|
||||
{
|
||||
if (state.ignoreInput || !params.useSpiceInput)
|
||||
return;
|
||||
|
||||
if (!state.haveCursorPos)
|
||||
return;
|
||||
|
||||
const int dx = round((state.curLocalX - state.dstRect.x) * state.scaleX) -
|
||||
state.cursor.x;
|
||||
|
||||
const int dy = round((state.curLocalY - state.dstRect.y) * state.scaleY) -
|
||||
state.cursor.y;
|
||||
|
||||
spice_mouse_motion(dx, dy);
|
||||
}
|
||||
|
||||
static void handleResizeEvent(unsigned int w, unsigned int h)
|
||||
{
|
||||
if (state.windowW == w && state.windowH == h)
|
||||
|
@ -980,6 +973,8 @@ static void handleWindowLeave()
|
|||
static void handleWindowEnter()
|
||||
{
|
||||
state.cursorInWindow = true;
|
||||
return;
|
||||
|
||||
if (state.warpState == WARP_STATE_OFF)
|
||||
state.warpState = WARP_STATE_ON;
|
||||
|
||||
|
@ -989,7 +984,6 @@ static void handleWindowEnter()
|
|||
if (!state.haveCursorPos)
|
||||
return;
|
||||
|
||||
alignMouseWithHost();
|
||||
state.drawCursor = true;
|
||||
state.updateCursor = true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue