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,190 @@
1
+ #ifndef BARE_GTK_MESSAGE_DIALOG_H
2
+ #define BARE_GTK_MESSAGE_DIALOG_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+
11
+ enum {
12
+ bare_gtk_dialog_event_response = 1 << 0,
13
+ };
14
+
15
+ static void
16
+ bare_gtk_dialog__on_response(GtkDialog *dialog, gint response, gpointer data) {
17
+ bare_gtk_state_t *state = data;
18
+
19
+ if ((bare_gtk__observed(state, dialog) & bare_gtk_dialog_event_response) == 0) return;
20
+
21
+ bare_gtk__emit(state, dialog, "response", 1, (double[]){(double) response});
22
+ }
23
+
24
+ // No buttons yet, because adding them one at a time is the only way to choose
25
+ // their labels.
26
+ static js_value_t *
27
+ bare_gtk_message_dialog_new(js_env_t *env, js_callback_info_t *info) {
28
+ int err;
29
+
30
+ size_t argc = 3;
31
+ js_value_t *argv[3];
32
+
33
+ bare_gtk_state_t *state;
34
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
35
+ assert(err == 0);
36
+
37
+ assert(argc == 3);
38
+
39
+ GtkWindow *parent = NULL;
40
+
41
+ js_value_type_t type;
42
+ err = js_typeof(env, argv[0], &type);
43
+ assert(err == 0);
44
+
45
+ if (type != js_null && type != js_undefined) {
46
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "parent", (gpointer *) &parent);
47
+ if (err < 0) return NULL;
48
+ }
49
+
50
+ int32_t message_type;
51
+ err = bare_gtk__read_int32(env, argv[1], "message_type", &message_type);
52
+ if (err < 0) return NULL;
53
+
54
+ char *text;
55
+ err = bare_gtk__read_string(env, argv[2], "text", &text);
56
+ if (err < 0) return NULL;
57
+
58
+ GtkWidget *dialog = gtk_message_dialog_new(
59
+ parent,
60
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
61
+ (GtkMessageType) message_type,
62
+ GTK_BUTTONS_NONE,
63
+ "%s",
64
+ text
65
+ );
66
+
67
+ free(text);
68
+
69
+ g_signal_connect(dialog, "response", G_CALLBACK(bare_gtk_dialog__on_response), state);
70
+
71
+ return bare_gtk__create_tag(env, state, dialog);
72
+ }
73
+
74
+ static js_value_t *
75
+ bare_gtk_message_dialog_secondary_text(js_env_t *env, js_callback_info_t *info) {
76
+ int err;
77
+
78
+ size_t argc = 2;
79
+ js_value_t *argv[2];
80
+
81
+ bare_gtk_state_t *state;
82
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
83
+ assert(err == 0);
84
+
85
+ assert(argc == 2);
86
+
87
+ GtkMessageDialog *dialog;
88
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "dialog", (gpointer *) &dialog);
89
+ if (err < 0) return NULL;
90
+
91
+ char *text;
92
+ err = bare_gtk__read_string(env, argv[1], "text", &text);
93
+ if (err < 0) return NULL;
94
+
95
+ gtk_message_dialog_format_secondary_text(dialog, "%s", text);
96
+
97
+ free(text);
98
+
99
+ return NULL;
100
+ }
101
+
102
+ static js_value_t *
103
+ bare_gtk_dialog_event_mask(js_env_t *env, js_callback_info_t *info) {
104
+ int err;
105
+
106
+ size_t argc = 2;
107
+ js_value_t *argv[2];
108
+
109
+ bare_gtk_state_t *state;
110
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
111
+ assert(err == 0);
112
+
113
+ assert(argc == 2);
114
+
115
+ GtkDialog *dialog;
116
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "dialog", (gpointer *) &dialog);
117
+ if (err < 0) return NULL;
118
+
119
+ uint32_t events;
120
+ err = bare_gtk__read_uint32(env, argv[1], "events", &events);
121
+ if (err < 0) return NULL;
122
+
123
+ bare_gtk__observe(state, dialog, events);
124
+
125
+ return NULL;
126
+ }
127
+
128
+ static js_value_t *
129
+ bare_gtk_dialog_add_button(js_env_t *env, js_callback_info_t *info) {
130
+ int err;
131
+
132
+ size_t argc = 3;
133
+ js_value_t *argv[3];
134
+
135
+ bare_gtk_state_t *state;
136
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
137
+ assert(err == 0);
138
+
139
+ assert(argc == 3);
140
+
141
+ GtkDialog *dialog;
142
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "dialog", (gpointer *) &dialog);
143
+ if (err < 0) return NULL;
144
+
145
+ char *label;
146
+ err = bare_gtk__read_string(env, argv[1], "label", &label);
147
+ if (err < 0) return NULL;
148
+
149
+ int32_t response;
150
+ err = bare_gtk__read_int32(env, argv[2], "response", &response);
151
+ if (err < 0) {
152
+ free(label);
153
+
154
+ return NULL;
155
+ }
156
+
157
+ GtkWidget *button = gtk_dialog_add_button(dialog, label, response);
158
+
159
+ free(label);
160
+
161
+ return bare_gtk__create_tag(env, state, button);
162
+ }
163
+
164
+ static js_value_t *
165
+ bare_gtk_dialog_response(js_env_t *env, js_callback_info_t *info) {
166
+ int err;
167
+
168
+ size_t argc = 2;
169
+ js_value_t *argv[2];
170
+
171
+ bare_gtk_state_t *state;
172
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
173
+ assert(err == 0);
174
+
175
+ assert(argc == 2);
176
+
177
+ GtkDialog *dialog;
178
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "dialog", (gpointer *) &dialog);
179
+ if (err < 0) return NULL;
180
+
181
+ int32_t response;
182
+ err = bare_gtk__read_int32(env, argv[1], "response", &response);
183
+ if (err < 0) return NULL;
184
+
185
+ gtk_dialog_response(dialog, response);
186
+
187
+ return NULL;
188
+ }
189
+
190
+ #endif // BARE_GTK_MESSAGE_DIALOG_H
@@ -0,0 +1,22 @@
1
+ const binding = require('../binding')
2
+ const GTKDialog = require('./dialog')
3
+
4
+ module.exports = exports = class GTKMessageDialog extends GTKDialog {
5
+ _init(opts) {
6
+ const { parent = null, messageType = exports.MESSAGE_TYPE.OTHER, text = '' } = opts
7
+
8
+ return binding.messageDialogNew(parent === null ? null : parent._tag, messageType, text)
9
+ }
10
+
11
+ set secondaryText(text) {
12
+ binding.messageDialogSecondaryText(this._tag, text)
13
+ }
14
+ }
15
+
16
+ exports.MESSAGE_TYPE = {
17
+ INFO: binding.MESSAGE_DIALOG_MESSAGE_TYPE_INFO,
18
+ WARNING: binding.MESSAGE_DIALOG_MESSAGE_TYPE_WARNING,
19
+ QUESTION: binding.MESSAGE_DIALOG_MESSAGE_TYPE_QUESTION,
20
+ ERROR: binding.MESSAGE_DIALOG_MESSAGE_TYPE_ERROR,
21
+ OTHER: binding.MESSAGE_DIALOG_MESSAGE_TYPE_OTHER
22
+ }
@@ -0,0 +1,32 @@
1
+ import GObject = require('./object')
2
+
3
+ /** A monitor, as a `GdkMonitor`. */
4
+ interface GDKMonitor extends GObject {
5
+ /** Where the monitor is and how big it is, in logical pixels. */
6
+ readonly geometry: { x: number; y: number; width: number; height: number }
7
+
8
+ readonly scaleFactor: number
9
+
10
+ readonly widthMm: number
11
+
12
+ readonly heightMm: number
13
+
14
+ /** The refresh rate in millihertz, or 0 if it is not known. */
15
+ readonly refreshRate: number
16
+
17
+ /** The name of the connector, such as `'HDMI-1'`, or `null`. */
18
+ readonly connector: string | null
19
+
20
+ readonly manufacturer: string | null
21
+
22
+ readonly model: string | null
23
+
24
+ /** Whether the monitor is still connected. */
25
+ readonly valid: boolean
26
+ }
27
+
28
+ declare class GDKMonitor {
29
+ protected constructor()
30
+ }
31
+
32
+ export = GDKMonitor
package/lib/monitor.h ADDED
@@ -0,0 +1,143 @@
1
+ #ifndef BARE_GTK_MONITOR_H
2
+ #define BARE_GTK_MONITOR_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+
11
+ static js_value_t *
12
+ bare_gtk_monitor_geometry(js_env_t *env, js_callback_info_t *info) {
13
+ int err;
14
+
15
+ size_t argc = 1;
16
+ js_value_t *argv[1];
17
+
18
+ bare_gtk_state_t *state;
19
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
20
+ assert(err == 0);
21
+
22
+ assert(argc == 1);
23
+
24
+ GdkMonitor *monitor;
25
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "monitor", (gpointer *) &monitor);
26
+ if (err < 0) return NULL;
27
+
28
+ GdkRectangle geometry;
29
+ gdk_monitor_get_geometry(monitor, &geometry);
30
+
31
+ js_value_t *result;
32
+ err = js_create_object(env, &result);
33
+ assert(err == 0);
34
+
35
+ const char *names[] = {"x", "y", "width", "height"};
36
+ int values[] = {geometry.x, geometry.y, geometry.width, geometry.height};
37
+
38
+ for (size_t i = 0; i < 4; i++) {
39
+ js_value_t *value;
40
+ err = js_create_int32(env, values[i], &value);
41
+ assert(err == 0);
42
+
43
+ err = js_set_named_property(env, result, names[i], value);
44
+ assert(err == 0);
45
+ }
46
+
47
+ return result;
48
+ }
49
+
50
+ #define V(name, fn) \
51
+ static js_value_t * \
52
+ name(js_env_t *env, js_callback_info_t *info) { \
53
+ int err; \
54
+ \
55
+ size_t argc = 1; \
56
+ js_value_t *argv[1]; \
57
+ \
58
+ bare_gtk_state_t *state; \
59
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
60
+ assert(err == 0); \
61
+ \
62
+ assert(argc == 1); \
63
+ \
64
+ GdkMonitor *monitor; \
65
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "monitor", (gpointer *) &monitor); \
66
+ if (err < 0) return NULL; \
67
+ \
68
+ js_value_t *result; \
69
+ err = js_create_int32(env, fn(monitor), &result); \
70
+ assert(err == 0); \
71
+ \
72
+ return result; \
73
+ }
74
+
75
+ V(bare_gtk_monitor_scale_factor, gdk_monitor_get_scale_factor)
76
+ V(bare_gtk_monitor_width_mm, gdk_monitor_get_width_mm)
77
+ V(bare_gtk_monitor_height_mm, gdk_monitor_get_height_mm)
78
+ V(bare_gtk_monitor_refresh_rate, gdk_monitor_get_refresh_rate)
79
+ #undef V
80
+
81
+ #define V(name, fn) \
82
+ static js_value_t * \
83
+ name(js_env_t *env, js_callback_info_t *info) { \
84
+ int err; \
85
+ \
86
+ size_t argc = 1; \
87
+ js_value_t *argv[1]; \
88
+ \
89
+ bare_gtk_state_t *state; \
90
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
91
+ assert(err == 0); \
92
+ \
93
+ assert(argc == 1); \
94
+ \
95
+ GdkMonitor *monitor; \
96
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "monitor", (gpointer *) &monitor); \
97
+ if (err < 0) return NULL; \
98
+ \
99
+ const char *value = fn(monitor); \
100
+ \
101
+ js_value_t *result; \
102
+ \
103
+ if (value == NULL) { \
104
+ err = js_get_null(env, &result); \
105
+ } else { \
106
+ err = js_create_string_utf8(env, (const utf8_t *) value, -1, &result); \
107
+ } \
108
+ \
109
+ assert(err == 0); \
110
+ \
111
+ return result; \
112
+ }
113
+
114
+ V(bare_gtk_monitor_connector, gdk_monitor_get_connector)
115
+ V(bare_gtk_monitor_manufacturer, gdk_monitor_get_manufacturer)
116
+ V(bare_gtk_monitor_model, gdk_monitor_get_model)
117
+ #undef V
118
+
119
+ static js_value_t *
120
+ bare_gtk_monitor_valid(js_env_t *env, js_callback_info_t *info) {
121
+ int err;
122
+
123
+ size_t argc = 1;
124
+ js_value_t *argv[1];
125
+
126
+ bare_gtk_state_t *state;
127
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
128
+ assert(err == 0);
129
+
130
+ assert(argc == 1);
131
+
132
+ GdkMonitor *monitor;
133
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "monitor", (gpointer *) &monitor);
134
+ if (err < 0) return NULL;
135
+
136
+ js_value_t *result;
137
+ err = js_get_boolean(env, gdk_monitor_is_valid(monitor), &result);
138
+ assert(err == 0);
139
+
140
+ return result;
141
+ }
142
+
143
+ #endif // BARE_GTK_MONITOR_H
package/lib/monitor.js ADDED
@@ -0,0 +1,40 @@
1
+ const binding = require('../binding')
2
+ const GObject = require('./object')
3
+
4
+ module.exports = exports = class GDKMonitor extends GObject {
5
+ get geometry() {
6
+ return binding.monitorGeometry(this._tag)
7
+ }
8
+
9
+ get scaleFactor() {
10
+ return binding.monitorScaleFactor(this._tag)
11
+ }
12
+
13
+ get widthMm() {
14
+ return binding.monitorWidthMm(this._tag)
15
+ }
16
+
17
+ get heightMm() {
18
+ return binding.monitorHeightMm(this._tag)
19
+ }
20
+
21
+ get refreshRate() {
22
+ return binding.monitorRefreshRate(this._tag)
23
+ }
24
+
25
+ get connector() {
26
+ return binding.monitorConnector(this._tag)
27
+ }
28
+
29
+ get manufacturer() {
30
+ return binding.monitorManufacturer(this._tag)
31
+ }
32
+
33
+ get model() {
34
+ return binding.monitorModel(this._tag)
35
+ }
36
+
37
+ get valid() {
38
+ return binding.monitorValid(this._tag)
39
+ }
40
+ }
package/lib/native.h ADDED
@@ -0,0 +1,31 @@
1
+ #ifndef BARE_GTK_NATIVE_H
2
+ #define BARE_GTK_NATIVE_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+
7
+ #include <gtk/gtk.h>
8
+
9
+ #include "bridging.h"
10
+
11
+ static js_value_t *
12
+ bare_gtk_native_surface(js_env_t *env, js_callback_info_t *info) {
13
+ int err;
14
+
15
+ size_t argc = 1;
16
+ js_value_t *argv[1];
17
+
18
+ bare_gtk_state_t *state;
19
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
20
+ assert(err == 0);
21
+
22
+ assert(argc == 1);
23
+
24
+ GtkNative *native;
25
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "native", (gpointer *) &native);
26
+ if (err < 0) return NULL;
27
+
28
+ return bare_gtk__create_tag(env, state, gtk_native_get_surface(native));
29
+ }
30
+
31
+ #endif // BARE_GTK_NATIVE_H
@@ -0,0 +1,18 @@
1
+ import EventEmitter from 'bare-events'
2
+ import { tag, handle, Handle } from 'bare-gobject-registry'
3
+
4
+ /**
5
+ * The base of every GTK and GDK object in this module. Objects that have events emit them as
6
+ * ordinary events, and GTK is only asked to report an event while something listens to it.
7
+ */
8
+ interface GObject<M extends Record<keyof M, unknown[]> = {}> extends EventEmitter<M> {
9
+ readonly [tag]: number
10
+
11
+ readonly [handle]: Handle
12
+ }
13
+
14
+ declare class GObject<M extends Record<keyof M, unknown[]> = {}> {
15
+ protected constructor()
16
+ }
17
+
18
+ export = GObject
package/lib/object.js ADDED
@@ -0,0 +1,38 @@
1
+ const EventEmitter = require('bare-events')
2
+ const binding = require('../binding')
3
+ const registry = require('bare-gobject-registry')
4
+ const observe = require('./events')
5
+
6
+ module.exports = exports = class GObject extends EventEmitter {
7
+ constructor(opts = {}) {
8
+ super()
9
+
10
+ const { tag = null } = opts
11
+
12
+ this._retained = new Set()
13
+
14
+ const created = tag === null ? this._init(opts) : tag
15
+
16
+ this._tag = typeof created === 'number' ? created : binding.adopt(created)
17
+
18
+ this._token = binding.claim(this._tag, this)
19
+
20
+ observe(this)
21
+ }
22
+
23
+ get [registry.tag]() {
24
+ return this._tag
25
+ }
26
+
27
+ get [registry.handle]() {
28
+ return binding.handle(this._tag)
29
+ }
30
+
31
+ _init(opts) {
32
+ throw new TypeError(`${this.constructor.name} cannot be constructed directly`)
33
+ }
34
+
35
+ _eventMask(mask) {
36
+ throw new Error(`${this.constructor.name} does not implement _eventMask`)
37
+ }
38
+ }
@@ -0,0 +1,10 @@
1
+ import GObject = require('./object')
2
+
3
+ /** Anything a `GTKPicture` can show, as a `GdkPaintable`. A `GDKTexture` is one. */
4
+ interface GDKPaintable extends GObject {}
5
+
6
+ declare class GDKPaintable {
7
+ protected constructor()
8
+ }
9
+
10
+ export = GDKPaintable
@@ -0,0 +1,3 @@
1
+ const GObject = require('./object')
2
+
3
+ module.exports = exports = class GDKPaintable extends GObject {}
@@ -0,0 +1,22 @@
1
+ import { Wrapper } from 'bare-gobject-registry'
2
+ import GTKWidget = require('./widget')
3
+ import GDKPaintable = require('./paintable')
4
+
5
+ /** A widget that shows an image, as a `GtkPicture`. */
6
+ interface GTKPicture extends GTKWidget {
7
+ /** What the picture shows, or `null`. It can come from another addon. */
8
+ get paintable(): GDKPaintable | null
9
+ set paintable(paintable: Wrapper | null)
10
+
11
+ /** Whether the image keeps its aspect ratio when it is scaled. */
12
+ keepAspectRatio: boolean
13
+
14
+ /** Whether the picture can be made smaller than the image. */
15
+ canShrink: boolean
16
+ }
17
+
18
+ declare class GTKPicture {
19
+ constructor()
20
+ }
21
+
22
+ export = GTKPicture
package/lib/picture.h ADDED
@@ -0,0 +1,127 @@
1
+ #ifndef BARE_GTK_PICTURE_H
2
+ #define BARE_GTK_PICTURE_H
3
+
4
+ #include <assert.h>
5
+ #include <js.h>
6
+ #include <utf.h>
7
+
8
+ #include <gtk/gtk.h>
9
+
10
+ #include "bridging.h"
11
+
12
+ static js_value_t *
13
+ bare_gtk_picture_init(js_env_t *env, js_callback_info_t *info) {
14
+ int err;
15
+
16
+ bare_gtk_state_t *state;
17
+ err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
18
+ assert(err == 0);
19
+
20
+ GtkWidget *picture = gtk_picture_new();
21
+
22
+ js_value_t *result;
23
+ err = js_create_uint32(env, bare_gobject_tag(state->registry, picture), &result);
24
+ assert(err == 0);
25
+
26
+ return result;
27
+ }
28
+
29
+ static js_value_t *
30
+ bare_gtk_picture_paintable(js_env_t *env, js_callback_info_t *info) {
31
+ int err;
32
+
33
+ size_t argc = 2;
34
+ js_value_t *argv[2];
35
+
36
+ bare_gtk_state_t *state;
37
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
38
+ assert(err == 0);
39
+
40
+ assert(argc == 1 || argc == 2);
41
+
42
+ GtkPicture *picture;
43
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "picture", (gpointer *) &picture);
44
+ if (err < 0) return NULL;
45
+
46
+ js_value_t *result = NULL;
47
+
48
+ if (argc == 1) {
49
+ result = bare_gtk__create_tag(env, state, gtk_picture_get_paintable(picture));
50
+ } else {
51
+ GdkPaintable *paintable;
52
+ err = bare_gtk__read_tag_or_null(env, state->registry, argv[1], "paintable", (gpointer *) &paintable);
53
+ if (err < 0) return NULL;
54
+
55
+ gtk_picture_set_paintable(picture, paintable);
56
+ }
57
+
58
+ return result;
59
+ }
60
+
61
+ static js_value_t *
62
+ bare_gtk_picture_keep_aspect_ratio(js_env_t *env, js_callback_info_t *info) {
63
+ int err;
64
+
65
+ size_t argc = 2;
66
+ js_value_t *argv[2];
67
+
68
+ bare_gtk_state_t *state;
69
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
70
+ assert(err == 0);
71
+
72
+ assert(argc == 1 || argc == 2);
73
+
74
+ GtkPicture *picture;
75
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "picture", (gpointer *) &picture);
76
+ if (err < 0) return NULL;
77
+
78
+ js_value_t *result = NULL;
79
+
80
+ if (argc == 1) {
81
+ err = js_get_boolean(env, gtk_picture_get_keep_aspect_ratio(picture), &result);
82
+ assert(err == 0);
83
+ } else {
84
+ bool keep;
85
+ err = bare_gtk__read_bool(env, argv[1], "keepAspectRatio", &keep);
86
+ if (err < 0) return NULL;
87
+
88
+ gtk_picture_set_keep_aspect_ratio(picture, keep);
89
+ }
90
+
91
+ return result;
92
+ }
93
+
94
+ static js_value_t *
95
+ bare_gtk_picture_can_shrink(js_env_t *env, js_callback_info_t *info) {
96
+ int err;
97
+
98
+ size_t argc = 2;
99
+ js_value_t *argv[2];
100
+
101
+ bare_gtk_state_t *state;
102
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
103
+ assert(err == 0);
104
+
105
+ assert(argc == 1 || argc == 2);
106
+
107
+ GtkPicture *picture;
108
+ err = bare_gobject_read_tag(env, state->registry, argv[0], "picture", (gpointer *) &picture);
109
+ if (err < 0) return NULL;
110
+
111
+ js_value_t *result = NULL;
112
+
113
+ if (argc == 1) {
114
+ err = js_get_boolean(env, gtk_picture_get_can_shrink(picture), &result);
115
+ assert(err == 0);
116
+ } else {
117
+ bool shrink;
118
+ err = bare_gtk__read_bool(env, argv[1], "canShrink", &shrink);
119
+ if (err < 0) return NULL;
120
+
121
+ gtk_picture_set_can_shrink(picture, shrink);
122
+ }
123
+
124
+ return result;
125
+ }
126
+
127
+ #endif // BARE_GTK_PICTURE_H