mod dispatcher;
mod display;
mod events;
pub mod ffi;
mod platform;
mod text_input;
mod window;
#[cfg(feature = "font-kit")]
mod text_system;
use gpui::{px, size, DevicePixels, Pixels, Size};
use objc::runtime::{BOOL, NO, YES};
use std::ops::Range;
pub(crate) use dispatcher::*;
pub(crate) use display::*;
pub use platform::*;
pub(crate) use window::*;
#[cfg(feature = "font-kit")]
pub(crate) use text_system::*;
pub(crate) type PlatformScreenCaptureFrame = ();
pub fn current_platform(_headless: bool) -> std::rc::Rc<dyn gpui::Platform> {
std::rc::Rc::new(IosPlatform::new())
}
trait BoolExt {
fn to_objc(self) -> BOOL;
}
impl BoolExt for bool {
fn to_objc(self) -> BOOL {
if self {
YES
} else {
NO
}
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
struct NSRange {
pub location: usize,
pub length: usize,
}
impl NSRange {
fn invalid() -> Self {
Self {
location: usize::MAX,
length: 0,
}
}
fn is_valid(&self) -> bool {
self.location != usize::MAX
}
fn to_range(self) -> Option<Range<usize>> {
if self.is_valid() {
let start = self.location;
let end = start + self.length;
Some(start..end)
} else {
None
}
}
}
impl From<Range<usize>> for NSRange {
fn from(range: Range<usize>) -> Self {
NSRange {
location: range.start,
length: range.len(),
}
}
}
unsafe impl objc::Encode for NSRange {
fn encode() -> objc::Encoding {
let encoding = format!(
"{{NSRange={}{}}}",
usize::encode().as_str(),
usize::encode().as_str()
);
unsafe { objc::Encoding::from_str(&encoding) }
}
}
pub(crate) fn cgsize_to_size_pixels(value: core_graphics::geometry::CGSize) -> Size<Pixels> {
Size {
width: px(value.width as f32),
height: px(value.height as f32),
}
}
pub(crate) fn cgrect_to_size_pixels(rect: core_graphics::geometry::CGRect) -> Size<Pixels> {
let core_graphics::geometry::CGSize { width, height } = rect.size;
size(px(width as f32), px(height as f32))
}
pub(crate) fn cgrect_to_size_device_pixels(
rect: core_graphics::geometry::CGRect,
) -> Size<DevicePixels> {
let core_graphics::geometry::CGSize { width, height } = rect.size;
size(DevicePixels(width as i32), DevicePixels(height as i32))
}