diff --git a/gtk3/main.c b/gtk3/main.c index 9899450..3fb05d9 100644 --- a/gtk3/main.c +++ b/gtk3/main.c @@ -49,6 +49,7 @@ typedef struct GuiData { gchar *prefix; gboolean fullscreen; GB_model_t model; + gboolean force_software_renderer; } cli_options; GFile *file; @@ -332,10 +333,6 @@ static gint handle_local_options(GApplication *app, GVariantDict *options, gpoin return EXIT_SUCCESS; } - if (g_variant_dict_lookup(options, "fullscreen", "b", &count)) { - gui_data.cli_options.fullscreen = true; - } - // Handle model override GVariant *model_name_var = g_variant_dict_lookup_value(options, "model", G_VARIANT_TYPE_STRING); if (model_name_var != NULL) { @@ -1958,14 +1955,19 @@ static void startup(GApplication *app, gpointer null_ptr) { g_debug("GTK version %u.%u.%u", gtk_get_major_version(), gtk_get_minor_version(), gtk_get_micro_version()); - // Very ugly workaround for GtkGlArea! - // When a GtkGlArea is realized and it creates a legacy GL 1.4 context - // it tries to use GL 2.0 functions to render the window which leads to the application crashing. - // So we initialize GTK, create a dummy GtkWindow object, attach a `realize` callback and - // in this callback create a GdkGLContext on this window. But instead of running the GTK main loop - // we just realize and destroy the dummy window and compare the context’s version in the realize callback. - gui_data.supports_gl = test_gl_support(); - g_debug("OpenGL supported: %s", gui_data.supports_gl? "Yes" : "No"); + if (gui_data.cli_options.force_software_renderer) { + g_message("Forcing fallback renderer!"); + } + else { + // Very ugly workaround for GtkGlArea! + // When a GtkGlArea is realized and it creates a legacy GL 1.4 context + // it tries to use GL 2.0 functions to render the window which leads to the application crashing. + // So we initialize GTK, create a dummy GtkWindow object, attach a `realize` callback and + // in this callback create a GdkGLContext on this window. But instead of running the GTK main loop + // we just realize and destroy the dummy window and compare the context’s version in the realize callback. + gui_data.supports_gl = test_gl_support(); + g_debug("OpenGL supported: %s", gui_data.supports_gl? "Yes" : "No"); + } gui_data.builder = gtk_builder_new_from_resource(RESOURCE_PREFIX "ui/window.ui"); gtk_builder_connect_signals(gui_data.builder, NULL); @@ -2676,10 +2678,11 @@ int main(int argc, char *argv[]) { // Define our command line parameters GOptionEntry entries[] = { { "version", 'v', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL, "Show the application version", NULL }, - { "fullscreen", 'f', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL, "Start in fullscreen mode", NULL }, + { "fullscreen", 'f', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &gui_data.cli_options.fullscreen, "Start in fullscreen mode", NULL }, { "bootrom", 'b', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, &gui_data.cli_options.boot_rom_path, "Path to the boot ROM to use", "" }, { "model", 'm', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, NULL, "Override the model type to emulate", "" }, { "config", 'c', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, &gui_data.cli_options.config_path, "Override the path of the configuration file", "" }, + { "no-gl", 's', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &gui_data.cli_options.force_software_renderer, "Do not use OpenGL for rendering", NULL }, { NULL } }; // Setup our command line information