xgpui-macos 5.0.0

macOS windowing and input backend for xgpui
Documentation
use crate::NSStringExt;
use gpui::WindowAppearance;
use objc2::{msg_send, rc::Retained, runtime::AnyObject};
use objc2_app_kit::{NSAppearance, NSAppearanceNameVibrantDark, NSAppearanceNameVibrantLight};
use objc2_foundation::NSString;

pub(crate) fn window_appearance_from_native(appearance: Option<&NSAppearance>) -> WindowAppearance {
    let Some(appearance) = appearance else {
        return WindowAppearance::Light;
    };
    unsafe {
        let name: Option<Retained<NSString>> = msg_send![appearance, name];
        let Some(name) = name else {
            return WindowAppearance::Light;
        };
        let name_ptr = Retained::as_ptr(&name).cast::<AnyObject>();
        if name_ptr == std::ptr::from_ref(NSAppearanceNameVibrantLight).cast() {
            WindowAppearance::VibrantLight
        } else if name_ptr == std::ptr::from_ref(NSAppearanceNameVibrantDark).cast() {
            WindowAppearance::VibrantDark
        } else if name_ptr == NSAppearanceNameAqua {
            WindowAppearance::Light
        } else if name_ptr == NSAppearanceNameDarkAqua {
            WindowAppearance::Dark
        } else {
            println!("unknown appearance: {:?}", name_ptr.cast_mut().to_str());
            WindowAppearance::Light
        }
    }
}

#[link(name = "AppKit", kind = "framework")]
unsafe extern "C" {
    pub static NSAppearanceNameAqua: *mut AnyObject;
    pub static NSAppearanceNameDarkAqua: *mut AnyObject;
}