From 5cc37d458f89d65ce5b4d742d778c868e43ccb7e Mon Sep 17 00:00:00 2001 From: Jon Ringle Date: Mon, 16 Oct 2023 10:16:19 -0400 Subject: [PATCH] scenic_loop: macos doesn't like gtk_main not being run from the main thread --- Makefile | 1 + c_src/device/cairo/cairo_fb.c | 5 +++++ c_src/device/cairo/cairo_gtk.c | 22 +++++++++++----------- c_src/device/device.h | 1 + c_src/device/nvg/nvg_scenic.c | 7 +++++++ c_src/main.c | 17 +---------------- c_src/scenic/scenic_ops.c | 24 ++++++++++++++++++++++++ c_src/scenic/scenic_ops.h | 3 ++- 8 files changed, 52 insertions(+), 28 deletions(-) create mode 100644 c_src/device/nvg/nvg_scenic.c diff --git a/Makefile b/Makefile index 578bd4f..c4440c2 100644 --- a/Makefile +++ b/Makefile @@ -61,6 +61,7 @@ NVG_COMMON_SRCS = \ c_src/device/nvg/nanovg/nanovg.c \ c_src/device/nvg/nvg_font_ops.c \ c_src/device/nvg/nvg_image_ops.c \ + c_src/device/nvg/nvg_scenic.c \ c_src/device/nvg/nvg_script_ops.c CAIRO_COMMON_SRCS = \ diff --git a/c_src/device/cairo/cairo_fb.c b/c_src/device/cairo/cairo_fb.c index 4670fca..c1b7d21 100644 --- a/c_src/device/cairo/cairo_fb.c +++ b/c_src/device/cairo/cairo_fb.c @@ -328,3 +328,8 @@ void device_end_render(driver_data_t* p_data) render_cairo_surface_to_fb(p_ctx); } +void device_loop(driver_data_t* p_data) +{ + scenic_loop(p_data); +} + diff --git a/c_src/device/cairo/cairo_gtk.c b/c_src/device/cairo/cairo_gtk.c index c8fa44d..0f252dc 100644 --- a/c_src/device/cairo/cairo_gtk.c +++ b/c_src/device/cairo/cairo_gtk.c @@ -13,6 +13,7 @@ #include "comms.h" #include "device.h" #include "fontstash.h" +#include "scenic_ops.h" #include "script_ops.h" typedef struct { @@ -28,14 +29,6 @@ cairo_gtk_t g_cairo_gtk; extern device_info_t g_device_info; extern device_opts_t g_opts; -static gpointer cairo_gtk_main(gpointer user_data) -{ - gtk_widget_show_all((GtkWidget*)g_cairo_gtk.window); - gtk_main(); - - return NULL; -} - static gboolean on_draw(GtkWidget* widget, cairo_t* cr, gpointer data) @@ -154,8 +147,6 @@ int device_init(const device_opts_t* p_opts, gtk_container_add(GTK_CONTAINER(g_cairo_gtk.window), (GtkWidget*)drawing_area); g_signal_connect((GtkWidget*)drawing_area, "draw", G_CALLBACK(on_draw), p_ctx); - g_cairo_gtk.main = g_thread_new("gtk_main", cairo_gtk_main, NULL); - return 0; } @@ -167,8 +158,9 @@ int device_close(device_info_t* p_info) scenic_cairo_ctx_t* p_ctx = (scenic_cairo_ctx_t*)p_info->v_ctx; gtk_main_quit(); - g_thread_join(g_cairo_gtk.main); scenic_cairo_fini(p_ctx); + + return 0; } void device_poll() @@ -210,3 +202,11 @@ void device_end_render(driver_data_t* p_data) g_idle_add((GSourceFunc)gtk_widget_queue_draw, (void*)g_cairo_gtk.window); } + +void device_loop(driver_data_t* p_data) +{ + g_cairo_gtk.main = g_thread_new("scenic_loop", scenic_loop, p_data); + + gtk_widget_show_all((GtkWidget*)g_cairo_gtk.window); + gtk_main(); +} diff --git a/c_src/device/device.h b/c_src/device/device.h index ae7df1d..0a080c7 100644 --- a/c_src/device/device.h +++ b/c_src/device/device.h @@ -13,6 +13,7 @@ int device_init(const device_opts_t* p_opts, driver_data_t* p_data); int device_close(device_info_t* p_info); void device_poll(); +void device_loop(driver_data_t* p_data); void device_begin_render(driver_data_t* p_data); void device_begin_cursor_render(driver_data_t* p_data); void device_end_render(driver_data_t* p_data); diff --git a/c_src/device/nvg/nvg_scenic.c b/c_src/device/nvg/nvg_scenic.c new file mode 100644 index 0000000..3684e60 --- /dev/null +++ b/c_src/device/nvg/nvg_scenic.c @@ -0,0 +1,7 @@ +#include "device.h" +#include "scenic_ops.h" + +void device_loop(driver_data_t* p_data) +{ + scenic_loop(p_data); +} diff --git a/c_src/main.c b/c_src/main.c index c654a98..87fe063 100644 --- a/c_src/main.c +++ b/c_src/main.c @@ -63,23 +63,8 @@ int main(int argc, char **argv) data.debug_mode = g_opts.debug_mode; data.v_ctx = g_device_info.v_ctx; - // signal the app that the window is ready - send_ready(); + device_loop(&data); -#ifdef SCENIC_GLES2 - log_info("~~~~~~~~~~~~~SCENIC_GLES2 was defined!"); -#endif - - /* Loop until the calling app closes the window */ - while (data.keep_going && !isCallerDown()) { - // check for incoming messages - blocks with a timeout - handle_stdio_in(&data); - device_poll(); - } - - reset_images(data.v_ctx); - - device_close(&g_device_info); return 0; } diff --git a/c_src/scenic/scenic_ops.c b/c_src/scenic/scenic_ops.c index 8368c06..3cc44e4 100644 --- a/c_src/scenic/scenic_ops.c +++ b/c_src/scenic/scenic_ops.c @@ -1,10 +1,13 @@ #include "comms.h" +#include "device.h" #include "font.h" #include "image.h" #include "scenic_ops.h" #include "script.h" #include "utils.h" +extern device_info_t g_device_info; + inline void scenic_ops_put_script(uint32_t* p_msg_length, const driver_data_t* p_data) { @@ -168,3 +171,24 @@ void dispatch_scenic_ops(uint32_t msg_length, driver_data_t* p_data) check_gl_error(); } + +void* scenic_loop(void* user_data) +{ + driver_data_t* p_data = (driver_data_t*)user_data; + // signal the app that the window is ready + send_ready(); + + /* Loop until the calling app closes the window */ + while (p_data->keep_going && !isCallerDown()) { + // check for incoming messages - blocks with a timeout + handle_stdio_in(p_data); + device_poll(); + } + + reset_images(p_data->v_ctx); + + device_close(&g_device_info); + + return NULL; +} + diff --git a/c_src/scenic/scenic_ops.h b/c_src/scenic/scenic_ops.h index 2356294..d613336 100644 --- a/c_src/scenic/scenic_ops.h +++ b/c_src/scenic/scenic_ops.h @@ -49,9 +49,10 @@ void scenic_ops_cursor_tx(uint32_t* p_msg_length, driver_data_t* p_data); void scenic_ops_render(uint32_t* p_msg_length, driver_data_t* p_data); void scenic_ops_update_cursor(uint32_t* p_msg_length, driver_data_t* p_data); void scenic_ops_clear_color(uint32_t* p_msg_length, const driver_data_t* p_data); -void scenic_ops_quit(driver_data_t* data); +void scenic_ops_quit(driver_data_t* p_data); void scenic_ops_put_font(uint32_t* p_msg_length, driver_data_t* p_data); void scenic_ops_put_image(uint32_t* p_msg_length, driver_data_t* p_data); void scenic_ops_crash(); void dispatch_scenic_ops(uint32_t msg_length, driver_data_t* p_data); +void* scenic_loop(void* user_data); \ No newline at end of file