mod cursor; mod event; mod raw_window_handle; mod system; mod window; mod windows; pub use crate::raw_window_handle::*; pub use cursor::*; pub use event::*; pub use system::*; pub use window::*; pub use windows::*; pub mod prelude { #[doc(hidden)] pub use crate::{ CursorEntered, CursorIcon, CursorLeft, CursorMoved, FileDragAndDrop, ReceivedCharacter, Window, WindowDescriptor, WindowMoved, Windows, }; } use bevy_app::prelude::*; use bevy_ecs::{event::Events, schedule::SystemLabel}; pub struct WindowPlugin { /// Whether to create a window when added. /// /// Note that if there are no windows, by default the App will exit, /// due to [`exit_on_all_closed`]. pub add_primary_window: bool, /// 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 as `true`. /// /// If true, this plugin will add [`exit_on_all_closed`] to [`CoreStage::Update`]. pub exit_on_all_closed: bool, /// 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 [`CoreStage::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 Default for WindowPlugin { fn default() -> Self { WindowPlugin { add_primary_window: true, exit_on_all_closed: true, close_when_requested: true, } } } impl Plugin for WindowPlugin { fn build(&self, app: &mut App) { 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::() .init_resource::(); if self.add_primary_window { let window_descriptor = app .world .get_resource::() .map(|descriptor| (*descriptor).clone()) .unwrap_or_default(); let mut create_window_event = app.world.resource_mut::>(); create_window_event.send(CreateWindow { id: WindowId::primary(), descriptor: window_descriptor, }); } if self.exit_on_all_closed { app.add_system(exit_on_all_closed); } if self.close_when_requested { app.add_system(close_when_requested); } } } #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)] pub struct ModifiesWindows;