[macOS, 3.x] Fix unresponsive redraw during live resizing.

This commit is contained in:
bruvzg 2022-06-10 13:59:21 +03:00
parent 4da772d5c9
commit e75e1f3231
No known key found for this signature in database
GPG key ID: 7960FCF39844EC38

View file

@ -471,6 +471,20 @@ static NSCursor *cursorFromSelector(SEL selector, SEL fallback = nil) {
@implementation GodotContentView @implementation GodotContentView
- (void)drawRect:(NSRect)dirtyRect {
if (OS_OSX::singleton->get_main_loop() && OS_OSX::singleton->is_resizing) {
Main::force_redraw();
if (!Main::is_iterating()) { // Avoid cyclic loop.
Main::iteration();
}
}
}
- (void)setFrameSize:(NSSize)newSize {
[super setFrameSize:newSize];
[self setNeedsDisplay:YES]; // Force "drawRect" call.
}
+ (void)initialize { + (void)initialize {
if (self == [GodotContentView class]) { if (self == [GodotContentView class]) {
// nothing left to do here at the moment.. // nothing left to do here at the moment..
@ -3356,10 +3370,10 @@ void OS_OSX::force_process_input() {
} }
void OS_OSX::pre_wait_observer_cb(CFRunLoopObserverRef p_observer, CFRunLoopActivity p_activiy, void *p_context) { void OS_OSX::pre_wait_observer_cb(CFRunLoopObserverRef p_observer, CFRunLoopActivity p_activiy, void *p_context) {
// Prevent main loop from sleeping and redraw window during resize / modal popups. // Prevent main loop from sleeping and redraw window during modal popup display.
// Do not redraw when rendering is done from the separate thread, it will conflict with the OpenGL context updates triggered by window view resize. // Do not redraw when rendering is done from the separate thread, it will conflict with the OpenGL context updates.
if (get_singleton()->get_main_loop() && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD || !OS_OSX::singleton->is_resizing)) { if (get_singleton()->get_main_loop() && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD) && !OS_OSX::singleton->is_resizing) {
Main::force_redraw(); Main::force_redraw();
if (!Main::is_iterating()) { // Avoid cyclic loop. if (!Main::is_iterating()) { // Avoid cyclic loop.
Main::iteration(); Main::iteration();