bare-gtk 0.2.1 → 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 (135) hide show
  1. package/CMakeLists.txt +16 -2
  2. package/README.md +35 -1
  3. package/binding.c +350 -1
  4. package/index.d.ts +65 -0
  5. package/index.js +32 -0
  6. package/lib/adjustment.d.ts +21 -0
  7. package/lib/adjustment.h +112 -0
  8. package/lib/adjustment.js +24 -0
  9. package/lib/bridging.h +347 -0
  10. package/lib/clipboard.d.ts +22 -0
  11. package/lib/clipboard.h +176 -0
  12. package/lib/clipboard.js +18 -0
  13. package/lib/constants.d.ts +40 -0
  14. package/lib/constants.js +51 -0
  15. package/lib/css-provider.d.ts +13 -0
  16. package/lib/css-provider.h +56 -0
  17. package/lib/css-provider.js +14 -0
  18. package/lib/cursor.d.ts +35 -0
  19. package/lib/cursor.h +220 -0
  20. package/lib/cursor.js +45 -0
  21. package/lib/device.d.ts +13 -0
  22. package/lib/device.h +35 -0
  23. package/lib/device.js +8 -0
  24. package/lib/dialog.d.ts +41 -0
  25. package/lib/dialog.js +37 -0
  26. package/lib/display.d.ts +25 -0
  27. package/lib/display.h +86 -0
  28. package/lib/display.js +23 -0
  29. package/lib/editable.h +160 -0
  30. package/lib/entry.d.ts +93 -0
  31. package/lib/entry.h +340 -0
  32. package/lib/entry.js +118 -0
  33. package/lib/event-controller-focus.d.ts +17 -0
  34. package/lib/event-controller-focus.h +55 -0
  35. package/lib/event-controller-focus.js +13 -0
  36. package/lib/event-controller-motion.d.ts +18 -0
  37. package/lib/event-controller-motion.h +66 -0
  38. package/lib/event-controller-motion.js +14 -0
  39. package/lib/event-controller.d.ts +17 -0
  40. package/lib/event-controller.h +103 -0
  41. package/lib/event-controller.js +22 -0
  42. package/lib/events.js +23 -0
  43. package/lib/fixed.d.ts +10 -0
  44. package/lib/fixed.h +28 -0
  45. package/lib/fixed.js +8 -0
  46. package/lib/frame-fixed.d.ts +10 -0
  47. package/lib/frame-fixed.js +12 -0
  48. package/lib/frame-layout-child.d.ts +17 -0
  49. package/lib/frame-layout-child.js +16 -0
  50. package/lib/frame-layout.d.ts +27 -0
  51. package/lib/frame-layout.h +291 -0
  52. package/lib/frame-layout.js +19 -0
  53. package/lib/gesture-click.d.ts +19 -0
  54. package/lib/gesture-click.h +66 -0
  55. package/lib/gesture-click.js +14 -0
  56. package/lib/gesture-drag.d.ts +25 -0
  57. package/lib/gesture-drag.h +165 -0
  58. package/lib/gesture-drag.js +23 -0
  59. package/lib/gesture-single.d.ts +13 -0
  60. package/lib/gesture-single.js +12 -0
  61. package/lib/gesture.d.ts +13 -0
  62. package/lib/gesture.h +73 -0
  63. package/lib/gesture.js +8 -0
  64. package/lib/handle.d.ts +5 -0
  65. package/lib/handle.js +6 -0
  66. package/lib/label.d.ts +36 -0
  67. package/lib/label.h +269 -0
  68. package/lib/label.js +78 -0
  69. package/lib/layout-child.d.ts +13 -0
  70. package/lib/layout-child.h +35 -0
  71. package/lib/layout-child.js +10 -0
  72. package/lib/layout-manager.d.ts +15 -0
  73. package/lib/layout-manager.h +42 -0
  74. package/lib/layout-manager.js +15 -0
  75. package/lib/message-dialog.d.ts +26 -0
  76. package/lib/message-dialog.h +190 -0
  77. package/lib/message-dialog.js +22 -0
  78. package/lib/monitor.d.ts +32 -0
  79. package/lib/monitor.h +143 -0
  80. package/lib/monitor.js +40 -0
  81. package/lib/native.h +31 -0
  82. package/lib/object.d.ts +18 -0
  83. package/lib/object.js +38 -0
  84. package/lib/paintable.d.ts +10 -0
  85. package/lib/paintable.js +3 -0
  86. package/lib/picture.d.ts +22 -0
  87. package/lib/picture.h +127 -0
  88. package/lib/picture.js +35 -0
  89. package/lib/reachable.js +11 -0
  90. package/lib/runtime.c +21 -4
  91. package/lib/scrolled-window.d.ts +22 -0
  92. package/lib/scrolled-window.h +142 -0
  93. package/lib/scrolled-window.js +37 -0
  94. package/lib/settings.d.ts +25 -0
  95. package/lib/settings.h +163 -0
  96. package/lib/settings.js +34 -0
  97. package/lib/spinner.d.ts +12 -0
  98. package/lib/spinner.h +61 -0
  99. package/lib/spinner.js +22 -0
  100. package/lib/style-context.d.ts +15 -0
  101. package/lib/style-context.h +67 -0
  102. package/lib/style-context.js +9 -0
  103. package/lib/surface.d.ts +19 -0
  104. package/lib/surface.h +61 -0
  105. package/lib/surface.js +22 -0
  106. package/lib/switch.d.ts +19 -0
  107. package/lib/switch.h +114 -0
  108. package/lib/switch.js +30 -0
  109. package/lib/text-buffer.d.ts +31 -0
  110. package/lib/text-buffer.h +246 -0
  111. package/lib/text-buffer.js +33 -0
  112. package/lib/text-view.d.ts +39 -0
  113. package/lib/text-view.h +247 -0
  114. package/lib/text-view.js +63 -0
  115. package/lib/text.d.ts +18 -0
  116. package/lib/text.h +189 -0
  117. package/lib/text.js +31 -0
  118. package/lib/texture.d.ts +20 -0
  119. package/lib/texture.h +100 -0
  120. package/lib/texture.js +17 -0
  121. package/lib/viewport.d.ts +22 -0
  122. package/lib/viewport.h +151 -0
  123. package/lib/viewport.js +38 -0
  124. package/lib/widget.d.ts +102 -0
  125. package/lib/widget.h +695 -17
  126. package/lib/widget.js +176 -11
  127. package/lib/window.d.ts +31 -0
  128. package/lib/window.h +142 -61
  129. package/lib/window.js +32 -11
  130. package/lib/wrap.js +7 -0
  131. package/package.json +12 -3
  132. package/prebuilds/linux-arm64/bare +2 -2
  133. package/prebuilds/linux-arm64/bare-gtk.bare +0 -0
  134. package/prebuilds/linux-x64/bare +2 -2
  135. package/prebuilds/linux-x64/bare-gtk.bare +0 -0
package/lib/widget.h CHANGED
@@ -1,9 +1,13 @@
1
+ #ifndef BARE_GTK_WIDGET_H
2
+ #define BARE_GTK_WIDGET_H
3
+
1
4
  #include <assert.h>
2
- #include <bare.h>
3
5
  #include <js.h>
4
6
 
5
7
  #include <gtk/gtk.h>
6
8
 
9
+ #include "bridging.h"
10
+
7
11
  static js_value_t *
8
12
  bare_gtk_widget_visible(js_env_t *env, js_callback_info_t *info) {
9
13
  int err;
@@ -11,16 +15,15 @@ bare_gtk_widget_visible(js_env_t *env, js_callback_info_t *info) {
11
15
  size_t argc = 2;
12
16
  js_value_t *argv[2];
13
17
 
14
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
18
+ bare_gtk_state_t *state;
19
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
15
20
  assert(err == 0);
16
21
 
17
22
  assert(argc == 1 || argc == 2);
18
23
 
19
- void *handle;
20
- err = js_get_value_external(env, argv[0], &handle);
21
- assert(err == 0);
22
-
23
- GtkWidget *widget = handle;
24
+ GtkWidget *widget;
25
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
26
+ if (err < 0) return NULL;
24
27
 
25
28
  js_value_t *result = NULL;
26
29
 
@@ -29,8 +32,8 @@ bare_gtk_widget_visible(js_env_t *env, js_callback_info_t *info) {
29
32
  assert(err == 0);
30
33
  } else {
31
34
  bool visible;
32
- err = js_get_value_bool(env, argv[1], &visible);
33
- assert(err == 0);
35
+ err = bare_gtk__read_bool(env, argv[1], "visible", &visible);
36
+ if (err < 0) return NULL;
34
37
 
35
38
  gtk_widget_set_visible(widget, visible);
36
39
  }
@@ -38,6 +41,128 @@ bare_gtk_widget_visible(js_env_t *env, js_callback_info_t *info) {
38
41
  return result;
39
42
  }
40
43
 
44
+ static js_value_t *
45
+ bare_gtk_widget_sensitive(js_env_t *env, js_callback_info_t *info) {
46
+ int err;
47
+
48
+ size_t argc = 2;
49
+ js_value_t *argv[2];
50
+
51
+ bare_gtk_state_t *state;
52
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
53
+ assert(err == 0);
54
+
55
+ assert(argc == 1 || argc == 2);
56
+
57
+ GtkWidget *widget;
58
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
59
+ if (err < 0) return NULL;
60
+
61
+ js_value_t *result = NULL;
62
+
63
+ if (argc == 1) {
64
+ err = js_get_boolean(env, gtk_widget_get_sensitive(widget), &result);
65
+ assert(err == 0);
66
+ } else {
67
+ bool sensitive;
68
+ err = bare_gtk__read_bool(env, argv[1], "sensitive", &sensitive);
69
+ if (err < 0) return NULL;
70
+
71
+ gtk_widget_set_sensitive(widget, sensitive);
72
+ }
73
+
74
+ return result;
75
+ }
76
+
77
+ static js_value_t *
78
+ bare_gtk_widget_can_target(js_env_t *env, js_callback_info_t *info) {
79
+ int err;
80
+
81
+ size_t argc = 2;
82
+ js_value_t *argv[2];
83
+
84
+ bare_gtk_state_t *state;
85
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
86
+ assert(err == 0);
87
+
88
+ assert(argc == 1 || argc == 2);
89
+
90
+ GtkWidget *widget;
91
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
92
+ if (err < 0) return NULL;
93
+
94
+ js_value_t *result = NULL;
95
+
96
+ if (argc == 1) {
97
+ err = js_get_boolean(env, gtk_widget_get_can_target(widget), &result);
98
+ assert(err == 0);
99
+ } else {
100
+ bool can_target;
101
+ err = bare_gtk__read_bool(env, argv[1], "can_target", &can_target);
102
+ if (err < 0) return NULL;
103
+
104
+ gtk_widget_set_can_target(widget, can_target);
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ static js_value_t *
111
+ bare_gtk_widget_cursor(js_env_t *env, js_callback_info_t *info) {
112
+ int err;
113
+
114
+ size_t argc = 2;
115
+ js_value_t *argv[2];
116
+
117
+ bare_gtk_state_t *state;
118
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
119
+ assert(err == 0);
120
+
121
+ assert(argc == 1 || argc == 2);
122
+
123
+ GtkWidget *widget;
124
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
125
+ if (err < 0) return NULL;
126
+
127
+ if (argc == 1) return bare_gtk__create_tag(env, state, gtk_widget_get_cursor(widget));
128
+
129
+ GdkCursor *cursor;
130
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[1], "cursor", (gpointer *) &cursor);
131
+ if (err < 0) return NULL;
132
+
133
+ gtk_widget_set_cursor(widget, cursor);
134
+
135
+ return NULL;
136
+ }
137
+
138
+ static js_value_t *
139
+ bare_gtk_widget_set_cursor_from_name(js_env_t *env, js_callback_info_t *info) {
140
+ int err;
141
+
142
+ size_t argc = 2;
143
+ js_value_t *argv[2];
144
+
145
+ bare_gtk_state_t *state;
146
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
147
+ assert(err == 0);
148
+
149
+ assert(argc == 2);
150
+
151
+ GtkWidget *widget;
152
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
153
+ if (err < 0) return NULL;
154
+
155
+ char *name;
156
+ err = bare_gtk__read_string_or_null(env, argv[1], "name", &name);
157
+ if (err < 0) return NULL;
158
+
159
+ gtk_widget_set_cursor_from_name(widget, name);
160
+
161
+ g_free(name);
162
+
163
+ return NULL;
164
+ }
165
+
41
166
  static js_value_t *
42
167
  bare_gtk_widget_size_request(js_env_t *env, js_callback_info_t *info) {
43
168
  int err;
@@ -45,14 +170,15 @@ bare_gtk_widget_size_request(js_env_t *env, js_callback_info_t *info) {
45
170
  size_t argc = 3;
46
171
  js_value_t *argv[3];
47
172
 
48
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
173
+ bare_gtk_state_t *state;
174
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
49
175
  assert(err == 0);
50
176
 
51
177
  assert(argc == 1 || argc == 3);
52
178
 
53
179
  GtkWidget *widget;
54
- err = js_get_value_external(env, argv[0], (void **) &widget);
55
- assert(err == 0);
180
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
181
+ if (err < 0) return NULL;
56
182
 
57
183
  js_value_t *result = NULL;
58
184
 
@@ -72,19 +198,571 @@ bare_gtk_widget_size_request(js_env_t *env, js_callback_info_t *info) {
72
198
  assert(err == 0); \
73
199
  }
74
200
  V(0, width)
75
- V(1, width)
201
+ V(1, height)
76
202
  #undef V
77
203
  } else {
78
204
  int32_t width;
79
- err = js_get_value_int32(env, argv[1], &width);
80
- assert(err == 0);
205
+ err = bare_gtk__read_int32(env, argv[1], "width", &width);
206
+ if (err < 0) return NULL;
81
207
 
82
208
  int32_t height;
83
- err = js_get_value_int32(env, argv[2], &height);
84
- assert(err == 0);
209
+ err = bare_gtk__read_int32(env, argv[2], "height", &height);
210
+ if (err < 0) return NULL;
85
211
 
86
212
  gtk_widget_set_size_request(widget, width, height);
87
213
  }
88
214
 
89
215
  return result;
90
216
  }
217
+
218
+ static js_value_t *
219
+ bare_gtk_widget_opacity(js_env_t *env, js_callback_info_t *info) {
220
+ int err;
221
+
222
+ size_t argc = 2;
223
+ js_value_t *argv[2];
224
+
225
+ bare_gtk_state_t *state;
226
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
227
+ assert(err == 0);
228
+
229
+ assert(argc == 1 || argc == 2);
230
+
231
+ GtkWidget *widget;
232
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
233
+ if (err < 0) return NULL;
234
+
235
+ js_value_t *result = NULL;
236
+
237
+ if (argc == 1) {
238
+ err = js_create_double(env, gtk_widget_get_opacity(widget), &result);
239
+ assert(err == 0);
240
+ } else {
241
+ double opacity;
242
+ err = bare_gtk__read_double(env, argv[1], "opacity", &opacity);
243
+ if (err < 0) return NULL;
244
+
245
+ gtk_widget_set_opacity(widget, opacity);
246
+ }
247
+
248
+ return result;
249
+ }
250
+
251
+ static js_value_t *
252
+ bare_gtk_widget_overflow(js_env_t *env, js_callback_info_t *info) {
253
+ int err;
254
+
255
+ size_t argc = 2;
256
+ js_value_t *argv[2];
257
+
258
+ bare_gtk_state_t *state;
259
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
260
+ assert(err == 0);
261
+
262
+ assert(argc == 1 || argc == 2);
263
+
264
+ GtkWidget *widget;
265
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
266
+ if (err < 0) return NULL;
267
+
268
+ js_value_t *result = NULL;
269
+
270
+ if (argc == 1) {
271
+ err = js_create_int32(env, gtk_widget_get_overflow(widget), &result);
272
+ assert(err == 0);
273
+ } else {
274
+ int32_t overflow;
275
+ err = bare_gtk__read_int32(env, argv[1], "overflow", &overflow);
276
+ if (err < 0) return NULL;
277
+
278
+ gtk_widget_set_overflow(widget, overflow);
279
+ }
280
+
281
+ return result;
282
+ }
283
+
284
+ static js_value_t *
285
+ bare_gtk_widget_parent(js_env_t *env, js_callback_info_t *info) {
286
+ int err;
287
+
288
+ size_t argc = 1;
289
+ js_value_t *argv[1];
290
+
291
+ bare_gtk_state_t *state;
292
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
293
+ assert(err == 0);
294
+
295
+ assert(argc == 1);
296
+
297
+ GtkWidget *widget;
298
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
299
+ if (err < 0) return NULL;
300
+
301
+ return bare_gtk__create_tag(env, state, gtk_widget_get_parent(widget));
302
+ }
303
+
304
+ static js_value_t *
305
+ bare_gtk_widget_layout_manager(js_env_t *env, js_callback_info_t *info) {
306
+ int err;
307
+
308
+ size_t argc = 2;
309
+ js_value_t *argv[2];
310
+
311
+ bare_gtk_state_t *state;
312
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
313
+ assert(err == 0);
314
+
315
+ assert(argc == 1 || argc == 2);
316
+
317
+ GtkWidget *widget;
318
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
319
+ if (err < 0) return NULL;
320
+
321
+ js_value_t *result = NULL;
322
+
323
+ if (argc == 1) {
324
+ result = bare_gtk__create_tag(env, state, gtk_widget_get_layout_manager(widget));
325
+ } else {
326
+ GtkLayoutManager *manager = NULL;
327
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[1], "layoutManager", (gpointer *) &manager);
328
+ if (err < 0) return NULL;
329
+
330
+ if (manager) g_object_ref(manager);
331
+
332
+ gtk_widget_set_layout_manager(widget, manager);
333
+ }
334
+
335
+ return result;
336
+ }
337
+
338
+ static js_value_t *
339
+ bare_gtk_widget_insert_after(js_env_t *env, js_callback_info_t *info) {
340
+ int err;
341
+
342
+ size_t argc = 3;
343
+ js_value_t *argv[3];
344
+
345
+ bare_gtk_state_t *state;
346
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
347
+ assert(err == 0);
348
+
349
+ assert(argc == 3);
350
+
351
+ GtkWidget *widget;
352
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
353
+ if (err < 0) return NULL;
354
+
355
+ GtkWidget *parent;
356
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "parent", (gpointer *) &parent);
357
+ if (err < 0) return NULL;
358
+
359
+ GtkWidget *sibling = NULL;
360
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[2], "previousSibling", (gpointer *) &sibling);
361
+ if (err < 0) return NULL;
362
+
363
+ gtk_widget_insert_after(widget, parent, sibling);
364
+
365
+ return NULL;
366
+ }
367
+
368
+ static js_value_t *
369
+ bare_gtk_widget_insert_before(js_env_t *env, js_callback_info_t *info) {
370
+ int err;
371
+
372
+ size_t argc = 3;
373
+ js_value_t *argv[3];
374
+
375
+ bare_gtk_state_t *state;
376
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
377
+ assert(err == 0);
378
+
379
+ assert(argc == 3);
380
+
381
+ GtkWidget *widget;
382
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
383
+ if (err < 0) return NULL;
384
+
385
+ GtkWidget *parent;
386
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "parent", (gpointer *) &parent);
387
+ if (err < 0) return NULL;
388
+
389
+ GtkWidget *sibling = NULL;
390
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[2], "nextSibling", (gpointer *) &sibling);
391
+ if (err < 0) return NULL;
392
+
393
+ gtk_widget_insert_before(widget, parent, sibling);
394
+
395
+ return NULL;
396
+ }
397
+
398
+ static js_value_t *
399
+ bare_gtk_widget_unparent(js_env_t *env, js_callback_info_t *info) {
400
+ int err;
401
+
402
+ size_t argc = 1;
403
+ js_value_t *argv[1];
404
+
405
+ bare_gtk_state_t *state;
406
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
407
+ assert(err == 0);
408
+
409
+ assert(argc == 1);
410
+
411
+ GtkWidget *widget;
412
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
413
+ if (err < 0) return NULL;
414
+
415
+ gtk_widget_unparent(widget);
416
+
417
+ return NULL;
418
+ }
419
+
420
+ #define V(name, fn) \
421
+ static js_value_t * \
422
+ name(js_env_t *env, js_callback_info_t *info) { \
423
+ int err; \
424
+ \
425
+ size_t argc = 1; \
426
+ js_value_t *argv[1]; \
427
+ \
428
+ bare_gtk_state_t *state; \
429
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
430
+ assert(err == 0); \
431
+ \
432
+ assert(argc == 1); \
433
+ \
434
+ GtkWidget *widget; \
435
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget); \
436
+ if (err < 0) return NULL; \
437
+ \
438
+ return bare_gtk__create_tag(env, state, fn(widget)); \
439
+ }
440
+
441
+ V(bare_gtk_widget_first_child, gtk_widget_get_first_child)
442
+ V(bare_gtk_widget_last_child, gtk_widget_get_last_child)
443
+ V(bare_gtk_widget_next_sibling, gtk_widget_get_next_sibling)
444
+ V(bare_gtk_widget_prev_sibling, gtk_widget_get_prev_sibling)
445
+ #undef V
446
+
447
+ #define V(name, fn) \
448
+ static js_value_t * \
449
+ name(js_env_t *env, js_callback_info_t *info) { \
450
+ int err; \
451
+ \
452
+ size_t argc = 1; \
453
+ js_value_t *argv[1]; \
454
+ \
455
+ bare_gtk_state_t *state; \
456
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
457
+ assert(err == 0); \
458
+ \
459
+ assert(argc == 1); \
460
+ \
461
+ GtkWidget *widget; \
462
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget); \
463
+ if (err < 0) return NULL; \
464
+ \
465
+ js_value_t *result; \
466
+ err = js_create_int32(env, fn(widget), &result); \
467
+ assert(err == 0); \
468
+ \
469
+ return result; \
470
+ }
471
+
472
+ V(bare_gtk_widget_width, gtk_widget_get_width)
473
+ V(bare_gtk_widget_height, gtk_widget_get_height)
474
+ V(bare_gtk_widget_scale_factor, gtk_widget_get_scale_factor)
475
+ #undef V
476
+
477
+ static js_value_t *
478
+ bare_gtk_widget_native(js_env_t *env, js_callback_info_t *info) {
479
+ int err;
480
+
481
+ size_t argc = 1;
482
+ js_value_t *argv[1];
483
+
484
+ bare_gtk_state_t *state;
485
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
486
+ assert(err == 0);
487
+
488
+ assert(argc == 1);
489
+
490
+ GtkWidget *widget;
491
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
492
+ if (err < 0) return NULL;
493
+
494
+ return bare_gtk__create_tag(env, state, gtk_widget_get_native(widget));
495
+ }
496
+
497
+ static js_value_t *
498
+ bare_gtk_widget_compute_bounds(js_env_t *env, js_callback_info_t *info) {
499
+ int err;
500
+
501
+ size_t argc = 2;
502
+ js_value_t *argv[2];
503
+
504
+ bare_gtk_state_t *state;
505
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
506
+ assert(err == 0);
507
+
508
+ assert(argc == 2);
509
+
510
+ GtkWidget *widget;
511
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
512
+ if (err < 0) return NULL;
513
+
514
+ GtkWidget *target;
515
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "target", (gpointer *) &target);
516
+ if (err < 0) return NULL;
517
+
518
+ graphene_rect_t bounds;
519
+
520
+ js_value_t *result;
521
+
522
+ if (!gtk_widget_compute_bounds(widget, target, &bounds)) {
523
+ err = js_get_null(env, &result);
524
+ assert(err == 0);
525
+
526
+ return result;
527
+ }
528
+
529
+ err = js_create_array_with_length(env, 4, &result);
530
+ assert(err == 0);
531
+
532
+ #define V(i, d) \
533
+ { \
534
+ js_value_t *val; \
535
+ err = js_create_double(env, d, &val); \
536
+ assert(err == 0); \
537
+ err = js_set_element(env, result, i, val); \
538
+ assert(err == 0); \
539
+ }
540
+ V(0, bounds.origin.x)
541
+ V(1, bounds.origin.y)
542
+ V(2, bounds.size.width)
543
+ V(3, bounds.size.height)
544
+ #undef V
545
+
546
+ return result;
547
+ }
548
+
549
+ static js_value_t *
550
+ bare_gtk_widget_measure(js_env_t *env, js_callback_info_t *info) {
551
+ int err;
552
+
553
+ size_t argc = 3;
554
+ js_value_t *argv[3];
555
+
556
+ bare_gtk_state_t *state;
557
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
558
+ assert(err == 0);
559
+
560
+ assert(argc == 3);
561
+
562
+ GtkWidget *widget;
563
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
564
+ if (err < 0) return NULL;
565
+
566
+ int32_t orientation;
567
+ err = bare_gtk__read_int32(env, argv[1], "orientation", &orientation);
568
+ if (err < 0) return NULL;
569
+
570
+ int32_t for_size;
571
+ err = bare_gtk__read_int32(env, argv[2], "forSize", &for_size);
572
+ if (err < 0) return NULL;
573
+
574
+ int minimum, natural, minimum_baseline, natural_baseline;
575
+ gtk_widget_measure(widget, orientation, for_size, &minimum, &natural, &minimum_baseline, &natural_baseline);
576
+
577
+ js_value_t *result;
578
+ err = js_create_array_with_length(env, 4, &result);
579
+ assert(err == 0);
580
+
581
+ #define V(i, d) \
582
+ { \
583
+ js_value_t *val; \
584
+ err = js_create_int32(env, d, &val); \
585
+ assert(err == 0); \
586
+ err = js_set_element(env, result, i, val); \
587
+ assert(err == 0); \
588
+ }
589
+ V(0, minimum)
590
+ V(1, natural)
591
+ V(2, minimum_baseline)
592
+ V(3, natural_baseline)
593
+ #undef V
594
+
595
+ return result;
596
+ }
597
+
598
+ #define V(name, fn) \
599
+ static js_value_t * \
600
+ name(js_env_t *env, js_callback_info_t *info) { \
601
+ int err; \
602
+ \
603
+ size_t argc = 2; \
604
+ js_value_t *argv[2]; \
605
+ \
606
+ bare_gtk_state_t *state; \
607
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
608
+ assert(err == 0); \
609
+ \
610
+ assert(argc == 2); \
611
+ \
612
+ GtkWidget *widget; \
613
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget); \
614
+ if (err < 0) return NULL; \
615
+ \
616
+ char *name_; \
617
+ err = bare_gtk__read_string(env, argv[1], "cssClass", &name_); \
618
+ if (err < 0) return NULL; \
619
+ \
620
+ fn(widget, name_); \
621
+ \
622
+ g_free(name_); \
623
+ \
624
+ return NULL; \
625
+ }
626
+
627
+ V(bare_gtk_widget_add_css_class, gtk_widget_add_css_class)
628
+ V(bare_gtk_widget_remove_css_class, gtk_widget_remove_css_class)
629
+ #undef V
630
+
631
+ static js_value_t *
632
+ bare_gtk_widget_has_css_class(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_gtk_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
+ GtkWidget *widget;
645
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
646
+ if (err < 0) return NULL;
647
+
648
+ char *name;
649
+ err = bare_gtk__read_string(env, argv[1], "cssClass", &name);
650
+ if (err < 0) return NULL;
651
+
652
+ js_value_t *result;
653
+ err = js_get_boolean(env, gtk_widget_has_css_class(widget, name), &result);
654
+ assert(err == 0);
655
+
656
+ g_free(name);
657
+
658
+ return result;
659
+ }
660
+
661
+ static js_value_t *
662
+ bare_gtk_widget_add_controller(js_env_t *env, js_callback_info_t *info) {
663
+ int err;
664
+
665
+ size_t argc = 2;
666
+ js_value_t *argv[2];
667
+
668
+ bare_gtk_state_t *state;
669
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
670
+ assert(err == 0);
671
+
672
+ assert(argc == 2);
673
+
674
+ GtkWidget *widget;
675
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
676
+ if (err < 0) return NULL;
677
+
678
+ GtkEventController *controller;
679
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "controller", (gpointer *) &controller);
680
+ if (err < 0) return NULL;
681
+
682
+ gtk_widget_add_controller(widget, g_object_ref(controller));
683
+
684
+ return NULL;
685
+ }
686
+
687
+ static js_value_t *
688
+ bare_gtk_widget_remove_controller(js_env_t *env, js_callback_info_t *info) {
689
+ int err;
690
+
691
+ size_t argc = 2;
692
+ js_value_t *argv[2];
693
+
694
+ bare_gtk_state_t *state;
695
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
696
+ assert(err == 0);
697
+
698
+ assert(argc == 2);
699
+
700
+ GtkWidget *widget;
701
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
702
+ if (err < 0) return NULL;
703
+
704
+ GtkEventController *controller;
705
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "controller", (gpointer *) &controller);
706
+ if (err < 0) return NULL;
707
+
708
+ gtk_widget_remove_controller(widget, controller);
709
+
710
+ return NULL;
711
+ }
712
+
713
+
714
+ static js_value_t *
715
+ bare_gtk_widget_grab_focus(js_env_t *env, js_callback_info_t *info) {
716
+ int err;
717
+
718
+ size_t argc = 1;
719
+ js_value_t *argv[1];
720
+
721
+ bare_gtk_state_t *state;
722
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
723
+ assert(err == 0);
724
+
725
+ assert(argc == 1);
726
+
727
+ GtkWidget *widget;
728
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
729
+ if (err < 0) return NULL;
730
+
731
+ js_value_t *result;
732
+ err = js_get_boolean(env, gtk_widget_grab_focus(widget), &result);
733
+ assert(err == 0);
734
+
735
+ return result;
736
+ }
737
+
738
+ // GTK moves focus through the root that holds the widget, so giving up focus is
739
+ // a different call from taking it.
740
+ static js_value_t *
741
+ bare_gtk_widget_set_root_focus(js_env_t *env, js_callback_info_t *info) {
742
+ int err;
743
+
744
+ size_t argc = 2;
745
+ js_value_t *argv[2];
746
+
747
+ bare_gtk_state_t *state;
748
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
749
+ assert(err == 0);
750
+
751
+ assert(argc == 2);
752
+
753
+ GtkWidget *widget;
754
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "widget", (gpointer *) &widget);
755
+ if (err < 0) return NULL;
756
+
757
+ GtkWidget *focus;
758
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[1], "focus", (gpointer *) &focus);
759
+ if (err < 0) return NULL;
760
+
761
+ GtkRoot *root = gtk_widget_get_root(widget);
762
+
763
+ if (root != NULL) gtk_root_set_focus(root, focus);
764
+
765
+ return NULL;
766
+ }
767
+
768
+ #endif // BARE_GTK_WIDGET_H