/*! @page monitor Monitor guide @tableofcontents This guide introduces the monitor related functions of GLFW. There are also guides for the other areas of GLFW. - @ref intro - @ref window - @ref context - @ref input @section monitor_object Monitor objects A monitor object represents a currently connected monitor and is represented as a pointer to the [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWmonitor. Monitor objects cannot be created or destroyed by the application and retain their addresses until the monitors they represent are disconnected or until the library is [terminated](@ref intro_init_terminate). Each monitor has a current video mode, a list of supported video modes, a virtual position, a human-readable name, an estimated physical size and a gamma ramp. One of the monitors is the primary monitor. The virtual position of a monitor is in [screen coordinates](@ref coordinate_systems) and, together with the current video mode, describes the viewports that the connected monitors provide into the virtual desktop that spans them. To see how GLFW views your monitor setup and its available video modes, run the `modes` test program. @subsection monitor_monitors Retrieving monitors The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is the user's preferred monitor and is usually the one with global UI elements like task bar or menu bar. @code GLFWmonitor* primary = glfwGetPrimaryMonitor(); @endcode You can retrieve all currently connected monitors with @ref glfwGetMonitors. See the reference documentation for the lifetime of the returned array. @code int count; GLFWmonitor** monitors = glfwGetMonitors(&count); @endcode The primary monitor is always the first monitor in the returned array, but other monitors may be moved to a different index when a monitor is connected or disconnected. @subsection monitor_event Monitor configuration changes If you wish to be notified when a monitor is connected or disconnected, set a monitor callback. @code glfwSetMonitorCallback(monitor_callback); @endcode The callback function receives the handle for the monitor that has been connected or disconnected and a monitor action. @code void monitor_callback(GLFWmonitor* monitor, int event) { } @endcode The action is one of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. @section monitor_properties Monitor properties Each monitor has a current video mode, a list of supported video modes, a virtual position, a human-readable name, an estimated physical size and a gamma ramp. @subsection monitor_modes Video modes GLFW generally does a good job selecting a suitable video mode when you create a full screen window, but it is sometimes useful to know exactly which video modes are supported. Video modes are represented as @ref GLFWvidmode structures. You can get an array of the video modes supported by a monitor with @ref glfwGetVideoModes. See the reference documentation for the lifetime of the returned array. @code int count; GLFWvidmode* modes = glfwGetVideoModes(monitor, &count); @endcode To get the current video mode of a monitor call @ref glfwGetVideoMode. See the reference documentation for the lifetime of the returned pointer. @code const GLFWvidmode* mode = glfwGetVideoMode(monitor); @endcode The resolution of a video mode is specified in [screen coordinates](@ref coordinate_systems), not pixels. @subsection monitor_size Physical size The physical size of a monitor in millimetres, or an estimation of it, can be retrieved with @ref glfwGetMonitorPhysicalSize. This has no relation to its current _resolution_, i.e. the width and height of its current [video mode](@ref monitor_modes). @code int widthMM, heightMM; glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM); @endcode This can, for example, be used together with the current video mode to calculate the DPI of a monitor. @code const double dpi = mode->width / (widthMM / 25.4); @endcode @subsection monitor_pos Virtual position The position of the monitor on the virtual desktop, in [screen coordinates](@ref coordinate_systems), can be retrieved with @ref glfwGetMonitorPos. @code int xpos, ypos; glfwGetMonitorPos(monitor, &xpos, &ypos); @endcode @subsection monitor_name Human-readable name The human-readable, UTF-8 encoded name of a monitor is returned by @ref glfwGetMonitorName. See the reference documentation for the lifetime of the returned string. @code const char* name = glfwGetMonitorName(monitor); @endcode Monitor names are not guaranteed to be unique. Two monitors of the same model and make may have the same name. Only the monitor handle is guaranteed to be unique, and only until that monitor is disconnected. @subsection monitor_gamma Gamma ramp The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts a monitor handle and a pointer to a @ref GLFWgammaramp structure. @code GLFWgammaramp ramp; unsigned short red[256], green[256], blue[256]; ramp.size = 256; ramp.red = red; ramp.green = green; ramp.blue = blue; for (i = 0; i < ramp.size; i++) { // Fill out gamma ramp arrays as desired } glfwSetGammaRamp(monitor, &ramp); @endcode The gamma ramp data is copied before the function returns, so there is no need to keep it around once the ramp has been set. @note It is recommended to use gamma ramps of size 256, as that is the size supported by all graphics cards on all platforms. The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See the reference documentation for the lifetime of the returned structure. @code const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor); @endcode If you wish to set a regular gamma ramp, you can have GLFW calculate it for you from the desired exponent with @ref glfwSetGamma, which in turn calls @ref glfwSetGammaRamp with the resulting ramp. @code glfwSetGamma(monitor, 1.0); @endcode */