From b494f68d0cbb1862378f4cbba05723a66ccdddbb Mon Sep 17 00:00:00 2001 From: elipzer Date: Wed, 5 Sep 2018 16:26:50 -0400 Subject: [PATCH] A Working Triangle Now using GLFW3 instead of the custom window class. This library looks like it will make development much simpler and will make it so that I am less worried about my windows code breaking. Currently setup the http://antongerdelan.net/opengl/hellotriangle.html tutorial in the MySimpleScene. Will probably create another scene file to try to get the object oriented stuff working. --- OpenGLEngine/Application.cpp | 105 +- OpenGLEngine/Application.h | 10 +- OpenGLEngine/Batch.h | 20 +- OpenGLEngine/GLFWInputManager.cpp | 6 + OpenGLEngine/GLFWInputManager.h | 11 + OpenGLEngine/InputManager.h | 13 +- OpenGLEngine/MyBatch.cpp | 31 +- OpenGLEngine/MyBatch.h | 21 +- OpenGLEngine/MyShaderProgram.cpp | 11 - OpenGLEngine/MyShaderProgram.h | 6 +- OpenGLEngine/MySimpleScene.cpp | 27 +- OpenGLEngine/MySimpleScene.h | 7 +- OpenGLEngine/MyTriangle.cpp | 7 + OpenGLEngine/MyTriangle.h | 6 +- OpenGLEngine/OpenGLEngine.vcxproj | 33 +- OpenGLEngine/OpenGLEngine.vcxproj.filters | 21 +- OpenGLEngine/Renderable.h | 13 +- OpenGLEngine/Shader.cpp | 2 - OpenGLEngine/ShaderProgram.cpp | 13 +- OpenGLEngine/ShaderProgram.h | 8 +- OpenGLEngine/main.cpp | 2 - OpenGLEngine/stdafx.h | 5 +- {OpenGLEngine => archive}/Window.cpp | 3 - {OpenGLEngine => archive}/Window.h | 0 dll/glew32.dll | Bin 0 -> 426496 bytes dll/glfw3.dll | Bin 0 -> 83456 bytes include/GLFW/glfw3.h | 4248 +++++++++++++++++++++ include/GLFW/glfw3native.h | 456 +++ lib/glfw3.lib | Bin 0 -> 323518 bytes lib/glfw3dll.lib | Bin 0 -> 23970 bytes 30 files changed, 4930 insertions(+), 155 deletions(-) create mode 100644 OpenGLEngine/GLFWInputManager.cpp create mode 100644 OpenGLEngine/GLFWInputManager.h rename {OpenGLEngine => archive}/Window.cpp (98%) rename {OpenGLEngine => archive}/Window.h (100%) create mode 100644 dll/glew32.dll create mode 100644 dll/glfw3.dll create mode 100644 include/GLFW/glfw3.h create mode 100644 include/GLFW/glfw3native.h create mode 100644 lib/glfw3.lib create mode 100644 lib/glfw3dll.lib diff --git a/OpenGLEngine/Application.cpp b/OpenGLEngine/Application.cpp index 1ca66da..107195f 100644 --- a/OpenGLEngine/Application.cpp +++ b/OpenGLEngine/Application.cpp @@ -3,7 +3,7 @@ #include "Exception.h" Application::Application(const char* class_name, HINSTANCE h_instance) - : m_window(class_name, h_instance), m_input_manager(&m_window.get_input_manager()), m_client_size(1280, 720) + : m_client_size(1280, 720) { base_init(); } @@ -11,30 +11,38 @@ Application::Application(const char* class_name, HINSTANCE h_instance) Application::~Application() { - HGLRC h_glrc = m_window.get_h_glrc(); - if (h_glrc != nullptr) { - // Unset the current OpenGL Rendering Context and Device - wglMakeCurrent(NULL, NULL); - wglDeleteContext(h_glrc); - m_window.set_h_glrc(nullptr); - } } int Application::run() { - init(); - MessageResponse resp(UNSET); - while (resp != QUIT_MESSAGE) { - // Handle all messages - while ((resp = m_window.handle_message()) == HANDLED_MESSAGE) {} - float delta_time = m_fps.mark(); - clock_t clock = m_fps.get_clock(); - update(delta_time, clock); - render(); - m_window.swap(); + try + { + init(); + GLenum gl_err; + while (!glfwWindowShouldClose(m_p_window)) + { + // Handle all messages + glfwPollEvents(); + float delta_time = m_fps.mark(); + clock_t clock = m_fps.get_clock(); + update(delta_time, clock); + render(); + gl_err = glGetError(); + if (gl_err != GL_NO_ERROR) + { + throw EXCEPTION("Caught OpenGL Error: " + std::to_string(gl_err)); + } + glfwSwapBuffers(m_p_window); + } + + return 0; + } + catch (Exception& e) + { + glfwTerminate(); + throw e; } - return 0; } void Application::close() @@ -43,45 +51,32 @@ void Application::close() void Application::base_init() { - if (!m_window.register_class()) throw EXCEPTION("Unable to register window class."); - if (!m_window.create_window("OpenGLEngine", -1, -1, m_client_size.x, m_client_size.y)) throw EXCEPTION("Unable to create window"); - - // Initialize window with OpenGL (May want to move this into MyApplication to allow application customization) - // https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context_(WGL) - - HDC device_context = m_window.get_h_dc(); - - // PIXELFORMATDESCRIPTOR https://msdn.microsoft.com/en-us/library/cc231189.aspx - PIXELFORMATDESCRIPTOR pfd; - ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.cColorBits = 32; - pfd.cDepthBits = 24; - pfd.cStencilBits = 8; - pfd.iLayerType = PFD_MAIN_PLANE; - - int pixel_format = ChoosePixelFormat(device_context, &pfd); - - SetPixelFormat(device_context, pixel_format, &pfd); - - HGLRC glrc = wglCreateContext(m_window.get_h_dc()); - - wglMakeCurrent(device_context, glrc); - - m_window.set_h_glrc(glrc); - - GLenum glewErr = glewInit(); - if (glewErr != GLEW_OK) + if (!glfwInit()) { - OutputDebugString("Glew Init Failed: "); - OutputDebugString((char*)glewGetErrorString(glewErr)); - OutputDebugString("\n"); - throw EXCEPTION("GLEW Init Failure"); + throw EXCEPTION("Unable to Initialize GLFW"); } + m_p_window = glfwCreateWindow(m_client_size.x, m_client_size.y, "OpenGLEngine", NULL, NULL); + if (!m_p_window) + { + glfwTerminate(); + throw EXCEPTION("Unable to Create GLFW Window"); + } + glfwMakeContextCurrent(m_p_window); + glewExperimental = GL_TRUE; + GLenum glew_err = glewInit(); + if (glew_err != GLEW_OK) + { + glfwTerminate(); + throw EXCEPTION("Unable to Initialize GLEW: " + std::string((char*)glewGetErrorString(glew_err))); + } + + // Output Version Information + OutputDebugString("\nOpenGL Version Information:\nRenderer: "); + OutputDebugString((char*)glGetString(GL_RENDERER)); + OutputDebugString("\nOpenGL Version: "); + OutputDebugString((char*)glGetString(GL_VERSION)); + OutputDebugString("\n\n"); - m_window.show(SW_NORMAL); m_fps.prepare(); } diff --git a/OpenGLEngine/Application.h b/OpenGLEngine/Application.h index ccdd3be..bd551a7 100644 --- a/OpenGLEngine/Application.h +++ b/OpenGLEngine/Application.h @@ -4,9 +4,10 @@ #include "vec2.h" -#include "Window.h" #include "FPS.h" +using namespace egm; + // TODO: Close without rendering next frame. class Application @@ -31,11 +32,8 @@ protected: // The size of the window ivec2 m_client_size; - // The window that is used by this application - Window m_window; - - // The input manager for the window of this application - const InputManager* m_input_manager; + // The GLFWwindow that is used by this application + GLFWwindow* m_p_window; // The FPS counter of this application FPS m_fps; diff --git a/OpenGLEngine/Batch.h b/OpenGLEngine/Batch.h index 3777be8..d3675e1 100644 --- a/OpenGLEngine/Batch.h +++ b/OpenGLEngine/Batch.h @@ -1,20 +1,24 @@ #pragma once +#include "stdafx.h" + #include #include "ShaderProgram.h" -#include "Renderable.h" -template +template class Batch { public: - Batch(ShaderProgram* p_shader_program, const std::vector*>& p_renderables); + void init() + { + populate_vbos(); + setup_vao(); + } - virtual void init() = 0; // Maybe make this automatic? Or in the constructor? - virtual void render() = 0; + virtual void render() const = 0; -private: - ShaderProgram* m_p_shader_program; - std::vector*> m_p_renderables; +protected: + virtual void populate_vbos() = 0; + virtual void setup_vao() = 0; }; \ No newline at end of file diff --git a/OpenGLEngine/GLFWInputManager.cpp b/OpenGLEngine/GLFWInputManager.cpp new file mode 100644 index 0000000..30e3fb2 --- /dev/null +++ b/OpenGLEngine/GLFWInputManager.cpp @@ -0,0 +1,6 @@ +#include "GLFWInputManager.h" + +void GLFWInputManager::key_callback(GLFWwindow* p_window, int key, int scancode, int action, int mods) +{ + +} diff --git a/OpenGLEngine/GLFWInputManager.h b/OpenGLEngine/GLFWInputManager.h new file mode 100644 index 0000000..baab267 --- /dev/null +++ b/OpenGLEngine/GLFWInputManager.h @@ -0,0 +1,11 @@ +#pragma once + +#include "stdafx.h" + +#include "InputManager.h" + +class GLFWInputManager : public InputManager +{ +public: + void key_callback(GLFWwindow* p_window, int key, int scancode, int action, int mods); +}; \ No newline at end of file diff --git a/OpenGLEngine/InputManager.h b/OpenGLEngine/InputManager.h index 727042b..7963d30 100644 --- a/OpenGLEngine/InputManager.h +++ b/OpenGLEngine/InputManager.h @@ -50,16 +50,11 @@ class InputManager { public: InputManager(); - ~InputManager(); + virtual ~InputManager(); //Should be called after each frame to reset the keysPressed void mark(); - void key_down(const unsigned long& keyCode); - void key_up(const unsigned long& keyCode); - void mouse_move(const ivec2& position); - void mouse_scroll(const unsigned int& distance); - bool is_key_down(const unsigned long& keyCode); bool is_key_pressed(const unsigned long& keyCode); bool is_key_released(const unsigned long& keyCode); @@ -67,6 +62,12 @@ public: const ivec2& get_mouse_delta(); const int& get_scroll_distance(); +protected: + void key_down(const unsigned long& keyCode); + void key_up(const unsigned long& keyCode); + void mouse_move(const ivec2& position); + void mouse_scroll(const unsigned int& distance); + private: //Keys pressed since the last frame //The existance of a value in this array means that the key has changed to that state diff --git a/OpenGLEngine/MyBatch.cpp b/OpenGLEngine/MyBatch.cpp index 1b2e88c..69ea9fc 100644 --- a/OpenGLEngine/MyBatch.cpp +++ b/OpenGLEngine/MyBatch.cpp @@ -1,11 +1,32 @@ #include "MyBatch.h" -void MyBatch::init() +MyBatch::MyBatch(const MyTriangle& triangle) + : m_triangle(&triangle) { - // TODO + } -void MyBatch::render() +void MyBatch::render() const { - // TODO -} \ No newline at end of file + // For now, just render everything! + glBindVertexArray(m_vao); + glDrawArrays(GL_TRIANGLES, 0, 3); +} + +void MyBatch::populate_vbos() +{ + glGenBuffers(1, &m_vbo); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + m_triangle->populate_vbo(); +} + +void MyBatch::setup_vao() +{ + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glBindVertexArray(0); +} + diff --git a/OpenGLEngine/MyBatch.h b/OpenGLEngine/MyBatch.h index a208d7e..16de7d6 100644 --- a/OpenGLEngine/MyBatch.h +++ b/OpenGLEngine/MyBatch.h @@ -2,8 +2,23 @@ #include "Batch.h" -class MyBatch : public Batch +#include "Renderable.h" + +#include "MyTriangle.h" + +class MyBatch : public Batch { - void init() override; - void render() override; +public: + MyBatch(const MyTriangle& triangle); + + void render() const override; + +protected: + void populate_vbos() override; + void setup_vao() override; + +private: + const MyTriangle* m_triangle; + GLuint m_vbo; + GLuint m_vao; }; \ No newline at end of file diff --git a/OpenGLEngine/MyShaderProgram.cpp b/OpenGLEngine/MyShaderProgram.cpp index bbd597a..68946c3 100644 --- a/OpenGLEngine/MyShaderProgram.cpp +++ b/OpenGLEngine/MyShaderProgram.cpp @@ -10,15 +10,4 @@ MyShaderProgram::MyShaderProgram() attach_shader(m_vertex_shader); attach_shader(m_fragment_shader); link(); -} - -GLuint MyShaderProgram::gen_vao() const -{ - GLuint vao; - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); - glBindVertexArray(0); - return vao; } \ No newline at end of file diff --git a/OpenGLEngine/MyShaderProgram.h b/OpenGLEngine/MyShaderProgram.h index ab6cd38..09bcfd4 100644 --- a/OpenGLEngine/MyShaderProgram.h +++ b/OpenGLEngine/MyShaderProgram.h @@ -2,6 +2,7 @@ #include "ShaderProgram.h" #include "Shader.h" +#include "Renderable.h" class MyShaderProgram : public ShaderProgram { @@ -12,14 +13,11 @@ public: float y; float z; }; - typedef unsigned int Index; + typedef Renderable RenderableType; MyShaderProgram(); -protected: - GLuint gen_vao() const override; - private: Shader m_vertex_shader; Shader m_fragment_shader; diff --git a/OpenGLEngine/MySimpleScene.cpp b/OpenGLEngine/MySimpleScene.cpp index 187405e..2a3944a 100644 --- a/OpenGLEngine/MySimpleScene.cpp +++ b/OpenGLEngine/MySimpleScene.cpp @@ -1,6 +1,7 @@ #include "MySimpleScene.h" MySimpleScene::MySimpleScene() + //: m_batch(m_triangle) { } @@ -11,8 +12,24 @@ MySimpleScene::~MySimpleScene() void MySimpleScene::init() { - m_shader_program.init(); - m_triangle.init(); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + + float points[] = { + 0.0f, 0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + -0.5f, -0.5f, 0.0f + }; + + glGenBuffers(1, &m_vbo); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), points, GL_STATIC_DRAW); + + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, m_vao); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); } void MySimpleScene::use() @@ -29,7 +46,11 @@ void MySimpleScene::update(float delta_time, clock_t clock) void MySimpleScene::render() { + //m_shader_program.use(); + //m_batch.render(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_shader_program.use(); - glBindBuffer(GL_ARRAY_BUFFER, m_triangle.get_vbo()); + glBindVertexArray(m_vao); glDrawArrays(GL_TRIANGLES, 0, 3); + } diff --git a/OpenGLEngine/MySimpleScene.h b/OpenGLEngine/MySimpleScene.h index 85c8188..ff5afec 100644 --- a/OpenGLEngine/MySimpleScene.h +++ b/OpenGLEngine/MySimpleScene.h @@ -4,6 +4,7 @@ #include "Scene.h" +#include "MyBatch.h" #include "MyShaderProgram.h" #include "MyTriangle.h" @@ -26,7 +27,11 @@ public: void render() override; private: + //MyBatch m_batch; MyShaderProgram m_shader_program; - MyTriangle m_triangle; + //MyTriangle m_triangle; + + GLuint m_vbo; + GLuint m_vao; }; diff --git a/OpenGLEngine/MyTriangle.cpp b/OpenGLEngine/MyTriangle.cpp index 5dc9922..3d98c28 100644 --- a/OpenGLEngine/MyTriangle.cpp +++ b/OpenGLEngine/MyTriangle.cpp @@ -34,6 +34,12 @@ MyTriangle::~MyTriangle() } } +void MyTriangle::populate_vbo() const +{ + glBufferData(GL_ARRAY_BUFFER, m_p_mesh->vertex_count * sizeof(VertexType), m_p_mesh->vertices, GL_STATIC_DRAW); +} + +/* GLuint MyTriangle::gen_vbo() const { GLuint vbo; @@ -42,4 +48,5 @@ GLuint MyTriangle::gen_vbo() const glBufferData(GL_ARRAY_BUFFER, m_p_mesh->vertex_count * sizeof(VertexType), m_p_mesh->vertices, GL_STATIC_DRAW); // TODO: Optimise Usage return vbo; } +*/ diff --git a/OpenGLEngine/MyTriangle.h b/OpenGLEngine/MyTriangle.h index 91d5389..65b18e7 100644 --- a/OpenGLEngine/MyTriangle.h +++ b/OpenGLEngine/MyTriangle.h @@ -10,10 +10,6 @@ public: MyTriangle(); ~MyTriangle(); -protected: - GLuint gen_vbo() const override; - -private: - + void populate_vbo() const override; }; diff --git a/OpenGLEngine/OpenGLEngine.vcxproj b/OpenGLEngine/OpenGLEngine.vcxproj index 5503e84..029f553 100644 --- a/OpenGLEngine/OpenGLEngine.vcxproj +++ b/OpenGLEngine/OpenGLEngine.vcxproj @@ -1,4 +1,4 @@ - + @@ -93,6 +93,18 @@ NotUsing + + + + + + + + copy "$(ProjectDir)..\dll\*" "$(OutDir)" + + + Copy DLLs + @@ -123,14 +135,28 @@ true true + + + + + + + + copy "$(ProjectDir)..\dll\*" "$(OutDir)" + + + Copy DLLs + + + @@ -141,16 +167,18 @@ Create - + + + @@ -163,7 +191,6 @@ - diff --git a/OpenGLEngine/OpenGLEngine.vcxproj.filters b/OpenGLEngine/OpenGLEngine.vcxproj.filters index 54b93ae..dc3fdec 100644 --- a/OpenGLEngine/OpenGLEngine.vcxproj.filters +++ b/OpenGLEngine/OpenGLEngine.vcxproj.filters @@ -27,9 +27,6 @@ - - Source Files - Source Files @@ -69,11 +66,14 @@ Source Files + + Source Files\Example + + + Source Files + - - Header Files - Header Files @@ -131,6 +131,15 @@ Header Files + + Header Files + + + Header Files\Example + + + Header Files + diff --git a/OpenGLEngine/Renderable.h b/OpenGLEngine/Renderable.h index 1877718..dfded02 100644 --- a/OpenGLEngine/Renderable.h +++ b/OpenGLEngine/Renderable.h @@ -16,24 +16,13 @@ public: virtual ~Renderable() { }; - void init() - { - m_vbo = gen_vbo(); - } - const MeshType* get_mesh() const { return m_p_mesh; } - GLuint get_vbo() const - { - return m_vbo; - } + virtual void populate_vbo() const = 0; protected: - virtual GLuint gen_vbo() const = 0;// TODO: A VBO for every object? - const MeshType* m_p_mesh = nullptr; - GLuint m_vbo = 0; }; \ No newline at end of file diff --git a/OpenGLEngine/Shader.cpp b/OpenGLEngine/Shader.cpp index df143a6..a502b0b 100644 --- a/OpenGLEngine/Shader.cpp +++ b/OpenGLEngine/Shader.cpp @@ -1,7 +1,5 @@ #include "Shader.h" -#include - #include "Exception.h" Shader::Shader(const std::string& source, ShaderType type) diff --git a/OpenGLEngine/ShaderProgram.cpp b/OpenGLEngine/ShaderProgram.cpp index 0cb5316..e2aa88c 100644 --- a/OpenGLEngine/ShaderProgram.cpp +++ b/OpenGLEngine/ShaderProgram.cpp @@ -10,11 +10,6 @@ ShaderProgram::~ShaderProgram() glDeleteProgram(m_program); } -void ShaderProgram::init() -{ - m_vao = gen_vao(); -} - void ShaderProgram::attach_shader(const Shader& shader) { glAttachShader(m_program, shader.get_shader()); @@ -26,18 +21,12 @@ void ShaderProgram::link() // TODO: Error handling } -void ShaderProgram::use() +void ShaderProgram::use() const { glUseProgram(m_program); - glBindVertexArray(get_vao()); } GLuint ShaderProgram::get_program() const { return m_program; } - -GLuint ShaderProgram::get_vao() const -{ - return m_vao; -} diff --git a/OpenGLEngine/ShaderProgram.h b/OpenGLEngine/ShaderProgram.h index acd1243..241a2e3 100644 --- a/OpenGLEngine/ShaderProgram.h +++ b/OpenGLEngine/ShaderProgram.h @@ -12,20 +12,14 @@ public: ShaderProgram(); virtual ~ShaderProgram(); - void init(); - void use(); + void use() const; GLuint get_program() const; - GLuint get_vao() const; protected: void attach_shader(const Shader& shader); void link(); - // Should return the Vertex Attribute Object for this shader. Called once by the constructor. - virtual GLuint gen_vao() const = 0; - private: GLuint m_program = 0; - GLuint m_vao = 0; }; \ No newline at end of file diff --git a/OpenGLEngine/main.cpp b/OpenGLEngine/main.cpp index f82cfbf..50f5c1a 100644 --- a/OpenGLEngine/main.cpp +++ b/OpenGLEngine/main.cpp @@ -1,7 +1,5 @@ #include "stdafx.h" -#include - #include #include "Exception.h" diff --git a/OpenGLEngine/stdafx.h b/OpenGLEngine/stdafx.h index a3d2e39..baaadaa 100644 --- a/OpenGLEngine/stdafx.h +++ b/OpenGLEngine/stdafx.h @@ -1,6 +1,9 @@ #pragma once -#include +#include +#include +#include #pragma comment(lib, "glew32.lib") +#pragma comment(lib, "glfw3.lib") #pragma comment(lib, "opengl32.lib") \ No newline at end of file diff --git a/OpenGLEngine/Window.cpp b/archive/Window.cpp similarity index 98% rename from OpenGLEngine/Window.cpp rename to archive/Window.cpp index 86f61ee..6948c06 100644 --- a/OpenGLEngine/Window.cpp +++ b/archive/Window.cpp @@ -1,8 +1,5 @@ #include "Window.h" -#include -#include - #include #include diff --git a/OpenGLEngine/Window.h b/archive/Window.h similarity index 100% rename from OpenGLEngine/Window.h rename to archive/Window.h diff --git a/dll/glew32.dll b/dll/glew32.dll new file mode 100644 index 0000000000000000000000000000000000000000..55f5bd634631efb8dbe05615f55ed3123357505d GIT binary patch literal 426496 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
xP&zWJt^zf6JF{DWWZ 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 literal 0 HcmV?d00001 diff --git a/dll/glfw3.dll b/dll/glfw3.dll new file mode 100644 index 0000000000000000000000000000000000000000..456be5c47ed4e5c3ac4a15772244b9a74b90aab7 GIT binary patch literal 83456 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 literal 0 HcmV?d00001 diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h new file mode 100644 index 0000000..95caa95 --- /dev/null +++ b/include/GLFW/glfw3.h @@ -0,0 +1,4248 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2016 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. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan reference + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#ifndef APIENTRY + #ifdef _WIN32 + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Include because most Windows GLU headers need wchar_t and + * the OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + */ +#include + +/* Include the chosen client API headers. + */ +#if defined(__APPLE__) + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif !defined(GLFW_INCLUDE_NONE) + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES2) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES3) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES31) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_VULKAN) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#endif + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a shared / dynamic library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + /* We are building or calling GLFW as a static library */ + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW library. + * + * This is incremented when the API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW library. + * + * This is incremented when features are added to the API but it remains + * backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 2 +/*! @brief The revision number of the GLFW library. + * + * This is incremented when a bug fix release is made that does not contain any + * API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 1 +/*! @} */ + +/*! @name Boolean values + * @{ */ +/*! @brief One. + * + * One. Seriously. You don't _need_ to use this symbol in your code. It's + * just semantic sugar for the number 1. You can use `1` or `true` or `_True` + * or `GL_TRUE` or whatever you want. + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * Zero. Seriously. You don't _need_ to use this symbol in your code. It's + * just just semantic sugar for the number 0. You can use `0` or `false` or + * `_False` or `GL_FALSE` or whatever you want. + */ +#define GLFW_FALSE 0 +/*! @} */ + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup keys Keyboard keys + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 + +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup errors Error codes + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @analysis Application programmer error. Initialize GLFW before calling any + * function that requires initialization. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @analysis Application programmer error. Ensure a context is current before + * calling functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref + * glfwGetWindowAttrib. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @analysis A bug in GLFW or the underlying operating system. Report the bug + * to our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation backend. + * Below are a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. + * + * @analysis The machine does not support your requirements. If your + * application is sufficiently flexible, downgrade your requirements and try + * again. Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @analysis A bug or configuration error in GLFW, the underlying operating + * system or its drivers, or a lack of required resources. Report the issue to + * our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @analysis If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @} */ + +#define GLFW_FOCUSED 0x00020001 +#define GLFW_ICONIFIED 0x00020002 +#define GLFW_RESIZABLE 0x00020003 +#define GLFW_VISIBLE 0x00020004 +#define GLFW_DECORATED 0x00020005 +#define GLFW_AUTO_ICONIFY 0x00020006 +#define GLFW_FLOATING 0x00020007 +#define GLFW_MAXIMIZED 0x00020008 + +#define GLFW_RED_BITS 0x00021001 +#define GLFW_GREEN_BITS 0x00021002 +#define GLFW_BLUE_BITS 0x00021003 +#define GLFW_ALPHA_BITS 0x00021004 +#define GLFW_DEPTH_BITS 0x00021005 +#define GLFW_STENCIL_BITS 0x00021006 +#define GLFW_ACCUM_RED_BITS 0x00021007 +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +#define GLFW_AUX_BUFFERS 0x0002100B +#define GLFW_STEREO 0x0002100C +#define GLFW_SAMPLES 0x0002100D +#define GLFW_SRGB_CAPABLE 0x0002100E +#define GLFW_REFRESH_RATE 0x0002100F +#define GLFW_DOUBLEBUFFER 0x00021010 + +#define GLFW_CLIENT_API 0x00022001 +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +#define GLFW_CONTEXT_REVISION 0x00022004 +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +#define GLFW_OPENGL_PROFILE 0x00022008 +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +#define GLFW_CONTEXT_CREATION_API 0x0002200B + +#define GLFW_NO_API 0 +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 + +/*! @defgroup shapes Standard cursor shapes + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref context_glext + * @sa glfwGetProcAddress + * + * @since Added in version 3.0. + + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup cursor + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function signature for error callbacks. + * + * This is the function signature for error callback functions. + * + * @param[in] error An [error code](@ref errors). + * @param[in] description A UTF-8 encoded string describing the error. + * + * @sa @ref error_handling + * @sa glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int,const char*); + +/*! @brief The function signature for window position callbacks. + * + * This is the function signature for window position callback functions. + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * + * @sa @ref window_pos + * @sa glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window resize callbacks. + * + * This is the function signature for window size callback functions. + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa @ref window_size + * @sa glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window close callbacks. + * + * This is the function signature for window close callback functions. + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/*! @brief The function signature for window content refresh callbacks. + * + * This is the function signature for window refresh callback functions. + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/*! @brief The function signature for window focus/defocus callbacks. + * + * This is the function signature for window focus callback functions. + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/*! @brief The function signature for window iconify/restore callbacks. + * + * This is the function signature for window iconify/restore callback + * functions. + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/*! @brief The function signature for framebuffer resize callbacks. + * + * This is the function signature for framebuffer resize callback + * functions. + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa @ref window_fbsize + * @sa glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for mouse button callbacks. + * + * This is the function signature for mouse button callback functions. + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); + +/*! @brief The function signature for cursor position callbacks. + * + * This is the function signature for cursor position callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the client area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * client area. + * + * @sa @ref cursor_pos + * @sa glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for cursor enter/leave callbacks. + * + * This is the function signature for cursor enter/leave callback functions. + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's client + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); + +/*! @brief The function signature for scroll callbacks. + * + * This is the function signature for scroll callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa @ref scrolling + * @sa glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for keyboard key callbacks. + * + * This is the function signature for keyboard key callback functions. + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); + +/*! @brief The function signature for Unicode character callbacks. + * + * This is the function signature for Unicode character callback functions. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); + +/*! @brief The function signature for Unicode character with modifiers + * callbacks. + * + * This is the function signature for Unicode character with modifiers callback + * functions. It is called for each input character, regardless of what + * modifier keys are held down. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_char + * @sa glfwSetCharModsCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); + +/*! @brief The function signature for file drop callbacks. + * + * This is the function signature for file drop callbacks. + * + * @param[in] window The window that received the event. + * @param[in] count The number of dropped files. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @sa @ref path_drop + * @sa glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); + +/*! @brief The function signature for monitor configuration callbacks. + * + * This is the function signature for monitor configuration callback functions. + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa @ref monitor_event + * @sa glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); + +/*! @brief The function signature for joystick configuration callbacks. + * + * This is the function signature for joystick configuration callback + * functions. + * + * @param[in] joy The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa @ref joystick_event + * @sa glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int,int); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoMode glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @ingroup monitor + */ +typedef struct GLFWvidmode +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa @ref monitor_gamma + * @sa glfwGetGammaRamp glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWgammaramp +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GLFW_TRUE` immediately. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @osx This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa glfwTerminate + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa glfwGetVersionString + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns the compile-time generated + * [version string](@ref intro_version_string) of the GLFW library binary. It + * describes the version, platform, compiler and any platform-specific + * compile-time options. It should not be confused with the OpenGL or OpenGL + * ES version string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @param[out] count Where to store the number of monitors in the returned + * array. This is set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * monitor configuration changes or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa glfwGetPrimaryMonitor + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa glfwGetMonitors + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 calculates the returned physical size from the + * current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths) and then by resolution area (the + * product of width and height). + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 Changed to return an array of modes for a specific monitor. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoModes + * + * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates a 256-element gamma ramp from the specified exponent + * and then calls @ref glfwSetGammaRamp with it. The value must be a finite + * number greater than zero. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + * This function returns the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned structure and its arrays are allocated and + * freed by GLFW. You should not free them yourself. They are valid until the + * specified monitor is disconnected, this function is called again for that + * monitor or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark Gamma ramp sizes other than 256 are not supported by all platforms + * or graphics hardware. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa glfwWindowHint + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to @ref + * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is + * terminated. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. + * + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is + * recommended that you pick the primary monitor. For more information on how + * to query connected monitors, see @ref monitor_monitors. + * + * For full screen windows, the specified size becomes the resolution of the + * window's _desired video mode_. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video + * mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called _windowed full screen_ + * or _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. If the window has an + * OpenGL or OpenGL ES context, it will be unaffected. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * As long as at least one full screen window is not iconified, the screensaver + * is prohibited from starting. + * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` for + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_WINLOGO` icon will be used instead. To set a different icon, see + * @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @osx The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @osx The first time a window is created the menu bar is populated + * with common commands like Hide, Quit and About. The About entry opens + * a minimal about dialog with information from the application's bundle. The + * menu bar can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @remark @osx On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the `NSHighResolutionCapable` + * key is enabled in the application bundle's `Info.plist`. For more + * information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa glfwDestroyWindow + * + * @since Added in version 3.0. Replaces `glfwOpenWindow`. + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * If the context of the specified window is current on the main thread, it is + * detached before being destroyed. + * + * @param[in] window The window to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa glfwCreateWindow + * + * @since Added in version 3.0. Replaces `glfwCloseWindow`. + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @osx The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @osx The GLFW window has no icon, as it is not a document + * window, so this function does nothing. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the client area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the client area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the client area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the client area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the client area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the client area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the client area. + * @param[in] ypos The y-coordinate of the upper-left corner of the client area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the client area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the client area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * client area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * client area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the client area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the client area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the client area of the specified window. + * + * This function sets the size, in screen coordinates, of the client area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * + * @param[in] window The window to resize. + * @param[in] width The desired width, in screen coordinates, of the window + * client area. + * @param[in] height The desired height, in screen coordinates, of the window + * client area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa glfwGetWindowSize + * @sa glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, the original monitor + * resolution is restored until the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwRestoreWindow + * @sa glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window if it was previously iconified + * (minimized) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is a full screen window, the resolution chosen for + * the window is restored on the selected monitor. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwIconifyWindow + * @sa glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwIconifyWindow + * @sa glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa glfwHideWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref window_hints_wnd) to disable + * this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window client area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc.. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * client area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * client area. + * @param[in] width The desired with, in screen coordinates, of the client area + * or video mode. + * @param[in] height The desired height, in screen coordinates, of the client + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa glfwGetWindowMonitor + * @sa glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa glfwGetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa glfwSetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the screen + * position of the upper-left corner of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @osx Selecting Quit from the application menu will trigger the close + * callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the client area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz or Aqua, where the window + * contents are saved off-screen, this callback may be called only very + * infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain events are sent directly to the application + * without going through the event queue, causing callbacks to be called + * outside of a call to one of the event processing functions. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa glfwWaitEvents + * @sa glfwWaitEventsTimeout + * + * @since Added in version 1.0. + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa glfwPollEvents + * @sa glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like @ref + * glfwPollEvents, i.e. the events in the queue are processed and the function + * then returns immediately. Processing events will cause the window and input + * callbacks associated with those events to be called. + * + * The timeout value must be a positive finite number. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa glfwPollEvents + * @sa glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa glfwWaitEvents + * @sa glfwWaitEventsTimeout + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa glfwSetInputMode + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + * area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + * If sticky mouse buttons are enabled, a mouse button press will ensure that + * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns the localized name of the specified printable key. + * + * This function returns the localized name of the specified printable key. + * This is intended for displaying key bindings to the user. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise + * the scancode is ignored. If a non-printable key or (if the key is + * `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is + * specified, this function returns `NULL`. + * + * This behavior allows you to pass in the arguments passed to the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The localized name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetKeyName, or until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to + * the key callback. + * + * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is + * not a valid key for this function. + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. + * + * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function + * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, + * even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the client area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the client area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the client area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the client area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa glfwSetCursorPos + * + * @since Added in version 3.0. Replaces `glfwGetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the client area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the client area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * client area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * client area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa glfwGetCursorPos + * + * @since Added in version 3.0. Replaces `glfwSetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel. They are arranged canonically as packed sequential rows, + * starting from the top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwDestroyCursor + * @sa glfwCreateStandardCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * client area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specified window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on OS X or Alt key + * on Windows. There is a + * [character with modifiers callback](@ref glfwSetCharModsCallback) that + * receives these events. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); + +/*! @brief Sets the cursor enter/exit callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the client area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); + +/*! @brief Sets the file drop callback. + * + * This function sets the file drop callback of the specified window, which is + * called when one or more dragged files are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int joy); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window The window that will own the clipboard contents. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window The window that will request the clipboard contents. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the value of the GLFW timer. + * + * This function returns the value of the GLFW timer. Unless the timer has + * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW + * was initialized. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current value, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal timer offset is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW timer. + * + * This function sets the value of the GLFW timer. It then continues to count + * up from that value. The value must be a positive finite number less than + * or equal to 18446744073.0, which is approximately 584.5 years. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of the timer is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal timer offset is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. A context can only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa glfwGetCurrentContext + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa glfwMakeContextCurrent + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current OpenGL or OpenGL ES + * context, i.e. the number of screen updates to wait from the time @ref + * glfwSwapBuffers was called before swapping the buffers and returning. This + * is sometimes called _vertical synchronization_, _vertical retrace + * synchronization_ or just _vsync_. + * + * Contexts that support either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, + * which allow the driver to swap even if a frame arrives a little bit late. + * You can check for the presence of these extensions using @ref + * glfwExtensionSupported. For more information about swap tearing, see the + * extension specifications. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @remark Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and context + * creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa glfwGetProcAddress + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified OpenGL or OpenGL ES + * [core or extension function](@ref context_glext), if it is supported + * by the current context. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader has been found. + * + * This function returns whether the Vulkan loader has been found. This check + * is performed by @ref glfwInit. + * + * The availability of a Vulkan loader does not by itself guarantee that window + * surface creation or even device creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary + * for Vulkan surface creation are available and @ref + * glfwGetPhysicalDevicePresentationSupport to check whether a queue family of + * a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is available, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contains `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remarks Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader was not found at initialization, this function returns + * `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE + * error. Call @ref glfwVulkanSupported to check whether the Vulkan loader was + * found. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remarks If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/include/GLFW/glfw3native.h b/include/GLFW/glfw3native.h new file mode 100644 index 0000000..30e1a57 --- /dev/null +++ b/include/GLFW/glfw3native.h @@ -0,0 +1,456 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2016 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. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you may define exactly one + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * * `GLFW_EXPOSE_NATIVE_MIR` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #undef APIENTRY + #include +#elif defined(GLFW_EXPOSE_NATIVE_COCOA) + #include + #if defined(__OBJC__) + #import + #else + typedef void* id; + #endif +#elif defined(GLFW_EXPOSE_NATIVE_X11) + #include + #include +#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include +#elif defined(GLFW_EXPOSE_NATIVE_MIR) + #include +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_GLX) + #include +#endif +#if defined(GLFW_EXPOSE_NATIVE_EGL) + #include +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_MIR) +/*! @brief Returns the `MirConnection*` used by GLFW. + * + * @return The `MirConnection*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirConnection* glfwGetMirDisplay(void); + +/*! @brief Returns the Mir output ID of the specified monitor. + * + * @return The Mir output ID of the specified monitor, or zero if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `MirSurface*` of the specified window. + * + * @return The `MirSurface*` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/lib/glfw3.lib b/lib/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..a00c640a958d847d93b3079a52dafbe56844c314 GIT binary patch literal 323518 zcmeEv3t(Jjnf6ICZPU^=@HM z5e3?=WXB?)xU82I(cML5UA(bXS#5!(;CcbP0lJE=tMDT$UVg+~F#q#@w{yOkGtD$% zW!?QxJ16gXzvun#_sjd8`ubdHVEEz%=lS)gd({Qqy(?FCb+6I+UE*_P_v#CJ8NGRd zVYDtbjE~>@zxLO%=z8N%_BUV{E&u;l7YD7;YmK^J<_e=#{xzWZc8v|Cc=qS+UB@WDW9w4Lq$M$RCEhN zW-y%zhLY(xS!m_Ul~QqM1EifvC*xMuCS){U$(D)(fx*F2ohL(PEMzC5E(_OBl!kHx zdEIHtOa;QxL?RFt7Q)$~!qz~gQmTowVAPCe0*OR4%3`fQVXy1oI?_K-94VH{<8>C> zW;7Oz#3I==#W6zIc6o*b~Cl&?&b#_~0R%9>d_W81N~l8YcDK=oE2 zzXcK4*P9v7k8wNuIztgXFNXqVCLRfAvOHEilBs{J*q<+ziY3j%p^#~1V&RBoN&mXt zEsPZ^h1^Kttq8LS4mqugAEcw1SR!MkQeNUbpY-+0jDpyx6;H>4@l+<}C9MUzH@u!A zQx~_)P{s;p(}}Q`{MJ134@=y^LV0{7x05Vzyl$Cs3$;f)8 zWQFEzIv5X!!*S1SIWUsXQB=dHEP3E}$JK;sg|hKb*0#Me1y5Is;zEgH81hQgN}ADh zG8T%YLgt2HirDe-k-|W(QYelgt|!XK34^>&huO%8BbbJu6%MDZ3{TY|SJ?%y2s>aM z>h|J93C)la3|nS25D(j-Xuu4>4dhnT6RcfvrRrdj(v)QrM>1?if+>`oc+d=>l7T0; z<#|23VduD(DM;Kc7Yilqbk>F(chM51V|o|UiBKRGMU$mm%ocWx=Ee{0V$uu-1JP(C zlaMYVjA)wN8P^p=Cn>{eGZc$Otw2y!iY!@FR^>@TrA%Z6CzwcxL?jlsqfzGQ#8@dm zP~19(nhc4aV~yejr3sZHd@8{R+Qe)$9JP@dMEuBhYnu3hOBpK`ipJ~+&pj%8B4@Mq zy0