Merge pull request #1 from glfw/master

Merge in latest glfw:master
This commit is contained in:
Alex Parlett 2013-09-22 05:47:37 -07:00
commit c1785ac48f
17 changed files with 509 additions and 142 deletions

View File

@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.8)
set(GLFW_VERSION_MAJOR "3") set(GLFW_VERSION_MAJOR "3")
set(GLFW_VERSION_MINOR "0") set(GLFW_VERSION_MINOR "0")
set(GLFW_VERSION_PATCH "2") set(GLFW_VERSION_PATCH "3")
set(GLFW_VERSION_EXTRA "") set(GLFW_VERSION_EXTRA "")
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}") set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}") set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
@ -163,6 +163,13 @@ if (_GLFW_WIN32)
if (GLFW_USE_OPTIMUS_HPG) if (GLFW_USE_OPTIMUS_HPG)
set(_GLFW_USE_OPTIMUS_HPG 1) set(_GLFW_USE_OPTIMUS_HPG 1)
endif() endif()
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
# the inclusion of stddef.h (by glfw3.h), which is itself included before
# win32_platform.h. We define them here until a saner solution can be found
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
add_definitions(-DUNICODE)
add_definitions(-DWINVER=0x0501)
endif() endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
@ -204,7 +211,13 @@ if (_GLFW_X11)
endif() endif()
list(APPEND glfw_INCLUDE_DIRS ${X11_Xinput_INCLUDE_PATH}) list(APPEND glfw_INCLUDE_DIRS ${X11_Xinput_INCLUDE_PATH})
list(APPEND glfw_LIBRARIES ${X11_Xinput_LIB})
if (X11_Xinput_LIB)
list(APPEND glfw_LIBRARIES ${X11_Xinput_LIB})
else()
# Backwards compatibility (bug in CMake 2.8.7)
list(APPEND glfw_LIBRARIES Xi)
endif()
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xi") set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xi")
# Check for Xf86VidMode (fallback gamma control) # Check for Xf86VidMode (fallback gamma control)

View File

@ -6,8 +6,9 @@ GLFW is a free, Open Source, portable library for OpenGL and OpenGL ES
application development. It provides a simple, platform-independent API for application development. It provides a simple, platform-independent API for
creating windows and contexts, reading input, handling events, etc. creating windows and contexts, reading input, handling events, etc.
Version 3.0.2 is *not yet described*. As this is a patch release, there are no Version 3.0.3 adds fixes for a number of bugs that together affect all supported
API changes. platforms, most notably MinGW compilation issues and cursor mode issues on OS X.
As this is a patch release, there are no API changes.
If you are new to GLFW, you may find the If you are new to GLFW, you may find the
[introductory tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW [introductory tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW
@ -167,11 +168,15 @@ directory of bundled applications to the `Contents/Resources` directory.
#### Windows specific options #### Windows specific options
`USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the `USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the
static library version of the Visual C++ runtime library. static library version of the Visual C++ runtime library. If set to `ON`, the
DLL version of the Visual C++ library is used. It is recommended to set this to
`ON`, as this keeps the executable smaller and benefits from security and bug
fix updates of the Visual C++ runtime.
`GLFW_USE_DWM_SWAP_INTERVAL` determines whether the swap interval is set even `GLFW_USE_DWM_SWAP_INTERVAL` determines whether the swap interval is set even
when DWM compositing is enabled. This can lead to severe jitter and is not when DWM compositing is enabled. If this is `ON`, the swap interval is set even
usually recommended. if DWM is enabled. It is recommended to set this to `OFF`, as doing otherwise
can lead to severe jitter.
`GLFW_USE_OPTIMUS_HPG` determines whether to export the `NvOptimusEnablement` `GLFW_USE_OPTIMUS_HPG` determines whether to export the `NvOptimusEnablement`
symbol, which forces the use of the high-performance GPU on nVidia Optimus symbol, which forces the use of the high-performance GPU on nVidia Optimus
@ -204,31 +209,13 @@ See the [GLFW documentation](http://www.glfw.org/docs/latest/).
## Changelog ## Changelog
- Bugfix: The `-Wall` flag was not used with Clang and other GCC compatibles - [Win32] Bugfix: `_WIN32_WINNT` was not set to Windows XP or later
- Bugfix: The default for `GLFW_ALPHA_BITS` was set to zero - [Win32] Bugfix: Legacy MinGW needs `WINVER` and `UNICODE` before `stddef.h`
- [Win32] Added `_GLFW_USE_DWM_SWAP_INTERVAL` for forcing the swap interval - [Cocoa] Bugfix: Cursor was not visible in normal mode in full screen
to be set even when DWM compositing is enabled - [Cocoa] Bugfix: Cursor was not actually hidden in hidden mode
- [Win32] Added support for forcing the use of the high-performance GPU - [Cocoa] Bugfix: Cursor modes were not applied to inactive windows
on nVidia Optimus systems - [X11] Bugfix: Events for mouse buttons 4 and above were not reported
- [Win32] Bugfix: The clipboard string was not freed on terminate - [X11] Bugfix: CMake 2.8.7 does not set `X11_Xinput_LIB` even when found
- [Win32] Bugfix: Entry points for OpenGL 1.0 and 1.1 functions were not
returned by `glfwGetProcAddress`
- [Win32] Bugfix: The `user32` and `dwmapi` module handles were not freed on
library termination
- [Cocoa] Added support for precise scrolling deltas on OS X 10.7 and later
- [Cocoa] Enabled explicit creation of OpenGL 3.x and 4.x contexts as supported
by OS X 10.9
- [Cocoa] Bugfix: The clipboard string was not freed on terminate
- [Cocoa] Bugfix: Selectors were used that are not declared by the 10.6 SDK
- [Cocoa] Bugfix: The position set by `glfwSetWindowPos` was incorrect
- [X11] Bugfix: Override-redirect windows were resized to the desired instead
of the actual resolution of the selected video mode
- [X11] Bugfix: Screensaver override for full screen windows had a possible
race condition
- [X11] Bugfix: The reported window position did not account for the size of
the window frame on some WMs
- [X11] Bugfix: The original video mode of a monitor was overwritten by calls
to `glfwSetWindowSize`
## Contact ## Contact
@ -264,6 +251,7 @@ skills.
- John Bartholomew - John Bartholomew
- Niklas Behrens - Niklas Behrens
- Niklas Bergström - Niklas Bergström
- Doug Binks
- blanco - blanco
- Lambert Clara - Lambert Clara
- Noel Cower - Noel Cower
@ -298,6 +286,7 @@ skills.
- Bruce Mitchener - Bruce Mitchener
- Jeff Molofee - Jeff Molofee
- Jon Morton - Jon Morton
- Pierre Moulon
- Julian Møller - Julian Møller
- Ozzy - Ozzy
- Peoro - Peoro

View File

@ -899,13 +899,13 @@ HTML_FILE_EXTENSION = .html
# have to redo this when upgrading to a newer version of doxygen or when # have to redo this when upgrading to a newer version of doxygen or when
# changing the value of configuration settings such as GENERATE_TREEVIEW! # changing the value of configuration settings such as GENERATE_TREEVIEW!
HTML_HEADER = HTML_HEADER = @GLFW_SOURCE_DIR@/docs/header.html
# The HTML_FOOTER tag can be used to specify a personal HTML footer for # The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a # each generated HTML page. If it is left blank doxygen will generate a
# standard footer. # standard footer.
HTML_FOOTER = HTML_FOOTER = @GLFW_SOURCE_DIR@/docs/footer.html
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading # The HTML_STYLESHEET tag can be used to specify a user-defined cascading
# style sheet that is used by each HTML page. It can be used to # style sheet that is used by each HTML page. It can be used to
@ -924,7 +924,7 @@ HTML_STYLESHEET =
# robust against future updates. Doxygen will copy the style sheet file to # robust against future updates. Doxygen will copy the style sheet file to
# the output directory. # the output directory.
HTML_EXTRA_STYLESHEET = HTML_EXTRA_STYLESHEET = @GLFW_SOURCE_DIR@/docs/extra.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note # other source files which should be copied to the HTML output directory. Note

312
docs/extra.css Normal file
View File

@ -0,0 +1,312 @@
html {
background-color:hsl(0,0%,95%);
}
.glfwheader {
font-size:16px;
height:64px;
max-width:920px;
margin:0em auto;
}
.glfwheader a#glfwhome {
line-height:64px;
padding-right:48pxpx;
float:left;
color:hsl(0,0%,40%);
font-size:2.5em;
background-image:url("http://www.glfw.org/css/arrow.png");
background-position:right top;
background-repeat:no-repeat;
}
.glfwnavbar {
list-style-type:none;
margin-top:0px;
float:right;
}
.glfwnavbar li {
float:left;
}
.glfwnavbar a,.glfwnavbar a:visited {
line-height:64px;
margin-left:2em;
display:block;
color:hsl(0,0%,40%);
}
.glfwheader a#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
transition:all 0.35s ease 0s;
}
#titlearea,address.footer {
color:hsl(0,0%,40%);
background-color:hsl(0,0%,95%);
border-bottom:none;
}
address.footer {
text-align:center;
padding:2em;
}
div#top {
background-color:hsl(0,0%,40%);
}
div#navrow1,div#navrow2,div#navrow3,div#navrow4 {
background-color:hsl(0,0%,40%);
background-image:none;
max-width:920px;
margin:0em auto;
}
ul.tablist {
min-width:700px;
}
.tablist a,.tablist a:hover,.tablist li,.tablist li.current a {
background-image:none;
text-shadow:none;
}
.tablist a,.tablist a:visited {
color:hsl(0,0%,95%);
text-shadow:none;
}
.tablist li.current a {
background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,100%,50%);
text-shadow:0px -1px 1px hsl(24,100%,35%);
color:hsl(0,0%,100%);
}
div.contents {
min-height:590px;
}
div.contents,div.header {
max-width:920px;
margin:0em auto;
padding:0em 2em 2em 2em;
background-color:hsl(0,0%,100%);
}
div.header {
background-image:none;
border-bottom:none;
}
table.doxtable th,dl.reflist dt,div.levels {
background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,100%,50%);
text-shadow:0px -1px 1px hsl(24,100%,35%);
color:hsl(0,0%,100%);
}
dl.reflist dt a.el,div.levels span {
color:hsl(24,100%,50%);
padding:0.2em;
border-radius:4px;
background-color:hsl(24,100%,90%);
text-shadow:none;
}
div.memproto,div.qindex,div.ah {
background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,0%,90%);
text-shadow:0px 1px 1px hsl(24,0%,100%);
color:hsl(0,0%,10%);
}
div.memproto a {
color:hsl(24,100%,50%);
}
div.memproto td.paramname {
text-shadow:0px 1px 1px hsl(24,0%,100%);
}
div.memproto,div.qindex,div.ah {
border:2px solid hsl(24,0%,90%);
border-radius:4px;
}
div.memdoc {
background:none;
box-shadow:none;
border:none;
}
td.paramname {
color:hsl(24,100%,25%);
}
dl.reflist dt {
border:2px solid hsl(24,100%,50%);
border-top-left-radius:4px;
border-top-right-radius:4px;
border-bottom:none;
}
dl.reflist dd {
border:2px solid hsl(24,100%,50%);
border-bottom-right-radius:4px;
border-bottom-left-radius:4px;
border-top:none;
background:none;
box-shadow:none;
}
table.doxtable {
border-collapse:inherit;
border-spacing:0px;
border:2px solid hsl(24,100%,50%);
border-radius:4px;
}
table.doxtable td,table.doxtable th {
border:none;
}
tr.even,.directory tr.even,table.doxtable tr:nth-child(even) {
background-color:hsl(0,0%,95%);
}
body {
color:hsl(0,0%,30%);
}
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
color:hsl(0,0%,10%);
border-bottom:none;
}
a,a:hover,a:visited,a:visited:hover,a.el,a.el:visited,.glfwheader a#glfwhome:hover,.tablist a:hover {
color:hsl(24,100%,50%);
text-decoration:none;
}
.mdescLeft,.mdescRight,.memItemLeft,.memItemRight {
background-color:hsl(0,0%,95%);
}
div.directory {
border-collapse:inherit;
border-spacing:0px;
border:2px solid hsl(24,100%,50%);
border-radius:4px;
}
.directory .levels span {
color:hsl(24,100%,50%);
padding:0.1em 0.5em;
margin:auto 0.25em;
border-radius:2px;
background-color:hsl(24,100%,90%);
text-shadow:none;
}
td.memSeparator {
height:2px;
border:0px;
background:linear-gradient(to right,hsl(0,0%,95%) 0%,hsl(0,0%,85%) 50%,hsl(0,0%,95%) 100%);
}
dl.note,dl.pre,dl.post,dl.invariant {
background:linear-gradient(to bottom,hsl(103,80%,90%) 0%,hsl(103,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(103,40%,80%);
color:hsl(103,80%,10%);
border:2px solid hsl(103,40%,75%);
}
dl.warning,dl.attention {
background:linear-gradient(to bottom,hsl(34,80%,90%) 0%,hsl(34,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(34,40%,80%);
color:hsl(34,80%,10%);
border:2px solid hsl(34,40%,75%);
}
dl.deprecated,dl.bug {
background:linear-gradient(to bottom,hsl(333,80%,90%) 0%,hsl(333,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(333,40%,80%);
color:hsl(333,80%,10%);
border:2px solid hsl(333,40%,75%);
}
dl.todo,dl.test {
background:linear-gradient(to bottom,hsl(200,80%,90%) 0%,hsl(200,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(200,40%,80%);
color:hsl(200,80%,10%);
border:2px solid hsl(200,40%,75%);
}
dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {
border-radius:4px;
padding:1em;
text-shadow:0px 1px 1px hsl(0,0%,100%);
}
div.toc {
background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,0%,90%);
text-shadow:0px 1px 1px hsl(24,0%,100%);
color:hsl(0,0%,10%);
border:2px solid hsl(24,0%,90%);
border-radius:4px;
float:none;
width:auto;
}
div.toc h3 {
font-size:1.17em;
}
div.toc ul {
padding-left:1.5em;
}
div.toc li {
background:none;
font-size:1em;
padding-left:0em;
list-style-type:disc;
}
div.ah {
background-image:none;
}
div.fragment,pre.fragment {
background-color:hsl(0,0%,20%);
border-radius:4px;
border-width:0px;
padding:0.5em 2em;
overflow:auto;
border-left:4px solid hsl(0,0%,80%);
}
div.line,pre.fragment {
color:hsl(60,30%,96%);
}
a.code,a.code:visited,span.preprocessor,span.comment {
color:hsl(80,76%,53%);
}
span.keyword,span.keywordtype,span.keywordflow {
color:hsl(190,81%,67%);
}
span.stringliteral {
color:hsl(54,70%,68%);
}
code {
background-color:hsl(0,0%,95%);
padding:0.1em;
border-radius: 4px;
}

7
docs/footer.html Normal file
View File

@ -0,0 +1,7 @@
<address class="footer">
<p>
Last update on $date for $projectname $projectnumber
</p>
</address>
</body>
</html>

34
docs/header.html Normal file
View File

@ -0,0 +1,34 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<div class="glfwheader">
<a href="http://www.glfw.org/index.html" id="glfwhome">GLFW</a>
<ul class="glfwnavbar">
<li><a href="http://www.glfw.org/documentation.html">Documentation</a></li>
<li><a href="http://www.glfw.org/download.html">Download</a></li>
<li><a href="http://www.glfw.org/media.html">Media</a></li>
<li><a href="http://www.glfw.org/community.html">Community</a></li>
</ul>
</div>
</div>
<!--END TITLEAREA-->
<!-- end header part -->

View File

@ -133,10 +133,38 @@ extern "C" {
/* Most GL/glu.h variants on Windows need wchar_t /* Most GL/glu.h variants on Windows need wchar_t
* OpenGL/gl.h blocks the definition of ptrdiff_t by glext.h on OS X */ * OpenGL/gl.h blocks the definition of ptrdiff_t by glext.h on OS X */
#include <stddef.h> #if !defined(GLFW_INCLUDE_NONE)
#include <stddef.h>
#endif
/* Include the chosen client API headers.
/* ---------------- GLFW related system specific defines ----------------- */ */
#if defined(__APPLE_CC__)
#if defined(GLFW_INCLUDE_GLCOREARB)
#include <OpenGL/gl3.h>
#elif !defined(GLFW_INCLUDE_NONE)
#define GL_GLEXT_LEGACY
#include <OpenGL/gl.h>
#endif
#if defined(GLFW_INCLUDE_GLU)
#include <OpenGL/glu.h>
#endif
#else
#if defined(GLFW_INCLUDE_GLCOREARB)
#include <GL/glcorearb.h>
#elif defined(GLFW_INCLUDE_ES1)
#include <GLES/gl.h>
#elif defined(GLFW_INCLUDE_ES2)
#include <GLES2/gl2.h>
#elif defined(GLFW_INCLUDE_ES3)
#include <GLES3/gl3.h>
#elif !defined(GLFW_INCLUDE_NONE)
#include <GL/gl.h>
#endif
#if defined(GLFW_INCLUDE_GLU)
#include <GL/glu.h>
#endif
#endif
#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) #if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)
/* GLFW_DLL is defined by users of GLFW when compiling programs that will link /* GLFW_DLL is defined by users of GLFW when compiling programs that will link
@ -173,35 +201,6 @@ extern "C" {
/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */
/* Include the chosen client API headers.
*/
#if defined(__APPLE_CC__)
#if defined(GLFW_INCLUDE_GLCOREARB)
#include <OpenGL/gl3.h>
#elif !defined(GLFW_INCLUDE_NONE)
#define GL_GLEXT_LEGACY
#include <OpenGL/gl.h>
#endif
#if defined(GLFW_INCLUDE_GLU)
#include <OpenGL/glu.h>
#endif
#else
#if defined(GLFW_INCLUDE_GLCOREARB)
#include <GL/glcorearb.h>
#elif defined(GLFW_INCLUDE_ES1)
#include <GLES/gl.h>
#elif defined(GLFW_INCLUDE_ES2)
#include <GLES2/gl2.h>
#elif defined(GLFW_INCLUDE_ES3)
#include <GLES3/gl3.h>
#elif !defined(GLFW_INCLUDE_NONE)
#include <GL/gl.h>
#endif
#if defined(GLFW_INCLUDE_GLU)
#include <GL/glu.h>
#endif
#endif
/************************************************************************* /*************************************************************************
* GLFW API tokens * GLFW API tokens
@ -228,7 +227,7 @@ extern "C" {
* API changes. * API changes.
* @ingroup init * @ingroup init
*/ */
#define GLFW_VERSION_REVISION 2 #define GLFW_VERSION_REVISION 3
/*! @} */ /*! @} */
/*! @name Key and button actions /*! @name Key and button actions
@ -793,7 +792,7 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
* *
* @ingroup monitor * @ingroup monitor
*/ */
typedef struct typedef struct GLFWvidmode
{ {
/*! The width, in screen coordinates, of the video mode. /*! The width, in screen coordinates, of the video mode.
*/ */
@ -823,7 +822,7 @@ typedef struct
* *
* @ingroup monitor * @ingroup monitor
*/ */
typedef struct typedef struct GLFWgammaramp
{ {
/*! An array of value describing the response of the red channel. /*! An array of value describing the response of the red channel.
*/ */
@ -1244,6 +1243,10 @@ GLFWAPI void glfwWindowHint(int target, int hint);
* information from the application's bundle. For more information on bundles, * information from the application's bundle. For more information on bundles,
* see the Bundle Programming Guide provided by Apple. * see the Bundle Programming Guide provided by Apple.
* *
* @remarks The swap interval is not set during window creation, but is left at
* the default value for that platform. For more information, see @ref
* glfwSwapInterval.
*
* @note This function may only be called from the main thread. * @note This function may only be called from the main thread.
* *
* @sa glfwDestroyWindow * @sa glfwDestroyWindow
@ -1854,9 +1857,9 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
* *
* @param[in] window The desired window. * @param[in] window The desired window.
* @param[in] xpos The desired x-coordinate, relative to the left edge of the * @param[in] xpos The desired x-coordinate, relative to the left edge of the
* client area, or `NULL`. * client area.
* @param[in] ypos The desired y-coordinate, relative to the top edge of the * @param[in] ypos The desired y-coordinate, relative to the top edge of the
* client area, or `NULL`. * client area.
* *
* @sa glfwGetCursorPos * @sa glfwGetCursorPos
* *
@ -2202,6 +2205,11 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window);
* *
* @remarks This function may be called from secondary threads. * @remarks This function may be called from secondary threads.
* *
* @note This function is not called during window creation, leaving the swap
* interval set to whatever is the default on that platform. This is done
* because some swap interval extensions used by GLFW do not allow the swap
* interval to be reset to zero once it has been set to a non-zero value.
*
* @note Some GPU drivers do not honor the requested swap interval, either * @note Some GPU drivers do not honor the requested swap interval, either
* because of user settings that override the request or due to bugs in the * because of user settings that override the request or due to bugs in the
* driver. * driver.

View File

@ -105,8 +105,6 @@ typedef struct _GLFWlibraryNS
id autoreleasePool; id autoreleasePool;
id cursor; id cursor;
GLboolean cursorHidden;
char* clipboardString; char* clipboardString;
_GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1]; _GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1];

View File

@ -30,6 +30,25 @@
#include <crt_externs.h> #include <crt_externs.h>
// Center the cursor in the view of the window
//
static void centerCursor(_GLFWwindow *window)
{
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);
}
// Update the cursor to match the specified cursor mode
//
static void setModeCursor(_GLFWwindow* window, int mode)
{
if (mode == GLFW_CURSOR_NORMAL)
[[NSCursor arrowCursor] set];
else
[(NSCursor*) _glfw.ns.cursor set];
}
// Enter fullscreen mode // Enter fullscreen mode
// //
static void enterFullscreenMode(_GLFWwindow* window) static void enterFullscreenMode(_GLFWwindow* window)
@ -94,13 +113,6 @@ static NSRect convertRectToBacking(_GLFWwindow* window, NSRect contentRect)
@implementation GLFWWindowDelegate @implementation GLFWWindowDelegate
static void centerCursor(_GLFWwindow *window)
{
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);
}
- (id)initWithGlfwWindow:(_GLFWwindow *)initWindow - (id)initWithGlfwWindow:(_GLFWwindow *)initWindow
{ {
self = [super init]; self = [super init];
@ -159,14 +171,13 @@ static void centerCursor(_GLFWwindow *window)
- (void)windowDidBecomeKey:(NSNotification *)notification - (void)windowDidBecomeKey:(NSNotification *)notification
{ {
_glfwInputWindowFocus(window, GL_TRUE); _glfwInputWindowFocus(window, GL_TRUE);
_glfwPlatformSetCursorMode(window, window->cursorMode);
if (window->cursorMode == GLFW_CURSOR_DISABLED)
centerCursor(window);
} }
- (void)windowDidResignKey:(NSNotification *)notification - (void)windowDidResignKey:(NSNotification *)notification
{ {
_glfwInputWindowFocus(window, GL_FALSE); _glfwInputWindowFocus(window, GL_FALSE);
_glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);
} }
@end @end
@ -445,6 +456,11 @@ static int translateKey(unsigned int key)
return YES; return YES;
} }
- (void)cursorUpdate:(NSEvent *)event
{
setModeCursor(window, window->cursorMode);
}
- (void)mouseDown:(NSEvent *)event - (void)mouseDown:(NSEvent *)event
{ {
_glfwInputMouseClick(window, _glfwInputMouseClick(window,
@ -548,7 +564,8 @@ static int translateKey(unsigned int key)
} }
NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways | NSTrackingActiveInKeyWindow |
NSTrackingCursorUpdate |
NSTrackingInVisibleRect; NSTrackingInVisibleRect;
trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
@ -566,9 +583,6 @@ static int translateKey(unsigned int key)
const int mods = translateFlags([event modifierFlags]); const int mods = translateFlags([event modifierFlags]);
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods); _glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
if (mods & GLFW_MOD_SUPER)
return;
NSString* characters = [event characters]; NSString* characters = [event characters];
NSUInteger i, length = [characters length]; NSUInteger i, length = [characters length];
@ -628,12 +642,6 @@ static int translateKey(unsigned int key)
_glfwInputScroll(window, deltaX, deltaY); _glfwInputScroll(window, deltaX, deltaY);
} }
- (void)resetCursorRects
{
[self discardCursorRects];
[self addCursorRect:[self bounds] cursor:_glfw.ns.cursor];
}
@end @end
@ -762,7 +770,7 @@ static void createMenuBar(void)
[NSApp setWindowsMenu:windowMenu]; [NSApp setWindowsMenu:windowMenu];
[windowMenuItem setSubmenu:windowMenu]; [windowMenuItem setSubmenu:windowMenu];
[windowMenu addItemWithTitle:@"Miniaturize" [windowMenu addItemWithTitle:@"Minimize"
action:@selector(performMiniaturize:) action:@selector(performMiniaturize:)
keyEquivalent:@"m"]; keyEquivalent:@"m"];
[windowMenu addItemWithTitle:@"Zoom" [windowMenu addItemWithTitle:@"Zoom"
@ -851,7 +859,6 @@ static GLboolean createWindow(_GLFWwindow* window,
[window->ns.object setContentView:window->ns.view]; [window->ns.object setContentView:window->ns.view];
[window->ns.object setDelegate:window->ns.delegate]; [window->ns.object setDelegate:window->ns.delegate];
[window->ns.object setAcceptsMouseMovedEvents:YES]; [window->ns.object setAcceptsMouseMovedEvents:YES];
[window->ns.object disableCursorRects];
[window->ns.object center]; [window->ns.object center];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
@ -1061,37 +1068,15 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
{ {
if (mode == GLFW_CURSOR_HIDDEN) setModeCursor(window, mode);
{
[window->ns.object enableCursorRects];
[window->ns.object invalidateCursorRectsForView:window->ns.view];
}
else
{
[window->ns.object disableCursorRects];
[window->ns.object invalidateCursorRectsForView:window->ns.view];
}
if (mode == GLFW_CURSOR_DISABLED) if (mode == GLFW_CURSOR_DISABLED)
{ {
CGAssociateMouseAndMouseCursorPosition(false); CGAssociateMouseAndMouseCursorPosition(false);
centerCursor(window);
if (!_glfw.ns.cursorHidden)
{
[NSCursor hide];
_glfw.ns.cursorHidden = GL_TRUE;
}
} }
else else
{
CGAssociateMouseAndMouseCursorPosition(true); CGAssociateMouseAndMouseCursorPosition(true);
if (_glfw.ns.cursorHidden)
{
[NSCursor unhide];
_glfw.ns.cursorHidden = GL_FALSE;
}
}
} }

View File

@ -386,7 +386,7 @@ int _glfwCreateContext(_GLFWwindow* window,
!_glfw.glx.ARB_create_context_profile || !_glfw.glx.ARB_create_context_profile ||
!_glfw.glx.EXT_create_context_es2_profile) !_glfw.glx.EXT_create_context_es2_profile)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
"GLX: OpenGL ES requested but " "GLX: OpenGL ES requested but "
"GLX_EXT_create_context_es2_profile is unavailable"); "GLX_EXT_create_context_es2_profile is unavailable");
return GL_FALSE; return GL_FALSE;

View File

@ -130,7 +130,7 @@ GLFWAPI int glfwInit(void)
_glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount); _glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount);
if (_glfw.monitors == NULL) if (_glfw.monitors == NULL)
{ {
_glfwErrorCallback(GLFW_PLATFORM_ERROR, "No monitors found"); _glfwInputError(GLFW_PLATFORM_ERROR, "No monitors found");
_glfwPlatformTerminate(); _glfwPlatformTerminate();
return GL_FALSE; return GL_FALSE;
} }

View File

@ -40,7 +40,7 @@ int _glfwInitContextAPI(void)
if (pthread_key_create(&_glfw.nsgl.current, NULL) != 0) if (pthread_key_create(&_glfw.nsgl.current, NULL) != 0)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create context TLS"); "NSGL: Failed to create context TLS");
return GL_FALSE; return GL_FALSE;
} }
@ -81,16 +81,15 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: This API does not support OpenGL ES"); "NSGL: This API does not support OpenGL ES");
return GL_FALSE; 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
if (wndconfig->glMajor == 3 && wndconfig->glMinor < 2) if (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of OS X does not " "NSGL: The targeted version of OS X does not "
"support OpenGL 3.0 or 3.1"); "support OpenGL 3.0 or 3.1");
return GL_FALSE; return GL_FALSE;
} }
@ -100,7 +99,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (!wndconfig->glForward) if (!wndconfig->glForward)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of OS X only " "NSGL: The targeted version of OS X only "
"supports OpenGL 3.2 and later versions if they " "supports OpenGL 3.2 and later versions if they "
"are forward-compatible"); "are forward-compatible");
return GL_FALSE; return GL_FALSE;
@ -109,7 +108,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE) if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of OS X only " "NSGL: The targeted version of OS X only "
"supports OpenGL 3.2 and later versions if they " "supports OpenGL 3.2 and later versions if they "
"use the core profile"); "use the core profile");
return GL_FALSE; return GL_FALSE;
@ -120,7 +119,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glMajor > 2) if (wndconfig->glMajor > 2)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of OS X does not " "NSGL: The targeted version of OS X does not "
"support OpenGL version 3.0 or above"); "support OpenGL version 3.0 or above");
return GL_FALSE; return GL_FALSE;
} }
@ -130,7 +129,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glRobustness) if (wndconfig->glRobustness)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: OS X does not support OpenGL robustness " "NSGL: OS X does not support OpenGL robustness "
"strategies"); "strategies");
return GL_FALSE; return GL_FALSE;
} }
@ -191,7 +190,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (window->nsgl.pixelFormat == nil) if (window->nsgl.pixelFormat == nil)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create OpenGL pixel format"); "NSGL: Failed to create OpenGL pixel format");
return GL_FALSE; return GL_FALSE;
} }
@ -206,7 +205,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (window->nsgl.context == nil) if (window->nsgl.context == nil)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create OpenGL context"); "NSGL: Failed to create OpenGL context");
return GL_FALSE; return GL_FALSE;
} }

View File

@ -529,7 +529,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window,
!window->wgl.ARB_create_context_profile || !window->wgl.ARB_create_context_profile ||
!window->wgl.EXT_create_context_es2_profile) !window->wgl.EXT_create_context_es2_profile)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
"WGL: OpenGL ES requested but " "WGL: OpenGL ES requested but "
"WGL_ARB_create_context_es2_profile is unavailable"); "WGL_ARB_create_context_es2_profile is unavailable");
return _GLFW_RECREATION_IMPOSSIBLE; return _GLFW_RECREATION_IMPOSSIBLE;

View File

@ -52,10 +52,15 @@
#define UNICODE #define UNICODE
#endif #endif
// GLFW requires Windows XP // GLFW requires Windows XP or later
#ifndef WINVER #if WINVER < 0x0501
#undef WINVER
#define WINVER 0x0501 #define WINVER 0x0501
#endif #endif
#if _WIN32_WINNT < 0x0501
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <windows.h> #include <windows.h>
#include <mmsystem.h> #include <mmsystem.h>

View File

@ -480,6 +480,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
} }
case WM_CHAR: case WM_CHAR:
case WM_SYSCHAR:
{ {
_glfwInputChar(window, (unsigned int) wParam); _glfwInputChar(window, (unsigned int) wParam);
return 0; return 0;

View File

@ -48,7 +48,7 @@ static int translateKey(int keyCode)
// Note: This way we always force "NumLock = ON", which is intentional // Note: This way we always force "NumLock = ON", which is intentional
// since the returned key code should correspond to a physical // since the returned key code should correspond to a physical
// location. // location.
keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 1, 0); keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 0, 1);
switch (keySym) switch (keySym)
{ {
case XK_KP_0: return GLFW_KEY_KP_0; case XK_KP_0: return GLFW_KEY_KP_0;

View File

@ -513,15 +513,12 @@ static void processEvent(XEvent *event)
{ {
const int key = translateKey(event->xkey.keycode); const int key = translateKey(event->xkey.keycode);
const int mods = translateState(event->xkey.state); const int mods = translateState(event->xkey.state);
const int character = translateChar(&event->xkey);
_glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods); _glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods);
if (!(mods & GLFW_MOD_CONTROL) && !(mods & GLFW_MOD_ALT)) if (character != -1)
{ _glfwInputChar(window, character);
const int character = translateChar(&event->xkey);
if (character != -1)
_glfwInputChar(window, character);
}
break; break;
} }
@ -556,6 +553,16 @@ static void processEvent(XEvent *event)
else if (event->xbutton.button == Button7) else if (event->xbutton.button == Button7)
_glfwInputScroll(window, 1.0, 0.0); _glfwInputScroll(window, 1.0, 0.0);
else
{
// Additional buttons after 7 are treated as regular buttons
// We subtract 4 to fill the gap left by scroll input above
_glfwInputMouseClick(window,
event->xbutton.button - 4,
GLFW_PRESS,
mods);
}
break; break;
} }
@ -584,6 +591,15 @@ static void processEvent(XEvent *event)
GLFW_RELEASE, GLFW_RELEASE,
mods); mods);
} }
else if (event->xbutton.button > Button7)
{
// Additional buttons after 7 are treated as regular buttons
// We subtract 4 to fill the gap left by scroll input above
_glfwInputMouseClick(window,
event->xbutton.button - 4,
GLFW_RELEASE,
mods);
}
break; break;
} }