Implemented SDL_SetWindowMouseRect() on macOS
parent
037030a7a2
commit
4db546b092
|
@ -103,6 +103,7 @@ Cocoa_CreateDevice(int devindex)
|
||||||
device->SetWindowGammaRamp = Cocoa_SetWindowGammaRamp;
|
device->SetWindowGammaRamp = Cocoa_SetWindowGammaRamp;
|
||||||
device->GetWindowGammaRamp = Cocoa_GetWindowGammaRamp;
|
device->GetWindowGammaRamp = Cocoa_GetWindowGammaRamp;
|
||||||
device->GetWindowICCProfile = Cocoa_GetWindowICCProfile;
|
device->GetWindowICCProfile = Cocoa_GetWindowICCProfile;
|
||||||
|
device->SetWindowMouseRect = Cocoa_SetWindowMouseRect;
|
||||||
device->SetWindowMouseGrab = Cocoa_SetWindowMouseGrab;
|
device->SetWindowMouseGrab = Cocoa_SetWindowMouseGrab;
|
||||||
device->SetWindowKeyboardGrab = Cocoa_SetWindowKeyboardGrab;
|
device->SetWindowKeyboardGrab = Cocoa_SetWindowKeyboardGrab;
|
||||||
device->DestroyWindow = Cocoa_DestroyWindow;
|
device->DestroyWindow = Cocoa_DestroyWindow;
|
||||||
|
|
|
@ -124,6 +124,7 @@ struct SDL_WindowData
|
||||||
SDL_bool created;
|
SDL_bool created;
|
||||||
SDL_bool inWindowFullscreenTransition;
|
SDL_bool inWindowFullscreenTransition;
|
||||||
NSInteger flash_request;
|
NSInteger flash_request;
|
||||||
|
SDL_Rect mouse_rect;
|
||||||
Cocoa_WindowListener *listener;
|
Cocoa_WindowListener *listener;
|
||||||
struct SDL_VideoData *videodata;
|
struct SDL_VideoData *videodata;
|
||||||
#if SDL_VIDEO_OPENGL_EGL
|
#if SDL_VIDEO_OPENGL_EGL
|
||||||
|
@ -154,6 +155,7 @@ extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDispl
|
||||||
extern int Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
|
extern int Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
|
||||||
extern void* Cocoa_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size);
|
extern void* Cocoa_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size);
|
||||||
extern int Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
|
extern int Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
|
||||||
|
extern int Cocoa_SetWindowMouseRect(_THIS, SDL_Window * window, const SDL_Rect * rect);
|
||||||
extern void Cocoa_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
extern void Cocoa_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||||
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
||||||
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info);
|
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info);
|
||||||
|
|
|
@ -322,6 +322,67 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SDL_bool
|
||||||
|
ShouldAdjustCoordinatesForGrab(SDL_Window * window)
|
||||||
|
{
|
||||||
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
|
if (!data || [data->listener isMovingOrFocusClickPending]) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((window->flags & SDL_WINDOW_MOUSE_GRABBED) || (data->mouse_rect.w > 0 && data->mouse_rect.h > 0)) {
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_bool
|
||||||
|
AdjustCoordinatesForGrab(SDL_Window * window, int x, int y, CGPoint *adjusted)
|
||||||
|
{
|
||||||
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
|
if (data->mouse_rect.w > 0 && data->mouse_rect.h > 0) {
|
||||||
|
SDL_Rect window_rect;
|
||||||
|
SDL_Rect mouse_rect;
|
||||||
|
|
||||||
|
window_rect.x = 0;
|
||||||
|
window_rect.y = 0;
|
||||||
|
window_rect.w = window->w;
|
||||||
|
window_rect.h = window->h;
|
||||||
|
|
||||||
|
if (SDL_IntersectRect(&data->mouse_rect, &window_rect, &mouse_rect)) {
|
||||||
|
int left = window->x + mouse_rect.x;
|
||||||
|
int right = left + mouse_rect.w - 1;
|
||||||
|
int top = window->y + mouse_rect.y;
|
||||||
|
int bottom = top + mouse_rect.h - 1;
|
||||||
|
if (x < left || x > right || y < top || y > bottom) {
|
||||||
|
adjusted->x = SDL_clamp(x, left, right);
|
||||||
|
adjusted->y = SDL_clamp(y, top, bottom);
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((window->flags & SDL_WINDOW_MOUSE_GRABBED) != 0) {
|
||||||
|
int left = window->x;
|
||||||
|
int right = left + window->w - 1;
|
||||||
|
int top = window->y;
|
||||||
|
int bottom = top + window->h - 1;
|
||||||
|
if (x < left || x > right || y < top || y > bottom) {
|
||||||
|
adjusted->x = SDL_clamp(x, left, right);
|
||||||
|
adjusted->y = SDL_clamp(y, top, bottom);
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@implementation Cocoa_WindowListener
|
@implementation Cocoa_WindowListener
|
||||||
|
|
||||||
|
@ -1156,28 +1217,12 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
||||||
x = (int)point.x;
|
x = (int)point.x;
|
||||||
y = (int)(window->h - point.y);
|
y = (int)(window->h - point.y);
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_MOUSE_GRABBED) {
|
|
||||||
if (x < 0 || x >= window->w || y < 0 || y >= window->h) {
|
|
||||||
if (x < 0) {
|
|
||||||
x = 0;
|
|
||||||
} else if (x >= window->w) {
|
|
||||||
x = window->w - 1;
|
|
||||||
}
|
|
||||||
if (y < 0) {
|
|
||||||
y = 0;
|
|
||||||
} else if (y >= window->h) {
|
|
||||||
y = window->h - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
CGPoint cgpoint;
|
CGPoint cgpoint;
|
||||||
cgpoint.x = window->x + x;
|
if (ShouldAdjustCoordinatesForGrab(window) &&
|
||||||
cgpoint.y = window->y + y;
|
AdjustCoordinatesForGrab(window, window->x + x, window->y + y, &cgpoint)) {
|
||||||
|
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
||||||
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
|
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
|
||||||
CGAssociateMouseAndMouseCursorPosition(YES);
|
CGAssociateMouseAndMouseCursorPosition(YES);
|
||||||
|
|
||||||
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SendMouseMotion(window, mouseID, 0, x, y);
|
SDL_SendMouseMotion(window, mouseID, 0, x, y);
|
||||||
|
@ -2048,27 +2093,49 @@ Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Cocoa_SetWindowMouseRect(_THIS, SDL_Window * window, const SDL_Rect * rect)
|
||||||
|
{
|
||||||
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
|
if (rect) {
|
||||||
|
SDL_memcpy(&data->mouse_rect, rect, sizeof(*rect));
|
||||||
|
} else {
|
||||||
|
SDL_zero(data->mouse_rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move the cursor to the nearest point in the mouse rect */
|
||||||
|
if (ShouldAdjustCoordinatesForGrab(window)) {
|
||||||
|
int x, y;
|
||||||
|
CGPoint cgpoint;
|
||||||
|
|
||||||
|
SDL_GetGlobalMouseState(&x, &y);
|
||||||
|
if (AdjustCoordinatesForGrab(window, x, y, &cgpoint)) {
|
||||||
|
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
||||||
|
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Cocoa_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
Cocoa_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
||||||
{
|
{
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
/* Move the cursor to the nearest point in the window */
|
/* Move the cursor to the nearest point in the window */
|
||||||
if (grabbed && data && ![data->listener isMovingOrFocusClickPending]) {
|
if (ShouldAdjustCoordinatesForGrab(window)) {
|
||||||
int x, y;
|
int x, y;
|
||||||
CGPoint cgpoint;
|
CGPoint cgpoint;
|
||||||
|
|
||||||
SDL_GetMouseState(&x, &y);
|
SDL_GetGlobalMouseState(&x, &y);
|
||||||
cgpoint.x = window->x + x;
|
if (AdjustCoordinatesForGrab(window, x, y, &cgpoint)) {
|
||||||
cgpoint.y = window->y + y;
|
|
||||||
|
|
||||||
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
||||||
|
|
||||||
DLog("Returning cursor to (%g, %g)", cgpoint.x, cgpoint.y);
|
|
||||||
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
|
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( data && (window->flags & SDL_WINDOW_FULLSCREEN) ) {
|
if (data && (window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||||
if (SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS)
|
if (SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS)
|
||||||
&& ![data->listener isInFullscreenSpace]) {
|
&& ![data->listener isInFullscreenSpace]) {
|
||||||
/* OpenGL is rendering to the window, so make it visible! */
|
/* OpenGL is rendering to the window, so make it visible! */
|
||||||
|
|
|
@ -815,7 +815,7 @@ void WIN_UngrabKeyboard(SDL_Window *window)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
WIN_SetWindowMouseRect(_THIS, SDL_Window * window, SDL_Rect * rect)
|
WIN_SetWindowMouseRect(_THIS, SDL_Window * window, const SDL_Rect * rect)
|
||||||
{
|
{
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ extern void WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay
|
||||||
extern int WIN_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
|
extern int WIN_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
|
||||||
extern void* WIN_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size);
|
extern void* WIN_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size);
|
||||||
extern int WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
|
extern int WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
|
||||||
extern int WIN_SetWindowMouseRect(_THIS, SDL_Window * window, SDL_Rect * rect);
|
extern int WIN_SetWindowMouseRect(_THIS, SDL_Window * window, const SDL_Rect * rect);
|
||||||
extern void WIN_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
extern void WIN_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||||
extern void WIN_SetWindowKeyboardGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
extern void WIN_SetWindowKeyboardGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||||
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
|
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
|
||||||
|
|
Loading…
Reference in New Issue