mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-31 05:40:04 -04:00
Only run observers in the default run loop mode
This commit is contained in:
@@ -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" }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
Reference in New Issue
Block a user