Skip to content

Commit

Permalink
scenic_loop: macos doesn't like gtk_main not being run from the main …
Browse files Browse the repository at this point in the history
…thread
  • Loading branch information
ringlej committed Oct 19, 2023
1 parent 3b43d3f commit 65e78e4
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 28 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 = \
Expand Down
6 changes: 6 additions & 0 deletions c_src/device/cairo/cairo_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "comms.h"
#include "device.h"
#include "fontstash.h"
#include "scenic_ops.h"

const char* device = "/dev/fb0";

Expand Down Expand Up @@ -328,3 +329,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);
}

22 changes: 11 additions & 11 deletions c_src/device/cairo/cairo_gtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "comms.h"
#include "device.h"
#include "fontstash.h"
#include "scenic_ops.h"
#include "script_ops.h"

typedef struct {
Expand All @@ -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)
Expand Down Expand Up @@ -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;
}

Expand All @@ -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()
Expand Down Expand Up @@ -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();
}
1 change: 1 addition & 0 deletions c_src/device/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions c_src/device/nvg/nvg_scenic.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "device.h"
#include "scenic_ops.h"

void device_loop(driver_data_t* p_data)
{
scenic_loop(p_data);
}
17 changes: 1 addition & 16 deletions c_src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

24 changes: 24 additions & 0 deletions c_src/scenic/scenic_ops.c
Original file line number Diff line number Diff line change
@@ -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)
{
Expand Down Expand Up @@ -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;
}

3 changes: 2 additions & 1 deletion c_src/scenic/scenic_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit 65e78e4

Please sign in to comment.