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
@@ -0,0 +1,291 @@
1
+ #ifndef BARE_GTK_FRAME_LAYOUT_H
2
+ #define BARE_GTK_FRAME_LAYOUT_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+
11
+ // Gives each child an exact frame. The stock layout managers size a child from
12
+ // what it prefers, and a size request only sets a minimum.
13
+
14
+ enum {
15
+ bare_gtk_frame_layout_event_resize = 1 << 0,
16
+ };
17
+
18
+ #define BARE_TYPE_FRAME_LAYOUT_CHILD (bare_frame_layout_child_get_type())
19
+
20
+ G_DECLARE_FINAL_TYPE(BareFrameLayoutChild, bare_frame_layout_child, BARE, FRAME_LAYOUT_CHILD, GtkLayoutChild)
21
+
22
+ struct _BareFrameLayoutChild {
23
+ GtkLayoutChild handle;
24
+
25
+ graphene_rect_t frame;
26
+ graphene_matrix_t transform;
27
+ bool transformed;
28
+ };
29
+
30
+ G_DEFINE_TYPE(BareFrameLayoutChild, bare_frame_layout_child, GTK_TYPE_LAYOUT_CHILD)
31
+
32
+ static void
33
+ bare_frame_layout_child_init(BareFrameLayoutChild *self) {
34
+ self->frame = GRAPHENE_RECT_INIT(0, 0, 0, 0);
35
+ self->transformed = false;
36
+ }
37
+
38
+ static void
39
+ bare_frame_layout_child_class_init(BareFrameLayoutChildClass *class) {}
40
+
41
+ #define BARE_TYPE_FRAME_LAYOUT (bare_frame_layout_get_type())
42
+
43
+ G_DECLARE_FINAL_TYPE(BareFrameLayout, bare_frame_layout, BARE, FRAME_LAYOUT, GtkLayoutManager)
44
+
45
+ struct _BareFrameLayout {
46
+ GtkLayoutManager handle;
47
+
48
+ bare_gtk_state_t *state;
49
+
50
+ uint32_t events;
51
+ int width, height;
52
+ };
53
+
54
+ G_DEFINE_TYPE(BareFrameLayout, bare_frame_layout, GTK_TYPE_LAYOUT_MANAGER)
55
+
56
+ static void
57
+ bare_frame_layout_measure(GtkLayoutManager *manager, GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) {
58
+ int content = 0;
59
+
60
+ for (GtkWidget *child = gtk_widget_get_first_child(widget); child; child = gtk_widget_get_next_sibling(child)) {
61
+ BareFrameLayoutChild *layout_child = BARE_FRAME_LAYOUT_CHILD(gtk_layout_manager_get_layout_child(manager, child));
62
+
63
+ graphene_rect_t *frame = &layout_child->frame;
64
+
65
+ int edge = orientation == GTK_ORIENTATION_HORIZONTAL
66
+ ? (int) (frame->origin.x + frame->size.width)
67
+ : (int) (frame->origin.y + frame->size.height);
68
+
69
+ if (edge > content) content = edge;
70
+ }
71
+
72
+ // Report the size of everything placed, so a scrolled window knows how much
73
+ // it holds. The minimum stays zero, so a viewport can be smaller than its
74
+ // child.
75
+ *minimum = 0;
76
+ *natural = content;
77
+ *minimum_baseline = -1;
78
+ *natural_baseline = -1;
79
+ }
80
+
81
+ static void
82
+ bare_frame_layout_allocate(GtkLayoutManager *manager, GtkWidget *widget, int width, int height, int baseline) {
83
+ BareFrameLayout *self = BARE_FRAME_LAYOUT(manager);
84
+
85
+ // Before the children are placed, so frames set by a listener apply in this
86
+ // pass. A listener must not change the widget tree.
87
+ if (self->width != width || self->height != height) {
88
+ self->width = width;
89
+ self->height = height;
90
+
91
+ if (self->state && self->events & bare_gtk_frame_layout_event_resize) {
92
+ bare_gtk__emit(self->state, self, "resize", 2, (const double[]) {width, height});
93
+ }
94
+ }
95
+
96
+ for (GtkWidget *child = gtk_widget_get_first_child(widget); child; child = gtk_widget_get_next_sibling(child)) {
97
+ BareFrameLayoutChild *layout_child = BARE_FRAME_LAYOUT_CHILD(gtk_layout_manager_get_layout_child(manager, child));
98
+
99
+ graphene_rect_t *frame = &layout_child->frame;
100
+
101
+ GskTransform *transform = gsk_transform_translate(NULL, &GRAPHENE_POINT_INIT(frame->origin.x, frame->origin.y));
102
+
103
+ // A widget is drawn through the transform its parent gives it, so the
104
+ // child's own transform is added to the translation that places it.
105
+ if (layout_child->transformed) {
106
+ transform = gsk_transform_matrix(transform, &layout_child->transform);
107
+ }
108
+
109
+ gtk_widget_allocate(child, (int) frame->size.width, (int) frame->size.height, -1, transform);
110
+ }
111
+ }
112
+
113
+ static GtkLayoutChild *
114
+ bare_frame_layout_create_layout_child(GtkLayoutManager *manager, GtkWidget *widget, GtkWidget *for_child) {
115
+ return g_object_new(BARE_TYPE_FRAME_LAYOUT_CHILD, "layout-manager", manager, "child-widget", for_child, NULL);
116
+ }
117
+
118
+ static void
119
+ bare_frame_layout_init(BareFrameLayout *self) {}
120
+
121
+ static void
122
+ bare_frame_layout_class_init(BareFrameLayoutClass *class) {
123
+ GtkLayoutManagerClass *layout_class = GTK_LAYOUT_MANAGER_CLASS(class);
124
+
125
+ layout_class->measure = bare_frame_layout_measure;
126
+ layout_class->allocate = bare_frame_layout_allocate;
127
+ layout_class->create_layout_child = bare_frame_layout_create_layout_child;
128
+ layout_class->layout_child_type = BARE_TYPE_FRAME_LAYOUT_CHILD;
129
+ }
130
+
131
+ static js_value_t *
132
+ bare_gtk_frame_layout_init(js_env_t *env, js_callback_info_t *info) {
133
+ int err;
134
+
135
+ bare_gtk_state_t *state;
136
+ err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
137
+ assert(err == 0);
138
+
139
+ BareFrameLayout *layout = g_object_new(BARE_TYPE_FRAME_LAYOUT, NULL);
140
+
141
+ layout->state = state;
142
+
143
+ js_value_t *result;
144
+ err = js_create_uint32(env, bare_gobject_tag(state->registry, layout), &result);
145
+ assert(err == 0);
146
+
147
+ return result;
148
+ }
149
+
150
+ static js_value_t *
151
+ bare_gtk_frame_layout_event_mask(js_env_t *env, js_callback_info_t *info) {
152
+ int err;
153
+
154
+ size_t argc = 2;
155
+ js_value_t *argv[2];
156
+
157
+ bare_gtk_state_t *state;
158
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
159
+ assert(err == 0);
160
+
161
+ assert(argc == 1 || argc == 2);
162
+
163
+ BareFrameLayout *layout;
164
+ err = bare_gobject_read_type(env, state->registry, argv[0], "frameLayout", BARE_TYPE_FRAME_LAYOUT, (gpointer *) &layout);
165
+ if (err < 0) return NULL;
166
+
167
+ if (argc == 1) {
168
+ js_value_t *result;
169
+ err = js_create_uint32(env, layout->events, &result);
170
+ assert(err == 0);
171
+
172
+ return result;
173
+ }
174
+
175
+ err = bare_gtk__read_uint32(env, argv[1], "events", &layout->events);
176
+ if (err < 0) return NULL;
177
+
178
+ return NULL;
179
+ }
180
+
181
+ static js_value_t *
182
+ bare_gtk_frame_layout_child_frame(js_env_t *env, js_callback_info_t *info) {
183
+ int err;
184
+
185
+ size_t argc = 5;
186
+ js_value_t *argv[5];
187
+
188
+ bare_gtk_state_t *state;
189
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
190
+ assert(err == 0);
191
+
192
+ assert(argc == 1 || argc == 5);
193
+
194
+ BareFrameLayoutChild *layout_child;
195
+ err = bare_gobject_read_type(env, state->registry, argv[0], "layoutChild", BARE_TYPE_FRAME_LAYOUT_CHILD, (gpointer *) &layout_child);
196
+ if (err < 0) return NULL;
197
+
198
+ js_value_t *result = NULL;
199
+
200
+ if (argc == 1) {
201
+ graphene_rect_t *frame = &layout_child->frame;
202
+
203
+ err = js_create_array_with_length(env, 4, &result);
204
+ assert(err == 0);
205
+
206
+ #define V(i, d) \
207
+ { \
208
+ js_value_t *val; \
209
+ err = js_create_double(env, d, &val); \
210
+ assert(err == 0); \
211
+ err = js_set_element(env, result, i, val); \
212
+ assert(err == 0); \
213
+ }
214
+ V(0, frame->origin.x)
215
+ V(1, frame->origin.y)
216
+ V(2, frame->size.width)
217
+ V(3, frame->size.height)
218
+ #undef V
219
+ } else {
220
+ double frame[4];
221
+
222
+ #define V(i, name) \
223
+ { \
224
+ err = bare_gtk__read_double(env, argv[i + 1], name, &frame[i]); \
225
+ if (err < 0) return NULL; \
226
+ }
227
+ V(0, "x")
228
+ V(1, "y")
229
+ V(2, "width")
230
+ V(3, "height")
231
+ #undef V
232
+
233
+ layout_child->frame = GRAPHENE_RECT_INIT((float) frame[0], (float) frame[1], (float) frame[2], (float) frame[3]);
234
+
235
+ gtk_layout_manager_layout_changed(gtk_layout_child_get_layout_manager(GTK_LAYOUT_CHILD(layout_child)));
236
+ }
237
+
238
+ return result;
239
+ }
240
+
241
+ // A `graphene_matrix_t` is sixteen numbers in the order CSS uses for
242
+ // `matrix3d()`.
243
+ static js_value_t *
244
+ bare_gtk_frame_layout_child_transform(js_env_t *env, js_callback_info_t *info) {
245
+ int err;
246
+
247
+ size_t argc = 2;
248
+ js_value_t *argv[2];
249
+
250
+ bare_gtk_state_t *state;
251
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
252
+ assert(err == 0);
253
+
254
+ assert(argc == 2);
255
+
256
+ BareFrameLayoutChild *layout_child;
257
+ err = bare_gobject_read_type(env, state->registry, argv[0], "layoutChild", BARE_TYPE_FRAME_LAYOUT_CHILD, (gpointer *) &layout_child);
258
+ if (err < 0) return NULL;
259
+
260
+ js_value_type_t type;
261
+ err = js_typeof(env, argv[1], &type);
262
+ assert(err == 0);
263
+
264
+ if (type == js_null) {
265
+ layout_child->transformed = false;
266
+ } else {
267
+ float components[16];
268
+
269
+ for (uint32_t i = 0; i < 16; i++) {
270
+ js_value_t *element;
271
+ err = js_get_element(env, argv[1], i, &element);
272
+ assert(err == 0);
273
+
274
+ double component;
275
+ err = bare_gtk__read_double(env, element, "transform", &component);
276
+ if (err < 0) return NULL;
277
+
278
+ components[i] = (float) component;
279
+ }
280
+
281
+ graphene_matrix_init_from_float(&layout_child->transform, components);
282
+
283
+ layout_child->transformed = true;
284
+ }
285
+
286
+ gtk_layout_manager_layout_changed(gtk_layout_child_get_layout_manager(GTK_LAYOUT_CHILD(layout_child)));
287
+
288
+ return NULL;
289
+ }
290
+
291
+ #endif // BARE_GTK_FRAME_LAYOUT_H
@@ -0,0 +1,19 @@
1
+ const binding = require('../binding')
2
+ const BareFrameLayoutChild = require('./frame-layout-child')
3
+ const GTKLayoutManager = require('./layout-manager')
4
+
5
+ module.exports = exports = class BareFrameLayout extends GTKLayoutManager {
6
+ static layoutChild = BareFrameLayoutChild
7
+
8
+ static _events = {
9
+ resize: binding.FRAME_LAYOUT_EVENT_RESIZE
10
+ }
11
+
12
+ _init(opts) {
13
+ return binding.frameLayoutInit()
14
+ }
15
+
16
+ _eventMask(mask) {
17
+ binding.frameLayoutEventMask(this._tag, mask)
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ import GTKGestureSingle = require('./gesture-single')
2
+
3
+ /** Reports clicks and taps, as a `GtkGestureClick`. */
4
+ interface GTKGestureClick extends GTKGestureSingle<GTKGestureClick.Events> {}
5
+
6
+ declare class GTKGestureClick {
7
+ constructor()
8
+ }
9
+
10
+ declare namespace GTKGestureClick {
11
+ export interface Events {
12
+ /** `presses` counts quick repeated clicks, so 2 is a double click. */
13
+ pressed: [presses: number, x: number, y: number]
14
+ released: [presses: number, x: number, y: number]
15
+ cancel: []
16
+ }
17
+ }
18
+
19
+ export = GTKGestureClick
@@ -0,0 +1,66 @@
1
+ #ifndef BARE_GTK_GESTURE_CLICK_H
2
+ #define BARE_GTK_GESTURE_CLICK_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+ #include "event-controller.h"
11
+
12
+ enum {
13
+ bare_gtk_gesture_click_event_pressed = 1 << 0,
14
+ bare_gtk_gesture_click_event_released = 1 << 1,
15
+ bare_gtk_gesture_click_event_cancel = 1 << 2,
16
+ };
17
+
18
+ static void
19
+ bare_gtk_gesture_click__on_pressed(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) {
20
+ bare_gtk_state_t *state = data;
21
+
22
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_click_event_pressed) == 0) return;
23
+
24
+ bare_gtk__emit(state, gesture, "pressed", 3, (const double[]) {n_press, x, y});
25
+ }
26
+
27
+ static void
28
+ bare_gtk_gesture_click__on_released(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) {
29
+ bare_gtk_state_t *state = data;
30
+
31
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_click_event_released) == 0) return;
32
+
33
+ bare_gtk__emit(state, gesture, "released", 3, (const double[]) {n_press, x, y});
34
+ }
35
+
36
+ static void
37
+ bare_gtk_gesture_click__on_cancel(GtkGesture *gesture, GdkEventSequence *sequence, gpointer data) {
38
+ bare_gtk_state_t *state = data;
39
+
40
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_click_event_cancel) == 0) return;
41
+
42
+ bare_gtk__emit(state, gesture, "cancel", 0, NULL);
43
+ }
44
+
45
+ static js_value_t *
46
+ bare_gtk_gesture_click_init(js_env_t *env, js_callback_info_t *info) {
47
+ int err;
48
+
49
+ bare_gtk_state_t *state;
50
+ err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
51
+ assert(err == 0);
52
+
53
+ GtkGesture *gesture = gtk_gesture_click_new();
54
+
55
+ g_signal_connect(gesture, "pressed", G_CALLBACK(bare_gtk_gesture_click__on_pressed), state);
56
+ g_signal_connect(gesture, "released", G_CALLBACK(bare_gtk_gesture_click__on_released), state);
57
+ g_signal_connect(gesture, "cancel", G_CALLBACK(bare_gtk_gesture_click__on_cancel), state);
58
+
59
+ js_value_t *result;
60
+ err = js_create_uint32(env, bare_gobject_tag(state->registry, gesture), &result);
61
+ assert(err == 0);
62
+
63
+ return result;
64
+ }
65
+
66
+ #endif // BARE_GTK_GESTURE_CLICK_H
@@ -0,0 +1,14 @@
1
+ const binding = require('../binding')
2
+ const GTKGestureSingle = require('./gesture-single')
3
+
4
+ module.exports = exports = class GTKGestureClick extends GTKGestureSingle {
5
+ static _events = {
6
+ pressed: binding.GESTURE_CLICK_EVENT_PRESSED,
7
+ released: binding.GESTURE_CLICK_EVENT_RELEASED,
8
+ cancel: binding.GESTURE_CLICK_EVENT_CANCEL
9
+ }
10
+
11
+ _init() {
12
+ return binding.gestureClickInit()
13
+ }
14
+ }
@@ -0,0 +1,25 @@
1
+ import GTKGestureSingle = require('./gesture-single')
2
+
3
+ /** Reports drags, as a `GtkGestureDrag`. */
4
+ interface GTKGestureDrag extends GTKGestureSingle<GTKGestureDrag.Events> {
5
+ /** Where the drag started, or `null` while no drag is under way. */
6
+ readonly startPoint: [x: number, y: number] | null
7
+
8
+ /** How far the drag has moved, or `null` while no drag is under way. */
9
+ readonly offset: [x: number, y: number] | null
10
+ }
11
+
12
+ declare class GTKGestureDrag {
13
+ constructor()
14
+ }
15
+
16
+ declare namespace GTKGestureDrag {
17
+ export interface Events {
18
+ 'drag-begin': [startX: number, startY: number]
19
+ 'drag-update': [offsetX: number, offsetY: number]
20
+ 'drag-end': [offsetX: number, offsetY: number]
21
+ cancel: []
22
+ }
23
+ }
24
+
25
+ export = GTKGestureDrag
@@ -0,0 +1,165 @@
1
+ #ifndef BARE_GTK_GESTURE_DRAG_H
2
+ #define BARE_GTK_GESTURE_DRAG_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+ #include "event-controller.h"
11
+
12
+ enum {
13
+ bare_gtk_gesture_drag_event_drag_begin = 1 << 0,
14
+ bare_gtk_gesture_drag_event_drag_update = 1 << 1,
15
+ bare_gtk_gesture_drag_event_drag_end = 1 << 2,
16
+ bare_gtk_gesture_drag_event_cancel = 1 << 3,
17
+ };
18
+
19
+ static void
20
+ bare_gtk_gesture_drag__on_drag_begin(GtkGestureDrag *gesture, double start_x, double start_y, gpointer data) {
21
+ bare_gtk_state_t *state = data;
22
+
23
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_drag_event_drag_begin) == 0) return;
24
+
25
+ bare_gtk__emit(state, gesture, "drag-begin", 2, (const double[]) {start_x, start_y});
26
+ }
27
+
28
+ static void
29
+ bare_gtk_gesture_drag__on_drag_update(GtkGestureDrag *gesture, double offset_x, double offset_y, gpointer data) {
30
+ bare_gtk_state_t *state = data;
31
+
32
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_drag_event_drag_update) == 0) return;
33
+
34
+ bare_gtk__emit(state, gesture, "drag-update", 2, (const double[]) {offset_x, offset_y});
35
+ }
36
+
37
+ static void
38
+ bare_gtk_gesture_drag__on_drag_end(GtkGestureDrag *gesture, double offset_x, double offset_y, gpointer data) {
39
+ bare_gtk_state_t *state = data;
40
+
41
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_drag_event_drag_end) == 0) return;
42
+
43
+ bare_gtk__emit(state, gesture, "drag-end", 2, (const double[]) {offset_x, offset_y});
44
+ }
45
+
46
+ static void
47
+ bare_gtk_gesture_drag__on_cancel(GtkGesture *gesture, GdkEventSequence *sequence, gpointer data) {
48
+ bare_gtk_state_t *state = data;
49
+
50
+ if ((bare_gtk__observed(state, gesture) & bare_gtk_gesture_drag_event_cancel) == 0) return;
51
+
52
+ bare_gtk__emit(state, gesture, "cancel", 0, NULL);
53
+ }
54
+
55
+ static js_value_t *
56
+ bare_gtk_gesture_drag_init(js_env_t *env, js_callback_info_t *info) {
57
+ int err;
58
+
59
+ bare_gtk_state_t *state;
60
+ err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
61
+ assert(err == 0);
62
+
63
+ GtkGesture *gesture = gtk_gesture_drag_new();
64
+
65
+ g_signal_connect(gesture, "drag-begin", G_CALLBACK(bare_gtk_gesture_drag__on_drag_begin), state);
66
+ g_signal_connect(gesture, "drag-update", G_CALLBACK(bare_gtk_gesture_drag__on_drag_update), state);
67
+ g_signal_connect(gesture, "drag-end", G_CALLBACK(bare_gtk_gesture_drag__on_drag_end), state);
68
+ g_signal_connect(gesture, "cancel", G_CALLBACK(bare_gtk_gesture_drag__on_cancel), state);
69
+
70
+ js_value_t *result;
71
+ err = js_create_uint32(env, bare_gobject_tag(state->registry, gesture), &result);
72
+ assert(err == 0);
73
+
74
+ return result;
75
+ }
76
+
77
+ static js_value_t *
78
+ bare_gtk_gesture_drag__point(js_env_t *env, double x, double y) {
79
+ int err;
80
+
81
+ js_value_t *result;
82
+ err = js_create_array_with_length(env, 2, &result);
83
+ assert(err == 0);
84
+
85
+ #define V(i, d) \
86
+ { \
87
+ js_value_t *val; \
88
+ err = js_create_double(env, d, &val); \
89
+ assert(err == 0); \
90
+ err = js_set_element(env, result, i, val); \
91
+ assert(err == 0); \
92
+ }
93
+
94
+ V(0, x)
95
+ V(1, y)
96
+ #undef V
97
+
98
+ return result;
99
+ }
100
+
101
+ // Both points are `null` while no drag is under way, so the caller can tell
102
+ // that apart from a drag at the origin.
103
+ static js_value_t *
104
+ bare_gtk_gesture_drag_start_point(js_env_t *env, js_callback_info_t *info) {
105
+ int err;
106
+
107
+ size_t argc = 1;
108
+ js_value_t *argv[1];
109
+
110
+ bare_gtk_state_t *state;
111
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
112
+ assert(err == 0);
113
+
114
+ assert(argc == 1);
115
+
116
+ GtkGestureDrag *gesture;
117
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "gesture", (gpointer *) &gesture);
118
+ if (err < 0) return NULL;
119
+
120
+ double x, y;
121
+
122
+ js_value_t *result;
123
+
124
+ if (!gtk_gesture_drag_get_start_point(gesture, &x, &y)) {
125
+ err = js_get_null(env, &result);
126
+ assert(err == 0);
127
+
128
+ return result;
129
+ }
130
+
131
+ return bare_gtk_gesture_drag__point(env, x, y);
132
+ }
133
+
134
+ static js_value_t *
135
+ bare_gtk_gesture_drag_offset(js_env_t *env, js_callback_info_t *info) {
136
+ int err;
137
+
138
+ size_t argc = 1;
139
+ js_value_t *argv[1];
140
+
141
+ bare_gtk_state_t *state;
142
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
143
+ assert(err == 0);
144
+
145
+ assert(argc == 1);
146
+
147
+ GtkGestureDrag *gesture;
148
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "gesture", (gpointer *) &gesture);
149
+ if (err < 0) return NULL;
150
+
151
+ double x, y;
152
+
153
+ js_value_t *result;
154
+
155
+ if (!gtk_gesture_drag_get_offset(gesture, &x, &y)) {
156
+ err = js_get_null(env, &result);
157
+ assert(err == 0);
158
+
159
+ return result;
160
+ }
161
+
162
+ return bare_gtk_gesture_drag__point(env, x, y);
163
+ }
164
+
165
+ #endif // BARE_GTK_GESTURE_DRAG_H
@@ -0,0 +1,23 @@
1
+ const binding = require('../binding')
2
+ const GTKGestureSingle = require('./gesture-single')
3
+
4
+ module.exports = exports = class GTKGestureDrag extends GTKGestureSingle {
5
+ static _events = {
6
+ 'drag-begin': binding.GESTURE_DRAG_EVENT_DRAG_BEGIN,
7
+ 'drag-update': binding.GESTURE_DRAG_EVENT_DRAG_UPDATE,
8
+ 'drag-end': binding.GESTURE_DRAG_EVENT_DRAG_END,
9
+ cancel: binding.GESTURE_DRAG_EVENT_CANCEL
10
+ }
11
+
12
+ _init() {
13
+ return binding.gestureDragInit()
14
+ }
15
+
16
+ get startPoint() {
17
+ return binding.gestureDragStartPoint(this._tag)
18
+ }
19
+
20
+ get offset() {
21
+ return binding.gestureDragOffset(this._tag)
22
+ }
23
+ }
@@ -0,0 +1,13 @@
1
+ import GTKGesture = require('./gesture')
2
+
3
+ /** A gesture made with one touch or one mouse button, as a `GtkGestureSingle`. */
4
+ interface GTKGestureSingle<M extends Record<keyof M, unknown[]> = {}> extends GTKGesture<M> {
5
+ /** The mouse button the gesture listens to. 0 means any button. */
6
+ button: number
7
+ }
8
+
9
+ declare class GTKGestureSingle<M extends Record<keyof M, unknown[]> = {}> {
10
+ protected constructor()
11
+ }
12
+
13
+ export = GTKGestureSingle
@@ -0,0 +1,12 @@
1
+ const binding = require('../binding')
2
+ const GTKGesture = require('./gesture')
3
+
4
+ module.exports = exports = class GTKGestureSingle extends GTKGesture {
5
+ get button() {
6
+ return binding.gestureSingleButton(this._tag)
7
+ }
8
+
9
+ set button(button) {
10
+ binding.gestureSingleButton(this._tag, button)
11
+ }
12
+ }
@@ -0,0 +1,13 @@
1
+ import GTKEventController = require('./event-controller')
2
+
3
+ /** The base of the controllers that recognise gestures, as a `GtkGesture`. */
4
+ interface GTKGesture<M extends Record<keyof M, unknown[]> = {}> extends GTKEventController<M> {
5
+ /** Claim or deny the current event sequence, as an `EVENT_SEQUENCE_STATE_*` constant. */
6
+ setState(state: number): boolean
7
+ }
8
+
9
+ declare class GTKGesture<M extends Record<keyof M, unknown[]> = {}> {
10
+ protected constructor()
11
+ }
12
+
13
+ export = GTKGesture