v2 / vlib / macos / macos_darwin.c.v
293 lines · 245 sloc · 8.53 KB · dc2f77557344cdeb714728c87c783bcf6f1b69ad
Raw
1module macos
2
3#flag darwin -framework Foundation
4#flag darwin -lobjc
5#insert "@VEXEROOT/vlib/macos/objc_bridge.h"
6
7pub type Id = voidptr
8pub type Sel = voidptr
9pub type Class = voidptr
10pub type Protocol = voidptr
11pub type Rect = C.macos_rect
12
13pub struct C.macos_rect {
14pub mut:
15 x f64
16 y f64
17 width f64
18 height f64
19}
20
21pub const assoc_assign = usize(0)
22pub const assoc_retain_nonatomic = usize(1)
23pub const assoc_copy_nonatomic = usize(3)
24pub const assoc_retain = usize(0o1401)
25pub const assoc_copy = usize(0o1403)
26pub const run_loop_default_mode = 'kCFRunLoopDefaultMode'
27
28fn C.macos_objc_msg_id0(obj Id, selector Sel) Id
29fn C.macos_objc_msg_id1(obj Id, selector Sel, a0 voidptr) Id
30fn C.macos_objc_msg_id2(obj Id, selector Sel, a0 voidptr, a1 voidptr) Id
31fn C.macos_objc_msg_id3(obj Id, selector Sel, a0 voidptr, a1 voidptr, a2 voidptr) Id
32fn C.macos_objc_msg_id4(obj Id, selector Sel, a0 voidptr, a1 voidptr, a2 voidptr, a3 voidptr) Id
33fn C.macos_objc_msg_id_rect(obj Id, selector Sel, rect Rect) Id
34fn C.macos_objc_msg_id_rect_bool(obj Id, selector Sel, rect Rect, a1 bool) Id
35fn C.macos_objc_msg_id_rect_obj(obj Id, selector Sel, rect Rect, a1 voidptr) Id
36fn C.macos_objc_msg_id_rect_u64_u64_bool(obj Id, selector Sel, rect Rect, a1 u64, a2 u64, a3 bool) Id
37fn C.macos_objc_msg_id_obj_u64_bool(obj Id, selector Sel, a0 voidptr, a1 u64, a2 bool) Id
38fn C.macos_objc_msg_id_obj_sel_obj(obj Id, selector Sel, a0 voidptr, a1 voidptr, a2 voidptr) Id
39fn C.macos_objc_msg_id_f64(obj Id, selector Sel, a0 f64) Id
40fn C.macos_objc_msg_id_u64(obj Id, selector Sel, a0 u64) Id
41fn C.macos_objc_msg_void0(obj Id, selector Sel)
42fn C.macos_objc_msg_void1(obj Id, selector Sel, a0 voidptr)
43fn C.macos_objc_msg_void2(obj Id, selector Sel, a0 voidptr, a1 voidptr)
44fn C.macos_objc_msg_void3(obj Id, selector Sel, a0 voidptr, a1 voidptr, a2 voidptr)
45fn C.macos_objc_msg_void_bool(obj Id, selector Sel, a0 bool)
46fn C.macos_objc_msg_void_i64(obj Id, selector Sel, a0 i64)
47fn C.macos_objc_msg_void_u64(obj Id, selector Sel, a0 u64)
48fn C.macos_objc_msg_void_f64(obj Id, selector Sel, a0 f64)
49fn C.macos_objc_msg_void_rect(obj Id, selector Sel, rect Rect)
50fn C.macos_objc_msg_void_rect_bool_bool(obj Id, selector Sel, rect Rect, a1 bool, a2 bool)
51fn C.macos_objc_msg_bool0(obj Id, selector Sel) bool
52fn C.macos_objc_msg_bool1(obj Id, selector Sel, a0 voidptr) bool
53fn C.macos_objc_msg_i64(obj Id, selector Sel) i64
54fn C.macos_objc_msg_u64(obj Id, selector Sel) u64
55fn C.macos_objc_msg_f64(obj Id, selector Sel) f64
56fn C.macos_objc_msg_rect(obj Id, selector Sel) Rect
57fn C.macos_objc_get_class(name &char) Class
58fn C.macos_sel_register_name(name &char) Sel
59fn C.macos_objc_allocate_class_pair(superclass Class, name &char, extra_bytes usize) Class
60fn C.macos_objc_register_class_pair(cls Class)
61fn C.macos_class_add_method(cls Class, name Sel, imp voidptr, types &char) bool
62fn C.macos_class_add_ivar(cls Class, name &char, size usize, alignment u8, types &char) bool
63fn C.macos_objc_get_protocol(name &char) Protocol
64fn C.macos_class_add_protocol(cls Class, protocol Protocol) bool
65fn C.macos_objc_set_ptr_ivar(obj Id, name &char, value voidptr)
66fn C.macos_objc_get_ptr_ivar(obj Id, name &char) voidptr
67fn C.macos_set_associated_object(obj Id, key voidptr, value Id, policy usize)
68fn C.macos_get_associated_object(obj Id, key voidptr) Id
69
70@[inline]
71pub fn get_class(name string) Id {
72 return Id(C.macos_objc_get_class(&char(name.str)))
73}
74
75@[inline]
76pub fn get_protocol(name string) Protocol {
77 return C.macos_objc_get_protocol(&char(name.str))
78}
79
80@[inline]
81pub fn sel(name string) Sel {
82 return C.macos_sel_register_name(&char(name.str))
83}
84
85@[inline]
86pub fn rect(x f64, y f64, width f64, height f64) Rect {
87 return C.macos_rect{
88 x: x
89 y: y
90 width: width
91 height: height
92 }
93}
94
95@[inline]
96pub fn msg_id(obj Id, selector string) Id {
97 return C.macos_objc_msg_id0(obj, sel(selector))
98}
99
100@[inline]
101pub fn msg_void(obj Id, selector string) {
102 C.macos_objc_msg_void0(obj, sel(selector))
103}
104
105@[inline]
106pub fn msg_bool(obj Id, selector string) bool {
107 return C.macos_objc_msg_bool0(obj, sel(selector))
108}
109
110@[inline]
111pub fn msg_i64(obj Id, selector string) i64 {
112 return C.macos_objc_msg_i64(obj, sel(selector))
113}
114
115@[inline]
116pub fn msg_u64(obj Id, selector string) u64 {
117 return C.macos_objc_msg_u64(obj, sel(selector))
118}
119
120@[inline]
121pub fn msg_f64(obj Id, selector string) f64 {
122 return C.macos_objc_msg_f64(obj, sel(selector))
123}
124
125@[inline]
126pub fn msg_rect(obj Id, selector string) Rect {
127 return C.macos_objc_msg_rect(obj, sel(selector))
128}
129
130// ── Multi-argument message sending ─────────────────────────────────
131
132@[inline]
133pub fn msg_id1(obj Id, selector string, a0 Id) Id {
134 return C.macos_objc_msg_id1(obj, sel(selector), a0)
135}
136
137@[inline]
138pub fn msg_id2(obj Id, selector string, a0 Id, a1 Id) Id {
139 return C.macos_objc_msg_id2(obj, sel(selector), a0, a1)
140}
141
142@[inline]
143pub fn msg_id3(obj Id, selector string, a0 Id, a1 Id, a2 Id) Id {
144 return C.macos_objc_msg_id3(obj, sel(selector), a0, a1, a2)
145}
146
147@[inline]
148pub fn msg_id4(obj Id, selector string, a0 Id, a1 Id, a2 Id, a3 Id) Id {
149 return C.macos_objc_msg_id4(obj, sel(selector), a0, a1, a2, a3)
150}
151
152@[inline]
153pub fn msg_id_rect(obj Id, selector string, r Rect) Id {
154 return C.macos_objc_msg_id_rect(obj, sel(selector), r)
155}
156
157@[inline]
158pub fn msg_id_f64(obj Id, selector string, a0 f64) Id {
159 return C.macos_objc_msg_id_f64(obj, sel(selector), a0)
160}
161
162@[inline]
163pub fn msg_id_u64(obj Id, selector string, a0 u64) Id {
164 return C.macos_objc_msg_id_u64(obj, sel(selector), a0)
165}
166
167@[inline]
168pub fn msg_void1(obj Id, selector string, a0 Id) {
169 C.macos_objc_msg_void1(obj, sel(selector), a0)
170}
171
172@[inline]
173pub fn msg_void2(obj Id, selector string, a0 Id, a1 Id) {
174 C.macos_objc_msg_void2(obj, sel(selector), a0, a1)
175}
176
177@[inline]
178pub fn msg_void3(obj Id, selector string, a0 Id, a1 Id, a2 Id) {
179 C.macos_objc_msg_void3(obj, sel(selector), a0, a1, a2)
180}
181
182@[inline]
183pub fn msg_void_bool(obj Id, selector string, a0 bool) {
184 C.macos_objc_msg_void_bool(obj, sel(selector), a0)
185}
186
187@[inline]
188pub fn msg_void_i64(obj Id, selector string, a0 i64) {
189 C.macos_objc_msg_void_i64(obj, sel(selector), a0)
190}
191
192@[inline]
193pub fn msg_void_u64(obj Id, selector string, a0 u64) {
194 C.macos_objc_msg_void_u64(obj, sel(selector), a0)
195}
196
197@[inline]
198pub fn msg_void_f64(obj Id, selector string, a0 f64) {
199 C.macos_objc_msg_void_f64(obj, sel(selector), a0)
200}
201
202@[inline]
203pub fn msg_void_rect(obj Id, selector string, r Rect) {
204 C.macos_objc_msg_void_rect(obj, sel(selector), r)
205}
206
207// ── Runtime class helpers ──────────────────────────────────────────
208
209@[inline]
210pub fn allocate_class_pair(superclass Id, name string) Id {
211 return C.macos_objc_allocate_class_pair(superclass, &char(name.str), 0)
212}
213
214@[inline]
215pub fn register_class_pair(cls Id) {
216 C.macos_objc_register_class_pair(cls)
217}
218
219@[inline]
220pub fn add_method(cls Id, sel_name string, imp voidptr, types string) bool {
221 return C.macos_class_add_method(cls, sel(sel_name), imp, &char(types.str))
222}
223
224@[inline]
225pub fn add_protocol(cls Id, proto Protocol) bool {
226 return C.macos_class_add_protocol(cls, proto)
227}
228
229// ── Allocation ─────────────────────────────────────────────────────
230
231@[inline]
232pub fn alloc(class_name string) Id {
233 return msg_id(get_class(class_name), 'alloc')
234}
235
236@[inline]
237pub fn new(class_name string) Id {
238 return msg_id(get_class(class_name), 'new')
239}
240
241@[inline]
242pub fn nsstring(s string) Id {
243 return C.macos_objc_msg_id1(get_class('NSString'), sel('stringWithUTF8String:'), &char(s.str))
244}
245
246pub fn utf8_string(obj Id) string {
247 if obj == unsafe { nil } {
248 return ''
249 }
250 cstr := &char(C.macos_objc_msg_id0(obj, sel('UTF8String')))
251 if cstr == unsafe { nil } {
252 return ''
253 }
254 return unsafe { cstr.vstring().clone() }
255}
256
257pub fn description_string(obj Id) string {
258 if obj == unsafe { nil } {
259 return ''
260 }
261 return utf8_string(C.macos_objc_msg_id0(obj, sel('description')))
262}
263
264@[inline]
265pub fn retain(obj Id) Id {
266 if obj == unsafe { nil } {
267 return unsafe { nil }
268 }
269 return C.macos_objc_msg_id0(obj, sel('retain'))
270}
271
272@[inline]
273pub fn release(obj Id) {
274 if obj == unsafe { nil } {
275 return
276 }
277 C.macos_objc_msg_void0(obj, sel('release'))
278}
279
280@[inline]
281pub fn autorelease_pool_new() Id {
282 return new('NSAutoreleasePool')
283}
284
285@[inline]
286pub fn set_associated_object(obj Id, key voidptr, value Id, policy usize) {
287 C.macos_set_associated_object(obj, key, value, policy)
288}
289
290@[inline]
291pub fn get_associated_object(obj Id, key voidptr) Id {
292 return C.macos_get_associated_object(obj, key)
293}
294