#[doc(inline)]
pub use winit::platform::macos::{ActivationPolicy, OptionAsAlt};
use winit::platform::macos::{EventLoopBuilderExtMacOS as _, WindowExtMacOS as _};
use std::os::raw::c_void;
use super::__private as sealed;
use crate::event_loop::EventLoopBuilder;
use crate::window::{Window, WindowBuilder};
use crate::ThreadSafety;
pub trait WindowExtMacOS: sealed::WindowPrivate {
fn ns_window(&self) -> *mut c_void;
fn ns_view(&self) -> *mut c_void;
fn simple_fullscreen(&self) -> bool;
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool;
fn has_shadow(&self) -> bool;
fn set_has_shadow(&self, has_shadow: bool);
fn is_document_edited(&self) -> bool;
fn set_document_edited(&self, edited: bool);
fn set_option_as_alt(&self, option_as_alt: OptionAsAlt);
fn option_as_alt(&self) -> OptionAsAlt;
}
impl<TS: ThreadSafety> WindowExtMacOS for Window<TS> {
fn ns_view(&self) -> *mut c_void {
self.window().ns_view()
}
fn ns_window(&self) -> *mut c_void {
self.window().ns_window()
}
fn simple_fullscreen(&self) -> bool {
self.window().simple_fullscreen()
}
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
self.window().set_simple_fullscreen(fullscreen)
}
fn has_shadow(&self) -> bool {
self.window().has_shadow()
}
fn set_has_shadow(&self, has_shadow: bool) {
self.window().set_has_shadow(has_shadow)
}
fn is_document_edited(&self) -> bool {
self.window().is_document_edited()
}
fn set_document_edited(&self, edited: bool) {
self.window().set_document_edited(edited)
}
fn set_option_as_alt(&self, option_as_alt: OptionAsAlt) {
self.window().set_option_as_alt(option_as_alt)
}
fn option_as_alt(&self) -> OptionAsAlt {
self.window().option_as_alt()
}
}
pub trait WindowBuilderExtMacOS: sealed::WindowBuilderPrivate {
fn with_movable_by_window_background(self, movable_by_window_background: bool)
-> WindowBuilder;
fn with_titlebar_transparent(self, titlebar_transparent: bool) -> WindowBuilder;
fn with_title_hidden(self, title_hidden: bool) -> WindowBuilder;
fn with_titlebar_hidden(self, titlebar_hidden: bool) -> WindowBuilder;
fn with_titlebar_buttons_hidden(self, titlebar_buttons_hidden: bool) -> WindowBuilder;
fn with_fullsize_content_view(self, fullsize_content_view: bool) -> WindowBuilder;
fn with_disallow_hidpi(self, disallow_hidpi: bool) -> WindowBuilder;
fn with_has_shadow(self, has_shadow: bool) -> WindowBuilder;
fn with_accepts_first_mouse(self, accepts_first_mouse: bool) -> WindowBuilder;
fn with_option_as_alt(self, option_as_alt: OptionAsAlt) -> WindowBuilder;
}
impl WindowBuilderExtMacOS for WindowBuilder {
fn with_accepts_first_mouse(mut self, accepts_first_mouse: bool) -> WindowBuilder {
self.platform.accepts_first_mouse = Some(accepts_first_mouse);
self
}
fn with_movable_by_window_background(
mut self,
movable_by_window_background: bool,
) -> WindowBuilder {
self.platform.movable_by_window_background = Some(movable_by_window_background);
self
}
fn with_disallow_hidpi(mut self, disallow_hidpi: bool) -> WindowBuilder {
self.platform.disallow_hidpi = Some(disallow_hidpi);
self
}
fn with_has_shadow(mut self, has_shadow: bool) -> WindowBuilder {
self.platform.has_shadow = Some(has_shadow);
self
}
fn with_fullsize_content_view(mut self, fullsize_content_view: bool) -> WindowBuilder {
self.platform.fullsize_content_view = Some(fullsize_content_view);
self
}
fn with_titlebar_buttons_hidden(mut self, titlebar_buttons_hidden: bool) -> WindowBuilder {
self.platform.titlebar_buttons_hidden = Some(titlebar_buttons_hidden);
self
}
fn with_titlebar_hidden(mut self, titlebar_hidden: bool) -> WindowBuilder {
self.platform.titlebar_hidden = Some(titlebar_hidden);
self
}
fn with_option_as_alt(mut self, option_as_alt: OptionAsAlt) -> WindowBuilder {
self.platform.option_as_alt = Some(option_as_alt);
self
}
fn with_title_hidden(mut self, title_hidden: bool) -> WindowBuilder {
self.platform.title_hidden = Some(title_hidden);
self
}
fn with_titlebar_transparent(mut self, titlebar_transparent: bool) -> WindowBuilder {
self.platform.titlebar_transparent = Some(titlebar_transparent);
self
}
}
pub trait EventLoopBuilderExtMacOS: sealed::EventLoopBuilderPrivate {
fn with_activation_policy(&mut self, activation_policy: ActivationPolicy) -> &mut Self;
fn with_default_menu(&mut self, enable: bool) -> &mut Self;
fn with_activate_ignoring_other_apps(&mut self, ignore: bool) -> &mut Self;
}
impl EventLoopBuilderExtMacOS for EventLoopBuilder {
fn with_activate_ignoring_other_apps(&mut self, ignore: bool) -> &mut Self {
self.inner.with_activate_ignoring_other_apps(ignore);
self
}
fn with_activation_policy(&mut self, activation_policy: ActivationPolicy) -> &mut Self {
self.inner.with_activation_policy(activation_policy);
self
}
fn with_default_menu(&mut self, enable: bool) -> &mut Self {
self.inner.with_default_menu(enable);
self
}
}
#[derive(Default)]
pub(crate) struct PlatformSpecific {
movable_by_window_background: Option<bool>,
titlebar_transparent: Option<bool>,
title_hidden: Option<bool>,
titlebar_hidden: Option<bool>,
titlebar_buttons_hidden: Option<bool>,
fullsize_content_view: Option<bool>,
disallow_hidpi: Option<bool>,
has_shadow: Option<bool>,
accepts_first_mouse: Option<bool>,
option_as_alt: Option<OptionAsAlt>,
}
impl PlatformSpecific {
pub(crate) fn apply_to(
self,
mut wb: winit::window::WindowBuilder,
) -> winit::window::WindowBuilder {
use winit::platform::macos::WindowBuilderExtMacOS as _;
if let Some(movable_by_window_background) = self.movable_by_window_background {
wb = wb.with_movable_by_window_background(movable_by_window_background);
}
if let Some(titlebar_transparent) = self.titlebar_transparent {
wb = wb.with_titlebar_transparent(titlebar_transparent);
}
if let Some(title_hidden) = self.title_hidden {
wb = wb.with_title_hidden(title_hidden);
}
if let Some(titlebar_hidden) = self.titlebar_hidden {
wb = wb.with_titlebar_hidden(titlebar_hidden);
}
if let Some(titlebar_buttons_hidden) = self.titlebar_buttons_hidden {
wb = wb.with_titlebar_buttons_hidden(titlebar_buttons_hidden);
}
if let Some(fullsize_content_view) = self.fullsize_content_view {
wb = wb.with_fullsize_content_view(fullsize_content_view);
}
if let Some(disallow_hidpi) = self.disallow_hidpi {
wb = wb.with_disallow_hidpi(disallow_hidpi);
}
if let Some(has_shadow) = self.has_shadow {
wb = wb.with_has_shadow(has_shadow);
}
if let Some(accepts_first_mouse) = self.accepts_first_mouse {
wb = wb.with_accepts_first_mouse(accepts_first_mouse);
}
if let Some(option_as_alt) = self.option_as_alt {
wb = wb.with_option_as_alt(option_as_alt);
}
wb
}
}