/*!

@page quick Getting started

@tableofcontents

This guide will show how to write simple OpenGL applications using GLFW 3.  It
will introduce a few of the most commonly used functions, but there are many
others.  To see detailed documentation on any GLFW function, just click on its
name.

This guide assumes no experience with earlier versions of GLFW.  If you
have used GLFW 2.x in the past, you should also read the
[transition guide](@ref moving).


@section quick_include Including the GLFW header

In the files of your program where you use OpenGL or GLFW, you need to include
the GLFW 3 header file.

@code
#include <GLFW/glfw3.h>
@endcode

This defines all the constants, types and function prototypes of the GLFW API.
It also includes the OpenGL header, and defines all the constants and types
necessary for it to work on your platform.

For example, under Windows you are normally required to include `windows.h`
before including `GL/gl.h`.  This would make your source file tied to Windows
and pollute your code's namespace with the whole Win32 API.

Instead, the GLFW header takes care of this for you, not by including
`windows.h`, but rather by itself duplicating only the necessary parts of it.
It does this only where needed, so if `windows.h` *is* included, the GLFW header
does not try to redefine those symbols.

In other words:

- Do *not* include the OpenGL headers yourself, as GLFW does this for you
- Do *not* include `windows.h` or other platform-specific headers unless
  you plan on using those APIs directly
- If you *do* need to include such headers, do it *before* including the
  GLFW one and it will detect this

Starting with version 3.0, the GLU header `glu.h` is no longer included by
default.  If you wish to include it, define `GLFW_INCLUDE_GLU` before the
inclusion of the GLFW header.

@code
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
@endcode


@section quick_init_term Initializing and terminating GLFW

Before you can use most GLFW functions, the library must be initialized.  This
is done with @ref glfwInit, which returns non-zero if successful, or zero if an
error occurred.

@code
if (!glfwInit())
    exit(EXIT_FAILURE);
@endcode

When you are done using GLFW, typically at the very end of the program, you need
to call @ref glfwTerminate.

@code
glfwTerminate();
@endcode

This destroys any remaining windows and releases any other resources allocated by
GLFW.  After this call, you must call @ref glfwInit again before using any GLFW
functions that require it.


@section quick_capture_error Setting an error callback

Most events are reported through callbacks, whether it's a key being pressed,
a GLFW window being moved, or an error occurring.  Callbacks are simply
C functions (or C++ static methods) that are called by GLFW with arguments
describing the event.

In case @ref glfwInit or any other GLFW function fails, an error is reported to
the GLFW error callback.  You can receive these reports by setting the error
callback.  The callback function itself should match the signature of @ref
GLFWerrorfun.  Here is a simple error callback that just prints the error
description to `stderr`.

@code
void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}
@endcode

Setting the callback, so GLFW knows to call it, is done with @ref
glfwSetErrorCallback.  This is one of the few GLFW functions that may be called
before @ref glfwInit, which lets you be notified of errors during
initialization, so you should set it before you do anything else with GLFW.

@code
glfwSetErrorCallback(error_callback);
@endcode


@section quick_create_window Creating a window and context

The window (and its context) is created with @ref glfwCreateWindow, which
returns a handle to the created window.  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.

@code
if (!window)
{
    glfwTerminate();
    exit(EXIT_FAILURE);
}
@endcode

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.  You
can get this with @ref glfwGetPrimaryMonitor.  To make the above window
full screen, just pass along the monitor handle:

@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.

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 quick_context_current Making the OpenGL context current

Before you can use the OpenGL API, it must have a current OpenGL context.  You
make a window's context current with @ref glfwMakeContextCurrent.  It will then
remain as the current context until you make another context current or until
the window owning it is destroyed.

@code
glfwMakeContextCurrent(window);
@endcode


@section quick_window_close Checking the window close flag

Each window has a flag indicating whether the window should be closed.  This can
be checked with @ref glfwWindowShouldClose.  

When the user attempts to close the window, either by pressing the close widget
in the title bar or using a key combination like Alt+F4, this flag is set to 1.
Note that **the window isn't actually closed**, so you are expected to monitor
this flag and either destroy the window or give some kind of feedback to the
user.

@code
while (!glfwWindowShouldClose(window))
{
    // Keep running
}
@endcode

You can be notified when user is attempting to close the window by setting
a close callback with @ref glfwSetWindowCloseCallback.  The callback will be
called immediately after the close flag has been set.

You can also set it yourself with @ref glfwSetWindowShouldClose.  This can be
useful if you want to interpret other kinds of input as closing the window, like
for example pressing the escape key.


@section quick_key_input Receiving input events

Each window has a large number of callbacks that can be set to receive all the
various kinds of events.  To receive key press and release events, a
[key callback](@ref GLFWkeyfun) is set using @ref glfwSetKeyCallback.

@code
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
@endcode

For event callbacks to actually be called when an event occurs, you need to
process events as described below.


@section quick_render Rendering with OpenGL

Once you have a current OpenGL context, you can use OpenGL normally.  In this
tutorial, a multi-colored rotating triangle will be rendered.  The framebuffer
size, needed by this example for `glViewport` and `glOrtho`, is retrieved with
@ref glfwGetFramebufferSize.

@code
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
@endcode

However, you can also set a framebuffer size callback using @ref
glfwSetFramebufferSizeCallback and call `glViewport` from there.

@code
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
@endcode


@section quick_timer Reading the timer

For the triangle to rotate properly, a time source is needed.  GLFW provides
@ref glfwGetTime, which returns the number of seconds since @ref glfwInit as
a `double`.  The time source used is the most accurate on each platform and
generally has micro- or nanosecond resolution.

@code
double time = glfwGetTime();
@endcode


@section quick_swap_buffers Swapping buffers

GLFW windows always use double-buffering.  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 the rendered frame, and begin rendering a new
frame.  This is done with @ref glfwSwapBuffers.

@code
glfwSwapBuffers(window);
@endcode


@section quick_process_events Processing events

GLFW needs to communicate regularly with the window system both in order to
receive events and to show that it hasn't locked up.  Event processing must be
done regularly and is normally done each frame before rendering but after buffer
swap.

There are two ways to process pending events.  @ref glfwPollEvents processes
only those events that have already been received and then returns immediately.
This is the best choice when rendering continually, like most games do.

@code
glfwPollEvents();
@endcode

If instead you only need to update your rendering once you have received new
input, @ref glfwWaitEvents is a better choice.  It waits until at least one
event has been received, putting the thread to sleep in the meantime, and then
processes all received events just like @ref glfwPollEvents does.  This saves
a great deal of CPU cycles and is useful for, for example, many kinds of editing
tools.

@code
glfwWaitEvents();
@endcode


@section quick_example Putting it together: A small GLFW application

Now that you know how to initialize GLFW, create a window and poll for
keyboard input, it's possible to create a simple program.

@snippet simple.c code

This program creates a 640 by 480 windowed mode window and runs a loop clearing
the screen, rendering a triangle and processing events until the user closes the
window.  It can be found in the source distribution as `examples/simple.c`, and
is by default compiled along with all other examples when you build GLFW.

*/
