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.
- package/CMakeLists.txt +7 -1
- package/README.md +42 -1
- package/binding.m +558 -2
- package/index.d.ts +41 -0
- package/index.js +16 -0
- package/lib/activity-indicator-view.d.ts +29 -0
- package/lib/activity-indicator-view.h +181 -0
- package/lib/activity-indicator-view.js +56 -0
- package/lib/alert-action.d.ts +33 -0
- package/lib/alert-action.js +48 -0
- package/lib/alert-controller.d.ts +20 -0
- package/lib/alert-controller.h +199 -0
- package/lib/alert-controller.js +33 -0
- package/lib/attributed-string.d.ts +45 -0
- package/lib/attributed-string.h +176 -0
- package/lib/attributed-string.js +51 -0
- package/lib/attributes.js +34 -0
- package/lib/bezier-path.d.ts +26 -0
- package/lib/bezier-path.h +145 -0
- package/lib/bezier-path.js +51 -0
- package/lib/bridging.h +600 -2
- package/lib/color.d.ts +86 -0
- package/lib/color.h +286 -0
- package/lib/color.js +170 -0
- package/lib/events.js +35 -0
- package/lib/font-descriptor.d.ts +30 -0
- package/lib/font-descriptor.h +96 -0
- package/lib/font-descriptor.js +47 -0
- package/lib/font-metrics.d.ts +38 -0
- package/lib/font-metrics.h +109 -0
- package/lib/font-metrics.js +58 -0
- package/lib/font.d.ts +59 -0
- package/lib/font.h +424 -0
- package/lib/font.js +100 -0
- package/lib/handle.d.ts +5 -0
- package/lib/handle.js +6 -0
- package/lib/image-view.d.ts +15 -0
- package/lib/image-view.h +75 -0
- package/lib/image-view.js +27 -0
- package/lib/image.d.ts +37 -0
- package/lib/image.h +205 -0
- package/lib/image.js +60 -0
- package/lib/label.d.ts +51 -0
- package/lib/label.h +331 -0
- package/lib/label.js +94 -0
- package/lib/paragraph-style.d.ts +20 -0
- package/lib/paragraph-style.h +94 -0
- package/lib/paragraph-style.js +42 -0
- package/lib/pasteboard.d.ts +31 -0
- package/lib/pasteboard.h +123 -0
- package/lib/pasteboard.js +63 -0
- package/lib/retain.js +12 -0
- package/lib/runtime.m +92 -15
- package/lib/scene.d.ts +30 -0
- package/lib/scene.h +87 -0
- package/lib/scene.js +48 -0
- package/lib/scratch.js +4 -0
- package/lib/screen.d.ts +26 -0
- package/lib/screen.h +194 -0
- package/lib/screen.js +52 -0
- package/lib/scroll-view.d.ts +39 -0
- package/lib/scroll-view.h +246 -0
- package/lib/scroll-view.js +64 -0
- package/lib/switch.d.ts +22 -0
- package/lib/switch.h +166 -0
- package/lib/switch.js +42 -0
- package/lib/text-field.d.ts +103 -0
- package/lib/text-field.h +562 -0
- package/lib/text-field.js +183 -0
- package/lib/text-view.d.ts +59 -0
- package/lib/text-view.h +497 -0
- package/lib/text-view.js +138 -0
- package/lib/view-controller.d.ts +37 -0
- package/lib/view-controller.h +108 -20
- package/lib/view-controller.js +50 -5
- package/lib/view.d.ts +158 -0
- package/lib/view.h +1385 -20
- package/lib/view.js +276 -7
- package/lib/window.d.ts +44 -0
- package/lib/window.h +167 -27
- package/lib/window.js +62 -9
- package/lib/wrap.js +7 -0
- package/package.json +12 -3
- package/prebuilds/ios-arm64/bare +0 -0
- package/prebuilds/ios-arm64/bare-ui-kit.bare +0 -0
- package/prebuilds/ios-arm64-simulator/bare +0 -0
- package/prebuilds/ios-arm64-simulator/bare-ui-kit.bare +0 -0
- package/prebuilds/ios-x64-simulator/bare +0 -0
- 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
|
-
|
|
3
|
-
#import <bare.h>
|
|
4
|
-
#import <js.h>
|
|
987
|
+
js_value_t *result = NULL;
|
|
5
988
|
|
|
6
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
assert(err == 0);
|
|
1047
|
+
result = bare_foundation_bridge(env, state->registry, view.backgroundColor);
|
|
32
1048
|
} else {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
1393
|
+
return NULL;
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
@autoreleasepool {
|
|
1397
|
+
UIView *view = (__bridge UIView *) handle;
|
|
68
1398
|
|
|
69
|
-
|
|
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
|
+
}
|