ferroui_native/
ferro_native_platform_extensions.rs1#[cfg(target_os = "macos")]
5use ferroui_base::{FerroLocator, LocatorExtensions};
6#[cfg(target_os = "macos")]
7use ferroui_controls::AppBuilder;
8
9#[cfg(target_os = "macos")]
11pub trait FerroNativePlatformExtensions {
12 fn use_ferro_native(&self) -> AppBuilder;
19}
20
21#[cfg(target_os = "macos")]
22impl FerroNativePlatformExtensions for AppBuilder {
23 fn use_ferro_native(&self) -> AppBuilder {
24 let builder = self.clone();
25 self.use_standard_runtime_platform_subsystem().use_windowing_subsystem(
26 move || {
27 let options = FerroLocator::current().get_service::<FerroNativePlatformOptions>();
28 let platform =
29 crate::FerroNativePlatform::initialize(options.as_deref().cloned().unwrap_or_default());
30
31 builder.after_setup(move |_| {
32 platform.setup_application_name();
33 platform.setup_application_menu_exporter();
34 platform.setup_application_dock_menu_exporter();
35 });
36 },
37 "FerroNative",
38 );
39
40 self.clone()
41 }
42}
43
44#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
46#[repr(i32)]
47pub enum FerroNativeRenderingMode {
48 OpenGl = 1,
50 Software = 2,
52 Metal = 3,
54}
55
56#[derive(Clone, Debug, PartialEq, Eq)]
58pub struct FerroNativePlatformOptions {
59 pub rendering_mode: Vec<FerroNativeRenderingMode>,
69
70 pub overlay_popups: bool,
73
74 pub ferro_native_library_path: Option<String>,
78
79 pub app_sandbox_enabled: bool,
84}
85
86impl Default for FerroNativePlatformOptions {
87 fn default() -> Self {
88 Self {
89 rendering_mode: vec![
90 FerroNativeRenderingMode::Metal,
91 FerroNativeRenderingMode::OpenGl,
92 FerroNativeRenderingMode::Software,
93 ],
94 overlay_popups: false,
95 ferro_native_library_path: None,
96 app_sandbox_enabled: true,
97 }
98 }
99}
100
101#[derive(Clone, Debug, PartialEq, Eq)]
103pub struct MacOSPlatformOptions {
104 pub show_in_dock: bool,
107
108 pub disable_default_application_menu_items: bool,
112
113 pub disable_native_menus: bool,
116
117 pub disable_set_process_name: bool,
120
121 pub disable_ferro_app_delegate: bool,
125}
126
127impl Default for MacOSPlatformOptions {
128 fn default() -> Self {
129 Self {
130 show_in_dock: true,
131 disable_default_application_menu_items: false,
132 disable_native_menus: false,
133 disable_set_process_name: false,
134 disable_ferro_app_delegate: false,
135 }
136 }
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142
143 #[test]
144 fn defaults_match_the_reference_defaults() {
145 let options = FerroNativePlatformOptions::default();
146 assert_eq!(
147 options.rendering_mode,
148 [FerroNativeRenderingMode::Metal, FerroNativeRenderingMode::OpenGl, FerroNativeRenderingMode::Software]
149 );
150 assert!(!options.overlay_popups);
151 assert_eq!(options.ferro_native_library_path, None);
152 assert!(options.app_sandbox_enabled);
153
154 let mac = MacOSPlatformOptions::default();
155 assert!(mac.show_in_dock);
156 assert!(!mac.disable_default_application_menu_items);
157 assert!(!mac.disable_native_menus);
158 assert!(!mac.disable_set_process_name);
159 assert!(!mac.disable_ferro_app_delegate);
160
161 assert_eq!(FerroNativeRenderingMode::OpenGl as i32, 1);
162 assert_eq!(FerroNativeRenderingMode::Software as i32, 2);
163 assert_eq!(FerroNativeRenderingMode::Metal as i32, 3);
164 }
165}