Allow rendering during the modal resize loop on macOS
Fixes https://github.com/libsdl-org/SDL/issues/11508 (cherry picked from commit9a43c08146) (cherry picked from commit884c8b684a)
This commit is contained in:
1 parent
2e99b6e9ce
commit
eccd76a6ac
5 files changed
+36
-2
No files matched your search
@@ -511,6 +511,7 @@ extern void SDL_OnWindowShown(SDL_Window *window);
|
|||||||
extern void SDL_OnWindowHidden(SDL_Window *window);
|
extern void SDL_OnWindowHidden(SDL_Window *window);
|
||||||
extern void SDL_OnWindowMoved(SDL_Window *window);
|
extern void SDL_OnWindowMoved(SDL_Window *window);
|
||||||
extern void SDL_OnWindowResized(SDL_Window *window);
|
extern void SDL_OnWindowResized(SDL_Window *window);
|
||||||
|
extern void SDL_OnWindowLiveResizeUpdate(SDL_Window *window);
|
||||||
extern void SDL_OnWindowMinimized(SDL_Window *window);
|
extern void SDL_OnWindowMinimized(SDL_Window *window);
|
||||||
extern void SDL_OnWindowRestored(SDL_Window *window);
|
extern void SDL_OnWindowRestored(SDL_Window *window);
|
||||||
extern void SDL_OnWindowEnter(SDL_Window *window);
|
extern void SDL_OnWindowEnter(SDL_Window *window);
|
||||||
|
|||||||
@@ -3171,6 +3171,12 @@ void SDL_OnWindowMoved(SDL_Window *window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDL_OnWindowLiveResizeUpdate(SDL_Window *window)
|
||||||
|
{
|
||||||
|
/* Send an expose event so the application can redraw */
|
||||||
|
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void SDL_OnWindowMinimized(SDL_Window *window)
|
void SDL_OnWindowMinimized(SDL_Window *window)
|
||||||
{
|
{
|
||||||
if (!DisableUnsetFullscreenOnMinimize(_this)) {
|
if (!DisableUnsetFullscreenOnMinimize(_this)) {
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ typedef enum
|
|||||||
NSInteger focusClickPending;
|
NSInteger focusClickPending;
|
||||||
int pendingWindowWarpX, pendingWindowWarpY;
|
int pendingWindowWarpX, pendingWindowWarpY;
|
||||||
BOOL isDragAreaRunning;
|
BOOL isDragAreaRunning;
|
||||||
|
NSTimer *liveResizeTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(BOOL) isTouchFromTrackpad:(NSEvent *)theEvent;
|
-(BOOL) isTouchFromTrackpad:(NSEvent *)theEvent;
|
||||||
@@ -77,6 +78,8 @@ typedef enum
|
|||||||
/* Window delegate functionality */
|
/* Window delegate functionality */
|
||||||
-(BOOL) windowShouldClose:(id) sender;
|
-(BOOL) windowShouldClose:(id) sender;
|
||||||
-(void) windowDidExpose:(NSNotification *) aNotification;
|
-(void) windowDidExpose:(NSNotification *) aNotification;
|
||||||
|
-(void) windowWillStartLiveResize:(NSNotification *)aNotification;
|
||||||
|
-(void) windowDidEndLiveResize:(NSNotification *)aNotification;
|
||||||
-(void) windowDidMove:(NSNotification *) aNotification;
|
-(void) windowDidMove:(NSNotification *) aNotification;
|
||||||
-(void) windowDidResize:(NSNotification *) aNotification;
|
-(void) windowDidResize:(NSNotification *) aNotification;
|
||||||
-(void) windowDidMiniaturize:(NSNotification *) aNotification;
|
-(void) windowDidMiniaturize:(NSNotification *) aNotification;
|
||||||
|
|||||||
@@ -490,11 +490,14 @@ static NSCursor *Cocoa_GetDesiredCursor(void)
|
|||||||
isMoving = NO;
|
isMoving = NO;
|
||||||
isDragAreaRunning = NO;
|
isDragAreaRunning = NO;
|
||||||
pendingWindowWarpX = pendingWindowWarpY = INT_MAX;
|
pendingWindowWarpX = pendingWindowWarpY = INT_MAX;
|
||||||
|
liveResizeTimer = nil;
|
||||||
|
|
||||||
center = [NSNotificationCenter defaultCenter];
|
center = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
if ([window delegate] != nil) {
|
if ([window delegate] != nil) {
|
||||||
[center addObserver:self selector:@selector(windowDidExpose:) name:NSWindowDidExposeNotification object:window];
|
[center addObserver:self selector:@selector(windowDidExpose:) name:NSWindowDidExposeNotification object:window];
|
||||||
|
[center addObserver:self selector:@selector(windowWillStartLiveResize:) name:NSWindowWillStartLiveResizeNotification object:window];
|
||||||
|
[center addObserver:self selector:@selector(windowDidEndLiveResize:) name:NSWindowDidEndLiveResizeNotification object:window];
|
||||||
[center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:window];
|
[center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:window];
|
||||||
[center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:window];
|
[center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:window];
|
||||||
[center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:window];
|
[center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:window];
|
||||||
@@ -628,6 +631,8 @@ static NSCursor *Cocoa_GetDesiredCursor(void)
|
|||||||
|
|
||||||
if ([window delegate] != self) {
|
if ([window delegate] != self) {
|
||||||
[center removeObserver:self name:NSWindowDidExposeNotification object:window];
|
[center removeObserver:self name:NSWindowDidExposeNotification object:window];
|
||||||
|
[center removeObserver:self name:NSWindowWillStartLiveResizeNotification object:window];
|
||||||
|
[center removeObserver:self name:NSWindowDidEndLiveResizeNotification object:window];
|
||||||
[center removeObserver:self name:NSWindowDidMoveNotification object:window];
|
[center removeObserver:self name:NSWindowDidMoveNotification object:window];
|
||||||
[center removeObserver:self name:NSWindowDidResizeNotification object:window];
|
[center removeObserver:self name:NSWindowDidResizeNotification object:window];
|
||||||
[center removeObserver:self name:NSWindowDidMiniaturizeNotification object:window];
|
[center removeObserver:self name:NSWindowDidMiniaturizeNotification object:window];
|
||||||
@@ -738,6 +743,26 @@ static NSCursor *Cocoa_GetDesiredCursor(void)
|
|||||||
SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)windowWillStartLiveResize:(NSNotification *)aNotification
|
||||||
|
{
|
||||||
|
// We'll try to maintain 60 FPS during live resizing
|
||||||
|
const NSTimeInterval interval = 1.0 / 60.0;
|
||||||
|
liveResizeTimer = [NSTimer scheduledTimerWithTimeInterval:interval
|
||||||
|
repeats:TRUE
|
||||||
|
block:^(NSTimer *unusedTimer)
|
||||||
|
{
|
||||||
|
SDL_OnWindowLiveResizeUpdate(_data.window);
|
||||||
|
}];
|
||||||
|
|
||||||
|
[[NSRunLoop currentRunLoop] addTimer:liveResizeTimer forMode:NSRunLoopCommonModes];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowDidEndLiveResize:(NSNotification *)aNotification
|
||||||
|
{
|
||||||
|
[liveResizeTimer invalidate];
|
||||||
|
liveResizeTimer = nil;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)windowWillMove:(NSNotification *)aNotification
|
- (void)windowWillMove:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
if ([_data.nswindow isKindOfClass:[SDLWindow class]]) {
|
if ([_data.nswindow isKindOfClass:[SDLWindow class]]) {
|
||||||
|
|||||||
@@ -1330,8 +1330,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
{
|
{
|
||||||
if (wParam == (UINT_PTR)&s_ModalMoveResizeLoop) {
|
if (wParam == (UINT_PTR)&s_ModalMoveResizeLoop) {
|
||||||
// Send an expose event so the application can redraw
|
SDL_OnWindowLiveResizeUpdate(data->window);
|
||||||
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|||||||
Reference in new issue
Block a user