desktop: Take ownership of `EventLoop` on `App::run`

Change `App::event_loop` to an `Option` that will be taken on
`App::run` so that `App::run` can continue to call methods on
`self` later.

This is a little awkward, and better might be to remove `App::new`
and make `App:run` return `Result<!, Error>,` but `!` types are
experimental.
This commit is contained in:
Mike Welsh 2023-03-27 15:48:47 -07:00 committed by Nathan Adams
parent c00b4bf55c
commit 3f878cc869
1 changed files with 260 additions and 264 deletions

View File

@ -46,7 +46,7 @@ use winit::event::{
ElementState, KeyboardInput, ModifiersState, MouseButton, MouseScrollDelta, VirtualKeyCode, ElementState, KeyboardInput, ModifiersState, MouseButton, MouseScrollDelta, VirtualKeyCode,
WindowEvent, WindowEvent,
}; };
use winit::event_loop::{ControlFlow, EventLoop, EventLoopBuilder}; use winit::event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy};
use winit::window::{Fullscreen, Icon, Window, WindowBuilder}; use winit::window::{Fullscreen, Icon, Window, WindowBuilder};
thread_local! { thread_local! {
@ -278,7 +278,8 @@ fn get_screen_size(event_loop: &EventLoop<RuffleEvent>) -> PhysicalSize<u32> {
struct App { struct App {
opt: Opt, opt: Opt,
window: Rc<Window>, window: Rc<Window>,
event_loop: EventLoop<RuffleEvent>, event_loop: Option<EventLoop<RuffleEvent>>,
event_loop_proxy: EventLoopProxy<RuffleEvent>,
executor: Arc<Mutex<GlutinAsyncExecutor>>, executor: Arc<Mutex<GlutinAsyncExecutor>>,
gui: Arc<Mutex<GuiController>>, gui: Arc<Mutex<GuiController>>,
player: Arc<Mutex<Player>>, player: Arc<Mutex<Player>>,
@ -416,7 +417,8 @@ impl App {
Ok(Self { Ok(Self {
opt, opt,
window, window,
event_loop, event_loop_proxy: event_loop.create_proxy(),
event_loop: Some(event_loop),
executor, executor,
gui, gui,
player, player,
@ -425,7 +427,7 @@ impl App {
}) })
} }
fn run(self) -> ! { fn run(mut self) -> ! {
enum LoadingState { enum LoadingState {
Loading, Loading,
WaitingForResize, WaitingForResize,
@ -440,8 +442,8 @@ impl App {
let mut fullscreen_down = false; let mut fullscreen_down = false;
// Poll UI events. // Poll UI events.
self.event_loop let event_loop = self.event_loop.take().expect("App already running");
.run(move |event, _window_target, control_flow| { event_loop.run(move |event, _window_target, control_flow| {
match event { match event {
winit::event::Event::LoopDestroyed => { winit::event::Event::LoopDestroyed => {
self.player self.player
@ -531,9 +533,7 @@ impl App {
MouseButton::Other(_) => RuffleMouseButton::Unknown, MouseButton::Other(_) => RuffleMouseButton::Unknown,
}; };
let event = match state { let event = match state {
ElementState::Pressed => { ElementState::Pressed => PlayerEvent::MouseDown { x, y, button },
PlayerEvent::MouseDown { x, y, button }
}
ElementState::Released => PlayerEvent::MouseUp { x, y, button }, ElementState::Released => PlayerEvent::MouseUp { x, y, button },
}; };
player_lock.handle_event(event); player_lock.handle_event(event);
@ -548,9 +548,7 @@ impl App {
MouseScrollDelta::LineDelta(_, dy) => { MouseScrollDelta::LineDelta(_, dy) => {
MouseWheelDelta::Lines(dy.into()) MouseWheelDelta::Lines(dy.into())
} }
MouseScrollDelta::PixelDelta(pos) => { MouseScrollDelta::PixelDelta(pos) => MouseWheelDelta::Pixels(pos.y),
MouseWheelDelta::Pixels(pos.y)
}
}; };
let event = PlayerEvent::MouseWheel { delta }; let event = PlayerEvent::MouseWheel { delta };
player_lock.handle_event(event); player_lock.handle_event(event);
@ -585,11 +583,9 @@ impl App {
.. ..
} if modifiers.alt() => { } if modifiers.alt() => {
if !fullscreen_down { if !fullscreen_down {
self.player.lock().expect("Cannot reenter").update( self.player.lock().expect("Cannot reenter").update(|uc| {
|uc| {
uc.stage.toggle_display_state(uc); uc.stage.toggle_display_state(uc);
}, });
);
} }
fullscreen_down = true; fullscreen_down = true;
return; return;
@ -624,9 +620,9 @@ impl App {
if let Some(control_code) = if let Some(control_code) =
winit_to_ruffle_text_control(key, modifiers) winit_to_ruffle_text_control(key, modifiers)
{ {
player_lock.handle_event( player_lock.handle_event(PlayerEvent::TextControl {
PlayerEvent::TextControl { code: control_code }, code: control_code,
); });
} }
} }
ElementState::Released => { ElementState::Released => {