bare-gtk 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +1 -6
- package/binding.c +2 -0
- package/lib/runtime.c +75 -35
- package/lib/widget.h +51 -0
- package/lib/widget.js +8 -0
- package/lib/window.h +69 -8
- package/lib/window.js +13 -1
- package/package.json +1 -1
- package/prebuilds/linux-arm64/bare +0 -0
- package/prebuilds/linux-arm64/bare-gtk.bare +0 -0
- package/prebuilds/linux-x64/bare +0 -0
- package/prebuilds/linux-x64/bare-gtk.bare +0 -0
package/CMakeLists.txt
CHANGED
|
@@ -7,7 +7,7 @@ find_package(PkgConfig REQUIRED)
|
|
|
7
7
|
|
|
8
8
|
project(bare_gtk C)
|
|
9
9
|
|
|
10
|
-
fetch_package("github:holepunchto/bare@1.
|
|
10
|
+
fetch_package("github:holepunchto/bare@1.25.0")
|
|
11
11
|
fetch_package("github:holepunchto/libpath")
|
|
12
12
|
|
|
13
13
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET GLOBAL gtk4)
|
|
@@ -52,13 +52,8 @@ target_link_libraries(
|
|
|
52
52
|
PUBLIC
|
|
53
53
|
$<LINK_LIBRARY:WHOLE_ARCHIVE,bare_static>
|
|
54
54
|
PRIVATE
|
|
55
|
-
log_static
|
|
56
55
|
rlimit_static
|
|
57
56
|
path_static
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
target_link_libraries(
|
|
61
|
-
bare_runtime
|
|
62
57
|
PRIVATE
|
|
63
58
|
PkgConfig::GTK
|
|
64
59
|
)
|
package/binding.c
CHANGED
|
@@ -22,8 +22,10 @@ bare_gtk_exports(js_env_t *env, js_value_t *exports) {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
V("widgetVisible", bare_gtk_widget_visible)
|
|
25
|
+
V("widgetSizeRequest", bare_gtk_widget_size_request)
|
|
25
26
|
|
|
26
27
|
V("windowInit", bare_gtk_window_init)
|
|
28
|
+
V("windowDefaultSize", bare_gtk_window_default_size)
|
|
27
29
|
V("windowChild", bare_gtk_window_child)
|
|
28
30
|
#undef V
|
|
29
31
|
|
package/lib/runtime.c
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#include <assert.h>
|
|
2
2
|
#include <bare.h>
|
|
3
3
|
#include <js.h>
|
|
4
|
-
#include <log.h>
|
|
5
4
|
#include <path.h>
|
|
6
5
|
#include <rlimit.h>
|
|
7
6
|
#include <signal.h>
|
|
7
|
+
#include <unistd.h>
|
|
8
8
|
#include <uv.h>
|
|
9
9
|
|
|
10
10
|
#include <gtk/gtk.h>
|
|
@@ -14,9 +14,6 @@ static uv_async_t bare__platform_shutdown;
|
|
|
14
14
|
static uv_thread_t bare__platform_thread;
|
|
15
15
|
static js_platform_t *bare__platform;
|
|
16
16
|
|
|
17
|
-
static int bare__argc;
|
|
18
|
-
static char **bare__argv;
|
|
19
|
-
|
|
20
17
|
static uv_loop_t *bare__loop;
|
|
21
18
|
static uv_async_t bare__shutdown;
|
|
22
19
|
static bare_t *bare;
|
|
@@ -27,6 +24,8 @@ static guint bare__timer;
|
|
|
27
24
|
|
|
28
25
|
GtkApplication *bare_gtk_app;
|
|
29
26
|
|
|
27
|
+
extern char __bare_identifier[] __attribute__((weak));
|
|
28
|
+
|
|
30
29
|
static void
|
|
31
30
|
bare__on_shutdown(uv_async_t *handle) {
|
|
32
31
|
uv_close((uv_handle_t *) handle, NULL);
|
|
@@ -103,26 +102,11 @@ bare__run(void) {
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
static void
|
|
106
|
-
bare__on_activate(GtkApplication *app, gpointer data) {
|
|
107
|
-
int err;
|
|
108
|
-
|
|
109
|
-
err = uv_barrier_init(&bare__platform_ready, 2);
|
|
110
|
-
assert(err == 0);
|
|
111
|
-
|
|
112
|
-
err = uv_thread_create(&bare__platform_thread, bare__on_platform_thread, NULL);
|
|
113
|
-
assert(err == 0);
|
|
114
|
-
|
|
115
|
-
uv_barrier_wait(&bare__platform_ready);
|
|
116
|
-
|
|
117
|
-
uv_barrier_destroy(&bare__platform_ready);
|
|
118
|
-
|
|
119
|
-
bare__loop = uv_default_loop();
|
|
120
|
-
|
|
121
|
-
err = uv_async_init(bare__loop, &bare__shutdown, bare__on_shutdown);
|
|
122
|
-
assert(err == 0);
|
|
105
|
+
bare__on_activate(GtkApplication *app, gpointer data) {}
|
|
123
106
|
|
|
124
|
-
|
|
125
|
-
|
|
107
|
+
static void
|
|
108
|
+
bare__on_startup(GtkApplication *app, gpointer data) {
|
|
109
|
+
int err;
|
|
126
110
|
|
|
127
111
|
size_t len;
|
|
128
112
|
|
|
@@ -136,18 +120,18 @@ bare__on_activate(GtkApplication *app, gpointer data) {
|
|
|
136
120
|
err = path_dirname(bin, &dir, path_behavior_system);
|
|
137
121
|
assert(err == 0);
|
|
138
122
|
|
|
139
|
-
char
|
|
123
|
+
char entry[4096];
|
|
140
124
|
len = 4096;
|
|
141
125
|
|
|
142
126
|
err = path_join(
|
|
143
127
|
(const char *[]) {bin, "..", "..", "share", &bin[dir], "app.bundle", NULL},
|
|
144
|
-
|
|
128
|
+
entry,
|
|
145
129
|
&len,
|
|
146
130
|
path_behavior_system
|
|
147
131
|
);
|
|
148
132
|
assert(err == 0);
|
|
149
133
|
|
|
150
|
-
err = bare_load(bare,
|
|
134
|
+
err = bare_load(bare, entry, NULL, NULL);
|
|
151
135
|
(void) err;
|
|
152
136
|
|
|
153
137
|
bare__channel = g_io_channel_unix_new(bare__loop->backend_fd);
|
|
@@ -167,21 +151,80 @@ main(int argc, char *argv[]) {
|
|
|
167
151
|
signal(SIGPIPE, SIG_IGN);
|
|
168
152
|
#endif
|
|
169
153
|
|
|
170
|
-
err = log_open("bare", 0);
|
|
171
|
-
assert(err == 0);
|
|
172
|
-
|
|
173
154
|
err = rlimit_set(rlimit_open_files, rlimit_infer);
|
|
174
155
|
assert(err == 0);
|
|
175
156
|
|
|
157
|
+
uv_disable_stdio_inheritance();
|
|
158
|
+
|
|
176
159
|
argv = uv_setup_args(argc, argv);
|
|
177
160
|
|
|
178
|
-
|
|
179
|
-
|
|
161
|
+
err = uv_barrier_init(&bare__platform_ready, 2);
|
|
162
|
+
assert(err == 0);
|
|
163
|
+
|
|
164
|
+
err = uv_thread_create(&bare__platform_thread, bare__on_platform_thread, NULL);
|
|
165
|
+
assert(err == 0);
|
|
166
|
+
|
|
167
|
+
uv_barrier_wait(&bare__platform_ready);
|
|
168
|
+
|
|
169
|
+
uv_barrier_destroy(&bare__platform_ready);
|
|
170
|
+
|
|
171
|
+
bare__loop = uv_default_loop();
|
|
172
|
+
|
|
173
|
+
size_t len;
|
|
174
|
+
|
|
175
|
+
char bin[4096];
|
|
176
|
+
len = sizeof(bin);
|
|
177
|
+
|
|
178
|
+
err = uv_exepath(bin, &len);
|
|
179
|
+
assert(err == 0);
|
|
180
|
+
|
|
181
|
+
size_t dir;
|
|
182
|
+
err = path_dirname(bin, &dir, path_behavior_system);
|
|
183
|
+
assert(err == 0);
|
|
180
184
|
|
|
181
|
-
|
|
185
|
+
char preflight[4096];
|
|
186
|
+
len = 4096;
|
|
187
|
+
|
|
188
|
+
err = path_join(
|
|
189
|
+
(const char *[]) {bin, "..", "..", "share", &bin[dir], "preflight.bundle", NULL},
|
|
190
|
+
preflight,
|
|
191
|
+
&len,
|
|
192
|
+
path_behavior_system
|
|
193
|
+
);
|
|
194
|
+
assert(err == 0);
|
|
195
|
+
|
|
196
|
+
uv_fs_t fs;
|
|
197
|
+
err = uv_fs_access(bare__loop, &fs, preflight, R_OK, NULL);
|
|
198
|
+
|
|
199
|
+
if (err == 0) {
|
|
200
|
+
err = bare_setup(bare__loop, bare__platform, NULL, argc, (const char **) argv, NULL, &bare);
|
|
201
|
+
assert(err == 0);
|
|
202
|
+
|
|
203
|
+
err = bare_load(bare, preflight, NULL, NULL);
|
|
204
|
+
(void) err;
|
|
205
|
+
|
|
206
|
+
err = bare_run(bare, UV_RUN_DEFAULT);
|
|
207
|
+
assert(err == 0);
|
|
208
|
+
|
|
209
|
+
int exit_code;
|
|
210
|
+
err = bare_teardown(bare, UV_RUN_DEFAULT, &exit_code);
|
|
211
|
+
assert(err == 0);
|
|
212
|
+
|
|
213
|
+
if (exit_code != 0) _exit(exit_code);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
err = uv_async_init(bare__loop, &bare__shutdown, bare__on_shutdown);
|
|
217
|
+
assert(err == 0);
|
|
218
|
+
|
|
219
|
+
err = bare_setup(bare__loop, bare__platform, NULL, argc, (const char **) argv, NULL, &bare);
|
|
220
|
+
assert(err == 0);
|
|
221
|
+
|
|
222
|
+
GtkApplication *app = bare_gtk_app = gtk_application_new(__bare_identifier, 0);
|
|
182
223
|
|
|
183
224
|
g_signal_connect(app, "activate", G_CALLBACK(bare__on_activate), NULL);
|
|
184
225
|
|
|
226
|
+
g_signal_connect(app, "startup", G_CALLBACK(bare__on_startup), NULL);
|
|
227
|
+
|
|
185
228
|
g_application_run(G_APPLICATION(app), argc, argv);
|
|
186
229
|
|
|
187
230
|
g_source_remove(bare__poll);
|
|
@@ -211,8 +254,5 @@ main(int argc, char *argv[]) {
|
|
|
211
254
|
|
|
212
255
|
uv_thread_join(&bare__platform_thread);
|
|
213
256
|
|
|
214
|
-
err = log_close();
|
|
215
|
-
assert(err == 0);
|
|
216
|
-
|
|
217
257
|
return exit_code;
|
|
218
258
|
}
|
package/lib/widget.h
CHANGED
|
@@ -37,3 +37,54 @@ bare_gtk_widget_visible(js_env_t *env, js_callback_info_t *info) {
|
|
|
37
37
|
|
|
38
38
|
return result;
|
|
39
39
|
}
|
|
40
|
+
|
|
41
|
+
static js_value_t *
|
|
42
|
+
bare_gtk_widget_size_request(js_env_t *env, js_callback_info_t *info) {
|
|
43
|
+
int err;
|
|
44
|
+
|
|
45
|
+
size_t argc = 3;
|
|
46
|
+
js_value_t *argv[3];
|
|
47
|
+
|
|
48
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
49
|
+
assert(err == 0);
|
|
50
|
+
|
|
51
|
+
assert(argc == 1 || argc == 3);
|
|
52
|
+
|
|
53
|
+
GtkWidget *widget;
|
|
54
|
+
err = js_get_value_external(env, argv[0], (void **) &widget);
|
|
55
|
+
assert(err == 0);
|
|
56
|
+
|
|
57
|
+
js_value_t *result = NULL;
|
|
58
|
+
|
|
59
|
+
if (argc == 1) {
|
|
60
|
+
int width, height;
|
|
61
|
+
gtk_widget_get_size_request(widget, &width, &height);
|
|
62
|
+
|
|
63
|
+
err = js_create_array_with_length(env, 2, &result);
|
|
64
|
+
assert(err == 0);
|
|
65
|
+
|
|
66
|
+
#define V(i, d) \
|
|
67
|
+
{ \
|
|
68
|
+
js_value_t *val; \
|
|
69
|
+
err = js_create_int32(env, d, &val); \
|
|
70
|
+
assert(err == 0); \
|
|
71
|
+
err = js_set_element(env, result, i, val); \
|
|
72
|
+
assert(err == 0); \
|
|
73
|
+
}
|
|
74
|
+
V(0, width)
|
|
75
|
+
V(1, width)
|
|
76
|
+
#undef V
|
|
77
|
+
} else {
|
|
78
|
+
int32_t width;
|
|
79
|
+
err = js_get_value_int32(env, argv[1], &width);
|
|
80
|
+
assert(err == 0);
|
|
81
|
+
|
|
82
|
+
int32_t height;
|
|
83
|
+
err = js_get_value_int32(env, argv[2], &height);
|
|
84
|
+
assert(err == 0);
|
|
85
|
+
|
|
86
|
+
gtk_widget_set_size_request(widget, width, height);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return result;
|
|
90
|
+
}
|
package/lib/widget.js
CHANGED
|
@@ -15,4 +15,12 @@ module.exports = class GTKWidget extends EventEmitter {
|
|
|
15
15
|
set visible(value) {
|
|
16
16
|
binding.widgetVisible(this._handle, value)
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
get sizeRequest() {
|
|
20
|
+
return binding.widgetSizeRequest(this._handle)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
set sizeRequest([width, height]) {
|
|
24
|
+
binding.widgetSizeRequest(this._handle, width, height)
|
|
25
|
+
}
|
|
18
26
|
}
|
package/lib/window.h
CHANGED
|
@@ -48,6 +48,11 @@ bare_window_class_init(BareWindowClass *class) {
|
|
|
48
48
|
object_class->finalize = bare_window_finalize;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
static void
|
|
52
|
+
bare_gtk_window__on_release(js_env_t *env, void *data, void *finalize_hint) {
|
|
53
|
+
g_object_unref(data);
|
|
54
|
+
}
|
|
55
|
+
|
|
51
56
|
static js_value_t *
|
|
52
57
|
bare_gtk_window_init(js_env_t *env, js_callback_info_t *info) {
|
|
53
58
|
int err;
|
|
@@ -70,12 +75,63 @@ bare_gtk_window_init(js_env_t *env, js_callback_info_t *info) {
|
|
|
70
75
|
assert(err == 0);
|
|
71
76
|
|
|
72
77
|
js_value_t *handle;
|
|
73
|
-
err = js_create_external(env, window,
|
|
78
|
+
err = js_create_external(env, window, bare_gtk_window__on_release, NULL, &handle);
|
|
74
79
|
assert(err == 0);
|
|
75
80
|
|
|
76
81
|
return handle;
|
|
77
82
|
}
|
|
78
83
|
|
|
84
|
+
static js_value_t *
|
|
85
|
+
bare_gtk_window_default_size(js_env_t *env, js_callback_info_t *info) {
|
|
86
|
+
int err;
|
|
87
|
+
|
|
88
|
+
size_t argc = 3;
|
|
89
|
+
js_value_t *argv[3];
|
|
90
|
+
|
|
91
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
92
|
+
assert(err == 0);
|
|
93
|
+
|
|
94
|
+
assert(argc == 1 || argc == 3);
|
|
95
|
+
|
|
96
|
+
BareWindow *window;
|
|
97
|
+
err = js_get_value_external(env, argv[0], (void **) &window);
|
|
98
|
+
assert(err == 0);
|
|
99
|
+
|
|
100
|
+
js_value_t *result = NULL;
|
|
101
|
+
|
|
102
|
+
if (argc == 1) {
|
|
103
|
+
int width, height;
|
|
104
|
+
gtk_window_get_default_size(GTK_WINDOW(window), &width, &height);
|
|
105
|
+
|
|
106
|
+
err = js_create_array_with_length(env, 2, &result);
|
|
107
|
+
assert(err == 0);
|
|
108
|
+
|
|
109
|
+
#define V(i, d) \
|
|
110
|
+
{ \
|
|
111
|
+
js_value_t *val; \
|
|
112
|
+
err = js_create_int32(env, d, &val); \
|
|
113
|
+
assert(err == 0); \
|
|
114
|
+
err = js_set_element(env, result, i, val); \
|
|
115
|
+
assert(err == 0); \
|
|
116
|
+
}
|
|
117
|
+
V(0, width)
|
|
118
|
+
V(1, width)
|
|
119
|
+
#undef V
|
|
120
|
+
} else {
|
|
121
|
+
int32_t width;
|
|
122
|
+
err = js_get_value_int32(env, argv[1], &width);
|
|
123
|
+
assert(err == 0);
|
|
124
|
+
|
|
125
|
+
int32_t height;
|
|
126
|
+
err = js_get_value_int32(env, argv[2], &height);
|
|
127
|
+
assert(err == 0);
|
|
128
|
+
|
|
129
|
+
gtk_window_set_default_size(GTK_WINDOW(window), width, height);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
|
|
79
135
|
static js_value_t *
|
|
80
136
|
bare_gtk_window_child(js_env_t *env, js_callback_info_t *info) {
|
|
81
137
|
int err;
|
|
@@ -88,23 +144,28 @@ bare_gtk_window_child(js_env_t *env, js_callback_info_t *info) {
|
|
|
88
144
|
|
|
89
145
|
assert(argc == 1 || argc == 2);
|
|
90
146
|
|
|
91
|
-
|
|
92
|
-
err = js_get_value_external(env, argv[0], &
|
|
147
|
+
BareWindow *window;
|
|
148
|
+
err = js_get_value_external(env, argv[0], (void **) &window);
|
|
93
149
|
assert(err == 0);
|
|
94
150
|
|
|
95
|
-
GtkWindow *window = handle;
|
|
96
|
-
|
|
97
151
|
js_value_t *result = NULL;
|
|
98
152
|
|
|
99
153
|
if (argc == 1) {
|
|
100
|
-
|
|
101
|
-
|
|
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
|
+
}
|
|
102
163
|
} else {
|
|
103
164
|
void *handle;
|
|
104
165
|
err = js_get_value_external(env, argv[1], &handle);
|
|
105
166
|
assert(err == 0);
|
|
106
167
|
|
|
107
|
-
gtk_window_set_child(window, handle);
|
|
168
|
+
gtk_window_set_child(GTK_WINDOW(window), handle);
|
|
108
169
|
}
|
|
109
170
|
|
|
110
171
|
return result;
|
package/lib/window.js
CHANGED
|
@@ -8,8 +8,20 @@ module.exports = exports = class GTKWindow extends GTKWidget {
|
|
|
8
8
|
this._handle = binding.windowInit(this)
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
get defaultSize() {
|
|
12
|
+
return binding.windowDefaultSize(this._handle)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
set defaultSize([width, height]) {
|
|
16
|
+
binding.windowDefaultSize(this._handle, width, height)
|
|
17
|
+
}
|
|
18
|
+
|
|
11
19
|
get child() {
|
|
12
|
-
|
|
20
|
+
const handle = binding.windowChild(this._handle)
|
|
21
|
+
|
|
22
|
+
if (handle === null) return null
|
|
23
|
+
|
|
24
|
+
return new GTKWidget(handle)
|
|
13
25
|
}
|
|
14
26
|
|
|
15
27
|
set child(widget) {
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|