use std::os::raw::c_void;
use crate::event_loop::{ActiveEventLoop, EventLoopBuilder};
use crate::monitor::MonitorHandle;
use crate::window::{Window, WindowAttributes};
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Colorspace {
Srgb,
DisplayP3,
Rec2020,
}
pub trait WindowExtMacOS {
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 set_background_color(&self, _r: f64, _g: f64, _b: f64, _a: f64);
fn set_tabbing_identifier(&self, identifier: &str);
fn tabbing_identifier(&self) -> String;
fn select_next_tab(&self);
fn select_previous_tab(&self);
fn select_tab_at_index(&self, index: usize);
fn num_tabs(&self) -> usize;
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;
fn set_unified_titlebar(&self, unified_titlebar: bool);
fn unified_titlebar(&self) -> bool;
fn set_colorspace(&self, colorspace: Colorspace);
fn set_traffic_light_position(&self, position: Option<(f64, f64)>);
}
impl WindowExtMacOS for Window {
#[inline]
fn simple_fullscreen(&self) -> bool {
self.window.maybe_wait_on_main(|w| w.simple_fullscreen())
}
#[inline]
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
self.window
.maybe_wait_on_main(move |w| w.set_simple_fullscreen(fullscreen))
}
#[inline]
fn has_shadow(&self) -> bool {
self.window.maybe_wait_on_main(|w| w.has_shadow())
}
#[inline]
fn set_has_shadow(&self, has_shadow: bool) {
self.window
.maybe_queue_on_main(move |w| w.set_has_shadow(has_shadow))
}
#[inline]
fn set_background_color(&self, r: f64, g: f64, b: f64, a: f64) {
self.window
.maybe_queue_on_main(move |w| w.set_background_color(r, g, b, a))
}
#[inline]
fn set_tabbing_identifier(&self, identifier: &str) {
self.window
.maybe_wait_on_main(|w| w.set_tabbing_identifier(identifier))
}
#[inline]
fn tabbing_identifier(&self) -> String {
self.window.maybe_wait_on_main(|w| w.tabbing_identifier())
}
#[inline]
fn select_next_tab(&self) {
self.window.maybe_queue_on_main(|w| w.select_next_tab())
}
#[inline]
fn select_previous_tab(&self) {
self.window.maybe_queue_on_main(|w| w.select_previous_tab())
}
#[inline]
fn select_tab_at_index(&self, index: usize) {
self.window
.maybe_queue_on_main(move |w| w.select_tab_at_index(index))
}
#[inline]
fn num_tabs(&self) -> usize {
self.window.maybe_wait_on_main(|w| w.num_tabs())
}
#[inline]
fn is_document_edited(&self) -> bool {
self.window.maybe_wait_on_main(|w| w.is_document_edited())
}
#[inline]
fn set_document_edited(&self, edited: bool) {
self.window
.maybe_queue_on_main(move |w| w.set_document_edited(edited))
}
#[inline]
fn set_option_as_alt(&self, option_as_alt: OptionAsAlt) {
self.window
.maybe_queue_on_main(move |w| w.set_option_as_alt(option_as_alt))
}
#[inline]
fn option_as_alt(&self) -> OptionAsAlt {
self.window.maybe_wait_on_main(|w| w.option_as_alt())
}
#[inline]
fn set_unified_titlebar(&self, unified_titlebar: bool) {
self.window
.maybe_wait_on_main(|w| w.set_unified_titlebar(unified_titlebar))
}
#[inline]
fn unified_titlebar(&self) -> bool {
self.window.maybe_wait_on_main(|w| w.unified_titlebar())
}
#[inline]
fn set_colorspace(&self, colorspace: Colorspace) {
self.window
.maybe_queue_on_main(move |w| w.set_colorspace(colorspace))
}
#[inline]
fn set_traffic_light_position(&self, position: Option<(f64, f64)>) {
self.window
.maybe_queue_on_main(move |w| w.set_traffic_light_position(position))
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ActivationPolicy {
#[default]
Regular,
Accessory,
Prohibited,
}
pub trait WindowAttributesExtMacOS {
fn with_movable_by_window_background(
self,
movable_by_window_background: bool,
) -> Self;
fn with_titlebar_transparent(self, titlebar_transparent: bool) -> Self;
fn with_title_hidden(self, title_hidden: bool) -> Self;
fn with_titlebar_hidden(self, titlebar_hidden: bool) -> Self;
fn with_titlebar_buttons_hidden(self, titlebar_buttons_hidden: bool) -> Self;
fn with_fullsize_content_view(self, fullsize_content_view: bool) -> Self;
fn with_disallow_hidpi(self, disallow_hidpi: bool) -> Self;
fn with_has_shadow(self, has_shadow: bool) -> Self;
fn with_accepts_first_mouse(self, accepts_first_mouse: bool) -> Self;
fn with_tabbing_identifier(self, identifier: &str) -> Self;
fn with_option_as_alt(self, option_as_alt: OptionAsAlt) -> Self;
fn with_unified_titlebar(self, unified_titlebar: bool) -> Self;
fn with_colorspace(self, colorspace: Colorspace) -> Self;
fn with_traffic_light_position(self, x: f64, y: f64) -> Self;
}
impl WindowAttributesExtMacOS for WindowAttributes {
#[inline]
fn with_movable_by_window_background(
mut self,
movable_by_window_background: bool,
) -> Self {
self.platform_specific.movable_by_window_background =
movable_by_window_background;
self
}
#[inline]
fn with_titlebar_transparent(mut self, titlebar_transparent: bool) -> Self {
self.platform_specific.titlebar_transparent = titlebar_transparent;
self
}
#[inline]
fn with_titlebar_hidden(mut self, titlebar_hidden: bool) -> Self {
self.platform_specific.titlebar_hidden = titlebar_hidden;
self
}
#[inline]
fn with_titlebar_buttons_hidden(mut self, titlebar_buttons_hidden: bool) -> Self {
self.platform_specific.titlebar_buttons_hidden = titlebar_buttons_hidden;
self
}
#[inline]
fn with_title_hidden(mut self, title_hidden: bool) -> Self {
self.platform_specific.title_hidden = title_hidden;
self
}
#[inline]
fn with_fullsize_content_view(mut self, fullsize_content_view: bool) -> Self {
self.platform_specific.fullsize_content_view = fullsize_content_view;
self
}
#[inline]
fn with_disallow_hidpi(mut self, disallow_hidpi: bool) -> Self {
self.platform_specific.disallow_hidpi = disallow_hidpi;
self
}
#[inline]
fn with_has_shadow(mut self, has_shadow: bool) -> Self {
self.platform_specific.has_shadow = has_shadow;
self
}
#[inline]
fn with_accepts_first_mouse(mut self, accepts_first_mouse: bool) -> Self {
self.platform_specific.accepts_first_mouse = accepts_first_mouse;
self
}
#[inline]
fn with_tabbing_identifier(mut self, tabbing_identifier: &str) -> Self {
self.platform_specific
.tabbing_identifier
.replace(tabbing_identifier.to_string());
self
}
#[inline]
fn with_option_as_alt(mut self, option_as_alt: OptionAsAlt) -> Self {
self.platform_specific.option_as_alt = option_as_alt;
self
}
#[inline]
fn with_unified_titlebar(mut self, unified_titlebar: bool) -> Self {
self.platform_specific.unified_titlebar = unified_titlebar;
self
}
#[inline]
fn with_colorspace(mut self, colorspace: Colorspace) -> Self {
self.platform_specific.colorspace = Some(colorspace);
self
}
#[inline]
fn with_traffic_light_position(mut self, x: f64, y: f64) -> Self {
self.platform_specific.traffic_light_position = Some((x, y));
self
}
}
pub trait EventLoopBuilderExtMacOS {
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<T> EventLoopBuilderExtMacOS for EventLoopBuilder<T> {
#[inline]
fn with_activation_policy(
&mut self,
activation_policy: ActivationPolicy,
) -> &mut Self {
self.platform_specific.activation_policy = activation_policy;
self
}
#[inline]
fn with_default_menu(&mut self, enable: bool) -> &mut Self {
self.platform_specific.default_menu = enable;
self
}
#[inline]
fn with_activate_ignoring_other_apps(&mut self, ignore: bool) -> &mut Self {
self.platform_specific.activate_ignoring_other_apps = ignore;
self
}
}
pub trait MonitorHandleExtMacOS {
fn native_id(&self) -> u32;
fn ns_screen(&self) -> Option<*mut c_void>;
}
impl MonitorHandleExtMacOS for MonitorHandle {
#[inline]
fn native_id(&self) -> u32 {
self.inner.native_identifier()
}
fn ns_screen(&self) -> Option<*mut c_void> {
let mtm = unsafe { objc2_foundation::MainThreadMarker::new_unchecked() };
self.inner
.ns_screen(mtm)
.map(|s| objc2::rc::Retained::as_ptr(&s) as _)
}
}
pub trait ActiveEventLoopExtMacOS {
fn hide_application(&self);
fn hide_other_applications(&self);
fn set_allows_automatic_window_tabbing(&self, enabled: bool);
fn allows_automatic_window_tabbing(&self) -> bool;
}
impl ActiveEventLoopExtMacOS for ActiveEventLoop {
fn hide_application(&self) {
self.p.hide_application()
}
fn hide_other_applications(&self) {
self.p.hide_other_applications()
}
fn set_allows_automatic_window_tabbing(&self, enabled: bool) {
self.p.set_allows_automatic_window_tabbing(enabled);
}
fn allows_automatic_window_tabbing(&self) -> bool {
self.p.allows_automatic_window_tabbing()
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum OptionAsAlt {
OnlyLeft,
OnlyRight,
Both,
#[default]
None,
}