bare-ui-kit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CMakeLists.txt +7 -1
  2. package/README.md +42 -1
  3. package/binding.m +558 -2
  4. package/index.d.ts +41 -0
  5. package/index.js +16 -0
  6. package/lib/activity-indicator-view.d.ts +29 -0
  7. package/lib/activity-indicator-view.h +181 -0
  8. package/lib/activity-indicator-view.js +56 -0
  9. package/lib/alert-action.d.ts +33 -0
  10. package/lib/alert-action.js +48 -0
  11. package/lib/alert-controller.d.ts +20 -0
  12. package/lib/alert-controller.h +199 -0
  13. package/lib/alert-controller.js +33 -0
  14. package/lib/attributed-string.d.ts +45 -0
  15. package/lib/attributed-string.h +176 -0
  16. package/lib/attributed-string.js +51 -0
  17. package/lib/attributes.js +34 -0
  18. package/lib/bezier-path.d.ts +26 -0
  19. package/lib/bezier-path.h +145 -0
  20. package/lib/bezier-path.js +51 -0
  21. package/lib/bridging.h +600 -2
  22. package/lib/color.d.ts +86 -0
  23. package/lib/color.h +286 -0
  24. package/lib/color.js +170 -0
  25. package/lib/events.js +35 -0
  26. package/lib/font-descriptor.d.ts +30 -0
  27. package/lib/font-descriptor.h +96 -0
  28. package/lib/font-descriptor.js +47 -0
  29. package/lib/font-metrics.d.ts +38 -0
  30. package/lib/font-metrics.h +109 -0
  31. package/lib/font-metrics.js +58 -0
  32. package/lib/font.d.ts +59 -0
  33. package/lib/font.h +424 -0
  34. package/lib/font.js +100 -0
  35. package/lib/handle.d.ts +5 -0
  36. package/lib/handle.js +6 -0
  37. package/lib/image-view.d.ts +15 -0
  38. package/lib/image-view.h +75 -0
  39. package/lib/image-view.js +27 -0
  40. package/lib/image.d.ts +37 -0
  41. package/lib/image.h +205 -0
  42. package/lib/image.js +60 -0
  43. package/lib/label.d.ts +51 -0
  44. package/lib/label.h +331 -0
  45. package/lib/label.js +94 -0
  46. package/lib/paragraph-style.d.ts +20 -0
  47. package/lib/paragraph-style.h +94 -0
  48. package/lib/paragraph-style.js +42 -0
  49. package/lib/pasteboard.d.ts +31 -0
  50. package/lib/pasteboard.h +123 -0
  51. package/lib/pasteboard.js +63 -0
  52. package/lib/retain.js +12 -0
  53. package/lib/runtime.m +92 -15
  54. package/lib/scene.d.ts +30 -0
  55. package/lib/scene.h +87 -0
  56. package/lib/scene.js +48 -0
  57. package/lib/scratch.js +4 -0
  58. package/lib/screen.d.ts +26 -0
  59. package/lib/screen.h +194 -0
  60. package/lib/screen.js +52 -0
  61. package/lib/scroll-view.d.ts +39 -0
  62. package/lib/scroll-view.h +246 -0
  63. package/lib/scroll-view.js +64 -0
  64. package/lib/switch.d.ts +22 -0
  65. package/lib/switch.h +166 -0
  66. package/lib/switch.js +42 -0
  67. package/lib/text-field.d.ts +103 -0
  68. package/lib/text-field.h +562 -0
  69. package/lib/text-field.js +183 -0
  70. package/lib/text-view.d.ts +59 -0
  71. package/lib/text-view.h +497 -0
  72. package/lib/text-view.js +138 -0
  73. package/lib/view-controller.d.ts +37 -0
  74. package/lib/view-controller.h +108 -20
  75. package/lib/view-controller.js +50 -5
  76. package/lib/view.d.ts +158 -0
  77. package/lib/view.h +1385 -20
  78. package/lib/view.js +276 -7
  79. package/lib/window.d.ts +44 -0
  80. package/lib/window.h +167 -27
  81. package/lib/window.js +62 -9
  82. package/lib/wrap.js +7 -0
  83. package/package.json +12 -3
  84. package/prebuilds/ios-arm64/bare +0 -0
  85. package/prebuilds/ios-arm64/bare-ui-kit.bare +0 -0
  86. package/prebuilds/ios-arm64-simulator/bare +0 -0
  87. package/prebuilds/ios-arm64-simulator/bare-ui-kit.bare +0 -0
  88. package/prebuilds/ios-x64-simulator/bare +0 -0
  89. package/prebuilds/ios-x64-simulator/bare-ui-kit.bare +0 -0
package/lib/view.h CHANGED
@@ -1,25 +1,1042 @@
1
+ #import <assert.h>
2
+ #import <bare.h>
3
+ #import <js.h>
4
+
5
+ #import <UIKit/UIKit.h>
6
+
7
+ #import "bridging.h"
8
+
9
+ // A plain `UIView` cannot report touches, so the base view is a subclass. The
10
+ // mask keeps a view that nobody listens to as cheap as a plain one.
11
+ enum {
12
+ bare_ui_kit_view_event_touches_began = 1 << 0,
13
+ bare_ui_kit_view_event_touches_moved = 1 << 1,
14
+ bare_ui_kit_view_event_touches_ended = 1 << 2,
15
+ bare_ui_kit_view_event_touches_cancelled = 1 << 3,
16
+ bare_ui_kit_view_event_trait_change = 1 << 4,
17
+ };
18
+
19
+ static int32_t
20
+ bare_ui_kit__touch(bare_ui_kit_state_t *state, UITouch *touch) {
21
+ int32_t vacant = -1;
22
+
23
+ for (int32_t i = 0; i < bare_ui_kit_touches_max; i++) {
24
+ if (state->touches[i] == touch) return i;
25
+
26
+ if (state->touches[i] == nil && vacant == -1) vacant = i;
27
+ }
28
+
29
+ if (vacant != -1) state->touches[vacant] = touch;
30
+
31
+ return vacant;
32
+ }
33
+
34
+ static void
35
+ bare_ui_kit__touch_release(bare_ui_kit_state_t *state, UITouch *touch) {
36
+ for (int32_t i = 0; i < bare_ui_kit_touches_max; i++) {
37
+ if (state->touches[i] == touch) {
38
+ state->touches[i] = nil;
39
+ return;
40
+ }
41
+ }
42
+ }
43
+
44
+ @interface BareView : UIView <BareEventTarget> {
45
+ @public
46
+ bare_ui_kit_state_t *state;
47
+ js_env_t *env;
48
+ js_ref_t *ctx;
49
+
50
+ int32_t mask;
51
+ }
52
+
53
+ @end
54
+
55
+ @implementation BareView
56
+
57
+ - (void)dealloc {
58
+ int err;
59
+
60
+ err = js_delete_reference(env, ctx);
61
+ assert(err == 0);
62
+
63
+ [super dealloc];
64
+ }
65
+
66
+ - (int32_t)eventMask {
67
+ return mask;
68
+ }
69
+
70
+ - (void)setEventMask:(int32_t)value {
71
+ mask = value;
72
+ }
73
+
74
+ // UIKit reports the touches that changed together, and other platforms report
75
+ // one pointer at a time, so they are sent one by one.
76
+ - (void)bareEmit:(int32_t)type touches:(NSSet<UITouch *> *)touches {
77
+ bool last = type == bare_ui_kit_view_event_touches_ended || type == bare_ui_kit_view_event_touches_cancelled;
78
+
79
+ for (UITouch *touch in touches) {
80
+ CGPoint point = [touch locationInView:self];
81
+
82
+ int32_t pointer = bare_ui_kit__touch(state, touch);
83
+
84
+ if (last) bare_ui_kit__touch_release(state, touch);
85
+
86
+ bare_ui_kit__emit_event(env, ctx, "_onevent", type, point.x, point.y, pointer);
87
+ }
88
+ }
89
+
90
+ // From iOS 17 a view registers for the traits it cares about, once. Before
91
+ // that, overriding is the only hook, so both are here and the version decides
92
+ // which one reports.
93
+ - (void)bareRegisterForTraitChanges {
94
+ if (@available(iOS 17.0, *)) {
95
+ [self registerForTraitChanges:@[ UITraitUserInterfaceStyle.class, UITraitPreferredContentSizeCategory.class ]
96
+ withHandler:^(BareView *view, UITraitCollection *previous) {
97
+ if ((view->mask & bare_ui_kit_view_event_trait_change) == 0) return;
98
+
99
+ bare_ui_kit__emit(view->env, view->ctx, "_ontraitchange");
100
+ }];
101
+ }
102
+ }
103
+
104
+ - (void)traitCollectionDidChange:(UITraitCollection *)previous {
105
+ [super traitCollectionDidChange:previous];
106
+
107
+ if (@available(iOS 17.0, *)) return;
108
+
109
+ if ((mask & bare_ui_kit_view_event_trait_change) == 0) return;
110
+
111
+ if (previous.userInterfaceStyle == self.traitCollection.userInterfaceStyle &&
112
+ [previous.preferredContentSizeCategory isEqualToString:self.traitCollection.preferredContentSizeCategory]) return;
113
+
114
+ bare_ui_kit__emit(env, ctx, "_ontraitchange");
115
+ }
116
+
117
+ - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
118
+ if ((mask & bare_ui_kit_view_event_touches_began) == 0) return [super touchesBegan:touches withEvent:event];
119
+
120
+ [self bareEmit:bare_ui_kit_view_event_touches_began touches:touches];
121
+ }
122
+
123
+ - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
124
+ if ((mask & bare_ui_kit_view_event_touches_moved) == 0) return [super touchesMoved:touches withEvent:event];
125
+
126
+ [self bareEmit:bare_ui_kit_view_event_touches_moved touches:touches];
127
+ }
128
+
129
+ - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
130
+ if ((mask & bare_ui_kit_view_event_touches_ended) == 0) return [super touchesEnded:touches withEvent:event];
131
+
132
+ [self bareEmit:bare_ui_kit_view_event_touches_ended touches:touches];
133
+ }
134
+
135
+ - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
136
+ if ((mask & bare_ui_kit_view_event_touches_cancelled) == 0) return [super touchesCancelled:touches withEvent:event];
137
+
138
+ [self bareEmit:bare_ui_kit_view_event_touches_cancelled touches:touches];
139
+ }
140
+
141
+ @end
142
+
143
+ static js_value_t *
144
+ bare_ui_kit_view_init(js_env_t *env, js_callback_info_t *info) {
145
+ int err;
146
+
147
+ size_t argc = 5;
148
+ js_value_t *argv[5];
149
+
150
+ bare_ui_kit_state_t *state;
151
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
152
+ assert(err == 0);
153
+
154
+ assert(argc == 5);
155
+
156
+ double x;
157
+ if (!bare_ui_kit__read_double(env, argv[0], "x", &x)) return NULL;
158
+
159
+ double y;
160
+ if (!bare_ui_kit__read_double(env, argv[1], "y", &y)) return NULL;
161
+
162
+ double width;
163
+ if (!bare_ui_kit__read_double(env, argv[2], "width", &width)) return NULL;
164
+
165
+ double height;
166
+ if (!bare_ui_kit__read_double(env, argv[3], "height", &height)) return NULL;
167
+
168
+ js_value_t *result;
169
+
170
+ @autoreleasepool {
171
+ BareView *handle = [[[BareView alloc]
172
+ initWithFrame:CGRectMake(x, y, width, height)] autorelease];
173
+
174
+ result = bare_foundation_bridge(env, state->registry, handle);
175
+
176
+ handle->state = state;
177
+ handle->env = env;
178
+
179
+ // Weak, so the native object does not keep its own wrapper alive. Events
180
+ // are dropped once the wrapper is collected.
181
+ err = js_create_reference(env, argv[4], 0, &handle->ctx);
182
+ assert(err == 0);
183
+
184
+ [handle bareRegisterForTraitChanges];
185
+ }
186
+
187
+ return result;
188
+ }
189
+
190
+ static js_value_t *
191
+ bare_ui_kit_view_override_user_interface_style(js_env_t *env, js_callback_info_t *info) {
192
+ int err;
193
+
194
+ size_t argc = 2;
195
+ js_value_t *argv[2];
196
+
197
+ bare_ui_kit_state_t *state;
198
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
199
+ assert(err == 0);
200
+
201
+ assert(argc == 1 || argc == 2);
202
+
203
+ void *handle;
204
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
205
+
206
+ js_value_t *result = NULL;
207
+
208
+ @autoreleasepool {
209
+ UIView *view = (__bridge UIView *) handle;
210
+
211
+ if (argc == 1) {
212
+ err = js_create_int32(env, view.overrideUserInterfaceStyle, &result);
213
+ assert(err == 0);
214
+ } else {
215
+ int32_t style;
216
+ if (!bare_ui_kit__read_int32(env, argv[1], "style", &style)) return NULL;
217
+
218
+ view.overrideUserInterfaceStyle = style;
219
+ }
220
+ }
221
+
222
+ return result;
223
+ }
224
+
225
+ static js_value_t *
226
+ bare_ui_kit_view_user_interface_style(js_env_t *env, js_callback_info_t *info) {
227
+ int err;
228
+
229
+ size_t argc = 1;
230
+ js_value_t *argv[1];
231
+
232
+ bare_ui_kit_state_t *state;
233
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
234
+ assert(err == 0);
235
+
236
+ assert(argc == 1);
237
+
238
+ void *handle;
239
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
240
+
241
+ js_value_t *result;
242
+
243
+ @autoreleasepool {
244
+ UIView *view = (__bridge UIView *) handle;
245
+
246
+ err = js_create_int32(env, view.traitCollection.userInterfaceStyle, &result);
247
+ assert(err == 0);
248
+ }
249
+
250
+ return result;
251
+ }
252
+
253
+ static js_value_t *
254
+ bare_ui_kit_view_frame(js_env_t *env, js_callback_info_t *info) {
255
+ int err;
256
+
257
+ size_t argc = 5;
258
+ js_value_t *argv[5];
259
+
260
+ bare_ui_kit_state_t *state;
261
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
262
+ assert(err == 0);
263
+
264
+ assert(argc == 1 || argc == 5);
265
+
266
+ void *handle;
267
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
268
+
269
+ js_value_t *result = NULL;
270
+
271
+ @autoreleasepool {
272
+ UIView *view = (__bridge UIView *) handle;
273
+
274
+ if (argc == 1) {
275
+ result = bare_ui_kit__from_rect(env, view.frame);
276
+ } else {
277
+ double x;
278
+ if (!bare_ui_kit__read_double(env, argv[1], "x", &x)) return NULL;
279
+
280
+ double y;
281
+ if (!bare_ui_kit__read_double(env, argv[2], "y", &y)) return NULL;
282
+
283
+ double width;
284
+ if (!bare_ui_kit__read_double(env, argv[3], "width", &width)) return NULL;
285
+
286
+ double height;
287
+ if (!bare_ui_kit__read_double(env, argv[4], "height", &height)) return NULL;
288
+
289
+ view.frame = CGRectMake(x, y, width, height);
290
+ }
291
+ }
292
+
293
+ return result;
294
+ }
295
+
296
+ static void
297
+ bare_ui_kit_view_frame_typed(js_value_t *receiver, int32_t bare_tag, double x, double y, double width, double height, js_typed_callback_info_t *info) {
298
+ int err;
299
+
300
+ bare_ui_kit_state_t *state;
301
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
302
+ assert(err == 0);
303
+
304
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
305
+
306
+ if (bare_object == nil) return;
307
+
308
+ @autoreleasepool {
309
+ UIView *view = (UIView *) bare_object;
310
+
311
+ view.frame = CGRectMake(x, y, width, height);
312
+ }
313
+ }
314
+
315
+ static js_value_t *
316
+ bare_ui_kit_view_frame_into(js_env_t *env, js_callback_info_t *info) {
317
+ int err;
318
+
319
+ size_t argc = 3;
320
+ js_value_t *argv[3];
321
+
322
+ bare_ui_kit_state_t *state;
323
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
324
+ assert(err == 0);
325
+
326
+ assert(argc == 3);
327
+
328
+ void *handle;
329
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
330
+
331
+ uint32_t offset;
332
+ if (!bare_ui_kit__read_uint32(env, argv[2], "offset", &offset)) return NULL;
333
+
334
+ double *out;
335
+
336
+ if (!bare_ui_kit__buffer(env, argv[1], offset, 4, &out)) {
337
+ err = js_throw_type_error(env, NULL, "Expected an array buffer with room for 4 doubles");
338
+ assert(err == 0);
339
+
340
+ return NULL;
341
+ }
342
+
343
+ @autoreleasepool {
344
+ UIView *view = (__bridge UIView *) handle;
345
+
346
+ CGRect value = view.frame;
347
+
348
+ out[0] = value.origin.x;
349
+ out[1] = value.origin.y;
350
+ out[2] = value.size.width;
351
+ out[3] = value.size.height;
352
+ }
353
+
354
+ return NULL;
355
+ }
356
+
357
+ static void
358
+ bare_ui_kit_view_frame_into_typed(js_value_t *receiver, int32_t bare_tag, js_value_t *bare_buffer, uint32_t bare_offset, js_typed_callback_info_t *info) {
359
+ int err;
360
+
361
+ bare_ui_kit_state_t *state;
362
+
363
+ js_env_t *env;
364
+ err = js_get_typed_callback_info(info, &env, (void **) &state);
365
+ assert(err == 0);
366
+
367
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
368
+
369
+ if (bare_object == nil) return;
370
+
371
+ double *out;
372
+
373
+ if (!bare_ui_kit__buffer(env, bare_buffer, bare_offset, 4, &out)) return;
374
+
375
+ @autoreleasepool {
376
+ UIView *view = (UIView *) bare_object;
377
+
378
+ CGRect value = view.frame;
379
+
380
+ out[0] = value.origin.x;
381
+ out[1] = value.origin.y;
382
+ out[2] = value.size.width;
383
+ out[3] = value.size.height;
384
+ }
385
+ }
386
+
387
+ static js_value_t *
388
+ bare_ui_kit_view_bounds(js_env_t *env, js_callback_info_t *info) {
389
+ int err;
390
+
391
+ size_t argc = 5;
392
+ js_value_t *argv[5];
393
+
394
+ bare_ui_kit_state_t *state;
395
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
396
+ assert(err == 0);
397
+
398
+ assert(argc == 1 || argc == 5);
399
+
400
+ void *handle;
401
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
402
+
403
+ js_value_t *result = NULL;
404
+
405
+ @autoreleasepool {
406
+ UIView *view = (__bridge UIView *) handle;
407
+
408
+ if (argc == 1) {
409
+ result = bare_ui_kit__from_rect(env, view.bounds);
410
+ } else {
411
+ double x;
412
+ if (!bare_ui_kit__read_double(env, argv[1], "x", &x)) return NULL;
413
+
414
+ double y;
415
+ if (!bare_ui_kit__read_double(env, argv[2], "y", &y)) return NULL;
416
+
417
+ double width;
418
+ if (!bare_ui_kit__read_double(env, argv[3], "width", &width)) return NULL;
419
+
420
+ double height;
421
+ if (!bare_ui_kit__read_double(env, argv[4], "height", &height)) return NULL;
422
+
423
+ view.bounds = CGRectMake(x, y, width, height);
424
+ }
425
+ }
426
+
427
+ return result;
428
+ }
429
+
430
+ static void
431
+ bare_ui_kit_view_bounds_typed(js_value_t *receiver, int32_t bare_tag, double x, double y, double width, double height, js_typed_callback_info_t *info) {
432
+ int err;
433
+
434
+ bare_ui_kit_state_t *state;
435
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
436
+ assert(err == 0);
437
+
438
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
439
+
440
+ if (bare_object == nil) return;
441
+
442
+ @autoreleasepool {
443
+ UIView *view = (UIView *) bare_object;
444
+
445
+ view.bounds = CGRectMake(x, y, width, height);
446
+ }
447
+ }
448
+
449
+ static js_value_t *
450
+ bare_ui_kit_view_bounds_into(js_env_t *env, js_callback_info_t *info) {
451
+ int err;
452
+
453
+ size_t argc = 3;
454
+ js_value_t *argv[3];
455
+
456
+ bare_ui_kit_state_t *state;
457
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
458
+ assert(err == 0);
459
+
460
+ assert(argc == 3);
461
+
462
+ void *handle;
463
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
464
+
465
+ uint32_t offset;
466
+ if (!bare_ui_kit__read_uint32(env, argv[2], "offset", &offset)) return NULL;
467
+
468
+ double *out;
469
+
470
+ if (!bare_ui_kit__buffer(env, argv[1], offset, 4, &out)) {
471
+ err = js_throw_type_error(env, NULL, "Expected an array buffer with room for 4 doubles");
472
+ assert(err == 0);
473
+
474
+ return NULL;
475
+ }
476
+
477
+ @autoreleasepool {
478
+ UIView *view = (__bridge UIView *) handle;
479
+
480
+ CGRect value = view.bounds;
481
+
482
+ out[0] = value.origin.x;
483
+ out[1] = value.origin.y;
484
+ out[2] = value.size.width;
485
+ out[3] = value.size.height;
486
+ }
487
+
488
+ return NULL;
489
+ }
490
+
491
+ static void
492
+ bare_ui_kit_view_bounds_into_typed(js_value_t *receiver, int32_t bare_tag, js_value_t *bare_buffer, uint32_t bare_offset, js_typed_callback_info_t *info) {
493
+ int err;
494
+
495
+ bare_ui_kit_state_t *state;
496
+
497
+ js_env_t *env;
498
+ err = js_get_typed_callback_info(info, &env, (void **) &state);
499
+ assert(err == 0);
500
+
501
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
502
+
503
+ if (bare_object == nil) return;
504
+
505
+ double *out;
506
+
507
+ if (!bare_ui_kit__buffer(env, bare_buffer, bare_offset, 4, &out)) return;
508
+
509
+ @autoreleasepool {
510
+ UIView *view = (UIView *) bare_object;
511
+
512
+ CGRect value = view.bounds;
513
+
514
+ out[0] = value.origin.x;
515
+ out[1] = value.origin.y;
516
+ out[2] = value.size.width;
517
+ out[3] = value.size.height;
518
+ }
519
+ }
520
+
521
+ static js_value_t *
522
+ bare_ui_kit_view_hidden(js_env_t *env, js_callback_info_t *info) {
523
+ int err;
524
+
525
+ size_t argc = 2;
526
+ js_value_t *argv[2];
527
+
528
+ bare_ui_kit_state_t *state;
529
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
530
+ assert(err == 0);
531
+
532
+ assert(argc == 1 || argc == 2);
533
+
534
+ void *handle;
535
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
536
+
537
+ js_value_t *result = NULL;
538
+
539
+ @autoreleasepool {
540
+ UIView *view = (__bridge UIView *) handle;
541
+
542
+ if (argc == 1) {
543
+ err = js_get_boolean(env, view.hidden, &result);
544
+ assert(err == 0);
545
+ } else {
546
+ bool hidden;
547
+ if (!bare_ui_kit__read_bool(env, argv[1], "hidden", &hidden)) return NULL;
548
+
549
+ view.hidden = hidden;
550
+ }
551
+ }
552
+
553
+ return result;
554
+ }
555
+
556
+ static void
557
+ bare_ui_kit_view_hidden_typed(js_value_t *receiver, int32_t bare_tag, bool hidden, js_typed_callback_info_t *info) {
558
+ int err;
559
+
560
+ bare_ui_kit_state_t *state;
561
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
562
+ assert(err == 0);
563
+
564
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
565
+
566
+ if (bare_object == nil) return;
567
+
568
+ @autoreleasepool {
569
+ UIView *view = (UIView *) bare_object;
570
+
571
+ view.hidden = hidden;
572
+ }
573
+ }
574
+
575
+ static js_value_t *
576
+ bare_ui_kit_view_alpha(js_env_t *env, js_callback_info_t *info) {
577
+ int err;
578
+
579
+ size_t argc = 2;
580
+ js_value_t *argv[2];
581
+
582
+ bare_ui_kit_state_t *state;
583
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
584
+ assert(err == 0);
585
+
586
+ assert(argc == 1 || argc == 2);
587
+
588
+ void *handle;
589
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
590
+
591
+ js_value_t *result = NULL;
592
+
593
+ @autoreleasepool {
594
+ UIView *view = (__bridge UIView *) handle;
595
+
596
+ if (argc == 1) {
597
+ err = js_create_double(env, view.alpha, &result);
598
+ assert(err == 0);
599
+ } else {
600
+ double alpha;
601
+ if (!bare_ui_kit__read_double(env, argv[1], "alpha", &alpha)) return NULL;
602
+
603
+ view.alpha = alpha;
604
+ }
605
+ }
606
+
607
+ return result;
608
+ }
609
+
610
+ static void
611
+ bare_ui_kit_view_alpha_typed(js_value_t *receiver, int32_t bare_tag, double alpha, js_typed_callback_info_t *info) {
612
+ int err;
613
+
614
+ bare_ui_kit_state_t *state;
615
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
616
+ assert(err == 0);
617
+
618
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
619
+
620
+ if (bare_object == nil) return;
621
+
622
+ @autoreleasepool {
623
+ UIView *view = (UIView *) bare_object;
624
+
625
+ view.alpha = alpha;
626
+ }
627
+ }
628
+
629
+ // Asks whatever is editing inside this view to stop, which puts the keyboard
630
+ // away without knowing which field showed it.
631
+ static js_value_t *
632
+ bare_ui_kit_view_end_editing(js_env_t *env, js_callback_info_t *info) {
633
+ int err;
634
+
635
+ size_t argc = 2;
636
+ js_value_t *argv[2];
637
+
638
+ bare_ui_kit_state_t *state;
639
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
640
+ assert(err == 0);
641
+
642
+ assert(argc == 2);
643
+
644
+ void *handle;
645
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
646
+
647
+ bool force;
648
+ if (!bare_ui_kit__read_bool(env, argv[1], "force", &force)) return NULL;
649
+
650
+ js_value_t *result;
651
+
652
+ @autoreleasepool {
653
+ UIView *view = (__bridge UIView *) handle;
654
+
655
+ err = js_get_boolean(env, [view endEditing:force], &result);
656
+ assert(err == 0);
657
+ }
658
+
659
+ return result;
660
+ }
661
+
662
+ static js_value_t *
663
+ bare_ui_kit_view_convert_point_to_view(js_env_t *env, js_callback_info_t *info) {
664
+ int err;
665
+
666
+ size_t argc = 4;
667
+ js_value_t *argv[4];
668
+
669
+ bare_ui_kit_state_t *state;
670
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
671
+ assert(err == 0);
672
+
673
+ assert(argc == 4);
674
+
675
+ void *handle;
676
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
677
+
678
+ double x;
679
+ if (!bare_ui_kit__read_double(env, argv[1], "x", &x)) return NULL;
680
+
681
+ double y;
682
+ if (!bare_ui_kit__read_double(env, argv[2], "y", &y)) return NULL;
683
+
684
+ id target = bare_foundation_to_object(env, state->registry, argv[3]);
685
+
686
+ js_value_t *result;
687
+
688
+ @autoreleasepool {
689
+ UIView *view = (__bridge UIView *) handle;
690
+
691
+ result = bare_ui_kit__from_point(env, [view convertPoint:CGPointMake(x, y) toView:target]);
692
+ }
693
+
694
+ return result;
695
+ }
696
+
697
+ static js_value_t *
698
+ bare_ui_kit_view_convert_point_from_view(js_env_t *env, js_callback_info_t *info) {
699
+ int err;
700
+
701
+ size_t argc = 4;
702
+ js_value_t *argv[4];
703
+
704
+ bare_ui_kit_state_t *state;
705
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
706
+ assert(err == 0);
707
+
708
+ assert(argc == 4);
709
+
710
+ void *handle;
711
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
712
+
713
+ double x;
714
+ if (!bare_ui_kit__read_double(env, argv[1], "x", &x)) return NULL;
715
+
716
+ double y;
717
+ if (!bare_ui_kit__read_double(env, argv[2], "y", &y)) return NULL;
718
+
719
+ id target = bare_foundation_to_object(env, state->registry, argv[3]);
720
+
721
+ js_value_t *result;
722
+
723
+ @autoreleasepool {
724
+ UIView *view = (__bridge UIView *) handle;
725
+
726
+ result = bare_ui_kit__from_point(env, [view convertPoint:CGPointMake(x, y) fromView:target]);
727
+ }
728
+
729
+ return result;
730
+ }
731
+
732
+ static js_value_t *
733
+ bare_ui_kit_view_size_that_fits_into(js_env_t *env, js_callback_info_t *info) {
734
+ int err;
735
+
736
+ size_t argc = 5;
737
+ js_value_t *argv[5];
738
+
739
+ bare_ui_kit_state_t *state;
740
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
741
+ assert(err == 0);
742
+
743
+ assert(argc == 5);
744
+
745
+ void *handle;
746
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
747
+
748
+ double width;
749
+ if (!bare_ui_kit__read_double(env, argv[1], "width", &width)) return NULL;
750
+
751
+ double height;
752
+ if (!bare_ui_kit__read_double(env, argv[2], "height", &height)) return NULL;
753
+
754
+ uint32_t offset;
755
+ if (!bare_ui_kit__read_uint32(env, argv[4], "offset", &offset)) return NULL;
756
+
757
+ double *out;
758
+
759
+ if (!bare_ui_kit__buffer(env, argv[3], offset, 2, &out)) {
760
+ err = js_throw_type_error(env, NULL, "Expected an array buffer with room for 2 doubles");
761
+ assert(err == 0);
762
+
763
+ return NULL;
764
+ }
765
+
766
+ @autoreleasepool {
767
+ UIView *view = (__bridge UIView *) handle;
768
+
769
+ CGSize size = [view sizeThatFits:CGSizeMake(width, height)];
770
+
771
+ out[0] = size.width;
772
+ out[1] = size.height;
773
+ }
774
+
775
+ return NULL;
776
+ }
777
+
778
+ // On UIKit a view takes focus itself, where on AppKit the window gives it.
779
+ static js_value_t *
780
+ bare_ui_kit_view_become_first_responder(js_env_t *env, js_callback_info_t *info) {
781
+ int err;
782
+
783
+ size_t argc = 1;
784
+ js_value_t *argv[1];
785
+
786
+ bare_ui_kit_state_t *state;
787
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
788
+ assert(err == 0);
789
+
790
+ assert(argc == 1);
791
+
792
+ void *handle;
793
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
794
+
795
+ js_value_t *result;
796
+
797
+ @autoreleasepool {
798
+ UIView *view = (__bridge UIView *) handle;
799
+
800
+ err = js_get_boolean(env, [view becomeFirstResponder], &result);
801
+ assert(err == 0);
802
+ }
803
+
804
+ return result;
805
+ }
806
+
807
+ static js_value_t *
808
+ bare_ui_kit_view_resign_first_responder(js_env_t *env, js_callback_info_t *info) {
809
+ int err;
810
+
811
+ size_t argc = 1;
812
+ js_value_t *argv[1];
813
+
814
+ bare_ui_kit_state_t *state;
815
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
816
+ assert(err == 0);
817
+
818
+ assert(argc == 1);
819
+
820
+ void *handle;
821
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
822
+
823
+ js_value_t *result;
824
+
825
+ @autoreleasepool {
826
+ UIView *view = (__bridge UIView *) handle;
827
+
828
+ err = js_get_boolean(env, [view resignFirstResponder], &result);
829
+ assert(err == 0);
830
+ }
831
+
832
+ return result;
833
+ }
834
+
835
+ static js_value_t *
836
+ bare_ui_kit_view_is_first_responder(js_env_t *env, js_callback_info_t *info) {
837
+ int err;
838
+
839
+ size_t argc = 1;
840
+ js_value_t *argv[1];
841
+
842
+ bare_ui_kit_state_t *state;
843
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
844
+ assert(err == 0);
845
+
846
+ assert(argc == 1);
847
+
848
+ void *handle;
849
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
850
+
851
+ js_value_t *result;
852
+
853
+ @autoreleasepool {
854
+ UIView *view = (__bridge UIView *) handle;
855
+
856
+ err = js_get_boolean(env, view.isFirstResponder, &result);
857
+ assert(err == 0);
858
+ }
859
+
860
+ return result;
861
+ }
862
+
863
+ static js_value_t *
864
+ bare_ui_kit_view_content_mode(js_env_t *env, js_callback_info_t *info) {
865
+ int err;
866
+
867
+ size_t argc = 2;
868
+ js_value_t *argv[2];
869
+
870
+ bare_ui_kit_state_t *state;
871
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
872
+ assert(err == 0);
873
+
874
+ assert(argc == 1 || argc == 2);
875
+
876
+ void *handle;
877
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
878
+
879
+ js_value_t *result = NULL;
880
+
881
+ @autoreleasepool {
882
+ UIView *view = (__bridge UIView *) handle;
883
+
884
+ if (argc == 1) {
885
+ err = js_create_int32(env, (int32_t) view.contentMode, &result);
886
+ assert(err == 0);
887
+ } else {
888
+ int32_t content_mode;
889
+ if (!bare_ui_kit__read_int32(env, argv[1], "content_mode", &content_mode)) return NULL;
890
+
891
+ view.contentMode = content_mode;
892
+ }
893
+ }
894
+
895
+ return result;
896
+ }
897
+
898
+ static void
899
+ bare_ui_kit_view_content_mode_typed(js_value_t *receiver, int32_t bare_tag, int32_t content_mode, js_typed_callback_info_t *info) {
900
+ int err;
901
+
902
+ bare_ui_kit_state_t *state;
903
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
904
+ assert(err == 0);
905
+
906
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
907
+
908
+ if (bare_object == nil) return;
909
+
910
+ @autoreleasepool {
911
+ UIView *view = (UIView *) bare_object;
912
+
913
+ view.contentMode = content_mode;
914
+ }
915
+ }
916
+
917
+ static js_value_t *
918
+ bare_ui_kit_view_clips_to_bounds(js_env_t *env, js_callback_info_t *info) {
919
+ int err;
920
+
921
+ size_t argc = 2;
922
+ js_value_t *argv[2];
923
+
924
+ bare_ui_kit_state_t *state;
925
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
926
+ assert(err == 0);
927
+
928
+ assert(argc == 1 || argc == 2);
929
+
930
+ void *handle;
931
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
932
+
933
+ js_value_t *result = NULL;
934
+
935
+ @autoreleasepool {
936
+ UIView *view = (__bridge UIView *) handle;
937
+
938
+ if (argc == 1) {
939
+ err = js_get_boolean(env, view.clipsToBounds, &result);
940
+ assert(err == 0);
941
+ } else {
942
+ bool clips_to_bounds;
943
+ if (!bare_ui_kit__read_bool(env, argv[1], "clips_to_bounds", &clips_to_bounds)) return NULL;
944
+
945
+ view.clipsToBounds = clips_to_bounds;
946
+ }
947
+ }
948
+
949
+ return result;
950
+ }
951
+
952
+ static void
953
+ bare_ui_kit_view_clips_to_bounds_typed(js_value_t *receiver, int32_t bare_tag, bool clips_to_bounds, js_typed_callback_info_t *info) {
954
+ int err;
955
+
956
+ bare_ui_kit_state_t *state;
957
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
958
+ assert(err == 0);
959
+
960
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
961
+
962
+ if (bare_object == nil) return;
963
+
964
+ @autoreleasepool {
965
+ UIView *view = (UIView *) bare_object;
966
+
967
+ view.clipsToBounds = clips_to_bounds;
968
+ }
969
+ }
970
+
971
+ static js_value_t *
972
+ bare_ui_kit_view_user_interaction_enabled(js_env_t *env, js_callback_info_t *info) {
973
+ int err;
974
+
975
+ size_t argc = 2;
976
+ js_value_t *argv[2];
977
+
978
+ bare_ui_kit_state_t *state;
979
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
980
+ assert(err == 0);
981
+
982
+ assert(argc == 1 || argc == 2);
983
+
984
+ void *handle;
985
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1
986
 
2
- #import <assert.h>
3
- #import <bare.h>
4
- #import <js.h>
987
+ js_value_t *result = NULL;
5
988
 
6
- #import <UIKit/UIKit.h>
989
+ @autoreleasepool {
990
+ UIView *view = (__bridge UIView *) handle;
991
+
992
+ if (argc == 1) {
993
+ err = js_get_boolean(env, view.userInteractionEnabled, &result);
994
+ assert(err == 0);
995
+ } else {
996
+ bool enabled;
997
+ if (!bare_ui_kit__read_bool(env, argv[1], "enabled", &enabled)) return NULL;
998
+
999
+ view.userInteractionEnabled = enabled;
1000
+ }
1001
+ }
1002
+
1003
+ return result;
1004
+ }
1005
+
1006
+ static void
1007
+ bare_ui_kit_view_user_interaction_enabled_typed(js_value_t *receiver, int32_t bare_tag, bool enabled, js_typed_callback_info_t *info) {
1008
+ int err;
1009
+
1010
+ bare_ui_kit_state_t *state;
1011
+ err = js_get_typed_callback_info(info, NULL, (void **) &state);
1012
+ assert(err == 0);
1013
+
1014
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
1015
+
1016
+ if (bare_object == nil) return;
1017
+
1018
+ @autoreleasepool {
1019
+ UIView *view = (UIView *) bare_object;
1020
+
1021
+ view.userInteractionEnabled = enabled;
1022
+ }
1023
+ }
7
1024
 
8
1025
  static js_value_t *
9
- bare_ui_kit_view_hidden(js_env_t *env, js_callback_info_t *info) {
1026
+ bare_ui_kit_view_background_color(js_env_t *env, js_callback_info_t *info) {
10
1027
  int err;
11
1028
 
12
1029
  size_t argc = 2;
13
1030
  js_value_t *argv[2];
14
1031
 
15
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1032
+ bare_ui_kit_state_t *state;
1033
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
16
1034
  assert(err == 0);
17
1035
 
18
1036
  assert(argc == 1 || argc == 2);
19
1037
 
20
1038
  void *handle;
21
- err = js_get_value_external(env, argv[0], &handle);
22
- assert(err == 0);
1039
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
23
1040
 
24
1041
  js_value_t *result = NULL;
25
1042
 
@@ -27,20 +1044,100 @@ bare_ui_kit_view_hidden(js_env_t *env, js_callback_info_t *info) {
27
1044
  UIView *view = (__bridge UIView *) handle;
28
1045
 
29
1046
  if (argc == 1) {
30
- err = js_get_boolean(env, view.hidden, &result);
31
- assert(err == 0);
1047
+ result = bare_foundation_bridge(env, state->registry, view.backgroundColor);
32
1048
  } else {
33
- bool value;
34
- err = js_get_value_bool(env, argv[1], &value);
35
- assert(err == 0);
1049
+ view.backgroundColor = bare_foundation_to_object(env, state->registry, argv[1]);
1050
+ }
1051
+ }
1052
+
1053
+ return result;
1054
+ }
1055
+
1056
+ static js_value_t *
1057
+ bare_ui_kit_view_tint_color(js_env_t *env, js_callback_info_t *info) {
1058
+ int err;
1059
+
1060
+ size_t argc = 2;
1061
+ js_value_t *argv[2];
1062
+
1063
+ bare_ui_kit_state_t *state;
1064
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1065
+ assert(err == 0);
1066
+
1067
+ assert(argc == 1 || argc == 2);
36
1068
 
37
- view.hidden = value;
1069
+ void *handle;
1070
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1071
+
1072
+ js_value_t *result = NULL;
1073
+
1074
+ @autoreleasepool {
1075
+ UIView *view = (__bridge UIView *) handle;
1076
+
1077
+ if (argc == 1) {
1078
+ result = bare_foundation_bridge(env, state->registry, view.tintColor);
1079
+ } else {
1080
+ view.tintColor = bare_foundation_to_object(env, state->registry, argv[1]);
38
1081
  }
39
1082
  }
40
1083
 
41
1084
  return result;
42
1085
  }
43
1086
 
1087
+ static js_value_t *
1088
+ bare_ui_kit_view_superview(js_env_t *env, js_callback_info_t *info) {
1089
+ int err;
1090
+
1091
+ size_t argc = 1;
1092
+ js_value_t *argv[1];
1093
+
1094
+ bare_ui_kit_state_t *state;
1095
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1096
+ assert(err == 0);
1097
+
1098
+ assert(argc == 1);
1099
+
1100
+ void *handle;
1101
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1102
+
1103
+ js_value_t *result;
1104
+
1105
+ @autoreleasepool {
1106
+ UIView *view = (__bridge UIView *) handle;
1107
+
1108
+ result = bare_foundation_bridge(env, state->registry, view.superview);
1109
+ }
1110
+
1111
+ return result;
1112
+ }
1113
+
1114
+ static js_value_t *
1115
+ bare_ui_kit_view_subviews(js_env_t *env, js_callback_info_t *info) {
1116
+ int err;
1117
+
1118
+ size_t argc = 1;
1119
+ js_value_t *argv[1];
1120
+
1121
+ bare_ui_kit_state_t *state;
1122
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1123
+ assert(err == 0);
1124
+
1125
+ assert(argc == 1);
1126
+
1127
+ void *handle;
1128
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1129
+
1130
+ js_value_t *result;
1131
+
1132
+ @autoreleasepool {
1133
+ UIView *view = (__bridge UIView *) handle;
1134
+
1135
+ result = bare_ui_kit__from_objects(env, state, view.subviews);
1136
+ }
1137
+
1138
+ return result;
1139
+ }
1140
+
44
1141
  static js_value_t *
45
1142
  bare_ui_kit_view_add_subview(js_env_t *env, js_callback_info_t *info) {
46
1143
  int err;
@@ -48,26 +1145,294 @@ bare_ui_kit_view_add_subview(js_env_t *env, js_callback_info_t *info) {
48
1145
  size_t argc = 2;
49
1146
  js_value_t *argv[2];
50
1147
 
51
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1148
+ bare_ui_kit_state_t *state;
1149
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
52
1150
  assert(err == 0);
53
1151
 
54
1152
  assert(argc == 2);
55
1153
 
56
1154
  void *handle;
57
- err = js_get_value_external(env, argv[0], &handle);
1155
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1156
+
1157
+ void *subview_handle;
1158
+ if (bare_foundation_read_tag(env, state->registry, argv[1], "subview_handle", &subview_handle) < 0) return NULL;
1159
+
1160
+ @autoreleasepool {
1161
+ UIView *view = (__bridge UIView *) handle;
1162
+ UIView *subview = (__bridge UIView *) subview_handle;
1163
+
1164
+ [view addSubview:subview];
1165
+ }
1166
+
1167
+ return NULL;
1168
+ }
1169
+
1170
+ static js_value_t *
1171
+ bare_ui_kit_view_insert_subview_at_index(js_env_t *env, js_callback_info_t *info) {
1172
+ int err;
1173
+
1174
+ size_t argc = 3;
1175
+ js_value_t *argv[3];
1176
+
1177
+ bare_ui_kit_state_t *state;
1178
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1179
+ assert(err == 0);
1180
+
1181
+ assert(argc == 3);
1182
+
1183
+ void *handle;
1184
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1185
+
1186
+ void *subview_handle;
1187
+ if (bare_foundation_read_tag(env, state->registry, argv[1], "subview_handle", &subview_handle) < 0) return NULL;
1188
+
1189
+ int32_t index;
1190
+ if (!bare_ui_kit__read_int32(env, argv[2], "index", &index)) return NULL;
1191
+
1192
+ @autoreleasepool {
1193
+ UIView *view = (__bridge UIView *) handle;
1194
+ UIView *subview = (__bridge UIView *) subview_handle;
1195
+
1196
+ [view insertSubview:subview atIndex:index];
1197
+ }
1198
+
1199
+ return NULL;
1200
+ }
1201
+
1202
+ static js_value_t *
1203
+ bare_ui_kit_view_insert_subview_below_subview(js_env_t *env, js_callback_info_t *info) {
1204
+ int err;
1205
+
1206
+ size_t argc = 3;
1207
+ js_value_t *argv[3];
1208
+
1209
+ bare_ui_kit_state_t *state;
1210
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1211
+ assert(err == 0);
1212
+
1213
+ assert(argc == 3);
1214
+
1215
+ void *handle;
1216
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1217
+
1218
+ void *subview_handle;
1219
+ if (bare_foundation_read_tag(env, state->registry, argv[1], "subview_handle", &subview_handle) < 0) return NULL;
1220
+
1221
+ void *sibling_handle;
1222
+ if (bare_foundation_read_tag(env, state->registry, argv[2], "sibling_handle", &sibling_handle) < 0) return NULL;
1223
+
1224
+ @autoreleasepool {
1225
+ UIView *view = (__bridge UIView *) handle;
1226
+ UIView *subview = (__bridge UIView *) subview_handle;
1227
+ UIView *sibling = (__bridge UIView *) sibling_handle;
1228
+
1229
+ [view insertSubview:subview belowSubview:sibling];
1230
+ }
1231
+
1232
+ return NULL;
1233
+ }
1234
+
1235
+ static js_value_t *
1236
+ bare_ui_kit_view_insert_subview_above_subview(js_env_t *env, js_callback_info_t *info) {
1237
+ int err;
1238
+
1239
+ size_t argc = 3;
1240
+ js_value_t *argv[3];
1241
+
1242
+ bare_ui_kit_state_t *state;
1243
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1244
+ assert(err == 0);
1245
+
1246
+ assert(argc == 3);
1247
+
1248
+ void *handle;
1249
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1250
+
1251
+ void *subview_handle;
1252
+ if (bare_foundation_read_tag(env, state->registry, argv[1], "subview_handle", &subview_handle) < 0) return NULL;
1253
+
1254
+ void *sibling_handle;
1255
+ if (bare_foundation_read_tag(env, state->registry, argv[2], "sibling_handle", &sibling_handle) < 0) return NULL;
1256
+
1257
+ @autoreleasepool {
1258
+ UIView *view = (__bridge UIView *) handle;
1259
+ UIView *subview = (__bridge UIView *) subview_handle;
1260
+ UIView *sibling = (__bridge UIView *) sibling_handle;
1261
+
1262
+ [view insertSubview:subview aboveSubview:sibling];
1263
+ }
1264
+
1265
+ return NULL;
1266
+ }
1267
+
1268
+ static js_value_t *
1269
+ bare_ui_kit_view_remove_from_superview(js_env_t *env, js_callback_info_t *info) {
1270
+ int err;
1271
+
1272
+ size_t argc = 1;
1273
+ js_value_t *argv[1];
1274
+
1275
+ bare_ui_kit_state_t *state;
1276
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1277
+ assert(err == 0);
1278
+
1279
+ assert(argc == 1);
1280
+
1281
+ void *handle;
1282
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1283
+
1284
+ @autoreleasepool {
1285
+ UIView *view = (__bridge UIView *) handle;
1286
+
1287
+ [view removeFromSuperview];
1288
+ }
1289
+
1290
+ return NULL;
1291
+ }
1292
+
1293
+ static js_value_t *
1294
+ bare_ui_kit_view_set_needs_layout(js_env_t *env, js_callback_info_t *info) {
1295
+ int err;
1296
+
1297
+ size_t argc = 1;
1298
+ js_value_t *argv[1];
1299
+
1300
+ bare_ui_kit_state_t *state;
1301
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1302
+ assert(err == 0);
1303
+
1304
+ assert(argc == 1);
1305
+
1306
+ void *handle;
1307
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1308
+
1309
+ @autoreleasepool {
1310
+ UIView *view = (__bridge UIView *) handle;
1311
+
1312
+ [view setNeedsLayout];
1313
+ }
1314
+
1315
+ return NULL;
1316
+ }
1317
+
1318
+ static js_value_t *
1319
+ bare_ui_kit_view_set_needs_display(js_env_t *env, js_callback_info_t *info) {
1320
+ int err;
1321
+
1322
+ size_t argc = 1;
1323
+ js_value_t *argv[1];
1324
+
1325
+ bare_ui_kit_state_t *state;
1326
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1327
+ assert(err == 0);
1328
+
1329
+ assert(argc == 1);
1330
+
1331
+ void *handle;
1332
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1333
+
1334
+ @autoreleasepool {
1335
+ UIView *view = (__bridge UIView *) handle;
1336
+
1337
+ [view setNeedsDisplay];
1338
+ }
1339
+
1340
+ return NULL;
1341
+ }
1342
+
1343
+ static js_value_t *
1344
+ bare_ui_kit_view_size_to_fit(js_env_t *env, js_callback_info_t *info) {
1345
+ int err;
1346
+
1347
+ size_t argc = 1;
1348
+ js_value_t *argv[1];
1349
+
1350
+ bare_ui_kit_state_t *state;
1351
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
58
1352
  assert(err == 0);
59
1353
 
1354
+ assert(argc == 1);
1355
+
1356
+ void *handle;
1357
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1358
+
60
1359
  @autoreleasepool {
61
1360
  UIView *view = (__bridge UIView *) handle;
62
1361
 
63
- void *handle;
64
- err = js_get_value_external(env, argv[1], &handle);
1362
+ [view sizeToFit];
1363
+ }
1364
+
1365
+ return NULL;
1366
+ }
1367
+
1368
+ static js_value_t *
1369
+ bare_ui_kit_view_safe_area_insets_into(js_env_t *env, js_callback_info_t *info) {
1370
+ int err;
1371
+
1372
+ size_t argc = 3;
1373
+ js_value_t *argv[3];
1374
+
1375
+ bare_ui_kit_state_t *state;
1376
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
1377
+ assert(err == 0);
1378
+
1379
+ assert(argc == 3);
1380
+
1381
+ void *handle;
1382
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
1383
+
1384
+ uint32_t offset;
1385
+ if (!bare_ui_kit__read_uint32(env, argv[2], "offset", &offset)) return NULL;
1386
+
1387
+ double *out;
1388
+
1389
+ if (!bare_ui_kit__buffer(env, argv[1], offset, 4, &out)) {
1390
+ err = js_throw_type_error(env, NULL, "Expected an array buffer with room for 4 doubles");
65
1391
  assert(err == 0);
66
1392
 
67
- UIView *subview = (__bridge UIView *) handle;
1393
+ return NULL;
1394
+ }
1395
+
1396
+ @autoreleasepool {
1397
+ UIView *view = (__bridge UIView *) handle;
68
1398
 
69
- [view addSubview:subview];
1399
+ UIEdgeInsets value = view.safeAreaInsets;
1400
+
1401
+ out[0] = value.top;
1402
+ out[1] = value.left;
1403
+ out[2] = value.bottom;
1404
+ out[3] = value.right;
70
1405
  }
71
1406
 
72
1407
  return NULL;
73
1408
  }
1409
+
1410
+ static void
1411
+ bare_ui_kit_view_safe_area_insets_into_typed(js_value_t *receiver, int32_t bare_tag, js_value_t *bare_buffer, uint32_t bare_offset, js_typed_callback_info_t *info) {
1412
+ int err;
1413
+
1414
+ bare_ui_kit_state_t *state;
1415
+
1416
+ js_env_t *env;
1417
+ err = js_get_typed_callback_info(info, &env, (void **) &state);
1418
+ assert(err == 0);
1419
+
1420
+ id bare_object = bare_foundation_object(state->registry, bare_tag);
1421
+
1422
+ if (bare_object == nil) return;
1423
+
1424
+ double *out;
1425
+
1426
+ if (!bare_ui_kit__buffer(env, bare_buffer, bare_offset, 4, &out)) return;
1427
+
1428
+ @autoreleasepool {
1429
+ UIView *view = (UIView *) bare_object;
1430
+
1431
+ UIEdgeInsets value = view.safeAreaInsets;
1432
+
1433
+ out[0] = value.top;
1434
+ out[1] = value.left;
1435
+ out[2] = value.bottom;
1436
+ out[3] = value.right;
1437
+ }
1438
+ }