* Add exclusive fullscreen mode * Add `WindowExtMacOS::set_fullscreen_presentation_options` * Capture display for exclusive fullscreen on macOS * Fix applying video mode on macOS after a fullscreen cycle * Fix compilation on iOS * Set monitor appropriately for fullscreen on macOS * Fix exclusive to borderless fullscreen transitions on macOS * Fix borderless to exclusive fullscreen transition on macOS * Sort video modes on Windows * Fix fullscreen issues on Windows * Fix video mode changes during exclusive fullscreen on Windows * Add video mode sorting for macOS and iOS * Fix monitor `ns_screen` returning `None` after video mode change * Fix "multithreaded" example on macOS * Restore video mode upon closing an exclusive fullscreen window * Fix "multithreaded" example closing multiple windows at once * Fix compilation on Linux * Update FEATURES.md * Don't care about logical monitor groups on X11 * Add exclusive fullscreen for X11 * Update FEATURES.md * Fix transitions between exclusive and borderless fullscreen on X11 * Update CHANGELOG.md * Document that Wayland doesn't support exclusive fullscreen * Replace core-graphics display mode bindings on macOS * Use `panic!()` instead of `unreachable!()` in "fullscreen" example * Fix fullscreen "always on top" flag on Windows * Track current monitor for fullscreen in "multithreaded" example * Fix exclusive fullscreen sometimes not positioning window properly * Format * More formatting and fix CI issues * Fix formatting * Fix changelog formatting
80 lines
1.9 KiB
Rust
80 lines
1.9 KiB
Rust
#![cfg(target_os = "macos")]
|
|
|
|
mod app;
|
|
mod app_delegate;
|
|
mod app_state;
|
|
mod event;
|
|
mod event_loop;
|
|
mod ffi;
|
|
mod monitor;
|
|
mod observer;
|
|
mod util;
|
|
mod view;
|
|
mod window;
|
|
mod window_delegate;
|
|
|
|
use std::{fmt, ops::Deref, sync::Arc};
|
|
|
|
pub use self::{
|
|
event_loop::{EventLoop, EventLoopWindowTarget, Proxy as EventLoopProxy},
|
|
monitor::{MonitorHandle, VideoMode},
|
|
window::{Id as WindowId, PlatformSpecificWindowBuilderAttributes, UnownedWindow},
|
|
};
|
|
use crate::{
|
|
error::OsError as RootOsError, event::DeviceId as RootDeviceId, window::WindowAttributes,
|
|
};
|
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
|
pub struct DeviceId;
|
|
|
|
impl DeviceId {
|
|
pub unsafe fn dummy() -> Self {
|
|
DeviceId
|
|
}
|
|
}
|
|
|
|
// Constant device ID; to be removed when if backend is updated to report real device IDs.
|
|
pub(crate) const DEVICE_ID: RootDeviceId = RootDeviceId(DeviceId);
|
|
|
|
pub struct Window {
|
|
window: Arc<UnownedWindow>,
|
|
// We keep this around so that it doesn't get dropped until the window does.
|
|
_delegate: util::IdRef,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum OsError {
|
|
CGError(core_graphics::base::CGError),
|
|
CreationError(&'static str),
|
|
}
|
|
|
|
unsafe impl Send for Window {}
|
|
unsafe impl Sync for Window {}
|
|
|
|
impl Deref for Window {
|
|
type Target = UnownedWindow;
|
|
#[inline]
|
|
fn deref(&self) -> &Self::Target {
|
|
&*self.window
|
|
}
|
|
}
|
|
|
|
impl Window {
|
|
pub fn new<T: 'static>(
|
|
_window_target: &EventLoopWindowTarget<T>,
|
|
attributes: WindowAttributes,
|
|
pl_attribs: PlatformSpecificWindowBuilderAttributes,
|
|
) -> Result<Self, RootOsError> {
|
|
let (window, _delegate) = UnownedWindow::new(attributes, pl_attribs)?;
|
|
Ok(Window { window, _delegate })
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for OsError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
OsError::CGError(e) => f.pad(&format!("CGError {}", e)),
|
|
OsError::CreationError(e) => f.pad(e),
|
|
}
|
|
}
|
|
}
|