mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-05 19:08:12 +00:00
Update mouse transparency when the window shape changes
Fixes github.com/libsdl-org/SDL/issues/7617
This commit is contained in:
28
src/video/cocoa/SDL_cocoashape.h
Normal file
28
src/video/cocoa/SDL_cocoashape.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_internal.h"
|
||||||
|
|
||||||
|
#ifndef SDL_cocoashape_h_
|
||||||
|
#define SDL_cocoashape_h_
|
||||||
|
|
||||||
|
extern int Cocoa_UpdateWindowShape(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surface *shape);
|
||||||
|
|
||||||
|
#endif /* SDL_cocoashape_h_ */
|
54
src/video/cocoa/SDL_cocoashape.m
Normal file
54
src/video/cocoa/SDL_cocoashape.m
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_internal.h"
|
||||||
|
|
||||||
|
#ifdef SDL_VIDEO_DRIVER_COCOA
|
||||||
|
|
||||||
|
#include "SDL_cocoavideo.h"
|
||||||
|
#include "SDL_cocoashape.h"
|
||||||
|
|
||||||
|
|
||||||
|
int Cocoa_UpdateWindowShape(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surface *shape)
|
||||||
|
{
|
||||||
|
SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->driverdata;
|
||||||
|
BOOL ignoresMouseEvents = NO;
|
||||||
|
|
||||||
|
if (shape) {
|
||||||
|
SDL_FPoint point;
|
||||||
|
SDL_GetGlobalMouseState(&point.x, &point.y);
|
||||||
|
point.x -= window->x;
|
||||||
|
point.y -= window->y;
|
||||||
|
if (point.x >= 0.0f && point.x < window->w &&
|
||||||
|
point.y >= 0.0f && point.y < window->h) {
|
||||||
|
int x = (int)SDL_roundf((point.x / (window->w - 1)) * (shape->w - 1));
|
||||||
|
int y = (int)SDL_roundf((point.y / (window->h - 1)) * (shape->h - 1));
|
||||||
|
Uint8 a;
|
||||||
|
|
||||||
|
if (SDL_ReadSurfacePixel(shape, x, y, NULL, NULL, NULL, &a) < 0 || a == SDL_ALPHA_TRANSPARENT) {
|
||||||
|
ignoresMouseEvents = YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.nswindow.ignoresMouseEvents = ignoresMouseEvents;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
@@ -31,6 +31,7 @@
|
|||||||
#include "SDL_cocoametalview.h"
|
#include "SDL_cocoametalview.h"
|
||||||
#include "SDL_cocoaopengles.h"
|
#include "SDL_cocoaopengles.h"
|
||||||
#include "SDL_cocoamessagebox.h"
|
#include "SDL_cocoamessagebox.h"
|
||||||
|
#include "SDL_cocoashape.h"
|
||||||
|
|
||||||
@implementation SDL_CocoaVideoData
|
@implementation SDL_CocoaVideoData
|
||||||
|
|
||||||
@@ -115,6 +116,7 @@ static SDL_VideoDevice *Cocoa_CreateDevice(void)
|
|||||||
device->DestroyWindow = Cocoa_DestroyWindow;
|
device->DestroyWindow = Cocoa_DestroyWindow;
|
||||||
device->SetWindowHitTest = Cocoa_SetWindowHitTest;
|
device->SetWindowHitTest = Cocoa_SetWindowHitTest;
|
||||||
device->AcceptDragAndDrop = Cocoa_AcceptDragAndDrop;
|
device->AcceptDragAndDrop = Cocoa_AcceptDragAndDrop;
|
||||||
|
device->UpdateWindowShape = Cocoa_UpdateWindowShape;
|
||||||
device->FlashWindow = Cocoa_FlashWindow;
|
device->FlashWindow = Cocoa_FlashWindow;
|
||||||
device->SetWindowFocusable = Cocoa_SetWindowFocusable;
|
device->SetWindowFocusable = Cocoa_SetWindowFocusable;
|
||||||
device->SyncWindow = Cocoa_SyncWindow;
|
device->SyncWindow = Cocoa_SyncWindow;
|
||||||
|
@@ -208,8 +208,8 @@ static SDL_VideoDevice *X11_CreateDevice(void)
|
|||||||
device->DestroyWindowFramebuffer = X11_DestroyWindowFramebuffer;
|
device->DestroyWindowFramebuffer = X11_DestroyWindowFramebuffer;
|
||||||
device->SetWindowHitTest = X11_SetWindowHitTest;
|
device->SetWindowHitTest = X11_SetWindowHitTest;
|
||||||
device->AcceptDragAndDrop = X11_AcceptDragAndDrop;
|
device->AcceptDragAndDrop = X11_AcceptDragAndDrop;
|
||||||
device->FlashWindow = X11_FlashWindow;
|
|
||||||
device->UpdateWindowShape = X11_UpdateWindowShape;
|
device->UpdateWindowShape = X11_UpdateWindowShape;
|
||||||
|
device->FlashWindow = X11_FlashWindow;
|
||||||
device->ShowWindowSystemMenu = X11_ShowWindowSystemMenu;
|
device->ShowWindowSystemMenu = X11_ShowWindowSystemMenu;
|
||||||
device->SetWindowFocusable = X11_SetWindowFocusable;
|
device->SetWindowFocusable = X11_SetWindowFocusable;
|
||||||
device->SyncWindow = X11_SyncWindow;
|
device->SyncWindow = X11_SyncWindow;
|
||||||
|
Reference in New Issue
Block a user