1#![doc = include_str!("README.md")]
7#![doc(html_logo_url = "https://slint.dev/logo/slint-logo-square-light.svg")]
8#![cfg_attr(docsrs, feature(doc_cfg))]
9#![deny(unsafe_code)]
10#![allow(clippy::missing_safety_doc)] #![cfg_attr(slint_nightly_test, feature(non_exhaustive_omitted_patterns_lint))]
12#![cfg_attr(slint_nightly_test, warn(non_exhaustive_omitted_patterns))]
13#![no_std]
14#![debugger_visualizer(gdb_script_file = "gdb_pretty_printers.py")]
15
16extern crate alloc;
17#[cfg(feature = "std")]
18extern crate std;
19
20#[cfg(all(not(feature = "std"), feature = "unsafe-single-threaded"))]
21pub mod unsafe_single_threaded;
22#[cfg(all(not(feature = "std"), not(feature = "unsafe-single-threaded")))]
23compile_error!(
24 "At least one of the following feature need to be enabled: `std` or `unsafe-single-threaded`"
25);
26pub use crate::items::OperatingSystemType;
27#[cfg(all(not(feature = "std"), feature = "unsafe-single-threaded"))]
28pub use crate::unsafe_single_threaded::thread_local;
29#[cfg(feature = "std")]
30pub use std::thread_local;
31
32pub mod accessibility;
33pub mod animations;
34pub mod api;
35pub mod callbacks;
36pub mod component_factory;
37pub mod context;
38pub mod data_transfer;
39pub mod date_time;
40pub mod debug_log;
41pub mod future;
42pub mod graphics;
43pub mod input;
44pub mod item_focus;
45pub mod item_rendering;
46pub mod item_tree;
47pub mod items;
48pub mod layout;
49pub mod lengths;
50pub mod menus;
51pub mod model;
52pub mod partial_renderer;
53pub mod platform;
54pub mod properties;
55pub mod renderer;
56#[cfg(feature = "rtti")]
57pub mod rtti;
58pub mod sharedvector;
59pub mod slice;
60pub mod string;
61pub mod styled_text;
62pub mod textlayout;
63pub mod timers;
64pub mod translations;
65pub mod window;
66
67#[doc(inline)]
68pub use string::SharedString;
69
70#[doc(inline)]
71pub use sharedvector::SharedVector;
72
73#[doc(inline)]
74pub use graphics::{ImageInner, StaticTextures};
75
76#[doc(inline)]
77pub use properties::Property;
78
79#[doc(inline)]
80pub use callbacks::Callback;
81
82#[doc(inline)]
83pub use graphics::Color;
84
85#[doc(inline)]
86pub use graphics::Brush;
87
88#[doc(inline)]
89pub use graphics::RgbaColor;
90
91#[cfg(feature = "std")]
92#[doc(inline)]
93pub use graphics::PathData;
94
95#[doc(inline)]
96pub use graphics::BorderRadius;
97
98#[doc(inline)]
99pub use data_transfer::DataTransfer;
100
101pub use context::{SlintContext, SlintContextWeak, with_global_context};
102
103#[cfg(not(slint_int_coord))]
104pub type Coord = f32;
105#[cfg(slint_int_coord)]
106pub type Coord = i32;
107
108#[derive(Debug, Clone, Copy, PartialEq, Eq)]
111pub struct InternalToken;
112
113#[cfg(feature = "std")]
114thread_local!(
115 pub static OPERATING_SYSTEM_OVERRIDE: core::cell::Cell<Option<OperatingSystemType>> =
117 Default::default();
118);
119
120#[cfg(not(target_family = "wasm"))]
121pub fn detect_operating_system() -> OperatingSystemType {
122 #[cfg(feature = "std")]
123 if let Some(os_override) = OPERATING_SYSTEM_OVERRIDE.with(|os_override| os_override.get()) {
124 return os_override;
125 }
126
127 if cfg!(target_os = "android") {
128 OperatingSystemType::Android
129 } else if cfg!(target_os = "ios") {
130 OperatingSystemType::Ios
131 } else if cfg!(target_os = "macos") {
132 OperatingSystemType::Macos
133 } else if cfg!(target_os = "windows") {
134 OperatingSystemType::Windows
135 } else if cfg!(target_os = "linux") {
136 OperatingSystemType::Linux
137 } else {
138 OperatingSystemType::Other
139 }
140}
141
142#[cfg(target_family = "wasm")]
143pub fn detect_operating_system() -> OperatingSystemType {
144 if let Some(os_override) = OPERATING_SYSTEM_OVERRIDE.with(|os_override| os_override.get()) {
145 return os_override;
146 }
147
148 static DETECTED: std::sync::LazyLock<OperatingSystemType> = std::sync::LazyLock::new(|| {
151 let mut user_agent =
152 web_sys::window().and_then(|w| w.navigator().user_agent().ok()).unwrap_or_default();
153 user_agent.make_ascii_lowercase();
154 let mut platform =
155 web_sys::window().and_then(|w| w.navigator().platform().ok()).unwrap_or_default();
156 platform.make_ascii_lowercase();
157
158 if user_agent.contains("ipad") || user_agent.contains("iphone") {
159 OperatingSystemType::Ios
160 } else if user_agent.contains("android") {
161 OperatingSystemType::Android
162 } else if platform.starts_with("mac") {
163 OperatingSystemType::Macos
164 } else if platform.starts_with("win") {
165 OperatingSystemType::Windows
166 } else if platform.starts_with("linux") {
167 OperatingSystemType::Linux
168 } else {
169 OperatingSystemType::Other
170 }
171 });
172 *DETECTED
173}
174
175pub fn is_apple_platform() -> bool {
177 matches!(detect_operating_system(), OperatingSystemType::Macos | OperatingSystemType::Ios)
178}
179
180pub fn open_url(url: &str, window: &crate::api::Window) -> Result<(), crate::api::PlatformError> {
181 crate::window::WindowInner::from_pub(window).context().platform().open_url(url)
182}
183
184#[cfg(target_os = "macos")]
185pub fn macos_bring_all_windows_to_front() {
186 use objc2::MainThreadMarker;
187 use objc2_app_kit::NSApplication;
188 let Some(mtm) = MainThreadMarker::new() else { return };
189 NSApplication::sharedApplication(mtm).arrangeInFront(None);
190}
191
192#[cfg(not(target_os = "macos"))]
193pub fn macos_bring_all_windows_to_front() {}