From c3bdb99a145997752744438f9c72f1aecf74c819 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Mon, 13 Sep 2021 20:43:19 -0700 Subject: [PATCH] glfw: fix panic when pressing enter on Apple SDK license prompt (fixes #22) Signed-off-by: Stephen Gutekanst --- glfw/build.zig | 2 +- glfw/libglfw3.a | Bin 0 -> 300618 bytes glfw/src/TODO | 2719 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2720 insertions(+), 1 deletion(-) create mode 100644 glfw/libglfw3.a create mode 100644 glfw/src/TODO diff --git a/glfw/build.zig b/glfw/build.zig index cfa01a2..039357d 100644 --- a/glfw/build.zig +++ b/glfw/build.zig @@ -320,7 +320,7 @@ fn confirmAppleSDKAgreement(allocator: *std.mem.Allocator) !bool { if (try stdin.readUntilDelimiterOrEof(buf[0..], '\n')) |user_input| { try stdout.print("\n", .{}); var in = user_input; - if (in[in.len - 1] == '\r') in = in[0 .. in.len - 1]; + if (in.len > 0 and in[in.len - 1] == '\r') in = in[0 .. in.len - 1]; return std.mem.eql(u8, in, "y") or std.mem.eql(u8, in, "Y") or std.mem.eql(u8, in, "yes") or std.mem.eql(u8, in, ""); } else { return false; diff --git a/glfw/libglfw3.a b/glfw/libglfw3.a new file mode 100644 index 0000000000000000000000000000000000000000..9cdcc3a6479acfd74885c699e3ee20b7b885d1e1 GIT binary patch literal 300618 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 literal 0 HcmV?d00001 diff --git a/glfw/src/TODO b/glfw/src/TODO new file mode 100644 index 0000000..6810476 --- /dev/null +++ b/glfw/src/TODO @@ -0,0 +1,2719 @@ + +GLFW_INCLUDE_VULKAN +#if defined(GLFW_INCLUDE_ES1) + #if defined(GLFW_INCLUDE_GLEXT) +#elif defined(GLFW_INCLUDE_ES2) +#elif defined(GLFW_INCLUDE_ES3) +#elif defined(GLFW_INCLUDE_ES31) +#elif defined(GLFW_INCLUDE_ES32) +#elif defined(GLFW_INCLUDE_GLCOREARB) + #if defined(GLFW_INCLUDE_GLU) + +zig build test -Dtarget=x86_64-windows --verbose 2>&1|less + +/// One. +/// +/// This is only semantic sugar for the number 1. You can instead use `1` or +/// `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal +/// to one. +/// +/// @ingroup init +#define GLFW_TRUE 1 +/// Zero. +/// +/// This is only semantic sugar for the number 0. You can instead use `0` or +/// `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is +/// equal to zero. +/// +/// @ingroup init +#define GLFW_FALSE 0 + + +/************************************************************************* +///GLFW API types + *************************************************************************/ + +/// Client API function pointer type. +/// +/// Generic function pointer used for returning client API function pointers +/// without forcing a cast from a regular pointer. +/// +/// see also: context_glext, glfwGetProcAddress +/// +/// +/// @ingroup context +typedef void (*GLFWglproc)(void); + +/// Vulkan API function pointer type. +/// +/// Generic function pointer used for returning Vulkan API function pointers +/// without forcing a cast from a regular pointer. +/// +/// see also: vulkan_proc, glfwGetInstanceProcAddress +/// +/// +/// @ingroup vulkan +typedef void (*GLFWvkproc)(void); + +/// Opaque cursor object. +/// +/// Opaque cursor object. +/// +/// see also: cursor_object +/// +/// +/// @ingroup input +typedef struct GLFWcursor GLFWcursor; + +/// The function pointer type for error callbacks. +/// +/// This is the function pointer type for error callbacks. An error callback +/// function has the following signature: +/// @code +/// void callback_name(int error_code, const char* description) +/// @endcode +/// +/// @param[in] error_code An error code. Future releases may add +/// more error codes. +/// @param[in] description A UTF-8 encoded string describing the error. +/// +/// @pointer_lifetime The error description string is valid until the callback +/// function returns. +/// +/// see also: error_handling, glfwSetErrorCallback +/// +/// +/// @ingroup init +typedef void (* GLFWerrorfun)(int,const char*); + +/// The function pointer type for window position callbacks. +/// +/// This is the function pointer type for window position callbacks. A window +/// position callback function has the following signature: +/// @code +/// void callback_name(GLFWwindow* window, int xpos, int ypos) +/// @endcode +/// +/// @param[in] window The window that was moved. +/// @param[in] xpos The new x-coordinate, in screen coordinates, of the +/// upper-left corner of the content area of the window. +/// @param[in] ypos The new y-coordinate, in screen coordinates, of the +/// upper-left corner of the content area of the window. +/// +/// see also: window_pos, glfwSetWindowPosCallback +/// +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/// The function pointer type for window size callbacks. +/// +/// This is the function pointer type for window size callbacks. A window size +/// callback function has the following signature: +/// @code +/// void callback_name(GLFWwindow* window, int width, int height) +/// @endcode +/// +/// @param[in] window The window that was resized. +/// @param[in] width The new width, in screen coordinates, of the window. +/// @param[in] height The new height, in screen coordinates, of the window. +/// +/// see also: window_size, glfw.Window.setSizeCallback +/// +/// @glfw3 Added window handle parameter. +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/// The function pointer type for window close callbacks. +/// +/// This is the function pointer type for window close callbacks. A window +/// close callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window) +/// @endcode +/// +/// @param[in] window The window that the user attempted to close. +/// +/// see also: window_close, glfw.Window.setCloseCallback +/// +/// @glfw3 Added window handle parameter. +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/// The function pointer type for window content refresh callbacks. +/// +/// This is the function pointer type for window content refresh callbacks. +/// A window content refresh callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window); +/// @endcode +/// +/// @param[in] window The window whose content needs to be refreshed. +/// +/// see also: window_refresh, glfw.Window.setRefreshCallback +/// +/// @glfw3 Added window handle parameter. +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/// The function pointer type for window focus callbacks. +/// +/// This is the function pointer type for window focus callbacks. A window +/// focus callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window, int focused) +/// @endcode +/// +/// @param[in] window The window that gained or lost input focus. +/// @param[in] focused `GLFW_TRUE` if the window was given input focus, or +/// `GLFW_FALSE` if it lost it. +/// +/// see also: window_focus, glfw.Window.setFocusCallback +/// +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/// The function pointer type for window iconify callbacks. +/// +/// This is the function pointer type for window iconify callbacks. A window +/// iconify callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window, int iconified) +/// @endcode +/// +/// @param[in] window The window that was iconified or restored. +/// @param[in] iconified `GLFW_TRUE` if the window was iconified, or +/// `GLFW_FALSE` if it was restored. +/// +/// see also: window_iconify, glfw.Window.setIconifyCallback +/// +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/// The function pointer type for window maximize callbacks. +/// +/// This is the function pointer type for window maximize callbacks. A window +/// maximize callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window, int maximized) +/// @endcode +/// +/// @param[in] window The window that was maximized or restored. +/// @param[in] maximized `GLFW_TRUE` if the window was maximized, or +/// `GLFW_FALSE` if it was restored. +/// +/// see also: window_maximize, /// see also: glfw.Window.setMaximizeCallback +/// +typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int); + +/// The function pointer type for framebuffer size callbacks. +/// +/// This is the function pointer type for framebuffer size callbacks. +/// A framebuffer size callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window, int width, int height) +/// @endcode +/// +/// @param[in] window The window whose framebuffer was resized. +/// @param[in] width The new width, in pixels, of the framebuffer. +/// @param[in] height The new height, in pixels, of the framebuffer. +/// +/// see also: window_fbsize, glfw.Window.setFramebufferSizeCallback +/// +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/// The function pointer type for window content scale callbacks. +/// +/// This is the function pointer type for window content scale callbacks. +/// A window content scale callback function has the following signature: +/// @code +/// void function_name(GLFWwindow* window, float xscale, float yscale) +/// @endcode +/// +/// @param[in] window The window whose content scale changed. +/// @param[in] xscale The new x-axis content scale of the window. +/// @param[in] yscale The new y-axis content scale of the window. +/// +/// see also: window_scale, glfwSetWindowContentScaleCallback +/// +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float); + +/// 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; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/************************************************************************* +///GLFW API functions + *************************************************************************/ + +/// Restores the specified window. +/// +/// This function restores the specified window if it was previously iconified +/// (minimized) or maximized. If the window is already restored, this function +/// does nothing. +/// +/// If the specified window is a full screen window, the resolution chosen for +/// the window is restored on the selected monitor. +/// +/// @param[in] window The window to restore. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_iconify, glfw.Window.iconify, glfw.Window.maximize +/// +/// @glfw3 Added window handle parameter. +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/// Maximizes the specified window. +/// +/// This function maximizes the specified window if it was previously not +/// maximized. If the window is already maximized, this function does nothing. +/// +/// If the specified window is a full screen window, this function does nothing. +/// +/// @param[in] window The window to maximize. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @par Thread Safety +/// This function may only be called from the main thread. +/// +/// see also: window_iconify, glfw.Window.iconify, glfw.Window.restore +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/// Makes the specified window visible. +/// +/// This function makes the specified window visible if it was previously +/// hidden. If the window is already visible or is in full screen mode, this +/// function does nothing. +/// +/// By default, windowed mode windows are focused when shown +/// Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint +/// to change this behavior for all newly created windows, or change the +/// behavior for an existing window with glfw.Window.setAttrib. +/// +/// @param[in] window The window to make visible. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_hide, glfw.Window.hide +/// +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/// Hides the specified window. +/// +/// This function hides the specified window if it was previously visible. If +/// the window is already hidden or is in full screen mode, this function does +/// nothing. +/// +/// @param[in] window The window to hide. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_hide, glfw.Window.show +/// +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/// Brings the specified window to front and sets input focus. +/// +/// This function brings the specified window to front and sets input focus. +/// The window should already be visible and not iconified. +/// +/// By default, both windowed and full screen mode windows are focused when +/// initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to +/// disable this behavior. +/// +/// Also by default, windowed mode windows are focused when shown +/// with @ref glfwShowWindow. Set the +/// [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. +/// +/// __Do not use this function__ to steal focus from other applications unless +/// you are certain that is what the user wants. Focus stealing can be +/// extremely disruptive. +/// +/// For a less disruptive way of getting the user's attention, see +/// [attention requests](@ref window_attention). +/// +/// @param[in] window The window to give input focus. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// wayland: It is not possible for an application to bring its windows +/// to front, this function will always emit glfw.Error.PlatformError. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_focus, window_attention +/// +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/// Requests user attention to the specified window. +/// +/// This function requests user attention to the specified window. On +/// platforms where this is not supported, attention is requested to the +/// application as a whole. +/// +/// Once the user has given attention, usually by focusing the window or +/// application, the system will end the request automatically. +/// +/// @param[in] window The window to request attention to. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// macos: Attention is requested to the application as a whole, not the +/// specific window. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_attention +/// +GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); + +/// Returns the monitor that the window uses for full screen mode. +/// +/// This function returns the handle of the monitor that the specified window is +/// in full screen on. +/// +/// @param[in] window The window to query. +/// @return The monitor, or null if the window is in windowed mode or an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_monitor, glfw.Window.setMonitor +/// +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/// Sets the mode, monitor, video mode and placement of a window. +/// +/// This function sets the monitor that the window uses for full screen mode or, +/// if the monitor is null, makes it windowed mode. +/// +/// When setting a monitor, this function updates the width, height and refresh +/// rate of the desired video mode and switches to the video mode closest to it. +/// The window position is ignored when setting a monitor. +/// +/// When the monitor is null, the position, width and height are used to +/// place the window content area. The refresh rate is ignored when no monitor +/// is specified. +/// +/// If you only wish to update the resolution of a full screen window or the +/// size of a windowed mode window, see @ref glfwSetWindowSize. +/// +/// When a window transitions from full screen to windowed mode, this function +/// restores any previous window settings such as whether it is decorated, +/// floating, resizable, has size or aspect ratio limits, etc. +/// +/// @param[in] window The window whose monitor, size or video mode to set. +/// @param[in] monitor The desired monitor, or null to set windowed mode. +/// @param[in] xpos The desired x-coordinate of the upper-left corner of the +/// content area. +/// @param[in] ypos The desired y-coordinate of the upper-left corner of the +/// content area. +/// @param[in] width The desired with, in screen coordinates, of the content +/// area or video mode. +/// @param[in] height The desired height, in screen coordinates, of the content +/// area or video mode. +/// @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, +/// or `GLFW_DONT_CARE`. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// The OpenGL or OpenGL ES context will not be destroyed or otherwise +/// affected by any resizing or mode switching, although you may need to update +/// your viewport if the framebuffer size has changed. +/// +/// wayland: The desired window position is ignored, as there is no way +/// for an application to set this property. +/// +/// wayland: Setting the window to full screen will not attempt to +/// change the mode, no matter what the requested size or refresh rate. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_monitor, window_full_screen, glfw.Window.getMonitor, glfw.Window.setSize +/// +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/// Returns an attribute of the specified window. +/// +/// This function returns the value of an attribute of the specified window or +/// its OpenGL or OpenGL ES context. +/// +/// @param[in] window The window to query. +/// @param[in] attrib The [window attribute](@ref window_attribs) whose value to +/// return. +/// @return The value of the attribute, or zero if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum and glfw.Error.PlatformError. +/// +/// Framebuffer related hints are not window attributes. See @ref +/// window_attribs_fb for more information. +/// +/// Zero is a valid value for many window and context related +/// attributes so you cannot use a return value of zero as an indication of +/// errors. However, this function should not fail as long as it is passed +/// valid arguments and the library has been [initialized](@ref intro_init). +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_attribs, glfw.Window.setAttrib +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/// Sets an attribute of the specified window. +/// +/// This function sets the value of an attribute of the specified window. +/// +/// The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), +/// [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), +/// [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), +/// [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and +/// [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). +/// +/// Some of these attributes are ignored for full screen windows. The new +/// value will take effect if the window is later made windowed. +/// +/// Some of these attributes are ignored for windowed mode windows. The new +/// value will take effect if the window is later made full screen. +/// +/// @param[in] window The window to set the attribute for. +/// @param[in] attrib A supported window attribute. +/// @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidEnum, glfw.Error.InvalidValue and glfw.Error.PlatformError. +/// +/// Calling glfw.Window.getAttrib will always return the latest +/// value, even if that value is ignored by the current mode of the window. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_attribs, glfw.Window.getAttrib +/// +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/// Sets the user pointer of the specified window. +/// +/// This function sets the user-defined pointer of the specified window. The +/// current value is retained until the window is destroyed. The initial value +/// is null. +/// +/// @param[in] window The window 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: window_userptr, glfwGetWindowUserPointer +/// +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/// Returns the user pointer of the specified window. +/// +/// This function returns the current value of the user-defined pointer of the +/// specified window. The initial value is null. +/// +/// @param[in] window The window 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: window_userptr, glfwSetWindowUserPointer +/// +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/// Sets the position callback for the specified window. +/// +/// This function sets the position callback of the specified window, which is +/// called when the window is moved. The callback is provided with the +/// position, in screen coordinates, of 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, int xpos, int ypos) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowposfun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// wayland: This callback will never be called, as there is no way for +/// an application to know its global position. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_pos +/// +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/// Sets the size callback for the specified window. +/// +/// This function sets the size callback of the specified window, which is +/// called when the window is resized. The callback is provided with the size, +/// in screen coordinates, 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, int width, int height) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowsizefun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_size +/// +/// @glfw3 Added window handle parameter and return value. +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/// Sets the close callback for the specified window. +/// +/// This function sets the close callback of the specified window, which is +/// called when the user attempts to close the window, for example by clicking +/// the close widget in the title bar. +/// +/// The close flag is set before this callback is called, but you can modify it +/// at any time with @ref glfwSetWindowShouldClose. +/// +/// The close callback is not triggered by @ref glfwDestroyWindow. +/// +/// @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) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowclosefun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// macos: Selecting Quit from the application menu will trigger the +/// close callback for all windows. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_close +/// +/// @glfw3 Added window handle parameter and return value. +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/// Sets the refresh callback for the specified window. +/// +/// This function sets the refresh callback of the specified window, which is +/// called when the content area of the window needs to be redrawn, for example +/// if the window has been exposed after having been covered by another window. +/// +/// On compositing window systems such as Aero, Compiz, Aqua or Wayland, where +/// the window contents are saved off-screen, this callback may be called only +/// very infrequently or never at all. +/// +/// @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); +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowrefreshfun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_refresh +/// +/// @glfw3 Added window handle parameter and return value. +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/// Sets the focus callback for the specified window. +/// +/// This function sets the focus callback of the specified window, which is +/// called when the window gains or loses input focus. +/// +/// After the focus callback is called for a window that lost input focus, +/// synthetic key and mouse button release events will be generated for all such +/// that had been pressed. For more information, see @ref glfwSetKeyCallback +/// and @ref glfwSetMouseButtonCallback. +/// +/// @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 focused) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowfocusfun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_focus +/// +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/// Sets the iconify callback for the specified window. +/// +/// This function sets the iconification callback of the specified window, which +/// is called when the window is iconified or restored. +/// +/// @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 iconified) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowiconifyfun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// wayland: The wl_shell protocol has no concept of iconification, +/// this callback will never be called when using this deprecated protocol. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_iconify +/// +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/// Sets the maximize callback for the specified window. +/// +/// This function sets the maximization callback of the specified window, which +/// is called when the window is maximized or restored. +/// +/// @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 maximized) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowmaximizefun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_maximize +/// +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/// Sets the framebuffer resize callback for the specified window. +/// +/// This function sets the framebuffer resize callback of the specified window, +/// which is called when the framebuffer of the specified window is resized. +/// +/// @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 width, int height) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWframebuffersizefun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_fbsize +/// +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/// Sets the window content scale callback for the specified window. +/// +/// This function sets the window content scale callback of the specified window, +/// which is called when the content scale of the specified window changes. +/// +/// @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, float xscale, float yscale) +/// @endcode +/// For more information about the callback parameters, see the +/// [function pointer type](@ref GLFWwindowcontentscalefun). +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_scale, glfw.Window.getContentScale +/// +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/// Processes all pending events. +/// +/// This function processes only those events that are already in the event +/// queue and then returns immediately. Processing events will cause the window +/// and input callbacks associated with those events to be called. +/// +/// On some platforms, a window move, resize or menu operation will cause event +/// processing to block. This is due to how event processing is designed on +/// those platforms. You can use the +/// [window refresh callback](@ref window_refresh) to redraw the contents of +/// your window when necessary during such operations. +/// +/// Do not assume that callbacks you set will _only_ be called in response to +/// event processing functions like this one. While it is necessary to poll for +/// events, window systems that require GLFW to register callbacks of its own +/// can pass events to GLFW in response to many window system function calls. +/// GLFW will pass those events on to the application callbacks before +/// returning. +/// +/// Event processing is not required for joystick input to work. +/// +/// 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: events, glfw.waitEvents, glfw.waitEventsTimeout +/// +GLFWAPI void glfwPollEvents(void); + +/// Waits until events are queued and processes them. +/// +/// This function puts the calling thread to sleep until at least one event is +/// available in the event queue. Once one or more events are available, +/// it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue +/// are processed and the function then returns immediately. Processing events +/// will cause the window and input callbacks associated with those events to be +/// called. +/// +/// Since not all events are associated with callbacks, this function may return +/// without a callback having been called even if you are monitoring all +/// callbacks. +/// +/// On some platforms, a window move, resize or menu operation will cause event +/// processing to block. This is due to how event processing is designed on +/// those platforms. You can use the +/// [window refresh callback](@ref window_refresh) to redraw the contents of +/// your window when necessary during such operations. +/// +/// Do not assume that callbacks you set will _only_ be called in response to +/// event processing functions like this one. While it is necessary to poll for +/// events, window systems that require GLFW to register callbacks of its own +/// can pass events to GLFW in response to many window system function calls. +/// GLFW will pass those events on to the application callbacks before +/// returning. +/// +/// Event processing is not required for joystick input to work. +/// +/// 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: events, glfw.pollEvents, glfw.waitEventsTimeout +/// +GLFWAPI void glfwWaitEvents(void); + +/// Waits with timeout until events are queued and processes them. +/// +/// This function puts the calling thread to sleep until at least one event is +/// available in the event queue, or until the specified timeout is reached. If +/// one or more events are available, it behaves exactly like @ref +/// glfwPollEvents, i.e. the events in the queue are processed and the function +/// then returns immediately. Processing events will cause the window and input +/// callbacks associated with those events to be called. +/// +/// The timeout value must be a positive finite number. +/// +/// Since not all events are associated with callbacks, this function may return +/// without a callback having been called even if you are monitoring all +/// callbacks. +/// +/// On some platforms, a window move, resize or menu operation will cause event +/// processing to block. This is due to how event processing is designed on +/// those platforms. You can use the +/// [window refresh callback](@ref window_refresh) to redraw the contents of +/// your window when necessary during such operations. +/// +/// Do not assume that callbacks you set will _only_ be called in response to +/// event processing functions like this one. While it is necessary to poll for +/// events, window systems that require GLFW to register callbacks of its own +/// can pass events to GLFW in response to many window system function calls. +/// GLFW will pass those events on to the application callbacks before +/// returning. +/// +/// Event processing is not required for joystick input to work. +/// +/// @param[in] timeout The maximum amount of time, in seconds, to wait. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidValue 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: events, glfw.pollEvents, glfw.waitEvents +/// +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/// Posts an empty event to the event queue. +/// +/// This function posts an empty event from the current thread to the event +/// queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: events, glfw.waitEvents, glfw.waitEventsTimeout +/// +GLFWAPI void glfwPostEmptyEvent(void); + +/// 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); + +/// Sets the clipboard to the specified string. +/// +/// This function sets the system clipboard to the specified, UTF-8 encoded +/// string. +/// +/// @param[in] window Deprecated. Any valid window or null. +/// @param[in] string A UTF-8 encoded string. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError. +/// +/// @pointer_lifetime The specified string is copied before this function +/// returns. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: clipboard, glfwGetClipboardString +/// +/// +/// @ingroup input +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/// Returns the contents of the clipboard as a string. +/// +/// This function returns the contents of the system clipboard, if it contains +/// or is convertible to a UTF-8 encoded string. If the clipboard is empty or +/// if its contents cannot be converted, null is returned and a glfw.Error.FormatUnavailable error is generated. +/// +/// @param[in] window Deprecated. Any valid window or null. +/// @return The contents of the clipboard as a UTF-8 encoded string, or null +/// if an error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized 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 next call to @ref +/// glfwGetClipboardString or @ref glfwSetClipboardString, or until the library +/// is terminated. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: clipboard, glfwSetClipboardString +/// +/// +/// @ingroup input +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/// Returns the GLFW time. +/// +/// This function returns the current GLFW time, in seconds. Unless the time +/// has been set using @ref glfwSetTime it measures time elapsed since GLFW was +/// initialized. +/// +/// This function and @ref glfwSetTime are helper functions on top of @ref +/// glfwGetTimerFrequency and @ref glfwGetTimerValue. +/// +/// The resolution of the timer is system dependent, but is usually on the order +/// of a few micro- or nanoseconds. It uses the highest-resolution monotonic +/// time source on each supported platform. +/// +/// @return The current time, in seconds, or zero if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function may be called from any thread. Reading and +/// writing of the internal base time is not atomic, so it needs to be +/// externally synchronized with calls to @ref glfwSetTime. +/// +/// see also: time +/// +/// +/// @ingroup input +GLFWAPI double glfwGetTime(void); + +/// Sets the GLFW time. +/// +/// This function sets the current GLFW time, in seconds. The value must be +/// a positive finite number less than or equal to 18446744073.0, which is +/// approximately 584.5 years. +/// +/// This function and @ref glfwGetTime are helper functions on top of @ref +/// glfwGetTimerFrequency and @ref glfwGetTimerValue. +/// +/// @param[in] time The new value, in seconds. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.InvalidValue. +/// +/// The upper limit of GLFW time is calculated as +/// floor((264 - 1) / 109) and is due to implementations +/// storing nanoseconds in 64 bits. The limit may be increased in the future. +/// +/// @thread_safety This function may be called from any thread. Reading and +/// writing of the internal base time is not atomic, so it needs to be +/// externally synchronized with calls to @ref glfwGetTime. +/// +/// see also: time +/// +/// +/// @ingroup input +GLFWAPI void glfwSetTime(double time); + +/// Returns the current value of the raw timer. +/// +/// This function returns the current value of the raw timer, measured in +/// 1 / frequency seconds. To get the frequency, call @ref +/// glfwGetTimerFrequency. +/// +/// @return The value of the timer, or zero if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: time, glfwGetTimerFrequency +/// +/// +/// @ingroup input +GLFWAPI uint64_t glfwGetTimerValue(void); + +/// Returns the frequency, in Hz, of the raw timer. +/// +/// This function returns the frequency, in Hz, of the raw timer. +/// +/// @return The frequency of the timer, in Hz, or zero if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: time, glfwGetTimerValue +/// +/// +/// @ingroup input +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/// Makes the context of the specified window current for the calling +/// thread. +/// +/// This function makes the OpenGL or OpenGL ES context of the specified window +/// current on the calling thread. A context must only be made current on +/// a single thread at a time and each thread can have only a single current +/// context at a time. +/// +/// When moving a context between threads, you must make it non-current on the +/// old thread before making it current on the new one. +/// +/// By default, making a context non-current implicitly forces a pipeline flush. +/// On machines that support `GL_KHR_context_flush_control`, you can control +/// whether a context performs this flush by setting the +/// [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) +/// hint. +/// +/// The specified window must have an OpenGL or OpenGL ES context. Specifying +/// a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT +/// error. +/// +/// @param[in] window The window whose context to make current, or null to +/// detach the current context. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.NoWindowContext and glfw.Error.PlatformError. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: context_current, glfwGetCurrentContext +/// +/// +/// @ingroup context +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/// Returns the window whose context is current on the calling thread. +/// +/// This function returns the window whose OpenGL or OpenGL ES context is +/// current on the calling thread. +/// +/// @return The window whose context is current, or null if no window's +/// context is current. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: context_current, glfwMakeContextCurrent +/// +/// +/// @ingroup context +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/// Swaps the front and back buffers of the specified window. +/// +/// This function swaps the front and back buffers of the specified window when +/// rendering with OpenGL or OpenGL ES. If the swap interval is greater than +/// zero, the GPU driver waits the specified number of screen updates before +/// swapping the buffers. +/// +/// The specified window must have an OpenGL or OpenGL ES context. Specifying +/// a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT +/// error. +/// +/// This function does not apply to Vulkan. If you are rendering with Vulkan, +/// see `vkQueuePresentKHR` instead. +/// +/// @param[in] window The window whose buffers to swap. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.NoWindowContext and glfw.Error.PlatformError. +/// +/// __EGL:__ The context of the specified window must be current on the +/// calling thread. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: buffer_swap, glfwSwapInterval +/// +/// @glfw3 Added window handle parameter. +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/// Sets the swap interval for the current context. +/// +/// This function sets the swap interval for the current OpenGL or OpenGL ES +/// context, i.e. the number of screen updates to wait from the time @ref +/// glfwSwapBuffers was called before swapping the buffers and returning. This +/// is sometimes called _vertical synchronization_, _vertical retrace +/// synchronization_ or just _vsync_. +/// +/// A context that supports either of the `WGL_EXT_swap_control_tear` and +/// `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap +/// intervals, which allows the driver to swap immediately even if a frame +/// arrives a little bit late. You can check for these extensions with @ref +/// glfwExtensionSupported. +/// +/// A context must be current on the calling thread. Calling this function +/// without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. +/// +/// This function does not apply to Vulkan. If you are rendering with Vulkan, +/// see the present mode of your swapchain instead. +/// +/// @param[in] interval The minimum number of screen updates to wait for +/// until the buffers are swapped by @ref glfwSwapBuffers. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.NoCurrentContext and glfw.Error.PlatformError. +/// +/// This function is not called during context creation, leaving the +/// swap interval set to whatever is the default on that platform. This is done +/// because some swap interval extensions used by GLFW do not allow the swap +/// interval to be reset to zero once it has been set to a non-zero value. +/// +/// Some GPU drivers do not honor the requested swap interval, either +/// because of a user setting that overrides the application's request or due to +/// bugs in the driver. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: buffer_swap, glfwSwapBuffers +/// +/// +/// @ingroup context +GLFWAPI void glfwSwapInterval(int interval); + +/// Returns whether the specified extension is available. +/// +/// This function returns whether the specified +/// [API extension](@ref context_glext) is supported by the current OpenGL or +/// OpenGL ES context. It searches both for client API extension and context +/// creation API extensions. +/// +/// A context must be current on the calling thread. Calling this function +/// without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. +/// +/// As this functions retrieves and searches one or more extension strings each +/// call, it is recommended that you cache its results if it is going to be used +/// frequently. The extension strings will not change during the lifetime of +/// a context, so there is no danger in doing this. +/// +/// This function does not apply to Vulkan. If you are using Vulkan, see @ref +/// glfw.getRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` +/// and `vkEnumerateDeviceExtensionProperties` instead. +/// +/// @param[in] extension The ASCII encoded name of the extension. +/// @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` +/// otherwise. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.NoCurrentContext, glfw.Error.InvalidValue and glfw.Error.PlatformError. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: context_glext, glfwGetProcAddress +/// +/// +/// @ingroup context +GLFWAPI int glfwExtensionSupported(const char* extension); + +/// Returns the address of the specified function for the current +/// context. +/// +/// This function returns the address of the specified OpenGL or OpenGL ES +/// [core or extension function](@ref context_glext), if it is supported +/// by the current context. +/// +/// A context must be current on the calling thread. Calling this function +/// without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. +/// +/// This function does not apply to Vulkan. If you are rendering with Vulkan, +/// see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and +/// `vkGetDeviceProcAddr` instead. +/// +/// @param[in] procname The ASCII encoded name of the function. +/// @return The address of the function, or null if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.NoCurrentContext and glfw.Error.PlatformError. +/// +/// The address of a given function is not guaranteed to be the same +/// between contexts. +/// +/// This function may return a non-null address despite the +/// associated version or extension not being available. Always check the +/// context version or extension string first. +/// +/// @pointer_lifetime The returned function pointer is valid until the context +/// is destroyed or the library is terminated. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: context_glext, glfwExtensionSupported +/// +/// +/// @ingroup context +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + + + + + + + + + + + + + + + + + + + + + + + + + + +/// Returns whether the Vulkan loader and an ICD have been found. +/// +/// This function returns whether the Vulkan loader and any minimally functional ICD have been +/// found. +/// +/// The availability of a Vulkan loader and even an ICD does not by itself guarantee that surface +/// creation or even instance creation is possible. For example, on Fermi systems Nvidia will +/// install an ICD that provides no actual Vulkan support. Call glfw.getRequiredInstanceExtensions +/// to check whether the extensions necessary for Vulkan surface creation are available and +/// glfw.getPhysicalDevicePresentationSupport to check whether a queue family of a physical device +/// supports image presentation. +/// +/// @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` otherwise. +/// +/// Possible errors include glfw.Error.NotInitialized. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: vulkan_support +GLFWAPI int glfwVulkanSupported(void); + +/// Returns the Vulkan instance extensions required by GLFW. +/// +/// This function returns an array of names of Vulkan instance extensions required by GLFW for +/// creating Vulkan surfaces for GLFW windows. If successful, the list will always contain +/// `VK_KHR_surface`, so if you don't require any additional extensions you can pass this list +/// directly to the `VkInstanceCreateInfo` struct. +/// +/// If Vulkan is not available on the machine, this function returns null and generates a +/// glfw.Error.APIUnavailable error. Call glfw.vulkanSupported to check whether Vulkan is at least +/// minimally available. +/// +/// If Vulkan is available but no set of extensions allowing window surface +/// creation was found, this function returns null. You may still use Vulkan +/// for off-screen rendering and compute work. +/// +/// @param[out] count Where to store the number of extensions in the returned +/// array. This is set to zero if an error occurred. +/// @return An array of ASCII encoded extension names, or null if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.APIUnavailable. +/// +/// Additional extensions may be required by future versions of GLFW. You should check if any +/// extensions you wish to enable are already in the returned array, as it is an error to specify +/// an extension more than once in the `VkInstanceCreateInfo` struct. +/// +/// macos: This function currently supports either the `VK_MVK_macos_surface` extension from +/// MoltenVK or `VK_EXT_metal_surface` extension. +/// +/// @pointer_lifetime The returned array is allocated and freed by GLFW. You should not free it +/// yourself. It is guaranteed to be valid only until the library is terminated. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: vulkan_ext, glfwCreateWindowSurface +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +/// Returns the address of the specified Vulkan instance function. +/// +/// This function returns the address of the specified Vulkan core or extension function for the +/// specified instance. If instance is set to null it can return any function exported from the +/// Vulkan loader, including at least the following functions: +/// +/// - `vkEnumerateInstanceExtensionProperties` +/// - `vkEnumerateInstanceLayerProperties` +/// - `vkCreateInstance` +/// - `vkGetInstanceProcAddr` +/// +/// If Vulkan is not available on the machine, this function returns null and generates a +/// glfw.Error.APIUnavailable error. Call glfw.vulkanSupported to check whether Vulkan is at least +/// minimally available. +/// +/// This function is equivalent to calling `vkGetInstanceProcAddr` with a platform-specific query +/// of the Vulkan loader as a fallback. +/// +/// @param[in] instance The Vulkan instance to query, or null to retrieve +/// functions related to instance creation. +/// @param[in] procname The ASCII encoded name of the function. +/// @return The address of the function, or null if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized and glfw.Error.APIUnavailable. +/// +/// @pointer_lifetime The returned function pointer is valid until the library is terminated. +/// +/// @thread_safety This function may be called from any thread. +/// +/// see also: vulkan_proc +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/// Returns whether the specified queue family can present images. +/// +/// This function returns whether the specified queue family of the specified physical device +/// supports presentation to the platform GLFW was built for. +/// +/// If Vulkan or the required window surface creation instance extensions are not available on the +/// machine, or if the specified instance was not created with the required extensions, this +/// function returns `GLFW_FALSE` and generates a glfw.Error.APIUnavailable error. Call +/// glfw.vulkanSupported to check whether Vulkan is at least minimally available and +/// glfw.getRequiredInstanceExtensions to check what instance extensions are required. +/// +/// @param[in] instance The instance that the physical device belongs to. +/// @param[in] device The physical device that the queue family belongs to. +/// @param[in] queuefamily The index of the queue family to query. +/// @return `GLFW_TRUE` if the queue family supports presentation, or +/// `GLFW_FALSE` otherwise. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.APIUnavailable and glfw.Error.PlatformError. +/// +/// macos: This function currently always returns `GLFW_TRUE`, as the `VK_MVK_macos_surface` +/// extension does not provide a `vkGetPhysicalDevice*PresentationSupport` type function. +/// +/// @thread_safety This function may be called from any thread. For synchronization details of +/// Vulkan objects, see the Vulkan specification. +/// +/// see also: vulkan_present +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/// Creates a Vulkan surface for the specified window. +/// +/// This function creates a Vulkan surface for the specified window. +/// +/// If the Vulkan loader or at least one minimally functional ICD were not found, this function +/// returns `VK_ERROR_INITIALIZATION_FAILED` and generates a glfw.Error.APIUnavailable error. Call +/// glfw.vulkanSupported to check whether Vulkan is at least minimally available. +/// +/// If the required window surface creation instance extensions are not available or if the +/// specified instance was not created with these extensions enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` +/// and generates a glfw.Error.APIUnavailable error. Call glfw.getRequiredInstanceExtensions to +/// check what instance extensions are required. +/// +/// The window surface cannot be shared with another API so the window must have been created with +/// the client api hint set to `GLFW_NO_API` otherwise it generates a glfw.Error.InvalidValue error +/// and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. +/// +/// The window surface must be destroyed before the specified Vulkan instance. It is the +/// responsibility of the caller to destroy the window surface. GLFW does not destroy it for you. +/// Call `vkDestroySurfaceKHR` to destroy the surface. +/// +/// @param[in] instance The Vulkan instance to create the surface in. +/// @param[in] window The window to create the surface for. +/// @param[in] allocator The allocator to use, or null to use the default +/// allocator. +/// @param[out] surface Where to store the handle of the surface. This is set +/// to `VK_NULL_HANDLE` if an error occurred. +/// @return `VK_SUCCESS` if successful, or a Vulkan error code if an +/// error occurred. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.APIUnavailable, glfw.Error.PlatformError and glfw.Error.InvalidValue +/// +/// If an error occurs before the creation call is made, GLFW returns the Vulkan error code most +/// appropriate for the error. Appropriate use of glfw.vulkanSupported and glfw.getRequiredInstanceExtensions +/// should eliminate almost all occurrences of these errors. +/// +/// macos: This function currently only supports the `VK_MVK_macos_surface` extension from MoltenVK. +/// +/// macos: This function creates and sets a `CAMetalLayer` instance for the window content view, +/// which is required for MoltenVK to function. +/// +/// @thread_safety This function may be called from any thread. For synchronization details of +/// Vulkan objects, see the Vulkan specification. +/// +/// see also: vulkan_surface, glfw.getRequiredInstanceExtensions +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);