Only run observers in the default run loop mode

This commit is contained in:
Mads Marquart
2024-05-27 11:41:07 +02:00
parent 82d9bbe559
commit bf73a978df
7 changed files with 15 additions and 21 deletions

View File

@@ -12,4 +12,6 @@ disallowed-methods = [
{ path = "web_sys::Document::fullscreen_element", reason = "Doesn't account for compatibility with Safari" }, { path = "web_sys::Document::fullscreen_element", reason = "Doesn't account for compatibility with Safari" },
{ path = "objc2_app_kit::NSView::visibleRect", reason = "We expose a render target to the user, and visibility is not really relevant to that (and can break if you don't use the rectangle position as well). Use `frame` instead." }, { path = "objc2_app_kit::NSView::visibleRect", reason = "We expose a render target to the user, and visibility is not really relevant to that (and can break if you don't use the rectangle position as well). Use `frame` instead." },
{ path = "objc2_app_kit::NSWindow::setFrameTopLeftPoint", reason = "Not sufficient when working with Winit's coordinate system, use `flip_window_screen_coordinates` instead" }, { path = "objc2_app_kit::NSWindow::setFrameTopLeftPoint", reason = "Not sufficient when working with Winit's coordinate system, use `flip_window_screen_coordinates` instead" },
{ path = "core_foundation::runloop::kCFRunLoopCommonModes", reason = "Using the common modes includes the modal panel mode, which we usually want to avoid" },
{ path = "objc2_foundation::NSRunLoopCommonModes", reason = "Using the common modes includes the modal panel mode, which we usually want to avoid" }
] ]

View File

@@ -323,8 +323,7 @@ impl ApplicationDelegate {
.upgrade() .upgrade()
.expect("The panic info must exist here. This failure indicates a developer error."); .expect("The panic info must exist here. This failure indicates a developer error.");
// Return when in event handler due to https://github.com/rust-windowing/winit/issues/1779 if panic_info.is_panicking() || !self.is_running() {
if panic_info.is_panicking() || !self.ivars().event_handler.ready() || !self.is_running() {
return; return;
} }
@@ -356,10 +355,7 @@ impl ApplicationDelegate {
.upgrade() .upgrade()
.expect("The panic info must exist here. This failure indicates a developer error."); .expect("The panic info must exist here. This failure indicates a developer error.");
// Return when in event handler due to https://github.com/rust-windowing/winit/issues/1779 if panic_info.is_panicking() || !self.is_running() {
// XXX: how does it make sense that `event_handler.ready()` can ever return `false` here if
// we're about to return to the `CFRunLoop` to poll for new events?
if panic_info.is_panicking() || !self.ivars().event_handler.ready() || !self.is_running() {
return; return;
} }

View File

@@ -104,10 +104,6 @@ impl EventHandler {
self.inner.try_borrow().is_err() self.inner.try_borrow().is_err()
} }
pub(crate) fn ready(&self) -> bool {
matches!(self.inner.try_borrow().as_deref(), Ok(Some(_)))
}
pub(crate) fn handle( pub(crate) fn handle(
&self, &self,
callback: impl FnOnce(&mut dyn ApplicationHandler, &RootActiveEventLoop), callback: impl FnOnce(&mut dyn ApplicationHandler, &RootActiveEventLoop),

View File

@@ -12,7 +12,7 @@ use std::time::{Duration, Instant};
use core_foundation::base::{CFIndex, CFRelease}; use core_foundation::base::{CFIndex, CFRelease};
use core_foundation::runloop::{ use core_foundation::runloop::{
kCFRunLoopCommonModes, CFRunLoopAddSource, CFRunLoopGetMain, CFRunLoopSourceContext, kCFRunLoopDefaultMode, CFRunLoopAddSource, CFRunLoopGetMain, CFRunLoopSourceContext,
CFRunLoopSourceCreate, CFRunLoopSourceRef, CFRunLoopSourceSignal, CFRunLoopWakeUp, CFRunLoopSourceCreate, CFRunLoopSourceRef, CFRunLoopSourceSignal, CFRunLoopWakeUp,
}; };
use objc2::rc::{autoreleasepool, Retained}; use objc2::rc::{autoreleasepool, Retained};
@@ -462,7 +462,7 @@ impl EventLoopProxy {
perform: event_loop_proxy_handler, perform: event_loop_proxy_handler,
}; };
let source = CFRunLoopSourceCreate(ptr::null_mut(), CFIndex::MAX - 1, &mut context); let source = CFRunLoopSourceCreate(ptr::null_mut(), CFIndex::MAX - 1, &mut context);
CFRunLoopAddSource(rl, source, kCFRunLoopCommonModes); CFRunLoopAddSource(rl, source, kCFRunLoopDefaultMode);
CFRunLoopWakeUp(rl); CFRunLoopWakeUp(rl);
EventLoopProxy { proxy_wake_up, source } EventLoopProxy { proxy_wake_up, source }

View File

@@ -13,8 +13,8 @@ use block2::Block;
use core_foundation::base::{CFIndex, CFOptionFlags, CFRelease, CFTypeRef}; use core_foundation::base::{CFIndex, CFOptionFlags, CFRelease, CFTypeRef};
use core_foundation::date::CFAbsoluteTimeGetCurrent; use core_foundation::date::CFAbsoluteTimeGetCurrent;
use core_foundation::runloop::{ use core_foundation::runloop::{
kCFRunLoopAfterWaiting, kCFRunLoopBeforeWaiting, kCFRunLoopCommonModes, kCFRunLoopDefaultMode, kCFRunLoopAfterWaiting, kCFRunLoopBeforeWaiting, kCFRunLoopDefaultMode, kCFRunLoopExit,
kCFRunLoopExit, CFRunLoopActivity, CFRunLoopAddObserver, CFRunLoopAddTimer, CFRunLoopGetMain, CFRunLoopActivity, CFRunLoopAddObserver, CFRunLoopAddTimer, CFRunLoopGetMain,
CFRunLoopObserverCallBack, CFRunLoopObserverContext, CFRunLoopObserverCreate, CFRunLoopObserverCallBack, CFRunLoopObserverContext, CFRunLoopObserverCreate,
CFRunLoopObserverRef, CFRunLoopRef, CFRunLoopTimerCreate, CFRunLoopTimerInvalidate, CFRunLoopObserverRef, CFRunLoopRef, CFRunLoopTimerCreate, CFRunLoopTimerInvalidate,
CFRunLoopTimerRef, CFRunLoopTimerSetNextFireDate, CFRunLoopWakeUp, CFRunLoopTimerRef, CFRunLoopTimerSetNextFireDate, CFRunLoopWakeUp,
@@ -129,7 +129,7 @@ impl RunLoop {
context, context,
) )
}; };
unsafe { CFRunLoopAddObserver(self.0, observer, kCFRunLoopCommonModes) }; unsafe { CFRunLoopAddObserver(self.0, observer, kCFRunLoopDefaultMode) };
} }
/// Submit a closure to run on the main thread as the next step in the run loop, before other /// Submit a closure to run on the main thread as the next step in the run loop, before other
@@ -267,7 +267,7 @@ impl EventLoopWaker {
wakeup_main_loop, wakeup_main_loop,
ptr::null_mut(), ptr::null_mut(),
); );
CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes); CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopDefaultMode);
Self { timer, start_instant: Instant::now(), next_fire_date: None } Self { timer, start_instant: Instant::now(), next_fire_date: None }
} }
} }

View File

@@ -10,7 +10,7 @@ use std::{fmt, mem, ptr};
use core_foundation::base::CFRelease; use core_foundation::base::CFRelease;
use core_foundation::date::CFAbsoluteTimeGetCurrent; use core_foundation::date::CFAbsoluteTimeGetCurrent;
use core_foundation::runloop::{ use core_foundation::runloop::{
kCFRunLoopCommonModes, CFRunLoopAddTimer, CFRunLoopGetMain, CFRunLoopRef, CFRunLoopTimerCreate, kCFRunLoopDefaultMode, CFRunLoopAddTimer, CFRunLoopGetMain, CFRunLoopRef, CFRunLoopTimerCreate,
CFRunLoopTimerInvalidate, CFRunLoopTimerRef, CFRunLoopTimerSetNextFireDate, CFRunLoopTimerInvalidate, CFRunLoopTimerRef, CFRunLoopTimerSetNextFireDate,
}; };
use objc2::rc::Retained; use objc2::rc::Retained;
@@ -802,7 +802,7 @@ impl EventLoopWaker {
wakeup_main_loop, wakeup_main_loop,
ptr::null_mut(), ptr::null_mut(),
); );
CFRunLoopAddTimer(rl, timer, kCFRunLoopCommonModes); CFRunLoopAddTimer(rl, timer, kCFRunLoopDefaultMode);
EventLoopWaker { timer } EventLoopWaker { timer }
} }

View File

@@ -7,8 +7,8 @@ use std::sync::Arc;
use core_foundation::base::{CFIndex, CFRelease}; use core_foundation::base::{CFIndex, CFRelease};
use core_foundation::runloop::{ use core_foundation::runloop::{
kCFRunLoopAfterWaiting, kCFRunLoopBeforeWaiting, kCFRunLoopCommonModes, kCFRunLoopDefaultMode, kCFRunLoopAfterWaiting, kCFRunLoopBeforeWaiting, kCFRunLoopDefaultMode, kCFRunLoopExit,
kCFRunLoopExit, CFRunLoopActivity, CFRunLoopAddObserver, CFRunLoopAddSource, CFRunLoopGetMain, CFRunLoopActivity, CFRunLoopAddObserver, CFRunLoopAddSource, CFRunLoopGetMain,
CFRunLoopObserverCreate, CFRunLoopObserverRef, CFRunLoopSourceContext, CFRunLoopSourceCreate, CFRunLoopObserverCreate, CFRunLoopObserverRef, CFRunLoopSourceContext, CFRunLoopSourceCreate,
CFRunLoopSourceInvalidate, CFRunLoopSourceRef, CFRunLoopSourceSignal, CFRunLoopWakeUp, CFRunLoopSourceInvalidate, CFRunLoopSourceRef, CFRunLoopSourceSignal, CFRunLoopWakeUp,
}; };
@@ -266,7 +266,7 @@ impl EventLoopProxy {
perform: event_loop_proxy_handler, perform: event_loop_proxy_handler,
}; };
let source = CFRunLoopSourceCreate(ptr::null_mut(), CFIndex::MAX - 1, &mut context); let source = CFRunLoopSourceCreate(ptr::null_mut(), CFIndex::MAX - 1, &mut context);
CFRunLoopAddSource(rl, source, kCFRunLoopCommonModes); CFRunLoopAddSource(rl, source, kCFRunLoopDefaultMode);
CFRunLoopWakeUp(rl); CFRunLoopWakeUp(rl);
EventLoopProxy { proxy_wake_up, source } EventLoopProxy { proxy_wake_up, source }