mirror of
https://github.com/gwm17/glfw.git
synced 2024-11-26 12:18:51 -05:00
Merge branch 'master' into joystickname
Conflicts: src/x11_joystick.c
This commit is contained in:
commit
1fd9428287
|
@ -185,10 +185,6 @@ if (_GLFW_X11_GLX)
|
||||||
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl")
|
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
|
||||||
set(_GLFW_HAS_LINUX_JOYSTICKS 1)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
|
|
|
@ -577,8 +577,6 @@ int main( void )
|
||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetWindowSizeCallback( reshape );
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
||||||
|
|
||||||
window = glfwCreateWindow( 400, 400, GLFW_WINDOWED, "Boing (classic Amiga demo)", NULL );
|
window = glfwCreateWindow( 400, 400, GLFW_WINDOWED, "Boing (classic Amiga demo)", NULL );
|
||||||
|
@ -589,6 +587,8 @@ int main( void )
|
||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetWindowSizeCallback(window, reshape);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
|
|
@ -338,11 +338,6 @@ int main(int argc, char *argv[])
|
||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set callback functions
|
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
|
||||||
glfwSetWindowSizeCallback( reshape );
|
|
||||||
glfwSetKeyCallback( key );
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
||||||
|
|
||||||
window = glfwCreateWindow( 300, 300, GLFW_WINDOWED, "Gears", NULL );
|
window = glfwCreateWindow( 300, 300, GLFW_WINDOWED, "Gears", NULL );
|
||||||
|
@ -353,6 +348,11 @@ int main(int argc, char *argv[])
|
||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set callback functions
|
||||||
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
glfwSetWindowSizeCallback(window, reshape);
|
||||||
|
glfwSetKeyCallback(window, key);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
|
|
@ -595,12 +595,14 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
free(vertex_shader_src);
|
free(vertex_shader_src);
|
||||||
free(fragment_shader_src);
|
free(fragment_shader_src);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register events callback */
|
/* Register events callback */
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
if (GL_TRUE != init_opengl())
|
if (GL_TRUE != init_opengl())
|
||||||
|
@ -608,6 +610,8 @@ int main(int argc, char** argv)
|
||||||
fprintf(stderr, "ERROR: unable to resolve OpenGL function pointers\n");
|
fprintf(stderr, "ERROR: unable to resolve OpenGL function pointers\n");
|
||||||
free(vertex_shader_src);
|
free(vertex_shader_src);
|
||||||
free(fragment_shader_src);
|
free(fragment_shader_src);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
/* Prepare opengl resources for rendering */
|
/* Prepare opengl resources for rendering */
|
||||||
|
@ -619,6 +623,8 @@ int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR: during creation of the shader program\n");
|
fprintf(stderr, "ERROR: during creation of the shader program\n");
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -683,6 +689,7 @@ int main(int argc, char** argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -450,12 +450,6 @@ int main(void)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set callback functions
|
|
||||||
glfwSetWindowSizeCallback(windowSizeFun);
|
|
||||||
glfwSetWindowRefreshCallback(windowRefreshFun);
|
|
||||||
glfwSetCursorPosCallback(cursorPosFun);
|
|
||||||
glfwSetMouseButtonCallback(mouseButtonFun);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
||||||
|
|
||||||
// Open OpenGL window
|
// Open OpenGL window
|
||||||
|
@ -463,9 +457,17 @@ int main(void)
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window\n");
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set callback functions
|
||||||
|
glfwSetWindowSizeCallback(window, windowSizeFun);
|
||||||
|
glfwSetWindowRefreshCallback(window, windowRefreshFun);
|
||||||
|
glfwSetCursorPosCallback(window, cursorPosFun);
|
||||||
|
glfwSetMouseButtonCallback(window, mouseButtonFun);
|
||||||
|
|
||||||
// Enable vsync
|
// Enable vsync
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
|
@ -27,6 +27,8 @@ int main(void)
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window\n");
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -399,13 +399,6 @@ int main(int argc, char* argv[])
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetKeyCallback(key_callback);
|
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
|
||||||
glfwSetMouseButtonCallback(mouse_button_callback);
|
|
||||||
glfwSetCursorPosCallback(cursor_position_callback);
|
|
||||||
glfwSetScrollCallback(scroll_callback);
|
|
||||||
|
|
||||||
window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Wave Simulation", NULL);
|
window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Wave Simulation", NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
|
@ -413,6 +406,13 @@ int main(int argc, char* argv[])
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
|
glfwSetCursorPosCallback(window, cursor_position_callback);
|
||||||
|
glfwSetScrollCallback(window, scroll_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
|
|
@ -141,7 +141,7 @@ extern "C" {
|
||||||
/* Include the chosen OpenGL header and, optionally, the GLU header.
|
/* Include the chosen OpenGL header and, optionally, the GLU header.
|
||||||
*/
|
*/
|
||||||
#if defined(__APPLE_CC__)
|
#if defined(__APPLE_CC__)
|
||||||
#if defined(GLFW_INCLUDE_GL3)
|
#if defined(GLFW_INCLUDE_GLCOREARB)
|
||||||
#include <OpenGL/gl3.h>
|
#include <OpenGL/gl3.h>
|
||||||
#else
|
#else
|
||||||
#define GL_GLEXT_LEGACY
|
#define GL_GLEXT_LEGACY
|
||||||
|
@ -151,8 +151,8 @@ extern "C" {
|
||||||
#include <OpenGL/glu.h>
|
#include <OpenGL/glu.h>
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#if defined(GLFW_INCLUDE_GL3)
|
#if defined(GLFW_INCLUDE_GLCOREARB)
|
||||||
#include <GL3/gl3.h>
|
#include <GL/glcorearb.h>
|
||||||
#else
|
#else
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -404,14 +404,19 @@ extern "C" {
|
||||||
/* The following constants are used with both glfwGetWindowParam
|
/* The following constants are used with both glfwGetWindowParam
|
||||||
* and glfwWindowHint
|
* and glfwWindowHint
|
||||||
*/
|
*/
|
||||||
#define GLFW_OPENGL_VERSION_MAJOR 0x00022000
|
#define GLFW_CLIENT_API 0x00022000
|
||||||
#define GLFW_OPENGL_VERSION_MINOR 0x00022001
|
#define GLFW_OPENGL_VERSION_MAJOR 0x00022001
|
||||||
#define GLFW_OPENGL_FORWARD_COMPAT 0x00022002
|
#define GLFW_OPENGL_VERSION_MINOR 0x00022002
|
||||||
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022003
|
#define GLFW_OPENGL_FORWARD_COMPAT 0x00022003
|
||||||
#define GLFW_OPENGL_PROFILE 0x00022004
|
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022004
|
||||||
#define GLFW_OPENGL_ROBUSTNESS 0x00022005
|
#define GLFW_OPENGL_PROFILE 0x00022005
|
||||||
#define GLFW_RESIZABLE 0x00022006
|
#define GLFW_OPENGL_ROBUSTNESS 0x00022006
|
||||||
#define GLFW_VISIBLE 0x00022007
|
#define GLFW_RESIZABLE 0x00022007
|
||||||
|
#define GLFW_VISIBLE 0x00022008
|
||||||
|
|
||||||
|
/* GLFW_CLIENT_API tokens */
|
||||||
|
#define GLFW_OPENGL_API 0x00000001
|
||||||
|
#define GLFW_OPENGL_ES_API 0x00000002
|
||||||
|
|
||||||
/* GLFW_OPENGL_ROBUSTNESS mode tokens */
|
/* GLFW_OPENGL_ROBUSTNESS mode tokens */
|
||||||
#define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000
|
#define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000
|
||||||
|
@ -422,7 +427,6 @@ extern "C" {
|
||||||
#define GLFW_OPENGL_NO_PROFILE 0x00000000
|
#define GLFW_OPENGL_NO_PROFILE 0x00000000
|
||||||
#define GLFW_OPENGL_CORE_PROFILE 0x00000001
|
#define GLFW_OPENGL_CORE_PROFILE 0x00000001
|
||||||
#define GLFW_OPENGL_COMPAT_PROFILE 0x00000002
|
#define GLFW_OPENGL_COMPAT_PROFILE 0x00000002
|
||||||
#define GLFW_OPENGL_ES2_PROFILE 0x00000004
|
|
||||||
|
|
||||||
/* glfwGetInputMode/glfwSetInputMode tokens */
|
/* glfwGetInputMode/glfwSetInputMode tokens */
|
||||||
#define GLFW_CURSOR_MODE 0x00030001
|
#define GLFW_CURSOR_MODE 0x00030001
|
||||||
|
@ -525,6 +529,7 @@ GLFWAPI void glfwGetGammaRamp(GLFWgammaramp* ramp);
|
||||||
GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp);
|
GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp);
|
||||||
|
|
||||||
/* Window handling */
|
/* Window handling */
|
||||||
|
GLFWAPI void glfwDefaultWindowHints(void);
|
||||||
GLFWAPI void glfwWindowHint(int target, int hint);
|
GLFWAPI void glfwWindowHint(int target, int hint);
|
||||||
GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, int mode, const char* title, GLFWwindow share);
|
GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, int mode, const char* title, GLFWwindow share);
|
||||||
GLFWAPI void glfwDestroyWindow(GLFWwindow window);
|
GLFWAPI void glfwDestroyWindow(GLFWwindow window);
|
||||||
|
@ -540,11 +545,11 @@ GLFWAPI void glfwHideWindow(GLFWwindow window);
|
||||||
GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
|
GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
|
||||||
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
|
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
|
||||||
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
|
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
|
||||||
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun);
|
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun);
|
||||||
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun);
|
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun);
|
||||||
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun);
|
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun);
|
||||||
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun);
|
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun);
|
||||||
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun);
|
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun);
|
||||||
|
|
||||||
/* Event handling */
|
/* Event handling */
|
||||||
GLFWAPI void glfwPollEvents(void);
|
GLFWAPI void glfwPollEvents(void);
|
||||||
|
@ -558,12 +563,12 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow window, int button);
|
||||||
GLFWAPI void glfwGetCursorPos(GLFWwindow window, int* xpos, int* ypos);
|
GLFWAPI void glfwGetCursorPos(GLFWwindow window, int* xpos, int* ypos);
|
||||||
GLFWAPI void glfwSetCursorPos(GLFWwindow window, int xpos, int ypos);
|
GLFWAPI void glfwSetCursorPos(GLFWwindow window, int xpos, int ypos);
|
||||||
GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yoffset);
|
GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yoffset);
|
||||||
GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun);
|
GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun);
|
||||||
GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun);
|
GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun);
|
||||||
GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun);
|
GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cbfun);
|
||||||
GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun);
|
GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun);
|
||||||
GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun);
|
GLFWAPI void glfwSetCursorEnterCallback(GLFWwindow window, GLFWcursorenterfun cbfun);
|
||||||
GLFWAPI void glfwSetScrollCallback(GLFWscrollfun cbfun);
|
GLFWAPI void glfwSetScrollCallback(GLFWwindow window, GLFWscrollfun cbfun);
|
||||||
|
|
||||||
/* Joystick input */
|
/* Joystick input */
|
||||||
GLFWAPI int glfwGetJoystickParam(int joy, int param);
|
GLFWAPI int glfwGetJoystickParam(int joy, int param);
|
||||||
|
|
|
@ -268,6 +268,7 @@ version of GLFW.</p>
|
||||||
<h3>v3.0</h3>
|
<h3>v3.0</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Added <code>GLFWwindow</code> window handle type and updated window-related functions and callbacks to take a window handle</li>
|
<li>Added <code>GLFWwindow</code> window handle type and updated window-related functions and callbacks to take a window handle</li>
|
||||||
|
<li>Added <code>glfwDefaultWindowHints</code> function for resetting all window hints to their default values</li>
|
||||||
<li>Added <code>glfwMakeContextCurrent</code> function for making the context of the specified window current</li>
|
<li>Added <code>glfwMakeContextCurrent</code> function for making the context of the specified window current</li>
|
||||||
<li>Added <code>glfwGetError</code> and <code>glfwErrorString</code> error reporting functions and a number of error tokens</li>
|
<li>Added <code>glfwGetError</code> and <code>glfwErrorString</code> error reporting functions and a number of error tokens</li>
|
||||||
<li>Added <code>glfwSetErrorCallback</code> function and <code>GLFWerrorfun</code> type for receiving more specific and/or nested errors</li>
|
<li>Added <code>glfwSetErrorCallback</code> function and <code>GLFWerrorfun</code> type for receiving more specific and/or nested errors</li>
|
||||||
|
@ -279,10 +280,10 @@ version of GLFW.</p>
|
||||||
<li>Added <code>glfwGetClipboardString</code> and <code>glfwSetClipboardString</code> functions for interacting with the system clipboard</li>
|
<li>Added <code>glfwGetClipboardString</code> and <code>glfwSetClipboardString</code> functions for interacting with the system clipboard</li>
|
||||||
<li>Added <code>glfwGetCurrentContext</code> function for retrieving the window whose OpenGL context is current</li>
|
<li>Added <code>glfwGetCurrentContext</code> function for retrieving the window whose OpenGL context is current</li>
|
||||||
<li>Added <code>glfwCopyContext</code> function for copying OpenGL state categories between contexts</li>
|
<li>Added <code>glfwCopyContext</code> function for copying OpenGL state categories between contexts</li>
|
||||||
<li>Added <code>GLFW_OPENGL_ES2_PROFILE</code> profile for creating OpenGL ES 2.0 contexts using the <code>GLX_EXT_create_context_es2_profile</code> and <code>WGL_EXT_create_context_es2_profile</code> extensions</li>
|
<li>Added <code>GLFW_CLIENT_API</code>, <code>GLFW_OPENGL_API</code> and <code>GLFW_OPENGL_ES_API</code> for selecting client API</li>
|
||||||
<li>Added <code>GLFW_OPENGL_ROBUSTNESS</code> window hint and associated strategy tokens for <code>GL_ARB_robustness</code> support</li>
|
<li>Added <code>GLFW_OPENGL_ROBUSTNESS</code> window hint and associated strategy tokens for <code>GL_ARB_robustness</code> support</li>
|
||||||
<li>Added <code>GLFW_OPENGL_REVISION</code> window parameter to make up for removal of <code>glfwGetGLVersion</code></li>
|
<li>Added <code>GLFW_OPENGL_REVISION</code> window parameter to make up for removal of <code>glfwGetGLVersion</code></li>
|
||||||
<li>Added <code>GLFW_INCLUDE_GL3</code> macro for telling the GLFW header to include <code>gl3.h</code> header instead of <code>gl.h</code></li>
|
<li>Added <code>GLFW_INCLUDE_GLCOREARB</code> macro for including <code>glcorearb.h</code> instead of <code>gl.h</code></li>
|
||||||
<li>Added <code>GLFW_VISIBLE</code> window hint and parameter for controlling and polling window visibility</li>
|
<li>Added <code>GLFW_VISIBLE</code> window hint and parameter for controlling and polling window visibility</li>
|
||||||
<li>Added <code>windows</code> simple multi-window test program</li>
|
<li>Added <code>windows</code> simple multi-window test program</li>
|
||||||
<li>Added <code>sharing</code> simple OpenGL object sharing test program</li>
|
<li>Added <code>sharing</code> simple OpenGL object sharing test program</li>
|
||||||
|
@ -317,6 +318,7 @@ version of GLFW.</p>
|
||||||
<li>Removed the entire threading API</li>
|
<li>Removed the entire threading API</li>
|
||||||
<li>Removed the entire image loading API</li>
|
<li>Removed the entire image loading API</li>
|
||||||
<li>Removed deprecated Carbon port</li>
|
<li>Removed deprecated Carbon port</li>
|
||||||
|
<li>Removed registering <code>glfwTerminate</code> with <code>atexit</code></li>
|
||||||
<li>Removed <code>glfwSleep</code> function</li>
|
<li>Removed <code>glfwSleep</code> function</li>
|
||||||
<li>Removed <code>glfwGetNumberOfProcessors</code> function</li>
|
<li>Removed <code>glfwGetNumberOfProcessors</code> function</li>
|
||||||
<li>Removed <code>glfwGetGLVersion</code> function</li>
|
<li>Removed <code>glfwGetGLVersion</code> function</li>
|
||||||
|
|
|
@ -2,6 +2,10 @@ include_directories(${GLFW_SOURCE_DIR}/src
|
||||||
${GLFW_BINARY_DIR}/src
|
${GLFW_BINARY_DIR}/src
|
||||||
${glfw_INCLUDE_DIRS})
|
${glfw_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h)
|
set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h)
|
||||||
set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c
|
set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c
|
||||||
joystick.c opengl.c time.c window.c)
|
joystick.c opengl.c time.c window.c)
|
||||||
|
|
|
@ -654,9 +654,9 @@ static GLboolean initializeAppKit(void)
|
||||||
// Implicitly create shared NSApplication instance
|
// Implicitly create shared NSApplication instance
|
||||||
[GLFWApplication sharedApplication];
|
[GLFWApplication sharedApplication];
|
||||||
|
|
||||||
// Setting up the menu bar must go between sharedApplication
|
// Menu bar setup must go between sharedApplication above and
|
||||||
// above and finishLaunching below, in order to properly emulate the
|
// finishLaunching below, in order to properly emulate the behavior
|
||||||
// behavior of NSApplicationMain
|
// of NSApplicationMain
|
||||||
createMenuBar();
|
createMenuBar();
|
||||||
|
|
||||||
[NSApp finishLaunching];
|
[NSApp finishLaunching];
|
||||||
|
@ -729,6 +729,13 @@ static GLboolean createContext(_GLFWwindow* window,
|
||||||
else if (colorBits < 15)
|
else if (colorBits < 15)
|
||||||
colorBits = 15;
|
colorBits = 15;
|
||||||
|
|
||||||
|
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_VERSION_UNAVAILABLE,
|
||||||
|
"Cocoa/NSOpenGL: NSOpenGL does not support OpenGL ES");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
|
||||||
// Fail if any OpenGL version above 2.1 other than 3.2 was requested
|
// Fail if any OpenGL version above 2.1 other than 3.2 was requested
|
||||||
if (wndconfig->glMajor > 3 ||
|
if (wndconfig->glMajor > 3 ||
|
||||||
|
@ -962,7 +969,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||||
[window->NSGL.pixelFormat release];
|
[window->NSGL.pixelFormat release];
|
||||||
window->NSGL.pixelFormat = nil;
|
window->NSGL.pixelFormat = nil;
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
[window->NSGL.context release];
|
[window->NSGL.context release];
|
||||||
window->NSGL.context = nil;
|
window->NSGL.context = nil;
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,6 @@
|
||||||
// Define this to 1 if glXGetProcAddressEXT is available
|
// Define this to 1 if glXGetProcAddressEXT is available
|
||||||
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT
|
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT
|
||||||
|
|
||||||
// Define this to 1 if the Linux joystick API is available
|
|
||||||
#cmakedefine _GLFW_HAS_LINUX_JOYSTICKS
|
|
||||||
|
|
||||||
// The GLFW version as used by glfwGetVersionString
|
// The GLFW version as used by glfwGetVersionString
|
||||||
#define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@"
|
#define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@"
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,12 @@ GLFWAPI void glfwSetGamma(float gamma)
|
||||||
value = (float) i / (float) (size - 1);
|
value = (float) i / (float) (size - 1);
|
||||||
// Apply gamma curve
|
// Apply gamma curve
|
||||||
value = (float) pow(value, 1.f / gamma) * 65535.f + 0.5f;
|
value = (float) pow(value, 1.f / gamma) * 65535.f + 0.5f;
|
||||||
|
|
||||||
// Clamp to value range
|
// Clamp to value range
|
||||||
value = (float) fmax(fmin(value, 65535.f), 0.f);
|
if (value < 0.f)
|
||||||
|
value = 0.f;
|
||||||
|
else if (value > 65535.f)
|
||||||
|
value = 65535.f;
|
||||||
|
|
||||||
ramp.red[i] = (unsigned short) value;
|
ramp.red[i] = (unsigned short) value;
|
||||||
ramp.green[i] = (unsigned short) value;
|
ramp.green[i] = (unsigned short) value;
|
||||||
|
|
|
@ -121,19 +121,17 @@ GLFWAPI int glfwInit(void)
|
||||||
|
|
||||||
memset(&_glfwLibrary, 0, sizeof(_glfwLibrary));
|
memset(&_glfwLibrary, 0, sizeof(_glfwLibrary));
|
||||||
|
|
||||||
// Not all window hints have zero as their default value
|
|
||||||
_glfwSetDefaultWindowHints();
|
|
||||||
|
|
||||||
if (!_glfwPlatformInit())
|
if (!_glfwPlatformInit())
|
||||||
{
|
{
|
||||||
_glfwPlatformTerminate();
|
_glfwPlatformTerminate();
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
atexit(glfwTerminate);
|
|
||||||
|
|
||||||
_glfwInitialized = GL_TRUE;
|
_glfwInitialized = GL_TRUE;
|
||||||
|
|
||||||
|
// Not all window hints have zero as their default value
|
||||||
|
glfwDefaultWindowHints();
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
64
src/input.c
64
src/input.c
|
@ -172,8 +172,8 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call user callback function
|
// Call user callback function
|
||||||
if (_glfwLibrary.keyCallback && (window->keyRepeat || !repeated))
|
if (window->keyCallback && (window->keyRepeat || !repeated))
|
||||||
_glfwLibrary.keyCallback(window, key, action);
|
window->keyCallback(window, key, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,8 +187,8 @@ void _glfwInputChar(_GLFWwindow* window, int character)
|
||||||
if (!((character >= 32 && character <= 126) || character >= 160))
|
if (!((character >= 32 && character <= 126) || character >= 160))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_glfwLibrary.charCallback)
|
if (window->charCallback)
|
||||||
_glfwLibrary.charCallback(window, character);
|
window->charCallback(window, character);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,8 +201,8 @@ void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
|
||||||
window->scrollX += xoffset;
|
window->scrollX += xoffset;
|
||||||
window->scrollY += yoffset;
|
window->scrollY += yoffset;
|
||||||
|
|
||||||
if (_glfwLibrary.scrollCallback)
|
if (window->scrollCallback)
|
||||||
_glfwLibrary.scrollCallback(window, xoffset, yoffset);
|
window->scrollCallback(window, xoffset, yoffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -221,8 +221,8 @@ void _glfwInputMouseClick(_GLFWwindow* window, int button, int action)
|
||||||
else
|
else
|
||||||
window->mouseButton[button] = (char) action;
|
window->mouseButton[button] = (char) action;
|
||||||
|
|
||||||
if (_glfwLibrary.mouseButtonCallback)
|
if (window->mouseButtonCallback)
|
||||||
_glfwLibrary.mouseButtonCallback(window, button, action);
|
window->mouseButtonCallback(window, button, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -249,11 +249,11 @@ void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y)
|
||||||
window->cursorPosY = y;
|
window->cursorPosY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfwLibrary.cursorPosCallback)
|
if (window->cursorPosCallback)
|
||||||
{
|
{
|
||||||
_glfwLibrary.cursorPosCallback(window,
|
window->cursorPosCallback(window,
|
||||||
window->cursorPosX,
|
window->cursorPosX,
|
||||||
window->cursorPosY);
|
window->cursorPosY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,8 +264,8 @@ void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y)
|
||||||
|
|
||||||
void _glfwInputCursorEnter(_GLFWwindow* window, int entered)
|
void _glfwInputCursorEnter(_GLFWwindow* window, int entered)
|
||||||
{
|
{
|
||||||
if (_glfwLibrary.cursorEnterCallback)
|
if (window->cursorEnterCallback)
|
||||||
_glfwLibrary.cursorEnterCallback(window, entered);
|
window->cursorEnterCallback(window, entered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -494,15 +494,17 @@ GLFWAPI void glfwGetScrollOffset(GLFWwindow handle, double* xoffset, double* yof
|
||||||
// Set callback function for keyboard input
|
// Set callback function for keyboard input
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun)
|
GLFWAPI void glfwSetKeyCallback(GLFWwindow handle, GLFWkeyfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.keyCallback = cbfun;
|
window->keyCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,15 +512,17 @@ GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun)
|
||||||
// Set callback function for character input
|
// Set callback function for character input
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun)
|
GLFWAPI void glfwSetCharCallback(GLFWwindow handle, GLFWcharfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.charCallback = cbfun;
|
window->charCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -526,15 +530,17 @@ GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun)
|
||||||
// Set callback function for mouse clicks
|
// Set callback function for mouse clicks
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun)
|
GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow handle, GLFWmousebuttonfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.mouseButtonCallback = cbfun;
|
window->mouseButtonCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -542,15 +548,17 @@ GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun)
|
||||||
// Set callback function for mouse moves
|
// Set callback function for mouse moves
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun)
|
GLFWAPI void glfwSetCursorPosCallback(GLFWwindow handle, GLFWcursorposfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.cursorPosCallback = cbfun;
|
window->cursorPosCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -558,15 +566,17 @@ GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun)
|
||||||
// Set callback function for cursor enter/leave events
|
// Set callback function for cursor enter/leave events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun)
|
GLFWAPI void glfwSetCursorEnterCallback(GLFWwindow handle, GLFWcursorenterfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.cursorEnterCallback = cbfun;
|
window->cursorEnterCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -574,14 +584,16 @@ GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun)
|
||||||
// Set callback function for scroll events
|
// Set callback function for scroll events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetScrollCallback(GLFWscrollfun cbfun)
|
GLFWAPI void glfwSetScrollCallback(GLFWwindow handle, GLFWscrollfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.scrollCallback = cbfun;
|
window->scrollCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,7 @@ struct _GLFWhints
|
||||||
GLboolean resizable;
|
GLboolean resizable;
|
||||||
GLboolean visible;
|
GLboolean visible;
|
||||||
int samples;
|
int samples;
|
||||||
|
int clientAPI;
|
||||||
int glMajor;
|
int glMajor;
|
||||||
int glMinor;
|
int glMinor;
|
||||||
GLboolean glForward;
|
GLboolean glForward;
|
||||||
|
@ -122,6 +123,7 @@ struct _GLFWwndconfig
|
||||||
int refreshRate;
|
int refreshRate;
|
||||||
GLboolean resizable;
|
GLboolean resizable;
|
||||||
GLboolean visible;
|
GLboolean visible;
|
||||||
|
int clientAPI;
|
||||||
int glMajor;
|
int glMajor;
|
||||||
int glMinor;
|
int glMinor;
|
||||||
GLboolean glForward;
|
GLboolean glForward;
|
||||||
|
@ -170,7 +172,7 @@ struct _GLFWwindow
|
||||||
GLboolean closeRequested; // GL_TRUE if this window should be closed
|
GLboolean closeRequested; // GL_TRUE if this window should be closed
|
||||||
int width, height;
|
int width, height;
|
||||||
int positionX, positionY;
|
int positionX, positionY;
|
||||||
int mode; // GLFW_WINDOW or GLFW_FULLSCREEN
|
int mode; // GLFW_WINDOWED or GLFW_FULLSCREEN
|
||||||
GLboolean resizable; // GL_TRUE if user may resize this window
|
GLboolean resizable; // GL_TRUE if user may resize this window
|
||||||
GLboolean visible; // GL_TRUE if this window is visible
|
GLboolean visible; // GL_TRUE if this window is visible
|
||||||
int refreshRate; // monitor refresh rate
|
int refreshRate; // monitor refresh rate
|
||||||
|
@ -188,12 +190,25 @@ struct _GLFWwindow
|
||||||
char key[GLFW_KEY_LAST + 1];
|
char key[GLFW_KEY_LAST + 1];
|
||||||
|
|
||||||
// OpenGL extensions and context attributes
|
// OpenGL extensions and context attributes
|
||||||
|
int clientAPI;
|
||||||
int glMajor, glMinor, glRevision;
|
int glMajor, glMinor, glRevision;
|
||||||
GLboolean glForward, glDebug;
|
GLboolean glForward, glDebug;
|
||||||
int glProfile;
|
int glProfile;
|
||||||
int glRobustness;
|
int glRobustness;
|
||||||
PFNGLGETSTRINGIPROC GetStringi;
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
|
||||||
|
GLFWwindowsizefun windowSizeCallback;
|
||||||
|
GLFWwindowclosefun windowCloseCallback;
|
||||||
|
GLFWwindowrefreshfun windowRefreshCallback;
|
||||||
|
GLFWwindowfocusfun windowFocusCallback;
|
||||||
|
GLFWwindowiconifyfun windowIconifyCallback;
|
||||||
|
GLFWmousebuttonfun mouseButtonCallback;
|
||||||
|
GLFWcursorposfun cursorPosCallback;
|
||||||
|
GLFWcursorenterfun cursorEnterCallback;
|
||||||
|
GLFWscrollfun scrollCallback;
|
||||||
|
GLFWkeyfun keyCallback;
|
||||||
|
GLFWcharfun charCallback;
|
||||||
|
|
||||||
// These are defined in the current port's platform.h
|
// These are defined in the current port's platform.h
|
||||||
_GLFW_PLATFORM_WINDOW_STATE;
|
_GLFW_PLATFORM_WINDOW_STATE;
|
||||||
_GLFW_PLATFORM_CONTEXT_STATE;
|
_GLFW_PLATFORM_CONTEXT_STATE;
|
||||||
|
@ -210,18 +225,6 @@ struct _GLFWlibrary
|
||||||
_GLFWwindow* windowListHead;
|
_GLFWwindow* windowListHead;
|
||||||
_GLFWwindow* activeWindow;
|
_GLFWwindow* activeWindow;
|
||||||
|
|
||||||
GLFWwindowsizefun windowSizeCallback;
|
|
||||||
GLFWwindowclosefun windowCloseCallback;
|
|
||||||
GLFWwindowrefreshfun windowRefreshCallback;
|
|
||||||
GLFWwindowfocusfun windowFocusCallback;
|
|
||||||
GLFWwindowiconifyfun windowIconifyCallback;
|
|
||||||
GLFWmousebuttonfun mouseButtonCallback;
|
|
||||||
GLFWcursorposfun cursorPosCallback;
|
|
||||||
GLFWcursorenterfun cursorEnterCallback;
|
|
||||||
GLFWscrollfun scrollCallback;
|
|
||||||
GLFWkeyfun keyCallback;
|
|
||||||
GLFWcharfun charCallback;
|
|
||||||
|
|
||||||
GLFWgammaramp currentRamp;
|
GLFWgammaramp currentRamp;
|
||||||
GLFWgammaramp originalRamp;
|
GLFWgammaramp originalRamp;
|
||||||
int originalRampSize;
|
int originalRampSize;
|
||||||
|
@ -348,9 +351,6 @@ void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
|
||||||
// Error handling (init.c)
|
// Error handling (init.c)
|
||||||
void _glfwSetError(int error, const char* format, ...);
|
void _glfwSetError(int error, const char* format, ...);
|
||||||
|
|
||||||
// Window management (window.c)
|
|
||||||
void _glfwSetDefaultWindowHints(void);
|
|
||||||
|
|
||||||
// OpenGL context helpers (opengl.c)
|
// OpenGL context helpers (opengl.c)
|
||||||
int _glfwStringInExtensionString(const char* string, const GLubyte* extensions);
|
int _glfwStringInExtensionString(const char* string, const GLubyte* extensions);
|
||||||
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
|
|
178
src/opengl.c
178
src/opengl.c
|
@ -36,15 +36,17 @@
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Parses the OpenGL version string and extracts the version number
|
// Parses the client API version string and extracts the version number
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
static GLboolean parseGLVersion(int* major, int* minor, int* rev)
|
static GLboolean parseGLVersion(int* api, int* major, int* minor, int* rev)
|
||||||
{
|
{
|
||||||
int i, _major, _minor = 0, _rev = 0;
|
int i, _api = GLFW_OPENGL_API, _major, _minor = 0, _rev = 0;
|
||||||
const char* version;
|
const char* version;
|
||||||
const char* prefixes[] =
|
const char* prefixes[] =
|
||||||
{
|
{
|
||||||
|
"OpenGL ES-CM ",
|
||||||
|
"OpenGL ES-CL ",
|
||||||
"OpenGL ES ",
|
"OpenGL ES ",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -63,6 +65,7 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev)
|
||||||
if (strncmp(version, prefixes[i], length) == 0)
|
if (strncmp(version, prefixes[i], length) == 0)
|
||||||
{
|
{
|
||||||
version += length;
|
version += length;
|
||||||
|
_api = GLFW_OPENGL_ES_API;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +76,7 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev)
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*api = _api;
|
||||||
*major = _major;
|
*major = _major;
|
||||||
*minor = _minor;
|
*minor = _minor;
|
||||||
*rev = _rev;
|
*rev = _rev;
|
||||||
|
@ -249,83 +253,119 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
|
|
||||||
GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig)
|
GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig)
|
||||||
{
|
{
|
||||||
if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0)
|
if (wndconfig->clientAPI != GLFW_OPENGL_API &&
|
||||||
|
wndconfig->clientAPI != GLFW_OPENGL_ES_API)
|
||||||
{
|
{
|
||||||
// OpenGL 1.0 is the smallest valid version
|
_glfwSetError(GLFW_INVALID_ENUM,
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
"glfwCreateWindow: Invalid client API requested");
|
||||||
"glfwCreateWindow: Invalid OpenGL version requested");
|
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5)
|
|
||||||
{
|
|
||||||
// OpenGL 1.x series ended with version 1.5
|
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
|
||||||
"glfwCreateWindow: Invalid OpenGL version requested");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1)
|
|
||||||
{
|
|
||||||
// OpenGL 2.x series ended with version 2.1
|
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
|
||||||
"glfwCreateWindow: Invalid OpenGL version requested");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3)
|
|
||||||
{
|
|
||||||
// OpenGL 3.x series ended with version 3.3
|
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
|
||||||
"glfwCreateWindow: Invalid OpenGL version requested");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// For now, let everything else through
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE)
|
if (wndconfig->clientAPI == GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
if (wndconfig->glMajor != 2 || wndconfig->glMinor < 0)
|
if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0)
|
||||||
{
|
{
|
||||||
// The OpenGL ES 2.0 profile is currently only defined for version
|
// OpenGL 1.0 is the smallest valid version
|
||||||
// 2.0 (see {WGL|GLX}_EXT_create_context_es2_profile), but for
|
|
||||||
// compatibility with future updates to OpenGL ES, we allow
|
|
||||||
// everything 2.x and let the driver report invalid 2.x versions
|
|
||||||
|
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
"glfwCreateWindow: Invalid OpenGL ES 2.x version requested");
|
"glfwCreateWindow: Invalid OpenGL version requested");
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
}
|
if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5)
|
||||||
else if (wndconfig->glProfile)
|
|
||||||
{
|
|
||||||
if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE &&
|
|
||||||
wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE)
|
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_INVALID_ENUM,
|
// OpenGL 1.x series ended with version 1.5
|
||||||
"glfwCreateWindow: Invalid OpenGL profile requested");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wndconfig->glMajor < 3 ||
|
|
||||||
(wndconfig->glMajor == 3 && wndconfig->glMinor < 2))
|
|
||||||
{
|
|
||||||
// Desktop OpenGL context profiles are only defined for version 3.2
|
|
||||||
// and above
|
|
||||||
|
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
"glfwCreateWindow: Context profiles only exist for "
|
"glfwCreateWindow: Invalid OpenGL version requested");
|
||||||
"OpenGL version 3.2 and above");
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1)
|
||||||
|
{
|
||||||
|
// OpenGL 2.x series ended with version 2.1
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Invalid OpenGL version requested");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3)
|
||||||
|
{
|
||||||
|
// OpenGL 3.x series ended with version 3.3
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Invalid OpenGL version requested");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// For now, let everything else through
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wndconfig->glProfile)
|
||||||
|
{
|
||||||
|
if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE &&
|
||||||
|
wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_INVALID_ENUM,
|
||||||
|
"glfwCreateWindow: Invalid OpenGL profile requested");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wndconfig->glMajor < 3 ||
|
||||||
|
(wndconfig->glMajor == 3 && wndconfig->glMinor < 2))
|
||||||
|
{
|
||||||
|
// Desktop OpenGL context profiles are only defined for version 3.2
|
||||||
|
// and above
|
||||||
|
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Context profiles only exist for "
|
||||||
|
"OpenGL version 3.2 and above");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wndconfig->glForward && wndconfig->glMajor < 3)
|
||||||
|
{
|
||||||
|
// Forward-compatible contexts are only defined for OpenGL version 3.0 and above
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Forward compatibility only exist "
|
||||||
|
"for OpenGL version 3.0 and above");
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
|
||||||
if (wndconfig->glForward && wndconfig->glMajor < 3)
|
|
||||||
{
|
{
|
||||||
// Forward-compatible contexts are only defined for OpenGL version 3.0 and above
|
if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0)
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
{
|
||||||
"glfwCreateWindow: Forward compatibility only exist for "
|
// OpenGL ES 1.0 is the smallest valid version
|
||||||
"OpenGL version 3.0 and above");
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
return GL_FALSE;
|
"glfwCreateWindow: Invalid OpenGL ES version requested");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
if (wndconfig->glMajor == 1 && wndconfig->glMinor > 1)
|
||||||
|
{
|
||||||
|
// OpenGL ES 1.x series ended with version 1.1
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Invalid OpenGL ES version requested");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// For now, let everything else through
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wndconfig->glProfile)
|
||||||
|
{
|
||||||
|
// OpenGL ES does not support profiles
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Context profiles are not supported "
|
||||||
|
"by OpenGL ES");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wndconfig->glForward)
|
||||||
|
{
|
||||||
|
// OpenGL ES does not support forward-compatibility
|
||||||
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
|
"glfwCreateWindow: Forward compatibility is not "
|
||||||
|
"supported by OpenGL ES");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->glRobustness)
|
if (wndconfig->glRobustness)
|
||||||
|
@ -334,7 +374,8 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig)
|
||||||
wndconfig->glRobustness != GLFW_OPENGL_LOSE_CONTEXT_ON_RESET)
|
wndconfig->glRobustness != GLFW_OPENGL_LOSE_CONTEXT_ON_RESET)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_INVALID_VALUE,
|
_glfwSetError(GLFW_INVALID_VALUE,
|
||||||
"glfwCreateWindow: Invalid OpenGL robustness mode requested");
|
"glfwCreateWindow: Invalid OpenGL robustness mode "
|
||||||
|
"requested");
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -352,7 +393,8 @@ GLboolean _glfwRefreshContextParams(void)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = _glfwPlatformGetCurrentContext();
|
_GLFWwindow* window = _glfwPlatformGetCurrentContext();
|
||||||
|
|
||||||
if (!parseGLVersion(&window->glMajor,
|
if (!parseGLVersion(&window->clientAPI,
|
||||||
|
&window->glMajor,
|
||||||
&window->glMinor,
|
&window->glMinor,
|
||||||
&window->glRevision))
|
&window->glRevision))
|
||||||
{
|
{
|
||||||
|
@ -378,7 +420,7 @@ GLboolean _glfwRefreshContextParams(void)
|
||||||
{
|
{
|
||||||
window->glForward = GL_FALSE;
|
window->glForward = GL_FALSE;
|
||||||
|
|
||||||
if (window->glMajor >= 3)
|
if (window->clientAPI == GLFW_OPENGL_API && window->glMajor >= 3)
|
||||||
{
|
{
|
||||||
GLint flags;
|
GLint flags;
|
||||||
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
|
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
|
||||||
|
|
|
@ -43,7 +43,7 @@ static GLboolean getClosestVideoMode(int* width, int* height,
|
||||||
int* bpp, int* refreshRate,
|
int* bpp, int* refreshRate,
|
||||||
GLboolean exactBPP)
|
GLboolean exactBPP)
|
||||||
{
|
{
|
||||||
int mode, bestWidth, bestHeight, bestBPP, bestRate;
|
int mode, bestWidth = 0, bestHeight = 0, bestBPP = 0, bestRate = 0;
|
||||||
unsigned int sizeDiff, rateDiff, leastSizeDiff, leastRateDiff;
|
unsigned int sizeDiff, rateDiff, leastSizeDiff, leastRateDiff;
|
||||||
GLboolean foundMode = GL_FALSE;
|
GLboolean foundMode = GL_FALSE;
|
||||||
DEVMODE dm;
|
DEVMODE dm;
|
||||||
|
@ -130,7 +130,7 @@ void _glfwSetVideoMode(int* width, int* height,
|
||||||
closestRate = *refreshRate;
|
closestRate = *refreshRate;
|
||||||
|
|
||||||
if (getClosestVideoMode(&closestWidth, &closestHeight,
|
if (getClosestVideoMode(&closestWidth, &closestHeight,
|
||||||
&closestBPP, &closestRate, GL_FALSE))
|
&closestBPP, &closestRate, exactBPP))
|
||||||
{
|
{
|
||||||
dm.dmSize = sizeof(DEVMODE);
|
dm.dmSize = sizeof(DEVMODE);
|
||||||
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
|
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
|
||||||
|
|
|
@ -106,6 +106,8 @@ static LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
|
void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(window);
|
||||||
|
|
||||||
if (_glfwLibrary.Win32.keyboardHook != NULL)
|
if (_glfwLibrary.Win32.keyboardHook != NULL)
|
||||||
{
|
{
|
||||||
UnhookWindowsHookEx(_glfwLibrary.Win32.keyboardHook);
|
UnhookWindowsHookEx(_glfwLibrary.Win32.keyboardHook);
|
||||||
|
@ -120,6 +122,8 @@ void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
|
||||||
|
|
||||||
void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
|
void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(window);
|
||||||
|
|
||||||
_glfwLibrary.Win32.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
|
_glfwLibrary.Win32.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
|
||||||
keyboardHook,
|
keyboardHook,
|
||||||
_glfwLibrary.Win32.instance,
|
_glfwLibrary.Win32.instance,
|
||||||
|
|
|
@ -356,6 +356,21 @@ static GLboolean createContext(_GLFWwindow* window,
|
||||||
attribs[i++] = wndconfig->glMinor;
|
attribs[i++] = wndconfig->glMinor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
|
||||||
|
{
|
||||||
|
if (!window->WGL.ARB_create_context_profile ||
|
||||||
|
!window->WGL.EXT_create_context_es2_profile)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_VERSION_UNAVAILABLE,
|
||||||
|
"Win32/WGL: OpenGL ES 2.x requested but "
|
||||||
|
"WGL_EXT_create_context_es2_profile is unavailable");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;
|
||||||
|
attribs[i++] = WGL_CONTEXT_ES2_PROFILE_BIT_EXT;
|
||||||
|
}
|
||||||
|
|
||||||
if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
|
if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
@ -385,21 +400,10 @@ static GLboolean createContext(_GLFWwindow* window,
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE &&
|
|
||||||
!window->WGL.EXT_create_context_es2_profile)
|
|
||||||
{
|
|
||||||
_glfwSetError(GLFW_VERSION_UNAVAILABLE,
|
|
||||||
"WGL: OpenGL ES 2.x profile requested but "
|
|
||||||
"WGL_EXT_create_context_es2_profile is unavailable");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE)
|
if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE)
|
||||||
flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
|
flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
|
||||||
else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE)
|
else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
||||||
else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE)
|
|
||||||
flags = WGL_CONTEXT_ES2_PROFILE_BIT_EXT;
|
|
||||||
|
|
||||||
attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;
|
attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;
|
||||||
attribs[i++] = flags;
|
attribs[i++] = flags;
|
||||||
|
@ -407,7 +411,7 @@ static GLboolean createContext(_GLFWwindow* window,
|
||||||
|
|
||||||
if (wndconfig->glRobustness)
|
if (wndconfig->glRobustness)
|
||||||
{
|
{
|
||||||
int strategy;
|
int strategy = 0;
|
||||||
|
|
||||||
if (!window->WGL.ARB_create_context_robustness)
|
if (!window->WGL.ARB_create_context_robustness)
|
||||||
{
|
{
|
||||||
|
@ -524,11 +528,6 @@ int _glfwCreateContext(_GLFWwindow* window,
|
||||||
|
|
||||||
void _glfwDestroyContext(_GLFWwindow* window)
|
void _glfwDestroyContext(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
// This is duplicated from glfwDestroyWindow
|
|
||||||
// TODO: Stop duplicating code
|
|
||||||
if (window == _glfwCurrentWindow)
|
|
||||||
_glfwPlatformMakeContextCurrent(NULL);
|
|
||||||
|
|
||||||
if (window->WGL.context)
|
if (window->WGL.context)
|
||||||
{
|
{
|
||||||
wglDeleteContext(window->WGL.context);
|
wglDeleteContext(window->WGL.context);
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
static void hideCursor(_GLFWwindow* window)
|
static void hideCursor(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,6 +70,8 @@ static void captureCursor(_GLFWwindow* window)
|
||||||
|
|
||||||
static void showCursor(_GLFWwindow* window)
|
static void showCursor(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(window);
|
||||||
|
|
||||||
// Un-capture cursor
|
// Un-capture cursor
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
|
|
||||||
|
@ -947,8 +950,16 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
||||||
// we're just creating an OpenGL 3.0+ context with the same pixel
|
// we're just creating an OpenGL 3.0+ context with the same pixel
|
||||||
// format, but it's not worth the added code complexity
|
// format, but it's not worth the added code complexity
|
||||||
|
|
||||||
|
// First we clear the current context (the one we just created)
|
||||||
|
// This is usually done by glfwDestroyWindow, but as we're not doing
|
||||||
|
// full window destruction, it's duplicated here
|
||||||
|
_glfwPlatformMakeContextCurrent(NULL);
|
||||||
|
|
||||||
|
// Next destroy the Win32 window and WGL context (without resetting or
|
||||||
|
// destroying the GLFW window object)
|
||||||
destroyWindow(window);
|
destroyWindow(window);
|
||||||
|
|
||||||
|
// ...and then create them again, this time with better APIs
|
||||||
if (!createWindow(window, wndconfig, fbconfig))
|
if (!createWindow(window, wndconfig, fbconfig))
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
129
src/window.c
129
src/window.c
|
@ -68,30 +68,6 @@ static void clearScrollOffsets(void)
|
||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
// Reset all window hints to their default values
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
void _glfwSetDefaultWindowHints(void)
|
|
||||||
{
|
|
||||||
memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints));
|
|
||||||
|
|
||||||
// The default minimum OpenGL version is 1.0
|
|
||||||
_glfwLibrary.hints.glMajor = 1;
|
|
||||||
_glfwLibrary.hints.glMinor = 0;
|
|
||||||
|
|
||||||
// The default is to show the window and allow window resizing
|
|
||||||
_glfwLibrary.hints.resizable = GL_TRUE;
|
|
||||||
_glfwLibrary.hints.visible = GL_TRUE;
|
|
||||||
|
|
||||||
// The default is 24 bits of depth, 8 bits of color
|
|
||||||
_glfwLibrary.hints.depthBits = 24;
|
|
||||||
_glfwLibrary.hints.redBits = 8;
|
|
||||||
_glfwLibrary.hints.greenBits = 8;
|
|
||||||
_glfwLibrary.hints.blueBits = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Register window focus events
|
// Register window focus events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -104,8 +80,8 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated)
|
||||||
{
|
{
|
||||||
_glfwLibrary.activeWindow = window;
|
_glfwLibrary.activeWindow = window;
|
||||||
|
|
||||||
if (_glfwLibrary.windowFocusCallback)
|
if (window->windowFocusCallback)
|
||||||
_glfwLibrary.windowFocusCallback(window, activated);
|
window->windowFocusCallback(window, activated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -130,8 +106,8 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated)
|
||||||
|
|
||||||
_glfwLibrary.activeWindow = NULL;
|
_glfwLibrary.activeWindow = NULL;
|
||||||
|
|
||||||
if (_glfwLibrary.windowFocusCallback)
|
if (window->windowFocusCallback)
|
||||||
_glfwLibrary.windowFocusCallback(window, activated);
|
window->windowFocusCallback(window, activated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,8 +136,8 @@ void _glfwInputWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
window->width = width;
|
window->width = width;
|
||||||
window->height = height;
|
window->height = height;
|
||||||
|
|
||||||
if (_glfwLibrary.windowSizeCallback)
|
if (window->windowSizeCallback)
|
||||||
_glfwLibrary.windowSizeCallback(window, width, height);
|
window->windowSizeCallback(window, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -176,8 +152,8 @@ void _glfwInputWindowIconify(_GLFWwindow* window, int iconified)
|
||||||
|
|
||||||
window->iconified = iconified;
|
window->iconified = iconified;
|
||||||
|
|
||||||
if (_glfwLibrary.windowIconifyCallback)
|
if (window->windowIconifyCallback)
|
||||||
_glfwLibrary.windowIconifyCallback(window, iconified);
|
window->windowIconifyCallback(window, iconified);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,8 +173,8 @@ void _glfwInputWindowVisibility(_GLFWwindow* window, int visible)
|
||||||
|
|
||||||
void _glfwInputWindowDamage(_GLFWwindow* window)
|
void _glfwInputWindowDamage(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfwLibrary.windowRefreshCallback)
|
if (window->windowRefreshCallback)
|
||||||
_glfwLibrary.windowRefreshCallback(window);
|
window->windowRefreshCallback(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -208,8 +184,8 @@ void _glfwInputWindowDamage(_GLFWwindow* window)
|
||||||
|
|
||||||
void _glfwInputWindowCloseRequest(_GLFWwindow* window)
|
void _glfwInputWindowCloseRequest(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfwLibrary.windowCloseCallback)
|
if (window->windowCloseCallback)
|
||||||
window->closeRequested = _glfwLibrary.windowCloseCallback(window);
|
window->closeRequested = window->windowCloseCallback(window);
|
||||||
else
|
else
|
||||||
window->closeRequested = GL_TRUE;
|
window->closeRequested = GL_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -262,16 +238,14 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
|
||||||
wndconfig.refreshRate = Max(_glfwLibrary.hints.refreshRate, 0);
|
wndconfig.refreshRate = Max(_glfwLibrary.hints.refreshRate, 0);
|
||||||
wndconfig.resizable = _glfwLibrary.hints.resizable ? GL_TRUE : GL_FALSE;
|
wndconfig.resizable = _glfwLibrary.hints.resizable ? GL_TRUE : GL_FALSE;
|
||||||
wndconfig.visible = _glfwLibrary.hints.visible ? GL_TRUE : GL_FALSE;
|
wndconfig.visible = _glfwLibrary.hints.visible ? GL_TRUE : GL_FALSE;
|
||||||
|
wndconfig.clientAPI = _glfwLibrary.hints.clientAPI;
|
||||||
wndconfig.glMajor = _glfwLibrary.hints.glMajor;
|
wndconfig.glMajor = _glfwLibrary.hints.glMajor;
|
||||||
wndconfig.glMinor = _glfwLibrary.hints.glMinor;
|
wndconfig.glMinor = _glfwLibrary.hints.glMinor;
|
||||||
wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;
|
wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;
|
||||||
wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE;
|
wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE;
|
||||||
wndconfig.glProfile = _glfwLibrary.hints.glProfile;
|
wndconfig.glProfile = _glfwLibrary.hints.glProfile;
|
||||||
wndconfig.glRobustness = _glfwLibrary.hints.glRobustness ? GL_TRUE : GL_FALSE;
|
wndconfig.glRobustness = _glfwLibrary.hints.glRobustness ? GL_TRUE : GL_FALSE;
|
||||||
wndconfig.share = share;
|
wndconfig.share = (_GLFWwindow*) share;
|
||||||
|
|
||||||
// Reset to default values for the next call
|
|
||||||
_glfwSetDefaultWindowHints();
|
|
||||||
|
|
||||||
// Check the OpenGL bits of the window config
|
// Check the OpenGL bits of the window config
|
||||||
if (!_glfwIsValidContextConfig(&wndconfig))
|
if (!_glfwIsValidContextConfig(&wndconfig))
|
||||||
|
@ -305,15 +279,13 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
|
||||||
height = 480;
|
height = 480;
|
||||||
}
|
}
|
||||||
|
|
||||||
window = (_GLFWwindow*) malloc(sizeof(_GLFWwindow));
|
window = (_GLFWwindow*) calloc(1, sizeof(_GLFWwindow));
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_OUT_OF_MEMORY, NULL);
|
_glfwSetError(GLFW_OUT_OF_MEMORY, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(window, 0, sizeof(_GLFWwindow));
|
|
||||||
|
|
||||||
window->next = _glfwLibrary.windowListHead;
|
window->next = _glfwLibrary.windowListHead;
|
||||||
_glfwLibrary.windowListHead = window;
|
_glfwLibrary.windowListHead = window;
|
||||||
|
|
||||||
|
@ -374,6 +346,38 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Reset all window hints to their default values
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void glfwDefaultWindowHints(void)
|
||||||
|
{
|
||||||
|
if (!_glfwInitialized)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints));
|
||||||
|
|
||||||
|
// The default is OpenGL with minimum version 1.0
|
||||||
|
_glfwLibrary.hints.clientAPI = GLFW_OPENGL_API;
|
||||||
|
_glfwLibrary.hints.glMajor = 1;
|
||||||
|
_glfwLibrary.hints.glMinor = 0;
|
||||||
|
|
||||||
|
// The default is to show the window and allow window resizing
|
||||||
|
_glfwLibrary.hints.resizable = GL_TRUE;
|
||||||
|
_glfwLibrary.hints.visible = GL_TRUE;
|
||||||
|
|
||||||
|
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil
|
||||||
|
_glfwLibrary.hints.redBits = 8;
|
||||||
|
_glfwLibrary.hints.greenBits = 8;
|
||||||
|
_glfwLibrary.hints.blueBits = 8;
|
||||||
|
_glfwLibrary.hints.depthBits = 24;
|
||||||
|
_glfwLibrary.hints.stencilBits = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Set hints for creating the window
|
// Set hints for creating the window
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -436,6 +440,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
|
||||||
case GLFW_FSAA_SAMPLES:
|
case GLFW_FSAA_SAMPLES:
|
||||||
_glfwLibrary.hints.samples = hint;
|
_glfwLibrary.hints.samples = hint;
|
||||||
break;
|
break;
|
||||||
|
case GLFW_CLIENT_API:
|
||||||
|
_glfwLibrary.hints.clientAPI = hint;
|
||||||
|
break;
|
||||||
case GLFW_OPENGL_VERSION_MAJOR:
|
case GLFW_OPENGL_VERSION_MAJOR:
|
||||||
_glfwLibrary.hints.glMajor = hint;
|
_glfwLibrary.hints.glMajor = hint;
|
||||||
break;
|
break;
|
||||||
|
@ -479,8 +486,8 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow handle)
|
||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Clear the current context if this window's context is current
|
// The window's context must not be current on another thread when the
|
||||||
// TODO: Re-examine this in light of multithreading
|
// window is destroyed
|
||||||
if (window == _glfwPlatformGetCurrentContext())
|
if (window == _glfwPlatformGetCurrentContext())
|
||||||
_glfwPlatformMakeContextCurrent(NULL);
|
_glfwPlatformMakeContextCurrent(NULL);
|
||||||
|
|
||||||
|
@ -740,6 +747,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param)
|
||||||
return window->resizable;
|
return window->resizable;
|
||||||
case GLFW_VISIBLE:
|
case GLFW_VISIBLE:
|
||||||
return window->visible;
|
return window->visible;
|
||||||
|
case GLFW_CLIENT_API:
|
||||||
|
return window->clientAPI;
|
||||||
case GLFW_OPENGL_VERSION_MAJOR:
|
case GLFW_OPENGL_VERSION_MAJOR:
|
||||||
return window->glMajor;
|
return window->glMajor;
|
||||||
case GLFW_OPENGL_VERSION_MINOR:
|
case GLFW_OPENGL_VERSION_MINOR:
|
||||||
|
@ -801,15 +810,17 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle)
|
||||||
// Set callback function for window size changes
|
// Set callback function for window size changes
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun)
|
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow handle, GLFWwindowsizefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.windowSizeCallback = cbfun;
|
window->windowSizeCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -817,15 +828,17 @@ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun)
|
||||||
// Set callback function for window close events
|
// Set callback function for window close events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun)
|
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow handle, GLFWwindowclosefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.windowCloseCallback = cbfun;
|
window->windowCloseCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -833,15 +846,17 @@ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun)
|
||||||
// Set callback function for window refresh events
|
// Set callback function for window refresh events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun)
|
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow handle, GLFWwindowrefreshfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.windowRefreshCallback = cbfun;
|
window->windowRefreshCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -849,15 +864,17 @@ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun)
|
||||||
// Set callback function for window focus events
|
// Set callback function for window focus events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun)
|
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow handle, GLFWwindowfocusfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.windowFocusCallback = cbfun;
|
window->windowFocusCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -865,15 +882,17 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun)
|
||||||
// Set callback function for window iconification events
|
// Set callback function for window iconification events
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun)
|
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow handle, GLFWwindowiconifyfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
if (!_glfwInitialized)
|
if (!_glfwInitialized)
|
||||||
{
|
{
|
||||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.windowIconifyCallback = cbfun;
|
window->windowIconifyCallback = cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -719,7 +719,7 @@ const char* _glfwPlatformGetVersionString(void)
|
||||||
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
|
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
|
||||||
" clock_gettime"
|
" clock_gettime"
|
||||||
#endif
|
#endif
|
||||||
#if defined(_GLFW_HAS_LINUX_JOYSTICKS)
|
#if defined(__linux__)
|
||||||
" Linux-joystick-API"
|
" Linux-joystick-API"
|
||||||
#else
|
#else
|
||||||
" no-joystick-support"
|
" no-joystick-support"
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#ifdef _GLFW_HAS_LINUX_JOYSTICKS
|
#ifdef __linux__
|
||||||
#include <linux/joystick.h>
|
#include <linux/joystick.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif // _GLFW_HAS_LINUX_JOYSTICKS
|
#endif // __linux__
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
|
|
||||||
static int openJoystickDevice(int joy, const char* path)
|
static int openJoystickDevice(int joy, const char* path)
|
||||||
{
|
{
|
||||||
#ifdef _GLFW_HAS_LINUX_JOYSTICKS
|
#ifdef __linux__
|
||||||
char numAxes, numButtons;
|
char numAxes, numButtons;
|
||||||
char name[256];
|
char name[256];
|
||||||
int fd, version;
|
int fd, version;
|
||||||
|
@ -104,7 +104,7 @@ static int openJoystickDevice(int joy, const char* path)
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwLibrary.X11.joystick[joy].present = GL_TRUE;
|
_glfwLibrary.X11.joystick[joy].present = GL_TRUE;
|
||||||
#endif // _GLFW_HAS_LINUX_JOYSTICKS
|
#endif // __linux__
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ static int openJoystickDevice(int joy, const char* path)
|
||||||
|
|
||||||
static void pollJoystickEvents(void)
|
static void pollJoystickEvents(void)
|
||||||
{
|
{
|
||||||
#ifdef _GLFW_HAS_LINUX_JOYSTICKS
|
#ifdef __linux__
|
||||||
int i;
|
int i;
|
||||||
ssize_t result;
|
ssize_t result;
|
||||||
struct js_event e;
|
struct js_event e;
|
||||||
|
@ -167,7 +167,7 @@ static void pollJoystickEvents(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // _GLFW_HAS_LINUX_JOYSTICKS
|
#endif // __linux__
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ static void pollJoystickEvents(void)
|
||||||
|
|
||||||
int _glfwInitJoysticks(void)
|
int _glfwInitJoysticks(void)
|
||||||
{
|
{
|
||||||
#ifdef _GLFW_HAS_LINUX_JOYSTICKS
|
#ifdef __linux__
|
||||||
int i, joy = 0;
|
int i, joy = 0;
|
||||||
regex_t regex;
|
regex_t regex;
|
||||||
DIR* dir;
|
DIR* dir;
|
||||||
|
@ -222,7 +222,7 @@ int _glfwInitJoysticks(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
regfree(®ex);
|
regfree(®ex);
|
||||||
#endif // _GLFW_HAS_LINUX_JOYSTICKS
|
#endif // __linux__
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@ int _glfwInitJoysticks(void)
|
||||||
|
|
||||||
void _glfwTerminateJoysticks(void)
|
void _glfwTerminateJoysticks(void)
|
||||||
{
|
{
|
||||||
#ifdef _GLFW_HAS_LINUX_JOYSTICKS
|
#ifdef __linux__
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i <= GLFW_JOYSTICK_LAST; i++)
|
for (i = 0; i <= GLFW_JOYSTICK_LAST; i++)
|
||||||
|
@ -249,7 +249,7 @@ void _glfwTerminateJoysticks(void)
|
||||||
_glfwLibrary.X11.joystick[i].present = GL_FALSE;
|
_glfwLibrary.X11.joystick[i].present = GL_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // _GLFW_HAS_LINUX_JOYSTICKS
|
#endif // __linux__
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,22 @@ static int createContext(_GLFWwindow* window,
|
||||||
setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor);
|
setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
|
||||||
|
{
|
||||||
|
if (!_glfwLibrary.GLX.ARB_create_context_profile ||
|
||||||
|
!_glfwLibrary.GLX.EXT_create_context_es2_profile)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_VERSION_UNAVAILABLE,
|
||||||
|
"GLX: OpenGL ES 2.x requested but "
|
||||||
|
"GLX_EXT_create_context_es2_profile is unavailable");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
setGLXattrib(attribs, index,
|
||||||
|
GLX_CONTEXT_PROFILE_MASK_ARB,
|
||||||
|
GLX_CONTEXT_ES2_PROFILE_BIT_EXT);
|
||||||
|
}
|
||||||
|
|
||||||
if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
|
if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness)
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
@ -323,21 +339,10 @@ static int createContext(_GLFWwindow* window,
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE &&
|
|
||||||
!_glfwLibrary.GLX.EXT_create_context_es2_profile)
|
|
||||||
{
|
|
||||||
_glfwSetError(GLFW_VERSION_UNAVAILABLE,
|
|
||||||
"GLX: OpenGL ES 2.x profile requested but "
|
|
||||||
"GLX_EXT_create_context_es2_profile is unavailable");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE)
|
if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE)
|
||||||
flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
|
flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
|
||||||
else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE)
|
else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
||||||
else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE)
|
|
||||||
flags = GLX_CONTEXT_ES2_PROFILE_BIT_EXT;
|
|
||||||
|
|
||||||
setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags);
|
setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags);
|
||||||
}
|
}
|
||||||
|
@ -614,8 +619,6 @@ void _glfwDestroyContext(_GLFWwindow* window)
|
||||||
|
|
||||||
if (window->GLX.context)
|
if (window->GLX.context)
|
||||||
{
|
{
|
||||||
// Release and destroy the context
|
|
||||||
glXMakeCurrent(_glfwLibrary.X11.display, None, NULL);
|
|
||||||
glXDestroyContext(_glfwLibrary.X11.display, window->GLX.context);
|
glXDestroyContext(_glfwLibrary.X11.display, window->GLX.context);
|
||||||
window->GLX.context = NULL;
|
window->GLX.context = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,6 +238,15 @@ static GLboolean createWindow(_GLFWwindow* window,
|
||||||
|
|
||||||
static void hideCursor(_GLFWwindow* window)
|
static void hideCursor(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
// Un-grab cursor (in windowed mode only; in fullscreen mode we still
|
||||||
|
// want the cursor grabbed in order to confine the cursor to the window
|
||||||
|
// area)
|
||||||
|
if (window->X11.cursorGrabbed && window->mode == GLFW_WINDOWED)
|
||||||
|
{
|
||||||
|
XUngrabPointer(_glfwLibrary.X11.display, CurrentTime);
|
||||||
|
window->X11.cursorGrabbed = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!window->X11.cursorHidden)
|
if (!window->X11.cursorHidden)
|
||||||
{
|
{
|
||||||
XDefineCursor(_glfwLibrary.X11.display,
|
XDefineCursor(_glfwLibrary.X11.display,
|
||||||
|
@ -280,7 +289,7 @@ static void showCursor(_GLFWwindow* window)
|
||||||
// Un-grab cursor (in windowed mode only; in fullscreen mode we still
|
// Un-grab cursor (in windowed mode only; in fullscreen mode we still
|
||||||
// want the cursor grabbed in order to confine the cursor to the window
|
// want the cursor grabbed in order to confine the cursor to the window
|
||||||
// area)
|
// area)
|
||||||
if (window->X11.cursorGrabbed)
|
if (window->X11.cursorGrabbed && window->mode == GLFW_WINDOWED)
|
||||||
{
|
{
|
||||||
XUngrabPointer(_glfwLibrary.X11.display, CurrentTime);
|
XUngrabPointer(_glfwLibrary.X11.display, CurrentTime);
|
||||||
window->X11.cursorGrabbed = GL_FALSE;
|
window->X11.cursorGrabbed = GL_FALSE;
|
||||||
|
|
|
@ -86,10 +86,6 @@ int main(void)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetCursorPosCallback(cursor_position_callback);
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
|
||||||
glfwSetKeyCallback(key_callback);
|
|
||||||
|
|
||||||
window = glfwCreateWindow(window_width, window_height, GLFW_WINDOWED, "", NULL);
|
window = glfwCreateWindow(window_width, window_height, GLFW_WINDOWED, "", NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
|
@ -99,6 +95,10 @@ int main(void)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetCursorPosCallback(window, cursor_position_callback);
|
||||||
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
glfwGetWindowSize(window, &width, &height);
|
glfwGetWindowSize(window, &width, &height);
|
||||||
|
|
|
@ -137,9 +137,9 @@ int main(int argc, char** argv)
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f);
|
glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f);
|
||||||
|
|
|
@ -363,18 +363,6 @@ int main(void)
|
||||||
|
|
||||||
printf("Library initialized\n");
|
printf("Library initialized\n");
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
|
||||||
glfwSetWindowRefreshCallback(window_refresh_callback);
|
|
||||||
glfwSetWindowFocusCallback(window_focus_callback);
|
|
||||||
glfwSetWindowIconifyCallback(window_iconify_callback);
|
|
||||||
glfwSetMouseButtonCallback(mouse_button_callback);
|
|
||||||
glfwSetCursorPosCallback(cursor_position_callback);
|
|
||||||
glfwSetCursorEnterCallback(cursor_enter_callback);
|
|
||||||
glfwSetScrollCallback(scroll_callback);
|
|
||||||
glfwSetKeyCallback(key_callback);
|
|
||||||
glfwSetCharCallback(char_callback);
|
|
||||||
|
|
||||||
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Event Linter", NULL);
|
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Event Linter", NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
|
@ -386,6 +374,18 @@ int main(void)
|
||||||
|
|
||||||
printf("Window opened\n");
|
printf("Window opened\n");
|
||||||
|
|
||||||
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
glfwSetWindowRefreshCallback(window, window_refresh_callback);
|
||||||
|
glfwSetWindowFocusCallback(window, window_focus_callback);
|
||||||
|
glfwSetWindowIconifyCallback(window, window_iconify_callback);
|
||||||
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
|
glfwSetCursorPosCallback(window, cursor_position_callback);
|
||||||
|
glfwSetCursorEnterCallback(window, cursor_enter_callback);
|
||||||
|
glfwSetScrollCallback(window, scroll_callback);
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetCharCallback(window, char_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
|
|
@ -93,9 +93,6 @@ int main(int argc, char** argv)
|
||||||
else
|
else
|
||||||
printf("Requesting that FSAA not be available\n");
|
printf("Requesting that FSAA not be available\n");
|
||||||
|
|
||||||
glfwSetKeyCallback(key_callback);
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_FSAA_SAMPLES, samples);
|
glfwWindowHint(GLFW_FSAA_SAMPLES, samples);
|
||||||
|
|
||||||
window = glfwCreateWindow(800, 400, GLFW_WINDOWED, "Aliasing Detector", NULL);
|
window = glfwCreateWindow(800, 400, GLFW_WINDOWED, "Aliasing Detector", NULL);
|
||||||
|
@ -107,6 +104,9 @@ int main(int argc, char** argv)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
|
|
@ -96,9 +96,9 @@ int main(void)
|
||||||
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_NORMAL);
|
glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_NORMAL);
|
||||||
|
|
||||||
glfwSetWindowFocusCallback(window_focus_callback);
|
glfwSetWindowFocusCallback(window, window_focus_callback);
|
||||||
glfwSetKeyCallback(window_key_callback);
|
glfwSetKeyCallback(window, window_key_callback);
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
|
||||||
while (running)
|
while (running)
|
||||||
{
|
{
|
||||||
|
|
|
@ -151,9 +151,9 @@ int main(int argc, char** argv)
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
glfwSetWindowSizeCallback(size_callback);
|
glfwSetWindowSizeCallback(window, size_callback);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f);
|
glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f);
|
||||||
|
|
157
tests/glfwinfo.c
157
tests/glfwinfo.c
|
@ -42,60 +42,74 @@
|
||||||
#define strcasecmp(x, y) _stricmp(x, y)
|
#define strcasecmp(x, y) _stricmp(x, y)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define API_OPENGL "gl"
|
||||||
|
#define API_OPENGL_ES "es"
|
||||||
|
|
||||||
#define PROFILE_NAME_CORE "core"
|
#define PROFILE_NAME_CORE "core"
|
||||||
#define PROFILE_NAME_COMPAT "compat"
|
#define PROFILE_NAME_COMPAT "compat"
|
||||||
#define PROFILE_NAME_ES2 "es2"
|
|
||||||
|
|
||||||
#define STRATEGY_NAME_NONE "none"
|
#define STRATEGY_NAME_NONE "none"
|
||||||
#define STRATEGY_NAME_LOSE "lose"
|
#define STRATEGY_NAME_LOSE "lose"
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
printf("Usage: glfwinfo [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n");
|
printf("Usage: glfwinfo [-h] [-a API] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n");
|
||||||
printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT " " PROFILE_NAME_ES2 "\n");
|
printf("available APIs: " API_OPENGL " " API_OPENGL_ES "\n");
|
||||||
|
printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT "\n");
|
||||||
printf("available strategies: " STRATEGY_NAME_NONE " " STRATEGY_NAME_LOSE "\n");
|
printf("available strategies: " STRATEGY_NAME_NONE " " STRATEGY_NAME_LOSE "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
static void error_callback(int error, const char* description)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error: %s in %s\n", glfwErrorString(error), description);
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* get_glfw_profile_name(int profile)
|
static const char* get_client_api_name(int api)
|
||||||
{
|
{
|
||||||
if (profile == GLFW_OPENGL_COMPAT_PROFILE)
|
if (api == GLFW_OPENGL_API)
|
||||||
return PROFILE_NAME_COMPAT;
|
return "OpenGL";
|
||||||
else if (profile == GLFW_OPENGL_CORE_PROFILE)
|
else if (api == GLFW_OPENGL_ES_API)
|
||||||
return PROFILE_NAME_CORE;
|
return "OpenGL ES";
|
||||||
else if (profile == GLFW_OPENGL_ES2_PROFILE)
|
|
||||||
return PROFILE_NAME_ES2;
|
|
||||||
|
|
||||||
return "unknown";
|
return "Unknown API";
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* get_profile_name(GLint mask)
|
static const char* get_profile_name_gl(GLint mask)
|
||||||
{
|
{
|
||||||
if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
|
if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
|
||||||
return PROFILE_NAME_COMPAT;
|
return "compatibility";
|
||||||
if (mask & GL_CONTEXT_CORE_PROFILE_BIT)
|
if (mask & GL_CONTEXT_CORE_PROFILE_BIT)
|
||||||
return PROFILE_NAME_CORE;
|
return "core";
|
||||||
|
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void list_extensions(int major, int minor)
|
static const char* get_profile_name_glfw(int profile)
|
||||||
|
{
|
||||||
|
if (profile == GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
|
return "compatibility";
|
||||||
|
if (profile == GLFW_OPENGL_CORE_PROFILE)
|
||||||
|
return "core";
|
||||||
|
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
static void list_extensions(int api, int major, int minor)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
GLint count;
|
GLint count;
|
||||||
const GLubyte* extensions;
|
const GLubyte* extensions;
|
||||||
|
|
||||||
printf("OpenGL context supported extensions:\n");
|
printf("%s context supported extensions:\n", get_client_api_name(api));
|
||||||
|
|
||||||
if (major > 2)
|
if (api == GLFW_OPENGL_API && major > 2)
|
||||||
{
|
{
|
||||||
PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi");
|
PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi");
|
||||||
if (!glGetStringi)
|
if (!glGetStringi)
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
|
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
|
||||||
|
|
||||||
|
@ -147,7 +161,7 @@ static GLboolean valid_version(void)
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
int ch, profile = 0, strategy = 0, major = 1, minor = 0, revision;
|
int ch, api = 0, profile = 0, strategy = 0, major = 1, minor = 0, revision;
|
||||||
GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE;
|
GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE;
|
||||||
GLint flags, mask;
|
GLint flags, mask;
|
||||||
GLFWwindow window;
|
GLFWwindow window;
|
||||||
|
@ -155,10 +169,20 @@ int main(int argc, char** argv)
|
||||||
if (!valid_version())
|
if (!valid_version())
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "dfhlm:n:p:r:")) != -1)
|
while ((ch = getopt(argc, argv, "a:dfhlm:n:p:r:")) != -1)
|
||||||
{
|
{
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
|
case 'a':
|
||||||
|
if (strcasecmp(optarg, API_OPENGL) == 0)
|
||||||
|
api = GLFW_OPENGL_API;
|
||||||
|
else if (strcasecmp(optarg, API_OPENGL_ES) == 0)
|
||||||
|
api = GLFW_OPENGL_ES_API;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
case 'd':
|
case 'd':
|
||||||
debug = GL_TRUE;
|
debug = GL_TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -182,8 +206,6 @@ int main(int argc, char** argv)
|
||||||
profile = GLFW_OPENGL_CORE_PROFILE;
|
profile = GLFW_OPENGL_CORE_PROFILE;
|
||||||
else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0)
|
else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0)
|
||||||
profile = GLFW_OPENGL_COMPAT_PROFILE;
|
profile = GLFW_OPENGL_COMPAT_PROFILE;
|
||||||
else if (strcasecmp(optarg, PROFILE_NAME_ES2) == 0)
|
|
||||||
profile = GLFW_OPENGL_ES2_PROFILE;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
usage();
|
usage();
|
||||||
|
@ -226,6 +248,9 @@ int main(int argc, char** argv)
|
||||||
glfwWindowHint(GLFW_OPENGL_VERSION_MINOR, minor);
|
glfwWindowHint(GLFW_OPENGL_VERSION_MINOR, minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (api != 0)
|
||||||
|
glfwWindowHint(GLFW_CLIENT_API, api);
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
|
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
|
||||||
|
|
||||||
|
@ -245,66 +270,88 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Version", NULL);
|
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Version", NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
// Report OpenGL version
|
// Report client API version
|
||||||
|
|
||||||
printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION));
|
|
||||||
|
|
||||||
|
api = glfwGetWindowParam(window, GLFW_CLIENT_API);
|
||||||
major = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MAJOR);
|
major = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MAJOR);
|
||||||
minor = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MINOR);
|
minor = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MINOR);
|
||||||
revision = glfwGetWindowParam(window, GLFW_OPENGL_REVISION);
|
revision = glfwGetWindowParam(window, GLFW_OPENGL_REVISION);
|
||||||
|
|
||||||
printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision);
|
printf("%s context version string: \"%s\"\n",
|
||||||
|
get_client_api_name(api),
|
||||||
|
glGetString(GL_VERSION));
|
||||||
|
|
||||||
// Report OpenGL context properties
|
printf("%s context version parsed by GLFW: %u.%u.%u\n",
|
||||||
|
get_client_api_name(api),
|
||||||
|
major, minor, revision);
|
||||||
|
|
||||||
if (major >= 3)
|
// Report client API context properties
|
||||||
|
|
||||||
|
if (api == GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
|
if (major >= 3)
|
||||||
printf("OpenGL context flags (0x%08x):", flags);
|
{
|
||||||
|
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
|
||||||
|
printf("%s context flags (0x%08x):", get_client_api_name(api), flags);
|
||||||
|
|
||||||
if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)
|
if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)
|
||||||
printf(" forward-compatible");
|
printf(" forward-compatible");
|
||||||
if (flags & 0)
|
if (flags & 0)
|
||||||
printf(" debug");
|
printf(" debug");
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
|
||||||
printf("OpenGL context flags parsed by GLFW:");
|
printf("%s context flags parsed by GLFW:", get_client_api_name(api));
|
||||||
|
|
||||||
if (glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT))
|
if (glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT))
|
||||||
printf(" forward-compatible");
|
printf(" forward-compatible");
|
||||||
if (glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT))
|
if (glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT))
|
||||||
printf(" debug");
|
printf(" debug");
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (major > 3 || (major == 3 && minor >= 2))
|
||||||
|
{
|
||||||
|
int profile = glfwGetWindowParam(window, GLFW_OPENGL_PROFILE);
|
||||||
|
|
||||||
|
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
|
||||||
|
printf("%s profile mask (0x%08x): %s\n",
|
||||||
|
get_client_api_name(api),
|
||||||
|
mask,
|
||||||
|
get_profile_name_gl(mask));
|
||||||
|
|
||||||
|
printf("%s profile mask parsed by GLFW: %s\n",
|
||||||
|
get_client_api_name(api),
|
||||||
|
get_profile_name_glfw(profile));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (major > 3 || (major == 3 && minor >= 2))
|
printf("%s context renderer string: \"%s\"\n",
|
||||||
{
|
get_client_api_name(api),
|
||||||
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
|
glGetString(GL_RENDERER));
|
||||||
printf("OpenGL profile mask (0x%08x): %s\n", mask, get_profile_name(mask));
|
printf("%s context vendor string: \"%s\"\n",
|
||||||
|
get_client_api_name(api),
|
||||||
printf("OpenGL profile mask parsed by GLFW: %s\n",
|
glGetString(GL_VENDOR));
|
||||||
get_glfw_profile_name(glfwGetWindowParam(window, GLFW_OPENGL_PROFILE)));
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("OpenGL context debug flag saved by GLFW: %s\n",
|
printf("OpenGL context debug flag saved by GLFW: %s\n",
|
||||||
glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT) ? "true" : "false");
|
glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT) ? "true" : "false");
|
||||||
|
|
||||||
printf("OpenGL context renderer string: \"%s\"\n", glGetString(GL_RENDERER));
|
|
||||||
printf("OpenGL context vendor string: \"%s\"\n", glGetString(GL_VENDOR));
|
|
||||||
|
|
||||||
if (major > 1)
|
if (major > 1)
|
||||||
{
|
{
|
||||||
printf("OpenGL context shading language version: \"%s\"\n",
|
printf("%s context shading language version: \"%s\"\n",
|
||||||
|
get_client_api_name(api),
|
||||||
glGetString(GL_SHADING_LANGUAGE_VERSION));
|
glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Report OpenGL extensions
|
// Report client API extensions
|
||||||
if (list)
|
if (list)
|
||||||
list_extensions(major, minor);
|
list_extensions(api, major, minor);
|
||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
|
@ -70,16 +70,29 @@ static void key_callback(GLFWwindow window, int key, int action)
|
||||||
|
|
||||||
static void window_size_callback(GLFWwindow window, int width, int height)
|
static void window_size_callback(GLFWwindow window, int width, int height)
|
||||||
{
|
{
|
||||||
printf("%0.2f Size %ix%i\n", glfwGetTime(), width, height);
|
printf("%0.2f Window resized to %ix%i\n", glfwGetTime(), width, height);
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void window_focus_callback(GLFWwindow window, int activated)
|
||||||
|
{
|
||||||
|
printf("%0.2f Window %s\n",
|
||||||
|
glfwGetTime(),
|
||||||
|
activated ? "activated" : "deactivated");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void window_iconify_callback(GLFWwindow window, int iconified)
|
||||||
|
{
|
||||||
|
printf("%0.2f Window %s\n",
|
||||||
|
glfwGetTime(),
|
||||||
|
iconified ? "iconified" : "restored");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
int width, height, ch;
|
int width, height, ch;
|
||||||
int mode = GLFW_WINDOWED;
|
int mode = GLFW_WINDOWED;
|
||||||
GLboolean active = -1, iconified = -1;
|
|
||||||
GLFWwindow window;
|
GLFWwindow window;
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "fh")) != -1)
|
while ((ch = getopt(argc, argv, "fh")) != -1)
|
||||||
|
@ -131,26 +144,20 @@ int main(int argc, char** argv)
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
|
glfwSetWindowFocusCallback(window, window_focus_callback);
|
||||||
|
glfwSetWindowIconifyCallback(window, window_iconify_callback);
|
||||||
|
|
||||||
|
printf("Window is %s and %s\n",
|
||||||
|
glfwGetWindowParam(window, GLFW_ICONIFIED) ? "iconified" : "restored",
|
||||||
|
glfwGetWindowParam(window, GLFW_ACTIVE) ? "active" : "inactive");
|
||||||
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
|
||||||
while (!closed)
|
while (!closed)
|
||||||
{
|
{
|
||||||
if (iconified != glfwGetWindowParam(window, GLFW_ICONIFIED) ||
|
|
||||||
active != glfwGetWindowParam(window, GLFW_ACTIVE))
|
|
||||||
{
|
|
||||||
iconified = glfwGetWindowParam(window, GLFW_ICONIFIED);
|
|
||||||
active = glfwGetWindowParam(window, GLFW_ACTIVE);
|
|
||||||
|
|
||||||
printf("%0.2f %s %s\n",
|
|
||||||
glfwGetTime(),
|
|
||||||
iconified ? "Iconified" : "Restored",
|
|
||||||
active ? "Active" : "Inactive");
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwGetWindowSize(window, &width, &height);
|
glfwGetWindowSize(window, &width, &height);
|
||||||
|
|
||||||
glScissor(0, 0, width, height);
|
glScissor(0, 0, width, height);
|
||||||
|
|
|
@ -200,7 +200,7 @@ int main(void)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
|
@ -117,10 +117,6 @@ static void test_modes(void)
|
||||||
int i, count;
|
int i, count;
|
||||||
GLFWvidmode* modes = glfwGetVideoModes(&count);
|
GLFWvidmode* modes = glfwGetVideoModes(&count);
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
|
||||||
glfwSetKeyCallback(key_callback);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
GLFWvidmode* mode = modes + i;
|
GLFWvidmode* mode = modes + i;
|
||||||
|
@ -143,6 +139,10 @@ static void test_modes(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetWindowSizeCallback(window_handle, window_size_callback);
|
||||||
|
glfwSetWindowCloseCallback(window_handle, window_close_callback);
|
||||||
|
glfwSetKeyCallback(window_handle, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window_handle);
|
glfwMakeContextCurrent(window_handle);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
@ -157,6 +157,8 @@ static void test_modes(void)
|
||||||
if (!window_handle)
|
if (!window_handle)
|
||||||
{
|
{
|
||||||
printf("User terminated program\n");
|
printf("User terminated program\n");
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,6 +226,7 @@ int main(int argc, char** argv)
|
||||||
else if (mode == TEST_MODE)
|
else if (mode == TEST_MODE)
|
||||||
test_modes();
|
test_modes();
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,9 +102,9 @@ static GLboolean open_window(void)
|
||||||
glfwGetCursorPos(window_handle, &cursor_x, &cursor_y);
|
glfwGetCursorPos(window_handle, &cursor_x, &cursor_y);
|
||||||
printf("Cursor position: %i %i\n", cursor_x, cursor_y);
|
printf("Cursor position: %i %i\n", cursor_x, cursor_y);
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window_handle, window_size_callback);
|
||||||
glfwSetCursorPosCallback(cursor_position_callback);
|
glfwSetCursorPosCallback(window_handle, cursor_position_callback);
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window_handle, key_callback);
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,8 @@ int main(void)
|
||||||
if (!open_window())
|
if (!open_window())
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +140,8 @@ int main(void)
|
||||||
if (!open_window())
|
if (!open_window())
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,9 +102,9 @@ static GLboolean open_window(int width, int height, int mode)
|
||||||
glfwMakeContextCurrent(window_handle);
|
glfwMakeContextCurrent(window_handle);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window_handle, window_size_callback);
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window_handle, window_close_callback);
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window_handle, key_callback);
|
||||||
|
|
||||||
printf("Opening %s mode window took %0.3f seconds\n",
|
printf("Opening %s mode window took %0.3f seconds\n",
|
||||||
get_mode_name(mode),
|
get_mode_name(mode),
|
||||||
|
@ -132,7 +132,10 @@ int main(int argc, char** argv)
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (!open_window(640, 480, (count & 1) ? GLFW_FULLSCREEN : GLFW_WINDOWED))
|
if (!open_window(640, 480, (count & 1) ? GLFW_FULLSCREEN : GLFW_WINDOWED))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
@ -156,6 +159,8 @@ int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
close_window();
|
close_window();
|
||||||
printf("User closed window\n");
|
printf("User closed window\n");
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,8 +62,8 @@ static GLFWwindow open_window(const char* title, GLFWwindow share)
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetWindowCloseCallback(window_close_callback);
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,8 @@ int main(int argc, char** argv)
|
||||||
if (!windows[0])
|
if (!windows[0])
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open first GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open first GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,6 +151,8 @@ int main(int argc, char** argv)
|
||||||
if (!windows[1])
|
if (!windows[1])
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open second GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open second GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,17 +73,17 @@ int main(void)
|
||||||
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "", NULL);
|
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "", NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
glfwTerminate();
|
|
||||||
|
|
||||||
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
set_swap_interval(window, swap_interval);
|
set_swap_interval(window, swap_interval);
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
glfwSetKeyCallback(key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
|
#include "tinycthread.h"
|
||||||
|
|
||||||
#include <GL/glfw3.h>
|
#include <GL/glfw3.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -35,8 +37,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "tinycthread.h"
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GLFWwindow window;
|
GLFWwindow window;
|
||||||
|
|
|
@ -51,13 +51,15 @@ int main(void)
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(window_size_callback);
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||||
|
|
||||||
while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
|
while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
|
||||||
{
|
{
|
||||||
|
@ -66,6 +68,7 @@ int main(void)
|
||||||
glfwWaitEvents();
|
glfwWaitEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ int main(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to open GLFW window: %s\n",
|
fprintf(stderr, "Failed to open GLFW window: %s\n",
|
||||||
glfwErrorString(glfwGetError()));
|
glfwErrorString(glfwGetError()));
|
||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user