mirror of
https://github.com/rust-windowing/winit.git
synced 2026-09-02 06:40:06 -04:00
wayland/x11: Make ControlFlow::Exit sticky
This commit is contained in:
@@ -204,23 +204,63 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
// empty buffer of events
|
// empty buffer of events
|
||||||
{
|
{
|
||||||
let mut guard = sink.lock().unwrap();
|
let mut guard = sink.lock().unwrap();
|
||||||
guard.empty_with(|evt| callback(evt, &self.window_target, &mut control_flow));
|
guard.empty_with(|evt| {
|
||||||
|
// make ControlFlow::Exit sticky by providing a dummy
|
||||||
|
// control flow reference if it is already Exit.
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(evt, &self.window_target, cf)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// empty user events
|
// empty user events
|
||||||
{
|
{
|
||||||
let mut guard = user_events.borrow_mut();
|
let mut guard = user_events.borrow_mut();
|
||||||
for evt in guard.drain(..) {
|
for evt in guard.drain(..) {
|
||||||
callback(::event::Event::UserEvent(evt), &self.window_target, &mut control_flow);
|
// make ControlFlow::Exit sticky by providing a dummy
|
||||||
|
// control flow reference if it is already Exit.
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(::event::Event::UserEvent(evt), &self.window_target, cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// send Events cleared
|
||||||
callback(::event::Event::EventsCleared, &self.window_target, &mut control_flow);
|
{
|
||||||
|
// make ControlFlow::Exit sticky
|
||||||
// fo a second run of post-dispatch-triggers, to handle user-generated "request-redraw"
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(::event::Event::EventsCleared, &self.window_target, cf);
|
||||||
|
}
|
||||||
|
// do a second run of post-dispatch-triggers, to handle user-generated "request-redraw"
|
||||||
self.post_dispatch_triggers();
|
self.post_dispatch_triggers();
|
||||||
{
|
{
|
||||||
let mut guard = sink.lock().unwrap();
|
let mut guard = sink.lock().unwrap();
|
||||||
guard.empty_with(|evt| callback(evt, &self.window_target, &mut control_flow));
|
guard.empty_with(|evt| {
|
||||||
|
// make ControlFlow::Exit sticky by providing a dummy
|
||||||
|
// control flow reference if it is already Exit.
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(evt, &self.window_target, cf)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// send pending events to the server
|
// send pending events to the server
|
||||||
|
|||||||
@@ -232,29 +232,64 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
{
|
{
|
||||||
let mut guard = self.pending_events.borrow_mut();
|
let mut guard = self.pending_events.borrow_mut();
|
||||||
for evt in guard.drain(..) {
|
for evt in guard.drain(..) {
|
||||||
callback(evt, &self.target, &mut control_flow);
|
// make ControlFlow::Exit sticky by providing a dummy
|
||||||
|
// control flow reference if it is already Exit.
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(evt, &self.target, cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Empty the user event buffer
|
// Empty the user event buffer
|
||||||
{
|
{
|
||||||
let mut guard = self.pending_user_events.borrow_mut();
|
let mut guard = self.pending_user_events.borrow_mut();
|
||||||
for evt in guard.drain(..) {
|
for evt in guard.drain(..) {
|
||||||
callback(::event::Event::UserEvent(evt), &self.target, &mut control_flow);
|
// make ControlFlow::Exit sticky
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(::event::Event::UserEvent(evt), &self.target, cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// send Events cleared
|
||||||
callback(::event::Event::EventsCleared, &self.target, &mut control_flow);
|
{
|
||||||
// Empty th redraw requests
|
// make ControlFlow::Exit sticky
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
|
callback(::event::Event::EventsCleared, &self.target, cf);
|
||||||
|
}
|
||||||
|
// Empty the redraw requests
|
||||||
{
|
{
|
||||||
let mut guard = wt.pending_redraws.lock().unwrap();
|
let mut guard = wt.pending_redraws.lock().unwrap();
|
||||||
for wid in guard.drain(..) {
|
for wid in guard.drain(..) {
|
||||||
|
// make ControlFlow::Exit sticky
|
||||||
|
let mut dummy = ControlFlow::Exit;
|
||||||
|
let cf = if control_flow == ControlFlow::Exit {
|
||||||
|
&mut dummy
|
||||||
|
} else {
|
||||||
|
&mut control_flow
|
||||||
|
};
|
||||||
|
// user callback
|
||||||
callback(
|
callback(
|
||||||
Event::WindowEvent {
|
Event::WindowEvent {
|
||||||
window_id: ::window::WindowId(super::WindowId::X(wid)),
|
window_id: ::window::WindowId(super::WindowId::X(wid)),
|
||||||
event: WindowEvent::RedrawRequested
|
event: WindowEvent::RedrawRequested
|
||||||
},
|
},
|
||||||
&self.target,
|
&self.target,
|
||||||
&mut control_flow
|
cf
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user