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 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.24.5")
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
- err = bare_setup(bare__loop, bare__platform, NULL, bare__argc, (const char **) bare__argv, NULL, &bare);
125
- assert(err == 0);
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 bundle[4096];
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
- bundle,
128
+ entry,
145
129
  &len,
146
130
  path_behavior_system
147
131
  );
148
132
  assert(err == 0);
149
133
 
150
- err = bare_load(bare, bundle, NULL, NULL);
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
- bare__argc = argc;
179
- bare__argv = argv;
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
- GtkApplication *app = bare_gtk_app = gtk_application_new(NULL, 0);
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, NULL, NULL, &handle);
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
- void *handle;
92
- err = js_get_value_external(env, argv[0], &handle);
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
- err = js_create_external(env, gtk_window_get_child(window), NULL, NULL, &result);
101
- assert(err == 0);
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
- return new GTKWidget(binding.windowChild(this._handle))
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-gtk",
3
- "version": "0.0.0",
3
+ "version": "0.1.1",
4
4
  "description": "GTK bindings and runtime for Bare",
5
5
  "exports": {
6
6
  "./package": "./package.json",
Binary file
Binary file