#[warn(missing_docs)] mod cursor; mod event; mod raw_handle; mod system; mod window; pub use crate::raw_handle::*; pub use cursor::*; pub use event::*; pub use system::*; pub use window::*; pub mod prelude { #[doc(hidden)] pub use crate::{ CursorEntered, CursorIcon, CursorLeft, CursorMoved, FileDragAndDrop, Ime, MonitorSelection, ReceivedCharacter, Window, WindowMoved, WindowPlugin, WindowPosition, WindowResizeConstraints, }; } use bevy_app::prelude::*; use bevy_ecs::prelude::*; use std::path::PathBuf; impl Default for WindowPlugin { fn default() -> Self { WindowPlugin { primary_window: Some(Window::default()), exit_condition: ExitCondition::OnAllClosed, close_when_requested: true, } } } /// A [`Plugin`] that defines an interface for windowing support in Bevy. pub struct WindowPlugin { /// Settings for the primary window. This will be spawned by /// default, if you want to run without a primary window you should /// set this to `None`. /// /// Note that if there are no windows, by default the App will exit, /// due to [`exit_on_all_closed`]. pub primary_window: Option, /// Whether to exit the app when there are no open windows. /// /// If disabling this, ensure that you send the [`bevy_app::AppExit`] /// event when the app should exit. If this does not occur, you will /// create 'headless' processes (processes without windows), which may /// surprise your users. It is recommended to leave this setting to /// either [`ExitCondition::OnAllClosed`] or [`ExitCondition::OnPrimaryClosed`]. /// /// [`ExitCondition::OnAllClosed`] will add [`exit_on_all_closed`] to [`CoreSet::Update`]. /// [`ExitCondition::OnPrimaryClosed`] will add [`exit_on_primary_closed`] to [`CoreSet::Update`]. pub exit_condition: ExitCondition, /// Whether to close windows when they are requested to be closed (i.e. /// when the close button is pressed). /// /// If true, this plugin will add [`close_when_requested`] to [`CoreSet::Update`]. /// If this system (or a replacement) is not running, the close button will have no effect. /// This may surprise your users. It is recommended to leave this setting as `true`. pub close_when_requested: bool, } impl Plugin for WindowPlugin { fn build(&self, app: &mut App) { // User convenience events app.add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::(); if let Some(primary_window) = &self.primary_window { app.world .spawn(primary_window.clone()) .insert(PrimaryWindow); } match self.exit_condition { ExitCondition::OnPrimaryClosed => { app.add_system(exit_on_primary_closed.in_base_set(CoreSet::PostUpdate)); } ExitCondition::OnAllClosed => { app.add_system(exit_on_all_closed.in_base_set(CoreSet::PostUpdate)); } ExitCondition::DontExit => {} } if self.close_when_requested { app.add_system(close_when_requested.in_base_set(CoreSet::PostUpdate)); } // Register event types app.register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::(); // Register window descriptor and related types app.register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::(); // Register `PathBuf` as it's used by `FileDragAndDrop` app.register_type::(); } } #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)] pub struct ModifiesWindows; /// Defines the specific conditions the application should exit on #[derive(Clone)] pub enum ExitCondition { /// Close application when the primary window is closed /// /// The plugin will add [`exit_on_primary_closed`] to [`CoreSet::Update`]. OnPrimaryClosed, /// Close application when all windows are closed /// /// The plugin will add [`exit_on_all_closed`] to [`CoreSet::Update`]. OnAllClosed, /// Keep application running headless even after closing all windows /// /// If selecting this, ensure that you send the [`bevy_app::AppExit`] /// event when the app should exit. If this does not occur, you will /// create 'headless' processes (processes without windows), which may /// surprise your users. DontExit, }