You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							496 lines
						
					
					
						
							19 KiB
						
					
					
				
			
		
		
	
	
							496 lines
						
					
					
						
							19 KiB
						
					
					
				| /*! | |
| 
 | |
| @page window Window handling guide | |
|   | |
| @tableofcontents | |
| 
 | |
| The primary purpose of GLFW is to provide a simple interface to window | |
| management and OpenGL and OpenGL ES context creation.  GLFW supports multiple | |
| windows, which can be either a normal desktop window or a full screen window. | |
| 
 | |
| 
 | |
| @section window_object Window handles | |
| 
 | |
| The @ref GLFWwindow object encapsulates both a window and a context.  They are | |
| created with @ref glfwCreateWindow and destroyed with @ref glfwDestroyWindow (or | |
| @ref glfwTerminate, if any remain).  As the window and context are inseparably | |
| linked, the object pointer is used as both a context and window handle. | |
| 
 | |
| 
 | |
| @section window_creation Window creation | |
| 
 | |
| The window and its context are created with @ref glfwCreateWindow, which | |
| returns a handle to the created window object.  For example, this creates a 640 | |
| by 480 windowed mode window: | |
| 
 | |
| @code | |
| GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); | |
| @endcode | |
| 
 | |
| If window creation fails, `NULL` will be returned, so you need to check whether | |
| it did. | |
| 
 | |
| This handle is then passed to all window related functions, and is provided to | |
| you along with input events, so you know which window received the input. | |
| 
 | |
| To create a full screen window, you need to specify which monitor the window | |
| should use.  In most cases, the user's primary monitor is a good choice.  For | |
| more information about monitors, see the @ref monitor. | |
| 
 | |
| @code | |
| GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL); | |
| @endcode | |
| 
 | |
| Full screen windows cover the entire display area of a monitor, have no border | |
| or decorations, and change the monitor's resolution to the one most closely | |
| matching the requested window size. | |
| 
 | |
| For more control over how the window and its context are created, see @ref | |
| window_hints below. | |
| 
 | |
| 
 | |
| @section window_destruction Window destruction | |
| 
 | |
| When you are done with the window, destroy it with the @ref glfwDestroyWindow | |
| function. | |
| 
 | |
| @code | |
| glfwDestroyWindow(window); | |
| @endcode | |
| 
 | |
| Once this function is called, no more events will be delivered for that window | |
| and its handle becomes invalid. | |
| 
 | |
| 
 | |
| @section window_userptr Window user pointer | |
| 
 | |
| Each window has a user pointer that can be set with @ref | |
| glfwSetWindowUserPointer and fetched with @ref glfwGetWindowUserPointer.  This | |
| can be used for any purpose you need and will not modified by GLFW throughout | |
| the life-time of the window. | |
| 
 | |
| 
 | |
| @section window_hints Window creation hints | |
| 
 | |
| There are a number of hints that can be set before the creation of a window and | |
| context.  Some affect the window itself, others affect the framebuffer or | |
| context.  These hints are set to their default values each time the library is | |
| initialized with @ref glfwInit, can be set individually with @ref glfwWindowHint | |
| and reset all at once to their defaults with @ref glfwDefaultWindowHints. | |
| 
 | |
| Note that hints need to be set *before* the creation of the window and context | |
| you wish to have the specified attributes. | |
| 
 | |
| 
 | |
| @subsection window_hints_hard Hard and soft constraints | |
| 
 | |
| Some window hints are hard constraints.  These must match the available | |
| capabilities *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.  To | |
| find out the actual attributes of the created window and context, use the | |
| @ref glfwGetWindowAttrib function. | |
| 
 | |
| The following hints are hard constraints: | |
| - `GLFW_STEREO` | |
| - `GLFW_CLIENT_API` | |
| 
 | |
| The following additional hints are hard constraints if requesting an OpenGL | |
| context: | |
| - `GLFW_OPENGL_FORWARD_COMPAT` | |
| - `GLFW_OPENGL_PROFILE` | |
| 
 | |
| Hints that do not apply to a given type of window or context are ignored. | |
| 
 | |
| 
 | |
| @subsection window_hints_wnd Window related hints | |
| 
 | |
| The `GLFW_RESIZABLE` hint specifies whether the window will be resizable *by the | |
| user*.  The window will still be resizable using the @ref glfwSetWindowSize | |
| function.  This hint is ignored for full screen windows. | |
| 
 | |
| The `GLFW_VISIBLE` hint specifies whether the window will be initially | |
| visible.  This hint is ignored for full screen windows. | |
| 
 | |
| The `GLFW_DECORATED` hint specifies whether the window will have window | |
| decorations such as a border, a close widget, etc.  This hint is ignored for | |
| full screen windows.  Note that even though a window may lack a close widget, it | |
| is usually still possible for the user to generate close events. | |
| 
 | |
| 
 | |
| @subsection window_hints_fb Framebuffer related hints | |
| 
 | |
| The `GLFW_RED_BITS`, `GLFW_GREEN_BITS`, `GLFW_BLUE_BITS`, `GLFW_ALPHA_BITS`, | |
| `GLFW_DEPTH_BITS` and `GLFW_STENCIL_BITS` hints specify the desired bit | |
| depths of the various components of the default framebuffer. | |
| 
 | |
| The `GLFW_ACCUM_RED_BITS`, `GLFW_ACCUM_GREEN_BITS`, `GLFW_ACCUM_BLUE_BITS` | |
| and `GLFW_ACCUM_ALPHA_BITS` hints specify the desired bit depths of the | |
| various components of the accumulation buffer. | |
| 
 | |
| The `GLFW_AUX_BUFFERS` hint specifies the desired number of auxiliary | |
| buffers. | |
| 
 | |
| The `GLFW_STEREO` hint specifies whether to use stereoscopic rendering. | |
| 
 | |
| The `GLFW_SAMPLES` hint specifies the desired number of samples to use for | |
| multisampling.  Zero disables multisampling. | |
| 
 | |
| The `GLFW_SRGB_CAPABLE` hint specifies whether the framebuffer should be | |
| sRGB capable. | |
| 
 | |
| The `GLFW_REFRESH_RATE` hint specifies the desired refresh rate for full screen | |
| windows.  If set to zero, the highest available refresh rate will be used.  This | |
| hint is ignored for windowed mode windows. | |
| 
 | |
| 
 | |
| @subsection window_hints_ctx Context related hints | |
| 
 | |
| The `GLFW_CLIENT_API` hint specifies which client API to create the context | |
| for.  Possible values are `GLFW_OPENGL_API` and `GLFW_OPENGL_ES_API`. | |
| 
 | |
| The `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR` hints | |
| specify the client API version that the created context must be compatible | |
| with. | |
| 
 | |
| For OpenGL, these hints are *not* hard constraints, as they don't have to | |
| match exactly, but @ref glfwCreateWindow will still fail if the resulting | |
| OpenGL version is less than the one requested.  It is therefore perfectly | |
| safe to use the default of version 1.0 for legacy code and you may still | |
| get backwards-compatible contexts of version 3.0 and above when available. | |
| 
 | |
| While there is no way to ask the driver for a context of the highest supported | |
| version, most drivers provide this when you ask GLFW for a version | |
| 1.0 context. | |
| 
 | |
| For OpenGL ES, these hints are hard constraints. | |
| 
 | |
| If an OpenGL context is requested, the `GLFW_OPENGL_FORWARD_COMPAT` hint | |
| specifies whether the OpenGL context should be forward-compatible, i.e. one | |
| where all functionality deprecated in the requested version of OpenGL is | |
| removed.  This may only be used if the requested OpenGL version is 3.0 or | |
| above.  If another client API is requested, this hint is ignored. | |
| 
 | |
| If an OpenGL context is requested, the `GLFW_OPENGL_DEBUG_CONTEXT` hint | |
| specifies whether to create a debug OpenGL context, which may have | |
| additional error and performance issue reporting functionality.  If another | |
| client API is requested, this hint is ignored. | |
| 
 | |
| If an OpenGL context is requested, the `GLFW_OPENGL_PROFILE` hint specifies | |
| which OpenGL profile to create the context for.  Possible values are one of | |
| `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE`, or | |
| `GLFW_OPENGL_ANY_PROFILE` to not request a specific profile.  If requesting | |
| an OpenGL version below 3.2, `GLFW_OPENGL_ANY_PROFILE` must be used.  If | |
| another client API is requested, this hint is ignored. | |
| 
 | |
| The `GLFW_CONTEXT_ROBUSTNESS` hint specifies the robustness strategy to be | |
| used by the context.  This can be one of `GLFW_NO_RESET_NOTIFICATION` or | |
| `GLFW_LOSE_CONTEXT_ON_RESET`, or `GLFW_NO_ROBUSTNESS` to not request | |
| a robustness strategy. | |
| 
 | |
| 
 | |
| @subsection window_hints_values Supported and default values | |
| 
 | |
| | Name                         | Default value             | Supported values        | | |
| | ---------------------------- | ------------------------- | ----------------------- | | |
| | `GLFW_RESIZABLE`             | `GL_TRUE`                 | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_VISIBLE`               | `GL_TRUE`                 | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_DECORATED`             | `GL_TRUE`                 | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_RED_BITS`              | 8                         | 0 to `INT_MAX`          | | |
| | `GLFW_GREEN_BITS`            | 8                         | 0 to `INT_MAX`          | | |
| | `GLFW_BLUE_BITS`             | 8                         | 0 to `INT_MAX`          | | |
| | `GLFW_ALPHA_BITS`            | 8                         | 0 to `INT_MAX`          | | |
| | `GLFW_DEPTH_BITS`            | 24                        | 0 to `INT_MAX`          | | |
| | `GLFW_STENCIL_BITS`          | 8                         | 0 to `INT_MAX`          | | |
| | `GLFW_ACCUM_RED_BITS`        | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_ACCUM_GREEN_BITS`      | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_ACCUM_BLUE_BITS`       | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_ACCUM_ALPHA_BITS`      | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_AUX_BUFFERS`           | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_SAMPLES`               | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_REFRESH_RATE`          | 0                         | 0 to `INT_MAX`          | | |
| | `GLFW_STEREO`                | `GL_FALSE`                | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_SRGB_CAPABLE`          | `GL_FALSE`                | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_CLIENT_API`            | `GLFW_OPENGL_API`         | `GLFW_OPENGL_API` or `GLFW_OPENGL_ES_API` | | |
| | `GLFW_CONTEXT_VERSION_MAJOR` | 1                         | Any valid major version number of the chosen client API | | |
| | `GLFW_CONTEXT_VERSION_MINOR` | 0                         | Any valid minor version number of the chosen client API | | |
| | `GLFW_CONTEXT_ROBUSTNESS`    | `GLFW_NO_ROBUSTNESS`      | `GLFW_NO_ROBUSTNESS`, `GLFW_NO_RESET_NOTIFICATION` or `GLFW_LOSE_CONTEXT_ON_RESET` | | |
| | `GLFW_OPENGL_FORWARD_COMPAT` | `GL_FALSE`                | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_OPENGL_DEBUG_CONTEXT`  | `GL_FALSE`                | `GL_TRUE` or `GL_FALSE` | | |
| | `GLFW_OPENGL_PROFILE`        | `GLFW_OPENGL_ANY_PROFILE` | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE` | | |
| 
 | |
| 
 | |
| @section window_close Window close flag | |
| 
 | |
| When the user attempts to close the window, for example by clicking the close | |
| widget or using a key chord like Alt+F4, the *close flag* of the window is set. | |
| The window is however not actually destroyed and, unless you watch for this | |
| state change, nothing further happens. | |
| 
 | |
| The current state of the close flag is returned by @ref glfwWindowShouldClose | |
| and can be set or cleared directly with @ref glfwSetWindowShouldClose.  A common | |
| pattern is to use the close flag as a main loop condition. | |
| 
 | |
| @code | |
| while (!glfwWindowShouldClose(window)) | |
| { | |
|     render(window); | |
| 
 | |
|     glfwSwapBuffers(window); | |
|     glfwPollEvents(); | |
| } | |
| @endcode | |
| 
 | |
| If you wish to be notified when the user attempts to close a window, you can set | |
| the close callback with @ref glfwSetWindowCloseCallback.  This callback is | |
| called directly *after* the close flag has been set. | |
| 
 | |
| @code | |
| glfwSetWindowCloseCallback(window, window_close_callback); | |
| @endcode | |
| 
 | |
| The callback function can be used for example to filter close requests and clear | |
| the close flag again unless certain conditions are met. | |
| 
 | |
| @code | |
| void window_close_callback(GLFWwindow* window) | |
| { | |
|     if (!time_to_close) | |
|         glfwSetWindowShouldClose(window, GL_FALSE); | |
| } | |
| @endcode | |
| 
 | |
| 
 | |
| @section window_size Window size | |
| 
 | |
| The size of a window can be changed with @ref glfwSetWindowSize.  For windowed | |
| mode windows, this resizes the specified window so that its *client area* has | |
| the specified size.  Note that the window system may put limitations on size. | |
| For full screen windows, it selects and sets the video mode most closely | |
| matching the specified size. | |
| 
 | |
| @code | |
| void glfwSetWindowSize(window, 640, 480); | |
| @endcode | |
| 
 | |
| If you wish to be notified when a window is resized, whether by the user or | |
| the system, you can set the size callback with @ref glfwSetWindowSizeCallback. | |
| 
 | |
| @code | |
| glfwSetWindowSizeCallback(window, window_size_callback); | |
| @endcode | |
| 
 | |
| The callback function receives the new size of the client area of the window. | |
| 
 | |
| @code | |
| void window_size_callback(GLFWwindow* window, int width, int height) | |
| { | |
| } | |
| @endcode | |
| 
 | |
| There is also @ref glfwGetWindowSize for directly retrieving the current size of | |
| a window. | |
| 
 | |
| @code | |
| int width, height; | |
| glfwGetWindowSize(window, &width, &height); | |
| @endcode | |
| 
 | |
| 
 | |
| @section window_fbsize Window framebuffer size | |
| 
 | |
| While the size of a window is measured in screen coordinates, OpenGL works with | |
| pixels.  The size you pass into `glViewport`, for example, should be in pixels | |
| and not screen coordinates.  On some platforms screen coordinates and pixels are | |
| the same, but this is not the case on all platforms supported by GLFW.  There is | |
| a second set of functions to retrieve the size in pixels of the framebuffer of | |
| a window. | |
| 
 | |
| If you wish to be notified when the framebuffer of a window is resized, whether | |
| by the user or the system, you can set the size callback with @ref | |
| glfwSetFramebufferSizeCallback. | |
| 
 | |
| @code | |
| glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); | |
| @endcode | |
| 
 | |
| The callback function receives the new size of the client area of the window, | |
| which can for example be used to update the OpenGL viewport. | |
| 
 | |
| @code | |
| void framebuffer_size_callback(GLFWwindow* window, int width, int height) | |
| { | |
|     glViewport(0, 0, width, height); | |
| } | |
| @endcode | |
| 
 | |
| There is also @ref glfwGetFramebufferSize for directly retrieving the current | |
| size of the framebuffer of a window. | |
| 
 | |
| @code | |
| int width, height; | |
| glfwGetFramebufferSize(window, &width, &height); | |
| glViewport(0, 0, width, height); | |
| @endcode | |
| 
 | |
| Note that the size of a framebuffer may change independently of the size of | |
| a window, for example if the window is dragged between a regular monitor and | |
| a high-DPI one. | |
| 
 | |
| 
 | |
| @section window_pos Window position | |
| 
 | |
| The position of a windowed-mode window can be changed with @ref | |
| glfwSetWindowPos.  This moves the window so that the upper-left corner of its | |
| client area has the specified screen coordinates.  Note that the window system | |
| may put limitations on placement. | |
| 
 | |
| @code | |
| glfwSetWindowPos(window, 100, 100); | |
| @endcode | |
| 
 | |
| If you wish to be notified when a window is moved, whether by the user or | |
| the system, you can set the position callback with @ref glfwSetWindowPosCallback. | |
| 
 | |
| @code | |
| glfwSetWindowPosCallback(window, window_pos_callback); | |
| @endcode | |
| 
 | |
| The callback function receives the new position of the upper-left corner of its | |
| client area. | |
| 
 | |
| @code | |
| void window_size_callback(GLFWwindow* window, int xpos, int ypos) | |
| { | |
| } | |
| @endcode | |
| 
 | |
| There is also @ref glfwGetWindowPos for directly retrieving the current position | |
| of the client area of the window. | |
| 
 | |
| @code | |
| int xpos, ypos; | |
| glfwGetWindowPos(window, &xpos, &ypos); | |
| @endcode | |
| 
 | |
| 
 | |
| @section window_title Window title | |
| 
 | |
| All GLFW windows have a title, although undecorated or full screen windows may | |
| not display it or only display it in a task bar or similar interface.  To change | |
| the title of a window, use @ref glfwSetWindowTitle. | |
| 
 | |
| @code | |
| glfwSetWindowTitle(window, "My Window"); | |
| @endcode | |
| 
 | |
| The window title is a regular C string using the UTF-8 encoding.  This means | |
| for example that, as long as your source file is encoded as UTF-8, you can use | |
| any Unicode characters. | |
| 
 | |
| @code | |
| glfwSetWindowTitle(window, "さよなら絶望先生"); | |
| @endcode | |
| 
 | |
| 
 | |
| @section window_attribs Window attributes | |
| 
 | |
| Windows have a number of attributes that can be returned using @ref | |
| glfwGetWindowAttrib.  Some reflect state that may change during the lifetime of | |
| the window, while others reflect the corresponding hints and are fixed at the | |
| time of creation. | |
| 
 | |
| @code | |
| if (glfwGetWindowAttrib(window, GLFW_FOCUSED)) | |
| { | |
|     // window has input focus | |
| } | |
| @endcode | |
| 
 | |
| 
 | |
| @subsection window_attribs_window Window attributes | |
| 
 | |
| The `GLFW_FOCUSED` attribute indicates whether the specified window currently | |
| has input focus. | |
| 
 | |
| The `GLFW_ICONIFIED` attribute indicates whether the specified window is | |
| currently iconified, whether by the user or with @ref glfwIconifyWindow. | |
| 
 | |
| The `GLFW_VISIBLE` attribute indicates whether the specified window is currently | |
| visible.  Window visibility can be controlled with @ref glfwShowWindow and @ref | |
| glfwHideWindow and initial visibility is controlled by the | |
| [window hint](@ref window_hints) with the same name.   | |
| 
 | |
| The `GLFW_RESIZABLE` attribute indicates whether the specified window is | |
| resizable *by the user*.  This is controlled by the | |
| [window hint](@ref window_hints) with the same name. | |
| 
 | |
| The `GLFW_DECORATED` attribute indicates whether the specified window has | |
| decorations such as a border, a close widget, etc.  This is controlled by the | |
| [window hint](@ref window_hints) with the same name.  | |
| 
 | |
| 
 | |
| @subsection window_attribs_context Context attributes | |
| 
 | |
| The `GLFW_CLIENT_API` attribute indicates the client API provided by the | |
| window's context; either `GLFW_OPENGL_API` or `GLFW_OPENGL_ES_API`. | |
| 
 | |
| The `GLFW_CONTEXT_VERSION_MAJOR`, `GLFW_CONTEXT_VERSION_MINOR` and | |
| `GLFW_CONTEXT_REVISION` attributes indicate the client API version of the | |
| window's context. | |
| 
 | |
| The `GLFW_OPENGL_FORWARD_COMPAT` attribute is `GL_TRUE` if the window's | |
| context is an OpenGL forward-compatible one, or `GL_FALSE` otherwise. | |
| 
 | |
| The `GLFW_OPENGL_DEBUG_CONTEXT` attribute is `GL_TRUE` if the window's | |
| context is an OpenGL debug context, or `GL_FALSE` otherwise. | |
| 
 | |
| The `GLFW_OPENGL_PROFILE` attribute indicates the OpenGL profile used by the | |
| context.  This is `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE` | |
| if the context uses a known profile, or `GLFW_OPENGL_ANY_PROFILE` if the | |
| OpenGL profile is unknown or the context is for another client API.  Note that | |
| the returned profile may not match the profile bits of the context flags, as | |
| GLFW will try other means of detecting the profile when no bits are set. | |
| 
 | |
| The `GLFW_CONTEXT_ROBUSTNESS` attribute indicates the robustness strategy | |
| used by the context.  This is `GLFW_LOSE_CONTEXT_ON_RESET` or | |
| `GLFW_NO_RESET_NOTIFICATION` if the window's context supports robustness, or | |
| `GLFW_NO_ROBUSTNESS` otherwise. | |
| 
 | |
| 
 | |
| @section window_swap Swapping buffers | |
| 
 | |
| GLFW windows are always double buffered.  That means that you have two | |
| rendering buffers; a front buffer and a back buffer.  The front buffer is | |
| the one being displayed and the back buffer the one you render to. | |
| 
 | |
| When the entire frame has been rendered, it is time to swap the back and the | |
| front buffers in order to display what has been rendered and begin rendering | |
| a new frame.  This is done with @ref glfwSwapBuffers. | |
| 
 | |
| @code | |
| glfwSwapBuffers(window); | |
| @endcode | |
| 
 | |
| Sometimes it can be useful to select when the buffer swap will occur.  With the | |
| function @ref glfwSwapInterval it is possible to select the minimum number of | |
| monitor refreshes the driver should wait before swapping the buffers: | |
| 
 | |
| @code | |
| glfwSwapInterval(1); | |
| @endcode | |
| 
 | |
| If the interval is zero, the swap will take place immediately when @ref | |
| glfwSwapBuffers is called without waiting for a refresh.  Otherwise at least | |
| interval retraces will pass between each buffer swap.  Using a swap interval of | |
| zero can be useful for benchmarking purposes, when it is not desirable to | |
| measure the time it takes to wait for the vertical retrace.  However, a swap | |
| interval of one lets you avoid tearing. | |
| 
 | |
| Note that this may not work on all machines, as some drivers have | |
| user-controlled settings that override any swap interval the application | |
| requests.  It is also by default disabled on Windows Vista and later when using | |
| DWM (Aero), as using it there sometimes leads to severe jitter.  You can | |
| forcibly enable it for machines using DWM using @ref compile_options_win32. | |
| 
 | |
| */
 | |
| 
 |