use {
core::ptr::NonNull,
objective_rust::{objrs, ObjcBool},
};
fn main() {
let shared = NonNull::new(NSApplication::shared()).unwrap();
let ns_app = unsafe { NSApplication::from_raw(shared) };
let window = NonNull::new(NSWindow::alloc()).unwrap();
let mut window = unsafe { NSWindow::from_raw(window) };
let mut style_mask = NSWindowStyleMask::default();
style_mask.closable().resizable().titled();
window.init(
NSRect {
origin: NSPoint { x: 0.0, y: 0.0 },
size: NSSize {
width: 600.0,
height: 400.0,
},
},
style_mask,
2,
false.into(),
);
window.make_key(std::ptr::null_mut());
ns_app.run();
unreachable!()
}
#[objrs]
mod ffi {
use super::*;
extern "objc" {
type NSApplication;
#[selector = "sharedApplication"]
fn shared() -> *mut Self;
fn run(&self);
}
extern "Objective-C" {
type NSWindow;
fn alloc() -> *mut Self;
#[selector = "initWithContentRect:styleMask:backing:defer:"]
fn init(
&mut self,
content_rect: NSRect,
style_mask: NSWindowStyleMask,
backing_store: u64,
defer: ObjcBool,
);
#[selector = "makeKeyAndOrderFront:"]
fn make_key(&mut self, sender: *mut ());
}
#[repr(objc)]
pub struct NSThing {}
#[repr(C)]
pub struct NSPoint {
pub x: f64,
pub y: f64,
}
#[repr(C)]
pub struct NSSize {
pub width: f64,
pub height: f64,
}
#[repr(C)]
pub struct NSRect {
pub origin: NSPoint,
pub size: NSSize,
}
#[derive(Default)]
#[repr(transparent)]
pub struct NSWindowStyleMask(u64);
#[allow(dead_code)] impl NSWindowStyleMask {
pub fn borderless(&mut self) -> &mut Self {
self.0 = 0;
self
}
pub fn titled(&mut self) -> &mut Self {
self.0 |= 1 << 0;
self
}
pub fn closable(&mut self) -> &mut Self {
self.0 |= 1 << 1;
self
}
pub fn miniaturizable(&mut self) -> &mut Self {
self.0 |= 1 << 2;
self
}
pub fn resizable(&mut self) -> &mut Self {
self.0 |= 1 << 3;
self
}
pub fn unified_title_and_toolbar(&mut self) -> &mut Self {
self.0 |= 1 << 12;
self
}
pub fn fullscreen(&mut self) -> &mut Self {
self.0 |= 1 << 14;
self
}
pub fn full_size_content_view(&mut self) -> &mut Self {
self.0 |= 1 << 15;
self
}
pub fn utility(&mut self) -> &mut Self {
self.0 |= 1 << 4;
self
}
pub fn doc_modal(&mut self) -> &mut Self {
self.0 |= 1 << 6;
self
}
pub fn non_activating_panel(&mut self) -> &mut Self {
self.0 |= 1 << 7;
self
}
pub fn hud_window(&mut self) -> &mut Self {
self.0 |= 1 << 13;
self
}
}
#[link(name = "AppKit", kind = "framework")]
extern "C" {}
}
use ffi::*;