mirror of
https://github.com/glfw/glfw.git
synced 2024-11-24 19:15:15 +00:00
d79056fc27
This window hint allows choosing between hardware and software renderers (where available) for the created OpenGL or OpenGL ES context. Fixes #589.
1350 lines
50 KiB
Plaintext
1350 lines
50 KiB
Plaintext
/*!
|
|
|
|
@page window_guide Window guide
|
|
|
|
@tableofcontents
|
|
|
|
This guide introduces the window related functions of GLFW. For details on
|
|
a specific function in this category, see the @ref window. There are also
|
|
guides for the other areas of GLFW.
|
|
|
|
- @ref intro_guide
|
|
- @ref context_guide
|
|
- @ref vulkan_guide
|
|
- @ref monitor_guide
|
|
- @ref input_guide
|
|
|
|
|
|
@section window_object Window objects
|
|
|
|
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.
|
|
|
|
To see the event stream provided to the various window related callbacks, run
|
|
the `events` test program.
|
|
|
|
|
|
@subsection window_creation Window creation
|
|
|
|
A window and its OpenGL or OpenGL ES 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 it is necessary to check
|
|
the return value.
|
|
|
|
The window handle is passed to all window related functions and is provided to
|
|
along with all input events, so event handlers can tell which window received
|
|
the event.
|
|
|
|
|
|
@subsubsection window_full_screen Full screen windows
|
|
|
|
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 retrieving monitors, see @ref monitor_monitors.
|
|
|
|
@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.
|
|
|
|
Windowed mode windows can be made full screen by setting a monitor with @ref
|
|
glfwSetWindowMonitor, and full screen ones can be made windowed by unsetting it
|
|
with the same function.
|
|
|
|
Each field of the @ref GLFWvidmode structure corresponds to a function parameter
|
|
or window hint and combine to form the _desired video mode_ for that window.
|
|
The supported video mode most closely matching the desired video mode will be
|
|
set for the chosen monitor as long as the window has input focus. For more
|
|
information about retrieving video modes, see @ref monitor_modes.
|
|
|
|
Video mode field | Corresponds to
|
|
----------------------- | ------------------------
|
|
GLFWvidmode.width | `width` parameter
|
|
GLFWvidmode.height | `height` parameter
|
|
GLFWvidmode.redBits | @ref GLFW_RED_BITS hint
|
|
GLFWvidmode.greenBits | @ref GLFW_GREEN_BITS hint
|
|
GLFWvidmode.blueBits | @ref GLFW_BLUE_BITS hint
|
|
GLFWvidmode.refreshRate | @ref GLFW_REFRESH_RATE hint
|
|
|
|
Once you have a full screen window, you can change its resolution, refresh rate
|
|
and monitor with @ref glfwSetWindowMonitor. If you only need change its
|
|
resolution you can also call @ref glfwSetWindowSize. In all cases, the new
|
|
video mode will be selected the same way as the video mode chosen by @ref
|
|
glfwCreateWindow. If the window has an OpenGL or OpenGL ES context, it will be
|
|
unaffected.
|
|
|
|
By default, the original video mode of the monitor will be restored and the
|
|
window iconified if it loses input focus, to allow the user to switch back to
|
|
the desktop. This behavior can be disabled with the
|
|
[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint, for example if you
|
|
wish to simultaneously cover multiple monitors with full screen windows.
|
|
|
|
If a monitor is disconnected, all windows that are full screen on that monitor
|
|
will be switched to windowed mode. See @ref monitor_event for more information.
|
|
|
|
|
|
@subsubsection window_windowed_full_screen "Windowed full screen" windows
|
|
|
|
If the closest match for the desired video mode is the current one, the video
|
|
mode will not be changed, making window creation faster and application
|
|
switching much smoother. This is sometimes called _windowed full screen_ or
|
|
_borderless full screen_ window and counts as a full screen window. To create
|
|
such a window, request the current video mode.
|
|
|
|
@code
|
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
|
|
|
glfwWindowHint(GLFW_RED_BITS, mode->redBits);
|
|
glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
|
|
glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
|
|
glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
|
|
|
|
GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "My Title", monitor, NULL);
|
|
@endcode
|
|
|
|
This also works for windowed mode windows that are made full screen.
|
|
|
|
@code
|
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
|
|
|
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
|
|
@endcode
|
|
|
|
Note that @ref glfwGetVideoMode returns the _current_ video mode of a monitor,
|
|
so if you already have a full screen window on that monitor that you want to
|
|
make windowed full screen, you need to have saved the desktop resolution before.
|
|
|
|
|
|
@subsection window_destruction Window destruction
|
|
|
|
When a window is no longer needed, destroy it with @ref glfwDestroyWindow.
|
|
|
|
@code
|
|
glfwDestroyWindow(window);
|
|
@endcode
|
|
|
|
Window destruction always succeeds. Before the actual destruction, all
|
|
callbacks are removed so no further events will be delivered for the window.
|
|
All windows remaining when @ref glfwTerminate is called are destroyed as well.
|
|
|
|
When a full screen window is destroyed, the original video mode of its monitor
|
|
is restored, but the gamma ramp is left untouched.
|
|
|
|
|
|
@subsection 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.
|
|
|
|
Some hints are platform specific. These are always valid to set on any
|
|
platform but they will only affect their specific platform. Other platforms
|
|
will ignore them. Setting these hints requires no platform specific headers or
|
|
calls.
|
|
|
|
Note that hints need to be set _before_ the creation of the window and context
|
|
you wish to have the specified attributes.
|
|
|
|
|
|
@subsubsection 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 context and framebuffer may differ from what these hints requested.
|
|
|
|
The following hints are always hard constraints:
|
|
- @ref GLFW_STEREO
|
|
- @ref GLFW_DOUBLEBUFFER
|
|
- [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint)
|
|
- [GLFW_CONTEXT_CREATION_API](@ref GLFW_CONTEXT_CREATION_API_hint)
|
|
|
|
The following additional hints are hard constraints when requesting an OpenGL
|
|
context, but are ignored when requesting an OpenGL ES context:
|
|
- [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint)
|
|
- [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint)
|
|
|
|
|
|
@subsubsection window_hints_wnd Window related hints
|
|
|
|
@anchor GLFW_RESIZABLE_hint
|
|
__GLFW_RESIZABLE__ specifies whether the windowed mode window will be resizable
|
|
_by the user_. The window will still be resizable using the @ref
|
|
glfwSetWindowSize function. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
This hint is ignored for full screen and undecorated windows.
|
|
|
|
@anchor GLFW_VISIBLE_hint
|
|
__GLFW_VISIBLE__ specifies whether the windowed mode window will be initially
|
|
visible. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This hint is
|
|
ignored for full screen windows.
|
|
|
|
@anchor GLFW_DECORATED_hint
|
|
__GLFW_DECORATED__ specifies whether the windowed mode window will have window
|
|
decorations such as a border, a close widget, etc. An undecorated window will
|
|
not be resizable by the user but will still allow the user to generate close
|
|
events on some platforms. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
This hint is ignored for full screen windows.
|
|
|
|
@anchor GLFW_FOCUSED_hint
|
|
__GLFW_FOCUSED__ specifies whether the windowed mode window will be given input
|
|
focus when created. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This
|
|
hint is ignored for full screen and initially hidden windows.
|
|
|
|
@anchor GLFW_AUTO_ICONIFY_hint
|
|
__GLFW_AUTO_ICONIFY__ specifies whether the full screen window will
|
|
automatically iconify and restore the previous video mode on input focus loss.
|
|
Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This hint is ignored for
|
|
windowed mode windows.
|
|
|
|
@anchor GLFW_FLOATING_hint
|
|
__GLFW_FLOATING__ specifies whether the windowed mode window will be floating
|
|
above other regular windows, also called topmost or always-on-top. This is
|
|
intended primarily for debugging purposes and cannot be used to implement proper
|
|
full screen windows. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This
|
|
hint is ignored for full screen windows.
|
|
|
|
@anchor GLFW_MAXIMIZED_hint
|
|
__GLFW_MAXIMIZED__ specifies whether the windowed mode window will be maximized
|
|
when created. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This hint is
|
|
ignored for full screen windows.
|
|
|
|
@anchor GLFW_CENTER_CURSOR_hint
|
|
__GLFW_CENTER_CURSOR__ specifies whether the cursor should be centered over
|
|
newly created full screen windows. Possible values are `GLFW_TRUE` and
|
|
`GLFW_FALSE`. This hint is ignored for windowed mode windows.
|
|
|
|
@anchor GLFW_TRANSPARENT_FRAMEBUFFER_hint
|
|
__GLFW_TRANSPARENT_FRAMEBUFFER__ specifies whether the window framebuffer will
|
|
be transparent. If enabled and supported by the system, the window framebuffer
|
|
alpha channel will be used to combine the framebuffer with the background. This
|
|
does not affect window decorations. Possible values are `GLFW_TRUE` and
|
|
`GLFW_FALSE`.
|
|
|
|
|
|
@subsubsection window_hints_fb Framebuffer related hints
|
|
|
|
@anchor GLFW_RED_BITS
|
|
@anchor GLFW_GREEN_BITS
|
|
@anchor GLFW_BLUE_BITS
|
|
@anchor GLFW_ALPHA_BITS
|
|
@anchor GLFW_DEPTH_BITS
|
|
@anchor GLFW_STENCIL_BITS
|
|
__GLFW_RED_BITS__, __GLFW_GREEN_BITS__, __GLFW_BLUE_BITS__, __GLFW_ALPHA_BITS__,
|
|
__GLFW_DEPTH_BITS__ and __GLFW_STENCIL_BITS__ specify the desired bit depths of
|
|
the various components of the default framebuffer. A value of `GLFW_DONT_CARE`
|
|
means the application has no preference.
|
|
|
|
@anchor GLFW_ACCUM_RED_BITS
|
|
@anchor GLFW_ACCUM_GREEN_BITS
|
|
@anchor GLFW_ACCUM_BLUE_BITS
|
|
@anchor GLFW_ACCUM_ALPHA_BITS
|
|
__GLFW_ACCUM_RED_BITS__, __GLFW_ACCUM_GREEN_BITS__, __GLFW_ACCUM_BLUE_BITS__ and
|
|
__GLFW_ACCUM_ALPHA_BITS__ specify the desired bit depths of the various
|
|
components of the accumulation buffer. A value of `GLFW_DONT_CARE` means the
|
|
application has no preference.
|
|
|
|
@par
|
|
Accumulation buffers are a legacy OpenGL feature and should not be used in new
|
|
code.
|
|
|
|
@anchor GLFW_AUX_BUFFERS
|
|
__GLFW_AUX_BUFFERS__ specifies the desired number of auxiliary buffers. A value
|
|
of `GLFW_DONT_CARE` means the application has no preference.
|
|
|
|
@par
|
|
Auxiliary buffers are a legacy OpenGL feature and should not be used in new
|
|
code.
|
|
|
|
@anchor GLFW_STEREO
|
|
__GLFW_STEREO__ specifies whether to use OpenGL stereoscopic rendering.
|
|
Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is a hard constraint.
|
|
|
|
@anchor GLFW_SAMPLES
|
|
__GLFW_SAMPLES__ specifies the desired number of samples to use for
|
|
multisampling. Zero disables multisampling. A value of `GLFW_DONT_CARE` means
|
|
the application has no preference.
|
|
|
|
@anchor GLFW_SRGB_CAPABLE
|
|
__GLFW_SRGB_CAPABLE__ specifies whether the framebuffer should be sRGB capable.
|
|
Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
|
|
@par
|
|
__OpenGL:__ If enabled and supported by the system, the `GL_FRAMEBUFFER_SRGB`
|
|
enable will control sRGB rendering. By default, sRGB rendering will be
|
|
disabled.
|
|
|
|
@par
|
|
__OpenGL ES:__ If enabled and supported by the system, the context will always
|
|
have sRGB rendering enabled.
|
|
|
|
@anchor GLFW_DOUBLEBUFFER
|
|
__GLFW_DOUBLEBUFFER__ specifies whether the framebuffer should be double
|
|
buffered. You nearly always want to use double buffering. This is a hard
|
|
constraint. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
|
|
|
|
@subsubsection window_hints_mtr Monitor related hints
|
|
|
|
@anchor GLFW_REFRESH_RATE
|
|
__GLFW_REFRESH_RATE__ specifies the desired refresh rate for full screen
|
|
windows. A value of `GLFW_DONT_CARE` means the highest available refresh rate
|
|
will be used. This hint is ignored for windowed mode windows.
|
|
|
|
|
|
@subsubsection window_hints_ctx Context related hints
|
|
|
|
@anchor GLFW_CLIENT_API_hint
|
|
__GLFW_CLIENT_API__ specifies which client API to create the context for.
|
|
Possible values are `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` and `GLFW_NO_API`.
|
|
This is a hard constraint.
|
|
|
|
@anchor GLFW_CONTEXT_CREATION_API_hint
|
|
__GLFW_CONTEXT_CREATION_API__ specifies which context creation API to use to
|
|
create the context. Possible values are `GLFW_NATIVE_CONTEXT_API`,
|
|
`GLFW_EGL_CONTEXT_API` and `GLFW_OSMESA_CONTEXT_API`. This is a hard
|
|
constraint. If no client API is requested, this hint is ignored.
|
|
|
|
@par
|
|
@macos The EGL API is not available on this platform and requests to use it
|
|
will fail.
|
|
|
|
@par
|
|
__Wayland, Mir:__ The EGL API _is_ the native context creation API, so this hint
|
|
will have no effect.
|
|
|
|
@par
|
|
__OSMesa:__ As its name implies, an OpenGL context created with OSMesa does not
|
|
update the window contents when its buffers are swapped. Use OpenGL functions
|
|
or the OSMesa native access functions @ref glfwGetOSMesaColorBuffer and @ref
|
|
glfwGetOSMesaDepthBuffer to retrieve the framebuffer contents.
|
|
|
|
@note An OpenGL extension loader library that assumes it knows which context
|
|
creation API is used on a given platform may fail if you change this hint. This
|
|
can be resolved by having it load via @ref glfwGetProcAddress, which always uses
|
|
the selected API.
|
|
|
|
@bug On some Linux systems, creating contexts via both the native and EGL APIs
|
|
in a single process will cause the application to segfault. Stick to one API or
|
|
the other on Linux for now.
|
|
|
|
@anchor GLFW_CONTEXT_RENDERER_hint
|
|
__GLFW_CONTEXT_RENDERER__ specifies whether to create the context using
|
|
a hardware or software renderer, if that is possible to control on the current
|
|
platform.
|
|
|
|
@anchor GLFW_CONTEXT_VERSION_MAJOR_hint
|
|
@anchor GLFW_CONTEXT_VERSION_MINOR_hint
|
|
__GLFW_CONTEXT_VERSION_MAJOR__ and __GLFW_CONTEXT_VERSION_MINOR__ specify the
|
|
client API version that the created context must be compatible with. The exact
|
|
behavior of these hints depend on the requested client API.
|
|
|
|
@note Do not confuse these hints with `GLFW_VERSION_MAJOR` and
|
|
`GLFW_VERSION_MINOR`, which provide the API version of the GLFW header.
|
|
|
|
@par
|
|
__OpenGL:__ These hints are not hard constraints, but creation will fail if the
|
|
OpenGL version of the created context is less than the one requested. It is
|
|
therefore perfectly safe to use the default of version 1.0 for legacy code and
|
|
you will still get backwards-compatible contexts of version 3.0 and above when
|
|
available.
|
|
|
|
@par
|
|
While there is no way to ask the driver for a context of the highest supported
|
|
version, GLFW will attempt to provide this when you ask for a version 1.0
|
|
context, which is the default for these hints.
|
|
|
|
@par
|
|
__OpenGL ES:__ These hints are not hard constraints, but creation will fail if
|
|
the OpenGL ES version of the created context is less than the one requested.
|
|
Additionally, OpenGL ES 1.x cannot be returned if 2.0 or later was requested,
|
|
and vice versa. This is because OpenGL ES 3.x is backward compatible with 2.0,
|
|
but OpenGL ES 2.0 is not backward compatible with 1.x.
|
|
|
|
@note @macos The OS only supports forward-compatible core profile contexts for
|
|
OpenGL versions 3.2 and later. Before creating an OpenGL context of version
|
|
3.2 or later you must set the
|
|
[GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and
|
|
[GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. OpenGL
|
|
3.0 and 3.1 contexts are not supported at all on macOS.
|
|
|
|
@anchor GLFW_OPENGL_FORWARD_COMPAT_hint
|
|
__GLFW_OPENGL_FORWARD_COMPAT__ 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 must only be used if the requested OpenGL
|
|
version is 3.0 or above. If OpenGL ES is requested, this hint is ignored.
|
|
|
|
@par
|
|
Forward-compatibility is described in detail in the
|
|
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
|
|
|
@anchor GLFW_OPENGL_DEBUG_CONTEXT_hint
|
|
__GLFW_OPENGL_DEBUG_CONTEXT__ specifies whether to create a debug OpenGL
|
|
context, which may have additional error and performance issue reporting
|
|
functionality. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. If OpenGL ES
|
|
is requested, this hint is ignored.
|
|
|
|
@anchor GLFW_OPENGL_PROFILE_hint
|
|
__GLFW_OPENGL_PROFILE__ 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 OpenGL ES is requested, this hint
|
|
is ignored.
|
|
|
|
@par
|
|
OpenGL profiles are described in detail in the
|
|
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
|
|
|
@anchor GLFW_CONTEXT_ROBUSTNESS_hint
|
|
__GLFW_CONTEXT_ROBUSTNESS__ 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.
|
|
|
|
@anchor GLFW_CONTEXT_RELEASE_BEHAVIOR_hint
|
|
__GLFW_CONTEXT_RELEASE_BEHAVIOR__ specifies the release behavior to be
|
|
used by the context. Possible values are one of `GLFW_ANY_RELEASE_BEHAVIOR`,
|
|
`GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`. If the
|
|
behavior is `GLFW_ANY_RELEASE_BEHAVIOR`, the default behavior of the context
|
|
creation API will be used. If the behavior is `GLFW_RELEASE_BEHAVIOR_FLUSH`,
|
|
the pipeline will be flushed whenever the context is released from being the
|
|
current one. If the behavior is `GLFW_RELEASE_BEHAVIOR_NONE`, the pipeline will
|
|
not be flushed on release.
|
|
|
|
@par
|
|
Context release behaviors are described in detail by the
|
|
[GL_KHR_context_flush_control](https://www.opengl.org/registry/specs/KHR/context_flush_control.txt)
|
|
extension.
|
|
|
|
@anchor GLFW_CONTEXT_NO_ERROR_hint
|
|
__GLFW_CONTEXT_NO_ERROR__ specifies whether errors should be generated by the
|
|
context. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. If enabled,
|
|
situations that would have generated errors instead cause undefined behavior.
|
|
|
|
@par
|
|
The no error mode for OpenGL and OpenGL ES is described in detail by the
|
|
[GL_KHR_no_error](https://www.opengl.org/registry/specs/KHR/no_error.txt)
|
|
extension.
|
|
|
|
|
|
@subsubsection window_hints_osx macOS specific window hints
|
|
|
|
@anchor GLFW_COCOA_RETINA_FRAMEBUFFER_hint
|
|
__GLFW_COCOA_RETINA_FRAMEBUFFER__ specifies whether to use full resolution
|
|
framebuffers on Retina displays. Possible values are `GLFW_TRUE` and
|
|
`GLFW_FALSE`. This is ignored on other platforms.
|
|
|
|
@anchor GLFW_COCOA_FRAME_AUTOSAVE_hint
|
|
__GLFW_COCOA_FRAME_AUTOSAVE__ specifies whether to activate frame autosaving
|
|
using the window title specified at window creation. Possible values are
|
|
`GLFW_TRUE` and `GLFW_FALSE`. This is ignored on other platforms.
|
|
|
|
@anchor GLFW_COCOA_GRAPHICS_SWITCHING_hint
|
|
__GLFW_COCOA_GRAPHICS_SWITCHING__ specifies whether to in Automatic Graphics
|
|
Switching, i.e. to allow the system to choose the integrated GPU for the OpenGL
|
|
context and move it between GPUs if necessary or whether to force it to always
|
|
run on the discrete GPU. This only affects systems with both integrated and
|
|
discrete GPUs. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
|
ignored on other platforms.
|
|
|
|
@par
|
|
Simpler programs and tools may want to enable this to save power, while games
|
|
and other applications performing advanced rendering will want to leave it
|
|
disabled.
|
|
|
|
@par
|
|
A bundled application that wishes to participate in Automatic Graphics Switching
|
|
should also declare this in its `Info.plist` by setting the
|
|
`NSSupportsAutomaticGraphicsSwitching` key to `true`.
|
|
|
|
|
|
@subsubsection window_hints_values Supported and default values
|
|
|
|
Window hint | Default value | Supported values
|
|
----------------------------- | --------------------------- | ----------------
|
|
GLFW_RESIZABLE | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_VISIBLE | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_DECORATED | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_FOCUSED | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_AUTO_ICONIFY | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_FLOATING | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_MAXIMIZED | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_CENTER_CURSOR | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_TRANSPARENT_FRAMEBUFFER | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_RED_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_GREEN_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_BLUE_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_ALPHA_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_DEPTH_BITS | 24 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_STENCIL_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_ACCUM_RED_BITS | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_ACCUM_GREEN_BITS | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_ACCUM_BLUE_BITS | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_ACCUM_ALPHA_BITS | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_AUX_BUFFERS | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_SAMPLES | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_REFRESH_RATE | `GLFW_DONT_CARE` | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
|
GLFW_STEREO | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_SRGB_CAPABLE | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_DOUBLEBUFFER | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_CLIENT_API | `GLFW_OPENGL_API` | `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` or `GLFW_NO_API`
|
|
GLFW_CONTEXT_CREATION_API | `GLFW_NATIVE_CONTEXT_API` | `GLFW_NATIVE_CONTEXT_API`, `GLFW_EGL_CONTEXT_API` or `GLFW_OSMESA_CONTEXT_API`
|
|
GLFW_CONTEXT_RENDERER | `GLFW_HARDWARE_RENDERER` | `GLFW_HARDWARE_RENDERER` or `GLFW_SOFTWARE_RENDERER`
|
|
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_CONTEXT_RELEASE_BEHAVIOR | `GLFW_ANY_RELEASE_BEHAVIOR` | `GLFW_ANY_RELEASE_BEHAVIOR`, `GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`
|
|
GLFW_OPENGL_FORWARD_COMPAT | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_OPENGL_DEBUG_CONTEXT | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_OPENGL_PROFILE | `GLFW_OPENGL_ANY_PROFILE` | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`
|
|
GLFW_COCOA_RETINA_FRAMEBUFFER | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_COCOA_FRAME_AUTOSAVE | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
GLFW_COCOA_GRAPHICS_SWITCHING | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
|
|
|
|
@section window_events Window event processing
|
|
|
|
See @ref events.
|
|
|
|
|
|
@section window_properties Window properties and events
|
|
|
|
@subsection window_userptr 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 be modified by GLFW throughout
|
|
the life-time of the window.
|
|
|
|
The initial value of the pointer is `NULL`.
|
|
|
|
|
|
@subsection window_close Window closing and 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, set a close
|
|
callback.
|
|
|
|
@code
|
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
|
@endcode
|
|
|
|
The callback function is called directly _after_ the close flag has been set.
|
|
It 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, GLFW_FALSE);
|
|
}
|
|
@endcode
|
|
|
|
|
|
@subsection window_size Window size
|
|
|
|
The size of a window can be changed with @ref glfwSetWindowSize. For windowed
|
|
mode windows, this sets the size, in
|
|
[screen coordinates](@ref coordinate_systems) of the _client area_ or _content
|
|
area_ of the window. The window system may impose limits on window size.
|
|
|
|
@code
|
|
glfwSetWindowSize(window, 640, 480);
|
|
@endcode
|
|
|
|
For full screen windows, the specified size becomes the new resolution of the
|
|
window's desired video mode. The video mode most closely matching the new
|
|
desired video mode is set immediately. The window is resized to fit the
|
|
resolution of the set video mode.
|
|
|
|
If you wish to be notified when a window is resized, whether by the user, the
|
|
system or your own code, set a size callback.
|
|
|
|
@code
|
|
glfwSetWindowSizeCallback(window, window_size_callback);
|
|
@endcode
|
|
|
|
The callback function receives the new size, in screen coordinates, of the
|
|
client area of the window when the window is resized.
|
|
|
|
@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
|
|
|
|
@note Do not pass the window size to `glViewport` or other pixel-based OpenGL
|
|
calls. The window size is in screen coordinates, not pixels. Use the
|
|
[framebuffer size](@ref window_fbsize), which is in pixels, for pixel-based
|
|
calls.
|
|
|
|
The above functions work with the size of the client area, but decorated windows
|
|
typically have title bars and window frames around this rectangle. You can
|
|
retrieve the extents of these with @ref glfwGetWindowFrameSize.
|
|
|
|
@code
|
|
int left, top, right, bottom;
|
|
glfwGetWindowFrameSize(window, &left, &top, &right, &bottom);
|
|
@endcode
|
|
|
|
The returned values are the distances, in screen coordinates, from the edges of
|
|
the client area to the corresponding edges of the full window. As they are
|
|
distances and not coordinates, they are always zero or positive.
|
|
|
|
|
|
@subsection window_fbsize 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.
|
|
On some machines screen coordinates and pixels are the same, but on others they
|
|
will not be. 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, set a size callback.
|
|
|
|
@code
|
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
|
@endcode
|
|
|
|
The callback function receives the new size of the framebuffer when it is
|
|
resized, 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
|
|
|
|
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.
|
|
|
|
|
|
@subsection window_scale Window content scale
|
|
|
|
The content scale for a window can be retrieved with @ref
|
|
glfwGetWindowContentScale.
|
|
|
|
@code
|
|
float xscale, yscale;
|
|
glfwGetWindowContentScale(window, &xscale, &yscale);
|
|
@endcode
|
|
|
|
The content scale of a window is the ratio between the current DPI and the
|
|
platform's default DPI. If you scale all pixel dimensions by this scale then
|
|
your content should appear at an appropriate size. This is especially important
|
|
for text and any UI elements.
|
|
|
|
On systems where each monitors can have its own content scale, the window
|
|
content scale will depend on which monitor the system considers the window to be
|
|
on.
|
|
|
|
|
|
@subsection window_sizelimits Window size limits
|
|
|
|
The minimum and maximum size of the client area of a windowed mode window can be
|
|
enforced with @ref glfwSetWindowSizeLimits. The user may resize the window to
|
|
any size and aspect ratio within the specified limits, unless the aspect ratio
|
|
is also set.
|
|
|
|
@code
|
|
glfwSetWindowSizeLimits(window, 200, 200, 400, 400);
|
|
@endcode
|
|
|
|
To specify only a minimum size or only a maximum one, set the other pair to
|
|
`GLFW_DONT_CARE`.
|
|
|
|
@code
|
|
glfwSetWindowSizeLimits(window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);
|
|
@endcode
|
|
|
|
To disable size limits for a window, set them all to `GLFW_DONT_CARE`.
|
|
|
|
The aspect ratio of the client area of a windowed mode window can be enforced
|
|
with @ref glfwSetWindowAspectRatio. The user may resize the window freely
|
|
unless size limits are also set, but the size will be constrained to maintain
|
|
the aspect ratio.
|
|
|
|
@code
|
|
glfwSetWindowAspectRatio(window, 16, 9);
|
|
@endcode
|
|
|
|
The aspect ratio is specified as a numerator and denominator, corresponding to
|
|
the width and height, respectively. If you want a window to maintain its
|
|
current aspect ratio, use its current size as the ratio.
|
|
|
|
@code
|
|
int width, height;
|
|
glfwGetWindowSize(window, &width, &height);
|
|
glfwSetWindowAspectRatio(window, width, height);
|
|
@endcode
|
|
|
|
To disable the aspect ratio limit for a window, set both terms to
|
|
`GLFW_DONT_CARE`.
|
|
|
|
You can have both size limits and aspect ratio set for a window, but the results
|
|
are undefined if they conflict.
|
|
|
|
|
|
@subsection 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](@ref coordinate_systems).
|
|
The window system may put limitations on window placement.
|
|
|
|
@code
|
|
glfwSetWindowPos(window, 100, 100);
|
|
@endcode
|
|
|
|
If you wish to be notified when a window is moved, whether by the user, the
|
|
system or your own code, set a position callback.
|
|
|
|
@code
|
|
glfwSetWindowPosCallback(window, window_pos_callback);
|
|
@endcode
|
|
|
|
The callback function receives the new position, in screen coordinates, of the
|
|
upper-left corner of the client area when the window is moved.
|
|
|
|
@code
|
|
void window_pos_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
|
|
|
|
|
|
@subsection 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. You can
|
|
set a UTF-8 encoded window title with @ref glfwSetWindowTitle.
|
|
|
|
@code
|
|
glfwSetWindowTitle(window, "My Window");
|
|
@endcode
|
|
|
|
The specified string is copied before the function returns, so there is no need
|
|
to keep it around.
|
|
|
|
As long as your source file is encoded as UTF-8, you can use any Unicode
|
|
characters directly in the source.
|
|
|
|
@code
|
|
glfwSetWindowTitle(window, "ラストエグザイル");
|
|
@endcode
|
|
|
|
If you are using C++11 or C11, you can use a UTF-8 string literal.
|
|
|
|
@code
|
|
glfwSetWindowTitle(window, u8"This is always a UTF-8 string");
|
|
@endcode
|
|
|
|
|
|
@subsection window_icon Window icon
|
|
|
|
Decorated windows have icons on some platforms. You can set this icon by
|
|
specifying a list of candidate images with @ref glfwSetWindowIcon.
|
|
|
|
@code
|
|
GLFWimage images[2];
|
|
images[0] = load_icon("my_icon.png");
|
|
images[1] = load_icon("my_icon_small.png");
|
|
|
|
glfwSetWindowIcon(window, 2, images);
|
|
@endcode
|
|
|
|
The image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits
|
|
per channel with the red channel first. The pixels are arranged canonically as
|
|
sequential rows, starting from the top-left corner.
|
|
|
|
To revert to the default window icon, pass in an empty image array.
|
|
|
|
@code
|
|
glfwSetWindowIcon(window, 0, NULL);
|
|
@endcode
|
|
|
|
|
|
@subsection window_monitor Window monitor
|
|
|
|
Full screen windows are associated with a specific monitor. You can get the
|
|
handle for this monitor with @ref glfwGetWindowMonitor.
|
|
|
|
@code
|
|
GLFWmonitor* monitor = glfwGetWindowMonitor(window);
|
|
@endcode
|
|
|
|
This monitor handle is one of those returned by @ref glfwGetMonitors.
|
|
|
|
For windowed mode windows, this function returns `NULL`. This is how to tell
|
|
full screen windows from windowed mode windows.
|
|
|
|
You can move windows between monitors or between full screen and windowed mode
|
|
with @ref glfwSetWindowMonitor. When making a window full screen on the same or
|
|
on a different monitor, specify the desired monitor, resolution and refresh
|
|
rate. The position arguments are ignored.
|
|
|
|
@code
|
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
|
|
|
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
|
|
@endcode
|
|
|
|
When making the window windowed, specify the desired position and size. The
|
|
refresh rate argument is ignored.
|
|
|
|
@code
|
|
glfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0);
|
|
@endcode
|
|
|
|
This restores any previous window settings such as whether it is decorated,
|
|
floating, resizable, has size or aspect ratio limits, etc.. To restore a window
|
|
that was originally windowed to its original size and position, save these
|
|
before making it full screen and then pass them in as above.
|
|
|
|
|
|
@subsection window_iconify Window iconification
|
|
|
|
Windows can be iconified (i.e. minimized) with @ref glfwIconifyWindow.
|
|
|
|
@code
|
|
glfwIconifyWindow(window);
|
|
@endcode
|
|
|
|
When a full screen window is iconified, the original video mode of its monitor
|
|
is restored until the user or application restores the window.
|
|
|
|
Iconified windows can be restored with @ref glfwRestoreWindow. This function
|
|
also restores windows from maximization.
|
|
|
|
@code
|
|
glfwRestoreWindow(window);
|
|
@endcode
|
|
|
|
When a full screen window is restored, the desired video mode is restored to its
|
|
monitor as well.
|
|
|
|
If you wish to be notified when a window is iconified or restored, whether by
|
|
the user, system or your own code, set a iconify callback.
|
|
|
|
@code
|
|
glfwSetWindowIconifyCallback(window, window_iconify_callback);
|
|
@endcode
|
|
|
|
The callback function receives changes in the iconification state of the window.
|
|
|
|
@code
|
|
void window_iconify_callback(GLFWwindow* window, int iconified)
|
|
{
|
|
if (iconified)
|
|
{
|
|
// The window was iconified
|
|
}
|
|
else
|
|
{
|
|
// The window was restored
|
|
}
|
|
}
|
|
@endcode
|
|
|
|
You can also get the current iconification state with @ref glfwGetWindowAttrib.
|
|
|
|
@code
|
|
int iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED);
|
|
@endcode
|
|
|
|
|
|
@subsection window_maximize Window maximization
|
|
|
|
Windows can be maximized (i.e. zoomed) with @ref glfwMaximizeWindow.
|
|
|
|
@code
|
|
glfwMaximizeWindow(window);
|
|
@endcode
|
|
|
|
Full screen windows cannot be maximized and passing a full screen window to this
|
|
function does nothing.
|
|
|
|
Maximized windows can be restored with @ref glfwRestoreWindow. This function
|
|
also restores windows from iconification.
|
|
|
|
@code
|
|
glfwRestoreWindow(window);
|
|
@endcode
|
|
|
|
If you wish to be notified when a window is maximized or restored, whether by
|
|
the user, system or your own code, set a maximize callback.
|
|
|
|
@code
|
|
glfwSetWindowMaximizeCallback(window, window_maximize_callback);
|
|
@endcode
|
|
|
|
The callback function receives changes in the maximization state of the window.
|
|
|
|
@code
|
|
void window_maximize_callback(GLFWwindow* window, int maximized)
|
|
{
|
|
if (maximized)
|
|
{
|
|
// The window was maximized
|
|
}
|
|
else
|
|
{
|
|
// The window was restored
|
|
}
|
|
}
|
|
@endcode
|
|
|
|
You can also get the current maximization state with @ref glfwGetWindowAttrib.
|
|
|
|
@code
|
|
int maximized = glfwGetWindowAttrib(window, GLFW_MAXIMIZED);
|
|
@endcode
|
|
|
|
By default, newly created windows are not maximized. You can change this
|
|
behavior by setting the [GLFW_MAXIMIZED](@ref GLFW_MAXIMIZED_hint) window hint
|
|
before creating the window.
|
|
|
|
@code
|
|
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);
|
|
@endcode
|
|
|
|
|
|
@subsection window_hide Window visibility
|
|
|
|
Windowed mode windows can be hidden with @ref glfwHideWindow.
|
|
|
|
@code
|
|
glfwHideWindow(window);
|
|
@endcode
|
|
|
|
This makes the window completely invisible to the user, including removing it
|
|
from the task bar, dock or window list. Full screen windows cannot be hidden
|
|
and calling @ref glfwHideWindow on a full screen window does nothing.
|
|
|
|
Hidden windows can be shown with @ref glfwShowWindow.
|
|
|
|
@code
|
|
glfwShowWindow(window);
|
|
@endcode
|
|
|
|
|
|
You can also get the current visibility state with @ref glfwGetWindowAttrib.
|
|
|
|
@code
|
|
int visible = glfwGetWindowAttrib(window, GLFW_VISIBLE);
|
|
@endcode
|
|
|
|
By default, newly created windows are visible. You can change this behavior by
|
|
setting the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint before creating
|
|
the window.
|
|
|
|
@code
|
|
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
|
@endcode
|
|
|
|
Windows created hidden are completely invisible to the user until shown. This
|
|
can be useful if you need to set up your window further before showing it, for
|
|
example moving it to a specific location.
|
|
|
|
|
|
@subsection window_focus Window input focus
|
|
|
|
Windows can be given input focus and brought to the front with @ref
|
|
glfwFocusWindow.
|
|
|
|
@code
|
|
glfwFocusWindow(window);
|
|
@endcode
|
|
|
|
Keep in mind that it can be very disruptive to the user when a window is forced
|
|
to the top. For a less disruptive way of getting the user's attention, see
|
|
[attention requests](@ref window_attention).
|
|
|
|
If you wish to be notified when a window gains or loses input focus, whether by
|
|
the user, system or your own code, set a focus callback.
|
|
|
|
@code
|
|
glfwSetWindowFocusCallback(window, window_focus_callback);
|
|
@endcode
|
|
|
|
The callback function receives changes in the input focus state of the window.
|
|
|
|
@code
|
|
void window_focus_callback(GLFWwindow* window, int focused)
|
|
{
|
|
if (focused)
|
|
{
|
|
// The window gained input focus
|
|
}
|
|
else
|
|
{
|
|
// The window lost input focus
|
|
}
|
|
}
|
|
@endcode
|
|
|
|
You can also get the current input focus state with @ref glfwGetWindowAttrib.
|
|
|
|
@code
|
|
int focused = glfwGetWindowAttrib(window, GLFW_FOCUSED);
|
|
@endcode
|
|
|
|
By default, newly created windows are given input focus. You can change this
|
|
behavior by setting the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) window hint
|
|
before creating the window.
|
|
|
|
@code
|
|
glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE);
|
|
@endcode
|
|
|
|
|
|
@subsection window_attention Window attention request
|
|
|
|
If you wish to notify the user of an event without interrupting, you can request
|
|
attention with @ref glfwRequestWindowAttention.
|
|
|
|
@code
|
|
glfwRequestWindowAttention(window);
|
|
@endcode
|
|
|
|
The system will highlight the specified window, or on platforms where this is
|
|
not supported, the application as a whole. Once the user has given it
|
|
attention, the system will automatically end the request.
|
|
|
|
|
|
@subsection window_refresh Window damage and refresh
|
|
|
|
If you wish to be notified when the contents of a window is damaged and needs
|
|
to be refreshed, set a window refresh callback.
|
|
|
|
@code
|
|
glfwSetWindowRefreshCallback(m_handle, window_refresh_callback);
|
|
@endcode
|
|
|
|
The callback function is called when the contents of the window needs to be
|
|
refreshed.
|
|
|
|
@code
|
|
void window_refresh_callback(GLFWwindow* window)
|
|
{
|
|
draw_editor_ui(window);
|
|
glfwSwapBuffers(window);
|
|
}
|
|
@endcode
|
|
|
|
@note On compositing window systems such as Aero, Compiz or Aqua, where the
|
|
window contents are saved off-screen, this callback might only be called when
|
|
the window or framebuffer is resized.
|
|
|
|
|
|
@subsection window_transparency Window transparency
|
|
|
|
GLFW supports two kinds of transparency for windows; framebuffer transparency
|
|
and whole window transparency. A single window may not use both methods. The
|
|
results of doing this are undefined.
|
|
|
|
Both methods require the platform to support it and not every version of every
|
|
platform GLFW supports does this, so there are mechanisms to check whether the
|
|
window really is transparent.
|
|
|
|
Window framebuffers can be made transparent on a per-pixel per-frame basis with
|
|
the [GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint)
|
|
window hint.
|
|
|
|
@code
|
|
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
|
|
@endcode
|
|
|
|
If supported by the system, the window content area will be composited with the
|
|
background using the framebuffer per-pixel alpha channel. This requires desktop
|
|
compositing to be enabled on the system. It does not affect window decorations.
|
|
|
|
You can check whether the window framebuffer was successfully made transparent
|
|
with the
|
|
[GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib)
|
|
window attribute.
|
|
|
|
@code
|
|
if (glfwGetWindowAttrib(window, GLFW_TRANSPARENT_FRAMEBUFFER))
|
|
{
|
|
// window framebuffer is currently transparent
|
|
}
|
|
@endcode
|
|
|
|
GLFW comes with an example that enabled framebuffer transparency called `gears`.
|
|
|
|
The opacity of the whole window, including any decorations, can be set with @ref
|
|
glfwSetWindowOpacity.
|
|
|
|
@code
|
|
glfwSetWindowOpacity(window, 0.5f);
|
|
@endcode
|
|
|
|
The opacity (or alpha) value is a positive finite number between zero and one,
|
|
where 0 (zero) is fully transparent and 1 (one) is fully opaque. The initial
|
|
opacity value for newly created windows is 1.
|
|
|
|
The current opacity of a window can be queried with @ref glfwGetWindowOpacity.
|
|
|
|
@code
|
|
float opacity = glfwGetWindowOpacity(window);
|
|
@endcode
|
|
|
|
If the system does not support whole window transparency, this function always
|
|
returns one.
|
|
|
|
GLFW comes with a test program that lets you control whole window transparency
|
|
at run-time called `opacity`.
|
|
|
|
|
|
@subsection window_attribs Window attributes
|
|
|
|
Windows have a number of attributes that can be returned using @ref
|
|
glfwGetWindowAttrib. Some reflect state that may change as a result of user
|
|
interaction, (e.g. whether it has input focus), while others reflect inherent
|
|
properties of the window (e.g. what kind of border it has). Some are related to
|
|
the window and others to its OpenGL or OpenGL ES context.
|
|
|
|
@code
|
|
if (glfwGetWindowAttrib(window, GLFW_FOCUSED))
|
|
{
|
|
// window has input focus
|
|
}
|
|
@endcode
|
|
|
|
The [GLFW_DECORATED](@ref GLFW_DECORATED_attrib),
|
|
[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib),
|
|
[GLFW_FLOATING](@ref GLFW_FLOATING_attrib) and
|
|
[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) window attributes can be
|
|
changed with @ref glfwSetWindowAttrib.
|
|
|
|
@code
|
|
glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE);
|
|
@endcode
|
|
|
|
|
|
|
|
@subsubsection window_attribs_wnd Window related attributes
|
|
|
|
@anchor GLFW_FOCUSED_attrib
|
|
__GLFW_FOCUSED__ indicates whether the specified window has input focus. See
|
|
@ref window_focus for details.
|
|
|
|
@anchor GLFW_ICONIFIED_attrib
|
|
__GLFW_ICONIFIED__ indicates whether the specified window is iconified.
|
|
See @ref window_iconify for details.
|
|
|
|
@anchor GLFW_MAXIMIZED_attrib
|
|
__GLFW_MAXIMIZED__ indicates whether the specified window is maximized. See
|
|
@ref window_maximize for details.
|
|
|
|
@anchor GLFW_VISIBLE_attrib
|
|
__GLFW_VISIBLE__ indicates whether the specified window is visible. See @ref
|
|
window_hide for details.
|
|
|
|
@anchor GLFW_RESIZABLE_attrib
|
|
__GLFW_RESIZABLE__ indicates whether the specified window is resizable _by the
|
|
user_. This can be set before creation with the
|
|
[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_hint) window hint or after with @ref
|
|
glfwSetWindowAttrib.
|
|
|
|
@anchor GLFW_DECORATED_attrib
|
|
__GLFW_DECORATED__ indicates whether the specified window has decorations such
|
|
as a border, a close widget, etc. This can be set before creation with the
|
|
[GLFW_DECORATED](@ref GLFW_DECORATED_hint) window hint or after with @ref
|
|
glfwSetWindowAttrib.
|
|
|
|
@anchor GLFW_AUTO_ICONIFY_attrib
|
|
__GLFW_AUTO_ICONIFY__ indicates whether the specified full screen window is
|
|
iconified on focus loss, a close widget, etc. This can be set before creation
|
|
with the [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint or after
|
|
with @ref glfwSetWindowAttrib.
|
|
|
|
@anchor GLFW_FLOATING_attrib
|
|
__GLFW_FLOATING__ indicates whether the specified window is floating, also
|
|
called topmost or always-on-top. This can be set before creation with the
|
|
[GLFW_FLOATING](@ref GLFW_FLOATING_hint) window hint or after with @ref
|
|
glfwSetWindowAttrib.
|
|
|
|
@anchor GLFW_TRANSPARENT_FRAMEBUFFER_attrib
|
|
__GLFW_TRANSPARENT_FRAMEBUFFER__ indicates whether the specified window has
|
|
a transparent framebuffer, i.e. the window contents is composited with the
|
|
background using the window framebuffer alpha channel. See @ref
|
|
window_transparency for details.
|
|
|
|
|
|
@subsubsection window_attribs_ctx Context related attributes
|
|
|
|
@anchor GLFW_CLIENT_API_attrib
|
|
__GLFW_CLIENT_API__ indicates the client API provided by the window's context;
|
|
either `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` or `GLFW_NO_API`.
|
|
|
|
@anchor GLFW_CONTEXT_CREATION_API_attrib
|
|
__GLFW_CONTEXT_CREATION_API__ indicates the context creation API used to create
|
|
the window's context; either `GLFW_NATIVE_CONTEXT_API`, `GLFW_EGL_CONTEXT_API`
|
|
or `GLFW_OSMESA_CONTEXT_API`.
|
|
|
|
@anchor GLFW_CONTEXT_VERSION_MAJOR_attrib
|
|
@anchor GLFW_CONTEXT_VERSION_MINOR_attrib
|
|
@anchor GLFW_CONTEXT_REVISION_attrib
|
|
__GLFW_CONTEXT_VERSION_MAJOR__, __GLFW_CONTEXT_VERSION_MINOR__ and
|
|
__GLFW_CONTEXT_REVISION__ indicate the client API version of the window's
|
|
context.
|
|
|
|
@note Do not confuse these attributes with `GLFW_VERSION_MAJOR`,
|
|
`GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` which provide the API version
|
|
of the GLFW header.
|
|
|
|
@anchor GLFW_OPENGL_FORWARD_COMPAT_attrib
|
|
__GLFW_OPENGL_FORWARD_COMPAT__ is `GLFW_TRUE` if the window's context is an
|
|
OpenGL forward-compatible one, or `GLFW_FALSE` otherwise.
|
|
|
|
@anchor GLFW_OPENGL_DEBUG_CONTEXT_attrib
|
|
__GLFW_OPENGL_DEBUG_CONTEXT__ is `GLFW_TRUE` if the window's context is an
|
|
OpenGL debug context, or `GLFW_FALSE` otherwise.
|
|
|
|
@anchor GLFW_OPENGL_PROFILE_attrib
|
|
__GLFW_OPENGL_PROFILE__ 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 an OpenGL ES context. 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.
|
|
|
|
@anchor GLFW_CONTEXT_ROBUSTNESS_attrib
|
|
__GLFW_CONTEXT_ROBUSTNESS__ 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.
|
|
|
|
|
|
@subsubsection window_attribs_fb Framebuffer related attributes
|
|
|
|
GLFW does not expose attributes of the default framebuffer (i.e. the framebuffer
|
|
attached to the window) as these can be queried directly with either OpenGL,
|
|
OpenGL ES or Vulkan.
|
|
|
|
If you are using version 3.0 or later of OpenGL or OpenGL ES, the
|
|
`glGetFramebufferAttachmentParameteriv` function can be used to retrieve the
|
|
number of bits for the red, green, blue, alpha, depth and stencil buffer
|
|
channels. Otherwise, the `glGetIntegerv` function can be used.
|
|
|
|
The number of MSAA samples are always retrieved with `glGetIntegerv`. For
|
|
contexts supporting framebuffer objects, the number of samples of the currently
|
|
bound framebuffer is returned.
|
|
|
|
Attribute | glGetIntegerv | glGetFramebufferAttachmentParameteriv
|
|
------------ | ----------------- | -------------------------------------
|
|
Red bits | `GL_RED_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE`
|
|
Green bits | `GL_GREEN_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE`
|
|
Blue bits | `GL_BLUE_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE`
|
|
Alpha bits | `GL_ALPHA_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE`
|
|
Depth bits | `GL_DEPTH_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE`
|
|
Stencil bits | `GL_STENCIL_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE`
|
|
MSAA samples | `GL_SAMPLES` | _Not provided by this function_
|
|
|
|
When calling `glGetFramebufferAttachmentParameteriv`, the red, green, blue and
|
|
alpha sizes are queried from the `GL_BACK_LEFT`, while the depth and stencil
|
|
sizes are queried from the `GL_DEPTH` and `GL_STENCIL` attachments,
|
|
respectively.
|
|
|
|
|
|
@section buffer_swap Buffer swapping
|
|
|
|
GLFW windows are by default 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 wait should from the time @ref glfwSwapBuffers was
|
|
called 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.
|
|
|
|
A context that supports either the `WGL_EXT_swap_control_tear` or the
|
|
`GLX_EXT_swap_control_tear` extension also accepts _negative_ swap intervals,
|
|
which allows the driver to swap immediately even if a frame arrives a little bit
|
|
late. This trades the risk of visible tears for greater framerate stability.
|
|
You can check for these extensions with @ref glfwExtensionSupported.
|
|
|
|
*/
|