diff --git a/CMakeLists.txt b/CMakeLists.txt index f47e39ba..11120219 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ find_package(OpenGL REQUIRED) set(common_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/enable.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/error.c ${CMAKE_CURRENT_SOURCE_DIR}/src/fullscreen.c ${CMAKE_CURRENT_SOURCE_DIR}/src/glext.c ${CMAKE_CURRENT_SOURCE_DIR}/src/init.c diff --git a/include/GL/glfw.h b/include/GL/glfw.h index 46f54555..c5dc8e0d 100644 --- a/include/GL/glfw.h +++ b/include/GL/glfw.h @@ -387,6 +387,10 @@ GLFWAPI int glfwInit(void); GLFWAPI void glfwTerminate(void); GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); +/* Error handling */ +GLFWAPI int glfwGetError(void); +GLFWAPI const char* glfwErrorString(int error); + /* Video mode functions */ GLFWAPI int glfwGetVideoModes(GLFWvidmode* list, int maxcount); GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode); diff --git a/src/error.c b/src/error.c new file mode 100644 index 00000000..4f764aef --- /dev/null +++ b/src/error.c @@ -0,0 +1,105 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: All +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2008-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + + +////////////////////////////////////////////////////////////////////////// +////// GLFW internal API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// The current error value +//======================================================================== + +static int _glfwError = GLFW_NO_ERROR; + + +//======================================================================== +// Sets the current error value +//======================================================================== + +void _glfwSetError(int error) +{ + _glfwError = error; +} + + +////////////////////////////////////////////////////////////////////////// +////// GLFW public API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Returns the current error value +//======================================================================== + +GLFWAPI int glfwGetError(void) +{ + int error = _glfwError; + _glfwError = GLFW_NO_ERROR; + return error; +} + + +//======================================================================== +// Returns a string representation of the specified error value +//======================================================================== + +GLFWAPI const char* glfwErrorString(int error) +{ + switch (error) + { + case GLFW_NO_ERROR: + return "No error"; + case GLFW_NOT_INITIALIZED: + return "The GLFW library is not initialized"; + case GLFW_INVALID_ENUM: + return "Invalid argument for enum parameter"; + case GLFW_INVALID_VALUE: + return "Invalid value for parameter"; + case GLFW_OUT_OF_MEMORY: + return "Out of memory"; + case GLFW_OPENGL_NOT_SUPPORTED: + return "OpenGL is not supported"; + case GLFW_NO_PIXEL_FORMAT: + return "No matching framebuffer pixel format could be found"; + case GLFW_VIDEO_MODE_FAILED: + return "Video mode setting failed"; + case GLFW_UNAVAILABLE_VERSION: + return "The requested OpenGL version is unavailable"; + case GLFW_NO_CURRENT_WINDOW: + return "There is no current GLFW window"; + case GLFW_INTERNAL_ERROR: + return "Internal GLFW library error"; + default: + // TODO: Set GLFW_INVALID_ENUM here? + return NULL; + } +} + diff --git a/src/internal.h b/src/internal.h index e6c4afcd..db9a182c 100644 --- a/src/internal.h +++ b/src/internal.h @@ -231,6 +231,9 @@ GLFWGLOBAL _GLFWlibrary _glfwLibrary; int _glfwPlatformInit(void); int _glfwPlatformTerminate(void); +// Error handling +void _glfwSetError(int error); + // Enable/Disable void _glfwPlatformEnableSystemKeys(_GLFWwindow* window); void _glfwPlatformDisableSystemKeys(_GLFWwindow* window);