use crate::compat::String;
use crate::compat::Vec;
use cocoa::base::{id, nil, BOOL, NO};
use objc::{class, msg_send, sel, sel_impl};
use std::ffi::{c_char, CStr};
unsafe fn workspace_implements(selector: objc::runtime::Sel) -> Option<id> {
let workspace: id = msg_send![class!(NSWorkspace), sharedWorkspace];
if workspace == nil {
return None;
}
let responds: BOOL = msg_send![workspace, respondsToSelector: selector];
(responds != NO).then_some(workspace)
}
pub(crate) fn high_contrast() -> Option<bool> {
if !super::types::is_main_thread() {
return None;
}
unsafe {
let workspace = workspace_implements(sel!(accessibilityDisplayShouldIncreaseContrast))?;
let answer: BOOL = msg_send![workspace, accessibilityDisplayShouldIncreaseContrast];
Some(answer != NO)
}
}
pub(crate) fn reduce_motion() -> Option<bool> {
if !super::types::is_main_thread() {
return None;
}
unsafe {
let workspace = workspace_implements(sel!(accessibilityDisplayShouldReduceMotion))?;
let answer: BOOL = msg_send![workspace, accessibilityDisplayShouldReduceMotion];
Some(answer != NO)
}
}
pub(crate) fn system_fonts() -> Vec<crate::platform::types::SystemFont> {
crate::platform::fonts_apple::system_fonts()
}
pub(crate) fn system_locale() -> Option<&'static str> {
unsafe {
let locale: id = msg_send![class!(NSLocale), currentLocale];
if locale == nil {
return None;
}
let identifier: id = msg_send![locale, localeIdentifier];
if identifier == nil {
return None;
}
let utf8: *const c_char = msg_send![identifier, UTF8String];
if utf8.is_null() {
return None;
}
let tag: String = CStr::from_ptr(utf8).to_string_lossy().into_owned();
crate::platform::locale::intern(Some(tag.replace('_', "-"))).or_else(|| {
crate::platform::locale::intern(crate::platform::locale::from_environment())
})
}
}