zig-glfw/src/input.zig
Stephen Gutekanst 7ba458d25b glfw: add TODOs for tracking 100% GLFW API coverage
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2021-10-16 18:39:57 -07:00

1263 lines
52 KiB
Zig

// TODO(input):
// /// Opaque cursor object.
// ///
// /// Opaque cursor object.
// ///
// /// see also: cursor_object
// ///
// ///
// /// @ingroup input
// typedef struct GLFWcursor GLFWcursor;
// /// The function pointer type for mouse button callbacks.
// ///
// /// This is the function pointer type for mouse button callback functions.
// /// A mouse button callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, int button, int action, int mods)
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] button The mouse button that was pressed or
// /// released.
// /// @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases
// /// may add more actions.
// /// @param[in] mods Bit field describing which [modifier keys](@ref mods) were
// /// held down.
// ///
// /// see also: input_mouse_button, glfwSetMouseButtonCallback
// ///
// /// @glfw3 Added window handle and modifier mask parameters.
// ///
// /// @ingroup input
// typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
// /// The function pointer type for cursor position callbacks.
// ///
// /// This is the function pointer type for cursor position callbacks. A cursor
// /// position callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, double xpos, double ypos);
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] xpos The new cursor x-coordinate, relative to the left edge of
// /// the content area.
// /// @param[in] ypos The new cursor y-coordinate, relative to the top edge of the
// /// content area.
// ///
// /// see also: cursor_pos, glfw.setCursorPosCallback
// /// Replaces `GLFWmouseposfun`.
// ///
// /// @ingroup input
// typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
// /// The function pointer type for cursor enter/leave callbacks.
// ///
// /// This is the function pointer type for cursor enter/leave callbacks.
// /// A cursor enter/leave callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, int entered)
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] entered `GLFW_TRUE` if the cursor entered the window's content
// /// area, or `GLFW_FALSE` if it left it.
// ///
// /// see also: cursor_enter, glfwSetCursorEnterCallback
// ///
// ///
// /// @ingroup input
// typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
// /// The function pointer type for scroll callbacks.
// ///
// /// This is the function pointer type for scroll callbacks. A scroll callback
// /// function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, double xoffset, double yoffset)
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] xoffset The scroll offset along the x-axis.
// /// @param[in] yoffset The scroll offset along the y-axis.
// ///
// /// see also: scrolling, glfwSetScrollCallback
// /// Replaces `GLFWmousewheelfun`.
// ///
// /// @ingroup input
// typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
// /// The function pointer type for keyboard key callbacks.
// ///
// /// This is the function pointer type for keyboard key callbacks. A keyboard
// /// key callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, int key, int scancode, int action, int mods)
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] key The [keyboard key](@ref keys) that was pressed or released.
// /// @param[in] scancode The system-specific scancode of the key.
// /// @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future
// /// releases may add more actions.
// /// @param[in] mods Bit field describing which [modifier keys](@ref mods) were
// /// held down.
// ///
// /// see also: input_key, glfwSetKeyCallback
// ///
// /// @glfw3 Added window handle, scancode and modifier mask parameters.
// ///
// /// @ingroup input
// typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
// /// The function pointer type for Unicode character callbacks.
// ///
// /// This is the function pointer type for Unicode character callbacks.
// /// A Unicode character callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, unsigned int codepoint)
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] codepoint The Unicode code point of the character.
// ///
// /// see also: input_char, glfwSetCharCallback
// ///
// /// @glfw3 Added window handle parameter.
// ///
// /// @ingroup input
// typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
// /// The function pointer type for path drop callbacks.
// ///
// /// This is the function pointer type for path drop callbacks. A path drop
// /// callback function has the following signature:
// /// @code
// /// void function_name(GLFWwindow* window, int path_count, const char* paths[])
// /// @endcode
// ///
// /// @param[in] window The window that received the event.
// /// @param[in] path_count The number of dropped paths.
// /// @param[in] paths The UTF-8 encoded file and/or directory path names.
// ///
// /// @pointer_lifetime The path array and its strings are valid until the
// /// callback function returns.
// ///
// /// see also: path_drop, glfwSetDropCallback
// ///
// ///
// /// @ingroup input
// typedef void (* GLFWdropfun)(GLFWwindow*,int,const char*[]);
// /// The function pointer type for joystick configuration callbacks.
// ///
// /// This is the function pointer type for joystick configuration callbacks.
// /// A joystick configuration callback function has the following signature:
// /// @code
// /// void function_name(int jid, int event)
// /// @endcode
// ///
// /// @param[in] jid The joystick that was connected or disconnected.
// /// @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future
// /// releases may add more events.
// ///
// /// see also: joystick_event, glfwSetJoystickCallback
// ///
// ///
// /// @ingroup input
// typedef void (* GLFWjoystickfun)(int,int);
// /// Gamepad input state
// ///
// /// This describes the input state of a gamepad.
// ///
// /// see also: gamepad, glfwGetGamepadState
// ///
// ///
// /// @ingroup input
// typedef struct GLFWgamepadstate
// {
// /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS`
// /// or `GLFW_RELEASE`.
// unsigned char buttons[15];
// /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0
// /// to 1.0 inclusive.
// float axes[6];
// } GLFWgamepadstate;
// /// Returns the value of an input option for the specified window.
// ///
// /// This function returns the value of an input option for the specified window.
// /// The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
// /// @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or
// /// @ref GLFW_RAW_MOUSE_MOTION.
// ///
// /// @param[in] window The window to query.
// /// @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
// /// `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
// /// `GLFW_RAW_MOUSE_MOTION`.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidEnum.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: glfw.setInputMode
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
// /// Sets an input option for the specified window.
// ///
// /// This function sets an input mode option for the specified window. The mode
// /// must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
// /// @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or
// /// @ref GLFW_RAW_MOUSE_MOTION.
// ///
// /// If the mode is `GLFW_CURSOR`, the value must be one of the following cursor
// /// modes:
// /// - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally.
// /// - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the
// /// content area of the window but does not restrict the cursor from leaving.
// /// - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual
// /// and unlimited cursor movement. This is useful for implementing for
// /// example 3D camera controls.
// ///
// /// If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to
// /// enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are
// /// enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS`
// /// the next time it is called even if the key had been released before the
// /// call. This is useful when you are only interested in whether keys have been
// /// pressed but not when or in which order.
// ///
// /// If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either
// /// `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it.
// /// If sticky mouse buttons are enabled, a mouse button press will ensure that
// /// @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even
// /// if the mouse button had been released before the call. This is useful when
// /// you are only interested in whether mouse buttons have been pressed but not
// /// when or in which order.
// ///
// /// If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to
// /// enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled,
// /// callbacks that receive modifier bits will also have the @ref
// /// GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on,
// /// and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on.
// ///
// /// If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE`
// /// to enable raw (unscaled and unaccelerated) mouse motion when the cursor is
// /// disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported,
// /// attempting to set this will emit glfw.Error.PlatformError. Call @ref
// /// glfwRawMouseMotionSupported to check for support.
// ///
// /// @param[in] window The window whose input mode to set.
// /// @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
// /// `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
// /// `GLFW_RAW_MOUSE_MOTION`.
// /// @param[in] value The new value of the specified input mode.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: glfw.getInputMode
// /// Replaces `glfwEnable` and `glfwDisable`.
// ///
// /// @ingroup input
// GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);
// /// Returns whether raw mouse motion is supported.
// ///
// /// This function returns whether raw mouse motion is supported on the current
// /// system. This status does not change after GLFW has been initialized so you
// /// only need to check this once. If you attempt to enable raw motion on
// /// a system that does not support it, glfw.Error.PlatformError will be emitted.
// ///
// /// Raw mouse motion is closer to the actual motion of the mouse across
// /// a surface. It is not affected by the scaling and acceleration applied to
// /// the motion of the desktop cursor. That processing is suitable for a cursor
// /// while raw motion is better for controlling for example a 3D camera. Because
// /// of this, raw mouse motion is only provided when the cursor is disabled.
// ///
// /// @return `GLFW_TRUE` if raw mouse motion is supported on the current machine,
// /// or `GLFW_FALSE` otherwise.
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: raw_mouse_motion, glfw.setInputMode
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwRawMouseMotionSupported(void);
// /// Returns the layout-specific name of the specified printable key.
// ///
// /// This function returns the name of the specified printable key, encoded as
// /// UTF-8. This is typically the character that key would produce without any
// /// modifier keys, intended for displaying key bindings to the user. For dead
// /// keys, it is typically the diacritic it would add to a character.
// ///
// /// __Do not use this function__ for [text input](@ref input_char). You will
// /// break text input for many languages even if it happens to work for yours.
// ///
// /// If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key,
// /// otherwise the scancode is ignored. If you specify a non-printable key, or
// /// `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this
// /// function returns null but does not emit an error.
// ///
// /// This behavior allows you to always pass in the arguments in the
// /// [key callback](@ref input_key) without modification.
// ///
// /// The printable keys are:
// /// - `GLFW_KEY_APOSTROPHE`
// /// - `GLFW_KEY_COMMA`
// /// - `GLFW_KEY_MINUS`
// /// - `GLFW_KEY_PERIOD`
// /// - `GLFW_KEY_SLASH`
// /// - `GLFW_KEY_SEMICOLON`
// /// - `GLFW_KEY_EQUAL`
// /// - `GLFW_KEY_LEFT_BRACKET`
// /// - `GLFW_KEY_RIGHT_BRACKET`
// /// - `GLFW_KEY_BACKSLASH`
// /// - `GLFW_KEY_WORLD_1`
// /// - `GLFW_KEY_WORLD_2`
// /// - `GLFW_KEY_0` to `GLFW_KEY_9`
// /// - `GLFW_KEY_A` to `GLFW_KEY_Z`
// /// - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9`
// /// - `GLFW_KEY_KP_DECIMAL`
// /// - `GLFW_KEY_KP_DIVIDE`
// /// - `GLFW_KEY_KP_MULTIPLY`
// /// - `GLFW_KEY_KP_SUBTRACT`
// /// - `GLFW_KEY_KP_ADD`
// /// - `GLFW_KEY_KP_EQUAL`
// ///
// /// Names for printable keys depend on keyboard layout, while names for
// /// non-printable keys are the same across layouts but depend on the application
// /// language and should be localized along with other user interface text.
// ///
// /// @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`.
// /// @param[in] scancode The scancode of the key to query.
// /// @return The UTF-8 encoded, layout-specific name of the key, or null.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// The contents of the returned string may change when a keyboard
// /// layout change event is received.
// ///
// /// @pointer_lifetime The returned string is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_key_name
// ///
// ///
// /// @ingroup input
// GLFWAPI const char* glfwGetKeyName(int key, int scancode);
// /// Returns the platform-specific scancode of the specified key.
// ///
// /// This function returns the platform-specific scancode of the specified key.
// ///
// /// If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this
// /// method will return `-1`.
// ///
// /// @param[in] key Any [named key](@ref keys).
// /// @return The platform-specific scancode for the key, or `-1` if an
// /// error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function may be called from any thread.
// ///
// /// see also: input_key
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwGetKeyScancode(int key);
// /// Returns the last reported state of a keyboard key for the specified
// /// window.
// ///
// /// This function returns the last state reported for the specified key to the
// /// specified window. The returned state is one of `GLFW_PRESS` or
// /// `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to
// /// the key callback.
// ///
// /// If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns
// /// `GLFW_PRESS` the first time you call it for a key that was pressed, even if
// /// that key has already been released.
// ///
// /// The key functions deal with physical keys, with [key tokens](@ref keys)
// /// named after their use on the standard US keyboard layout. If you want to
// /// input text, use the Unicode character callback instead.
// ///
// /// The [modifier key bit masks](@ref mods) are not key tokens and cannot be
// /// used with this function.
// ///
// /// __Do not use this function__ to implement [text input](@ref input_char).
// ///
// /// @param[in] window The desired window.
// /// @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is
// /// not a valid key for this function.
// /// @return One of `GLFW_PRESS` or `GLFW_RELEASE`.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidEnum.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_key
// ///
// /// @glfw3 Added window handle parameter.
// ///
// /// @ingroup input
// GLFWAPI int glfwGetKey(GLFWwindow* window, int key);
// /// Returns the last reported state of a mouse button for the specified
// /// window.
// ///
// /// This function returns the last state reported for the specified mouse button
// /// to the specified window. The returned state is one of `GLFW_PRESS` or
// /// `GLFW_RELEASE`.
// ///
// /// If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function
// /// returns `GLFW_PRESS` the first time you call it for a mouse button that was
// /// pressed, even if that mouse button has already been released.
// ///
// /// @param[in] window The desired window.
// /// @param[in] button The desired mouse button.
// /// @return One of `GLFW_PRESS` or `GLFW_RELEASE`.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidEnum.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_mouse_button
// ///
// /// @glfw3 Added window handle parameter.
// ///
// /// @ingroup input
// GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
// /// Retrieves the position of the cursor relative to the content area of
// /// the window.
// ///
// /// This function returns the position of the cursor, in screen coordinates,
// /// relative to the upper-left corner of the content area of the specified
// /// window.
// ///
// /// If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor
// /// position is unbounded and limited only by the minimum and maximum values of
// /// a `double`.
// ///
// /// The coordinate can be converted to their integer equivalents with the
// /// `floor` function. Casting directly to an integer type works for positive
// /// coordinates, but fails for negative ones.
// ///
// /// Any or all of the position arguments may be null. If an error occurs, all
// /// non-null position arguments will be set to zero.
// ///
// /// @param[in] window The desired window.
// /// @param[out] xpos Where to store the cursor x-coordinate, relative to the
// /// left edge of the content area, or null.
// /// @param[out] ypos Where to store the cursor y-coordinate, relative to the to
// /// top edge of the content area, or null.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_pos, glfw.setCursorPos
// /// Replaces `glfwGetMousePos`.
// ///
// /// @ingroup input
// GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
// /// Sets the position of the cursor, relative to the content area of the
// /// window.
// ///
// /// This function sets the position, in screen coordinates, of the cursor
// /// relative to the upper-left corner of the content area of the specified
// /// window. The window must have input focus. If the window does not have
// /// input focus when this function is called, it fails silently.
// ///
// /// __Do not use this function__ to implement things like camera controls. GLFW
// /// already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the
// /// cursor, transparently re-centers it and provides unconstrained cursor
// /// motion. See @ref glfwSetInputMode for more information.
// ///
// /// If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is
// /// unconstrained and limited only by the minimum and maximum values of
// /// a `double`.
// ///
// /// @param[in] window The desired window.
// /// @param[in] xpos The desired x-coordinate, relative to the left edge of the
// /// content area.
// /// @param[in] ypos The desired y-coordinate, relative to the top edge of the
// /// content area.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// wayland: This function will only work when the cursor mode is
// /// `GLFW_CURSOR_DISABLED`, otherwise it will do nothing.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_pos, glfw.getCursorPos
// /// Replaces `glfwSetMousePos`.
// ///
// /// @ingroup input
// GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos);
// /// Creates a custom cursor.
// ///
// /// Creates a new custom cursor image that can be set for a window with @ref
// /// glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor.
// /// Any remaining cursors are destroyed by @ref glfwTerminate.
// ///
// /// The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight
// /// bits per channel with the red channel first. They are arranged canonically
// /// as packed sequential rows, starting from the top-left corner.
// ///
// /// The cursor hotspot is specified in pixels, relative to the upper-left corner
// /// of the cursor image. Like all other coordinate systems in GLFW, the X-axis
// /// points to the right and the Y-axis points down.
// ///
// /// @param[in] image The desired cursor image.
// /// @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot.
// /// @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot.
// /// @return The handle of the created cursor, or null if an
// /// error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The specified image data is copied before this function
// /// returns.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_object, glfwDestroyCursor, glfwCreateStandardCursor
// ///
// ///
// /// @ingroup input
// GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot);
// /// Creates a cursor with a standard shape.
// ///
// /// Returns a cursor with a [standard shape](@ref shapes), that can be set for
// /// a window with @ref glfwSetCursor.
// ///
// /// @param[in] shape One of the [standard shapes](@ref shapes).
// /// @return A new cursor ready to use or null if an
// /// error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_object, glfwCreateCursor
// ///
// ///
// /// @ingroup input
// GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape);
// /// Destroys a cursor.
// ///
// /// This function destroys a cursor previously created with @ref
// /// glfwCreateCursor. Any remaining cursors will be destroyed by @ref
// /// glfwTerminate.
// ///
// /// If the specified cursor is current for any window, that window will be
// /// reverted to the default cursor. This does not affect the cursor mode.
// ///
// /// @param[in] cursor The cursor object to destroy.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// @reentrancy This function must not be called from a callback.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_object, glfwCreateCursor
// ///
// ///
// /// @ingroup input
// GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor);
// /// Sets the cursor for the window.
// ///
// /// This function sets the cursor image to be used when the cursor is over the
// /// content area of the specified window. The set cursor will only be visible
// /// when the [cursor mode](@ref cursor_mode) of the window is
// /// `GLFW_CURSOR_NORMAL`.
// ///
// /// On some platforms, the set cursor may not be visible unless the window also
// /// has input focus.
// ///
// /// @param[in] window The window to set the cursor for.
// /// @param[in] cursor The cursor to set, or null to switch back to the default
// /// arrow cursor.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_object
// ///
// ///
// /// @ingroup input
// GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
// /// Sets the key callback.
// ///
// /// This function sets the key callback of the specified window, which is called
// /// when a key is pressed, repeated or released.
// ///
// /// The key functions deal with physical keys, with layout independent
// /// [key tokens](@ref keys) named after their values in the standard US keyboard
// /// layout. If you want to input text, use the
// /// [character callback](@ref glfwSetCharCallback) instead.
// ///
// /// When a window loses input focus, it will generate synthetic key release
// /// events for all pressed keys. You can tell these events from user-generated
// /// events by the fact that the synthetic ones are generated after the focus
// /// loss event has been processed, i.e. after the
// /// [window focus callback](@ref glfwSetWindowFocusCallback) has been called.
// ///
// /// The scancode of a key is specific to that platform or sometimes even to that
// /// machine. Scancodes are intended to allow users to bind keys that don't have
// /// a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their
// /// state is not saved and so it cannot be queried with @ref glfwGetKey.
// ///
// /// Sometimes GLFW needs to generate synthetic key events, in which case the
// /// scancode may be zero.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new key callback, or null to remove the currently
// /// set callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, int key, int scancode, int action, int mods)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWkeyfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_key
// ///
// /// @glfw3 Added window handle parameter and return value.
// ///
// /// @ingroup input
// GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback);
// /// Sets the Unicode character callback.
// ///
// /// This function sets the character callback of the specified window, which is
// /// called when a Unicode character is input.
// ///
// /// The character callback is intended for Unicode text input. As it deals with
// /// characters, it is keyboard layout dependent, whereas the
// /// [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1
// /// to physical keys, as a key may produce zero, one or more characters. If you
// /// want to know whether a specific physical key was pressed or released, see
// /// the key callback instead.
// ///
// /// The character callback behaves as system text input normally does and will
// /// not be called if modifier keys are held down that would prevent normal text
// /// input on that platform, for example a Super (Command) key on macOS or Alt key
// /// on Windows.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new callback, or null to remove the currently set
// /// callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, unsigned int codepoint)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWcharfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_char
// ///
// /// @glfw3 Added window handle parameter and return value.
// ///
// /// @ingroup input
// GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback);
// /// Sets the mouse button callback.
// ///
// /// This function sets the mouse button callback of the specified window, which
// /// is called when a mouse button is pressed or released.
// ///
// /// When a window loses input focus, it will generate synthetic mouse button
// /// release events for all pressed mouse buttons. You can tell these events
// /// from user-generated events by the fact that the synthetic ones are generated
// /// after the focus loss event has been processed, i.e. after the
// /// [window focus callback](@ref glfwSetWindowFocusCallback) has been called.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new callback, or null to remove the currently set
// /// callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, int button, int action, int mods)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWmousebuttonfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: input_mouse_button
// ///
// /// @glfw3 Added window handle parameter and return value.
// ///
// /// @ingroup input
// GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback);
// /// Sets the cursor position callback.
// ///
// /// This function sets the cursor position callback of the specified window,
// /// which is called when the cursor is moved. The callback is provided with the
// /// position, in screen coordinates, relative to the upper-left corner of the
// /// content area of the window.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new callback, or null to remove the currently set
// /// callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, double xpos, double ypos);
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWcursorposfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_pos
// /// Replaces `glfwSetMousePosCallback`.
// ///
// /// @ingroup input
// GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback);
// /// Sets the cursor enter/leave callback.
// ///
// /// This function sets the cursor boundary crossing callback of the specified
// /// window, which is called when the cursor enters or leaves the content area of
// /// the window.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new callback, or null to remove the currently set
// /// callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, int entered)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWcursorenterfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: cursor_enter
// ///
// ///
// /// @ingroup input
// GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback);
// /// Sets the scroll callback.
// ///
// /// This function sets the scroll callback of the specified window, which is
// /// called when a scrolling device is used, such as a mouse wheel or scrolling
// /// area of a touchpad.
// ///
// /// The scroll callback receives all scrolling input, like that from a mouse
// /// wheel or a touchpad scrolling area.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new scroll callback, or null to remove the
// /// currently set callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, double xoffset, double yoffset)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWscrollfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: scrolling
// /// Replaces `glfwSetMouseWheelCallback`.
// ///
// /// @ingroup input
// GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback);
// /// Sets the path drop callback.
// ///
// /// This function sets the path drop callback of the specified window, which is
// /// called when one or more dragged paths are dropped on the window.
// ///
// /// Because the path array and its strings may have been generated specifically
// /// for that event, they are not guaranteed to be valid after the callback has
// /// returned. If you wish to use them after the callback returns, you need to
// /// make a deep copy.
// ///
// /// @param[in] window The window whose callback to set.
// /// @param[in] callback The new file drop callback, or null to remove the
// /// currently set callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(GLFWwindow* window, int path_count, const char* paths[])
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWdropfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// wayland: File drop is currently unimplemented.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: path_drop
// ///
// ///
// /// @ingroup input
// GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback);
// /// Returns whether the specified joystick is present.
// ///
// /// This function returns whether the specified joystick is present.
// ///
// /// There is no need to call this function before other functions that accept
// /// a joystick ID, as they all check for presence before performing any other
// /// work.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick
// /// Replaces `glfwGetJoystickParam`.
// ///
// /// @ingroup input
// GLFWAPI int glfwJoystickPresent(int jid);
// /// Returns the values of all axes of the specified joystick.
// ///
// /// This function returns the values of all axes of the specified joystick.
// /// Each element in the array is a value between -1.0 and 1.0.
// ///
// /// If the specified joystick is not present this function will return null
// /// but will not generate an error. This can be used instead of first calling
// /// @ref glfwJoystickPresent.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @param[out] count Where to store the number of axis values in the returned
// /// array. This is set to zero if the joystick is not present or an error
// /// occurred.
// /// @return An array of axis values, or null if the joystick is not present or
// /// an error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The returned array is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected or the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick_axis
// /// Replaces `glfwGetJoystickPos`.
// ///
// /// @ingroup input
// GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count);
// /// Returns the state of all buttons of the specified joystick.
// ///
// /// This function returns the state of all buttons of the specified joystick.
// /// Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`.
// ///
// /// For backward compatibility with earlier versions that did not have @ref
// /// glfwGetJoystickHats, the button array also includes all hats, each
// /// represented as four buttons. The hats are in the same order as returned by
// /// __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and
// /// _left_. To disable these extra buttons, set the @ref
// /// GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization.
// ///
// /// If the specified joystick is not present this function will return null
// /// but will not generate an error. This can be used instead of first calling
// /// @ref glfwJoystickPresent.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @param[out] count Where to store the number of button states in the returned
// /// array. This is set to zero if the joystick is not present or an error
// /// occurred.
// /// @return An array of button states, or null if the joystick is not present
// /// or an error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The returned array is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected or the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick_button
// ///
// /// @glfw3 Changed to return a dynamic array.
// ///
// /// @ingroup input
// GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count);
// /// Returns the state of all hats of the specified joystick.
// ///
// /// This function returns the state of all hats of the specified joystick.
// /// Each element in the array is one of the following values:
// ///
// /// Name | Value
// /// ---- | -----
// /// `GLFW_HAT_CENTERED` | 0
// /// `GLFW_HAT_UP` | 1
// /// `GLFW_HAT_RIGHT` | 2
// /// `GLFW_HAT_DOWN` | 4
// /// `GLFW_HAT_LEFT` | 8
// /// `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP`
// /// `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN`
// /// `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP`
// /// `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN`
// ///
// /// The diagonal directions are bitwise combinations of the primary (up, right,
// /// down and left) directions and you can test for these individually by ANDing
// /// it with the corresponding direction.
// ///
// /// @code
// /// if (hats[2] & GLFW_HAT_RIGHT)
// /// {
// /// // State of hat 2 could be right-up, right or right-down
// /// }
// /// @endcode
// ///
// /// If the specified joystick is not present this function will return null
// /// but will not generate an error. This can be used instead of first calling
// /// @ref glfwJoystickPresent.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @param[out] count Where to store the number of hat states in the returned
// /// array. This is set to zero if the joystick is not present or an error
// /// occurred.
// /// @return An array of hat states, or null if the joystick is not present
// /// or an error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The returned array is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected, this function is called again for that joystick or the library
// /// is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick_hat
// ///
// ///
// /// @ingroup input
// GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count);
// /// Returns the name of the specified joystick.
// ///
// /// This function returns the name, encoded as UTF-8, of the specified joystick.
// /// The returned string is allocated and freed by GLFW. You should not free it
// /// yourself.
// ///
// /// If the specified joystick is not present this function will return null
// /// but will not generate an error. This can be used instead of first calling
// /// @ref glfwJoystickPresent.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @return The UTF-8 encoded name of the joystick, or null if the joystick
// /// is not present or an error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The returned string is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected or the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick_name
// ///
// ///
// /// @ingroup input
// GLFWAPI const char* glfwGetJoystickName(int jid);
// /// Returns the SDL compatible GUID of the specified joystick.
// ///
// /// This function returns the SDL compatible GUID, as a UTF-8 encoded
// /// hexadecimal string, of the specified joystick. The returned string is
// /// allocated and freed by GLFW. You should not free it yourself.
// ///
// /// The GUID is what connects a joystick to a gamepad mapping. A connected
// /// joystick will always have a GUID even if there is no gamepad mapping
// /// assigned to it.
// ///
// /// If the specified joystick is not present this function will return null
// /// but will not generate an error. This can be used instead of first calling
// /// @ref glfwJoystickPresent.
// ///
// /// The GUID uses the format introduced in SDL 2.0.5. This GUID tries to
// /// uniquely identify the make and model of a joystick but does not identify
// /// a specific unit, e.g. all wired Xbox 360 controllers will have the same
// /// GUID on that platform. The GUID for a unit may vary between platforms
// /// depending on what hardware information the platform specific APIs provide.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @return The UTF-8 encoded GUID of the joystick, or null if the joystick
// /// is not present or an error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError.
// ///
// /// @pointer_lifetime The returned string is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected or the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: gamepad
// ///
// ///
// /// @ingroup input
// GLFWAPI const char* glfwGetJoystickGUID(int jid);
// /// Sets the user pointer of the specified joystick.
// ///
// /// This function sets the user-defined pointer of the specified joystick. The
// /// current value is retained until the joystick is disconnected. The initial
// /// value is null.
// ///
// /// This function may be called from the joystick callback, even for a joystick
// /// that is being disconnected.
// ///
// /// @param[in] jid The joystick whose pointer to set.
// /// @param[in] pointer The new value.
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function may be called from any thread. Access is not
// /// synchronized.
// ///
// /// see also: joystick_userptr, glfwGetJoystickUserPointer
// ///
// ///
// /// @ingroup input
// GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer);
// /// Returns the user pointer of the specified joystick.
// ///
// /// This function returns the current value of the user-defined pointer of the
// /// specified joystick. The initial value is null.
// ///
// /// This function may be called from the joystick callback, even for a joystick
// /// that is being disconnected.
// ///
// /// @param[in] jid The joystick whose pointer to return.
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function may be called from any thread. Access is not
// /// synchronized.
// ///
// /// see also: joystick_userptr, glfwSetJoystickUserPointer
// ///
// ///
// /// @ingroup input
// GLFWAPI void* glfwGetJoystickUserPointer(int jid);
// /// Returns whether the specified joystick has a gamepad mapping.
// ///
// /// This function returns whether the specified joystick is both present and has
// /// a gamepad mapping.
// ///
// /// If the specified joystick is present but does not have a gamepad mapping
// /// this function will return `GLFW_FALSE` but will not generate an error. Call
// /// @ref glfwJoystickPresent to check if a joystick is present regardless of
// /// whether it has a mapping.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping,
// /// or `GLFW_FALSE` otherwise.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidEnum.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: gamepad, glfwGetGamepadState
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwJoystickIsGamepad(int jid);
// /// Sets the joystick configuration callback.
// ///
// /// This function sets the joystick configuration callback, or removes the
// /// currently set callback. This is called when a joystick is connected to or
// /// disconnected from the system.
// ///
// /// For joystick connection and disconnection events to be delivered on all
// /// platforms, you need to call one of the [event processing](@ref events)
// /// functions. Joystick disconnection may also be detected and the callback
// /// called by joystick functions. The function will then return whatever it
// /// returns if the joystick is not present.
// ///
// /// @param[in] callback The new callback, or null to remove the currently set
// /// callback.
// /// @return The previously set callback, or null if no callback was set or the
// /// library had not been [initialized](@ref intro_init).
// ///
// /// @callback_signature
// /// @code
// /// void function_name(int jid, int event)
// /// @endcode
// /// For more information about the callback parameters, see the
// /// [function pointer type](@ref GLFWjoystickfun).
// ///
// /// Possible errors include glfw.Error.NotInitialized.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: joystick_event
// ///
// ///
// /// @ingroup input
// GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback);
// /// Adds the specified SDL_GameControllerDB gamepad mappings.
// ///
// /// This function parses the specified ASCII encoded string and updates the
// /// internal list with any gamepad mappings it finds. This string may
// /// contain either a single gamepad mapping or many mappings separated by
// /// newlines. The parser supports the full format of the `gamecontrollerdb.txt`
// /// source file including empty lines and comments.
// ///
// /// See @ref gamepad_mapping for a description of the format.
// ///
// /// If there is already a gamepad mapping for a given GUID in the internal list,
// /// it will be replaced by the one passed to this function. If the library is
// /// terminated and re-initialized the internal list will revert to the built-in
// /// default.
// ///
// /// @param[in] string The string containing the gamepad mappings.
// /// @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
// /// error occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidValue.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: gamepad, glfwJoystickIsGamepad, glfwGetGamepadName
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwUpdateGamepadMappings(const char* string);
// /// Returns the human-readable gamepad name for the specified joystick.
// ///
// /// This function returns the human-readable name of the gamepad from the
// /// gamepad mapping assigned to the specified joystick.
// ///
// /// If the specified joystick is not present or does not have a gamepad mapping
// /// this function will return null but will not generate an error. Call
// /// @ref glfwJoystickPresent to check whether it is present regardless of
// /// whether it has a mapping.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @return The UTF-8 encoded name of the gamepad, or null if the
// /// joystick is not present, does not have a mapping or an
// /// error occurred.
// ///
// /// @pointer_lifetime The returned string is allocated and freed by GLFW. You
// /// should not free it yourself. It is valid until the specified joystick is
// /// disconnected, the gamepad mappings are updated or the library is terminated.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: gamepad, glfwJoystickIsGamepad
// ///
// ///
// /// @ingroup input
// GLFWAPI const char* glfwGetGamepadName(int jid);
// /// Retrieves the state of the specified joystick remapped as a gamepad.
// ///
// /// This function retrieves the state of the specified joystick remapped to
// /// an Xbox-like gamepad.
// ///
// /// If the specified joystick is not present or does not have a gamepad mapping
// /// this function will return `GLFW_FALSE` but will not generate an error. Call
// /// @ref glfwJoystickPresent to check whether it is present regardless of
// /// whether it has a mapping.
// ///
// /// The Guide button may not be available for input as it is often hooked by the
// /// system or the Steam client.
// ///
// /// Not all devices have all the buttons or axes provided by @ref
// /// GLFWgamepadstate. Unavailable buttons and axes will always report
// /// `GLFW_RELEASE` and 0.0 respectively.
// ///
// /// @param[in] jid The [joystick](@ref joysticks) to query.
// /// @param[out] state The gamepad input state of the joystick.
// /// @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is
// /// connected, it has no gamepad mapping or an error
// /// occurred.
// ///
// /// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidEnum.
// ///
// /// @thread_safety This function must only be called from the main thread.
// ///
// /// see also: gamepad, glfwUpdateGamepadMappings, glfwJoystickIsGamepad
// ///
// ///
// /// @ingroup input
// GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);