diff --git a/client/displayservers/SDL/sdl.c b/client/displayservers/SDL/sdl.c index 71766519..cc1580bd 100644 --- a/client/displayservers/SDL/sdl.c +++ b/client/displayservers/SDL/sdl.c @@ -163,6 +163,11 @@ static bool sdlEventFilter(SDL_Event * event) return false; } +static void sdlShowPointer(bool show) +{ + SDL_ShowCursor(show ? SDL_ENABLE : SDL_DISABLE); +} + static void sdlGrabPointer(void) { SDL_SetWindowGrab(app_getWindow(), SDL_TRUE); @@ -222,6 +227,20 @@ static void sdlRealignPointer(void) app_handleMouseNormal(0, 0); } +static bool sdlIsValidPointerPos(int x, int y) +{ + const int displays = SDL_GetNumVideoDisplays(); + for(int i = 0; i < displays; ++i) + { + SDL_Rect r; + SDL_GetDisplayBounds(i, &r); + if ((x >= r.x && x < r.x + r.w) && + (y >= r.y && y < r.y + r.h)) + return true; + } + return false; +} + static void sdlInhibitIdle(void) { SDL_DisableScreenSaver(); @@ -234,22 +253,24 @@ static void sdlUninhibitIdle(void) struct LG_DisplayServerOps LGDS_SDL = { - .subsystem = SDL_SYSWM_UNKNOWN, - .earlyInit = sdlEarlyInit, - .init = sdlInit, - .startup = sdlStartup, - .shutdown = sdlShutdown, - .free = sdlFree, - .getProp = sdlGetProp, - .eventFilter = sdlEventFilter, - .grabPointer = sdlGrabPointer, - .ungrabPointer = sdlUngrabPointer, - .grabKeyboard = sdlGrabKeyboard, - .ungrabKeyboard = sdlUngrabKeyboard, - .warpPointer = sdlWarpPointer, - .realignPointer = sdlRealignPointer, - .inhibitIdle = sdlInhibitIdle, - .uninhibitIdle = sdlUninhibitIdle, + .subsystem = SDL_SYSWM_UNKNOWN, + .earlyInit = sdlEarlyInit, + .init = sdlInit, + .startup = sdlStartup, + .shutdown = sdlShutdown, + .free = sdlFree, + .getProp = sdlGetProp, + .eventFilter = sdlEventFilter, + .showPointer = sdlShowPointer, + .grabPointer = sdlGrabPointer, + .ungrabPointer = sdlUngrabPointer, + .grabKeyboard = sdlGrabKeyboard, + .ungrabKeyboard = sdlUngrabKeyboard, + .warpPointer = sdlWarpPointer, + .realignPointer = sdlRealignPointer, + .isValidPointerPos = sdlIsValidPointerPos, + .inhibitIdle = sdlInhibitIdle, + .uninhibitIdle = sdlUninhibitIdle, /* SDL does not have clipboard support */ .cbInit = NULL, diff --git a/client/include/interface/displayserver.h b/client/include/interface/displayserver.h index 5ca82c4a..c7120f0e 100644 --- a/client/include/interface/displayserver.h +++ b/client/include/interface/displayserver.h @@ -87,6 +87,7 @@ struct LG_DisplayServerOps bool (*eventFilter)(SDL_Event * event); /* dm specific cursor implementations */ + void (*showPointer)(bool show); void (*grabPointer)(); void (*ungrabPointer)(); void (*grabKeyboard)(); @@ -100,6 +101,9 @@ struct LG_DisplayServerOps * deltas */ void (*realignPointer)(); + /* returns true if the position specified is actually valid */ + bool (*isValidPointerPos)(int x, int y); + /* called to disable/enable the screensaver */ void (*inhibitIdle)(); void (*uninhibitIdle)(); diff --git a/client/include/util.h b/client/include/util.h index 8657d9a6..5296c60f 100644 --- a/client/include/util.h +++ b/client/include/util.h @@ -32,6 +32,5 @@ void util_cursorToInt(double ex, double ey, int *x, int *y); bool util_guestCurToLocal(struct DoublePoint *local); void util_localCurToGuest(struct DoublePoint *guest); void util_rotatePoint(struct DoublePoint *point); -bool util_isValidCursorLocation(int x, int y); #endif diff --git a/client/src/app.c b/client/src/app.c index 3901f79b..1648a751 100644 --- a/client/src/app.c +++ b/client/src/app.c @@ -457,7 +457,7 @@ void app_handleMouseNormal(double ex, double ey) const int tx = (local.x <= 0.0) ? floor(local.x) : ceil(local.x); const int ty = (local.y <= 0.0) ? floor(local.y) : ceil(local.y); - if (util_isValidCursorLocation( + if (core_isValidPointerPos( g_state.windowPos.x + g_state.border.x + tx, g_state.windowPos.y + g_state.border.y + ty)) { diff --git a/client/src/core.c b/client/src/core.c index 64b9c0cf..cf762a7b 100644 --- a/client/src/core.c +++ b/client/src/core.c @@ -57,7 +57,7 @@ void core_setCursorInView(bool enable) if (enable) { if (g_params.hideMouse) - SDL_ShowCursor(SDL_DISABLE); + g_state.ds->showPointer(false); if (warpSupport && !g_params.captureInputOnly) g_state.ds->grabPointer(); @@ -65,7 +65,7 @@ void core_setCursorInView(bool enable) else { if (g_params.hideMouse) - SDL_ShowCursor(SDL_ENABLE); + g_state.ds->showPointer(true); if (warpSupport) g_state.ds->ungrabPointer(); @@ -90,7 +90,7 @@ void core_setGrabQuiet(bool enable) { /* we always do this so that at init the cursor is in the right state */ if (g_params.captureInputOnly && g_params.hideMouse) - SDL_ShowCursor(enable ? SDL_DISABLE : SDL_ENABLE); + g_state.ds->showPointer(!enable); if (g_cursor.grab == enable) return; @@ -260,3 +260,8 @@ void core_alignToGuest(void) if (core_warpPointer(round(local.x), round(local.y), false)) core_setCursorInView(true); } + +bool core_isValidPointerPos(int x, int y) +{ + return g_state.ds->isValidPointerPos(x, y); +} diff --git a/client/src/core.h b/client/src/core.h index a15c0eae..cf15ca71 100644 --- a/client/src/core.h +++ b/client/src/core.h @@ -28,5 +28,6 @@ void core_setGrabQuiet(bool enable); bool core_warpPointer(int x, int y, bool exiting); void core_updatePositionInfo(void); void core_alignToGuest(void); +bool core_isValidPointerPos(int x, int y); #endif diff --git a/client/src/main.c b/client/src/main.c index 5671962c..f616e7b6 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -831,10 +831,12 @@ static int lg_run(void) SET_FALLBACK(shutdown); SET_FALLBACK(free); SET_FALLBACK(eventFilter); + SET_FALLBACK(showPointer); SET_FALLBACK(grabPointer); SET_FALLBACK(ungrabKeyboard); SET_FALLBACK(warpPointer); SET_FALLBACK(realignPointer); + SET_FALLBACK(isValidPointerPos); SET_FALLBACK(inhibitIdle); SET_FALLBACK(uninhibitIdle); SET_FALLBACK(cbInit); diff --git a/client/src/util.c b/client/src/util.c index d8d8e00e..232f11d4 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -206,17 +206,3 @@ void util_rotatePoint(struct DoublePoint *point) break; } } - -bool util_isValidCursorLocation(int x, int y) -{ - const int displays = SDL_GetNumVideoDisplays(); - for(int i = 0; i < displays; ++i) - { - SDL_Rect r; - SDL_GetDisplayBounds(i, &r); - if ((x >= r.x && x < r.x + r.w) && - (y >= r.y && y < r.y + r.h)) - return true; - } - return false; -}