forked from enlightenment/efl
ecore_cocoa: fix main loop handling
Pffff... another tricky one... -windowDidResize is actually also called when the window is not resize by the user, leading to multiple event posting, and of course the infamous call of ecore_main_loop_iterate() when it was not paused at all, leading to messy events handling... the most visible being the initial resizing of the window going rogue. We now ensure with -windowWillStartLiveResize and -windowDidEndLiveResize that we only send an event when the user requested it. Since the main loop is paused at this point, calling ecore_main_loop_iterate() becomes safe. Fixes T3648
This commit is contained in:
parent
7bb32abf33
commit
266396b1eb
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
@interface EcoreCocoaWindow: NSWindow <NSWindowDelegate>
|
@interface EcoreCocoaWindow: NSWindow <NSWindowDelegate>
|
||||||
{
|
{
|
||||||
void *ecore_window_data;
|
void *ecore_window_data;
|
||||||
|
int _live_resize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (nonatomic, assign) void *ecore_window_data;
|
@property (nonatomic, assign) void *ecore_window_data;
|
||||||
|
|
|
@ -34,6 +34,8 @@ static NSCursor *_cursors[__ECORE_COCOA_CURSOR_LAST];
|
||||||
|
|
||||||
[self setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
[self setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
||||||
|
|
||||||
|
_live_resize = 0;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,28 +74,36 @@ static NSCursor *_cursors[__ECORE_COCOA_CURSOR_LAST];
|
||||||
Ecore_Cocoa_Event_Window_Resize_Request *event;
|
Ecore_Cocoa_Event_Window_Resize_Request *event;
|
||||||
NSSize size = self.frame.size;
|
NSSize size = self.frame.size;
|
||||||
|
|
||||||
event = malloc(sizeof(*event));
|
|
||||||
if (EINA_UNLIKELY(event == NULL))
|
|
||||||
{
|
|
||||||
CRI("Failed to allocate Ecore_Cocoa_Event_Window_Resize_Request");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
event->w = size.width;
|
|
||||||
event->h = size.height -
|
|
||||||
(([self isFullScreen] == YES) ? 0 : ecore_cocoa_titlebar_height_get());
|
|
||||||
event->cocoa_window = [notif object];
|
|
||||||
ecore_event_add(ECORE_COCOA_EVENT_WINDOW_RESIZE_REQUEST, event, NULL, NULL);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* During live resize, NSRunLoop blocks, and prevent the ecore_main_loop
|
* Only throw a resize event and manipulate the main loop when
|
||||||
* to be run.
|
* we are 100% sure we are in a live resize, and the main loop
|
||||||
* This, combined with the -pauseNSRunLoopMonitoring and
|
* has already been paused!!
|
||||||
* -resumeNSRunLoopMonitoring methods invoked in
|
|
||||||
* -windowWillStartLiveResize and -windowDidEndLiveResize
|
|
||||||
* allow the ecore_main_loop to run withing NSRunLoop during the
|
|
||||||
* live resizing of a window.
|
|
||||||
*/
|
*/
|
||||||
ecore_main_loop_iterate();
|
if (_live_resize > 0)
|
||||||
|
{
|
||||||
|
event = malloc(sizeof(*event));
|
||||||
|
if (EINA_UNLIKELY(event == NULL))
|
||||||
|
{
|
||||||
|
CRI("Failed to allocate Ecore_Cocoa_Event_Window_Resize_Request");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event->w = size.width;
|
||||||
|
event->h = size.height -
|
||||||
|
(([self isFullScreen] == YES) ? 0 : ecore_cocoa_titlebar_height_get());
|
||||||
|
event->cocoa_window = [notif object];
|
||||||
|
ecore_event_add(ECORE_COCOA_EVENT_WINDOW_RESIZE_REQUEST, event, NULL, NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* During live resize, NSRunLoop blocks, and prevent the ecore_main_loop
|
||||||
|
* to be run.
|
||||||
|
* This, combined with the -pauseNSRunLoopMonitoring and
|
||||||
|
* -resumeNSRunLoopMonitoring methods invoked in
|
||||||
|
* -windowWillStartLiveResize and -windowDidEndLiveResize
|
||||||
|
* allow the ecore_main_loop to run withing NSRunLoop during the
|
||||||
|
* live resizing of a window.
|
||||||
|
*/
|
||||||
|
ecore_main_loop_iterate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidBecomeKey:(NSNotification *)notification
|
- (void)windowDidBecomeKey:(NSNotification *)notification
|
||||||
|
@ -112,11 +122,15 @@ static NSCursor *_cursors[__ECORE_COCOA_CURSOR_LAST];
|
||||||
|
|
||||||
- (void) windowWillStartLiveResize:(NSNotification *) EINA_UNUSED notification
|
- (void) windowWillStartLiveResize:(NSNotification *) EINA_UNUSED notification
|
||||||
{
|
{
|
||||||
|
/* Live resize must be set AFTER pausing the main loop */
|
||||||
[NSApp pauseNSRunLoopMonitoring];
|
[NSApp pauseNSRunLoopMonitoring];
|
||||||
|
_live_resize++;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) windowDidEndLiveResize:(NSNotification *) EINA_UNUSED notification
|
- (void) windowDidEndLiveResize:(NSNotification *) EINA_UNUSED notification
|
||||||
{
|
{
|
||||||
|
/* Live resize must be clear BEFORE resuming the main loop */
|
||||||
|
_live_resize--;
|
||||||
[NSApp resumeNSRunLoopMonitoring];
|
[NSApp resumeNSRunLoopMonitoring];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue