mirror of
https://github.com/rust-windowing/winit.git
synced 2026-09-01 06:10:07 -04:00
Handle ControlFlow::Exit and dealing with events-in-events
This commit is contained in:
@@ -231,6 +231,11 @@ fn add_event<T: 'static, E, F>(elrs: &EventLoopRunnerShared<T>, target: &impl IE
|
|||||||
let elrs = elrs.clone();
|
let elrs = elrs.clone();
|
||||||
|
|
||||||
target.add_event_listener(move |event: E| {
|
target.add_event_listener(move |event: E| {
|
||||||
|
// Don't capture the event if the events loop has been destroyed
|
||||||
|
if elrs.runner.borrow().control == ControlFlow::Exit {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
event.prevent_default();
|
event.prevent_default();
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
event.cancel_bubble();
|
event.cancel_bubble();
|
||||||
@@ -251,6 +256,22 @@ impl<T> ELRShared<T> {
|
|||||||
// TODO: handle event loop closures
|
// TODO: handle event loop closures
|
||||||
// TODO: handle event buffer
|
// TODO: handle event buffer
|
||||||
pub fn send_event(&self, event: Event<T>) {
|
pub fn send_event(&self, event: Event<T>) {
|
||||||
|
let start_cause = StartCause::Poll; // TODO: this is obviously not right
|
||||||
|
self.handle_start(StartCause::Poll);
|
||||||
|
self.handle_event(event);
|
||||||
|
self.handle_event(Event::EventsCleared);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_start(&self, start: StartCause) {
|
||||||
|
let is_handling = if Some(ref runner) = *self.runner.borrow() {
|
||||||
|
runner.handling
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
self.handle_event(Event::StartCause(is_handling));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_event(&self, event: Event<T>) {
|
||||||
match *self.runner.borrow_mut() {
|
match *self.runner.borrow_mut() {
|
||||||
Some(ref mut runner) if !runner.handling => {
|
Some(ref mut runner) if !runner.handling => {
|
||||||
runner.handling = true;
|
runner.handling = true;
|
||||||
@@ -264,6 +285,11 @@ impl<T> ELRShared<T> {
|
|||||||
}
|
}
|
||||||
_ => self.events.borrow_mut().push_back(event)
|
_ => self.events.borrow_mut().push_back(event)
|
||||||
}
|
}
|
||||||
|
if self.runner.borrow().is_some() {
|
||||||
|
if let Some(event) = self.events.borrow_mut().pop_front() {
|
||||||
|
self.handle_event(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user