2
0
Fork 0
mirror of https://github.com/bevyengine/bevy synced 2025-01-09 11:48:56 +00:00
bevy/src/core/window/winit/mod.rs

124 lines
4 KiB
Rust
Raw Normal View History

2020-03-30 21:53:32 +00:00
mod winit_windows;
pub use winit_windows::*;
use crate::prelude::*;
2020-03-30 21:53:32 +00:00
use super::{CreateWindow, Window, WindowCreated, WindowResize, Windows};
use winit::{
event,
event::WindowEvent,
2020-03-30 21:53:32 +00:00
event_loop::{ControlFlow, EventLoop, EventLoopWindowTarget},
};
2020-03-29 07:53:47 +00:00
#[derive(Default)]
pub struct WinitPlugin;
impl AppPlugin for WinitPlugin {
2020-03-30 18:52:33 +00:00
fn build(&self, app: AppBuilder) -> AppBuilder {
2020-03-30 21:53:32 +00:00
app
.add_resource(WinitWindows::default())
.set_runner(winit_runner)
2020-03-29 07:53:47 +00:00
}
fn name(&self) -> &'static str {
"Winit"
}
}
2020-03-30 18:52:33 +00:00
pub fn winit_runner(mut app: App) {
env_logger::init();
let event_loop = EventLoop::new();
2020-03-30 21:53:32 +00:00
let mut create_window_event_handle = app.resources.get_event_handle::<CreateWindow>();
2020-03-30 21:53:32 +00:00
handle_create_window_events(
&mut app.resources,
&event_loop,
&mut create_window_event_handle,
);
2020-03-30 18:52:33 +00:00
log::debug!("Entering render loop");
2020-03-30 21:53:32 +00:00
event_loop.run(move |event, event_loop, control_flow| {
2020-03-30 18:52:33 +00:00
*control_flow = if cfg!(feature = "metal-auto-capture") {
ControlFlow::Exit
} else {
ControlFlow::Poll
};
match event {
event::Event::WindowEvent {
event: WindowEvent::Resized(size),
2020-03-30 21:53:32 +00:00
window_id: winit_window_id,
2020-03-30 18:52:33 +00:00
..
} => {
2020-03-30 21:53:32 +00:00
let winit_windows = app.resources.get_mut::<WinitWindows>().unwrap();
let mut windows = app.resources.get_mut::<Windows>().unwrap();
let window_id = winit_windows.get_window_id(winit_window_id).unwrap();
let mut window = windows.get_mut(window_id).unwrap();
2020-03-30 18:52:33 +00:00
window.width = size.width;
window.height = size.height;
2020-03-30 18:52:33 +00:00
let mut resize_event = app.resources.get_mut::<Event<WindowResize>>().unwrap();
2020-03-30 21:53:32 +00:00
resize_event.send(WindowResize {
id: window_id,
2020-03-30 18:52:33 +00:00
height: window.height,
width: window.width,
});
}
event::Event::WindowEvent { event, .. } => match event {
WindowEvent::KeyboardInput {
input:
event::KeyboardInput {
virtual_keycode: Some(event::VirtualKeyCode::Escape),
state: event::ElementState::Pressed,
..
},
..
}
2020-03-30 18:52:33 +00:00
| WindowEvent::CloseRequested => {
*control_flow = ControlFlow::Exit;
}
2020-03-30 18:52:33 +00:00
_ => {}
},
event::Event::MainEventsCleared => {
2020-03-30 21:53:32 +00:00
handle_create_window_events(
&mut app.resources,
event_loop,
&mut create_window_event_handle,
);
2020-03-30 18:52:33 +00:00
app.update();
}
2020-03-30 18:52:33 +00:00
_ => (),
}
});
2020-03-29 07:53:47 +00:00
}
2020-03-30 21:53:32 +00:00
fn handle_create_window_events(
resources: &mut Resources,
event_loop: &EventLoopWindowTarget<()>,
create_window_event_handle: &mut EventHandle<CreateWindow>,
) {
let mut winit_windows = resources.get_mut::<WinitWindows>().unwrap();
let mut windows = resources.get_mut::<Windows>().unwrap();
let create_window_events = resources.get::<Event<CreateWindow>>().unwrap();
let mut window_created_events = resources.get_mut::<Event<WindowCreated>>().unwrap();
for create_window_event in create_window_events.iter(create_window_event_handle) {
let window = Window::new(&create_window_event.descriptor);
create_window(
&event_loop,
&mut window_created_events,
&mut winit_windows,
&window,
);
windows.add(window);
}
}
pub fn create_window(
event_loop: &EventLoopWindowTarget<()>,
window_created_events: &mut Event<WindowCreated>,
winit_windows: &mut WinitWindows,
window: &Window,
) {
winit_windows.create_window(event_loop, &window);
window_created_events.send(WindowCreated { id: window.id });
}