From 1a0bae7fa8e8207518c960d2179155fd79aa04a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Tue, 13 Feb 2024 20:57:45 +0100 Subject: [PATCH] Convert Doxygen code sections to Markdown --- docs/build.md | 64 ++++++------ docs/compile.md | 52 +++++----- docs/context.md | 52 +++++----- docs/input.md | 224 ++++++++++++++++++++-------------------- docs/intro.md | 76 +++++++------- docs/monitor.md | 56 +++++----- docs/moving.md | 88 ++++++++-------- docs/news.md | 4 +- docs/quick.md | 80 +++++++-------- docs/vulkan.md | 48 ++++----- docs/window.md | 268 ++++++++++++++++++++++++------------------------ 11 files changed, 506 insertions(+), 506 deletions(-) diff --git a/docs/build.md b/docs/build.md index 43f351d1..06085431 100644 --- a/docs/build.md +++ b/docs/build.md @@ -19,9 +19,9 @@ the documentation for your development environment. You should include the GLFW header in the source files where you use OpenGL or GLFW. -@code{.c} +```c #include -@endcode +``` This header defines all the constants and declares all the types and function prototypes of the GLFW API. By default, it also includes the OpenGL header from @@ -48,10 +48,10 @@ ES header or extension loader header included before it and will then disable the inclusion of the default OpenGL header. Most extension loaders also define macros that disable similar headers below it. -@code{.c} +```c #include #include -@endcode +``` Both of these mechanisms depend on the extension loader header defining a known macro. If yours doesn't or you don't know which one your users will pick, the @@ -59,11 +59,11 @@ macro. If yours doesn't or you don't know which one your users will pick, the including the OpenGL header. This will also allow you to include the two headers in any order. -@code{.c} +```c #define GLFW_INCLUDE_NONE #include #include -@endcode +``` ### GLFW header option macros {#build_macros} @@ -186,18 +186,18 @@ built along with your application. Add the root directory of the GLFW source tree to your project. This will add the `glfw` target to your project. -@code{.cmake} +```cmake add_subdirectory(path/to/glfw) -@endcode +``` Once GLFW has been added, link your application against the `glfw` target. This adds the GLFW library and its link-time dependencies as it is currently configured, the include directory for the GLFW header and, when applicable, the @ref GLFW_DLL macro. -@code{.cmake} +```cmake target_link_libraries(myapp glfw) -@endcode +``` Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL, OpenGL ES or Vulkan libraries it needs at runtime. If your application calls @@ -205,16 +205,16 @@ OpenGL directly, instead of using a modern [extension loader library](@ref context_glext_auto), use the OpenGL CMake package. -@code{.cmake} +```cmake find_package(OpenGL REQUIRED) -@endcode +``` If OpenGL is found, the `OpenGL::GL` target is added to your project, containing library and include directory paths. Link against this like any other library. -@code{.cmake} +```cmake target_link_libraries(myapp OpenGL::GL) -@endcode +``` For a minimal example of a program and GLFW sources built with CMake, see the [GLFW CMake Starter](https://github.com/juliettef/GLFW-CMake-starter) on GitHub. @@ -229,17 +229,17 @@ installed. If you want to build it along with your application instead, see With a few changes to your `CMakeLists.txt` you can locate the package and target files generated when GLFW is installed. -@code{.cmake} +```cmake find_package(glfw3 3.4 REQUIRED) -@endcode +``` Once GLFW has been added to the project, link against it with the `glfw` target. This adds the GLFW library and its link-time dependencies, the include directory for the GLFW header and, when applicable, the @ref GLFW_DLL macro. -@code{.cmake} +```cmake target_link_libraries(myapp glfw) -@endcode +``` Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL, OpenGL ES or Vulkan libraries it needs at runtime. If your application calls @@ -247,16 +247,16 @@ OpenGL directly, instead of using a modern [extension loader library](@ref context_glext_auto), use the OpenGL CMake package. -@code{.cmake} +```cmake find_package(OpenGL REQUIRED) -@endcode +``` If OpenGL is found, the `OpenGL::GL` target is added to your project, containing library and include directory paths. Link against this like any other library. -@code{.cmake} +```cmake target_link_libraries(myapp OpenGL::GL) -@endcode +``` ### With makefiles and pkg-config on Unix {#build_link_pkgconfig} @@ -271,23 +271,23 @@ ones automatically. A typical compile and link command-line when using the static version of the GLFW library may look like this: -@code{.sh} +```sh cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --static --libs glfw3) -@endcode +``` If you are using the shared version of the GLFW library, omit the `--static` flag. -@code{.sh} +```sh cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3) -@endcode +``` You can also use the `glfw3.pc` file without installing it first, by using the `PKG_CONFIG_PATH` environment variable. -@code{.sh} +```sh env PKG_CONFIG_PATH=path/to/glfw/src cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3) -@endcode +``` The dependencies do not include OpenGL, as GLFW loads any OpenGL, OpenGL ES or Vulkan libraries it needs at runtime. If your application calls OpenGL @@ -295,9 +295,9 @@ directly, instead of using a modern [extension loader library](@ref context_glext_auto), you should add the `gl` pkg-config package. -@code{.sh} +```sh cc $(pkg-config --cflags glfw3 gl) -o myprog myprog.c $(pkg-config --libs glfw3 gl) -@endcode +``` ### With Xcode on macOS {#build_link_xcode} @@ -320,9 +320,9 @@ the `-l` and `-framework` switches. If you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do: -@code{.sh} +```sh cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -@endcode +``` If you are using the static library, named `libglfw3.a`, substitute `-lglfw3` for `-lglfw`. diff --git a/docs/compile.md b/docs/compile.md index cc3c8991..70dba5ff 100644 --- a/docs/compile.md +++ b/docs/compile.md @@ -55,27 +55,27 @@ On Debian and derivatives like Ubuntu and Linux Mint you will need the `libwayla and `libxkbcommon-dev` packages to compile for Wayland and the `xorg-dev` meta-package to compile for X11. These will pull in all other dependencies. -@code{.sh} +```sh sudo apt install libwayland-dev libxkbcommon-dev xorg-dev -@endcode +``` On Fedora and derivatives like Red Hat you will need the `wayland-devel` and `libxkbcommon-devel` packages to compile for Wayland and the `libXcursor-devel`, `libXi-devel`, `libXinerama-devel` and `libXrandr-devel` packages to compile for X11. These will pull in all other dependencies. -@code{.sh} +```sh sudo dnf install wayland-devel libxkbcommon-devel libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel -@endcode +``` On FreeBSD you will need the `wayland`, `libxkbcommon` and `evdev-proto` packages to compile for Wayland. The X11 headers are installed along the end-user X11 packages, so if you have an X server running you should have the headers as well. If not, install the `xorgproto` package to compile for X11. -@code{.sh} +```sh pkg install wayland libxkbcommon evdev-proto xorgproto -@endcode +``` On Cygwin Wayland is not supported but you will need the `libXcursor-devel`, `libXi-devel`, `libXinerama-devel`, `libXrandr-devel` and `libXrender-devel` packages to @@ -131,33 +131,33 @@ To make a build directory, pass the source and build directories to the `cmake` command. These can be relative or absolute paths. The build directory is created if it doesn't already exist. -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -@endcode +``` It is common to name the build directory `build` and place it in the root of the source tree when only planning to build a single configuration. -@code{.sh} +```sh cd path/to/glfw cmake -S . -B build -@endcode +``` Without other flags these will generate Visual Studio project files on Windows and makefiles on other platforms. You can choose other targets using the `-G` flag. -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -G Xcode -@endcode +``` By default, GLFW will use Wayland and X11 on Linux and other Unix-like systems other than macOS. To disable support for one or both of these, set the @ref GLFW_BUILD_WAYLAND and/or @ref GLFW_BUILD_X11 CMake option. -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -D GLFW_BUILD_X11=0 -@endcode +``` Once you have generated the project files or makefiles for your chosen development environment, move on to @ref compile_compile. @@ -174,24 +174,24 @@ With Visual Studio open `GLFW.sln` and use the Build menu. With Xcode open With Linux, macOS and other forms of Unix, run `make`. -@code{.sh} +```sh cd path/to/build make -@endcode +``` With MinGW, it is `mingw32-make`. -@code{.sh} +```sh cd path/to/build mingw32-make -@endcode +``` Any CMake build directory can also be built with the `cmake` command and the `--build` flag. -@code{.sh} +```sh cmake --build path/to/build -@endcode +``` This will run the platform specific build tool the directory was generated for. @@ -214,9 +214,9 @@ distributions based on Debian GNU/Linux have this tool in a separate Finally, if you don't want to use any GUI, you can set options from the `cmake` command-line with the `-D` flag. -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -D BUILD_SHARED_LIBS=ON -@endcode +``` ### Shared CMake options {#compile_options_shared} @@ -309,9 +309,9 @@ cross-compilation of Windows binaries. To use these files you set the `CMAKE_TOOLCHAIN_FILE` CMake variable with the `-D` flag add an option when configuring and generating the build files. -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=path/to/file -@endcode +``` The exact toolchain file to use depends on the prefix used by the MinGW or MinGW-w64 binaries on your system. You can usually see this in the /usr @@ -319,9 +319,9 @@ directory. For example, both the Ubuntu and Cygwin MinGW-w64 packages have `/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct invocation would be: -@code{.sh} +```sh cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake -@endcode +``` The path to the toolchain file is relative to the path to the GLFW source tree passed to the `-S` flag, not to the current directory. diff --git a/docs/context.md b/docs/context.md index c900a8bb..755addde 100644 --- a/docs/context.md +++ b/docs/context.md @@ -45,9 +45,9 @@ When creating a window and its OpenGL or OpenGL ES context with @ref glfwCreateWindow, you can specify another window whose context the new one should share its objects (textures, vertex and element buffers, etc.) with. -@code{.c} +```c GLFWwindow* second_window = glfwCreateWindow(640, 480, "Second Window", NULL, first_window); -@endcode +``` Object sharing is implemented by the operating system and graphics driver. On platforms where it is possible to choose which types of objects are shared, GLFW @@ -68,11 +68,11 @@ GLFW doesn't support creating contexts without an associated window. However, contexts with hidden windows can be created with the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint. -@code{.c} +```c glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); GLFWwindow* offscreen_context = glfwCreateWindow(640, 480, "", NULL, NULL); -@endcode +``` The window never needs to be shown and its context can be used as a plain offscreen context. Depending on the window manager, the size of a hidden @@ -103,15 +103,15 @@ thread before making it current on the new one. The context of a window is made current with @ref glfwMakeContextCurrent. -@code{.c} +```c glfwMakeContextCurrent(window); -@endcode +``` The window of the current context is returned by @ref glfwGetCurrentContext. -@code{.c} +```c GLFWwindow* window = glfwGetCurrentContext(); -@endcode +``` The following GLFW functions require a context to be current. Calling any these functions without a current context will generate a @ref GLFW_NO_CURRENT_CONTEXT @@ -167,9 +167,9 @@ both GLFW and glad, but loaders for OpenGL ES, as well as loaders for specific API versions and extension sets can be generated. The generated files are written to the `output` directory. -@code{.sh} +```sh python main.py --generator c --no-loader --out-path output -@endcode +``` The `--no-loader` option is added because GLFW already provides a function for loading OpenGL and OpenGL ES function pointers, one that automatically uses the @@ -183,14 +183,14 @@ include the glad header file, which will replace the OpenGL header of your development environment. By including the glad header before the GLFW header, it suppresses the development environment's OpenGL or OpenGL ES header. -@code{.c} +```c #include #include -@endcode +``` Finally, you need to initialize glad once you have a suitable current context. -@code{.c} +```c window = glfwCreateWindow(640, 480, "My Window", NULL, NULL); if (!window) { @@ -200,7 +200,7 @@ if (!window) glfwMakeContextCurrent(window); gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); -@endcode +``` Once glad has been loaded, you have access to all OpenGL core and extension functions supported by both the context you created and the glad loader you @@ -213,22 +213,22 @@ check the actual OpenGL or OpenGL ES version with a specific version is supported by the current context with the `GLAD_GL_VERSION_x_x` booleans. -@code{.c} +```c if (GLAD_GL_VERSION_3_2) { // Call OpenGL 3.2+ specific code } -@endcode +``` To check whether a specific extension is supported, use the `GLAD_GL_xxx` booleans. -@code{.c} +```c if (GLAD_GL_ARB_gl_spirv) { // Use GL_ARB_gl_spirv } -@endcode +``` ### Loading extensions manually {#context_glext_manual} @@ -265,10 +265,10 @@ to function) and `PROC` (procedure) are added to the ends. To include the extension header, define @ref GLFW_INCLUDE_GLEXT before including the GLFW header. -@code{.c} +```c #define GLFW_INCLUDE_GLEXT #include -@endcode +``` #### Checking for extensions {#context_glext_string} @@ -278,12 +278,12 @@ drivers or a graphics card that lacks the necessary hardware features), so it is necessary to check at run-time whether the context supports the extension. This is done with @ref glfwExtensionSupported. -@code{.c} +```c if (glfwExtensionSupported("GL_ARB_gl_spirv")) { // The extension is supported by the current context } -@endcode +``` The argument is a null terminated ASCII string with the extension name. If the extension is supported, @ref glfwExtensionSupported returns `GLFW_TRUE`, @@ -297,9 +297,9 @@ These functions often do not have entry points in the client API libraries of your operating system, making it necessary to fetch them at run time. You can retrieve pointers to these functions with @ref glfwGetProcAddress. -@code{.c} +```c PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB = glfwGetProcAddress("glSpecializeShaderARB"); -@endcode +``` In general, you should avoid giving the function pointer variables the (exact) same name as the function, as this may confuse your linker. Instead, you can @@ -308,7 +308,7 @@ use a different prefix, like above, or some other naming scheme. Now that all the pieces have been introduced, here is what they might look like when used together. -@code{.c} +```c #define GLFW_INCLUDE_GLEXT #include @@ -336,5 +336,5 @@ void some_function(void) glSpecializeShaderARB(...); } } -@endcode +``` diff --git a/docs/input.md b/docs/input.md index bc5cc461..c11e7c61 100644 --- a/docs/input.md +++ b/docs/input.md @@ -40,18 +40,18 @@ There are three functions for processing pending events. @ref glfwPollEvents, processes only those events that have already been received and then returns immediately. -@code{.c} +```c glfwPollEvents(); -@endcode +``` This is the best choice when rendering continuously, like most games do. If you only need to update the contents of the window when you receive new input, @ref glfwWaitEvents is a better choice. -@code{.c} +```c glfwWaitEvents(); -@endcode +``` It puts the thread to sleep until at least one event has been received and then processes all received events. This saves a great deal of CPU cycles and is @@ -60,9 +60,9 @@ useful for, for example, editing tools. If you want to wait for events but have UI elements or other tasks that need periodic updates, @ref glfwWaitEventsTimeout lets you specify a timeout. -@code{.c} +```c glfwWaitEventsTimeout(0.7); -@endcode +``` It puts the thread to sleep until at least one event has been received, or until the specified number of seconds have elapsed. It then processes any received @@ -72,9 +72,9 @@ If the main thread is sleeping in @ref glfwWaitEvents, you can wake it from another thread by posting an empty event to the event queue with @ref glfwPostEmptyEvent. -@code{.c} +```c glfwPostEmptyEvent(); -@endcode +``` Do not assume that callbacks will _only_ be called in response to the above functions. While it is necessary to process events in one or more of the ways @@ -106,20 +106,20 @@ same keyboard layout, input method or even operating system as you. If you wish to be notified when a physical key is pressed or released or when it repeats, set a key callback. -@code{.c} +```c glfwSetKeyCallback(window, key_callback); -@endcode +``` The callback function receives the [keyboard key](@ref keys), platform-specific scancode, key action and [modifier bits](@ref mods). -@code{.c} +```c void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (key == GLFW_KEY_E && action == GLFW_PRESS) activate_airship(); } -@endcode +``` The action is one of `GLFW_PRESS`, `GLFW_REPEAT` or `GLFW_RELEASE`. Events with `GLFW_PRESS` and `GLFW_RELEASE` actions are emitted for every key press. Most @@ -147,21 +147,21 @@ different scancodes depending on the platform but they are safe to save to disk. You can query the scancode for any [key token](@ref keys) supported on the current platform with @ref glfwGetKeyScancode. -@code{.c} +```c const int scancode = glfwGetKeyScancode(GLFW_KEY_X); set_key_mapping(scancode, swap_weapons); -@endcode +``` The last reported state for every physical key with a [key token](@ref keys) is also saved in per-window state arrays that can be polled with @ref glfwGetKey. -@code{.c} +```c int state = glfwGetKey(window, GLFW_KEY_E); if (state == GLFW_PRESS) { activate_airship(); } -@endcode +``` The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`. @@ -175,9 +175,9 @@ If a pressed key is released again before you poll its state, you will have missed the key press. The recommended solution for this is to use a key callback, but there is also the `GLFW_STICKY_KEYS` input mode. -@code{.c} +```c glfwSetInputMode(window, GLFW_STICKY_KEYS, GLFW_TRUE); -@endcode +``` When sticky keys mode is enabled, the pollable state of a key will remain `GLFW_PRESS` until the state of that key is polled with @ref glfwGetKey. Once @@ -188,9 +188,9 @@ the state will reset to `GLFW_RELEASE`, otherwise it will remain `GLFW_PRESS`. If you wish to know what the state of the Caps Lock and Num Lock keys was when input events were generated, set the `GLFW_LOCK_KEY_MODS` input mode. -@code{.c} +```c glfwSetInputMode(window, GLFW_LOCK_KEY_MODS, GLFW_TRUE); -@endcode +``` When this input mode is enabled, any callback that receives [modifier bits](@ref mods) will have the @ref GLFW_MOD_CAPS_LOCK bit set if Caps @@ -215,19 +215,19 @@ you can treat the code point argument as native endian UTF-32. If you wish to offer regular text input, set a character callback. -@code{.c} +```c glfwSetCharCallback(window, character_callback); -@endcode +``` The callback function receives Unicode code points for key events that would have led to regular text input and generally behaves as a standard text field on that platform. -@code{.c} +```c void character_callback(GLFWwindow* window, unsigned int codepoint) { } -@endcode +``` ### Key names {#input_key_name} @@ -235,10 +235,10 @@ void character_callback(GLFWwindow* window, unsigned int codepoint) If you wish to refer to keys by name, you can query the keyboard layout dependent name of printable keys with @ref glfwGetKeyName. -@code{.c} +```c const char* key_name = glfwGetKeyName(GLFW_KEY_W, 0); show_tutorial_hint("Press %s to move forward", key_name); -@endcode +``` This function can handle both [keys and scancodes](@ref input_key). If the specified key is `GLFW_KEY_UNKNOWN` then the scancode is used, otherwise it is @@ -258,27 +258,27 @@ a custom image or a standard cursor shape from the system theme. If you wish to be notified when the cursor moves over the window, set a cursor position callback. -@code{.c} +```c glfwSetCursorPosCallback(window, cursor_position_callback); -@endcode +``` The callback functions receives the cursor position, measured in screen coordinates but relative to the top-left corner of the window content area. On platforms that provide it, the full sub-pixel cursor position is passed on. -@code{.c} +```c static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { } -@endcode +``` The cursor position is also saved per-window and can be polled with @ref glfwGetCursorPos. -@code{.c} +```c double xpos, ypos; glfwGetCursorPos(window, &xpos, &ypos); -@endcode +``` ### Cursor mode {#cursor_mode} @@ -293,9 +293,9 @@ If you wish to implement mouse motion based camera controls or other input schemes that require unlimited mouse movement, set the cursor mode to `GLFW_CURSOR_DISABLED`. -@code{.c} +```c glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); -@endcode +``` This will hide the cursor and lock it to the specified window. GLFW will then take care of all the details of cursor re-centering and offset calculation and @@ -309,18 +309,18 @@ other features of GLFW. It is not supported and will not work as robustly as If you only wish the cursor to become hidden when it is over a window but still want it to behave normally, set the cursor mode to `GLFW_CURSOR_HIDDEN`. -@code{.c} +```c glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); -@endcode +``` This mode puts no limit on the motion of the cursor. If you wish the cursor to be visible but confined to the content area of the window, set the cursor mode to `GLFW_CURSOR_CAPTURED`. -@code{.c} +```c glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_CAPTURED); -@endcode +``` The cursor will behave normally inside the content area but will not be able to leave unless the window loses focus. @@ -328,9 +328,9 @@ leave unless the window loses focus. To exit out of either of these special modes, restore the `GLFW_CURSOR_NORMAL` cursor mode. -@code{.c} +```c glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); -@endcode +``` If the cursor was disabled, this will move it back to its last visible position. @@ -351,10 +351,10 @@ Call @ref glfwRawMouseMotionSupported to check if the current machine provides raw motion and set the `GLFW_RAW_MOUSE_MOTION` input mode to enable it. It is disabled by default. -@code{.c} +```c if (glfwRawMouseMotionSupported()) glfwSetInputMode(window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE); -@endcode +``` If supported, raw mouse motion can be enabled or disabled per-window and at any time but it will only be provided when the cursor is disabled. @@ -374,7 +374,7 @@ A custom cursor is created with @ref glfwCreateCursor, which returns a handle to the created cursor object. For example, this creates a 16x16 white square cursor with the hot-spot in the upper-left corner: -@code{.c} +```c unsigned char pixels[16 * 16 * 4]; memset(pixels, 0xff, sizeof(pixels)); @@ -384,7 +384,7 @@ image.height = 16; image.pixels = pixels; GLFWcursor* cursor = glfwCreateCursor(&image, 0, 0); -@endcode +``` If cursor creation fails, `NULL` will be returned, so it is necessary to check the return value. @@ -399,9 +399,9 @@ sequential rows, starting from the top-left corner. A cursor with a [standard shape](@ref shapes) from the current system cursor theme can be created with @ref glfwCreateStandardCursor. -@code{.c} +```c GLFWcursor* url_cursor = glfwCreateStandardCursor(GLFW_POINTING_HAND_CURSOR); -@endcode +``` These cursor objects behave in the exact same way as those created with @ref glfwCreateCursor except that the system cursor theme provides the actual image. @@ -414,9 +414,9 @@ A few of these shapes are not available everywhere. If a shape is unavailable, When a cursor is no longer needed, destroy it with @ref glfwDestroyCursor. -@code{.c} +```c glfwDestroyCursor(cursor); -@endcode +``` Cursor destruction always succeeds. If the cursor is current for any window, that window will revert to the default cursor. This does not affect the cursor @@ -427,9 +427,9 @@ mode. All remaining cursors are destroyed when @ref glfwTerminate is called. A cursor can be set as current for a window with @ref glfwSetCursor. -@code{.c} +```c glfwSetCursor(window, cursor); -@endcode +``` Once set, the cursor image will be used as long as the system cursor is over the content area of the window and the [cursor mode](@ref cursor_mode) is set @@ -439,9 +439,9 @@ A single cursor may be set for any number of windows. To revert to the default cursor, set the cursor of that window to `NULL`. -@code{.c} +```c glfwSetCursor(window, NULL); -@endcode +``` When a cursor is destroyed, any window that has it set will revert to the default cursor. This does not affect the cursor mode. @@ -452,13 +452,13 @@ default cursor. This does not affect the cursor mode. If you wish to be notified when the cursor enters or leaves the content area of a window, set a cursor enter/leave callback. -@code{.c} +```c glfwSetCursorEnterCallback(window, cursor_enter_callback); -@endcode +``` The callback function receives the new classification of the cursor. -@code{.c} +```c void cursor_enter_callback(GLFWwindow* window, int entered) { if (entered) @@ -470,17 +470,17 @@ void cursor_enter_callback(GLFWwindow* window, int entered) // The cursor left the content area of the window } } -@endcode +``` You can query whether the cursor is currently inside the content area of the window with the [GLFW_HOVERED](@ref GLFW_HOVERED_attrib) window attribute. -@code{.c} +```c if (glfwGetWindowAttrib(window, GLFW_HOVERED)) { highlight_interface(); } -@endcode +``` ### Mouse button input {#input_mouse_button} @@ -488,20 +488,20 @@ if (glfwGetWindowAttrib(window, GLFW_HOVERED)) If you wish to be notified when a mouse button is pressed or released, set a mouse button callback. -@code{.c} +```c glfwSetMouseButtonCallback(window, mouse_button_callback); -@endcode +``` The callback function receives the [mouse button](@ref buttons), button action and [modifier bits](@ref mods). -@code{.c} +```c void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) { if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) popup_menu(); } -@endcode +``` The action is one of `GLFW_PRESS` or `GLFW_RELEASE`. @@ -509,13 +509,13 @@ The last reported state for every [supported mouse button](@ref buttons) is also saved in per-window state arrays that can be polled with @ref glfwGetMouseButton. -@code{.c} +```c int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT); if (state == GLFW_PRESS) { upgrade_cow(); } -@endcode +``` The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`. @@ -529,9 +529,9 @@ missed the button press. The recommended solution for this is to use a mouse button callback, but there is also the `GLFW_STICKY_MOUSE_BUTTONS` input mode. -@code{.c} +```c glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, GLFW_TRUE); -@endcode +``` When sticky mouse buttons mode is enabled, the pollable state of a mouse button will remain `GLFW_PRESS` until the state of that button is polled with @ref @@ -548,17 +548,17 @@ The `GLFW_MOUSE_BUTTON_LAST` constant holds the highest value of any If you wish to be notified when the user scrolls, whether with a mouse wheel or touchpad gesture, set a scroll callback. -@code{.c} +```c glfwSetScrollCallback(window, scroll_callback); -@endcode +``` The callback function receives two-dimensional scroll offsets. -@code{.c} +```c void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) { } -@endcode +``` A normal mouse wheel, being vertical, provides offsets along the Y-axis. @@ -571,9 +571,9 @@ referred to as joysticks. It supports up to sixteen joysticks, ranging from `GLFW_JOYSTICK_LAST`. You can test whether a [joystick](@ref joysticks) is present with @ref glfwJoystickPresent. -@code{.c} +```c int present = glfwJoystickPresent(GLFW_JOYSTICK_1); -@endcode +``` Each joystick has zero or more axes, zero or more buttons, zero or more hats, a human-readable name, a user pointer and an SDL compatible GUID. @@ -599,10 +599,10 @@ The positions of all axes of a joystick are returned by @ref glfwGetJoystickAxes. See the reference documentation for the lifetime of the returned array. -@code{.c} +```c int count; const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_5, &count); -@endcode +``` Each element in the returned array is a value between -1.0 and 1.0. @@ -613,10 +613,10 @@ The states of all buttons of a joystick are returned by @ref glfwGetJoystickButtons. See the reference documentation for the lifetime of the returned array. -@code{.c} +```c int count; const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_3, &count); -@endcode +``` Each element in the returned array is either `GLFW_PRESS` or `GLFW_RELEASE`. @@ -630,10 +630,10 @@ the reference documentation for @ref glfwGetJoystickButtons for details. The states of all hats are returned by @ref glfwGetJoystickHats. See the reference documentation for the lifetime of the returned array. -@code{.c} +```c int count; const unsigned char* hats = glfwGetJoystickHats(GLFW_JOYSTICK_7, &count); -@endcode +``` Each element in the returned array is one of the following: @@ -653,12 +653,12 @@ 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{.c} +```c if (hats[2] & GLFW_HAT_RIGHT) { // State of hat 2 could be right-up, right or right-down } -@endcode +``` For backward compatibility with earlier versions that did not have @ref glfwGetJoystickHats, all hats are by default also included in the button array. @@ -671,9 +671,9 @@ The human-readable, UTF-8 encoded name of a joystick is returned by @ref glfwGetJoystickName. See the reference documentation for the lifetime of the returned string. -@code{.c} +```c const char* name = glfwGetJoystickName(GLFW_JOYSTICK_4); -@endcode +``` Joystick names are not guaranteed to be unique. Two joysticks of the same model and make may have the same name. Only the [joystick ID](@ref joysticks) is @@ -696,14 +696,14 @@ The initial value of the pointer is `NULL`. If you wish to be notified when a joystick is connected or disconnected, set a joystick callback. -@code{.c} +```c glfwSetJoystickCallback(joystick_callback); -@endcode +``` The callback function receives the ID of the joystick that has been connected and disconnected and the event that occurred. -@code{.c} +```c void joystick_callback(int jid, int event) { if (event == GLFW_CONNECTED) @@ -715,7 +715,7 @@ void joystick_callback(int jid, int event) // The joystick was disconnected } } -@endcode +``` For joystick connection and disconnection events to be delivered on all platforms, you need to call one of the [event processing](@ref events) @@ -746,12 +746,12 @@ a joystick is connected or the mappings are updated. You can check whether a joystick is both present and has a gamepad mapping with @ref glfwJoystickIsGamepad. -@code{.c} +```c if (glfwJoystickIsGamepad(GLFW_JOYSTICK_2)) { // Use as gamepad } -@endcode +``` If you are only interested in gamepad input you can use this function instead of @ref glfwJoystickPresent. @@ -760,13 +760,13 @@ You can query the human-readable name provided by the gamepad mapping with @ref glfwGetGamepadName. This may or may not be the same as the [joystick name](@ref joystick_name). -@code{.c} +```c const char* name = glfwGetGamepadName(GLFW_JOYSTICK_7); -@endcode +``` To retrieve the gamepad state of a joystick, call @ref glfwGetGamepadState. -@code{.c} +```c GLFWgamepadstate state; if (glfwGetGamepadState(GLFW_JOYSTICK_3, &state)) @@ -778,7 +778,7 @@ if (glfwGetGamepadState(GLFW_JOYSTICK_3, &state)) input_speed(state.axes[GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER]); } -@endcode +``` The @ref GLFWgamepadstate struct has two arrays; one for button states and one for axis states. The values for each button and axis are the same as for the @@ -816,11 +816,11 @@ GLFW contains a copy of the mappings available in time of release. Newer ones can be added at runtime with @ref glfwUpdateGamepadMappings. -@code{.c} +```c const char* mappings = load_file_contents("game/data/gamecontrollerdb.txt"); glfwUpdateGamepadMappings(mappings); -@endcode +``` This function supports everything from single lines up to and including the unmodified contents of the whole `gamecontrollerdb.txt` file. @@ -880,12 +880,12 @@ one built into GLFW for Xbox controllers accessed via the XInput API on Windows. This example has been broken into several lines to fit on the page, but real gamepad mappings must be a single line. -@code{.unparsed} +``` 78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0, b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8, rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4, righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8, -@endcode +``` @note GLFW does not yet support the output range and modifiers `+` and `-` that were recently added to SDL. The input modifiers `+`, `-` and `~` are supported @@ -896,9 +896,9 @@ and described above. GLFW provides high-resolution time input, in seconds, with @ref glfwGetTime. -@code{.c} +```c double seconds = glfwGetTime(); -@endcode +``` It returns the number of seconds since the library was initialized with @ref glfwInit. The platform-specific time sources used typically have micro- or @@ -906,9 +906,9 @@ nanosecond resolution. You can modify the base time with @ref glfwSetTime. -@code{.c} +```c glfwSetTime(4.0); -@endcode +``` This sets the time to the specified time, in seconds, and it continues to count from there. @@ -916,17 +916,17 @@ from there. You can also access the raw timer used to implement the functions above, with @ref glfwGetTimerValue. -@code{.c} +```c uint64_t value = glfwGetTimerValue(); -@endcode +``` This value is in 1 / frequency seconds. The frequency of the raw timer varies depending on the operating system and hardware. You can query the frequency, in Hz, with @ref glfwGetTimerFrequency. -@code{.c} +```c uint64_t frequency = glfwGetTimerFrequency(); -@endcode +``` ## Clipboard input and output {#clipboard} @@ -935,13 +935,13 @@ If the system clipboard contains a UTF-8 encoded string or if it can be converted to one, you can retrieve it with @ref glfwGetClipboardString. See the reference documentation for the lifetime of the returned string. -@code{.c} +```c const char* text = glfwGetClipboardString(NULL); if (text) { insert_text(text); } -@endcode +``` If the clipboard is empty or if its contents could not be converted, `NULL` is returned. @@ -949,9 +949,9 @@ returned. The contents of the system clipboard can be set to a UTF-8 encoded string with @ref glfwSetClipboardString. -@code{.c} +```c glfwSetClipboardString(NULL, "A string with words in it"); -@endcode +``` ## Path drop input {#path_drop} @@ -959,20 +959,20 @@ glfwSetClipboardString(NULL, "A string with words in it"); If you wish to receive the paths of files and/or directories dropped on a window, set a file drop callback. -@code{.c} +```c glfwSetDropCallback(window, drop_callback); -@endcode +``` The callback function receives an array of paths encoded as UTF-8. -@code{.c} +```c void drop_callback(GLFWwindow* window, int count, const char** paths) { int i; for (i = 0; i < count; i++) handle_dropped_file(paths[i]); } -@endcode +``` The path array and its strings are only valid until the file drop callback returns, as they may have been generated specifically for that event. You need diff --git a/docs/intro.md b/docs/intro.md index 35334c7b..aa3bed01 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -46,12 +46,12 @@ GLFW_NOT_INITIALIZED error. The library is initialized with @ref glfwInit, which returns `GLFW_FALSE` if an error occurred. -@code{.c} +```c if (!glfwInit()) { // Handle initialization failure } -@endcode +``` If any part of initialization fails, any parts that succeeded are terminated as if @ref glfwTerminate had been called. The library only needs to be initialized @@ -74,9 +74,9 @@ hint. Initialization hints are set before @ref glfwInit and affect how the library behaves until termination. Hints are set with @ref glfwInitHint. -@code{.c} +```c glfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE); -@endcode +``` The values you set hints to are never reset by GLFW, but they only take effect during initialization. Once GLFW has been initialized, any values you set will @@ -174,32 +174,32 @@ default, this is set to @ref GLFW_ANY_PLATFORM, which will look for supported wi systems in order of priority and select the first one it finds. It can also be set to any specific platform to have GLFW only look for that one. -@code{.c} +```c glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); -@endcode +``` This mechanism also provides the Null platform, which is always supported but needs to be explicitly requested. This platform is effectively a stub, emulating a window system on a single 1080p monitor, but will not interact with any actual window system. -@code{.c} +```c glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_NULL); -@endcode +``` You can test whether a library binary was compiled with support for a specific platform with @ref glfwPlatformSupported. -@code{.c} +```c if (glfwPlatformSupported(GLFW_PLATFORM_WAYLAND)) glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WAYLAND); -@endcode +``` Once GLFW has been initialized, you can query which platform was selected with @ref glfwGetPlatform. -@code{.c} +```c int platform = glfwGetPlatform(); -@endcode +``` If you are using any [native access functions](@ref native), especially on Linux and other Unix-like systems, then you may need to check that you are calling the ones matching the @@ -211,7 +211,7 @@ selected platform. The heap memory allocator can be customized before initialization with @ref glfwInitAllocator. -@code{.c} +```c GLFWallocator allocator; allocator.allocate = my_malloc; allocator.reallocate = my_realloc; @@ -219,7 +219,7 @@ allocator.deallocate = my_free; allocator.user = NULL; glfwInitAllocator(&allocator); -@endcode +``` The allocator will be made active at the beginning of initialization and will be used by GLFW until the library has been fully terminated. Any allocator set after initialization @@ -233,12 +233,12 @@ The allocation function must have a signature matching @ref GLFWallocatefun. It the desired size, in bytes, and the user pointer passed to @ref glfwInitAllocator and returns the address to the allocated memory block. -@code{.c} +```c void* my_malloc(size_t size, void* user) { ... } -@endcode +``` The documentation for @ref GLFWallocatefun also lists the requirements and limitations for an allocation function. If the active one does not meet all of these, GLFW may fail. @@ -248,12 +248,12 @@ It receives the memory block to be reallocated, the new desired size, in bytes, pointer passed to @ref glfwInitAllocator and returns the address to the resized memory block. -@code{.c} +```c void* my_realloc(void* block, size_t size, void* user) { ... } -@endcode +``` The documentation for @ref GLFWreallocatefun also lists the requirements and limitations for a reallocation function. If the active one does not meet all of these, GLFW may fail. @@ -262,12 +262,12 @@ The deallocation function must have a function signature matching @ref GLFWdeall It receives the memory block to be deallocated and the user pointer passed to @ref glfwInitAllocator. -@code{.c} +```c void my_free(void* block, void* user) { ... } -@endcode +``` The documentation for @ref GLFWdeallocatefun also lists the requirements and limitations for a deallocation function. If the active one does not meet all of these, GLFW may fail. @@ -278,9 +278,9 @@ for a deallocation function. If the active one does not meet all of these, GLFW Before your application exits, you should terminate the GLFW library if it has been initialized. This is done with @ref glfwTerminate. -@code{.c} +```c glfwTerminate(); -@endcode +``` This will destroy any remaining window, monitor and cursor objects, restore any modified gamma ramps, re-enable the screensaver if it had been disabled and free @@ -303,12 +303,12 @@ values. The last [error code](@ref errors) for the calling thread can be queried at any time with @ref glfwGetError. -@code{.c} +```c int code = glfwGetError(NULL); if (code != GLFW_NO_ERROR) handle_error(code); -@endcode +``` If no error has occurred since the last call, @ref GLFW_NO_ERROR (zero) is returned. The error is cleared before the function returns. @@ -322,13 +322,13 @@ can retrieve a UTF-8 encoded human-readable description along with the error code. If no error has occurred since the last call, the description is set to `NULL`. -@code{.c} +```c const char* description; int code = glfwGetError(&description); if (description) display_error_message(code, description); -@endcode +``` The retrieved description string is only valid until the next error occurs. This means you must make a copy of it if you want to keep it. @@ -336,19 +336,19 @@ This means you must make a copy of it if you want to keep it. You can also set an error callback, which will be called each time an error occurs. It is set with @ref glfwSetErrorCallback. -@code{.c} +```c glfwSetErrorCallback(error_callback); -@endcode +``` The error callback receives the same error code and human-readable description returned by @ref glfwGetError. -@code{.c} +```c void error_callback(int code, const char* description) { display_error_message(code, description); } -@endcode +``` The error callback is called after the error is stored, so calling @ref glfwGetError from within the error callback returns the same values as the @@ -570,12 +570,12 @@ this to verify that the library binary is compatible with your application. The compile-time version of GLFW is provided by the GLFW header with the `GLFW_VERSION_MAJOR`, `GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` macros. -@code{.c} +```c printf("Compiled against GLFW %i.%i.%i\n", GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION); -@endcode +``` ### Run-time version {#intro_version_runtime} @@ -583,12 +583,12 @@ printf("Compiled against GLFW %i.%i.%i\n", The run-time version can be retrieved with @ref glfwGetVersion, a function that may be called regardless of whether GLFW is initialized. -@code{.c} +```c int major, minor, revision; glfwGetVersion(&major, &minor, &revision); printf("Running against GLFW %i.%i.%i\n", major, minor, revision); -@endcode +``` ### Version string {#intro_version_string} @@ -622,14 +622,14 @@ The format of the string is as follows: For example, compiling GLFW 3.4 with MinGW as a DLL for Windows, may result in a version string like this: -@code{.c} +```c 3.4.0 Win32 WGL Null EGL OSMesa MinGW DLL -@endcode +``` Compiling GLFW as a static library for Linux, with both Wayland and X11 enabled, may result in a version string like this: -@code{.c} +```c 3.4.0 Wayland X11 GLX Null EGL OSMesa monotonic -@endcode +``` diff --git a/docs/monitor.md b/docs/monitor.md index b4ba75c4..27cf6793 100644 --- a/docs/monitor.md +++ b/docs/monitor.md @@ -40,17 +40,17 @@ The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is the user's preferred monitor and is usually the one with global UI elements like task bar or menu bar. -@code{.c} +```c GLFWmonitor* primary = glfwGetPrimaryMonitor(); -@endcode +``` You can retrieve all currently connected monitors with @ref glfwGetMonitors. See the reference documentation for the lifetime of the returned array. -@code{.c} +```c int count; GLFWmonitor** monitors = glfwGetMonitors(&count); -@endcode +``` The primary monitor is always the first monitor in the returned array, but other monitors may be moved to a different index when a monitor is connected or @@ -62,14 +62,14 @@ disconnected. If you wish to be notified when a monitor is connected or disconnected, set a monitor callback. -@code{.c} +```c glfwSetMonitorCallback(monitor_callback); -@endcode +``` The callback function receives the handle for the monitor that has been connected or disconnected and the event that occurred. -@code{.c} +```c void monitor_callback(GLFWmonitor* monitor, int event) { if (event == GLFW_CONNECTED) @@ -81,7 +81,7 @@ void monitor_callback(GLFWmonitor* monitor, int event) // The monitor was disconnected } } -@endcode +``` If a monitor is disconnected, all windows that are full screen on it will be switched to windowed mode before the callback is called. Only @ref @@ -107,17 +107,17 @@ Video modes are represented as @ref GLFWvidmode structures. You can get an array of the video modes supported by a monitor with @ref glfwGetVideoModes. See the reference documentation for the lifetime of the returned array. -@code{.c} +```c int count; GLFWvidmode* modes = glfwGetVideoModes(monitor, &count); -@endcode +``` To get the current video mode of a monitor call @ref glfwGetVideoMode. See the reference documentation for the lifetime of the returned pointer. -@code{.c} +```c const GLFWvidmode* mode = glfwGetVideoMode(monitor); -@endcode +``` The resolution of a video mode is specified in [screen coordinates](@ref coordinate_systems), not pixels. @@ -130,10 +130,10 @@ retrieved with @ref glfwGetMonitorPhysicalSize. This has no relation to its current _resolution_, i.e. the width and height of its current [video mode](@ref monitor_modes). -@code{.c} +```c int width_mm, height_mm; glfwGetMonitorPhysicalSize(monitor, &width_mm, &height_mm); -@endcode +``` While this can be used to calculate the raw DPI of a monitor, this is often not useful. Instead, use the [monitor content scale](@ref monitor_scale) and @@ -145,10 +145,10 @@ useful. Instead, use the [monitor content scale](@ref monitor_scale) and The content scale for a monitor can be retrieved with @ref glfwGetMonitorContentScale. -@code{.c} +```c float xscale, yscale; glfwGetMonitorContentScale(monitor, &xscale, &yscale); -@endcode +``` The content scale is the ratio between the current DPI and the platform's default DPI. This is especially important for text and any UI elements. If the @@ -168,10 +168,10 @@ The position of the monitor on the virtual desktop, in [screen coordinates](@ref coordinate_systems), can be retrieved with @ref glfwGetMonitorPos. -@code{.c} +```c int xpos, ypos; glfwGetMonitorPos(monitor, &xpos, &ypos); -@endcode +``` ### Work area {#monitor_workarea} @@ -180,10 +180,10 @@ The area of a monitor not occupied by global task bars or menu bars is the work area. This is specified in [screen coordinates](@ref coordinate_systems) and can be retrieved with @ref glfwGetMonitorWorkarea. -@code{.c} +```c int xpos, ypos, width, height; glfwGetMonitorWorkarea(monitor, &xpos, &ypos, &width, &height); -@endcode +``` ### Human-readable name {#monitor_name} @@ -192,9 +192,9 @@ The human-readable, UTF-8 encoded name of a monitor is returned by @ref glfwGetMonitorName. See the reference documentation for the lifetime of the returned string. -@code{.c} +```c const char* name = glfwGetMonitorName(monitor); -@endcode +``` Monitor names are not guaranteed to be unique. Two monitors of the same model and make may have the same name. Only the monitor handle is guaranteed to be @@ -217,7 +217,7 @@ The initial value of the pointer is `NULL`. The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts a monitor handle and a pointer to a @ref GLFWgammaramp structure. -@code{.c} +```c GLFWgammaramp ramp; unsigned short red[256], green[256], blue[256]; @@ -232,7 +232,7 @@ for (i = 0; i < ramp.size; i++) } glfwSetGammaRamp(monitor, &ramp); -@endcode +``` The gamma ramp data is copied before the function returns, so there is no need to keep it around once the ramp has been set. @@ -243,17 +243,17 @@ ramp for that monitor. The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See the reference documentation for the lifetime of the returned structure. -@code{.c} +```c const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor); -@endcode +``` If you wish to set a regular gamma ramp, you can have GLFW calculate it for you from the desired exponent with @ref glfwSetGamma, which in turn calls @ref glfwSetGammaRamp with the resulting ramp. -@code{.c} +```c glfwSetGamma(monitor, 1.0); -@endcode +``` To experiment with gamma correction via the @ref glfwSetGamma function, run the `gamma` test program. diff --git a/docs/moving.md b/docs/moving.md index 86068dbe..ace4ebdf 100644 --- a/docs/moving.md +++ b/docs/moving.md @@ -20,14 +20,14 @@ Unix-like systems, where it uses the [soname](https://en.wikipedia.org/wiki/soname) `libglfw.so.3`. @par Old syntax -@code{.c} +```c #include -@endcode +``` @par New syntax -@code{.c} +```c #include -@endcode +``` ### Removal of threading functions {#moving_threads} @@ -93,14 +93,14 @@ the creation of DLLs and DLL link libraries, as there's no need to explicitly disable `@n` entry point suffixes. @par Old syntax -@code{.c} +```c void GLFWCALL callback_function(...); -@endcode +``` @par New syntax -@code{.c} +```c void callback_function(...); -@endcode +``` ### Window handle parameters {#moving_window_handles} @@ -112,14 +112,14 @@ a newly created window is returned by @ref glfwCreateWindow (formerly [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWwindow. @par Old syntax -@code{.c} +```c glfwSetWindowTitle("New Window Title"); -@endcode +``` @par New syntax -@code{.c} +```c glfwSetWindowTitle(window, "New Window Title"); -@endcode +``` ### Explicit monitor selection {#moving_monitor} @@ -132,14 +132,14 @@ GLFW 2 would have selected, but there are many other [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWmonitor. @par Old basic full screen -@code{.c} +```c glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_FULLSCREEN); -@endcode +``` @par New basic full screen -@code{.c} +```c window = glfwCreateWindow(640, 480, "My Window", glfwGetPrimaryMonitor(), NULL); -@endcode +``` @note The framebuffer bit depth parameters of `glfwOpenWindow` have been turned into [window hints](@ref window_hints), but as they have been given @@ -154,17 +154,17 @@ buffer swap, which acts on a single window, the event processing functions act on all windows at once. @par Old basic main loop -@code{.c} +```c while (...) { // Process input // Render output glfwSwapBuffers(); } -@endcode +``` @par New basic main loop -@code{.c} +```c while (...) { // Process input @@ -172,7 +172,7 @@ while (...) glfwSwapBuffers(window); glfwPollEvents(); } -@endcode +``` ### Explicit context management {#moving_context} @@ -196,16 +196,16 @@ glfwGetFramebufferSize function. A framebuffer size callback has also been added, which can be set with @ref glfwSetFramebufferSizeCallback. @par Old basic viewport setup -@code{.c} +```c glfwGetWindowSize(&width, &height); glViewport(0, 0, width, height); -@endcode +``` @par New basic viewport setup -@code{.c} +```c glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); -@endcode +``` ### Window closing changes {#moving_window_close} @@ -225,20 +225,20 @@ You can query the close flag at any time with @ref glfwWindowShouldClose and set it at any time with @ref glfwSetWindowShouldClose. @par Old basic main loop -@code{.c} +```c while (glfwGetWindowParam(GLFW_OPENED)) { ... } -@endcode +``` @par New basic main loop -@code{.c} +```c while (!glfwWindowShouldClose(window)) { ... } -@endcode +``` The close callback no longer returns a value. Instead, it is called after the close flag has been set, so it can optionally override its value, before @@ -246,14 +246,14 @@ event processing completes. You may however not call @ref glfwDestroyWindow from the close callback (or any other window related callback). @par Old syntax -@code{.c} +```c int GLFWCALL window_close_callback(void); -@endcode +``` @par New syntax -@code{.c} +```c void window_close_callback(GLFWwindow* window); -@endcode +``` @note GLFW never clears the close flag to `GLFW_FALSE`, meaning you can use it for other reasons to close the window as well, for example the user choosing @@ -287,14 +287,14 @@ produce characters with diacritical marks. Even the Swedish keyboard layout requires this for uncommon cases like ü. @par Old syntax -@code{.c} +```c void GLFWCALL character_callback(int character, int action); -@endcode +``` @par New syntax -@code{.c} +```c void character_callback(GLFWwindow* window, int character); -@endcode +``` ### Cursor position changes {#moving_cursorpos} @@ -322,14 +322,14 @@ two-dimensional floating point scroll offsets. This allows you to receive precise scroll data from for example modern touchpads. @par Old syntax -@code{.c} +```c void GLFWCALL mouse_wheel_callback(int position); -@endcode +``` @par New syntax -@code{.c} +```c void scroll_callback(GLFWwindow* window, double xoffset, double yoffset); -@endcode +``` @par Removed functions `glfwGetMouseWheel` @@ -435,15 +435,15 @@ has been moved to GLFW 3, you can request that the GLFW header includes it by defining @ref GLFW_INCLUDE_GLU before the inclusion of the GLFW header. @par Old syntax -@code{.c} +```c #include -@endcode +``` @par New syntax -@code{.c} +```c #define GLFW_INCLUDE_GLU #include -@endcode +``` There are many libraries that offer replacements for the functionality offered by GLU. For the matrix helper functions, see math libraries like diff --git a/docs/news.md b/docs/news.md index 75928860..6cd54cef 100644 --- a/docs/news.md +++ b/docs/news.md @@ -161,11 +161,11 @@ a subdirectory of another CMake project. To enable these, set the @ref GLFW_BUILD_TESTS and @ref GLFW_BUILD_EXAMPLES cache variables before adding the GLFW subdirectory. -@code{.cmake} +```cmake set(GLFW_BUILD_EXAMPLES ON CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS ON CACHE BOOL "" FORCE) add_subdirectory(path/to/glfw) -@endcode +``` #### macOS main menu now created at initialization {#initmenu_34} diff --git a/docs/quick.md b/docs/quick.md index 1ac22e51..f799fc59 100644 --- a/docs/quick.md +++ b/docs/quick.md @@ -19,9 +19,9 @@ behave differently in GLFW 3. In the source files of your application where you use GLFW, you need to include its header file. -@code{.c} +```c #include -@endcode +``` This header provides all the constants, types and function prototypes of the GLFW API. @@ -36,21 +36,21 @@ This example uses files generated by [glad](https://gen.glad.sh/). The GLFW header can detect most such headers if they are included first and will then not include the one from your development environment. -@code{.c} +```c #include #include -@endcode +``` To make sure there will be no header conflicts, you can define @ref GLFW_INCLUDE_NONE before the GLFW header to explicitly disable inclusion of the development environment header. This also allows the two headers to be included in any order. -@code{.c} +```c #define GLFW_INCLUDE_NONE #include #include -@endcode +``` ### Initializing and terminating GLFW {#quick_init_term} @@ -59,21 +59,21 @@ Before you can use most GLFW functions, the library must be initialized. On successful initialization, `GLFW_TRUE` is returned. If an error occurred, `GLFW_FALSE` is returned. -@code{.c} +```c if (!glfwInit()) { // Initialization failed } -@endcode +``` Note that `GLFW_TRUE` and `GLFW_FALSE` are and will always be one and zero. When you are done using GLFW, typically just before the application exits, you need to terminate GLFW. -@code{.c} +```c glfwTerminate(); -@endcode +``` This destroys any remaining windows and releases any other resources allocated by GLFW. After this call, you must initialize GLFW again before using any GLFW @@ -90,21 +90,21 @@ In case a GLFW function fails, an error is reported to the GLFW error callback. You can receive these reports with an error callback. This function must have the signature below but may do anything permitted in other callbacks. -@code{.c} +```c void error_callback(int error, const char* description) { fprintf(stderr, "Error: %s\n", description); } -@endcode +``` Callback functions must be set, so GLFW knows to call them. The function to set the error callback is one of the few GLFW functions that may be called before initialization, which lets you be notified of errors both during and after initialization. -@code{.c} +```c glfwSetErrorCallback(error_callback); -@endcode +``` ### Creating a window and context {#quick_create_window} @@ -113,13 +113,13 @@ The window and its OpenGL context are created with a single call to @ref glfwCreateWindow, which returns a handle to the created combined window and context object -@code{.c} +```c GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); if (!window) { // Window or OpenGL context creation failed } -@endcode +``` This creates a 640 by 480 windowed mode window with an OpenGL context. If window or OpenGL context creation fails, `NULL` will be returned. You should @@ -136,7 +136,7 @@ You can select the OpenGL profile by setting the `GLFW_OPENGL_PROFILE` hint. This program uses the core profile as that is the only profile macOS supports for OpenGL 3.x and 4.x. -@code{.c} +```c glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); @@ -145,13 +145,13 @@ if (!window) { // Window or context creation failed } -@endcode +``` When a window and context is no longer needed, destroy it. -@code{.c} +```c glfwDestroyWindow(window); -@endcode +``` Once this function is called, no more events will be delivered for that window and its handle becomes invalid. @@ -161,9 +161,9 @@ and its handle becomes invalid. Before you can use the OpenGL API, you must have a current OpenGL context. -@code{.c} +```c glfwMakeContextCurrent(window); -@endcode +``` The context will remain current until you make another context current or until the window owning the current context is destroyed. @@ -174,9 +174,9 @@ a current context to load from. This example uses [glad](https://github.com/Dav1dde/glad), but the same rule applies to all such libraries. -@code{.c} +```c gladLoadGL(glfwGetProcAddress); -@endcode +``` ### Checking the window close flag {#quick_window_close} @@ -189,12 +189,12 @@ Note that __the window isn't actually closed__, so you are expected to monitor this flag and either destroy the window or give some kind of feedback to the user. -@code{.c} +```c while (!glfwWindowShouldClose(window)) { // Keep running } -@endcode +``` You can be notified when the user is attempting to close the window by setting a close callback with @ref glfwSetWindowCloseCallback. The callback will be @@ -211,19 +211,19 @@ Each window has a large number of callbacks that can be set to receive all the various kinds of events. To receive key press and release events, create a key callback function. -@code{.c} +```c static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GLFW_TRUE); } -@endcode +``` The key callback, like other window related callbacks, are set per-window. -@code{.c} +```c glfwSetKeyCallback(window, key_callback); -@endcode +``` In order for event callbacks to be called when events occur, you need to process events as described below. @@ -235,11 +235,11 @@ Once you have a current OpenGL context, you can use OpenGL normally. In this tutorial, a multicolored rotating triangle will be rendered. The framebuffer size needs to be retrieved for `glViewport`. -@code{.c} +```c int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); -@endcode +``` You can also set a framebuffer size callback using @ref glfwSetFramebufferSizeCallback and be notified when the size changes. @@ -263,9 +263,9 @@ returns the number of seconds since initialization. The time source used is the most accurate on each platform and generally has micro- or nanosecond resolution. -@code{.c} +```c double time = glfwGetTime(); -@endcode +``` ### Swapping buffers {#quick_swap_buffers} @@ -277,9 +277,9 @@ the one being displayed and the back buffer the one you render to. When the entire frame has been rendered, the buffers need to be swapped with one another, so the back buffer becomes the front buffer and vice versa. -@code{.c} +```c glfwSwapBuffers(window); -@endcode +``` The swap interval indicates how many frames to wait until swapping the buffers, commonly known as _vsync_. By default, the swap interval is zero, meaning @@ -294,9 +294,9 @@ For these reasons, applications will typically want to set the swap interval to one. It can be set to higher values, but this is usually not recommended, because of the input latency it leads to. -@code{.c} +```c glfwSwapInterval(1); -@endcode +``` This function acts on the current context and will fail unless a context is current. @@ -313,9 +313,9 @@ There are two methods for processing pending events; polling and waiting. This example will use event polling, which processes only those events that have already been received and then returns immediately. -@code{.c} +```c glfwPollEvents(); -@endcode +``` This is the best choice when rendering continually, like most games do. If instead you only need to update your rendering once you have received new input, diff --git a/docs/vulkan.md b/docs/vulkan.md index b96e4c61..5eb2771e 100644 --- a/docs/vulkan.md +++ b/docs/vulkan.md @@ -43,9 +43,9 @@ you will need to direct GLFW to it. Pass your version of `vkGetInstanceProcAddr glfwInitVulkanLoader before initializing GLFW and it will use that function for all Vulkan entry point retrieval. This prevents GLFW from dynamically loading the Vulkan loader. -@code{.c} +```c glfwInitVulkanLoader(vkGetInstanceProcAddr); -@endcode +``` @macos To make your application be redistributable you will need to set up the application bundle according to the LunarG SDK documentation. This is explained in more detail in the @@ -57,18 +57,18 @@ bundle according to the LunarG SDK documentation. This is explained in more det To have GLFW include the Vulkan header, define @ref GLFW_INCLUDE_VULKAN before including the GLFW header. -@code{.c} +```c #define GLFW_INCLUDE_VULKAN #include -@endcode +``` If you instead want to include the Vulkan header from a custom location or use your own custom Vulkan header then do this before the GLFW header. -@code{.c} +```c #include #include -@endcode +``` Unless a Vulkan header is included, either by the GLFW header or above it, the following GLFW functions will not be declared, as depend on Vulkan types. @@ -92,12 +92,12 @@ If you are loading the Vulkan loader dynamically instead of linking directly against it, you can check for the availability of a loader and ICD with @ref glfwVulkanSupported. -@code{.c} +```c if (glfwVulkanSupported()) { // Vulkan is available, at least for compute } -@endcode +``` This function returns `GLFW_TRUE` if the Vulkan loader and any minimally functional ICD was found. @@ -112,18 +112,18 @@ To load any Vulkan core or extension function from the found loader, call @ref glfwGetInstanceProcAddress. To load functions needed for instance creation, pass `NULL` as the instance. -@code{.c} +```c PFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance) glfwGetInstanceProcAddress(NULL, "vkCreateInstance"); -@endcode +``` Once you have created an instance, you can load from it all other Vulkan core functions and functions from any instance extensions you enabled. -@code{.c} +```c PFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice) glfwGetInstanceProcAddress(instance, "vkCreateDevice"); -@endcode +``` This function in turn calls `vkGetInstanceProcAddr`. If that fails, the function falls back to a platform-specific query of the Vulkan loader (i.e. @@ -135,10 +135,10 @@ Vulkan also provides `vkGetDeviceProcAddr` for loading device-specific versions of Vulkan function. This function can be retrieved from an instance with @ref glfwGetInstanceProcAddress. -@code{.c} +```c PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr"); -@endcode +``` Device-specific functions may execute a little faster, due to not having to dispatch internally based on the device passed to them. For more information @@ -154,10 +154,10 @@ GLFW requires to create Vulkan surfaces. To query the instance extensions required, call @ref glfwGetRequiredInstanceExtensions. -@code{.c} +```c uint32_t count; const char** extensions = glfwGetRequiredInstanceExtensions(&count); -@endcode +``` These extensions must all be enabled when creating instances that are going to be passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref @@ -172,14 +172,14 @@ If successful the returned array will always include `VK_KHR_surface`, so if you don't require any additional extensions you can pass this list directly to the `VkInstanceCreateInfo` struct. -@code{.c} +```c VkInstanceCreateInfo ici; memset(&ici, 0, sizeof(ici)); ici.enabledExtensionCount = count; ici.ppEnabledExtensionNames = extensions; ... -@endcode +``` Additional extensions may be required by future versions of GLFW. You should check whether any extensions you wish to enable are already in the returned @@ -201,12 +201,12 @@ To check whether a specific queue family of a physical device supports image presentation without first having to create a window and surface, call @ref glfwGetPhysicalDevicePresentationSupport. -@code{.c} +```c if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index)) { // Queue family supports image presentation } -@endcode +``` The `VK_KHR_surface` extension additionally provides the `vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on @@ -219,10 +219,10 @@ Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan, there is no need to create a context. You can disable context creation with the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint. -@code{.c} +```c glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); GLFWwindow* window = glfwCreateWindow(640, 480, "Window Title", NULL, NULL); -@endcode +``` See @ref context_less for more information. @@ -232,14 +232,14 @@ See @ref context_less for more information. You can create a Vulkan surface (as defined by the `VK_KHR_surface` extension) for a GLFW window with @ref glfwCreateWindowSurface. -@code{.c} +```c VkSurfaceKHR surface; VkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface); if (err) { // Window surface creation failed } -@endcode +``` If an OpenGL or OpenGL ES context was created on the window, the context has ownership of the presentation on the window and a Vulkan surface cannot be diff --git a/docs/window.md b/docs/window.md index e3c8f7a9..437c1f7e 100644 --- a/docs/window.md +++ b/docs/window.md @@ -30,9 +30,9 @@ A window and its OpenGL or OpenGL ES context are created with @ref glfwCreateWindow, which returns a handle to the created window object. For example, this creates a 640 by 480 windowed mode window: -@code{.c} +```c GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); -@endcode +``` If window creation fails, `NULL` will be returned, so it is necessary to check the return value. @@ -48,9 +48,9 @@ To create a full screen window, you need to specify which monitor the window should use. In most cases, the user's primary monitor is a good choice. For more information about retrieving monitors, see @ref monitor_monitors. -@code{.c} +```c GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL); -@endcode +``` Full screen windows cover the entire display area of a monitor, have no border or decorations. @@ -99,7 +99,7 @@ switching much smoother. This is sometimes called _windowed full screen_ or _borderless full screen_ window and counts as a full screen window. To create such a window, request the current video mode. -@code{.c} +```c const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwWindowHint(GLFW_RED_BITS, mode->redBits); @@ -108,15 +108,15 @@ glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits); glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate); GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "My Title", monitor, NULL); -@endcode +``` This also works for windowed mode windows that are made full screen. -@code{.c} +```c const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate); -@endcode +``` Note that @ref glfwGetVideoMode returns the _current_ video mode of a monitor, so if you already have a full screen window on that monitor that you want to @@ -127,9 +127,9 @@ make windowed full screen, you need to have saved the desktop resolution before. When a window is no longer needed, destroy it with @ref glfwDestroyWindow. -@code{.c} +```c glfwDestroyWindow(window); -@endcode +``` Window destruction always succeeds. Before the actual destruction, all callbacks are removed so no further events will be delivered for the window. @@ -596,7 +596,7 @@ The current state of the close flag is returned by @ref glfwWindowShouldClose and can be set or cleared directly with @ref glfwSetWindowShouldClose. A common pattern is to use the close flag as a main loop condition. -@code{.c} +```c while (!glfwWindowShouldClose(window)) { render(window); @@ -604,26 +604,26 @@ while (!glfwWindowShouldClose(window)) glfwSwapBuffers(window); glfwPollEvents(); } -@endcode +``` If you wish to be notified when the user attempts to close a window, set a close callback. -@code{.c} +```c glfwSetWindowCloseCallback(window, window_close_callback); -@endcode +``` The callback function is called directly _after_ the close flag has been set. It can be used for example to filter close requests and clear the close flag again unless certain conditions are met. -@code{.c} +```c void window_close_callback(GLFWwindow* window) { if (!time_to_close) glfwSetWindowShouldClose(window, GLFW_FALSE); } -@endcode +``` ### Window size {#window_size} @@ -633,9 +633,9 @@ mode windows, this sets the size, in [screen coordinates](@ref coordinate_systems) of the _content area_ or _content area_ of the window. The window system may impose limits on window size. -@code{.c} +```c glfwSetWindowSize(window, 640, 480); -@endcode +``` For full screen windows, the specified size becomes the new resolution of the window's desired video mode. The video mode most closely matching the new @@ -645,26 +645,26 @@ resolution of the set video mode. If you wish to be notified when a window is resized, whether by the user, the system or your own code, set a size callback. -@code{.c} +```c glfwSetWindowSizeCallback(window, window_size_callback); -@endcode +``` The callback function receives the new size, in screen coordinates, of the content area of the window when the window is resized. -@code{.c} +```c void window_size_callback(GLFWwindow* window, int width, int height) { } -@endcode +``` There is also @ref glfwGetWindowSize for directly retrieving the current size of a window. -@code{.c} +```c int width, height; glfwGetWindowSize(window, &width, &height); -@endcode +``` @note Do not pass the window size to `glViewport` or other pixel-based OpenGL calls. The window size is in screen coordinates, not pixels. Use the @@ -675,10 +675,10 @@ The above functions work with the size of the content area, but decorated windows typically have title bars and window frames around this rectangle. You can retrieve the extents of these with @ref glfwGetWindowFrameSize. -@code{.c} +```c int left, top, right, bottom; glfwGetWindowFrameSize(window, &left, &top, &right, &bottom); -@endcode +``` The returned values are the distances, in screen coordinates, from the edges of the content area to the corresponding edges of the full window. As they are @@ -696,28 +696,28 @@ pixels, of the framebuffer of a window. If you wish to be notified when the framebuffer of a window is resized, whether by the user or the system, set a size callback. -@code{.c} +```c glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); -@endcode +``` The callback function receives the new size of the framebuffer when it is resized, which can for example be used to update the OpenGL viewport. -@code{.c} +```c void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } -@endcode +``` There is also @ref glfwGetFramebufferSize for directly retrieving the current size of the framebuffer of a window. -@code{.c} +```c int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); -@endcode +``` The size of a framebuffer may change independently of the size of a window, for example if the window is dragged between a regular monitor and a high-DPI one. @@ -728,10 +728,10 @@ example if the window is dragged between a regular monitor and a high-DPI one. The content scale for a window can be retrieved with @ref glfwGetWindowContentScale. -@code{.c} +```c float xscale, yscale; glfwGetWindowContentScale(window, &xscale, &yscale); -@endcode +``` The content scale is the ratio between the current DPI and the platform's default DPI. This is especially important for text and any UI elements. If the @@ -748,18 +748,18 @@ If you wish to be notified when the content scale of a window changes, whether because of a system setting change or because it was moved to a monitor with a different scale, set a content scale callback. -@code{.c} +```c glfwSetWindowContentScaleCallback(window, window_content_scale_callback); -@endcode +``` The callback function receives the new content scale of the window. -@code{.c} +```c void window_content_scale_callback(GLFWwindow* window, float xscale, float yscale) { set_interface_scale(xscale, yscale); } -@endcode +``` On platforms where pixels and screen coordinates always map 1:1, the window will need to be resized to appear the same size when it is moved to a monitor @@ -775,16 +775,16 @@ be enforced with @ref glfwSetWindowSizeLimits. The user may resize the window to any size and aspect ratio within the specified limits, unless the aspect ratio is also set. -@code{.c} +```c glfwSetWindowSizeLimits(window, 200, 200, 400, 400); -@endcode +``` To specify only a minimum size or only a maximum one, set the other pair to `GLFW_DONT_CARE`. -@code{.c} +```c glfwSetWindowSizeLimits(window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE); -@endcode +``` To disable size limits for a window, set them all to `GLFW_DONT_CARE`. @@ -793,19 +793,19 @@ with @ref glfwSetWindowAspectRatio. The user may resize the window freely unless size limits are also set, but the size will be constrained to maintain the aspect ratio. -@code{.c} +```c glfwSetWindowAspectRatio(window, 16, 9); -@endcode +``` The aspect ratio is specified as a numerator and denominator, corresponding to the width and height, respectively. If you want a window to maintain its current aspect ratio, use its current size as the ratio. -@code{.c} +```c int width, height; glfwGetWindowSize(window, &width, &height); glfwSetWindowAspectRatio(window, width, height); -@endcode +``` To disable the aspect ratio limit for a window, set both terms to `GLFW_DONT_CARE`. @@ -822,10 +822,10 @@ This is most often the right choice. If you need to create a window at a specific position, you can set the desired position with the @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints. -@code{.c} +```c glfwWindowHint(GLFW_POSITION_X, 70); glfwWindowHint(GLFW_POSITION_Y, 83); -@endcode +``` To restore the previous behavior, set these hints to `GLFW_ANY_POSITION`. @@ -834,33 +834,33 @@ glfwSetWindowPos. This moves the window so that the upper-left corner of its content area has the specified [screen coordinates](@ref coordinate_systems). The window system may put limitations on window placement. -@code{.c} +```c glfwSetWindowPos(window, 100, 100); -@endcode +``` If you wish to be notified when a window is moved, whether by the user, the system or your own code, set a position callback. -@code{.c} +```c glfwSetWindowPosCallback(window, window_pos_callback); -@endcode +``` The callback function receives the new position, in screen coordinates, of the upper-left corner of the content area when the window is moved. -@code{.c} +```c void window_pos_callback(GLFWwindow* window, int xpos, int ypos) { } -@endcode +``` There is also @ref glfwGetWindowPos for directly retrieving the current position of the content area of the window. -@code{.c} +```c int xpos, ypos; glfwGetWindowPos(window, &xpos, &ypos); -@endcode +``` ### Window title {#window_title} @@ -869,9 +869,9 @@ All GLFW windows have a title, although undecorated or full screen windows may not display it or only display it in a task bar or similar interface. You can set a UTF-8 encoded window title with @ref glfwSetWindowTitle. -@code{.c} +```c glfwSetWindowTitle(window, "My Window"); -@endcode +``` The specified string is copied before the function returns, so there is no need to keep it around. @@ -879,15 +879,15 @@ to keep it around. As long as your source file is encoded as UTF-8, you can use any Unicode characters directly in the source. -@code{.c} +```c glfwSetWindowTitle(window, "ラストエグザイル"); -@endcode +``` If you are using C++11 or C11, you can use a UTF-8 string literal. -@code{.c} +```c glfwSetWindowTitle(window, u8"This is always a UTF-8 string"); -@endcode +``` ### Window icon {#window_icon} @@ -895,13 +895,13 @@ glfwSetWindowTitle(window, u8"This is always a UTF-8 string"); Decorated windows have icons on some platforms. You can set this icon by specifying a list of candidate images with @ref glfwSetWindowIcon. -@code{.c} +```c GLFWimage images[2]; images[0] = load_icon("my_icon.png"); images[1] = load_icon("my_icon_small.png"); glfwSetWindowIcon(window, 2, images); -@endcode +``` The image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits per channel with the red channel first. The pixels are arranged canonically as @@ -909,9 +909,9 @@ sequential rows, starting from the top-left corner. To revert to the default window icon, pass in an empty image array. -@code{.c} +```c glfwSetWindowIcon(window, 0, NULL); -@endcode +``` ### Window monitor {#window_monitor} @@ -919,9 +919,9 @@ glfwSetWindowIcon(window, 0, NULL); Full screen windows are associated with a specific monitor. You can get the handle for this monitor with @ref glfwGetWindowMonitor. -@code{.c} +```c GLFWmonitor* monitor = glfwGetWindowMonitor(window); -@endcode +``` This monitor handle is one of those returned by @ref glfwGetMonitors. @@ -933,18 +933,18 @@ with @ref glfwSetWindowMonitor. When making a window full screen on the same or on a different monitor, specify the desired monitor, resolution and refresh rate. The position arguments are ignored. -@code{.c} +```c const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate); -@endcode +``` When making the window windowed, specify the desired position and size. The refresh rate argument is ignored. -@code{.c} +```c glfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0); -@endcode +``` This restores any previous window settings such as whether it is decorated, floating, resizable, has size or aspect ratio limits, etc.. To restore a window @@ -956,9 +956,9 @@ before making it full screen and then pass them in as above. Windows can be iconified (i.e. minimized) with @ref glfwIconifyWindow. -@code{.c} +```c glfwIconifyWindow(window); -@endcode +``` When a full screen window is iconified, the original video mode of its monitor is restored until the user or application restores the window. @@ -966,9 +966,9 @@ is restored until the user or application restores the window. Iconified windows can be restored with @ref glfwRestoreWindow. This function also restores windows from maximization. -@code{.c} +```c glfwRestoreWindow(window); -@endcode +``` When a full screen window is restored, the desired video mode is restored to its monitor as well. @@ -976,13 +976,13 @@ monitor as well. If you wish to be notified when a window is iconified or restored, whether by the user, system or your own code, set an iconify callback. -@code{.c} +```c glfwSetWindowIconifyCallback(window, window_iconify_callback); -@endcode +``` The callback function receives changes in the iconification state of the window. -@code{.c} +```c void window_iconify_callback(GLFWwindow* window, int iconified) { if (iconified) @@ -994,22 +994,22 @@ void window_iconify_callback(GLFWwindow* window, int iconified) // The window was restored } } -@endcode +``` You can also get the current iconification state with @ref glfwGetWindowAttrib. -@code{.c} +```c int iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED); -@endcode +``` ### Window maximization {#window_maximize} Windows can be maximized (i.e. zoomed) with @ref glfwMaximizeWindow. -@code{.c} +```c glfwMaximizeWindow(window); -@endcode +``` Full screen windows cannot be maximized and passing a full screen window to this function does nothing. @@ -1017,20 +1017,20 @@ function does nothing. Maximized windows can be restored with @ref glfwRestoreWindow. This function also restores windows from iconification. -@code{.c} +```c glfwRestoreWindow(window); -@endcode +``` If you wish to be notified when a window is maximized or restored, whether by the user, system or your own code, set a maximize callback. -@code{.c} +```c glfwSetWindowMaximizeCallback(window, window_maximize_callback); -@endcode +``` The callback function receives changes in the maximization state of the window. -@code{.c} +```c void window_maximize_callback(GLFWwindow* window, int maximized) { if (maximized) @@ -1042,30 +1042,30 @@ void window_maximize_callback(GLFWwindow* window, int maximized) // The window was restored } } -@endcode +``` You can also get the current maximization state with @ref glfwGetWindowAttrib. -@code{.c} +```c int maximized = glfwGetWindowAttrib(window, GLFW_MAXIMIZED); -@endcode +``` By default, newly created windows are not maximized. You can change this behavior by setting the [GLFW_MAXIMIZED](@ref GLFW_MAXIMIZED_hint) window hint before creating the window. -@code{.c} +```c glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); -@endcode +``` ### Window visibility {#window_hide} Windowed mode windows can be hidden with @ref glfwHideWindow. -@code{.c} +```c glfwHideWindow(window); -@endcode +``` This makes the window completely invisible to the user, including removing it from the task bar, dock or window list. Full screen windows cannot be hidden @@ -1073,9 +1073,9 @@ and calling @ref glfwHideWindow on a full screen window does nothing. Hidden windows can be shown with @ref glfwShowWindow. -@code{.c} +```c glfwShowWindow(window); -@endcode +``` By default, this function will also set the input focus to that window. Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint to change @@ -1084,17 +1084,17 @@ existing window with @ref glfwSetWindowAttrib. You can also get the current visibility state with @ref glfwGetWindowAttrib. -@code{.c} +```c int visible = glfwGetWindowAttrib(window, GLFW_VISIBLE); -@endcode +``` By default, newly created windows are visible. You can change this behavior by setting the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint before creating the window. -@code{.c} +```c glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); -@endcode +``` Windows created hidden are completely invisible to the user until shown. This can be useful if you need to set up your window further before showing it, for @@ -1106,9 +1106,9 @@ example moving it to a specific location. Windows can be given input focus and brought to the front with @ref glfwFocusWindow. -@code{.c} +```c glfwFocusWindow(window); -@endcode +``` Keep in mind that it can be very disruptive to the user when a window is forced to the top. For a less disruptive way of getting the user's attention, see @@ -1117,13 +1117,13 @@ to the top. For a less disruptive way of getting the user's attention, see If you wish to be notified when a window gains or loses input focus, whether by the user, system or your own code, set a focus callback. -@code{.c} +```c glfwSetWindowFocusCallback(window, window_focus_callback); -@endcode +``` The callback function receives changes in the input focus state of the window. -@code{.c} +```c void window_focus_callback(GLFWwindow* window, int focused) { if (focused) @@ -1135,21 +1135,21 @@ void window_focus_callback(GLFWwindow* window, int focused) // The window lost input focus } } -@endcode +``` You can also get the current input focus state with @ref glfwGetWindowAttrib. -@code{.c} +```c int focused = glfwGetWindowAttrib(window, GLFW_FOCUSED); -@endcode +``` By default, newly created windows are given input focus. You can change this behavior by setting the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) window hint before creating the window. -@code{.c} +```c glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE); -@endcode +``` ### Window attention request {#window_attention} @@ -1157,9 +1157,9 @@ glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE); If you wish to notify the user of an event without interrupting, you can request attention with @ref glfwRequestWindowAttention. -@code{.c} +```c glfwRequestWindowAttention(window); -@endcode +``` The system will highlight the specified window, or on platforms where this is not supported, the application as a whole. Once the user has given it @@ -1171,20 +1171,20 @@ attention, the system will automatically end the request. If you wish to be notified when the contents of a window is damaged and needs to be refreshed, set a window refresh callback. -@code{.c} +```c glfwSetWindowRefreshCallback(m_handle, window_refresh_callback); -@endcode +``` The callback function is called when the contents of the window needs to be refreshed. -@code{.c} +```c void window_refresh_callback(GLFWwindow* window) { draw_editor_ui(window); glfwSwapBuffers(window); } -@endcode +``` @note On compositing window systems such as Aero, Compiz or Aqua, where the window contents are saved off-screen, this callback might only be called when @@ -1205,9 +1205,9 @@ Window framebuffers can be made transparent on a per-pixel per-frame basis with the [GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) window hint. -@code{.c} +```c glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); -@endcode +``` If supported by the system, the window content area will be composited with the background using the framebuffer per-pixel alpha channel. This requires desktop @@ -1218,21 +1218,21 @@ with the [GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib) window attribute. -@code{.c} +```c if (glfwGetWindowAttrib(window, GLFW_TRANSPARENT_FRAMEBUFFER)) { // window framebuffer is currently transparent } -@endcode +``` GLFW comes with an example that enabled framebuffer transparency called `gears`. The opacity of the whole window, including any decorations, can be set with @ref glfwSetWindowOpacity. -@code{.c} +```c glfwSetWindowOpacity(window, 0.5f); -@endcode +``` The opacity (or alpha) value is a positive finite number between zero and one, where 0 (zero) is fully transparent and 1 (one) is fully opaque. The initial @@ -1240,9 +1240,9 @@ opacity value for newly created windows is 1. The current opacity of a window can be queried with @ref glfwGetWindowOpacity. -@code{.c} +```c float opacity = glfwGetWindowOpacity(window); -@endcode +``` If the system does not support whole window transparency, this function always returns one. @@ -1263,12 +1263,12 @@ interaction, (e.g. whether it has input focus), while others reflect inherent properties of the window (e.g. what kind of border it has). Some are related to the window and others to its OpenGL or OpenGL ES context. -@code{.c} +```c if (glfwGetWindowAttrib(window, GLFW_FOCUSED)) { // window has input focus } -@endcode +``` The [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), @@ -1277,9 +1277,9 @@ The [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib) window attributes can be changed with @ref glfwSetWindowAttrib. -@code{.c} +```c glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE); -@endcode +``` @@ -1463,18 +1463,18 @@ When the entire frame has been rendered, it is time to swap the back and the front buffers in order to display what has been rendered and begin rendering a new frame. This is done with @ref glfwSwapBuffers. -@code{.c} +```c glfwSwapBuffers(window); -@endcode +``` Sometimes it can be useful to select when the buffer swap will occur. With the function @ref glfwSwapInterval it is possible to select the minimum number of monitor refreshes the driver should wait from the time @ref glfwSwapBuffers was called before swapping the buffers: -@code{.c} +```c glfwSwapInterval(1); -@endcode +``` If the interval is zero, the swap will take place immediately when @ref glfwSwapBuffers is called without waiting for a refresh. Otherwise at least