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:
parent
c00b4bf55c
commit
3f878cc869
|
@ -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 => {
|
||||||
|
|
Loading…
Reference in New Issue