#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc(
html_logo_url = "https://bevy.org/assets/icon.png",
html_favicon_url = "https://bevy.org/assets/icon.png"
)]
#![no_std]
#[cfg(feature = "std")]
extern crate std;
extern crate alloc;
mod cursor;
mod event;
mod monitor;
mod raw_handle;
mod system;
mod window;
pub use crate::raw_handle::*;
pub use cursor::*;
pub use event::*;
pub use monitor::*;
pub use system::*;
pub use window::*;
pub mod prelude {
#[doc(hidden)]
pub use crate::{
CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, Ime, MonitorSelection,
VideoModeSelection, Window, WindowMoved, WindowPlugin, WindowPosition,
WindowResizeConstraints,
};
}
use alloc::sync::Arc;
use bevy_app::prelude::*;
use bevy_platform::sync::Mutex;
impl Default for WindowPlugin {
fn default() -> Self {
WindowPlugin {
primary_window: Some(Window::default()),
primary_cursor_options: Some(CursorOptions::default()),
exit_condition: ExitCondition::OnAllClosed,
close_when_requested: true,
}
}
}
pub struct WindowPlugin {
pub primary_window: Option<Window>,
pub primary_cursor_options: Option<CursorOptions>,
pub exit_condition: ExitCondition,
pub close_when_requested: bool,
}
impl Plugin for WindowPlugin {
fn build(&self, app: &mut App) {
app.add_message::<WindowEvent>()
.add_message::<WindowResized>()
.add_message::<WindowCreated>()
.add_message::<WindowClosing>()
.add_message::<WindowClosed>()
.add_message::<WindowCloseRequested>()
.add_message::<WindowDestroyed>()
.add_message::<RequestRedraw>()
.add_message::<CursorMoved>()
.add_message::<CursorEntered>()
.add_message::<CursorLeft>()
.add_message::<Ime>()
.add_message::<WindowFocused>()
.add_message::<WindowOccluded>()
.add_message::<WindowScaleFactorChanged>()
.add_message::<WindowBackendScaleFactorChanged>()
.add_message::<FileDragAndDrop>()
.add_message::<WindowMoved>()
.add_message::<WindowThemeChanged>()
.add_message::<AppLifecycle>();
if let Some(primary_window) = &self.primary_window {
let mut entity_commands = app.world_mut().spawn(primary_window.clone());
entity_commands.insert((
PrimaryWindow,
RawHandleWrapperHolder(Arc::new(Mutex::new(None))),
));
if let Some(primary_cursor_options) = &self.primary_cursor_options {
entity_commands.insert(primary_cursor_options.clone());
}
}
match self.exit_condition {
ExitCondition::OnPrimaryClosed => {
app.add_systems(PostUpdate, exit_on_primary_closed);
}
ExitCondition::OnAllClosed => {
app.add_systems(PostUpdate, exit_on_all_closed);
}
ExitCondition::DontExit => {}
}
if self.close_when_requested {
app.add_systems(Update, close_when_requested);
}
}
}
#[derive(Clone)]
pub enum ExitCondition {
OnPrimaryClosed,
OnAllClosed,
DontExit,
}