On X11, fix WaitUntil and Poll behavior
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
This commit is contained in:
parent
f10ae52385
commit
c8b685ddbc
2 changed files with 18 additions and 12 deletions
|
|
@ -24,6 +24,7 @@ And please only add new entries to the top of this list, right below the `# Unre
|
||||||
- **Breaking:** Moved `ControlFlow::Exit` to `EventLoopWindowTarget::exit()` and `EventLoopWindowTarget::exiting()` and removed `ControlFlow::ExitWithCode(_)` entirely.
|
- **Breaking:** Moved `ControlFlow::Exit` to `EventLoopWindowTarget::exit()` and `EventLoopWindowTarget::exiting()` and removed `ControlFlow::ExitWithCode(_)` entirely.
|
||||||
- On Web, add `EventLoopWindowTargetExtWebSys` and `PollStrategy`, which allows to set different strategies for `ControlFlow::Poll`. By default the Prioritized Task Scheduling API is used, but an option to use `Window.requestIdleCallback` is available as well. Both use `setTimeout()`, with a trick to circumvent throttling to 4ms, as a fallback.
|
- On Web, add `EventLoopWindowTargetExtWebSys` and `PollStrategy`, which allows to set different strategies for `ControlFlow::Poll`. By default the Prioritized Task Scheduling API is used, but an option to use `Window.requestIdleCallback` is available as well. Both use `setTimeout()`, with a trick to circumvent throttling to 4ms, as a fallback.
|
||||||
- Implement `PartialOrd` and `Ord` for `MouseButton`.
|
- Implement `PartialOrd` and `Ord` for `MouseButton`.
|
||||||
|
- On X11, fix event loop not waking up on `ControlFlow::Poll` and `ControlFlow::WaitUntil`.
|
||||||
|
|
||||||
# 0.29.1-beta
|
# 0.29.1-beta
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -505,18 +505,6 @@ impl<T: 'static> EventLoop<T> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// False positive / spurious wake ups could lead to us spamming
|
|
||||||
// redundant iterations of the event loop with no new events to
|
|
||||||
// dispatch.
|
|
||||||
//
|
|
||||||
// If there's no readable event source then we just double check if we
|
|
||||||
// have any pending `_receiver` events and if not we return without
|
|
||||||
// running a loop iteration.
|
|
||||||
// If we don't have any pending `_receiver`
|
|
||||||
if !self.has_pending() && !self.state.x11_readiness.readable {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NB: `StartCause::Init` is handled as a special case and doesn't need
|
// NB: `StartCause::Init` is handled as a special case and doesn't need
|
||||||
// to be considered here
|
// to be considered here
|
||||||
let cause = match self.control_flow() {
|
let cause = match self.control_flow() {
|
||||||
|
|
@ -540,6 +528,23 @@ impl<T: 'static> EventLoop<T> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// False positive / spurious wake ups could lead to us spamming
|
||||||
|
// redundant iterations of the event loop with no new events to
|
||||||
|
// dispatch.
|
||||||
|
//
|
||||||
|
// If there's no readable event source then we just double check if we
|
||||||
|
// have any pending `_receiver` events and if not we return without
|
||||||
|
// running a loop iteration.
|
||||||
|
// If we don't have any pending `_receiver`
|
||||||
|
if !self.has_pending()
|
||||||
|
&& !matches!(
|
||||||
|
&cause,
|
||||||
|
StartCause::ResumeTimeReached { .. } | StartCause::Poll
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
self.single_iteration(&mut callback, cause);
|
self.single_iteration(&mut callback, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue