mirror of
https://github.com/glfw/glfw.git
synced 2024-11-22 13:04:35 +00:00
Merge branch 'master' into EGL
Conflicts: readme.html src/win32_platform.h src/x11_platform.h
This commit is contained in:
commit
da02844457
@ -522,6 +522,10 @@ extern "C" {
|
||||
/*! @brief The number of samples used for default framebuffer multisampling.
|
||||
*/
|
||||
#define GLFW_FSAA_SAMPLES 0x0002100E
|
||||
/*! @brief @c GL_TRUE if the framebuffer should be sRGB capable, or @c GL_FALSE
|
||||
* otherwise.
|
||||
*/
|
||||
#define GLFW_SRGB_CAPABLE 0x0002100F
|
||||
|
||||
/*! @brief The @link clients client API @endlink to create a context for.
|
||||
*/
|
||||
@ -710,6 +714,16 @@ typedef void* GLFWwindow;
|
||||
*/
|
||||
typedef void (* GLFWerrorfun)(int,const char*);
|
||||
|
||||
/*! @brief The function signature for window position callbacks.
|
||||
* @param[in] window The window that the user moved.
|
||||
* @param[in] x The new x-coordinate, in pixels, of the upper-left corner of
|
||||
* the client area of the window.
|
||||
* @param[in] y The new y-coordinate, in pixels, of the upper-left corner of
|
||||
* the client area of the window.
|
||||
* @ingroup window
|
||||
*/
|
||||
typedef void (* GLFWwindowposfun)(GLFWwindow,int,int);
|
||||
|
||||
/*! @brief The function signature for window resize callbacks.
|
||||
* @param[in] window The window that the user resized.
|
||||
* @param[in] width The new width, in pixels, of the window.
|
||||
@ -948,7 +962,7 @@ GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode);
|
||||
|
||||
/*! @brief Sets the system gamma ramp to one generated from the specified
|
||||
* exponent.
|
||||
* @param[in] The desired exponent.
|
||||
* @param[in] gamma The desired exponent.
|
||||
* @ingroup gamma
|
||||
*/
|
||||
GLFWAPI void glfwSetGamma(float gamma);
|
||||
@ -1014,6 +1028,9 @@ GLFWAPI void glfwDefaultWindowHints(void);
|
||||
* The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to
|
||||
* use for multisampling.
|
||||
*
|
||||
* The @ref GLFW_SRGB_CAPABLE hint specifies whether the framebuffer should be
|
||||
* sRGB capable.
|
||||
*
|
||||
* The @ref GLFW_CLIENT_API hint specifies which client API to create the
|
||||
* context for. Possible values are @ref GLFW_OPENGL_API and @ref
|
||||
* GLFW_OPENGL_ES_API.
|
||||
@ -1042,7 +1059,8 @@ GLFWAPI void glfwDefaultWindowHints(void);
|
||||
* used by the OpenGL context.
|
||||
*
|
||||
* The @ref GLFW_RESIZABLE hint specifies whether the window will be resizable
|
||||
* by the user. This hint is ignored for fullscreen windows.
|
||||
* by the user. The window will still be resizable using the @ref
|
||||
* glfwSetWindowSize function. This hint is ignored for fullscreen windows.
|
||||
*
|
||||
* The @ref GLFW_VISIBLE hint specifies whether the window will be initially
|
||||
* visible. This hint is ignored for fullscreen windows.
|
||||
@ -1053,7 +1071,9 @@ GLFWAPI void glfwDefaultWindowHints(void);
|
||||
* Some window hints are hard constraints. These must match the available
|
||||
* capabilities @em exactly for window and context creation to succeed. Hints
|
||||
* that are not hard constraints are matched as closely as possible, but the
|
||||
* resulting window and context may differ from what these hints requested.
|
||||
* resulting window and context may differ from what these hints requested. To
|
||||
* find out the actual properties of the created window and context, use the
|
||||
* @ref glfwGetWindowParam function.
|
||||
*
|
||||
* The following window hints are hard constraints:
|
||||
* @arg @ref GLFW_STEREO
|
||||
@ -1278,11 +1298,21 @@ GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
|
||||
*/
|
||||
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
|
||||
|
||||
/*! @brief Sets the position callback for the specified window.
|
||||
* @param[in] window The window whose callback to set.
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowPosCallback(GLFWwindow window, GLFWwindowposfun cbfun);
|
||||
|
||||
/*! @brief Sets the size callback for the specified window.
|
||||
* @param[in] window The window whose callback to set.
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*
|
||||
* This callback is called when the window is resized.
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun);
|
||||
|
||||
@ -1291,6 +1321,14 @@ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfu
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*
|
||||
* This callback is called when the user attempts to close the window, i.e.
|
||||
* clicks the window's close widget or, on Mac OS X, selects @b Quit from the
|
||||
* application menu. Calling @ref glfwDestroyWindow does not cause this
|
||||
* callback to be called.
|
||||
*
|
||||
* The return value of the close callback becomes the new value of the @ref
|
||||
* GLFW_CLOSE_REQUESTED window parameter.
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun);
|
||||
|
||||
@ -1299,6 +1337,13 @@ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cb
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*
|
||||
* This callback is called when the client area of the window needs to be
|
||||
* redrawn, for example if the window has been exposed after having been
|
||||
* covered by another window.
|
||||
*
|
||||
* @note On compositing window systems such as Mac OS X, where the window
|
||||
* contents are saved off-screen, this callback may never be called.
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun);
|
||||
|
||||
@ -1307,6 +1352,8 @@ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfu
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*
|
||||
* This callback is called when the window gains or loses focus.
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun);
|
||||
|
||||
@ -1315,6 +1362,8 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cb
|
||||
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
|
||||
* callback.
|
||||
* @ingroup window
|
||||
*
|
||||
* This callback is called when the window is iconified or restored.
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun);
|
||||
|
||||
@ -1413,7 +1462,7 @@ GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yof
|
||||
* set callback.
|
||||
* @ingroup input
|
||||
*
|
||||
* @note The key callback deals with physical keys, with @link keys tokens
|
||||
* @remarks The key callback deals with physical keys, with @link keys tokens
|
||||
* @endlink named after their use on the standard US keyboard layout. If you
|
||||
* want to input text, use the Unicode character callback instead.
|
||||
*/
|
||||
@ -1424,8 +1473,8 @@ GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun);
|
||||
* the currently set callback.
|
||||
* @ingroup input
|
||||
*
|
||||
* @note The Unicode character callback is for text input. If you want to know
|
||||
* whether a specific key was pressed or released, use the key callback.
|
||||
* @remarks The Unicode character callback is for text input. If you want to
|
||||
* know whether a specific key was pressed or released, use the key callback.
|
||||
*/
|
||||
GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun);
|
||||
|
||||
@ -1440,6 +1489,9 @@ GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cb
|
||||
* @param[in] cbfun The new cursor position callback, or @c NULL to remove the
|
||||
* currently set callback.
|
||||
* @ingroup input
|
||||
*
|
||||
* @remarks The position is relative to the upper-left corner of the client
|
||||
* area of the window.
|
||||
*/
|
||||
GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun);
|
||||
|
||||
@ -1492,6 +1544,8 @@ GLFWAPI int glfwGetJoystickButtons(int joy, unsigned char* buttons, int numbutto
|
||||
* @param[in] string A UTF-8 encoded string.
|
||||
* @ingroup clipboard
|
||||
*
|
||||
* @note This function may only be called from the main thread.
|
||||
*
|
||||
* @sa glfwGetClipboardString
|
||||
*/
|
||||
GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string);
|
||||
@ -1502,6 +1556,8 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string);
|
||||
* if that format was unavailable.
|
||||
* @ingroup clipboard
|
||||
*
|
||||
* @note This function may only be called from the main thread.
|
||||
*
|
||||
* @note The returned string is valid only until the next call to @ref
|
||||
* glfwGetClipboardString or @ref glfwSetClipboardString.
|
||||
*
|
||||
|
@ -274,17 +274,19 @@ version of GLFW.</p>
|
||||
<li>Added <code>glfwSetErrorCallback</code> function and <code>GLFWerrorfun</code> type for receiving more specific and/or nested errors</li>
|
||||
<li>Added <code>glfwSetWindowUserPointer</code> and <code>glfwGetWindowUserPointer</code> functions for per-window user pointers</li>
|
||||
<li>Added <code>glfwGetVersionString</code> function for determining which code paths were enabled at compile time</li>
|
||||
<li>Added <code>glfwGetWindowPos</code> function for querying the position of the specified window</li>
|
||||
<li>Added <code>glfwSetWindowPosCallback</code> function and <code>GLFWwindowposfun</code> type for reciving window position events</li>
|
||||
<li>Added <code>glfwSetWindowFocusCallback</code> function and <code>GLFWwindowfocusfun</code> type for receiving window focus events</li>
|
||||
<li>Added <code>glfwSetWindowIconifyCallback</code> function and <code>GLFWwindowiconifyfun</code> type for receiving window iconification events</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>GLFW_CLIENT_API</code> window hint for creating contexts for APIs other than desktop OpenGL</li>
|
||||
<li>Added <code>GLFW_SRGB_CAPABLE</code> for requesting sRGB capable framebuffers</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_REVISION</code> window parameter to make up for removal of <code>glfwGetGLVersion</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_INCLUDE_ES2</code> macro for telling the GLFW header to include the OpenGL ES 2.0 header 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_POSITION_X</code> and <code>GLFW_POSITION_Y</code> window hints and parameter for controlling and polling window position</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>modes</code> video mode enumeration and setting test program</li>
|
||||
|
@ -835,6 +835,9 @@ static GLboolean createContext(_GLFWwindow* window,
|
||||
ADD_ATTR2(NSOpenGLPFASamples, fbconfig->samples);
|
||||
}
|
||||
|
||||
// NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB
|
||||
// frambuffer, so there's no need (and no way) to request it
|
||||
|
||||
ADD_ATTR(0);
|
||||
|
||||
#undef ADD_ATTR
|
||||
|
@ -218,6 +218,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||
extraDiff += (desired->samples - current->samples) *
|
||||
(desired->samples - current->samples);
|
||||
}
|
||||
|
||||
if (desired->sRGB)
|
||||
{
|
||||
if (!current->sRGB)
|
||||
extraDiff++;
|
||||
}
|
||||
}
|
||||
|
||||
// Figure out if the current one is better than the best one found so far
|
||||
|
@ -190,6 +190,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
|
||||
else
|
||||
f->samples = 0;
|
||||
|
||||
if (_glfwLibrary.GLX.ARB_framebuffer_sRGB)
|
||||
f->sRGB = getFBConfigAttrib(window, fbconfigs[i], GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);
|
||||
else
|
||||
f->sRGB = GL_FALSE;
|
||||
|
||||
f->platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], GLX_FBCONFIG_ID);
|
||||
|
||||
(*found)++;
|
||||
@ -527,6 +532,9 @@ int _glfwInitOpenGL(void)
|
||||
if (_glfwPlatformExtensionSupported("GLX_ARB_multisample"))
|
||||
_glfwLibrary.GLX.ARB_multisample = GL_TRUE;
|
||||
|
||||
if (_glfwPlatformExtensionSupported("GLX_ARB_framebuffer_sRGB"))
|
||||
_glfwLibrary.GLX.ARB_framebuffer_sRGB = GL_TRUE;
|
||||
|
||||
if (_glfwPlatformExtensionSupported("GLX_ARB_create_context"))
|
||||
{
|
||||
_glfwLibrary.GLX.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)
|
||||
|
@ -105,6 +105,7 @@ typedef struct _GLFWlibraryGLX
|
||||
GLboolean EXT_swap_control;
|
||||
GLboolean MESA_swap_control;
|
||||
GLboolean ARB_multisample;
|
||||
GLboolean ARB_framebuffer_sRGB;
|
||||
GLboolean ARB_create_context;
|
||||
GLboolean ARB_create_context_profile;
|
||||
GLboolean ARB_create_context_robustness;
|
||||
|
@ -100,6 +100,7 @@ struct _GLFWhints
|
||||
GLboolean resizable;
|
||||
GLboolean visible;
|
||||
int samples;
|
||||
GLboolean sRGB;
|
||||
int clientAPI;
|
||||
int glMajor;
|
||||
int glMinor;
|
||||
@ -160,6 +161,7 @@ struct _GLFWfbconfig
|
||||
int auxBuffers;
|
||||
GLboolean stereo;
|
||||
int samples;
|
||||
GLboolean sRGB;
|
||||
GLFWintptr platformID;
|
||||
};
|
||||
|
||||
@ -199,6 +201,7 @@ struct _GLFWwindow
|
||||
int glRobustness;
|
||||
PFNGLGETSTRINGIPROC GetStringi;
|
||||
|
||||
GLFWwindowposfun windowPosCallback;
|
||||
GLFWwindowsizefun windowSizeCallback;
|
||||
GLFWwindowclosefun windowCloseCallback;
|
||||
GLFWwindowrefreshfun windowRefreshCallback;
|
||||
|
@ -72,6 +72,7 @@ static void initWGLExtensions(_GLFWwindow* window)
|
||||
// This needs to include every extension used below except for
|
||||
// WGL_ARB_extensions_string and WGL_EXT_extensions_string
|
||||
window->WGL.ARB_multisample = GL_FALSE;
|
||||
window->WGL.ARB_framebuffer_sRGB = GL_FALSE;
|
||||
window->WGL.ARB_create_context = GL_FALSE;
|
||||
window->WGL.ARB_create_context_profile = GL_FALSE;
|
||||
window->WGL.EXT_create_context_es2_profile = GL_FALSE;
|
||||
@ -92,6 +93,9 @@ static void initWGLExtensions(_GLFWwindow* window)
|
||||
if (_glfwPlatformExtensionSupported("WGL_ARB_multisample"))
|
||||
window->WGL.ARB_multisample = GL_TRUE;
|
||||
|
||||
if (_glfwPlatformExtensionSupported("WGL_ARB_framebuffer_sRGB"))
|
||||
window->WGL.ARB_framebuffer_sRGB = GL_TRUE;
|
||||
|
||||
if (_glfwPlatformExtensionSupported("WGL_ARB_create_context"))
|
||||
{
|
||||
window->WGL.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
|
||||
@ -246,6 +250,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
|
||||
f->samples = getPixelFormatAttrib(window, i, WGL_SAMPLES_ARB);
|
||||
else
|
||||
f->samples = 0;
|
||||
|
||||
if (window->WGL.ARB_framebuffer_sRGB)
|
||||
f->sRGB = getPixelFormatAttrib(window, i, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB);
|
||||
else
|
||||
f->sRGB = GL_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -293,6 +302,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
|
||||
|
||||
// PFD pixel formats do not support FSAA
|
||||
f->samples = 0;
|
||||
|
||||
// PFD pixel formats do not support sRGB
|
||||
f->sRGB = GL_FALSE;
|
||||
}
|
||||
|
||||
f->platformID = i;
|
||||
|
@ -62,6 +62,7 @@ typedef struct _GLFWcontextWGL
|
||||
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||
GLboolean EXT_swap_control;
|
||||
GLboolean ARB_multisample;
|
||||
GLboolean ARB_framebuffer_sRGB;
|
||||
GLboolean ARB_pixel_format;
|
||||
GLboolean ARB_create_context;
|
||||
GLboolean ARB_create_context_profile;
|
||||
|
28
src/window.c
28
src/window.c
@ -119,8 +119,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused)
|
||||
|
||||
void _glfwInputWindowPos(_GLFWwindow* window, int x, int y)
|
||||
{
|
||||
if (window->positionX == x && window->positionY == y)
|
||||
return;
|
||||
|
||||
window->positionX = x;
|
||||
window->positionY = y;
|
||||
|
||||
if (window->windowPosCallback)
|
||||
window->windowPosCallback(window, x, y);
|
||||
}
|
||||
|
||||
|
||||
@ -231,6 +237,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
|
||||
fbconfig.auxBuffers = Max(_glfwLibrary.hints.auxBuffers, 0);
|
||||
fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE;
|
||||
fbconfig.samples = Max(_glfwLibrary.hints.samples, 0);
|
||||
fbconfig.sRGB = _glfwLibrary.hints.sRGB ? GL_TRUE : GL_FALSE;
|
||||
|
||||
// Set up desired window config
|
||||
wndconfig.mode = mode;
|
||||
@ -440,6 +447,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
|
||||
case GLFW_FSAA_SAMPLES:
|
||||
_glfwLibrary.hints.samples = hint;
|
||||
break;
|
||||
case GLFW_SRGB_CAPABLE:
|
||||
_glfwLibrary.hints.sRGB = hint;
|
||||
break;
|
||||
case GLFW_CLIENT_API:
|
||||
_glfwLibrary.hints.clientAPI = hint;
|
||||
break;
|
||||
@ -764,6 +774,24 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle)
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Set callback function for window position changes
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetWindowPosCallback(GLFWwindow handle, GLFWwindowposfun cbfun)
|
||||
{
|
||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||
|
||||
if (!_glfwInitialized)
|
||||
{
|
||||
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
window->windowPosCallback = cbfun;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Set callback function for window size changes
|
||||
//========================================================================
|
||||
|
@ -218,6 +218,15 @@ static const char* get_character_string(int character)
|
||||
return result;
|
||||
}
|
||||
|
||||
static void window_pos_callback(GLFWwindow window, int x, int y)
|
||||
{
|
||||
printf("%08x at %0.3f: Window position: %i %i\n",
|
||||
counter++,
|
||||
glfwGetTime(),
|
||||
x,
|
||||
y);
|
||||
}
|
||||
|
||||
static void window_size_callback(GLFWwindow window, int width, int height)
|
||||
{
|
||||
printf("%08x at %0.3f: Window size: %i %i\n",
|
||||
@ -354,6 +363,7 @@ int main(void)
|
||||
|
||||
printf("Window opened\n");
|
||||
|
||||
glfwSetWindowPosCallback(window, window_pos_callback);
|
||||
glfwSetWindowSizeCallback(window, window_size_callback);
|
||||
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||
glfwSetWindowRefreshCallback(window, window_refresh_callback);
|
||||
|
Loading…
Reference in New Issue
Block a user