bare-gtk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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.js CHANGED
@@ -1,26 +1,191 @@
1
- const EventEmitter = require('bare-events')
2
1
  const binding = require('../binding')
2
+ const GObject = require('./object')
3
+ const wrap = require('./wrap')
4
+ const { hold, drop } = require('./reachable')
5
+ const GDKCursor = require('./cursor')
3
6
 
4
- module.exports = class GTKWidget extends EventEmitter {
5
- constructor(handle = null) {
6
- super()
7
+ module.exports = exports = class GTKWidget extends GObject {
8
+ get visible() {
9
+ return binding.widgetVisible(this._tag)
10
+ }
7
11
 
8
- this._handle = handle
12
+ set visible(value) {
13
+ binding.widgetVisible(this._tag, value)
9
14
  }
10
15
 
11
- get visible() {
12
- return binding.widgetVisible(this._handle)
16
+ get opacity() {
17
+ return binding.widgetOpacity(this._tag)
13
18
  }
14
19
 
15
- set visible(value) {
16
- binding.widgetVisible(this._handle, value)
20
+ set opacity(value) {
21
+ binding.widgetOpacity(this._tag, value)
22
+ }
23
+
24
+ get overflow() {
25
+ return binding.widgetOverflow(this._tag)
26
+ }
27
+
28
+ set overflow(value) {
29
+ binding.widgetOverflow(this._tag, value)
17
30
  }
18
31
 
19
32
  get sizeRequest() {
20
- return binding.widgetSizeRequest(this._handle)
33
+ return binding.widgetSizeRequest(this._tag)
21
34
  }
22
35
 
23
36
  set sizeRequest([width, height]) {
24
- binding.widgetSizeRequest(this._handle, width, height)
37
+ binding.widgetSizeRequest(this._tag, width, height)
38
+ }
39
+
40
+ get scaleFactor() {
41
+ return binding.widgetScaleFactor(this._tag)
42
+ }
43
+
44
+ get native() {
45
+ return wrap(GTKWidget, binding.widgetNative(this._tag))
46
+ }
47
+
48
+ get parent() {
49
+ return wrap(GTKWidget, binding.widgetParent(this._tag))
50
+ }
51
+
52
+ get firstChild() {
53
+ return wrap(GTKWidget, binding.widgetFirstChild(this._tag))
54
+ }
55
+
56
+ get lastChild() {
57
+ return wrap(GTKWidget, binding.widgetLastChild(this._tag))
58
+ }
59
+
60
+ get nextSibling() {
61
+ return wrap(GTKWidget, binding.widgetNextSibling(this._tag))
62
+ }
63
+
64
+ get prevSibling() {
65
+ return wrap(GTKWidget, binding.widgetPrevSibling(this._tag))
66
+ }
67
+
68
+ get layoutManager() {
69
+ return wrap(GObject, binding.widgetLayoutManager(this._tag))
70
+ }
71
+
72
+ set layoutManager(manager) {
73
+ drop(this, this.layoutManager)
74
+
75
+ binding.widgetLayoutManager(this._tag, manager === null ? null : manager._tag)
76
+
77
+ hold(this, manager)
78
+ }
79
+
80
+ get width() {
81
+ return binding.widgetWidth(this._tag)
82
+ }
83
+
84
+ get height() {
85
+ return binding.widgetHeight(this._tag)
86
+ }
87
+
88
+ grabFocus() {
89
+ return binding.widgetGrabFocus(this._tag)
90
+ }
91
+
92
+ setRootFocus(widget) {
93
+ binding.widgetSetRootFocus(this._tag, widget === null ? null : widget._tag)
94
+
95
+ return this
96
+ }
97
+
98
+ addCssClass(name) {
99
+ binding.widgetAddCssClass(this._tag, name)
100
+
101
+ return this
102
+ }
103
+
104
+ removeCssClass(name) {
105
+ binding.widgetRemoveCssClass(this._tag, name)
106
+
107
+ return this
108
+ }
109
+
110
+ hasCssClass(name) {
111
+ return binding.widgetHasCssClass(this._tag, name)
112
+ }
113
+
114
+ get canTarget() {
115
+ return binding.widgetCanTarget(this._tag)
116
+ }
117
+
118
+ set canTarget(value) {
119
+ binding.widgetCanTarget(this._tag, value)
120
+ }
121
+
122
+ get cursor() {
123
+ return wrap(GDKCursor, binding.widgetCursor(this._tag))
124
+ }
125
+
126
+ set cursor(value) {
127
+ binding.widgetCursor(this._tag, value === null ? null : value._tag)
128
+ }
129
+
130
+ setCursorFromName(name) {
131
+ binding.widgetSetCursorFromName(this._tag, name)
132
+
133
+ return this
134
+ }
135
+
136
+ get sensitive() {
137
+ return binding.widgetSensitive(this._tag)
138
+ }
139
+
140
+ set sensitive(value) {
141
+ binding.widgetSensitive(this._tag, value)
142
+ }
143
+
144
+ measure(orientation, forSize = -1) {
145
+ return binding.widgetMeasure(this._tag, orientation, forSize)
146
+ }
147
+
148
+ computeBounds(target) {
149
+ return binding.widgetComputeBounds(this._tag, target._tag)
150
+ }
151
+
152
+ insertAfter(parent, previousSibling = null) {
153
+ binding.widgetInsertAfter(
154
+ this._tag,
155
+ parent._tag,
156
+ previousSibling === null ? null : previousSibling._tag
157
+ )
158
+
159
+ return hold(parent, this)
160
+ }
161
+
162
+ insertBefore(parent, nextSibling = null) {
163
+ binding.widgetInsertBefore(
164
+ this._tag,
165
+ parent._tag,
166
+ nextSibling === null ? null : nextSibling._tag
167
+ )
168
+
169
+ return hold(parent, this)
170
+ }
171
+
172
+ addController(controller) {
173
+ binding.widgetAddController(this._tag, controller._tag)
174
+
175
+ return hold(this, controller)
176
+ }
177
+
178
+ removeController(controller) {
179
+ binding.widgetRemoveController(this._tag, controller._tag)
180
+
181
+ return drop(this, controller)
182
+ }
183
+
184
+ unparent() {
185
+ const parent = this.parent
186
+
187
+ binding.widgetUnparent(this._tag)
188
+
189
+ return parent === null ? this : drop(parent, this)
25
190
  }
26
191
  }
@@ -0,0 +1,31 @@
1
+ import GTKWidget = require('./widget')
2
+ import GDKSurface = require('./surface')
3
+
4
+ /** A top level window, as a `GtkWindow`. */
5
+ interface GTKWindow extends GTKWidget<GTKWindow.Events> {
6
+ /** The surface the window draws on, or `null` before it is shown. */
7
+ readonly surface: GDKSurface | null
8
+
9
+ title: string | null
10
+
11
+ /** The size the window opens at, as `[width, height]`. */
12
+ get defaultSize(): [width: number, height: number]
13
+ set defaultSize(size: [width: number, height: number])
14
+
15
+ /** The one widget the window holds, or `null`. */
16
+ child: GTKWidget | null
17
+ }
18
+
19
+ declare class GTKWindow {
20
+ /** Create a hidden window. Set `visible` to show it. */
21
+ constructor()
22
+ }
23
+
24
+ declare namespace GTKWindow {
25
+ export interface Events {
26
+ /** The user asked to close the window. */
27
+ 'close-request': []
28
+ }
29
+ }
30
+
31
+ export = GTKWindow
package/lib/window.h CHANGED
@@ -1,16 +1,27 @@
1
+ #ifndef BARE_GTK_WINDOW_H
2
+ #define BARE_GTK_WINDOW_H
3
+
1
4
  #include <assert.h>
2
- #include <bare.h>
3
5
  #include <js.h>
6
+ #include <utf.h>
4
7
 
5
8
  #include <gtk/gtk.h>
6
9
 
7
- extern GtkApplication *bare_gtk_app;
10
+ #include "bridging.h"
11
+
12
+ extern GtkApplication *bare_gtk_app __attribute__((weak));
13
+
14
+ enum {
15
+ bare_gtk_window_event_close_request = 1 << 0,
16
+ };
8
17
 
9
18
  typedef struct {
10
19
  GtkWindow handle;
11
20
 
12
- js_env_t *env;
13
- js_ref_t *ctx;
21
+ bare_gtk_state_t *state;
22
+
23
+ uint32_t events;
24
+ gulong on_close_request;
14
25
  } BareWindow;
15
26
 
16
27
  typedef struct {
@@ -22,63 +33,84 @@ G_DEFINE_TYPE(BareWindow, bare_window, GTK_TYPE_WINDOW)
22
33
  static void
23
34
  bare_window_init(BareWindow *self) {}
24
35
 
36
+ static void
37
+ bare_window_class_init(BareWindowClass *class) {}
38
+
25
39
  BareWindow *
26
40
  bare_window_new(void) {
27
41
  return g_object_new(bare_window_get_type(), NULL);
28
42
  }
29
43
 
30
- static void
31
- bare_window_finalize(GObject *object) {
32
- int err;
44
+ static gboolean
45
+ bare_gtk_window__on_close_request(GtkWindow *window, gpointer data) {
46
+ BareWindow *self = (BareWindow *) window;
33
47
 
34
- BareWindow *self = (BareWindow *) object;
48
+ bare_gtk__emit(self->state, window, "close-request", 0, NULL);
35
49
 
36
- js_env_t *env = self->env;
50
+ return GDK_EVENT_PROPAGATE;
51
+ }
37
52
 
38
- err = js_delete_reference(env, self->ctx);
53
+ static js_value_t *
54
+ bare_gtk_window_init(js_env_t *env, js_callback_info_t *info) {
55
+ int err;
56
+
57
+ bare_gtk_state_t *state;
58
+ err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
39
59
  assert(err == 0);
40
60
 
41
- G_OBJECT_CLASS(bare_window_parent_class)->finalize(object);
42
- }
61
+ BareWindow *window = bare_window_new();
43
62
 
44
- static void
45
- bare_window_class_init(BareWindowClass *class) {
46
- GObjectClass *object_class = G_OBJECT_CLASS(class);
63
+ window->state = state;
47
64
 
48
- object_class->finalize = bare_window_finalize;
49
- }
65
+ if (&bare_gtk_app && bare_gtk_app) gtk_application_add_window(bare_gtk_app, GTK_WINDOW(window));
50
66
 
51
- static void
52
- bare_gtk_window__on_release(js_env_t *env, void *data, void *finalize_hint) {
53
- g_object_unref(data);
67
+ js_value_t *result;
68
+ err = js_create_uint32(env, bare_gobject_tag(state->registry, window), &result);
69
+ assert(err == 0);
70
+
71
+ return result;
54
72
  }
55
73
 
56
74
  static js_value_t *
57
- bare_gtk_window_init(js_env_t *env, js_callback_info_t *info) {
75
+ bare_gtk_window_title(js_env_t *env, js_callback_info_t *info) {
58
76
  int err;
59
77
 
60
- size_t argc = 1;
61
- js_value_t *argv[1];
78
+ size_t argc = 2;
79
+ js_value_t *argv[2];
62
80
 
63
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
81
+ bare_gtk_state_t *state;
82
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
64
83
  assert(err == 0);
65
84
 
66
- assert(argc == 1);
85
+ assert(argc == 1 || argc == 2);
67
86
 
68
- BareWindow *window = bare_window_new();
87
+ GtkWindow *window;
88
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "window", (gpointer *) &window);
89
+ if (err < 0) return NULL;
69
90
 
70
- gtk_application_add_window(bare_gtk_app, GTK_WINDOW(window));
91
+ js_value_t *result = NULL;
71
92
 
72
- window->env = env;
93
+ if (argc == 1) {
94
+ const char *title = gtk_window_get_title(window);
73
95
 
74
- err = js_create_reference(env, argv[0], 1, &window->ctx);
75
- assert(err == 0);
96
+ if (title) {
97
+ err = js_create_string_utf8(env, (const utf8_t *) title, (size_t) -1, &result);
98
+ assert(err == 0);
99
+ } else {
100
+ err = js_get_null(env, &result);
101
+ assert(err == 0);
102
+ }
103
+ } else {
104
+ char *title;
105
+ err = bare_gtk__read_string_or_null(env, argv[1], "title", &title);
106
+ if (err < 0) return NULL;
76
107
 
77
- js_value_t *handle;
78
- err = js_create_external(env, window, bare_gtk_window__on_release, NULL, &handle);
79
- assert(err == 0);
108
+ gtk_window_set_title(window, title);
80
109
 
81
- return handle;
110
+ g_free(title);
111
+ }
112
+
113
+ return result;
82
114
  }
83
115
 
84
116
  static js_value_t *
@@ -88,20 +120,21 @@ bare_gtk_window_default_size(js_env_t *env, js_callback_info_t *info) {
88
120
  size_t argc = 3;
89
121
  js_value_t *argv[3];
90
122
 
91
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
123
+ bare_gtk_state_t *state;
124
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
92
125
  assert(err == 0);
93
126
 
94
127
  assert(argc == 1 || argc == 3);
95
128
 
96
- BareWindow *window;
97
- err = js_get_value_external(env, argv[0], (void **) &window);
98
- assert(err == 0);
129
+ GtkWindow *window;
130
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "window", (gpointer *) &window);
131
+ if (err < 0) return NULL;
99
132
 
100
133
  js_value_t *result = NULL;
101
134
 
102
135
  if (argc == 1) {
103
136
  int width, height;
104
- gtk_window_get_default_size(GTK_WINDOW(window), &width, &height);
137
+ gtk_window_get_default_size(window, &width, &height);
105
138
 
106
139
  err = js_create_array_with_length(env, 2, &result);
107
140
  assert(err == 0);
@@ -115,18 +148,18 @@ bare_gtk_window_default_size(js_env_t *env, js_callback_info_t *info) {
115
148
  assert(err == 0); \
116
149
  }
117
150
  V(0, width)
118
- V(1, width)
151
+ V(1, height)
119
152
  #undef V
120
153
  } else {
121
154
  int32_t width;
122
- err = js_get_value_int32(env, argv[1], &width);
123
- assert(err == 0);
155
+ err = bare_gtk__read_int32(env, argv[1], "width", &width);
156
+ if (err < 0) return NULL;
124
157
 
125
158
  int32_t height;
126
- err = js_get_value_int32(env, argv[2], &height);
127
- assert(err == 0);
159
+ err = bare_gtk__read_int32(env, argv[2], "height", &height);
160
+ if (err < 0) return NULL;
128
161
 
129
- gtk_window_set_default_size(GTK_WINDOW(window), width, height);
162
+ gtk_window_set_default_size(window, width, height);
130
163
  }
131
164
 
132
165
  return result;
@@ -139,34 +172,82 @@ bare_gtk_window_child(js_env_t *env, js_callback_info_t *info) {
139
172
  size_t argc = 2;
140
173
  js_value_t *argv[2];
141
174
 
142
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
175
+ bare_gtk_state_t *state;
176
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
143
177
  assert(err == 0);
144
178
 
145
179
  assert(argc == 1 || argc == 2);
146
180
 
147
- BareWindow *window;
148
- err = js_get_value_external(env, argv[0], (void **) &window);
149
- assert(err == 0);
181
+ GtkWindow *window;
182
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "window", (gpointer *) &window);
183
+ if (err < 0) return NULL;
150
184
 
151
185
  js_value_t *result = NULL;
152
186
 
153
187
  if (argc == 1) {
154
- GtkWidget *handle = gtk_window_get_child(GTK_WINDOW(window));
155
-
156
- if (handle) {
157
- err = js_create_external(env, handle, NULL, NULL, &result);
158
- assert(err == 0);
159
- } else {
160
- err = js_get_null(env, &result);
161
- assert(err == 0);
162
- }
188
+ result = bare_gtk__create_tag(env, state, gtk_window_get_child(window));
163
189
  } else {
164
- void *handle;
165
- err = js_get_value_external(env, argv[1], &handle);
190
+ bool is;
191
+ err = js_is_null(env, argv[1], &is);
166
192
  assert(err == 0);
167
193
 
168
- gtk_window_set_child(GTK_WINDOW(window), handle);
194
+ GtkWidget *child = NULL;
195
+
196
+ if (!is) {
197
+ err = bare_gobject_read_tag(env, state->registry, argv[1], "child", (gpointer *) &child);
198
+ if (err < 0) return NULL;
199
+ }
200
+
201
+ gtk_window_set_child(window, child);
169
202
  }
170
203
 
171
204
  return result;
172
205
  }
206
+
207
+ static js_value_t *
208
+ bare_gtk_window_event_mask(js_env_t *env, js_callback_info_t *info) {
209
+ int err;
210
+
211
+ size_t argc = 2;
212
+ js_value_t *argv[2];
213
+
214
+ bare_gtk_state_t *state;
215
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
216
+ assert(err == 0);
217
+
218
+ assert(argc == 1 || argc == 2);
219
+
220
+ BareWindow *window;
221
+ err = bare_gobject_read_type(env, state->registry, argv[0], "window", bare_window_get_type(), (gpointer *) &window);
222
+ if (err < 0) return NULL;
223
+
224
+ if (argc == 1) {
225
+ js_value_t *result;
226
+ err = js_create_uint32(env, window->events, &result);
227
+ assert(err == 0);
228
+
229
+ return result;
230
+ }
231
+
232
+ uint32_t events;
233
+ err = bare_gtk__read_uint32(env, argv[1], "events", &events);
234
+ if (err < 0) return NULL;
235
+
236
+ uint32_t changed = window->events ^ events;
237
+
238
+ if (changed & bare_gtk_window_event_close_request) {
239
+ if (events & bare_gtk_window_event_close_request) {
240
+ window->on_close_request = g_signal_connect(window, "close-request", G_CALLBACK(bare_gtk_window__on_close_request), state);
241
+ } else {
242
+ g_signal_handler_disconnect(window, window->on_close_request);
243
+
244
+ window->on_close_request = 0;
245
+ }
246
+ }
247
+
248
+ window->events = events;
249
+
250
+ return NULL;
251
+ }
252
+
253
+ #endif // BARE_GTK_WINDOW_H
package/lib/window.js CHANGED
@@ -1,30 +1,51 @@
1
1
  const binding = require('../binding')
2
2
  const GTKWidget = require('./widget')
3
+ const GDKSurface = require('./surface')
4
+ const wrap = require('./wrap')
5
+ const { hold, drop } = require('./reachable')
3
6
 
4
7
  module.exports = exports = class GTKWindow extends GTKWidget {
5
- constructor() {
6
- super()
8
+ static _events = {
9
+ 'close-request': binding.WINDOW_EVENT_CLOSE_REQUEST
10
+ }
11
+
12
+ _init(opts) {
13
+ return binding.windowInit()
14
+ }
15
+
16
+ _eventMask(mask) {
17
+ binding.windowEventMask(this._tag, mask)
18
+ }
19
+
20
+ get surface() {
21
+ return wrap(GDKSurface, binding.nativeSurface(this._tag))
22
+ }
7
23
 
8
- this._handle = binding.windowInit(this)
24
+ get title() {
25
+ return binding.windowTitle(this._tag)
26
+ }
27
+
28
+ set title(value) {
29
+ binding.windowTitle(this._tag, value)
9
30
  }
10
31
 
11
32
  get defaultSize() {
12
- return binding.windowDefaultSize(this._handle)
33
+ return binding.windowDefaultSize(this._tag)
13
34
  }
14
35
 
15
36
  set defaultSize([width, height]) {
16
- binding.windowDefaultSize(this._handle, width, height)
37
+ binding.windowDefaultSize(this._tag, width, height)
17
38
  }
18
39
 
19
40
  get child() {
20
- const handle = binding.windowChild(this._handle)
21
-
22
- if (handle === null) return null
23
-
24
- return new GTKWidget(handle)
41
+ return hold(this, wrap(GTKWidget, binding.windowChild(this._tag)))
25
42
  }
26
43
 
27
44
  set child(widget) {
28
- binding.windowChild(this._handle, widget._handle)
45
+ drop(this, wrap(GTKWidget, binding.windowChild(this._tag)))
46
+
47
+ binding.windowChild(this._tag, widget === null ? null : widget._tag)
48
+
49
+ hold(this, widget)
29
50
  }
30
51
  }
package/lib/wrap.js ADDED
@@ -0,0 +1,7 @@
1
+ const binding = require('../binding')
2
+
3
+ module.exports = exports = function wrap(Class, tag) {
4
+ if (tag === null) return null
5
+
6
+ return binding.wrapper(tag) || new Class({ tag })
7
+ }
package/package.json CHANGED
@@ -1,14 +1,22 @@
1
1
  {
2
2
  "name": "bare-gtk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "GTK bindings and runtime for Bare",
5
5
  "exports": {
6
6
  "./package": "./package.json",
7
- ".": "./index.js",
8
- "./runtime": "./runtime.js"
7
+ ".": {
8
+ "types": "./index.d.ts",
9
+ "default": "./index.js"
10
+ },
11
+ "./runtime": "./runtime.js",
12
+ "./*": {
13
+ "types": "./lib/*.d.ts",
14
+ "default": "./lib/*.js"
15
+ }
9
16
  },
10
17
  "files": [
11
18
  "index.js",
19
+ "index.d.ts",
12
20
  "runtime.js",
13
21
  "binding.c",
14
22
  "binding.js",
@@ -33,6 +41,7 @@
33
41
  },
34
42
  "homepage": "https://github.com/holepunchto/bare-gtk#readme",
35
43
  "dependencies": {
44
+ "bare-gobject-registry": "^0.1.0",
36
45
  "require-asset": "^1.1.0"
37
46
  },
38
47
  "peerDependencies": {
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/prebuilds/linux-arm64/bare
3
- size: 81529824 bytes
4
- sha256: 5dc57b03af88f7ba85825eebb0f4df4012571cfcc756fc4407f75e35a9b4449c
3
+ size: 83698384 bytes
4
+ sha256: 1c66e934fb561ed507bcb4edc4560c9d5d56ac3dcfb33938e1455ff776f14114
Binary file
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/prebuilds/linux-x64/bare
3
- size: 80286240 bytes
4
- sha256: 609d87584d0ae040d892ebd0e535a9c64de889787aacdbbbf03fdf8d6f44170a
3
+ size: 82479072 bytes
4
+ sha256: 2d37fc00479b09c15c13038649accf82a9946f3ae4d31557ff414936bec98259
Binary file