From 26c9176a1422125d062185b9fe9ce3c8777d87db Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Sat, 3 Feb 2018 12:12:50 +0100 Subject: [PATCH] Return false from InitWindow if glfwInit or glfwCreateWindow fails You can't do much with raylib if glfwInit or glfwCreateWindow fails, currently it just exits by means of TraceLog(LOG_ERROR. User code, however, might want to fall back to a text-only UI or display a warning if raylib can't be used. --- src/core.c | 23 ++++++++++++++++------- src/raylib.h | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/core.c b/src/core.c index 648d586d..75a0781f 100644 --- a/src/core.c +++ b/src/core.c @@ -362,7 +362,7 @@ extern void UnloadDefaultFont(void); // [Module: text] Unloads default fo //---------------------------------------------------------------------------------- // Module specific Functions Declaration //---------------------------------------------------------------------------------- -static void InitGraphicsDevice(int width, int height); // Initialize graphics device +static bool InitGraphicsDevice(int width, int height); // Initialize graphics device static void SetupFramebufferSize(int displayWidth, int displayHeight); static void InitTimer(void); // Initialize timer static void Wait(float ms); // Wait for some milliseconds (stop program execution) @@ -429,7 +429,7 @@ static void *GamepadThread(void *arg); // Mouse reading thread #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) // Initialize window and OpenGL context // NOTE: data parameter could be used to pass any kind of required data to the initialization -void InitWindow(int width, int height, void *data) +bool InitWindow(int width, int height, void *data) { TraceLog(LOG_INFO, "Initializing raylib (v1.9-dev)"); @@ -442,7 +442,8 @@ void InitWindow(int width, int height, void *data) #endif // Init graphics device (display device and OpenGL context) - InitGraphicsDevice(width, height); + if (!InitGraphicsDevice(width, height)) + return false; // Init hi-res timer InitTimer(); @@ -492,13 +493,14 @@ void InitWindow(int width, int height, void *data) SetTargetFPS(60); LogoAnimation(); } + return true; } #endif #if defined(PLATFORM_ANDROID) // Initialize window and OpenGL context (and Android activity) // NOTE: data parameter could be used to pass any kind of required data to the initialization -void InitWindow(int width, int height, void *data) +bool InitWindow(int width, int height, void *data) { TraceLog(LOG_INFO, "Initializing raylib (v1.9-dev)"); @@ -555,6 +557,7 @@ void InitWindow(int width, int height, void *data) //if (app->destroyRequested != 0) windowShouldClose = true; } } + return true; } #endif @@ -1697,7 +1700,7 @@ Vector2 GetTouchPosition(int index) // Initialize display device and framebuffer // NOTE: width and height represent the screen (framebuffer) desired size, not actual display size // If width or height are 0, default display size will be used for framebuffer size -static void InitGraphicsDevice(int width, int height) +static bool InitGraphicsDevice(int width, int height) { screenWidth = width; // User desired width screenHeight = height; // User desired height @@ -1711,7 +1714,11 @@ static void InitGraphicsDevice(int width, int height) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) glfwSetErrorCallback(ErrorCallback); - if (!glfwInit()) TraceLog(LOG_ERROR, "Failed to initialize GLFW"); + if (!glfwInit()) + { + TraceLog(LOG_WARNING, "Failed to initialize GLFW"); + return false; + } // NOTE: Getting video modes is not implemented in emscripten GLFW3 version #if defined(PLATFORM_DESKTOP) @@ -1842,7 +1849,8 @@ static void InitGraphicsDevice(int width, int height) if (!window) { glfwTerminate(); - TraceLog(LOG_ERROR, "GLFW Failed to initialize Window"); + TraceLog(LOG_WARNING, "GLFW Failed to initialize Window"); + return false; } else { @@ -2199,6 +2207,7 @@ static void InitGraphicsDevice(int width, int height) #if defined(PLATFORM_ANDROID) windowReady = true; // IMPORTANT! #endif + return true; } // Set viewport parameters diff --git a/src/raylib.h b/src/raylib.h index f881dc68..0aa5ccae 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -684,7 +684,7 @@ extern "C" { // Prevents name mangling of functions //------------------------------------------------------------------------------------ // Window-related functions -RLAPI void InitWindow(int width, int height, void *data); // Initialize window and OpenGL context +RLAPI bool InitWindow(int width, int height, void *data); // Initialize window and OpenGL context RLAPI void CloseWindow(void); // Close window and unload OpenGL context RLAPI bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed RLAPI bool IsWindowMinimized(void); // Check if window has been minimized (or lost focus)