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/bridging.h
CHANGED
|
@@ -1,8 +1,606 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import <assert.h>
|
|
1
4
|
#import <js.h>
|
|
5
|
+
#import <stdlib.h>
|
|
6
|
+
#import <utf.h>
|
|
2
7
|
|
|
8
|
+
#import <CoreGraphics/CoreGraphics.h>
|
|
3
9
|
#import <Foundation/Foundation.h>
|
|
10
|
+
#import <UIKit/UIKit.h>
|
|
11
|
+
|
|
12
|
+
#import "registry.h"
|
|
13
|
+
|
|
14
|
+
// UIKit keeps the same `UITouch` while a finger is down but gives it no number,
|
|
15
|
+
// where other platforms do. The slot a touch takes here is its number.
|
|
16
|
+
enum {
|
|
17
|
+
bare_ui_kit_touches_max = 16
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// What the addon keeps between calls. It belongs to one instantiation, because
|
|
21
|
+
// an addon can be loaded more than once in a process. Bindings reach it through
|
|
22
|
+
// their data pointer.
|
|
23
|
+
typedef struct {
|
|
24
|
+
bare_foundation_registry_t *registry;
|
|
25
|
+
|
|
26
|
+
UITouch *touches[bare_ui_kit_touches_max];
|
|
27
|
+
} bare_ui_kit_state_t;
|
|
4
28
|
|
|
5
29
|
static void
|
|
6
|
-
|
|
7
|
-
|
|
30
|
+
bare_ui_kit__on_state_release(js_env_t *env, void *data, void *finalize_hint) {
|
|
31
|
+
bare_ui_kit_state_t *state = data;
|
|
32
|
+
|
|
33
|
+
bare_foundation_registry_release(state->registry);
|
|
34
|
+
|
|
35
|
+
free(state);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static bare_ui_kit_state_t *
|
|
39
|
+
bare_ui_kit_state_create(js_env_t *env, js_value_t *exports) {
|
|
40
|
+
int err;
|
|
41
|
+
|
|
42
|
+
bare_ui_kit_state_t *state = calloc(1, sizeof(bare_ui_kit_state_t));
|
|
43
|
+
|
|
44
|
+
state->registry = bare_foundation_registry_create(env, exports);
|
|
45
|
+
|
|
46
|
+
err = js_add_finalizer(env, exports, state, bare_ui_kit__on_state_release, NULL, NULL);
|
|
47
|
+
assert(err == 0);
|
|
48
|
+
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@protocol BareEventTarget
|
|
53
|
+
|
|
54
|
+
- (int32_t)eventMask;
|
|
55
|
+
- (void)setEventMask:(int32_t)mask;
|
|
56
|
+
|
|
57
|
+
@end
|
|
58
|
+
|
|
59
|
+
// These throw a JavaScript error for a value of the wrong type. Without them,
|
|
60
|
+
// V8 would abort the whole process.
|
|
61
|
+
static bool
|
|
62
|
+
bare_ui_kit__read_number(js_env_t *env, js_value_t *value, const char *name) {
|
|
63
|
+
int err;
|
|
64
|
+
|
|
65
|
+
js_value_type_t type;
|
|
66
|
+
err = js_typeof(env, value, &type);
|
|
67
|
+
assert(err == 0);
|
|
68
|
+
|
|
69
|
+
if (type == js_number) return true;
|
|
70
|
+
|
|
71
|
+
err = js_throw_type_errorf(env, NULL, "Expected a number for '%s'", name);
|
|
72
|
+
assert(err == 0);
|
|
73
|
+
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static bool
|
|
78
|
+
bare_ui_kit__read_bool(js_env_t *env, js_value_t *value, const char *name, bool *result) {
|
|
79
|
+
int err;
|
|
80
|
+
|
|
81
|
+
js_value_type_t type;
|
|
82
|
+
err = js_typeof(env, value, &type);
|
|
83
|
+
assert(err == 0);
|
|
84
|
+
|
|
85
|
+
if (type != js_boolean) {
|
|
86
|
+
err = js_throw_type_errorf(env, NULL, "Expected a boolean for '%s'", name);
|
|
87
|
+
assert(err == 0);
|
|
88
|
+
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
err = js_get_value_bool(env, value, result);
|
|
93
|
+
assert(err == 0);
|
|
94
|
+
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static bool
|
|
99
|
+
bare_ui_kit__read_int32(js_env_t *env, js_value_t *value, const char *name, int32_t *result) {
|
|
100
|
+
if (!bare_ui_kit__read_number(env, value, name)) return false;
|
|
101
|
+
|
|
102
|
+
int err = js_get_value_int32(env, value, result);
|
|
103
|
+
assert(err == 0);
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static bool
|
|
109
|
+
bare_ui_kit__read_uint32(js_env_t *env, js_value_t *value, const char *name, uint32_t *result) {
|
|
110
|
+
if (!bare_ui_kit__read_number(env, value, name)) return false;
|
|
111
|
+
|
|
112
|
+
int err = js_get_value_uint32(env, value, result);
|
|
113
|
+
assert(err == 0);
|
|
114
|
+
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static bool
|
|
119
|
+
bare_ui_kit__read_double(js_env_t *env, js_value_t *value, const char *name, double *result) {
|
|
120
|
+
if (!bare_ui_kit__read_number(env, value, name)) return false;
|
|
121
|
+
|
|
122
|
+
int err = js_get_value_double(env, value, result);
|
|
123
|
+
assert(err == 0);
|
|
124
|
+
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Building a JavaScript object is the most expensive thing a binding does, and
|
|
129
|
+
// a typed callback cannot do it. So the caller passes a buffer and the values
|
|
130
|
+
// are written into it. Reading the buffer needs no handle scope.
|
|
131
|
+
static bool
|
|
132
|
+
bare_ui_kit__buffer(js_env_t *env, js_value_t *value, uint32_t offset, uint32_t count, double **result) {
|
|
133
|
+
int err;
|
|
134
|
+
|
|
135
|
+
bool is_arraybuffer;
|
|
136
|
+
err = js_is_arraybuffer(env, value, &is_arraybuffer);
|
|
137
|
+
assert(err == 0);
|
|
138
|
+
|
|
139
|
+
if (!is_arraybuffer) return false;
|
|
140
|
+
|
|
141
|
+
void *data;
|
|
142
|
+
size_t len;
|
|
143
|
+
err = js_get_arraybuffer_info(env, value, &data, &len);
|
|
144
|
+
assert(err == 0);
|
|
145
|
+
|
|
146
|
+
if ((uint64_t) offset + (uint64_t) count * sizeof(double) > len) return false;
|
|
147
|
+
|
|
148
|
+
*result = (double *) ((uint8_t *) data + offset);
|
|
149
|
+
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
static js_value_t *
|
|
154
|
+
bare_ui_kit__from_string(js_env_t *env, NSString *string) {
|
|
155
|
+
int err;
|
|
156
|
+
|
|
157
|
+
js_value_t *result;
|
|
158
|
+
|
|
159
|
+
if (string == nil) {
|
|
160
|
+
err = js_get_null(env, &result);
|
|
161
|
+
assert(err == 0);
|
|
162
|
+
} else {
|
|
163
|
+
err = js_create_string_utf8(env, (const utf8_t *) [string UTF8String], -1, &result);
|
|
164
|
+
assert(err == 0);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static NSString *
|
|
171
|
+
bare_ui_kit__to_string(js_env_t *env, js_value_t *value) {
|
|
172
|
+
int err;
|
|
173
|
+
|
|
174
|
+
js_value_type_t type;
|
|
175
|
+
err = js_typeof(env, value, &type);
|
|
176
|
+
assert(err == 0);
|
|
177
|
+
|
|
178
|
+
if (type == js_null || type == js_undefined) return nil;
|
|
179
|
+
|
|
180
|
+
size_t len;
|
|
181
|
+
err = js_get_value_string_utf8(env, value, NULL, 0, &len);
|
|
182
|
+
assert(err == 0);
|
|
183
|
+
|
|
184
|
+
len += 1 /* NULL */;
|
|
185
|
+
|
|
186
|
+
char *data = malloc(len);
|
|
187
|
+
|
|
188
|
+
err = js_get_value_string_utf8(env, value, (utf8_t *) data, len, &len);
|
|
189
|
+
assert(err == 0);
|
|
190
|
+
|
|
191
|
+
NSString *result = [NSString stringWithUTF8String:data];
|
|
192
|
+
|
|
193
|
+
free(data);
|
|
194
|
+
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static js_value_t *
|
|
199
|
+
bare_ui_kit__from_rect(js_env_t *env, CGRect rect) {
|
|
200
|
+
int err;
|
|
201
|
+
|
|
202
|
+
js_value_t *result;
|
|
203
|
+
err = js_create_object(env, &result);
|
|
204
|
+
assert(err == 0);
|
|
205
|
+
|
|
206
|
+
#define V(name, n) \
|
|
207
|
+
{ \
|
|
208
|
+
js_value_t *val; \
|
|
209
|
+
err = js_create_double(env, n, &val); \
|
|
210
|
+
assert(err == 0); \
|
|
211
|
+
err = js_set_named_property(env, result, name, val); \
|
|
212
|
+
assert(err == 0); \
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
V("x", rect.origin.x)
|
|
216
|
+
V("y", rect.origin.y)
|
|
217
|
+
V("width", rect.size.width)
|
|
218
|
+
V("height", rect.size.height)
|
|
219
|
+
#undef V
|
|
220
|
+
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static js_value_t *
|
|
225
|
+
bare_ui_kit__from_range(js_env_t *env, NSRange range) {
|
|
226
|
+
int err;
|
|
227
|
+
|
|
228
|
+
js_value_t *result;
|
|
229
|
+
err = js_create_object(env, &result);
|
|
230
|
+
assert(err == 0);
|
|
231
|
+
|
|
232
|
+
#define V(name, n) \
|
|
233
|
+
{ \
|
|
234
|
+
js_value_t *val; \
|
|
235
|
+
err = js_create_int32(env, (int32_t) n, &val); \
|
|
236
|
+
assert(err == 0); \
|
|
237
|
+
err = js_set_named_property(env, result, name, val); \
|
|
238
|
+
assert(err == 0); \
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
V("location", range.location)
|
|
242
|
+
V("length", range.length)
|
|
243
|
+
#undef V
|
|
244
|
+
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static js_value_t *
|
|
249
|
+
bare_ui_kit__from_size(js_env_t *env, CGSize size) {
|
|
250
|
+
int err;
|
|
251
|
+
|
|
252
|
+
js_value_t *result;
|
|
253
|
+
err = js_create_object(env, &result);
|
|
254
|
+
assert(err == 0);
|
|
255
|
+
|
|
256
|
+
#define V(name, n) \
|
|
257
|
+
{ \
|
|
258
|
+
js_value_t *val; \
|
|
259
|
+
err = js_create_double(env, n, &val); \
|
|
260
|
+
assert(err == 0); \
|
|
261
|
+
err = js_set_named_property(env, result, name, val); \
|
|
262
|
+
assert(err == 0); \
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
V("width", size.width)
|
|
266
|
+
V("height", size.height)
|
|
267
|
+
#undef V
|
|
268
|
+
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
static js_value_t *
|
|
273
|
+
bare_ui_kit__from_point(js_env_t *env, CGPoint point) {
|
|
274
|
+
int err;
|
|
275
|
+
|
|
276
|
+
js_value_t *result;
|
|
277
|
+
err = js_create_object(env, &result);
|
|
278
|
+
assert(err == 0);
|
|
279
|
+
|
|
280
|
+
#define V(name, n) \
|
|
281
|
+
{ \
|
|
282
|
+
js_value_t *val; \
|
|
283
|
+
err = js_create_double(env, n, &val); \
|
|
284
|
+
assert(err == 0); \
|
|
285
|
+
err = js_set_named_property(env, result, name, val); \
|
|
286
|
+
assert(err == 0); \
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
V("x", point.x)
|
|
290
|
+
V("y", point.y)
|
|
291
|
+
#undef V
|
|
292
|
+
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Only these text attributes cross. Anything else in the object is ignored.
|
|
297
|
+
#define BARE_UI_KIT_ATTRIBUTES(V) \
|
|
298
|
+
V("font", NSFontAttributeName) \
|
|
299
|
+
V("foregroundColor", NSForegroundColorAttributeName) \
|
|
300
|
+
V("backgroundColor", NSBackgroundColorAttributeName) \
|
|
301
|
+
V("paragraphStyle", NSParagraphStyleAttributeName)
|
|
302
|
+
|
|
303
|
+
// The attributes that are numbers rather than objects.
|
|
304
|
+
#define BARE_UI_KIT_ATTRIBUTES_NUMBER(V) \
|
|
305
|
+
V("kern", NSKernAttributeName) \
|
|
306
|
+
V("baselineOffset", NSBaselineOffsetAttributeName) \
|
|
307
|
+
V("underlineStyle", NSUnderlineStyleAttributeName) \
|
|
308
|
+
V("strikethroughStyle", NSStrikethroughStyleAttributeName)
|
|
309
|
+
|
|
310
|
+
static js_value_t *
|
|
311
|
+
bare_ui_kit__from_attributes(js_env_t *env, bare_ui_kit_state_t *state, NSDictionary<NSAttributedStringKey, id> *attributes) {
|
|
312
|
+
int err;
|
|
313
|
+
|
|
314
|
+
js_value_t *result;
|
|
315
|
+
err = js_create_object(env, &result);
|
|
316
|
+
assert(err == 0);
|
|
317
|
+
|
|
318
|
+
#define V(key, name) \
|
|
319
|
+
if (attributes[name] != nil) { \
|
|
320
|
+
err = js_set_named_property(env, result, key, bare_foundation_bridge(env, state->registry, attributes[name])); \
|
|
321
|
+
assert(err == 0); \
|
|
322
|
+
}
|
|
323
|
+
BARE_UI_KIT_ATTRIBUTES(V)
|
|
324
|
+
#undef V
|
|
325
|
+
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
static NSDictionary<NSAttributedStringKey, id> *
|
|
330
|
+
bare_ui_kit__to_attributes(js_env_t *env, bare_ui_kit_state_t *state, js_value_t *value) {
|
|
331
|
+
int err;
|
|
332
|
+
|
|
333
|
+
js_value_type_t type;
|
|
334
|
+
err = js_typeof(env, value, &type);
|
|
335
|
+
assert(err == 0);
|
|
336
|
+
|
|
337
|
+
NSMutableDictionary<NSAttributedStringKey, id> *result = [NSMutableDictionary dictionary];
|
|
338
|
+
|
|
339
|
+
if (type != js_object) return result;
|
|
340
|
+
|
|
341
|
+
#define V(key, name) \
|
|
342
|
+
{ \
|
|
343
|
+
js_value_t *val; \
|
|
344
|
+
err = js_get_named_property(env, value, key, &val); \
|
|
345
|
+
assert(err == 0); \
|
|
346
|
+
id object = bare_foundation_to_object(env, state->registry, val); \
|
|
347
|
+
if (object != nil) result[name] = object; \
|
|
348
|
+
}
|
|
349
|
+
BARE_UI_KIT_ATTRIBUTES(V)
|
|
350
|
+
#undef V
|
|
351
|
+
|
|
352
|
+
#define V(key, name) \
|
|
353
|
+
{ \
|
|
354
|
+
js_value_t *val; \
|
|
355
|
+
err = js_get_named_property(env, value, key, &val); \
|
|
356
|
+
assert(err == 0); \
|
|
357
|
+
js_value_type_t t; \
|
|
358
|
+
err = js_typeof(env, val, &t); \
|
|
359
|
+
assert(err == 0); \
|
|
360
|
+
if (t == js_number) { \
|
|
361
|
+
double n; \
|
|
362
|
+
err = js_get_value_double(env, val, &n); \
|
|
363
|
+
assert(err == 0); \
|
|
364
|
+
result[name] = @(n); \
|
|
365
|
+
} \
|
|
366
|
+
}
|
|
367
|
+
BARE_UI_KIT_ATTRIBUTES_NUMBER(V)
|
|
368
|
+
#undef V
|
|
369
|
+
|
|
370
|
+
return result;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
static js_value_t *
|
|
374
|
+
bare_ui_kit__from_objects(js_env_t *env, bare_ui_kit_state_t *state, NSArray *objects) {
|
|
375
|
+
int err;
|
|
376
|
+
|
|
377
|
+
js_value_t *result;
|
|
378
|
+
err = js_create_array_with_length(env, objects.count, &result);
|
|
379
|
+
assert(err == 0);
|
|
380
|
+
|
|
381
|
+
for (NSUInteger i = 0, n = objects.count; i < n; i++) {
|
|
382
|
+
err = js_set_element(env, result, (uint32_t) i, bare_foundation_bridge(env, state->registry, objects[i]));
|
|
383
|
+
assert(err == 0);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
static bool
|
|
390
|
+
bare_ui_kit__handler(js_env_t *env, js_value_t *receiver, const char *name, js_value_t **result) {
|
|
391
|
+
int err = js_get_named_property(env, receiver, name, result);
|
|
392
|
+
assert(err == 0);
|
|
393
|
+
|
|
394
|
+
js_value_type_t type;
|
|
395
|
+
err = js_typeof(env, *result, &type);
|
|
396
|
+
assert(err == 0);
|
|
397
|
+
|
|
398
|
+
return type == js_function;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
static void
|
|
402
|
+
bare_ui_kit__emit(js_env_t *env, js_ref_t *ctx, const char *name) {
|
|
403
|
+
int err;
|
|
404
|
+
|
|
405
|
+
js_handle_scope_t *scope;
|
|
406
|
+
err = js_open_handle_scope(env, &scope);
|
|
407
|
+
assert(err == 0);
|
|
408
|
+
|
|
409
|
+
js_value_t *receiver;
|
|
410
|
+
err = js_get_reference_value(env, ctx, &receiver);
|
|
411
|
+
assert(err == 0);
|
|
412
|
+
|
|
413
|
+
// The context is weak, so it is empty once the wrapper has been collected.
|
|
414
|
+
js_value_t *fn;
|
|
415
|
+
|
|
416
|
+
if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
|
|
417
|
+
err = js_call_function(env, receiver, fn, 0, NULL, NULL);
|
|
418
|
+
(void) err;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
err = js_close_handle_scope(env, scope);
|
|
422
|
+
assert(err == 0);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Events pass their values as arguments rather than as an object, because a
|
|
426
|
+
// move fires on every frame and an object each time would allocate on every
|
|
427
|
+
// frame.
|
|
428
|
+
static void
|
|
429
|
+
bare_ui_kit__emit_event(js_env_t *env, js_ref_t *ctx, const char *name, int32_t type, double x, double y, int32_t pointer) {
|
|
430
|
+
int err;
|
|
431
|
+
|
|
432
|
+
js_handle_scope_t *scope;
|
|
433
|
+
err = js_open_handle_scope(env, &scope);
|
|
434
|
+
assert(err == 0);
|
|
435
|
+
|
|
436
|
+
js_value_t *receiver;
|
|
437
|
+
err = js_get_reference_value(env, ctx, &receiver);
|
|
438
|
+
assert(err == 0);
|
|
439
|
+
|
|
440
|
+
js_value_t *fn;
|
|
441
|
+
|
|
442
|
+
if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
|
|
443
|
+
js_value_t *argv[4];
|
|
444
|
+
|
|
445
|
+
err = js_create_int32(env, type, &argv[0]);
|
|
446
|
+
assert(err == 0);
|
|
447
|
+
|
|
448
|
+
err = js_create_double(env, x, &argv[1]);
|
|
449
|
+
assert(err == 0);
|
|
450
|
+
|
|
451
|
+
err = js_create_double(env, y, &argv[2]);
|
|
452
|
+
assert(err == 0);
|
|
453
|
+
|
|
454
|
+
err = js_create_int32(env, pointer, &argv[3]);
|
|
455
|
+
assert(err == 0);
|
|
456
|
+
|
|
457
|
+
err = js_call_function(env, receiver, fn, 4, argv, NULL);
|
|
458
|
+
(void) err;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
err = js_close_handle_scope(env, scope);
|
|
462
|
+
assert(err == 0);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Emit an edit before it happens, as the range it replaces and the new text.
|
|
466
|
+
static void
|
|
467
|
+
bare_ui_kit__emit_replacement(js_env_t *env, js_ref_t *ctx, const char *name, int32_t location, int32_t length, NSString *string) {
|
|
468
|
+
int err;
|
|
469
|
+
|
|
470
|
+
js_handle_scope_t *scope;
|
|
471
|
+
err = js_open_handle_scope(env, &scope);
|
|
472
|
+
assert(err == 0);
|
|
473
|
+
|
|
474
|
+
js_value_t *receiver;
|
|
475
|
+
err = js_get_reference_value(env, ctx, &receiver);
|
|
476
|
+
assert(err == 0);
|
|
477
|
+
|
|
478
|
+
js_value_t *fn;
|
|
479
|
+
|
|
480
|
+
if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
|
|
481
|
+
js_value_t *argv[3];
|
|
482
|
+
|
|
483
|
+
err = js_create_int32(env, location, &argv[0]);
|
|
484
|
+
assert(err == 0);
|
|
485
|
+
|
|
486
|
+
err = js_create_int32(env, length, &argv[1]);
|
|
487
|
+
assert(err == 0);
|
|
488
|
+
|
|
489
|
+
argv[2] = bare_ui_kit__from_string(env, string);
|
|
490
|
+
|
|
491
|
+
err = js_call_function(env, receiver, fn, 3, argv, NULL);
|
|
492
|
+
(void) err;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
err = js_close_handle_scope(env, scope);
|
|
496
|
+
assert(err == 0);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
static void
|
|
500
|
+
bare_ui_kit__emit_rect(js_env_t *env, js_ref_t *ctx, const char *name, CGRect rect) {
|
|
501
|
+
int err;
|
|
502
|
+
|
|
503
|
+
js_handle_scope_t *scope;
|
|
504
|
+
err = js_open_handle_scope(env, &scope);
|
|
505
|
+
assert(err == 0);
|
|
506
|
+
|
|
507
|
+
js_value_t *receiver;
|
|
508
|
+
err = js_get_reference_value(env, ctx, &receiver);
|
|
509
|
+
assert(err == 0);
|
|
510
|
+
|
|
511
|
+
js_value_t *fn;
|
|
512
|
+
|
|
513
|
+
if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
|
|
514
|
+
js_value_t *argv[4];
|
|
515
|
+
|
|
516
|
+
err = js_create_double(env, rect.origin.x, &argv[0]);
|
|
517
|
+
assert(err == 0);
|
|
518
|
+
|
|
519
|
+
err = js_create_double(env, rect.origin.y, &argv[1]);
|
|
520
|
+
assert(err == 0);
|
|
521
|
+
|
|
522
|
+
err = js_create_double(env, rect.size.width, &argv[2]);
|
|
523
|
+
assert(err == 0);
|
|
524
|
+
|
|
525
|
+
err = js_create_double(env, rect.size.height, &argv[3]);
|
|
526
|
+
assert(err == 0);
|
|
527
|
+
|
|
528
|
+
err = js_call_function(env, receiver, fn, 4, argv, NULL);
|
|
529
|
+
(void) err;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
err = js_close_handle_scope(env, scope);
|
|
533
|
+
assert(err == 0);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
static void
|
|
537
|
+
bare_ui_kit__emit_point(js_env_t *env, js_ref_t *ctx, const char *name, double x, double y) {
|
|
538
|
+
int err;
|
|
539
|
+
|
|
540
|
+
js_handle_scope_t *scope;
|
|
541
|
+
err = js_open_handle_scope(env, &scope);
|
|
542
|
+
assert(err == 0);
|
|
543
|
+
|
|
544
|
+
js_value_t *receiver;
|
|
545
|
+
err = js_get_reference_value(env, ctx, &receiver);
|
|
546
|
+
assert(err == 0);
|
|
547
|
+
|
|
548
|
+
js_value_t *fn;
|
|
549
|
+
|
|
550
|
+
if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
|
|
551
|
+
js_value_t *argv[2];
|
|
552
|
+
|
|
553
|
+
err = js_create_double(env, x, &argv[0]);
|
|
554
|
+
assert(err == 0);
|
|
555
|
+
|
|
556
|
+
err = js_create_double(env, y, &argv[1]);
|
|
557
|
+
assert(err == 0);
|
|
558
|
+
|
|
559
|
+
err = js_call_function(env, receiver, fn, 2, argv, NULL);
|
|
560
|
+
(void) err;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
err = js_close_handle_scope(env, scope);
|
|
564
|
+
assert(err == 0);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
static js_value_t *
|
|
568
|
+
bare_ui_kit_event_mask(js_env_t *env, js_callback_info_t *info) {
|
|
569
|
+
int err;
|
|
570
|
+
|
|
571
|
+
size_t argc = 2;
|
|
572
|
+
js_value_t *argv[2];
|
|
573
|
+
|
|
574
|
+
bare_ui_kit_state_t *state;
|
|
575
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
576
|
+
assert(err == 0);
|
|
577
|
+
|
|
578
|
+
assert(argc == 1 || argc == 2);
|
|
579
|
+
|
|
580
|
+
void *handle;
|
|
581
|
+
if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
|
|
582
|
+
|
|
583
|
+
js_value_t *result = NULL;
|
|
584
|
+
|
|
585
|
+
@autoreleasepool {
|
|
586
|
+
id object = (__bridge id) handle;
|
|
587
|
+
|
|
588
|
+
// An object of a plain UIKit class has nothing to report, so listening to
|
|
589
|
+
// it does nothing.
|
|
590
|
+
if (![object conformsToProtocol:@protocol(BareEventTarget)]) return NULL;
|
|
591
|
+
|
|
592
|
+
id<BareEventTarget> target = object;
|
|
593
|
+
|
|
594
|
+
if (argc == 1) {
|
|
595
|
+
err = js_create_int32(env, target.eventMask, &result);
|
|
596
|
+
assert(err == 0);
|
|
597
|
+
} else {
|
|
598
|
+
int32_t mask;
|
|
599
|
+
if (!bare_ui_kit__read_int32(env, argv[1], "mask", &mask)) return NULL;
|
|
600
|
+
|
|
601
|
+
target.eventMask = mask;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
return result;
|
|
8
606
|
}
|
package/lib/color.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { tag, handle, Handle, Wrapper } from 'bare-foundation-registry'
|
|
2
|
+
|
|
3
|
+
/** A colour, as a `UIColor`. System colours follow light and dark mode. */
|
|
4
|
+
interface UIKitColor {
|
|
5
|
+
/** The components of the colour. A colour that has none, such as a pattern, reports zeroes. */
|
|
6
|
+
readonly components: { red: number; green: number; blue: number; alpha: number }
|
|
7
|
+
|
|
8
|
+
withAlphaComponent(alpha: number): UIKitColor
|
|
9
|
+
|
|
10
|
+
readonly [tag]: number
|
|
11
|
+
|
|
12
|
+
readonly [handle]: Handle
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare class UIKitColor {
|
|
16
|
+
protected constructor()
|
|
17
|
+
|
|
18
|
+
/** A colour from components between 0 and 1. */
|
|
19
|
+
static rgb(red: number, green: number, blue: number, alpha?: number): UIKitColor
|
|
20
|
+
|
|
21
|
+
static hsb(hue: number, saturation: number, brightness: number, alpha?: number): UIKitColor
|
|
22
|
+
|
|
23
|
+
static white(white: number, alpha?: number): UIKitColor
|
|
24
|
+
|
|
25
|
+
static readonly blackColor: UIKitColor
|
|
26
|
+
|
|
27
|
+
static readonly whiteColor: UIKitColor
|
|
28
|
+
|
|
29
|
+
static readonly clearColor: UIKitColor
|
|
30
|
+
|
|
31
|
+
static readonly labelColor: UIKitColor
|
|
32
|
+
|
|
33
|
+
static readonly secondaryLabelColor: UIKitColor
|
|
34
|
+
|
|
35
|
+
static readonly tertiaryLabelColor: UIKitColor
|
|
36
|
+
|
|
37
|
+
static readonly quaternaryLabelColor: UIKitColor
|
|
38
|
+
|
|
39
|
+
static readonly placeholderTextColor: UIKitColor
|
|
40
|
+
|
|
41
|
+
static readonly separatorColor: UIKitColor
|
|
42
|
+
|
|
43
|
+
static readonly opaqueSeparatorColor: UIKitColor
|
|
44
|
+
|
|
45
|
+
static readonly linkColor: UIKitColor
|
|
46
|
+
|
|
47
|
+
static readonly systemBackgroundColor: UIKitColor
|
|
48
|
+
|
|
49
|
+
static readonly secondarySystemBackgroundColor: UIKitColor
|
|
50
|
+
|
|
51
|
+
static readonly tertiarySystemBackgroundColor: UIKitColor
|
|
52
|
+
|
|
53
|
+
static readonly systemGroupedBackgroundColor: UIKitColor
|
|
54
|
+
|
|
55
|
+
static readonly systemFillColor: UIKitColor
|
|
56
|
+
|
|
57
|
+
static readonly tintColor: UIKitColor
|
|
58
|
+
|
|
59
|
+
static readonly systemRedColor: UIKitColor
|
|
60
|
+
|
|
61
|
+
static readonly systemOrangeColor: UIKitColor
|
|
62
|
+
|
|
63
|
+
static readonly systemYellowColor: UIKitColor
|
|
64
|
+
|
|
65
|
+
static readonly systemGreenColor: UIKitColor
|
|
66
|
+
|
|
67
|
+
static readonly systemMintColor: UIKitColor
|
|
68
|
+
|
|
69
|
+
static readonly systemTealColor: UIKitColor
|
|
70
|
+
|
|
71
|
+
static readonly systemCyanColor: UIKitColor
|
|
72
|
+
|
|
73
|
+
static readonly systemBlueColor: UIKitColor
|
|
74
|
+
|
|
75
|
+
static readonly systemIndigoColor: UIKitColor
|
|
76
|
+
|
|
77
|
+
static readonly systemPurpleColor: UIKitColor
|
|
78
|
+
|
|
79
|
+
static readonly systemPinkColor: UIKitColor
|
|
80
|
+
|
|
81
|
+
static readonly systemBrownColor: UIKitColor
|
|
82
|
+
|
|
83
|
+
static readonly systemGrayColor: UIKitColor
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export = UIKitColor
|