mirror of
https://github.com/gwm17/glfw.git
synced 2025-04-12 11:38:49 -04:00
Compare commits
No commits in common. "master" and "3.2" have entirely different histories.
|
@ -1,47 +1,22 @@
|
||||||
image:
|
|
||||||
- Visual Studio 2015
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- ci
|
- ci
|
||||||
- master
|
- master
|
||||||
- latest
|
|
||||||
- 3.3-stable
|
|
||||||
skip_tags: true
|
skip_tags: true
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- GENERATOR: MinGW Makefiles
|
- BUILD_SHARED_LIBS: ON
|
||||||
BUILD_SHARED_LIBS: ON
|
- BUILD_SHARED_LIBS: OFF
|
||||||
CFLAGS: -Werror
|
|
||||||
- GENERATOR: MinGW Makefiles
|
|
||||||
BUILD_SHARED_LIBS: OFF
|
|
||||||
CFLAGS: -Werror
|
|
||||||
- GENERATOR: Visual Studio 10 2010
|
|
||||||
BUILD_SHARED_LIBS: ON
|
|
||||||
CFLAGS: /WX
|
|
||||||
- GENERATOR: Visual Studio 10 2010
|
|
||||||
BUILD_SHARED_LIBS: OFF
|
|
||||||
CFLAGS: /WX
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
for:
|
build_script:
|
||||||
-
|
- mkdir build
|
||||||
matrix:
|
- cd build
|
||||||
only:
|
- cmake -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% ..
|
||||||
- GENERATOR: MinGW Makefiles
|
- cmake --build .
|
||||||
build_script:
|
|
||||||
- set PATH=%PATH:C:\Program Files\Git\usr\bin=C:\MinGW\bin%
|
|
||||||
- cmake -S . -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
|
||||||
- cmake --build build
|
|
||||||
-
|
|
||||||
matrix:
|
|
||||||
only:
|
|
||||||
- GENERATOR: Visual Studio 10 2010
|
|
||||||
build_script:
|
|
||||||
- cmake -S . -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
|
||||||
- cmake --build build --target glfw
|
|
||||||
notifications:
|
notifications:
|
||||||
- provider: Email
|
- provider: Email
|
||||||
to:
|
to:
|
||||||
- ci@glfw.org
|
- ci@glfw.org
|
||||||
on_build_failure: true
|
- on_build_failure: true
|
||||||
on_build_success: false
|
- on_build_success: false
|
||||||
|
|
5
.gitattributes
vendored
5
.gitattributes
vendored
|
@ -1,5 +0,0 @@
|
||||||
*.m linguist-language=Objective-C
|
|
||||||
.gitignore export-ignore
|
|
||||||
.gitattributes export-ignore
|
|
||||||
.travis.yml export-ignore
|
|
||||||
.appveyor.yml export-ignore
|
|
10
.github/CODEOWNERS
vendored
10
.github/CODEOWNERS
vendored
|
@ -1,10 +0,0 @@
|
||||||
|
|
||||||
* @elmindreda
|
|
||||||
|
|
||||||
src/wl_* @linkmauve
|
|
||||||
|
|
||||||
docs/*.css @glfw/webdev
|
|
||||||
docs/*.scss @glfw/webdev
|
|
||||||
docs/*.html @glfw/webdev
|
|
||||||
docs/*.xml @glfw/webdev
|
|
||||||
|
|
106
.github/CONTRIBUTING.md
vendored
Normal file
106
.github/CONTRIBUTING.md
vendored
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
# Contribution Guide
|
||||||
|
|
||||||
|
This file is a work in progress and you can report errors or submit patches for
|
||||||
|
it the same as any other file.
|
||||||
|
|
||||||
|
|
||||||
|
## Reporting a bug
|
||||||
|
|
||||||
|
If GLFW is behaving unexpectedly, make sure you have set an error callback.
|
||||||
|
GLFW will often tell you the cause of an issue via this callback.
|
||||||
|
|
||||||
|
If GLFW is crashing or triggering asserts, make sure that all your object
|
||||||
|
handles and other pointers are valid.
|
||||||
|
|
||||||
|
Always include the __operating system name and version__ (i.e. `Windows
|
||||||
|
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
||||||
|
include the __GLFW release version__ (i.e. `3.1.2`), otherwise include the
|
||||||
|
__GLFW commit ID__ (i.e. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
||||||
|
If possible, please also include the __GLFW version string__ (`3.2.0 X11 EGL
|
||||||
|
clock_gettime /dev/js XI Xf86vm`), as described
|
||||||
|
[here](http://www.glfw.org/docs/latest/intro.html#intro_version_string).
|
||||||
|
|
||||||
|
|
||||||
|
### Reporting a compile or link bug
|
||||||
|
|
||||||
|
__Note:__ GLFW needs many system APIs to do its job. See the [Building
|
||||||
|
applications](http://www.glfw.org/docs/latest/build.html) guide for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
In addition to the information above, always include the complete build log from
|
||||||
|
your compiler and linker. Issue posts are editable so it can always be
|
||||||
|
shortened later.
|
||||||
|
|
||||||
|
|
||||||
|
### Reporting a context creation bug
|
||||||
|
|
||||||
|
__Note:__ Windows ships with graphics drivers that do not support OpenGL. If
|
||||||
|
GLFW says that your machine lacks support for OpenGL, it very likely does.
|
||||||
|
Install drivers from the computer manufacturer or graphics card manufacturer
|
||||||
|
([Nvidia](http://www.geforce.com/drivers),
|
||||||
|
[AMD](http://support.amd.com/en-us/download),
|
||||||
|
[Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to
|
||||||
|
fix this.
|
||||||
|
|
||||||
|
__Note:__ AMD only supports OpenGL ES on Windows via EGL. EGL support is not
|
||||||
|
enabled in GLFW by default. You need to [enable EGL when
|
||||||
|
compiling](http://www.glfw.org/docs/latest/compile.html) GLFW to use this.
|
||||||
|
|
||||||
|
The `glfwinfo` tool is included in the GLFW source tree as `tests/glfwinfo.c`
|
||||||
|
and is built along with the library. It lets you request any kind of context
|
||||||
|
and framebuffer format supported by the GLFW API without having to recompile.
|
||||||
|
If context creation fails in your application, please verify that it also fails
|
||||||
|
with this tool before reporting it as a bug.
|
||||||
|
|
||||||
|
In addition to the information above (OS and GLFW version), always include the
|
||||||
|
__GPU model and driver version__ (i.e. `GeForce GTX660 with 352.79`) when
|
||||||
|
reporting this kind of bug.
|
||||||
|
|
||||||
|
|
||||||
|
### Reporting a monitor or video mode bug
|
||||||
|
|
||||||
|
__Note:__ On headless systems on some platforms, no monitors are reported. This
|
||||||
|
causes glfwGetPrimaryMonitor to return `NULL`, which not all applications are
|
||||||
|
prepared for.
|
||||||
|
|
||||||
|
__Note:__ Some third-party tools report more video modes than those approved of
|
||||||
|
by the OS. For safety and compatbility, GLFW only reports video modes the OS
|
||||||
|
wants programs to use. This is not a bug.
|
||||||
|
|
||||||
|
The `monitors` tool is included in the GLFW source tree as `tests/monitors.c`
|
||||||
|
and is built along with the library. lists all information about connected
|
||||||
|
monitors made available by GLFW.
|
||||||
|
|
||||||
|
In addition to the information above (OS and GLFW version), please also include
|
||||||
|
the output of the `monitors` tool when reporting this kind of bug. If it
|
||||||
|
doesn't work at all, please mention this.
|
||||||
|
|
||||||
|
|
||||||
|
### Reporting a window event bug
|
||||||
|
|
||||||
|
__Note:__ While GLFW tries to provide the exact same behavior between platforms,
|
||||||
|
the exact ordering of related window events will sometimes differ.
|
||||||
|
|
||||||
|
The `events` tool is included in the GLFW source tree as `tests/events.c` and is
|
||||||
|
built along with the library. It prints all information provided to every
|
||||||
|
callback supported by GLFW as events occur. Each event is listed with the time
|
||||||
|
and a unique number to make discussions about event logs easier. The tool has
|
||||||
|
command-line options for creating multiple windows and full screen windows.
|
||||||
|
|
||||||
|
|
||||||
|
### Reporting a documentation bug
|
||||||
|
|
||||||
|
If you found the error in the generated documentation then it's fine to just
|
||||||
|
link to that webpage. You don't need to figure out which documentation source
|
||||||
|
file the text comes from.
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing a bug fix
|
||||||
|
|
||||||
|
There should be text here, but there isn't.
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing a feature
|
||||||
|
|
||||||
|
This is not (yet) the text you are looking for.
|
||||||
|
|
94
.github/workflows/build.yml
vendored
94
.github/workflows/build.yml
vendored
|
@ -1,94 +0,0 @@
|
||||||
name: Build
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches: [ ci, master, latest, 3.3-stable ]
|
|
||||||
workflow_dispatch:
|
|
||||||
permissions:
|
|
||||||
statuses: write
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-linux-x11-clang:
|
|
||||||
name: X11 (Linux, Clang)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
CC: clang
|
|
||||||
CFLAGS: -Werror
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev
|
|
||||||
|
|
||||||
- name: Configure static library
|
|
||||||
run: cmake -S . -B build-static
|
|
||||||
- name: Build static library
|
|
||||||
run: cmake --build build-static --parallel
|
|
||||||
|
|
||||||
- name: Configure shared library
|
|
||||||
run: cmake -S . -B build-shared -D BUILD_SHARED_LIBS=ON
|
|
||||||
- name: Build shared library
|
|
||||||
run: cmake --build build-shared --parallel
|
|
||||||
|
|
||||||
build-linux-full-clang:
|
|
||||||
name: X11+Wayland (Linux, Clang)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
CC: clang
|
|
||||||
CFLAGS: -Werror
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev wayland-protocols libwayland-dev libxkbcommon-dev
|
|
||||||
|
|
||||||
- name: Configure static library
|
|
||||||
run: cmake -S . -B build-static -D GLFW_BUILD_WAYLAND=ON
|
|
||||||
- name: Build static library
|
|
||||||
run: cmake --build build-static --parallel
|
|
||||||
|
|
||||||
- name: Configure shared library
|
|
||||||
run: cmake -S . -B build-shared -D GLFW_BUILD_WAYLAND=ON -D BUILD_SHARED_LIBS=ON
|
|
||||||
- name: Build shared library
|
|
||||||
run: cmake --build build-shared --parallel
|
|
||||||
|
|
||||||
build-macos-cocoa-clang:
|
|
||||||
name: Cocoa (macOS, Clang)
|
|
||||||
runs-on: macos-latest
|
|
||||||
env:
|
|
||||||
CFLAGS: -Werror
|
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.8
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Configure static library
|
|
||||||
run: cmake -S . -B build-static
|
|
||||||
- name: Build static library
|
|
||||||
run: cmake --build build-static --parallel
|
|
||||||
|
|
||||||
- name: Configure shared library
|
|
||||||
run: cmake -S . -B build-shared -D BUILD_SHARED_LIBS=ON
|
|
||||||
- name: Build shared library
|
|
||||||
run: cmake --build build-shared --parallel
|
|
||||||
|
|
||||||
build-windows-win32-vs2022:
|
|
||||||
name: Win32 (Windows, VS2022)
|
|
||||||
runs-on: windows-latest
|
|
||||||
env:
|
|
||||||
CFLAGS: /WX
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Configure static library
|
|
||||||
run: cmake -S . -B build-static -G "Visual Studio 17 2022"
|
|
||||||
- name: Build static library
|
|
||||||
run: cmake --build build-static --parallel
|
|
||||||
|
|
||||||
- name: Configure shared library
|
|
||||||
run: cmake -S . -B build-shared -G "Visual Studio 17 2022" -D BUILD_SHARED_LIBS=ON
|
|
||||||
- name: Build shared library
|
|
||||||
run: cmake --build build-shared --parallel
|
|
||||||
|
|
51
.gitignore
vendored
51
.gitignore
vendored
|
@ -1,45 +1,25 @@
|
||||||
# The canonical out-of-tree build subdirectory
|
# External junk
|
||||||
build
|
.DS_Store
|
||||||
|
|
||||||
# Visual Studio clutter
|
|
||||||
_ReSharper*
|
_ReSharper*
|
||||||
|
*.opensdf
|
||||||
*.sdf
|
*.sdf
|
||||||
*.suo
|
*.suo
|
||||||
*.dir
|
*.dir
|
||||||
*.vcxproj*
|
*.vcxproj*
|
||||||
*.sln
|
*.sln
|
||||||
.vs
|
|
||||||
CMakeSettings.json
|
|
||||||
Win32
|
Win32
|
||||||
x64
|
x64
|
||||||
Debug
|
Debug
|
||||||
Release
|
Release
|
||||||
MinSizeRel
|
MinSizeRel
|
||||||
RelWithDebInfo
|
RelWithDebInfo
|
||||||
*.opensdf
|
*.xcodeproj
|
||||||
|
|
||||||
# Xcode clutter
|
# CMake files
|
||||||
GLFW.build
|
|
||||||
GLFW.xcodeproj
|
|
||||||
|
|
||||||
# macOS clutter
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Makefile generator clutter
|
|
||||||
Makefile
|
Makefile
|
||||||
|
|
||||||
# Ninja generator clutter
|
|
||||||
build.ninja
|
|
||||||
rules.ninja
|
|
||||||
.ninja_deps
|
|
||||||
.ninja_log
|
|
||||||
|
|
||||||
# CMake clutter
|
|
||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
CMakeScripts
|
CMakeScripts
|
||||||
CMakeDoxyfile.in
|
|
||||||
CMakeDoxygenDefaults.cmake
|
|
||||||
cmake_install.cmake
|
cmake_install.cmake
|
||||||
cmake_uninstall.cmake
|
cmake_uninstall.cmake
|
||||||
|
|
||||||
|
@ -52,15 +32,19 @@ src/glfw_config.h
|
||||||
src/glfw3.pc
|
src/glfw3.pc
|
||||||
src/glfw3Config.cmake
|
src/glfw3Config.cmake
|
||||||
src/glfw3ConfigVersion.cmake
|
src/glfw3ConfigVersion.cmake
|
||||||
|
src/wayland-pointer-constraints-unstable-v1-client-protocol.h
|
||||||
|
src/wayland-pointer-constraints-unstable-v1-protocol.c
|
||||||
|
src/wayland-relative-pointer-unstable-v1-client-protocol.h
|
||||||
|
src/wayland-relative-pointer-unstable-v1-protocol.c
|
||||||
|
|
||||||
# Compiled binaries
|
# Compiled binaries
|
||||||
src/libglfw.so
|
src/libglfw.so
|
||||||
src/libglfw.so.3
|
src/libglfw.so.3
|
||||||
src/libglfw.so.3.4
|
src/libglfw.so.3.2
|
||||||
src/libglfw.dylib
|
src/libglfw.dylib
|
||||||
src/libglfw.dylib
|
src/libglfw.dylib
|
||||||
src/libglfw.3.dylib
|
src/libglfw.3.dylib
|
||||||
src/libglfw.3.4.dylib
|
src/libglfw.3.2.dylib
|
||||||
src/libglfw3.a
|
src/libglfw3.a
|
||||||
src/glfw3.lib
|
src/glfw3.lib
|
||||||
src/glfw3.dll
|
src/glfw3.dll
|
||||||
|
@ -71,13 +55,10 @@ examples/*.exe
|
||||||
examples/boing
|
examples/boing
|
||||||
examples/gears
|
examples/gears
|
||||||
examples/heightmap
|
examples/heightmap
|
||||||
examples/offscreen
|
|
||||||
examples/particles
|
examples/particles
|
||||||
examples/splitview
|
examples/splitview
|
||||||
examples/sharing
|
examples/simple
|
||||||
examples/triangle-opengl
|
|
||||||
examples/wave
|
examples/wave
|
||||||
examples/windows
|
|
||||||
tests/*.app
|
tests/*.app
|
||||||
tests/*.exe
|
tests/*.exe
|
||||||
tests/clipboard
|
tests/clipboard
|
||||||
|
@ -86,18 +67,16 @@ tests/empty
|
||||||
tests/events
|
tests/events
|
||||||
tests/gamma
|
tests/gamma
|
||||||
tests/glfwinfo
|
tests/glfwinfo
|
||||||
tests/icon
|
|
||||||
tests/iconify
|
tests/iconify
|
||||||
tests/inputlag
|
|
||||||
tests/joysticks
|
tests/joysticks
|
||||||
tests/monitors
|
tests/monitors
|
||||||
tests/msaa
|
tests/msaa
|
||||||
tests/reopen
|
tests/reopen
|
||||||
|
tests/sharing
|
||||||
tests/tearing
|
tests/tearing
|
||||||
tests/threads
|
tests/threads
|
||||||
tests/timeout
|
|
||||||
tests/title
|
tests/title
|
||||||
tests/triangle-vulkan
|
tests/version
|
||||||
tests/window
|
tests/vulkan
|
||||||
tests/windows
|
tests/windows
|
||||||
|
|
||||||
|
|
10
.mailmap
10
.mailmap
|
@ -1,10 +0,0 @@
|
||||||
Camilla Löwy <elmindreda@glfw.org> <elmindreda@users.sourceforge.net>
|
|
||||||
Camilla Löwy <elmindreda@glfw.org> <elmindreda@elmindreda.org>
|
|
||||||
Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
|
|
||||||
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
|
||||||
|
|
||||||
Marcus Geelnard <m@bitsnbites.eu> <marcus256@users.sourceforge.net>
|
|
||||||
Marcus Geelnard <m@bitsnbites.eu> <marcus@geelnards-pc.(none)>
|
|
||||||
Marcus Geelnard <m@bitsnbites.eu>
|
|
||||||
|
|
30
.travis.yml
Normal file
30
.travis.yml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
language: c
|
||||||
|
compiler: clang
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- ci
|
||||||
|
- master
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
sudo: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- kubuntu-backports
|
||||||
|
packages:
|
||||||
|
- cmake
|
||||||
|
env:
|
||||||
|
- BUILD_SHARED_LIBS=ON
|
||||||
|
- BUILD_SHARED_LIBS=OFF
|
||||||
|
script:
|
||||||
|
- mkdir build
|
||||||
|
- cd build
|
||||||
|
- cmake -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ..
|
||||||
|
- cmake --build .
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
recipients:
|
||||||
|
- ci@glfw.org
|
||||||
|
on_success: never
|
||||||
|
on_failure: always
|
|
@ -1,48 +0,0 @@
|
||||||
# Usage:
|
|
||||||
# cmake -P GenerateMappings.cmake <path/to/mappings.h.in> <path/to/mappings.h>
|
|
||||||
|
|
||||||
set(source_url "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt")
|
|
||||||
set(source_path "${CMAKE_CURRENT_BINARY_DIR}/gamecontrollerdb.txt")
|
|
||||||
set(template_path "${CMAKE_ARGV3}")
|
|
||||||
set(target_path "${CMAKE_ARGV4}")
|
|
||||||
|
|
||||||
if (NOT EXISTS "${template_path}")
|
|
||||||
message(FATAL_ERROR "Failed to find template file ${template_path}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
file(DOWNLOAD "${source_url}" "${source_path}"
|
|
||||||
STATUS download_status
|
|
||||||
TLS_VERIFY on)
|
|
||||||
|
|
||||||
list(GET download_status 0 status_code)
|
|
||||||
list(GET download_status 1 status_message)
|
|
||||||
|
|
||||||
if (status_code)
|
|
||||||
message(FATAL_ERROR "Failed to download ${source_url}: ${status_message}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
file(STRINGS "${source_path}" lines)
|
|
||||||
foreach(line ${lines})
|
|
||||||
if (line MATCHES "^[0-9a-fA-F]")
|
|
||||||
if (line MATCHES "platform:Windows")
|
|
||||||
if (GLFW_WIN32_MAPPINGS)
|
|
||||||
string(APPEND GLFW_WIN32_MAPPINGS "\n")
|
|
||||||
endif()
|
|
||||||
string(APPEND GLFW_WIN32_MAPPINGS "\"${line}\",")
|
|
||||||
elseif (line MATCHES "platform:Mac OS X")
|
|
||||||
if (GLFW_COCOA_MAPPINGS)
|
|
||||||
string(APPEND GLFW_COCOA_MAPPINGS "\n")
|
|
||||||
endif()
|
|
||||||
string(APPEND GLFW_COCOA_MAPPINGS "\"${line}\",")
|
|
||||||
elseif (line MATCHES "platform:Linux")
|
|
||||||
if (GLFW_LINUX_MAPPINGS)
|
|
||||||
string(APPEND GLFW_LINUX_MAPPINGS "\n")
|
|
||||||
endif()
|
|
||||||
string(APPEND GLFW_LINUX_MAPPINGS "\"${line}\",")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
configure_file("${template_path}" "${target_path}" @ONLY NEWLINE_STYLE UNIX)
|
|
||||||
file(REMOVE "${source_path}")
|
|
||||||
|
|
13
CMake/amd64-mingw32msvc.cmake
Normal file
13
CMake/amd64-mingw32msvc.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Define the environment for cross compiling from Linux to Win64
|
||||||
|
SET(CMAKE_SYSTEM_NAME Windows)
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
SET(CMAKE_C_COMPILER "amd64-mingw32msvc-gcc")
|
||||||
|
SET(CMAKE_CXX_COMPILER "amd64-mingw32msvc-g++")
|
||||||
|
SET(CMAKE_RC_COMPILER "amd64-mingw32msvc-windres")
|
||||||
|
SET(CMAKE_RANLIB "amd64-mingw32msvc-ranlib")
|
||||||
|
|
||||||
|
# Configure the behaviour of the find commands
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "/usr/amd64-mingw32msvc")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
@ -1,13 +0,0 @@
|
||||||
prefix=@CMAKE_INSTALL_PREFIX@
|
|
||||||
exec_prefix=${prefix}
|
|
||||||
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
|
||||||
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
|
||||||
|
|
||||||
Name: GLFW
|
|
||||||
Description: A multi-platform library for OpenGL, window and input
|
|
||||||
Version: @GLFW_VERSION@
|
|
||||||
URL: https://www.glfw.org/
|
|
||||||
Requires.private: @GLFW_PKG_CONFIG_REQUIRES_PRIVATE@
|
|
||||||
Libs: -L${libdir} -l@GLFW_LIB_NAME@
|
|
||||||
Libs.private: @GLFW_PKG_CONFIG_LIBS_PRIVATE@
|
|
||||||
Cflags: -I${includedir}
|
|
|
@ -1,3 +0,0 @@
|
||||||
include(CMakeFindDependencyMacro)
|
|
||||||
find_dependency(Threads)
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/glfw3Targets.cmake")
|
|
13
CMake/i586-mingw32msvc.cmake
Normal file
13
CMake/i586-mingw32msvc.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Define the environment for cross compiling from Linux to Win32
|
||||||
|
SET(CMAKE_SYSTEM_NAME Windows)
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
SET(CMAKE_C_COMPILER "i586-mingw32msvc-gcc")
|
||||||
|
SET(CMAKE_CXX_COMPILER "i586-mingw32msvc-g++")
|
||||||
|
SET(CMAKE_RC_COMPILER "i586-mingw32msvc-windres")
|
||||||
|
SET(CMAKE_RANLIB "i586-mingw32msvc-ranlib")
|
||||||
|
|
||||||
|
# Configure the behaviour of the find commands
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "/usr/i586-mingw32msvc")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
13
CMake/i686-pc-mingw32.cmake
Normal file
13
CMake/i686-pc-mingw32.cmake
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Define the environment for cross compiling from Linux to Win32
|
||||||
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
SET(CMAKE_C_COMPILER "i686-pc-mingw32-gcc")
|
||||||
|
SET(CMAKE_CXX_COMPILER "i686-pc-mingw32-g++")
|
||||||
|
SET(CMAKE_RC_COMPILER "i686-pc-mingw32-windres")
|
||||||
|
SET(CMAKE_RANLIB "i686-pc-mingw32-ranlib")
|
||||||
|
|
||||||
|
#Configure the behaviour of the find commands
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "/opt/mingw/usr/i686-pc-mingw32")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
@ -1,13 +0,0 @@
|
||||||
# Define the environment for cross-compiling with 32-bit MinGW-w64 Clang
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
|
||||||
SET(CMAKE_C_COMPILER "i686-w64-mingw32-clang")
|
|
||||||
SET(CMAKE_CXX_COMPILER "i686-w64-mingw32-clang++")
|
|
||||||
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
|
||||||
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Define the environment for cross-compiling with 32-bit MinGW-w64 GCC
|
# Define the environment for cross compiling from Linux to Win32
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
SET(CMAKE_C_COMPILER "i686-w64-mingw32-gcc")
|
SET(CMAKE_C_COMPILER "i686-w64-mingw32-gcc")
|
||||||
|
@ -6,7 +6,7 @@ SET(CMAKE_CXX_COMPILER "i686-w64-mingw32-g++")
|
||||||
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
||||||
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
# Configure the behaviour of the find commands
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
# Find EpollShim
|
|
||||||
# Once done, this will define
|
|
||||||
#
|
|
||||||
# EPOLLSHIM_FOUND - System has EpollShim
|
|
||||||
# EPOLLSHIM_INCLUDE_DIRS - The EpollShim include directories
|
|
||||||
# EPOLLSHIM_LIBRARIES - The libraries needed to use EpollShim
|
|
||||||
|
|
||||||
find_path(EPOLLSHIM_INCLUDE_DIRS NAMES sys/epoll.h sys/timerfd.h HINTS /usr/local/include/libepoll-shim)
|
|
||||||
find_library(EPOLLSHIM_LIBRARIES NAMES epoll-shim libepoll-shim HINTS /usr/local/lib)
|
|
||||||
|
|
||||||
if (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
|
||||||
set(EPOLLSHIM_FOUND TRUE)
|
|
||||||
endif (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(EpollShim DEFAULT_MSG EPOLLSHIM_LIBRARIES EPOLLSHIM_INCLUDE_DIRS)
|
|
||||||
mark_as_advanced(EPOLLSHIM_INCLUDE_DIRS EPOLLSHIM_LIBRARIES)
|
|
18
CMake/modules/FindMir.cmake
Normal file
18
CMake/modules/FindMir.cmake
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Try to find Mir on a Unix system
|
||||||
|
#
|
||||||
|
# This will define:
|
||||||
|
#
|
||||||
|
# MIR_LIBRARIES - Link these to use Wayland
|
||||||
|
# MIR_INCLUDE_DIR - Include directory for Wayland
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 Brandon Schaefer <brandon.schaefer@canonical.com>
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
|
||||||
|
find_package (PkgConfig)
|
||||||
|
pkg_check_modules (PKG_MIR QUIET mirclient)
|
||||||
|
|
||||||
|
set (MIR_INCLUDE_DIR ${PKG_MIR_INCLUDE_DIRS})
|
||||||
|
set (MIR_LIBRARIES ${PKG_MIR_LIBRARIES})
|
||||||
|
|
||||||
|
endif ()
|
|
@ -1,18 +0,0 @@
|
||||||
# Try to find OSMesa on a Unix system
|
|
||||||
#
|
|
||||||
# This will define:
|
|
||||||
#
|
|
||||||
# OSMESA_LIBRARIES - Link these to use OSMesa
|
|
||||||
# OSMESA_INCLUDE_DIR - Include directory for OSMesa
|
|
||||||
#
|
|
||||||
# Copyright (c) 2014 Brandon Schaefer <brandon.schaefer@canonical.com>
|
|
||||||
|
|
||||||
if (NOT WIN32)
|
|
||||||
|
|
||||||
find_package (PkgConfig)
|
|
||||||
pkg_check_modules (PKG_OSMESA QUIET osmesa)
|
|
||||||
|
|
||||||
set (OSMESA_INCLUDE_DIR ${PKG_OSMESA_INCLUDE_DIRS})
|
|
||||||
set (OSMESA_LIBRARIES ${PKG_OSMESA_LIBRARIES})
|
|
||||||
|
|
||||||
endif ()
|
|
31
CMake/modules/FindVulkan.cmake
Normal file
31
CMake/modules/FindVulkan.cmake
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Find Vulkan
|
||||||
|
#
|
||||||
|
# VULKAN_INCLUDE_DIR
|
||||||
|
# VULKAN_LIBRARY
|
||||||
|
# VULKAN_FOUND
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
|
||||||
|
"$ENV{VULKAN_SDK}/Include"
|
||||||
|
"$ENV{VK_SDK_PATH}/Include")
|
||||||
|
if (CMAKE_CL_64)
|
||||||
|
find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS
|
||||||
|
"$ENV{VULKAN_SDK}/Bin"
|
||||||
|
"$ENV{VK_SDK_PATH}/Bin")
|
||||||
|
else()
|
||||||
|
find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS
|
||||||
|
"$ENV{VULKAN_SDK}/Bin32"
|
||||||
|
"$ENV{VK_SDK_PATH}/Bin32")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
|
||||||
|
"$ENV{VULKAN_SDK}/include")
|
||||||
|
find_library(VULKAN_LIBRARY NAMES vulkan HINTS
|
||||||
|
"$ENV{VULKAN_SDK}/lib")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(Vulkan DEFAULT_MSG VULKAN_LIBRARY VULKAN_INCLUDE_DIR)
|
||||||
|
|
||||||
|
mark_as_advanced(VULKAN_INCLUDE_DIR VULKAN_LIBRARY)
|
||||||
|
|
26
CMake/modules/FindWaylandProtocols.cmake
Normal file
26
CMake/modules/FindWaylandProtocols.cmake
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
find_package(PkgConfig)
|
||||||
|
|
||||||
|
pkg_check_modules(WaylandProtocols QUIET wayland-protocols>=${WaylandProtocols_FIND_VERSION})
|
||||||
|
|
||||||
|
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=pkgdatadir wayland-protocols
|
||||||
|
OUTPUT_VARIABLE WaylandProtocols_PKGDATADIR
|
||||||
|
RESULT_VARIABLE _pkgconfig_failed)
|
||||||
|
if (_pkgconfig_failed)
|
||||||
|
message(FATAL_ERROR "Missing wayland-protocols pkgdatadir")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX REPLACE "[\r\n]" "" WaylandProtocols_PKGDATADIR "${WaylandProtocols_PKGDATADIR}")
|
||||||
|
|
||||||
|
find_package_handle_standard_args(WaylandProtocols
|
||||||
|
FOUND_VAR
|
||||||
|
WaylandProtocols_FOUND
|
||||||
|
REQUIRED_VARS
|
||||||
|
WaylandProtocols_PKGDATADIR
|
||||||
|
VERSION_VAR
|
||||||
|
WaylandProtocols_VERSION
|
||||||
|
HANDLE_COMPONENTS
|
||||||
|
)
|
||||||
|
|
||||||
|
set(WAYLAND_PROTOCOLS_FOUND ${WaylandProtocols_FOUND})
|
||||||
|
set(WAYLAND_PROTOCOLS_PKGDATADIR ${WaylandProtocols_PKGDATADIR})
|
||||||
|
set(WAYLAND_PROTOCOLS_VERSION ${WaylandProtocols_VERSION})
|
34
CMake/modules/FindXKBCommon.cmake
Normal file
34
CMake/modules/FindXKBCommon.cmake
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# - Try to find XKBCommon
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# XKBCOMMON_FOUND - System has XKBCommon
|
||||||
|
# XKBCOMMON_INCLUDE_DIRS - The XKBCommon include directories
|
||||||
|
# XKBCOMMON_LIBRARIES - The libraries needed to use XKBCommon
|
||||||
|
# XKBCOMMON_DEFINITIONS - Compiler switches required for using XKBCommon
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(PC_XKBCOMMON QUIET xkbcommon)
|
||||||
|
set(XKBCOMMON_DEFINITIONS ${PC_XKBCOMMON_CFLAGS_OTHER})
|
||||||
|
|
||||||
|
find_path(XKBCOMMON_INCLUDE_DIR
|
||||||
|
NAMES xkbcommon/xkbcommon.h
|
||||||
|
HINTS ${PC_XKBCOMMON_INCLUDE_DIR} ${PC_XKBCOMMON_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(XKBCOMMON_LIBRARY
|
||||||
|
NAMES xkbcommon
|
||||||
|
HINTS ${PC_XKBCOMMON_LIBRARY} ${PC_XKBCOMMON_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(XKBCOMMON_LIBRARIES ${XKBCOMMON_LIBRARY})
|
||||||
|
set(XKBCOMMON_LIBRARY_DIRS ${XKBCOMMON_LIBRARY_DIRS})
|
||||||
|
set(XKBCOMMON_INCLUDE_DIRS ${XKBCOMMON_INCLUDE_DIR})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(XKBCommon DEFAULT_MSG
|
||||||
|
XKBCOMMON_LIBRARY
|
||||||
|
XKBCOMMON_INCLUDE_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
mark_as_advanced(XKBCOMMON_LIBRARY XKBCOMMON_INCLUDE_DIR)
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
# Define the environment for cross-compiling with 64-bit MinGW-w64 Clang
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
|
||||||
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-clang")
|
|
||||||
SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-clang++")
|
|
||||||
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
|
||||||
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Define the environment for cross-compiling with 64-bit MinGW-w64 GCC
|
# Define the environment for cross compiling from Linux to Win32
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc")
|
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc")
|
||||||
|
@ -6,7 +6,7 @@ SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++")
|
||||||
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
||||||
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
# Configure the behaviour of the find commands
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
|
370
CMakeLists.txt
370
CMakeLists.txt
|
@ -1,59 +1,66 @@
|
||||||
cmake_minimum_required(VERSION 3.4...3.20 FATAL_ERROR)
|
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
||||||
|
|
||||||
project(GLFW VERSION 3.4.0 LANGUAGES C)
|
project(GLFW C)
|
||||||
|
|
||||||
if (POLICY CMP0069)
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
cmake_policy(SET CMP0069 NEW)
|
|
||||||
|
if (NOT CMAKE_VERSION VERSION_LESS "3.0")
|
||||||
|
# Until all major package systems have moved to CMake 3,
|
||||||
|
# we stick with the older INSTALL_NAME_DIR mechanism
|
||||||
|
cmake_policy(SET CMP0042 OLD)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (POLICY CMP0077)
|
set(GLFW_VERSION_MAJOR "3")
|
||||||
cmake_policy(SET CMP0077 NEW)
|
set(GLFW_VERSION_MINOR "2")
|
||||||
endif()
|
set(GLFW_VERSION_PATCH "0")
|
||||||
|
set(GLFW_VERSION_EXTRA "")
|
||||||
|
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
|
||||||
|
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
|
||||||
|
set(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib will be installed: lib or lib64")
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
string(COMPARE EQUAL "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}" GLFW_STANDALONE)
|
|
||||||
|
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||||
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ${GLFW_STANDALONE})
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
|
||||||
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ${GLFW_STANDALONE})
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
|
||||||
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
||||||
option(GLFW_INSTALL "Generate installation target" ON)
|
option(GLFW_INSTALL "Generate installation target" ON)
|
||||||
|
option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
if (WIN32)
|
||||||
include(CMakeDependentOption)
|
option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF)
|
||||||
|
|
||||||
if (GLFW_USE_OSMESA)
|
|
||||||
message(FATAL_ERROR "GLFW_USE_OSMESA has been removed; set the GLFW_PLATFORM init hint")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_dependent_option(GLFW_BUILD_WIN32 "Build support for Win32" ON "WIN32" OFF)
|
if (APPLE)
|
||||||
cmake_dependent_option(GLFW_BUILD_COCOA "Build support for Cocoa" ON "APPLE" OFF)
|
option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
|
||||||
cmake_dependent_option(GLFW_BUILD_X11 "Build support for X11" ON "UNIX;NOT APPLE" OFF)
|
option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
|
||||||
cmake_dependent_option(GLFW_BUILD_WAYLAND "Build support for Wayland"
|
option(GLFW_USE_RETINA "Use the full resolution of Retina displays" ON)
|
||||||
"${GLFW_USE_WAYLAND}" "UNIX;NOT APPLE" OFF)
|
endif()
|
||||||
|
|
||||||
cmake_dependent_option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF
|
if (UNIX AND NOT APPLE)
|
||||||
"WIN32" OFF)
|
option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF)
|
||||||
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
|
option(GLFW_USE_MIR "Use Mir for window creation" OFF)
|
||||||
"MSVC" OFF)
|
endif()
|
||||||
|
|
||||||
set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING
|
if (MSVC)
|
||||||
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (GLFW_LIBRARY_TYPE)
|
if (BUILD_SHARED_LIBS)
|
||||||
if (GLFW_LIBRARY_TYPE STREQUAL "SHARED")
|
set(_GLFW_BUILD_DLL 1)
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY TRUE)
|
endif()
|
||||||
else()
|
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY FALSE)
|
if (BUILD_SHARED_LIBS AND UNIX)
|
||||||
endif()
|
# On Unix-like systems, shared libraries can use the soname system.
|
||||||
|
set(GLFW_LIB_NAME glfw)
|
||||||
else()
|
else()
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
set(GLFW_LIB_NAME glfw3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
set(CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
find_package(Vulkan)
|
||||||
|
|
||||||
if (GLFW_BUILD_DOCS)
|
if (GLFW_BUILD_DOCS)
|
||||||
set(DOXYGEN_SKIP_DOT TRUE)
|
set(DOXYGEN_SKIP_DOT TRUE)
|
||||||
|
@ -61,62 +68,289 @@ if (GLFW_BUILD_DOCS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Report backend selection
|
# Set compiler specific flags
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (GLFW_BUILD_WIN32)
|
if (MSVC)
|
||||||
message(STATUS "Including Win32 support")
|
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
||||||
endif()
|
|
||||||
if (GLFW_BUILD_COCOA)
|
|
||||||
message(STATUS "Including Cocoa support")
|
|
||||||
endif()
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
|
||||||
message(STATUS "Including Wayland support")
|
|
||||||
endif()
|
|
||||||
if (GLFW_BUILD_X11)
|
|
||||||
message(STATUS "Including X11 support")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Apply Microsoft C runtime library option
|
|
||||||
# This is here because it also applies to tests and examples
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (MSVC AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
|
||||||
if (CMAKE_VERSION VERSION_LESS 3.15)
|
|
||||||
foreach (flag CMAKE_C_FLAGS
|
foreach (flag CMAKE_C_FLAGS
|
||||||
CMAKE_C_FLAGS_DEBUG
|
CMAKE_C_FLAGS_DEBUG
|
||||||
CMAKE_C_FLAGS_RELEASE
|
CMAKE_C_FLAGS_RELEASE
|
||||||
CMAKE_C_FLAGS_MINSIZEREL
|
CMAKE_C_FLAGS_MINSIZEREL
|
||||||
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
|
||||||
if (flag MATCHES "/MD")
|
if (${flag} MATCHES "/MD")
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
||||||
endif()
|
endif()
|
||||||
if (flag MATCHES "/MDd")
|
if (${flag} MATCHES "/MDd")
|
||||||
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endforeach()
|
endforeach()
|
||||||
else()
|
|
||||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (MINGW)
|
||||||
|
# Workaround for legacy MinGW not providing XInput and DirectInput
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
|
||||||
|
check_include_file(dinput.h DINPUT_H_FOUND)
|
||||||
|
check_include_file(xinput.h XINPUT_H_FOUND)
|
||||||
|
if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/mingw")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Enable link-time exploit mitigation features enabled by default on MSVC
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
|
||||||
|
# Compatibility with data execution prevention (DEP)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
||||||
|
if (_GLFW_HAS_DEP)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Compatibility with address space layout randomization (ASLR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
||||||
|
if (_GLFW_HAS_ASLR)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Compatibility with 64-bit address space layout randomization (ASLR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
||||||
|
if (_GLFW_HAS_64ASLR)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Detect and select backend APIs
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (WIN32)
|
||||||
|
set(_GLFW_WIN32 1)
|
||||||
|
message(STATUS "Using Win32 for window creation")
|
||||||
|
elseif (APPLE)
|
||||||
|
set(_GLFW_COCOA 1)
|
||||||
|
message(STATUS "Using Cocoa for window creation")
|
||||||
|
elseif (UNIX)
|
||||||
|
if (GLFW_USE_WAYLAND)
|
||||||
|
set(_GLFW_WAYLAND 1)
|
||||||
|
message(STATUS "Using Wayland for window creation")
|
||||||
|
elseif (GLFW_USE_MIR)
|
||||||
|
set(_GLFW_MIR 1)
|
||||||
|
message(STATUS "Using Mir for window creation")
|
||||||
|
else()
|
||||||
|
set(_GLFW_X11 1)
|
||||||
|
message(STATUS "Using X11 for window creation")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "No supported platform was detected")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Find and add Unix math and time libraries
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (UNIX AND NOT APPLE)
|
||||||
|
find_library(RT_LIBRARY rt)
|
||||||
|
mark_as_advanced(RT_LIBRARY)
|
||||||
|
if (RT_LIBRARY)
|
||||||
|
list(APPEND glfw_LIBRARIES "${RT_LIBRARY}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lrt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_library(MATH_LIBRARY m)
|
||||||
|
mark_as_advanced(MATH_LIBRARY)
|
||||||
|
if (MATH_LIBRARY)
|
||||||
|
list(APPEND glfw_LIBRARIES "${MATH_LIBRARY}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lm")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_DL_LIBS)
|
||||||
|
list(APPEND glfw_LIBRARIES "${CMAKE_DL_LIBS}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use Win32 for window creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_WIN32)
|
||||||
|
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
||||||
|
|
||||||
|
if (GLFW_USE_HYBRID_HPG)
|
||||||
|
set(_GLFW_USE_HYBRID_HPG 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use X11 for window creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_X11)
|
||||||
|
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
|
||||||
|
list(APPEND glfw_PKG_DEPS "x11")
|
||||||
|
|
||||||
|
# Set up library and include paths
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
|
||||||
|
# Check for XRandR (modern resolution switching and gamma control)
|
||||||
|
if (NOT X11_Xrandr_FOUND)
|
||||||
|
message(FATAL_ERROR "The RandR library and headers were not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${X11_Xrandr_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_Xrandr_LIB}")
|
||||||
|
list(APPEND glfw_PKG_DEPS "xrandr")
|
||||||
|
|
||||||
|
# Check for Xinerama (legacy multi-monitor support)
|
||||||
|
if (NOT X11_Xinerama_FOUND)
|
||||||
|
message(FATAL_ERROR "The Xinerama library and headers were not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${X11_Xinerama_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_Xinerama_LIB}")
|
||||||
|
list(APPEND glfw_PKG_DEPS "xinerama")
|
||||||
|
|
||||||
|
# Check for Xf86VidMode (fallback gamma control)
|
||||||
|
if (X11_xf86vmode_FOUND)
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${X11_xf86vmode_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_PKG_DEPS "xxf86vm")
|
||||||
|
|
||||||
|
if (X11_Xxf86vm_LIB)
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_Xxf86vm_LIB}")
|
||||||
|
else()
|
||||||
|
# Backwards compatibility (see CMake bug 0006976)
|
||||||
|
list(APPEND glfw_LIBRARIES Xxf86vm)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_GLFW_HAS_XF86VM TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for Xkb (X keyboard extension)
|
||||||
|
if (NOT X11_Xkb_FOUND)
|
||||||
|
message(FATAL_ERROR "The X keyboard extension headers were not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIR "${X11_Xkb_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for Xcursor
|
||||||
|
if (NOT X11_Xcursor_FOUND)
|
||||||
|
message(FATAL_ERROR "The Xcursor libraries and headers were not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIR "${X11_Xcursor_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_Xcursor_LIB}")
|
||||||
|
list(APPEND glfw_PKG_DEPS "xcursor")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use Wayland for window creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_WAYLAND)
|
||||||
|
find_package(ECM REQUIRED NO_MODULE)
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
|
||||||
|
|
||||||
|
find_package(Wayland REQUIRED)
|
||||||
|
find_package(WaylandScanner REQUIRED)
|
||||||
|
find_package(WaylandProtocols 1.1 REQUIRED)
|
||||||
|
|
||||||
|
list(APPEND glfw_PKG_DEPS "wayland-egl")
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIR}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
|
||||||
|
find_package(XKBCommon REQUIRED)
|
||||||
|
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use Mir for window creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_MIR)
|
||||||
|
find_package(Mir REQUIRED)
|
||||||
|
list(APPEND glfw_PKG_DEPS "mirclient")
|
||||||
|
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIR}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${MIR_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
|
||||||
|
find_package(XKBCommon REQUIRED)
|
||||||
|
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use Cocoa for window creation and NSOpenGL for context creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_COCOA)
|
||||||
|
|
||||||
|
if (GLFW_USE_MENUBAR)
|
||||||
|
set(_GLFW_USE_MENUBAR 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_USE_CHDIR)
|
||||||
|
set(_GLFW_USE_CHDIR 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_USE_RETINA)
|
||||||
|
set(_GLFW_USE_RETINA 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set up library and include paths
|
||||||
|
find_library(COCOA_FRAMEWORK Cocoa)
|
||||||
|
find_library(IOKIT_FRAMEWORK IOKit)
|
||||||
|
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
||||||
|
find_library(CORE_VIDEO_FRAMEWORK CoreVideo)
|
||||||
|
mark_as_advanced(COCOA_FRAMEWORK
|
||||||
|
IOKIT_FRAMEWORK
|
||||||
|
CORE_FOUNDATION_FRAMEWORK
|
||||||
|
CORE_VIDEO_FRAMEWORK)
|
||||||
|
list(APPEND glfw_LIBRARIES "${COCOA_FRAMEWORK}"
|
||||||
|
"${IOKIT_FRAMEWORK}"
|
||||||
|
"${CORE_FOUNDATION_FRAMEWORK}"
|
||||||
|
"${CORE_VIDEO_FRAMEWORK}")
|
||||||
|
|
||||||
|
set(glfw_PKG_DEPS "")
|
||||||
|
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Export GLFW library dependencies
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
foreach(arg ${glfw_PKG_DEPS})
|
||||||
|
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} ${arg}")
|
||||||
|
endforeach()
|
||||||
|
foreach(arg ${glfw_PKG_LIBS})
|
||||||
|
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} ${arg}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Create generated files
|
# Create generated files
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
|
set(GLFW_CONFIG_PATH "lib${LIB_SUFFIX}/cmake/glfw3")
|
||||||
|
|
||||||
configure_package_config_file(CMake/glfw3Config.cmake.in
|
configure_package_config_file(src/glfw3Config.cmake.in
|
||||||
src/glfw3Config.cmake
|
src/glfw3Config.cmake
|
||||||
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
||||||
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
||||||
|
|
||||||
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
||||||
VERSION ${GLFW_VERSION}
|
VERSION ${GLFW_VERSION_FULL}
|
||||||
COMPATIBILITY SameMajorVersion)
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
|
||||||
|
configure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)
|
||||||
|
|
||||||
|
configure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Add subdirectories
|
# Add subdirectories
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
|
@ -139,7 +373,7 @@ endif()
|
||||||
# The library is installed by src/CMakeLists.txt
|
# The library is installed by src/CMakeLists.txt
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
install(DIRECTORY include/GLFW DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
install(DIRECTORY include/GLFW DESTINATION include
|
||||||
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
|
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
|
||||||
|
|
||||||
install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
|
||||||
|
@ -150,22 +384,16 @@ if (GLFW_INSTALL)
|
||||||
EXPORT_LINK_INTERFACE_LIBRARIES
|
EXPORT_LINK_INTERFACE_LIBRARIES
|
||||||
DESTINATION "${GLFW_CONFIG_PATH}")
|
DESTINATION "${GLFW_CONFIG_PATH}")
|
||||||
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
|
||||||
|
|
||||||
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
|
|
||||||
install(DIRECTORY "${GLFW_BINARY_DIR}/docs/html"
|
|
||||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Only generate this target if no higher-level project already has
|
# Only generate this target if no higher-level project already has
|
||||||
if (NOT TARGET uninstall)
|
if (NOT TARGET uninstall)
|
||||||
configure_file(CMake/cmake_uninstall.cmake.in
|
configure_file(cmake_uninstall.cmake.in
|
||||||
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
||||||
|
|
||||||
add_custom_target(uninstall
|
add_custom_target(uninstall
|
||||||
"${CMAKE_COMMAND}" -P
|
"${CMAKE_COMMAND}" -P
|
||||||
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
||||||
set_target_properties(uninstall PROPERTIES FOLDER "GLFW3")
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
268
CONTRIBUTORS.md
268
CONTRIBUTORS.md
|
@ -1,268 +0,0 @@
|
||||||
# Acknowledgements
|
|
||||||
|
|
||||||
GLFW exists because people around the world donated their time and lent their
|
|
||||||
skills. This list only includes contributions to the main repository and
|
|
||||||
excludes other invaluable contributions like language bindings and text and
|
|
||||||
video tutorials.
|
|
||||||
|
|
||||||
- Bobyshev Alexander
|
|
||||||
- Laurent Aphecetche
|
|
||||||
- Matt Arsenault
|
|
||||||
- Takuro Ashie
|
|
||||||
- ashishgamedev
|
|
||||||
- David Avedissian
|
|
||||||
- Luca Bacci
|
|
||||||
- Keith Bauer
|
|
||||||
- John Bartholomew
|
|
||||||
- Coşku Baş
|
|
||||||
- Niklas Behrens
|
|
||||||
- Andrew Belt
|
|
||||||
- Nevyn Bengtsson
|
|
||||||
- Niklas Bergström
|
|
||||||
- Denis Bernard
|
|
||||||
- BiBi
|
|
||||||
- Doug Binks
|
|
||||||
- blanco
|
|
||||||
- Waris Boonyasiriwat
|
|
||||||
- Kyle Brenneman
|
|
||||||
- Rok Breulj
|
|
||||||
- TheBrokenRail
|
|
||||||
- Kai Burjack
|
|
||||||
- Martin Capitanio
|
|
||||||
- Nicolas Caramelli
|
|
||||||
- David Carlier
|
|
||||||
- Arturo Castro
|
|
||||||
- Chi-kwan Chan
|
|
||||||
- TheChocolateOre
|
|
||||||
- Ali Chraghi
|
|
||||||
- Joseph Chua
|
|
||||||
- Ian Clarkson
|
|
||||||
- Michał Cichoń
|
|
||||||
- Lambert Clara
|
|
||||||
- Anna Clarke
|
|
||||||
- Josh Codd
|
|
||||||
- Yaron Cohen-Tal
|
|
||||||
- Omar Cornut
|
|
||||||
- Andrew Corrigan
|
|
||||||
- Bailey Cosier
|
|
||||||
- Noel Cower
|
|
||||||
- CuriouserThing
|
|
||||||
- Jason Daly
|
|
||||||
- danhambleton
|
|
||||||
- Jarrod Davis
|
|
||||||
- Olivier Delannoy
|
|
||||||
- Paul R. Deppe
|
|
||||||
- Michael Dickens
|
|
||||||
- Роман Донченко
|
|
||||||
- Mario Dorn
|
|
||||||
- Wolfgang Draxinger
|
|
||||||
- Jonathan Dummer
|
|
||||||
- Ralph Eastwood
|
|
||||||
- Fredrik Ehnbom
|
|
||||||
- Robin Eklind
|
|
||||||
- Jan Ekström
|
|
||||||
- Siavash Eliasi
|
|
||||||
- Ahmad Fatoum
|
|
||||||
- Nikita Fediuchin
|
|
||||||
- Felipe Ferreira
|
|
||||||
- Michael Fogleman
|
|
||||||
- Jason Francis
|
|
||||||
- Gerald Franz
|
|
||||||
- Mário Freitas
|
|
||||||
- GeO4d
|
|
||||||
- Marcus Geelnard
|
|
||||||
- ghuser404
|
|
||||||
- Charles Giessen
|
|
||||||
- Ryan C. Gordon
|
|
||||||
- Stephen Gowen
|
|
||||||
- Kovid Goyal
|
|
||||||
- Kevin Grandemange
|
|
||||||
- Eloi Marín Gratacós
|
|
||||||
- Stefan Gustavson
|
|
||||||
- Andrew Gutekanst
|
|
||||||
- Stephen Gutekanst
|
|
||||||
- Jonathan Hale
|
|
||||||
- hdf89shfdfs
|
|
||||||
- Sylvain Hellegouarch
|
|
||||||
- Björn Hempel
|
|
||||||
- Matthew Henry
|
|
||||||
- heromyth
|
|
||||||
- Lucas Hinderberger
|
|
||||||
- Paul Holden
|
|
||||||
- Hajime Hoshi
|
|
||||||
- Warren Hu
|
|
||||||
- Charles Huber
|
|
||||||
- Brent Huisman
|
|
||||||
- illustris
|
|
||||||
- InKryption
|
|
||||||
- IntellectualKitty
|
|
||||||
- Aaron Jacobs
|
|
||||||
- JannikGM
|
|
||||||
- Erik S. V. Jansson
|
|
||||||
- jjYBdx4IL
|
|
||||||
- Toni Jovanoski
|
|
||||||
- Arseny Kapoulkine
|
|
||||||
- Cem Karan
|
|
||||||
- Osman Keskin
|
|
||||||
- Koray Kilinc
|
|
||||||
- Josh Kilmer
|
|
||||||
- Byunghoon Kim
|
|
||||||
- Cameron King
|
|
||||||
- Peter Knut
|
|
||||||
- Christoph Kubisch
|
|
||||||
- Yuri Kunde Schlesner
|
|
||||||
- Rokas Kupstys
|
|
||||||
- Konstantin Käfer
|
|
||||||
- Eric Larson
|
|
||||||
- Francis Lecavalier
|
|
||||||
- Jong Won Lee
|
|
||||||
- Robin Leffmann
|
|
||||||
- Glenn Lewis
|
|
||||||
- Shane Liesegang
|
|
||||||
- Anders Lindqvist
|
|
||||||
- Leon Linhart
|
|
||||||
- Marco Lizza
|
|
||||||
- Eyal Lotem
|
|
||||||
- Aaron Loucks
|
|
||||||
- Luflosi
|
|
||||||
- lukect
|
|
||||||
- Tristam MacDonald
|
|
||||||
- Hans Mackowiak
|
|
||||||
- Ramiro Magno
|
|
||||||
- Дмитри Малышев
|
|
||||||
- Zbigniew Mandziejewicz
|
|
||||||
- Adam Marcus
|
|
||||||
- Célestin Marot
|
|
||||||
- Kyle McDonald
|
|
||||||
- David V. McKay
|
|
||||||
- David Medlock
|
|
||||||
- Bryce Mehring
|
|
||||||
- Jonathan Mercier
|
|
||||||
- Marcel Metz
|
|
||||||
- Liam Middlebrook
|
|
||||||
- Ave Milia
|
|
||||||
- Jonathan Miller
|
|
||||||
- Kenneth Miller
|
|
||||||
- Bruce Mitchener
|
|
||||||
- Jack Moffitt
|
|
||||||
- Ravi Mohan
|
|
||||||
- Jeff Molofee
|
|
||||||
- Alexander Monakov
|
|
||||||
- Pierre Morel
|
|
||||||
- Jon Morton
|
|
||||||
- Pierre Moulon
|
|
||||||
- Martins Mozeiko
|
|
||||||
- Pascal Muetschard
|
|
||||||
- James Murphy
|
|
||||||
- Julian Møller
|
|
||||||
- ndogxj
|
|
||||||
- F. Nedelec
|
|
||||||
- n3rdopolis
|
|
||||||
- Kristian Nielsen
|
|
||||||
- Joel Niemelä
|
|
||||||
- Kamil Nowakowski
|
|
||||||
- onox
|
|
||||||
- Denis Ovod
|
|
||||||
- Ozzy
|
|
||||||
- Andri Pálsson
|
|
||||||
- luz paz
|
|
||||||
- Peoro
|
|
||||||
- Braden Pellett
|
|
||||||
- Christopher Pelloux
|
|
||||||
- Michael Pennington
|
|
||||||
- Arturo J. Pérez
|
|
||||||
- Vladimir Perminov
|
|
||||||
- Olivier Perret
|
|
||||||
- Anthony Pesch
|
|
||||||
- Orson Peters
|
|
||||||
- Emmanuel Gil Peyrot
|
|
||||||
- Cyril Pichard
|
|
||||||
- Pilzschaf
|
|
||||||
- Keith Pitt
|
|
||||||
- Stanislav Podgorskiy
|
|
||||||
- Konstantin Podsvirov
|
|
||||||
- Nathan Poirier
|
|
||||||
- Alexandre Pretyman
|
|
||||||
- Pablo Prietz
|
|
||||||
- przemekmirek
|
|
||||||
- pthom
|
|
||||||
- Martin Pulec
|
|
||||||
- Guillaume Racicot
|
|
||||||
- Juan Ramos
|
|
||||||
- Christian Rauch
|
|
||||||
- Philip Rideout
|
|
||||||
- Eddie Ringle
|
|
||||||
- Max Risuhin
|
|
||||||
- Joe Roback
|
|
||||||
- Jorge Rodriguez
|
|
||||||
- Jari Ronkainen
|
|
||||||
- Luca Rood
|
|
||||||
- Ed Ropple
|
|
||||||
- Aleksey Rybalkin
|
|
||||||
- Mikko Rytkönen
|
|
||||||
- Riku Salminen
|
|
||||||
- Yoshinori Sano
|
|
||||||
- Brandon Schaefer
|
|
||||||
- Sebastian Schuberth
|
|
||||||
- Christian Sdunek
|
|
||||||
- Matt Sealey
|
|
||||||
- Steve Sexton
|
|
||||||
- Arkady Shapkin
|
|
||||||
- Ali Sherief
|
|
||||||
- Yoshiki Shibukawa
|
|
||||||
- Dmitri Shuralyov
|
|
||||||
- Joao da Silva
|
|
||||||
- Daniel Sieger
|
|
||||||
- Daniel Skorupski
|
|
||||||
- Slemmie
|
|
||||||
- Anthony Smith
|
|
||||||
- Bradley Smith
|
|
||||||
- Cliff Smolinsky
|
|
||||||
- Patrick Snape
|
|
||||||
- Erlend Sogge Heggen
|
|
||||||
- Olivier Sohn
|
|
||||||
- Julian Squires
|
|
||||||
- Johannes Stein
|
|
||||||
- Pontus Stenetorp
|
|
||||||
- Michael Stocker
|
|
||||||
- Justin Stoecker
|
|
||||||
- Elviss Strazdins
|
|
||||||
- Paul Sultana
|
|
||||||
- Nathan Sweet
|
|
||||||
- TTK-Bandit
|
|
||||||
- Jared Tiala
|
|
||||||
- Sergey Tikhomirov
|
|
||||||
- Arthur Tombs
|
|
||||||
- TronicLabs
|
|
||||||
- Ioannis Tsakpinis
|
|
||||||
- Samuli Tuomola
|
|
||||||
- Matthew Turner
|
|
||||||
- urraka
|
|
||||||
- Elias Vanderstuyft
|
|
||||||
- Stef Velzel
|
|
||||||
- Jari Vetoniemi
|
|
||||||
- Ricardo Vieira
|
|
||||||
- Nicholas Vitovitch
|
|
||||||
- Simon Voordouw
|
|
||||||
- Corentin Wallez
|
|
||||||
- Torsten Walluhn
|
|
||||||
- Patrick Walton
|
|
||||||
- Xo Wang
|
|
||||||
- Andre Weissflog
|
|
||||||
- Jay Weisskopf
|
|
||||||
- Frank Wille
|
|
||||||
- Andy Williams
|
|
||||||
- Joel Winarske
|
|
||||||
- Richard A. Wilkes
|
|
||||||
- Tatsuya Yatagawa
|
|
||||||
- Ryogo Yoshimura
|
|
||||||
- Lukas Zanner
|
|
||||||
- Andrey Zholos
|
|
||||||
- Aihui Zhu
|
|
||||||
- Santi Zupancic
|
|
||||||
- Jonas Ådahl
|
|
||||||
- Lasse Öörni
|
|
||||||
- Leonard König
|
|
||||||
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
|
||||||
reports, patches, feedback, testing and encouragement
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
Copyright (c) 2002-2006 Marcus Geelnard
|
Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
Copyright (c) 2006-2019 Camilla Löwy
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
601
README.md
601
README.md
|
@ -1,97 +1,64 @@
|
||||||
# GLFW
|
# GLFW
|
||||||
|
|
||||||
[](https://github.com/glfw/glfw/actions)
|
[](https://travis-ci.org/glfw/glfw)
|
||||||
[](https://ci.appveyor.com/project/elmindreda/glfw)
|
[](https://ci.appveyor.com/project/elmindreda/glfw)
|
||||||
[](https://scan.coverity.com/projects/glfw-glfw)
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan
|
GLFW is a free, Open Source, multi-platform library for OpenGL, OpenGL ES and
|
||||||
application development. It provides a simple, platform-independent API for
|
Vulkan application development. It provides a simple, platform-independent API
|
||||||
creating windows, contexts and surfaces, reading input, handling events, etc.
|
for creating windows, contexts and surfaces, reading input, handling events, etc.
|
||||||
|
|
||||||
GLFW natively supports Windows, macOS and Linux and other Unix-like systems. On
|
Version 3.2 adds support for Vulkan surface creation, window mode switching,
|
||||||
Linux both X11 and Wayland are supported.
|
window maximization, window input focus control, window size and aspect ratio
|
||||||
|
limits, human-readable key names, window icons, joystick connection events,
|
||||||
GLFW is licensed under the [zlib/libpng
|
XInput and DirectInput joystick input, event waiting with timeout, 64-bit
|
||||||
license](https://www.glfw.org/license.html).
|
integer raw timer, context-less window creation, error-less contexts via
|
||||||
|
`GL_KHR_no_error` (where available), run-time context creation API selection,
|
||||||
You can [download](https://www.glfw.org/download.html) the latest stable release
|
Windows 8.1 per-monitor DPI and the CMake config-file package system, adds
|
||||||
as source or Windows binaries, or fetch the `latest` branch from GitHub. Each
|
simpler build-time configuration, improved documentation and fixes for a large
|
||||||
release starting with 3.0 also has a corresponding [annotated
|
number of bugs that together affect all supported platforms.
|
||||||
tag](https://github.com/glfw/glfw/releases) with source and binary archives.
|
|
||||||
|
|
||||||
The [documentation](https://www.glfw.org/docs/latest/) is available online and is
|
|
||||||
included in all source and binary archives. See the [release
|
|
||||||
notes](https://www.glfw.org/docs/latest/news.html) for new features, caveats and
|
|
||||||
deprecations in the latest release. For more details see the [version
|
|
||||||
history](https://www.glfw.org/changelog.html).
|
|
||||||
|
|
||||||
The `master` branch is the stable integration branch and _should_ always compile
|
|
||||||
and run on all supported platforms, although details of newly added features may
|
|
||||||
change until they have been included in a release. New features and many bug
|
|
||||||
fixes live in [other branches](https://github.com/glfw/glfw/branches/all) until
|
|
||||||
they are stable enough to merge.
|
|
||||||
|
|
||||||
If you are new to GLFW, you may find the
|
If you are new to GLFW, you may find the
|
||||||
[tutorial](https://www.glfw.org/docs/latest/quick.html) for GLFW 3 useful. If
|
[tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW
|
||||||
you have used GLFW 2 in the past, there is a [transition
|
3 useful. If you have used GLFW 2 in the past, there is a
|
||||||
guide](https://www.glfw.org/docs/latest/moving.html) for moving to the GLFW
|
[transition guide](http://www.glfw.org/docs/latest/moving.html) for moving to
|
||||||
3 API.
|
the GLFW 3 API.
|
||||||
|
|
||||||
GLFW exists because of the contributions of [many people](CONTRIBUTORS.md)
|
|
||||||
around the world, whether by reporting bugs, providing community support, adding
|
|
||||||
features, reviewing or testing code, debugging, proofreading docs, suggesting
|
|
||||||
features or fixing bugs.
|
|
||||||
|
|
||||||
|
|
||||||
## Compiling GLFW
|
## Compiling GLFW
|
||||||
|
|
||||||
GLFW itself requires only the headers and libraries for your OS and window
|
See the [Compiling GLFW](http://www.glfw.org/docs/latest/compile.html) guide in
|
||||||
system. It does not need the headers for any context creation API (WGL, GLX,
|
the GLFW documentation.
|
||||||
EGL, NSGL, OSMesa) or rendering API (OpenGL, OpenGL ES, Vulkan) to enable
|
|
||||||
support for them.
|
|
||||||
|
|
||||||
GLFW supports compilation on Windows with Visual C++ 2010 and later, MinGW and
|
|
||||||
MinGW-w64, on macOS with Clang and on Linux and other Unix-like systems with GCC
|
|
||||||
and Clang. It will likely compile in other environments as well, but this is
|
|
||||||
not regularly tested.
|
|
||||||
|
|
||||||
There are [pre-compiled Windows binaries](https://www.glfw.org/download.html)
|
|
||||||
available for all supported compilers.
|
|
||||||
|
|
||||||
See the [compilation guide](https://www.glfw.org/docs/latest/compile.html) for
|
|
||||||
more information about how to compile GLFW yourself.
|
|
||||||
|
|
||||||
|
|
||||||
## Using GLFW
|
## Using GLFW
|
||||||
|
|
||||||
See the [documentation](https://www.glfw.org/docs/latest/) for tutorials, guides
|
See the
|
||||||
and the API reference.
|
[Building programs that use GLFW](http://www.glfw.org/docs/latest/build.html)
|
||||||
|
guide in the GLFW documentation.
|
||||||
|
|
||||||
|
|
||||||
## Contributing to GLFW
|
## Reporting bugs
|
||||||
|
|
||||||
See the [contribution
|
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
||||||
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
Please always include the name and version of the OS where the bug occurs and
|
||||||
more information.
|
the version of GLFW used. If you have cloned it, include the commit ID used.
|
||||||
|
|
||||||
|
If it's a build issue, please also include the build log and the name and
|
||||||
|
version of your development environment.
|
||||||
|
|
||||||
## System requirements
|
If it's a context creation issue, please also include the make and model of your
|
||||||
|
graphics card and the version of your driver.
|
||||||
|
|
||||||
GLFW supports Windows XP and later and macOS 10.8 and later. Linux and other
|
This will help both us and other people experiencing the same bug.
|
||||||
Unix-like systems running the X Window System are supported even without
|
|
||||||
a desktop environment or modern extensions, although some features require
|
|
||||||
a running window or clipboard manager. The OSMesa backend requires Mesa 6.3.
|
|
||||||
|
|
||||||
See the [compatibility guide](https://www.glfw.org/docs/latest/compat.html)
|
|
||||||
in the documentation for more information.
|
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
GLFW itself needs only CMake 3.1 or later and the headers and libraries for your
|
GLFW itself needs only the headers and libraries for your window system. It
|
||||||
OS and window system.
|
does not need the headers for any context creation API (WGL, GLX, EGL, NSGL) or
|
||||||
|
rendering API (OpenGL, OpenGL ES, Vulkan) to enable support for them.
|
||||||
|
|
||||||
The examples and test programs depend on a number of tiny libraries. These are
|
The examples and test programs depend on a number of tiny libraries. These are
|
||||||
located in the `deps/` directory.
|
located in the `deps/` directory.
|
||||||
|
@ -100,323 +67,225 @@ located in the `deps/` directory.
|
||||||
with command-line options
|
with command-line options
|
||||||
- [TinyCThread](https://github.com/tinycthread/tinycthread) for threaded
|
- [TinyCThread](https://github.com/tinycthread/tinycthread) for threaded
|
||||||
examples
|
examples
|
||||||
- [glad2](https://github.com/Dav1dde/glad) for loading OpenGL and Vulkan
|
- An OpenGL 3.2 core loader generated by
|
||||||
functions
|
[glad](https://github.com/Dav1dde/glad) for examples using modern OpenGL
|
||||||
- [linmath.h](https://github.com/datenwolf/linmath.h) for linear algebra in
|
- [linmath.h](https://github.com/datenwolf/linmath.h) for linear algebra in
|
||||||
examples
|
examples
|
||||||
- [Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) for test and example UI
|
- [Vulkan headers](https://www.khronos.org/registry/vulkan/) for Vulkan tests
|
||||||
- [stb\_image\_write](https://github.com/nothings/stb) for writing images to disk
|
|
||||||
|
|
||||||
The documentation is generated with [Doxygen](https://doxygen.org/) if CMake can
|
The Vulkan example additionally requires the Vulkan SDK to be installed, or it
|
||||||
find that tool.
|
will not be included in the build.
|
||||||
|
|
||||||
|
The documentation is generated with [Doxygen](http://doxygen.org/). If CMake
|
||||||
## Reporting bugs
|
does not find Doxygen, the documentation will not be generated.
|
||||||
|
|
||||||
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
|
||||||
Please check the [contribution
|
|
||||||
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
|
||||||
information on what to include when reporting a bug.
|
|
||||||
|
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
- Added `GLFW_PLATFORM` init hint for runtime platform selection (#1958)
|
- Added `glfwVulkanSupported`, `glfwGetRequiredInstanceExtensions`,
|
||||||
- Added `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`,
|
`glfwGetInstanceProcAddress`, `glfwGetPhysicalDevicePresentationSupport` and
|
||||||
`GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` and `GLFW_PLATFORM_NULL` symbols to
|
`glfwCreateWindowSurface` for platform independent Vulkan support
|
||||||
specify the desired platform (#1958)
|
- Added `glfwSetWindowMonitor` for switching between windowed and full screen
|
||||||
- Added `glfwGetPlatform` function to query what platform was selected (#1655,#1958)
|
modes and updating the monitor and desired video mode of full screen windows
|
||||||
- Added `glfwPlatformSupported` function to query if a platform is supported
|
- Added `glfwMaximizeWindow` and `GLFW_MAXIMIZED` for window maximization
|
||||||
(#1655,#1958)
|
- Added `glfwFocusWindow` for giving windows input focus
|
||||||
- Added `glfwInitAllocator` for setting a custom memory allocator (#544,#1628,#1947)
|
- Added `glfwSetWindowSizeLimits` and `glfwSetWindowAspectRatio` for setting
|
||||||
- Added `GLFWallocator` struct and `GLFWallocatefun`, `GLFWreallocatefun` and
|
absolute and relative window size limits
|
||||||
`GLFWdeallocatefun` types (#544,#1628,#1947)
|
- Added `glfwGetKeyName` for querying the layout-specific name of printable
|
||||||
- Added `glfwInitVulkanLoader` for using a non-default Vulkan loader (#1374,#1890)
|
keys
|
||||||
- Added `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR`,
|
- Added `glfwWaitEventsTimeout` for waiting for events for a set amount of time
|
||||||
`GLFW_RESIZE_ALL_CURSOR` and `GLFW_NOT_ALLOWED_CURSOR` cursor shapes (#427)
|
- Added `glfwSetWindowIcon` for setting the icon of a window
|
||||||
- Added `GLFW_RESIZE_EW_CURSOR` alias for `GLFW_HRESIZE_CURSOR` (#427)
|
- Added `glfwGetTimerValue` and `glfwGetTimerFrequency` for raw timer access
|
||||||
- Added `GLFW_RESIZE_NS_CURSOR` alias for `GLFW_VRESIZE_CURSOR` (#427)
|
- Added `glfwSetJoystickCallback` and `GLFWjoystickfun` for joystick connection
|
||||||
- Added `GLFW_POINTING_HAND_CURSOR` alias for `GLFW_HAND_CURSOR` (#427)
|
and disconnection events
|
||||||
- Added `GLFW_MOUSE_PASSTHROUGH` window hint for letting mouse input pass
|
- Added `GLFW_NO_API` for creating window without contexts
|
||||||
through the window (#1236,#1568)
|
- Added `GLFW_INCLUDE_VULKAN` for including the Vulkan header
|
||||||
- Added `GLFW_CURSOR_CAPTURED` cursor mode to confine the cursor to the window
|
- Added `GLFW_CONTEXT_CREATION_API`, `GLFW_NATIVE_CONTEXT_API` and
|
||||||
content area (#58)
|
`GLFW_EGL_CONTEXT_API` for run-time context creation API selection
|
||||||
- Added `GLFW_POSITION_X` and `GLFW_POSITION_Y` window hints for initial position
|
- Added `GLFW_CONTEXT_NO_ERROR` context hint for `GL_KHR_no_error` support
|
||||||
(#1603,#1747)
|
- Added `GLFW_TRUE` and `GLFW_FALSE` as client API independent boolean values
|
||||||
- Added `GLFW_ANY_POSITION` hint value for letting the window manager choose (#1603,#1747)
|
- Added icons to examples on Windows and OS X
|
||||||
- Added `GLFW_PLATFORM_UNAVAILABLE` error for platform detection failures (#1958)
|
- Relaxed rules for native access header macros
|
||||||
- Added `GLFW_FEATURE_UNAVAILABLE` error for platform limitations (#1692)
|
- Removed dependency on external OpenGL or OpenGL ES headers
|
||||||
- Added `GLFW_FEATURE_UNIMPLEMENTED` error for incomplete backends (#1692)
|
- Removed `_GLFW_USE_OPENGL`, `_GLFW_USE_GLESV1`, `_GLFW_USE_GLESV2`,
|
||||||
- Added `GLFW_WAYLAND_APP_ID` window hint string for Wayland app\_id selection
|
`_GLFW_WGL`, `_GLFW_NSGL`, `_GLFW_GLX` and `_GLFW_EGL` configuration macros
|
||||||
(#2121,#2122)
|
- [Win32] Added support for Windows 8.1 per-monitor DPI
|
||||||
- Added `GLFW_ANGLE_PLATFORM_TYPE` init hint and `GLFW_ANGLE_PLATFORM_TYPE_*`
|
- [Win32] Replaced winmm with XInput and DirectInput for joystick input
|
||||||
values to select ANGLE backend (#1380)
|
- [Win32] Bugfix: Window creation would segfault if video mode setting required
|
||||||
- Added `GLFW_X11_XCB_VULKAN_SURFACE` init hint for selecting X11 Vulkan
|
the system to be restarted
|
||||||
surface extension (#1793)
|
- [Win32] Bugfix: MinGW import library lacked the `lib` prefix
|
||||||
- Added `GLFW_NATIVE_INCLUDE_NONE` for disabling inclusion of native headers (#1348)
|
- [Win32] Bugfix: Monitor connection and disconnection events were not reported
|
||||||
- Added `GLFW_BUILD_WIN32` CMake option for enabling Win32 support (#1958)
|
when no windows existed
|
||||||
- Added `GLFW_BUILD_COCOA` CMake option for enabling Cocoa support (#1958)
|
- [Win32] Bugfix: Activating or deactivating displays in software did not
|
||||||
- Added `GLFW_BUILD_X11` CMake option for enabling X11 support (#1958)
|
trigger monitor callback
|
||||||
- Added `GLFW_LIBRARY_TYPE` CMake variable for overriding the library type
|
- [Win32] Bugfix: No monitors were listed on headless and VMware guest systems
|
||||||
(#279,#1307,#1497,#1574,#1928)
|
- [Win32] Bugfix: Pressing Ctrl+Pause would report `GLFW_KEY_UNKNOWN`
|
||||||
- Added `GLFW_PKG_CONFIG_REQUIRES_PRIVATE` and `GLFW_PKG_CONFIG_LIBS_PRIVATE` CMake
|
- [Win32] Bugfix: Window size events would be reported in wrong order when
|
||||||
variables exposing pkg-config dependencies (#1307)
|
restoring a full screen window
|
||||||
- Made joystick subsystem initialize at first use (#1284,#1646)
|
- [Cocoa] Made joystick polling more efficient
|
||||||
- Made `GLFW_DOUBLEBUFFER` a read-only window attribute
|
- [Cocoa] Removed support for OS X 10.6
|
||||||
- Updated the minimum required CMake version to 3.1
|
- [Cocoa] Bugfix: Full screen windows on secondary monitors were mispositioned
|
||||||
- Updated gamepad mappings from upstream
|
- [Cocoa] Bugfix: Connecting a joystick that reports no name would segfault
|
||||||
- Disabled tests and examples by default when built as a CMake subdirectory
|
- [Cocoa] Bugfix: Modifier flags cache was not updated when window became key
|
||||||
- Renamed `GLFW_USE_WAYLAND` CMake option to `GLFW_BUILD_WAYLAND` (#1958)
|
- [Cocoa] Bugfix: Dead key character composition did not work
|
||||||
- Removed `GLFW_USE_OSMESA` CMake option enabling the Null platform (#1958)
|
- [Cocoa] Bugfix: The CGL context was not released until the autorelease pool
|
||||||
- Removed CMake generated configuration header
|
was drained by another function
|
||||||
- Bugfix: The CMake config-file package used an absolute path and was not
|
- [X11] Bugfix: Monitor connection and disconnection events were not reported
|
||||||
relocatable (#1470)
|
- [X11] Bugfix: Decoding of UTF-8 text from XIM could continue past the end
|
||||||
- Bugfix: Video modes with a duplicate screen area were discarded (#1555,#1556)
|
- [X11] Bugfix: An XKB structure was leaked during `glfwInit`
|
||||||
- Bugfix: Compiling with -Wextra-semi caused warnings (#1440)
|
- [X11] Bugfix: XInput2 `XI_Motion` events interfered with the Steam overlay
|
||||||
- Bugfix: Built-in mappings failed because some OEMs re-used VID/PID (#1583)
|
- [POSIX] Bugfix: An unrelated TLS key could be deleted by `glfwTerminate`
|
||||||
- Bugfix: Some extension loader headers did not prevent default OpenGL header
|
- [Linux] Made joystick polling more efficient
|
||||||
inclusion (#1695)
|
- [WGL] Changed extension loading to only be performed once
|
||||||
- Bugfix: Buffers were swapped at creation on single-buffered windows (#1873)
|
- [WGL] Removed dependency on external WGL headers
|
||||||
- Bugfix: Gamepad mapping updates could spam `GLFW_INVALID_VALUE` due to
|
- [GLX] Added `glfwGetGLXWindow` to query the `GLXWindow` of a window
|
||||||
incompatible controllers sharing hardware ID (#1763)
|
- [GLX] Replaced legacy drawable with `GLXWindow`
|
||||||
- Bugfix: Native access functions for context handles did not check that the API matched
|
- [GLX] Removed dependency on external GLX headers
|
||||||
- Bugfix: `glfwMakeContextCurrent` would access TLS slot before initialization
|
- [GLX] Bugfix: NetBSD does not provide `libGL.so.1`
|
||||||
- Bugfix: `glfwSetGammaRamp` could emit `GLFW_INVALID_VALUE` before initialization
|
- [EGL] Added `_GLFW_USE_EGLPLATFORM_H` configuration macro for controlling
|
||||||
- Bugfix: `glfwGetJoystickUserPointer` returned `NULL` during disconnection (#2092)
|
whether to use an existing `EGL/eglplatform.h` header
|
||||||
- [Win32] Added the `GLFW_WIN32_KEYBOARD_MENU` window hint for enabling access
|
- [EGL] Added and documented test for if the context is current on the calling
|
||||||
to the window menu
|
thread during buffer swap
|
||||||
- [Win32] Added a version info resource to the GLFW DLL
|
- [EGL] Removed dependency on external EGL headers
|
||||||
- [Win32] Made hidden helper window use its own window class
|
|
||||||
- [Win32] Disabled framebuffer transparency on Windows 7 when DWM windows are
|
|
||||||
opaque (#1512)
|
|
||||||
- [Win32] Bugfix: `GLFW_INCLUDE_VULKAN` plus `VK_USE_PLATFORM_WIN32_KHR` caused
|
|
||||||
symbol redefinition (#1524)
|
|
||||||
- [Win32] Bugfix: The cursor position event was emitted before its cursor enter
|
|
||||||
event (#1490)
|
|
||||||
- [Win32] Bugfix: The window hint `GLFW_MAXIMIZED` did not move or resize the
|
|
||||||
window (#1499)
|
|
||||||
- [Win32] Bugfix: Disabled cursor mode interfered with some non-client actions
|
|
||||||
- [Win32] Bugfix: Super key was not released after Win+V hotkey (#1622)
|
|
||||||
- [Win32] Bugfix: `glfwGetKeyName` could access out of bounds and return an
|
|
||||||
invalid pointer
|
|
||||||
- [Win32] Bugfix: Some synthetic key events were reported as `GLFW_KEY_UNKNOWN`
|
|
||||||
(#1623)
|
|
||||||
- [Win32] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
|
|
||||||
- [Win32] Bugfix: Monitor functions could return invalid values after
|
|
||||||
configuration change (#1761)
|
|
||||||
- [Win32] Bugfix: Initialization would segfault on Windows 8 (not 8.1) (#1775)
|
|
||||||
- [Win32] Bugfix: Duplicate size events were not filtered (#1610)
|
|
||||||
- [Win32] Bugfix: Full screen windows were incorrectly resized by DPI changes
|
|
||||||
(#1582)
|
|
||||||
- [Win32] Bugfix: `GLFW_SCALE_TO_MONITOR` had no effect on systems older than
|
|
||||||
Windows 10 version 1703 (#1511)
|
|
||||||
- [Win32] Bugfix: `USE_MSVC_RUNTIME_LIBRARY_DLL` had no effect on CMake 3.15 or
|
|
||||||
later (#1783,#1796)
|
|
||||||
- [Win32] Bugfix: Compilation with LLVM for Windows failed (#1807,#1824,#1874)
|
|
||||||
- [Win32] Bugfix: The foreground lock timeout was overridden, ignoring the user
|
|
||||||
- [Win32] Bugfix: Content scale queries could fail silently (#1615)
|
|
||||||
- [Win32] Bugfix: Content scales could have garbage values if monitor was recently
|
|
||||||
disconnected (#1615)
|
|
||||||
- [Win32] Bugfix: A window created maximized and undecorated would cover the whole
|
|
||||||
monitor (#1806)
|
|
||||||
- [Win32] Bugfix: The default restored window position was lost when creating a maximized
|
|
||||||
window
|
|
||||||
- [Win32] Bugfix: `glfwMaximizeWindow` would make a hidden window visible
|
|
||||||
- [Win32] Bugfix: `Alt+PrtSc` would emit `GLFW_KEY_UNKNOWN` and a different
|
|
||||||
scancode than `PrtSc` (#1993)
|
|
||||||
- [Win32] Bugfix: `GLFW_KEY_PAUSE` scancode from `glfwGetKeyScancode` did not
|
|
||||||
match event scancode (#1993)
|
|
||||||
- [Win32] Bugfix: Instance-local operations used executable instance (#469,#1296,#1395)
|
|
||||||
- [Win32] Bugfix: The OSMesa library was not unloaded on termination
|
|
||||||
- [Win32] Bugfix: Right shift emitted `GLFW_KEY_UNKNOWN` when using a CJK IME (#2050)
|
|
||||||
- [Cocoa] Added support for `VK_EXT_metal_surface` (#1619)
|
|
||||||
- [Cocoa] Added locating the Vulkan loader at runtime in an application bundle
|
|
||||||
- [Cocoa] Moved main menu creation to GLFW initialization time (#1649)
|
|
||||||
- [Cocoa] Changed `EGLNativeWindowType` from `NSView` to `CALayer` (#1169)
|
|
||||||
- [Cocoa] Changed F13 key to report Print Screen for cross-platform consistency
|
|
||||||
(#1786)
|
|
||||||
- [Cocoa] Disabled macOS fullscreen when `GLFW_RESIZABLE` is false
|
|
||||||
- [Cocoa] Removed dependency on the CoreVideo framework
|
|
||||||
- [Cocoa] Bugfix: `glfwSetWindowSize` used a bottom-left anchor point (#1553)
|
|
||||||
- [Cocoa] Bugfix: Window remained on screen after destruction until event poll
|
|
||||||
(#1412)
|
|
||||||
- [Cocoa] Bugfix: Event processing before window creation would assert (#1543)
|
|
||||||
- [Cocoa] Bugfix: Undecorated windows could not be iconified on recent macOS
|
|
||||||
- [Cocoa] Bugfix: Touching event queue from secondary thread before main thread
|
|
||||||
would abort (#1649)
|
|
||||||
- [Cocoa] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
|
|
||||||
(#1635)
|
|
||||||
- [Cocoa] Bugfix: Failing to retrieve the refresh rate of built-in displays
|
|
||||||
could leak memory
|
|
||||||
- [Cocoa] Bugfix: Objective-C files were compiled as C with CMake 3.19 (#1787)
|
|
||||||
- [Cocoa] Bugfix: Duplicate video modes were not filtered out (#1830)
|
|
||||||
- [Cocoa] Bugfix: Menu bar was not clickable on macOS 10.15+ until it lost and
|
|
||||||
regained focus (#1648,#1802)
|
|
||||||
- [Cocoa] Bugfix: Monitor name query could segfault on macOS 11 (#1809,#1833)
|
|
||||||
- [Cocoa] Bugfix: The install name of the installed dylib was relative (#1504)
|
|
||||||
- [Cocoa] Bugfix: The MoltenVK layer contents scale was updated only after
|
|
||||||
related events were emitted
|
|
||||||
- [Cocoa] Bugfix: Moving the cursor programmatically would freeze it for
|
|
||||||
a fraction of a second (#1962)
|
|
||||||
- [Cocoa] Bugfix: `kIOMasterPortDefault` was deprecated in macOS 12.0 (#1980)
|
|
||||||
- [Cocoa] Bugfix: `kUTTypeURL` was deprecated in macOS 12.0 (#2003)
|
|
||||||
- [Cocoa] Bugfix: A connected Apple AirPlay would emit a useless error (#1791)
|
|
||||||
- [Cocoa] Bugfix: The EGL and OSMesa libraries were not unloaded on termination
|
|
||||||
- [Cocoa] Bugfix: `GLFW_MAXIMIZED` was always true when `GLFW_RESIZABLE` was false
|
|
||||||
- [Cocoa] Bugfix: Changing `GLFW_DECORATED` in macOS fullscreen would abort
|
|
||||||
application (#1886)
|
|
||||||
- [Cocoa] Bugfix: Setting a monitor from macOS fullscreen would abort
|
|
||||||
application (#2110)
|
|
||||||
- [Cocoa] Bugfix: The Vulkan loader was not loaded from the `Frameworks` bundle
|
|
||||||
subdirectory (#2113,#2120)
|
|
||||||
- [X11] Bugfix: The CMake files did not check for the XInput headers (#1480)
|
|
||||||
- [X11] Bugfix: Key names were not updated when the keyboard layout changed
|
|
||||||
(#1462,#1528)
|
|
||||||
- [X11] Bugfix: Decorations could not be enabled after window creation (#1566)
|
|
||||||
- [X11] Bugfix: Content scale fallback value could be inconsistent (#1578)
|
|
||||||
- [X11] Bugfix: `glfwMaximizeWindow` had no effect on hidden windows
|
|
||||||
- [X11] Bugfix: Clearing `GLFW_FLOATING` on a hidden window caused invalid read
|
|
||||||
- [X11] Bugfix: Changing `GLFW_FLOATING` on a hidden window could silently fail
|
|
||||||
- [X11] Bugfix: Disabled cursor mode was interrupted by indicator windows
|
|
||||||
- [X11] Bugfix: Monitor physical dimensions could be reported as zero mm
|
|
||||||
- [X11] Bugfix: Window position events were not emitted during resizing (#1613)
|
|
||||||
- [X11] Bugfix: `glfwFocusWindow` could terminate on older WMs or without a WM
|
|
||||||
- [X11] Bugfix: Querying a disconnected monitor could segfault (#1602)
|
|
||||||
- [X11] Bugfix: IME input of CJK was broken for "C" locale (#1587,#1636)
|
|
||||||
- [X11] Bugfix: Termination would segfault if the IM had been destroyed
|
|
||||||
- [X11] Bugfix: Any IM started after initialization would not be detected
|
|
||||||
- [X11] Bugfix: Xlib errors caused by other parts of the application could be
|
|
||||||
reported as GLFW errors
|
|
||||||
- [X11] Bugfix: A handle race condition could cause a `BadWindow` error (#1633)
|
|
||||||
- [X11] Bugfix: XKB path used keysyms instead of physical locations for
|
|
||||||
non-printable keys (#1598)
|
|
||||||
- [X11] Bugfix: Function keys were mapped to `GLFW_KEY_UNKNOWN` for some layout
|
|
||||||
combinations (#1598)
|
|
||||||
- [X11] Bugfix: Keys pressed simultaneously with others were not always
|
|
||||||
reported (#1112,#1415,#1472,#1616)
|
|
||||||
- [X11] Bugfix: Some window attributes were not applied on leaving fullscreen
|
|
||||||
(#1863)
|
|
||||||
- [X11] Bugfix: Changing `GLFW_FLOATING` could leak memory
|
|
||||||
- [X11] Bugfix: Icon pixel format conversion worked only by accident, relying on
|
|
||||||
undefined behavior (#1986)
|
|
||||||
- [X11] Bugfix: Dynamic loading on OpenBSD failed due to soname differences
|
|
||||||
- [X11] Bugfix: Waiting for events would fail if file descriptor was too large
|
|
||||||
(#2024)
|
|
||||||
- [X11] Bugfix: Joystick events could lead to busy-waiting (#1872)
|
|
||||||
- [X11] Bugfix: `glfwWaitEvents*` did not continue for joystick events
|
|
||||||
- [X11] Bugfix: `glfwPostEmptyEvent` could be ignored due to race condition
|
|
||||||
(#379,#1281,#1285,#2033)
|
|
||||||
- [X11] Bugfix: Dynamic loading on NetBSD failed due to soname differences
|
|
||||||
- [X11] Bugfix: Left shift of int constant relied on undefined behavior (#1951)
|
|
||||||
- [X11] Bugfix: The OSMesa libray was not unloaded on termination
|
|
||||||
- [X11] Bugfix: A malformed response during selection transfer could cause a segfault
|
|
||||||
- [X11] Bugfix: Some calls would reset Xlib to the default error handler (#2108)
|
|
||||||
- [Wayland] Added improved fallback window decorations via libdecor (#1639,#1693)
|
|
||||||
- [Wayland] Added dynamic loading of all Wayland libraries
|
|
||||||
- [Wayland] Added support for key names via xkbcommon
|
|
||||||
- [Wayland] Added support for file path drop events (#2040)
|
|
||||||
- [Wayland] Added support for more human-readable monitor names where available
|
|
||||||
- [Wayland] Disabled alpha channel for opaque windows on systems lacking
|
|
||||||
`EGL_EXT_present_opaque` (#1895)
|
|
||||||
- [Wayland] Removed support for `wl_shell` (#1443)
|
|
||||||
- [Wayland] Bugfix: The `GLFW_HAND_CURSOR` shape used the wrong image (#1432)
|
|
||||||
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
|
|
||||||
- [Wayland] Bugfix: Repeated keys could be reported with `NULL` window (#1704)
|
|
||||||
- [Wayland] Bugfix: Retrieving partial framebuffer size would segfault
|
|
||||||
- [Wayland] Bugfix: Scrolling offsets were inverted compared to other platforms
|
|
||||||
(#1463)
|
|
||||||
- [Wayland] Bugfix: Client-Side Decorations were destroyed in the wrong order
|
|
||||||
(#1798)
|
|
||||||
- [Wayland] Bugfix: Monitors physical size could report zero (#1784,#1792)
|
|
||||||
- [Wayland] Bugfix: Some keys were not repeating in Wayland (#1908)
|
|
||||||
- [Wayland] Bugfix: Non-arrow cursors are offset from the hotspot (#1706,#1899)
|
|
||||||
- [Wayland] Bugfix: The `O_CLOEXEC` flag was not defined on FreeBSD
|
|
||||||
- [Wayland] Bugfix: Key repeat could lead to a race condition (#1710)
|
|
||||||
- [Wayland] Bugfix: Activating a window would emit two input focus events
|
|
||||||
- [Wayland] Bugfix: Disable key repeat mechanism when window loses input focus
|
|
||||||
- [Wayland] Bugfix: Window hiding and showing did not work (#1492,#1731)
|
|
||||||
- [Wayland] Bugfix: A key being repeated was not released when window lost focus
|
|
||||||
- [Wayland] Bugfix: Showing a hidden window did not emit a window refresh event
|
|
||||||
- [Wayland] Bugfix: Full screen window creation did not ignore `GLFW_VISIBLE`
|
|
||||||
- [Wayland] Bugfix: Some keys were reported as wrong key or `GLFW_KEY_UNKNOWN`
|
|
||||||
- [Wayland] Bugfix: Text input did not repeat along with key repeat
|
|
||||||
- [Wayland] Bugfix: `glfwPostEmptyEvent` sometimes had no effect (#1520,#1521)
|
|
||||||
- [Wayland] Bugfix: `glfwSetClipboardString` would fail if set to result of
|
|
||||||
`glfwGetClipboardString`
|
|
||||||
- [Wayland] Bugfix: Data source creation error would cause double free at termination
|
|
||||||
- [Wayland] Bugfix: Partial writes of clipboard string would cause beginning to repeat
|
|
||||||
- [Wayland] Bugfix: Some errors would cause clipboard string transfer to hang
|
|
||||||
- [Wayland] Bugfix: Drag and drop data was misinterpreted as clipboard string
|
|
||||||
- [Wayland] Bugfix: MIME type matching was not performed for clipboard string
|
|
||||||
- [Wayland] Bugfix: The OSMesa library was not unloaded on termination
|
|
||||||
- [Wayland] Bugfix: `glfwCreateWindow` could emit `GLFW_FEATURE_UNAVAILABLE`
|
|
||||||
- [Wayland] Bugfix: Lock key modifier bits were only set when lock keys were pressed
|
|
||||||
- [Wayland] Bugfix: A window leaving full screen mode would be iconified (#1995)
|
|
||||||
- [Wayland] Bugfix: A window leaving full screen mode ignored its desired size
|
|
||||||
- [Wayland] Bugfix: `glfwSetWindowMonitor` did not update windowed mode size
|
|
||||||
- [Wayland] Bugfix: `glfwRestoreWindow` would make a full screen window windowed
|
|
||||||
- [Wayland] Bugfix: A window maximized or restored by the user would enter an
|
|
||||||
inconsistent state
|
|
||||||
- [Wayland] Bugfix: Window maximization events were not emitted
|
|
||||||
- [Wayland] Bugfix: `glfwRestoreWindow` assumed it was always in windowed mode
|
|
||||||
- [Wayland] Bugfix: `glfwSetWindowSize` would resize a full screen window
|
|
||||||
- [Wayland] Bugfix: A window content scale event would be emitted every time
|
|
||||||
the window resized
|
|
||||||
- [Wayland] Bugfix: If `glfwInit` failed it would close stdin
|
|
||||||
- [Wayland] Bugfix: Manual resizing with fallback decorations behaved erratically
|
|
||||||
(#1991,#2115,#2127)
|
|
||||||
- [Wayland] Bugfix: Size limits included frame size for fallback decorations
|
|
||||||
- [Wayland] Bugfix: Updating `GLFW_DECORATED` had no effect on server-side
|
|
||||||
decorations
|
|
||||||
- [Wayland] Bugfix: A monitor would be reported as connected again if its scale
|
|
||||||
changed
|
|
||||||
- [Wayland] Bugfix: `glfwTerminate` would segfault if any monitor had changed
|
|
||||||
scale
|
|
||||||
- [Wayland] Bugfix: Window content scale events were not emitted when monitor
|
|
||||||
scale changed
|
|
||||||
- [Wayland] Bugfix: `glfwSetWindowAspectRatio` reported an error instead of
|
|
||||||
applying the specified ratio
|
|
||||||
- [Wayland] Bugfix: `GLFW_MAXIMIZED` window hint had no effect
|
|
||||||
- [Wayland] Bugfix: `glfwRestoreWindow` had no effect before first show
|
|
||||||
- [Wayland] Bugfix: Hiding and then showing a window caused program abort on
|
|
||||||
wlroots compositors (#1268)
|
|
||||||
- [Wayland] Bugfix: `GLFW_DECORATED` was ignored when showing a window with XDG
|
|
||||||
decorations
|
|
||||||
- [Wayland] Bugfix: Connecting a mouse after `glfwInit` would segfault (#1450)
|
|
||||||
- [Wayland] Bugfix: Joysticks connected after `glfwInit` were not detected (#2198)
|
|
||||||
- [POSIX] Removed use of deprecated function `gettimeofday`
|
|
||||||
- [POSIX] Bugfix: `CLOCK_MONOTONIC` was not correctly tested for or enabled
|
|
||||||
- [Linux] Bugfix: Joysticks without buttons were ignored (#2042,#2043)
|
|
||||||
- [WGL] Disabled the DWM swap interval hack for Windows 8 and later (#1072)
|
|
||||||
- [NSGL] Removed enforcement of forward-compatible flag for core contexts
|
|
||||||
- [NSGL] Bugfix: `GLFW_COCOA_RETINA_FRAMEBUFFER` had no effect on newer
|
|
||||||
macOS versions (#1442)
|
|
||||||
- [NSGL] Bugfix: Workaround for swap interval on 10.14 broke on 10.12 (#1483)
|
|
||||||
- [NSGL] Bugfix: Defining `GL_SILENCE_DEPRECATION` externally caused
|
|
||||||
a duplicate definition warning (#1840)
|
|
||||||
- [EGL] Added platform selection via the `EGL_EXT_platform_base` extension
|
|
||||||
(#442)
|
|
||||||
- [EGL] Added ANGLE backend selection via `EGL_ANGLE_platform_angle` extension
|
|
||||||
(#1380)
|
|
||||||
[EGL] Added loading of glvnd `libOpenGL.so.0` where available for OpenGL
|
|
||||||
- [EGL] Bugfix: The `GLFW_DOUBLEBUFFER` context attribute was ignored (#1843)
|
|
||||||
- [GLX] Added loading of glvnd `libGLX.so.0` where available
|
|
||||||
- [GLX] Bugfix: Context creation failed if GLX 1.4 was not exported by GLX library
|
|
||||||
|
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
On [glfw.org](https://www.glfw.org/) you can find the latest version of GLFW, as
|
The official website for GLFW is [glfw.org](http://www.glfw.org/). There you
|
||||||
well as news, documentation and other information about the project.
|
can find the latest version of GLFW, as well as news, documentation and other
|
||||||
|
information about the project.
|
||||||
|
|
||||||
If you have questions related to the use of GLFW, we have a
|
If you have questions related to the use of GLFW, we have a
|
||||||
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
[support forum](http://discourse.glfw.org/), and the IRC
|
||||||
[Libera.Chat](https://libera.chat/).
|
channel `#glfw` on [Freenode](http://freenode.net/).
|
||||||
|
|
||||||
If you have a bug to report, a patch to submit or a feature you'd like to
|
If you have a bug to report, a patch to submit or a feature you'd like to
|
||||||
request, please file it in the
|
request, please file it in the
|
||||||
[issue tracker](https://github.com/glfw/glfw/issues) on GitHub.
|
[issue tracker](https://github.com/glfw/glfw/issues) on GitHub.
|
||||||
|
|
||||||
Finally, if you're interested in helping out with the development of GLFW or
|
Finally, if you're interested in helping out with the development of GLFW or
|
||||||
porting it to your favorite platform, join us on the forum, GitHub or IRC.
|
porting it to your favorite platform, join us on GitHub or IRC.
|
||||||
|
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
GLFW exists because people around the world donated their time and lent their
|
||||||
|
skills.
|
||||||
|
|
||||||
|
- Bobyshev Alexander
|
||||||
|
- artblanc
|
||||||
|
- arturo
|
||||||
|
- Matt Arsenault
|
||||||
|
- Keith Bauer
|
||||||
|
- John Bartholomew
|
||||||
|
- Niklas Behrens
|
||||||
|
- Niklas Bergström
|
||||||
|
- Doug Binks
|
||||||
|
- blanco
|
||||||
|
- Martin Capitanio
|
||||||
|
- Chi-kwan Chan
|
||||||
|
- Lambert Clara
|
||||||
|
- Andrew Corrigan
|
||||||
|
- Noel Cower
|
||||||
|
- Jarrod Davis
|
||||||
|
- Olivier Delannoy
|
||||||
|
- Paul R. Deppe
|
||||||
|
- Michael Dickens
|
||||||
|
- Роман Донченко
|
||||||
|
- Mario Dorn
|
||||||
|
- Jonathan Dummer
|
||||||
|
- Ralph Eastwood
|
||||||
|
- Siavash Eliasi
|
||||||
|
- Michael Fogleman
|
||||||
|
- Gerald Franz
|
||||||
|
- GeO4d
|
||||||
|
- Marcus Geelnard
|
||||||
|
- Eloi Marín Gratacós
|
||||||
|
- Stefan Gustavson
|
||||||
|
- Sylvain Hellegouarch
|
||||||
|
- Matthew Henry
|
||||||
|
- heromyth
|
||||||
|
- Lucas Hinderberger
|
||||||
|
- Paul Holden
|
||||||
|
- IntellectualKitty
|
||||||
|
- Aaron Jacobs
|
||||||
|
- Toni Jovanoski
|
||||||
|
- Arseny Kapoulkine
|
||||||
|
- Osman Keskin
|
||||||
|
- Cameron King
|
||||||
|
- Peter Knut
|
||||||
|
- Christoph Kubisch
|
||||||
|
- Eric Larson
|
||||||
|
- Robin Leffmann
|
||||||
|
- Glenn Lewis
|
||||||
|
- Shane Liesegang
|
||||||
|
- Eyal Lotem
|
||||||
|
- Дмитри Малышев
|
||||||
|
- Martins Mozeiko
|
||||||
|
- Tristam MacDonald
|
||||||
|
- Hans Mackowiak
|
||||||
|
- Zbigniew Mandziejewicz
|
||||||
|
- Kyle McDonald
|
||||||
|
- David Medlock
|
||||||
|
- Bryce Mehring
|
||||||
|
- Jonathan Mercier
|
||||||
|
- Marcel Metz
|
||||||
|
- Jonathan Miller
|
||||||
|
- Kenneth Miller
|
||||||
|
- Bruce Mitchener
|
||||||
|
- Jack Moffitt
|
||||||
|
- Jeff Molofee
|
||||||
|
- Jon Morton
|
||||||
|
- Pierre Moulon
|
||||||
|
- Julian Møller
|
||||||
|
- Kamil Nowakowski
|
||||||
|
- Ozzy
|
||||||
|
- Andri Pálsson
|
||||||
|
- Peoro
|
||||||
|
- Braden Pellett
|
||||||
|
- Arturo J. Pérez
|
||||||
|
- Orson Peters
|
||||||
|
- Emmanuel Gil Peyrot
|
||||||
|
- Cyril Pichard
|
||||||
|
- Pieroman
|
||||||
|
- Jorge Rodriguez
|
||||||
|
- Ed Ropple
|
||||||
|
- Aleksey Rybalkin
|
||||||
|
- Riku Salminen
|
||||||
|
- Brandon Schaefer
|
||||||
|
- Sebastian Schuberth
|
||||||
|
- Matt Sealey
|
||||||
|
- SephiRok
|
||||||
|
- Steve Sexton
|
||||||
|
- Systemcluster
|
||||||
|
- Yoshiki Shibukawa
|
||||||
|
- Dmitri Shuralyov
|
||||||
|
- Daniel Skorupski
|
||||||
|
- Bradley Smith
|
||||||
|
- Julian Squires
|
||||||
|
- Johannes Stein
|
||||||
|
- Justin Stoecker
|
||||||
|
- Elviss Strazdins
|
||||||
|
- Nathan Sweet
|
||||||
|
- TTK-Bandit
|
||||||
|
- Sergey Tikhomirov
|
||||||
|
- A. Tombs
|
||||||
|
- Ioannis Tsakpinis
|
||||||
|
- Samuli Tuomola
|
||||||
|
- urraka
|
||||||
|
- Jari Vetoniemi
|
||||||
|
- Ricardo Vieira
|
||||||
|
- Nicholas Vitovitch
|
||||||
|
- Simon Voordouw
|
||||||
|
- Torsten Walluhn
|
||||||
|
- Patrick Walton
|
||||||
|
- Xo Wang
|
||||||
|
- Jay Weisskopf
|
||||||
|
- Frank Wille
|
||||||
|
- yuriks
|
||||||
|
- Santi Zupancic
|
||||||
|
- Jonas Ådahl
|
||||||
|
- Lasse Öörni
|
||||||
|
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
||||||
|
reports, patches, feedback, testing and encouragement
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
if (NOT EXISTS "@GLFW_BINARY_DIR@/install_manifest.txt")
|
if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
message(FATAL_ERROR "Cannot find install manifest: \"@GLFW_BINARY_DIR@/install_manifest.txt\"")
|
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(READ "@GLFW_BINARY_DIR@/install_manifest.txt" files)
|
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
string(REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
|
||||||
foreach (file ${files})
|
foreach (file ${files})
|
282
deps/KHR/khrplatform.h
vendored
Normal file
282
deps/KHR/khrplatform.h
vendored
Normal file
|
@ -0,0 +1,282 @@
|
||||||
|
#ifndef __khrplatform_h_
|
||||||
|
#define __khrplatform_h_
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2008-2009 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
** copy of this software and/or associated documentation files (the
|
||||||
|
** "Materials"), to deal in the Materials without restriction, including
|
||||||
|
** without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||||
|
** permit persons to whom the Materials are furnished to do so, subject to
|
||||||
|
** the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included
|
||||||
|
** in all copies or substantial portions of the Materials.
|
||||||
|
**
|
||||||
|
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Khronos platform-specific types and definitions.
|
||||||
|
*
|
||||||
|
* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $
|
||||||
|
*
|
||||||
|
* Adopters may modify this file to suit their platform. Adopters are
|
||||||
|
* encouraged to submit platform specific modifications to the Khronos
|
||||||
|
* group so that they can be included in future versions of this file.
|
||||||
|
* Please submit changes by sending them to the public Khronos Bugzilla
|
||||||
|
* (http://khronos.org/bugzilla) by filing a bug against product
|
||||||
|
* "Khronos (general)" component "Registry".
|
||||||
|
*
|
||||||
|
* A predefined template which fills in some of the bug fields can be
|
||||||
|
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
|
||||||
|
* must create a Bugzilla login first.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* See the Implementer's Guidelines for information about where this file
|
||||||
|
* should be located on your system and for more details of its use:
|
||||||
|
* http://www.khronos.org/registry/implementers_guide.pdf
|
||||||
|
*
|
||||||
|
* This file should be included as
|
||||||
|
* #include <KHR/khrplatform.h>
|
||||||
|
* by Khronos client API header files that use its types and defines.
|
||||||
|
*
|
||||||
|
* The types in khrplatform.h should only be used to define API-specific types.
|
||||||
|
*
|
||||||
|
* Types defined in khrplatform.h:
|
||||||
|
* khronos_int8_t signed 8 bit
|
||||||
|
* khronos_uint8_t unsigned 8 bit
|
||||||
|
* khronos_int16_t signed 16 bit
|
||||||
|
* khronos_uint16_t unsigned 16 bit
|
||||||
|
* khronos_int32_t signed 32 bit
|
||||||
|
* khronos_uint32_t unsigned 32 bit
|
||||||
|
* khronos_int64_t signed 64 bit
|
||||||
|
* khronos_uint64_t unsigned 64 bit
|
||||||
|
* khronos_intptr_t signed same number of bits as a pointer
|
||||||
|
* khronos_uintptr_t unsigned same number of bits as a pointer
|
||||||
|
* khronos_ssize_t signed size
|
||||||
|
* khronos_usize_t unsigned size
|
||||||
|
* khronos_float_t signed 32 bit floating point
|
||||||
|
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
||||||
|
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
||||||
|
* nanoseconds
|
||||||
|
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
||||||
|
* khronos_boolean_enum_t enumerated boolean type. This should
|
||||||
|
* only be used as a base type when a client API's boolean type is
|
||||||
|
* an enum. Client APIs which use an integer or other type for
|
||||||
|
* booleans cannot use this as the base type for their boolean.
|
||||||
|
*
|
||||||
|
* Tokens defined in khrplatform.h:
|
||||||
|
*
|
||||||
|
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
||||||
|
*
|
||||||
|
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
||||||
|
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
||||||
|
*
|
||||||
|
* Calling convention macros defined in this file:
|
||||||
|
* KHRONOS_APICALL
|
||||||
|
* KHRONOS_APIENTRY
|
||||||
|
* KHRONOS_APIATTRIBUTES
|
||||||
|
*
|
||||||
|
* These may be used in function prototypes as:
|
||||||
|
*
|
||||||
|
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
||||||
|
* int arg1,
|
||||||
|
* int arg2) KHRONOS_APIATTRIBUTES;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Definition of KHRONOS_APICALL
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
* This precedes the return type of the function in the function prototype.
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||||
|
# define KHRONOS_APICALL __declspec(dllimport)
|
||||||
|
#elif defined (__SYMBIAN32__)
|
||||||
|
# define KHRONOS_APICALL IMPORT_C
|
||||||
|
#else
|
||||||
|
# define KHRONOS_APICALL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Definition of KHRONOS_APIENTRY
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
* This follows the return type of the function and precedes the function
|
||||||
|
* name in the function prototype.
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
||||||
|
/* Win32 but not WinCE */
|
||||||
|
# define KHRONOS_APIENTRY __stdcall
|
||||||
|
#else
|
||||||
|
# define KHRONOS_APIENTRY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Definition of KHRONOS_APIATTRIBUTES
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
* This follows the closing parenthesis of the function prototype arguments.
|
||||||
|
*/
|
||||||
|
#if defined (__ARMCC_2__)
|
||||||
|
#define KHRONOS_APIATTRIBUTES __softfp
|
||||||
|
#else
|
||||||
|
#define KHRONOS_APIATTRIBUTES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* basic type definitions
|
||||||
|
*-----------------------------------------------------------------------*/
|
||||||
|
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Using <stdint.h>
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
typedef int32_t khronos_int32_t;
|
||||||
|
typedef uint32_t khronos_uint32_t;
|
||||||
|
typedef int64_t khronos_int64_t;
|
||||||
|
typedef uint64_t khronos_uint64_t;
|
||||||
|
#define KHRONOS_SUPPORT_INT64 1
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 1
|
||||||
|
|
||||||
|
#elif defined(__VMS ) || defined(__sgi)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Using <inttypes.h>
|
||||||
|
*/
|
||||||
|
#include <inttypes.h>
|
||||||
|
typedef int32_t khronos_int32_t;
|
||||||
|
typedef uint32_t khronos_uint32_t;
|
||||||
|
typedef int64_t khronos_int64_t;
|
||||||
|
typedef uint64_t khronos_uint64_t;
|
||||||
|
#define KHRONOS_SUPPORT_INT64 1
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 1
|
||||||
|
|
||||||
|
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Win32
|
||||||
|
*/
|
||||||
|
typedef __int32 khronos_int32_t;
|
||||||
|
typedef unsigned __int32 khronos_uint32_t;
|
||||||
|
typedef __int64 khronos_int64_t;
|
||||||
|
typedef unsigned __int64 khronos_uint64_t;
|
||||||
|
#define KHRONOS_SUPPORT_INT64 1
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 1
|
||||||
|
|
||||||
|
#elif defined(__sun__) || defined(__digital__)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sun or Digital
|
||||||
|
*/
|
||||||
|
typedef int khronos_int32_t;
|
||||||
|
typedef unsigned int khronos_uint32_t;
|
||||||
|
#if defined(__arch64__) || defined(_LP64)
|
||||||
|
typedef long int khronos_int64_t;
|
||||||
|
typedef unsigned long int khronos_uint64_t;
|
||||||
|
#else
|
||||||
|
typedef long long int khronos_int64_t;
|
||||||
|
typedef unsigned long long int khronos_uint64_t;
|
||||||
|
#endif /* __arch64__ */
|
||||||
|
#define KHRONOS_SUPPORT_INT64 1
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 1
|
||||||
|
|
||||||
|
#elif 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hypothetical platform with no float or int64 support
|
||||||
|
*/
|
||||||
|
typedef int khronos_int32_t;
|
||||||
|
typedef unsigned int khronos_uint32_t;
|
||||||
|
#define KHRONOS_SUPPORT_INT64 0
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 0
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generic fallback
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
typedef int32_t khronos_int32_t;
|
||||||
|
typedef uint32_t khronos_uint32_t;
|
||||||
|
typedef int64_t khronos_int64_t;
|
||||||
|
typedef uint64_t khronos_uint64_t;
|
||||||
|
#define KHRONOS_SUPPORT_INT64 1
|
||||||
|
#define KHRONOS_SUPPORT_FLOAT 1
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Types that are (so far) the same on all platforms
|
||||||
|
*/
|
||||||
|
typedef signed char khronos_int8_t;
|
||||||
|
typedef unsigned char khronos_uint8_t;
|
||||||
|
typedef signed short int khronos_int16_t;
|
||||||
|
typedef unsigned short int khronos_uint16_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Types that differ between LLP64 and LP64 architectures - in LLP64,
|
||||||
|
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
|
||||||
|
* to be the only LLP64 architecture in current use.
|
||||||
|
*/
|
||||||
|
#ifdef _WIN64
|
||||||
|
typedef signed long long int khronos_intptr_t;
|
||||||
|
typedef unsigned long long int khronos_uintptr_t;
|
||||||
|
typedef signed long long int khronos_ssize_t;
|
||||||
|
typedef unsigned long long int khronos_usize_t;
|
||||||
|
#else
|
||||||
|
typedef signed long int khronos_intptr_t;
|
||||||
|
typedef unsigned long int khronos_uintptr_t;
|
||||||
|
typedef signed long int khronos_ssize_t;
|
||||||
|
typedef unsigned long int khronos_usize_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if KHRONOS_SUPPORT_FLOAT
|
||||||
|
/*
|
||||||
|
* Float type
|
||||||
|
*/
|
||||||
|
typedef float khronos_float_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if KHRONOS_SUPPORT_INT64
|
||||||
|
/* Time types
|
||||||
|
*
|
||||||
|
* These types can be used to represent a time interval in nanoseconds or
|
||||||
|
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
||||||
|
* of nanoseconds since some arbitrary system event (e.g. since the last
|
||||||
|
* time the system booted). The Unadjusted System Time is an unsigned
|
||||||
|
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
||||||
|
* may be either signed or unsigned.
|
||||||
|
*/
|
||||||
|
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
||||||
|
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dummy value used to pad enum types to 32 bits.
|
||||||
|
*/
|
||||||
|
#ifndef KHRONOS_MAX_ENUM
|
||||||
|
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enumerated boolean type
|
||||||
|
*
|
||||||
|
* Values other than zero should be considered to be true. Therefore
|
||||||
|
* comparisons should not be made against KHRONOS_TRUE.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
KHRONOS_FALSE = 0,
|
||||||
|
KHRONOS_TRUE = 1,
|
||||||
|
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
||||||
|
} khronos_boolean_enum_t;
|
||||||
|
|
||||||
|
#endif /* __khrplatform_h_ */
|
1555
deps/glad.c
vendored
Normal file
1555
deps/glad.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5996
deps/glad/gl.h
vendored
5996
deps/glad/gl.h
vendored
File diff suppressed because it is too large
Load Diff
3520
deps/glad/glad.h
vendored
Normal file
3520
deps/glad/glad.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1805
deps/glad/gles2.h
vendored
1805
deps/glad/gles2.h
vendored
File diff suppressed because it is too large
Load Diff
6330
deps/glad/vulkan.h
vendored
6330
deps/glad/vulkan.h
vendored
File diff suppressed because it is too large
Load Diff
239
deps/linmath.h
vendored
239
deps/linmath.h
vendored
|
@ -1,96 +1,70 @@
|
||||||
#ifndef LINMATH_H
|
#ifndef LINMATH_H
|
||||||
#define LINMATH_H
|
#define LINMATH_H
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* 2021-03-21 Camilla Löwy <elmindreda@elmindreda.org>
|
#ifdef _MSC_VER
|
||||||
* - Replaced double constants with float equivalents
|
#define inline __inline
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LINMATH_NO_INLINE
|
|
||||||
#define LINMATH_H_FUNC static
|
|
||||||
#else
|
|
||||||
#define LINMATH_H_FUNC static inline
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LINMATH_H_DEFINE_VEC(n) \
|
#define LINMATH_H_DEFINE_VEC(n) \
|
||||||
typedef float vec##n[n]; \
|
typedef float vec##n[n]; \
|
||||||
LINMATH_H_FUNC void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \
|
static inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = a[i] + b[i]; \
|
r[i] = a[i] + b[i]; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \
|
static inline void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = a[i] - b[i]; \
|
r[i] = a[i] - b[i]; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_scale(vec##n r, vec##n const v, float const s) \
|
static inline void vec##n##_scale(vec##n r, vec##n const v, float const s) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = v[i] * s; \
|
r[i] = v[i] * s; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
static inline float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
float p = 0.f; \
|
float p = 0.; \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
p += b[i]*a[i]; \
|
p += b[i]*a[i]; \
|
||||||
return p; \
|
return p; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC float vec##n##_len(vec##n const v) \
|
static inline float vec##n##_len(vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
return sqrtf(vec##n##_mul_inner(v,v)); \
|
return (float) sqrt(vec##n##_mul_inner(v,v)); \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_norm(vec##n r, vec##n const v) \
|
static inline void vec##n##_norm(vec##n r, vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
float k = 1.f / vec##n##_len(v); \
|
float k = 1.f / vec##n##_len(v); \
|
||||||
vec##n##_scale(r, v, k); \
|
vec##n##_scale(r, v, k); \
|
||||||
} \
|
|
||||||
LINMATH_H_FUNC void vec##n##_min(vec##n r, vec##n const a, vec##n const b) \
|
|
||||||
{ \
|
|
||||||
int i; \
|
|
||||||
for(i=0; i<n; ++i) \
|
|
||||||
r[i] = a[i]<b[i] ? a[i] : b[i]; \
|
|
||||||
} \
|
|
||||||
LINMATH_H_FUNC void vec##n##_max(vec##n r, vec##n const a, vec##n const b) \
|
|
||||||
{ \
|
|
||||||
int i; \
|
|
||||||
for(i=0; i<n; ++i) \
|
|
||||||
r[i] = a[i]>b[i] ? a[i] : b[i]; \
|
|
||||||
} \
|
|
||||||
LINMATH_H_FUNC void vec##n##_dup(vec##n r, vec##n const src) \
|
|
||||||
{ \
|
|
||||||
int i; \
|
|
||||||
for(i=0; i<n; ++i) \
|
|
||||||
r[i] = src[i]; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_DEFINE_VEC(2)
|
LINMATH_H_DEFINE_VEC(2)
|
||||||
LINMATH_H_DEFINE_VEC(3)
|
LINMATH_H_DEFINE_VEC(3)
|
||||||
LINMATH_H_DEFINE_VEC(4)
|
LINMATH_H_DEFINE_VEC(4)
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)
|
static inline void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)
|
||||||
{
|
{
|
||||||
r[0] = a[1]*b[2] - a[2]*b[1];
|
r[0] = a[1]*b[2] - a[2]*b[1];
|
||||||
r[1] = a[2]*b[0] - a[0]*b[2];
|
r[1] = a[2]*b[0] - a[0]*b[2];
|
||||||
r[2] = a[0]*b[1] - a[1]*b[0];
|
r[2] = a[0]*b[1] - a[1]*b[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
static inline void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
||||||
{
|
{
|
||||||
float p = 2.f * vec3_mul_inner(v, n);
|
float p = 2.f*vec3_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
r[i] = v[i] - p*n[i];
|
r[i] = v[i] - p*n[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec4_mul_cross(vec4 r, vec4 const a, vec4 const b)
|
static inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
||||||
{
|
{
|
||||||
r[0] = a[1]*b[2] - a[2]*b[1];
|
r[0] = a[1]*b[2] - a[2]*b[1];
|
||||||
r[1] = a[2]*b[0] - a[0]*b[2];
|
r[1] = a[2]*b[0] - a[0]*b[2];
|
||||||
|
@ -98,7 +72,7 @@ LINMATH_H_FUNC void vec4_mul_cross(vec4 r, vec4 const a, vec4 const b)
|
||||||
r[3] = 1.f;
|
r[3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 const v, vec4 const n)
|
static inline void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
||||||
{
|
{
|
||||||
float p = 2.f*vec4_mul_inner(v, n);
|
float p = 2.f*vec4_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
|
@ -107,66 +81,68 @@ LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 const v, vec4 const n)
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef vec4 mat4x4[4];
|
typedef vec4 mat4x4[4];
|
||||||
LINMATH_H_FUNC void mat4x4_identity(mat4x4 M)
|
static inline void mat4x4_identity(mat4x4 M)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
M[i][j] = i==j ? 1.f : 0.f;
|
M[i][j] = i==j ? 1.f : 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_dup(mat4x4 M, mat4x4 const N)
|
static inline void mat4x4_dup(mat4x4 M, mat4x4 N)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_dup(M[i], N[i]);
|
for(j=0; j<4; ++j)
|
||||||
|
M[i][j] = N[i][j];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_row(vec4 r, mat4x4 const M, int i)
|
static inline void mat4x4_row(vec4 r, mat4x4 M, int i)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
for(k=0; k<4; ++k)
|
for(k=0; k<4; ++k)
|
||||||
r[k] = M[k][i];
|
r[k] = M[k][i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_col(vec4 r, mat4x4 const M, int i)
|
static inline void mat4x4_col(vec4 r, mat4x4 M, int i)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
for(k=0; k<4; ++k)
|
for(k=0; k<4; ++k)
|
||||||
r[k] = M[i][k];
|
r[k] = M[i][k];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_transpose(mat4x4 M, mat4x4 const N)
|
static inline void mat4x4_transpose(mat4x4 M, mat4x4 N)
|
||||||
{
|
{
|
||||||
// Note: if M and N are the same, the user has to
|
|
||||||
// explicitly make a copy of M and set it to N.
|
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
M[i][j] = N[j][i];
|
M[i][j] = N[j][i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_add(mat4x4 M, mat4x4 const a, mat4x4 const b)
|
static inline void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_add(M[i], a[i], b[i]);
|
vec4_add(M[i], a[i], b[i]);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_sub(mat4x4 M, mat4x4 const a, mat4x4 const b)
|
static inline void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_sub(M[i], a[i], b[i]);
|
vec4_sub(M[i], a[i], b[i]);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_scale(mat4x4 M, mat4x4 const a, float k)
|
static inline void mat4x4_scale(mat4x4 M, mat4x4 a, float k)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_scale(M[i], a[i], k);
|
vec4_scale(M[i], a[i], k);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_scale_aniso(mat4x4 M, mat4x4 const a, float x, float y, float z)
|
static inline void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
vec4_scale(M[0], a[0], x);
|
vec4_scale(M[0], a[0], x);
|
||||||
vec4_scale(M[1], a[1], y);
|
vec4_scale(M[1], a[1], y);
|
||||||
vec4_scale(M[2], a[2], z);
|
vec4_scale(M[2], a[2], z);
|
||||||
vec4_dup(M[3], a[3]);
|
for(i = 0; i < 4; ++i) {
|
||||||
|
M[3][i] = a[3][i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 const a, mat4x4 const b)
|
static inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
mat4x4 temp;
|
mat4x4 temp;
|
||||||
int k, r, c;
|
int k, r, c;
|
||||||
|
@ -177,7 +153,7 @@ LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 const a, mat4x4 const b)
|
||||||
}
|
}
|
||||||
mat4x4_dup(M, temp);
|
mat4x4_dup(M, temp);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 const M, vec4 const v)
|
static inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j) {
|
for(j=0; j<4; ++j) {
|
||||||
|
@ -186,14 +162,14 @@ LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 const M, vec4 const v)
|
||||||
r[j] += M[i][j] * v[i];
|
r[j] += M[i][j] * v[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_translate(mat4x4 T, float x, float y, float z)
|
static inline void mat4x4_translate(mat4x4 T, float x, float y, float z)
|
||||||
{
|
{
|
||||||
mat4x4_identity(T);
|
mat4x4_identity(T);
|
||||||
T[3][0] = x;
|
T[3][0] = x;
|
||||||
T[3][1] = y;
|
T[3][1] = y;
|
||||||
T[3][2] = z;
|
T[3][2] = z;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)
|
static inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)
|
||||||
{
|
{
|
||||||
vec4 t = {x, y, z, 0};
|
vec4 t = {x, y, z, 0};
|
||||||
vec4 r;
|
vec4 r;
|
||||||
|
@ -203,13 +179,13 @@ LINMATH_H_FUNC void mat4x4_translate_in_place(mat4x4 M, float x, float y, float
|
||||||
M[3][i] += vec4_mul_inner(r, t);
|
M[3][i] += vec4_mul_inner(r, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 const a, vec3 const b)
|
static inline void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(i=0; i<4; ++i) for(j=0; j<4; ++j)
|
for(i=0; i<4; ++i) for(j=0; j<4; ++j)
|
||||||
M[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;
|
M[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate(mat4x4 R, mat4x4 const M, float x, float y, float z, float angle)
|
static inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
|
@ -237,13 +213,13 @@ LINMATH_H_FUNC void mat4x4_rotate(mat4x4 R, mat4x4 const M, float x, float y, fl
|
||||||
mat4x4_add(T, T, C);
|
mat4x4_add(T, T, C);
|
||||||
mat4x4_add(T, T, S);
|
mat4x4_add(T, T, S);
|
||||||
|
|
||||||
T[3][3] = 1.f;
|
T[3][3] = 1.;
|
||||||
mat4x4_mul(R, M, T);
|
mat4x4_mul(R, M, T);
|
||||||
} else {
|
} else {
|
||||||
mat4x4_dup(R, M);
|
mat4x4_dup(R, M);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_X(mat4x4 Q, mat4x4 const M, float angle)
|
static inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
|
@ -255,19 +231,19 @@ LINMATH_H_FUNC void mat4x4_rotate_X(mat4x4 Q, mat4x4 const M, float angle)
|
||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_Y(mat4x4 Q, mat4x4 const M, float angle)
|
static inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
mat4x4 R = {
|
mat4x4 R = {
|
||||||
{ c, 0.f, -s, 0.f},
|
{ c, 0.f, s, 0.f},
|
||||||
{ 0.f, 1.f, 0.f, 0.f},
|
{ 0.f, 1.f, 0.f, 0.f},
|
||||||
{ s, 0.f, c, 0.f},
|
{ -s, 0.f, c, 0.f},
|
||||||
{ 0.f, 0.f, 0.f, 1.f}
|
{ 0.f, 0.f, 0.f, 1.f}
|
||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_Z(mat4x4 Q, mat4x4 const M, float angle)
|
static inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
|
@ -279,7 +255,7 @@ LINMATH_H_FUNC void mat4x4_rotate_Z(mat4x4 Q, mat4x4 const M, float angle)
|
||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 const M)
|
static inline void mat4x4_invert(mat4x4 T, mat4x4 M)
|
||||||
{
|
{
|
||||||
float s[6];
|
float s[6];
|
||||||
float c[6];
|
float c[6];
|
||||||
|
@ -320,10 +296,10 @@ LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 const M)
|
||||||
T[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;
|
T[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;
|
||||||
T[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;
|
T[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 const M)
|
static inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)
|
||||||
{
|
{
|
||||||
mat4x4_dup(R, M);
|
mat4x4_dup(R, M);
|
||||||
float s = 1.f;
|
float s = 1.;
|
||||||
vec3 h;
|
vec3 h;
|
||||||
|
|
||||||
vec3_norm(R[2], R[2]);
|
vec3_norm(R[2], R[2]);
|
||||||
|
@ -331,11 +307,12 @@ LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 const M)
|
||||||
s = vec3_mul_inner(R[1], R[2]);
|
s = vec3_mul_inner(R[1], R[2]);
|
||||||
vec3_scale(h, R[2], s);
|
vec3_scale(h, R[2], s);
|
||||||
vec3_sub(R[1], R[1], h);
|
vec3_sub(R[1], R[1], h);
|
||||||
vec3_norm(R[1], R[1]);
|
vec3_norm(R[2], R[2]);
|
||||||
|
|
||||||
s = vec3_mul_inner(R[0], R[2]);
|
s = vec3_mul_inner(R[1], R[2]);
|
||||||
vec3_scale(h, R[2], s);
|
vec3_scale(h, R[2], s);
|
||||||
vec3_sub(R[0], R[0], h);
|
vec3_sub(R[1], R[1], h);
|
||||||
|
vec3_norm(R[1], R[1]);
|
||||||
|
|
||||||
s = vec3_mul_inner(R[0], R[1]);
|
s = vec3_mul_inner(R[0], R[1]);
|
||||||
vec3_scale(h, R[1], s);
|
vec3_scale(h, R[1], s);
|
||||||
|
@ -343,7 +320,7 @@ LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 const M)
|
||||||
vec3_norm(R[0], R[0]);
|
vec3_norm(R[0], R[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
static inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
||||||
{
|
{
|
||||||
M[0][0] = 2.f*n/(r-l);
|
M[0][0] = 2.f*n/(r-l);
|
||||||
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
||||||
|
@ -359,7 +336,7 @@ LINMATH_H_FUNC void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t,
|
||||||
M[3][2] = -2.f*(f*n)/(f-n);
|
M[3][2] = -2.f*(f*n)/(f-n);
|
||||||
M[3][0] = M[3][1] = M[3][3] = 0.f;
|
M[3][0] = M[3][1] = M[3][3] = 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
static inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
||||||
{
|
{
|
||||||
M[0][0] = 2.f/(r-l);
|
M[0][0] = 2.f/(r-l);
|
||||||
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
||||||
|
@ -375,11 +352,11 @@ LINMATH_H_FUNC void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, f
|
||||||
M[3][2] = -(f+n)/(f-n);
|
M[3][2] = -(f+n)/(f-n);
|
||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)
|
static inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)
|
||||||
{
|
{
|
||||||
/* NOTE: Degrees are an unhandy unit to work with.
|
/* NOTE: Degrees are an unhandy unit to work with.
|
||||||
* linmath.h uses radians for everything! */
|
* linmath.h uses radians for everything! */
|
||||||
float const a = 1.f / tanf(y_fov / 2.f);
|
float const a = 1.f / (float) tan(y_fov / 2.f);
|
||||||
|
|
||||||
m[0][0] = a / aspect;
|
m[0][0] = a / aspect;
|
||||||
m[0][1] = 0.f;
|
m[0][1] = 0.f;
|
||||||
|
@ -401,7 +378,7 @@ LINMATH_H_FUNC void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, floa
|
||||||
m[3][2] = -((2.f * f * n) / (f - n));
|
m[3][2] = -((2.f * f * n) / (f - n));
|
||||||
m[3][3] = 0.f;
|
m[3][3] = 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 const eye, vec3 const center, vec3 const up)
|
static inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
||||||
{
|
{
|
||||||
/* Adapted from Android's OpenGL Matrix.java. */
|
/* Adapted from Android's OpenGL Matrix.java. */
|
||||||
/* See the OpenGL GLUT documentation for gluLookAt for a description */
|
/* See the OpenGL GLUT documentation for gluLookAt for a description */
|
||||||
|
@ -444,18 +421,24 @@ LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 const eye, vec3 const center,
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef float quat[4];
|
typedef float quat[4];
|
||||||
#define quat_add vec4_add
|
static inline void quat_identity(quat q)
|
||||||
#define quat_sub vec4_sub
|
|
||||||
#define quat_norm vec4_norm
|
|
||||||
#define quat_scale vec4_scale
|
|
||||||
#define quat_mul_inner vec4_mul_inner
|
|
||||||
|
|
||||||
LINMATH_H_FUNC void quat_identity(quat q)
|
|
||||||
{
|
{
|
||||||
q[0] = q[1] = q[2] = 0.f;
|
q[0] = q[1] = q[2] = 0.f;
|
||||||
q[3] = 1.f;
|
q[3] = 1.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_mul(quat r, quat const p, quat const q)
|
static inline void quat_add(quat r, quat a, quat b)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i<4; ++i)
|
||||||
|
r[i] = a[i] + b[i];
|
||||||
|
}
|
||||||
|
static inline void quat_sub(quat r, quat a, quat b)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i<4; ++i)
|
||||||
|
r[i] = a[i] - b[i];
|
||||||
|
}
|
||||||
|
static inline void quat_mul(quat r, quat p, quat q)
|
||||||
{
|
{
|
||||||
vec3 w;
|
vec3 w;
|
||||||
vec3_mul_cross(r, p, q);
|
vec3_mul_cross(r, p, q);
|
||||||
|
@ -465,42 +448,56 @@ LINMATH_H_FUNC void quat_mul(quat r, quat const p, quat const q)
|
||||||
vec3_add(r, r, w);
|
vec3_add(r, r, w);
|
||||||
r[3] = p[3]*q[3] - vec3_mul_inner(p, q);
|
r[3] = p[3]*q[3] - vec3_mul_inner(p, q);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_conj(quat r, quat const q)
|
static inline void quat_scale(quat r, quat v, float s)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i<4; ++i)
|
||||||
|
r[i] = v[i] * s;
|
||||||
|
}
|
||||||
|
static inline float quat_inner_product(quat a, quat b)
|
||||||
|
{
|
||||||
|
float p = 0.f;
|
||||||
|
int i;
|
||||||
|
for(i=0; i<4; ++i)
|
||||||
|
p += b[i]*a[i];
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
static inline void quat_conj(quat r, quat q)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<3; ++i)
|
for(i=0; i<3; ++i)
|
||||||
r[i] = -q[i];
|
r[i] = -q[i];
|
||||||
r[3] = q[3];
|
r[3] = q[3];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_rotate(quat r, float angle, vec3 const axis) {
|
static inline void quat_rotate(quat r, float angle, vec3 axis) {
|
||||||
vec3 axis_norm;
|
vec3 v;
|
||||||
vec3_norm(axis_norm, axis);
|
vec3_scale(v, axis, sinf(angle / 2));
|
||||||
float s = sinf(angle / 2);
|
int i;
|
||||||
float c = cosf(angle / 2);
|
for(i=0; i<3; ++i)
|
||||||
vec3_scale(r, axis_norm, s);
|
r[i] = v[i];
|
||||||
r[3] = c;
|
r[3] = cosf(angle / 2);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_mul_vec3(vec3 r, quat const q, vec3 const v)
|
#define quat_norm vec4_norm
|
||||||
|
static inline void quat_mul_vec3(vec3 r, quat q, vec3 v)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Method by Fabian 'ryg' Giessen (of Farbrausch)
|
* Method by Fabian 'ryg' Giessen (of Farbrausch)
|
||||||
t = 2 * cross(q.xyz, v)
|
t = 2 * cross(q.xyz, v)
|
||||||
v' = v + q.w * t + cross(q.xyz, t)
|
v' = v + q.w * t + cross(q.xyz, t)
|
||||||
*/
|
*/
|
||||||
vec3 t;
|
vec3 t = {q[0], q[1], q[2]};
|
||||||
vec3 q_xyz = {q[0], q[1], q[2]};
|
|
||||||
vec3 u = {q[0], q[1], q[2]};
|
vec3 u = {q[0], q[1], q[2]};
|
||||||
|
|
||||||
vec3_mul_cross(t, q_xyz, v);
|
vec3_mul_cross(t, t, v);
|
||||||
vec3_scale(t, t, 2);
|
vec3_scale(t, t, 2);
|
||||||
|
|
||||||
vec3_mul_cross(u, q_xyz, t);
|
vec3_mul_cross(u, u, t);
|
||||||
vec3_scale(t, t, q[3]);
|
vec3_scale(t, t, q[3]);
|
||||||
|
|
||||||
vec3_add(r, v, t);
|
vec3_add(r, v, t);
|
||||||
vec3_add(r, r, u);
|
vec3_add(r, r, u);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_from_quat(mat4x4 M, quat const q)
|
static inline void mat4x4_from_quat(mat4x4 M, quat q)
|
||||||
{
|
{
|
||||||
float a = q[3];
|
float a = q[3];
|
||||||
float b = q[0];
|
float b = q[0];
|
||||||
|
@ -530,21 +527,18 @@ LINMATH_H_FUNC void mat4x4_from_quat(mat4x4 M, quat const q)
|
||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4o_mul_quat(mat4x4 R, mat4x4 const M, quat const q)
|
static inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)
|
||||||
{
|
{
|
||||||
/* XXX: The way this is written only works for orthogonal matrices. */
|
/* XXX: The way this is written only works for othogonal matrices. */
|
||||||
/* TODO: Take care of non-orthogonal case. */
|
/* TODO: Take care of non-orthogonal case. */
|
||||||
quat_mul_vec3(R[0], q, M[0]);
|
quat_mul_vec3(R[0], q, M[0]);
|
||||||
quat_mul_vec3(R[1], q, M[1]);
|
quat_mul_vec3(R[1], q, M[1]);
|
||||||
quat_mul_vec3(R[2], q, M[2]);
|
quat_mul_vec3(R[2], q, M[2]);
|
||||||
|
|
||||||
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
||||||
R[0][3] = M[0][3];
|
R[3][3] = 1.f;
|
||||||
R[1][3] = M[1][3];
|
|
||||||
R[2][3] = M[2][3];
|
|
||||||
R[3][3] = M[3][3]; // typically 1.0, but here we make it general
|
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 const M)
|
static inline void quat_from_mat4x4(quat q, mat4x4 M)
|
||||||
{
|
{
|
||||||
float r=0.f;
|
float r=0.f;
|
||||||
int i;
|
int i;
|
||||||
|
@ -560,7 +554,7 @@ LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 const M)
|
||||||
p = &perm[i];
|
p = &perm[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sqrtf(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );
|
r = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );
|
||||||
|
|
||||||
if(r < 1e-6) {
|
if(r < 1e-6) {
|
||||||
q[0] = 1.f;
|
q[0] = 1.f;
|
||||||
|
@ -574,33 +568,4 @@ LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 const M)
|
||||||
q[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);
|
q[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4_arcball(mat4x4 R, mat4x4 const M, vec2 const _a, vec2 const _b, float s)
|
|
||||||
{
|
|
||||||
vec2 a; memcpy(a, _a, sizeof(a));
|
|
||||||
vec2 b; memcpy(b, _b, sizeof(b));
|
|
||||||
|
|
||||||
float z_a = 0.f;
|
|
||||||
float z_b = 0.f;
|
|
||||||
|
|
||||||
if(vec2_len(a) < 1.f) {
|
|
||||||
z_a = sqrtf(1.f - vec2_mul_inner(a, a));
|
|
||||||
} else {
|
|
||||||
vec2_norm(a, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vec2_len(b) < 1.f) {
|
|
||||||
z_b = sqrtf(1.f - vec2_mul_inner(b, b));
|
|
||||||
} else {
|
|
||||||
vec2_norm(b, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 a_ = {a[0], a[1], z_a};
|
|
||||||
vec3 b_ = {b[0], b[1], z_b};
|
|
||||||
|
|
||||||
vec3 c_;
|
|
||||||
vec3_mul_cross(c_, a_, b_);
|
|
||||||
|
|
||||||
float const angle = acos(vec3_mul_inner(a_, b_)) * s;
|
|
||||||
mat4x4_rotate(R, M, c_[0], c_[1], c_[2], angle);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
25778
deps/nuklear.h
vendored
25778
deps/nuklear.h
vendored
File diff suppressed because it is too large
Load Diff
381
deps/nuklear_glfw_gl2.h
vendored
381
deps/nuklear_glfw_gl2.h
vendored
|
@ -1,381 +0,0 @@
|
||||||
/*
|
|
||||||
* Nuklear - v1.32.0 - public domain
|
|
||||||
* no warrenty implied; use at your own risk.
|
|
||||||
* authored from 2015-2017 by Micha Mettke
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* API
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifndef NK_GLFW_GL2_H_
|
|
||||||
#define NK_GLFW_GL2_H_
|
|
||||||
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
enum nk_glfw_init_state{
|
|
||||||
NK_GLFW3_DEFAULT = 0,
|
|
||||||
NK_GLFW3_INSTALL_CALLBACKS
|
|
||||||
};
|
|
||||||
NK_API struct nk_context* nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state);
|
|
||||||
NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas);
|
|
||||||
NK_API void nk_glfw3_font_stash_end(void);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_new_frame(void);
|
|
||||||
NK_API void nk_glfw3_render(enum nk_anti_aliasing);
|
|
||||||
NK_API void nk_glfw3_shutdown(void);
|
|
||||||
|
|
||||||
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
|
|
||||||
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ==============================================================
|
|
||||||
*
|
|
||||||
* IMPLEMENTATION
|
|
||||||
*
|
|
||||||
* ===============================================================
|
|
||||||
*/
|
|
||||||
#ifdef NK_GLFW_GL2_IMPLEMENTATION
|
|
||||||
|
|
||||||
#ifndef NK_GLFW_TEXT_MAX
|
|
||||||
#define NK_GLFW_TEXT_MAX 256
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_LO
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_LO 0.02
|
|
||||||
#endif
|
|
||||||
#ifndef NK_GLFW_DOUBLE_CLICK_HI
|
|
||||||
#define NK_GLFW_DOUBLE_CLICK_HI 0.2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct nk_glfw_device {
|
|
||||||
struct nk_buffer cmds;
|
|
||||||
struct nk_draw_null_texture null;
|
|
||||||
GLuint font_tex;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nk_glfw_vertex {
|
|
||||||
float position[2];
|
|
||||||
float uv[2];
|
|
||||||
nk_byte col[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct nk_glfw {
|
|
||||||
GLFWwindow *win;
|
|
||||||
int width, height;
|
|
||||||
int display_width, display_height;
|
|
||||||
struct nk_glfw_device ogl;
|
|
||||||
struct nk_context ctx;
|
|
||||||
struct nk_font_atlas atlas;
|
|
||||||
struct nk_vec2 fb_scale;
|
|
||||||
unsigned int text[NK_GLFW_TEXT_MAX];
|
|
||||||
int text_len;
|
|
||||||
struct nk_vec2 scroll;
|
|
||||||
double last_button_click;
|
|
||||||
int is_double_click_down;
|
|
||||||
struct nk_vec2 double_click_pos;
|
|
||||||
} glfw;
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_device_upload_atlas(const void *image, int width, int height)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
glGenTextures(1, &dev->font_tex);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, dev->font_tex);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,
|
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, image);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_render(enum nk_anti_aliasing AA)
|
|
||||||
{
|
|
||||||
/* setup global state */
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT);
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
/* setup viewport/project */
|
|
||||||
glViewport(0,0,(GLsizei)glfw.display_width,(GLsizei)glfw.display_height);
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glPushMatrix();
|
|
||||||
glLoadIdentity();
|
|
||||||
glOrtho(0.0f, glfw.width, glfw.height, 0.0f, -1.0f, 1.0f);
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glPushMatrix();
|
|
||||||
glLoadIdentity();
|
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
|
||||||
{
|
|
||||||
GLsizei vs = sizeof(struct nk_glfw_vertex);
|
|
||||||
size_t vp = offsetof(struct nk_glfw_vertex, position);
|
|
||||||
size_t vt = offsetof(struct nk_glfw_vertex, uv);
|
|
||||||
size_t vc = offsetof(struct nk_glfw_vertex, col);
|
|
||||||
|
|
||||||
/* convert from command queue into draw list and draw to screen */
|
|
||||||
const struct nk_draw_command *cmd;
|
|
||||||
const nk_draw_index *offset = NULL;
|
|
||||||
struct nk_buffer vbuf, ebuf;
|
|
||||||
|
|
||||||
/* fill convert configuration */
|
|
||||||
struct nk_convert_config config;
|
|
||||||
static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
|
||||||
{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)},
|
|
||||||
{NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)},
|
|
||||||
{NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)},
|
|
||||||
{NK_VERTEX_LAYOUT_END}
|
|
||||||
};
|
|
||||||
NK_MEMSET(&config, 0, sizeof(config));
|
|
||||||
config.vertex_layout = vertex_layout;
|
|
||||||
config.vertex_size = sizeof(struct nk_glfw_vertex);
|
|
||||||
config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex);
|
|
||||||
config.null = dev->null;
|
|
||||||
config.circle_segment_count = 22;
|
|
||||||
config.curve_segment_count = 22;
|
|
||||||
config.arc_segment_count = 22;
|
|
||||||
config.global_alpha = 1.0f;
|
|
||||||
config.shape_AA = AA;
|
|
||||||
config.line_AA = AA;
|
|
||||||
|
|
||||||
/* convert shapes into vertexes */
|
|
||||||
nk_buffer_init_default(&vbuf);
|
|
||||||
nk_buffer_init_default(&ebuf);
|
|
||||||
nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config);
|
|
||||||
|
|
||||||
/* setup vertex buffer pointer */
|
|
||||||
{const void *vertices = nk_buffer_memory_const(&vbuf);
|
|
||||||
glVertexPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vp));
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vt));
|
|
||||||
glColorPointer(4, GL_UNSIGNED_BYTE, vs, (const void*)((const nk_byte*)vertices + vc));}
|
|
||||||
|
|
||||||
/* iterate over and execute each draw command */
|
|
||||||
offset = (const nk_draw_index*)nk_buffer_memory_const(&ebuf);
|
|
||||||
nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
|
|
||||||
{
|
|
||||||
if (!cmd->elem_count) continue;
|
|
||||||
glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id);
|
|
||||||
glScissor(
|
|
||||||
(GLint)(cmd->clip_rect.x * glfw.fb_scale.x),
|
|
||||||
(GLint)((glfw.height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h)) * glfw.fb_scale.y),
|
|
||||||
(GLint)(cmd->clip_rect.w * glfw.fb_scale.x),
|
|
||||||
(GLint)(cmd->clip_rect.h * glfw.fb_scale.y));
|
|
||||||
glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);
|
|
||||||
offset += cmd->elem_count;
|
|
||||||
}
|
|
||||||
nk_clear(&glfw.ctx);
|
|
||||||
nk_buffer_free(&vbuf);
|
|
||||||
nk_buffer_free(&ebuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default OpenGL state */
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
|
||||||
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_SCISSOR_TEST);
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glPopMatrix();
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glPopMatrix();
|
|
||||||
glPopAttrib();
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
|
|
||||||
{
|
|
||||||
(void)win;
|
|
||||||
if (glfw.text_len < NK_GLFW_TEXT_MAX)
|
|
||||||
glfw.text[glfw.text_len++] = codepoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
|
||||||
{
|
|
||||||
(void)win; (void)xoff;
|
|
||||||
glfw.scroll.x += (float)xoff;
|
|
||||||
glfw.scroll.y += (float)yoff;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
|
||||||
{
|
|
||||||
double x, y;
|
|
||||||
if (button != GLFW_MOUSE_BUTTON_LEFT) return;
|
|
||||||
glfwGetCursorPos(window, &x, &y);
|
|
||||||
if (action == GLFW_PRESS) {
|
|
||||||
double dt = glfwGetTime() - glfw.last_button_click;
|
|
||||||
if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI) {
|
|
||||||
glfw.is_double_click_down = nk_true;
|
|
||||||
glfw.double_click_pos = nk_vec2((float)x, (float)y);
|
|
||||||
}
|
|
||||||
glfw.last_button_click = glfwGetTime();
|
|
||||||
} else glfw.is_double_click_down = nk_false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
|
||||||
{
|
|
||||||
const char *text = glfwGetClipboardString(glfw.win);
|
|
||||||
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
|
||||||
(void)usr;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_INTERN void
|
|
||||||
nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len)
|
|
||||||
{
|
|
||||||
char *str = 0;
|
|
||||||
(void)usr;
|
|
||||||
if (!len) return;
|
|
||||||
str = (char*)malloc((size_t)len+1);
|
|
||||||
if (!str) return;
|
|
||||||
NK_MEMCPY(str, text, (size_t)len);
|
|
||||||
str[len] = '\0';
|
|
||||||
glfwSetClipboardString(glfw.win, str);
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API struct nk_context*
|
|
||||||
nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)
|
|
||||||
{
|
|
||||||
glfw.win = win;
|
|
||||||
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
|
|
||||||
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
|
|
||||||
glfwSetCharCallback(win, nk_glfw3_char_callback);
|
|
||||||
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
|
||||||
}
|
|
||||||
nk_init_default(&glfw.ctx, 0);
|
|
||||||
glfw.ctx.clip.copy = nk_glfw3_clipboard_copy;
|
|
||||||
glfw.ctx.clip.paste = nk_glfw3_clipboard_paste;
|
|
||||||
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
|
||||||
nk_buffer_init_default(&glfw.ogl.cmds);
|
|
||||||
|
|
||||||
glfw.is_double_click_down = nk_false;
|
|
||||||
glfw.double_click_pos = nk_vec2(0, 0);
|
|
||||||
|
|
||||||
return &glfw.ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas)
|
|
||||||
{
|
|
||||||
nk_font_atlas_init_default(&glfw.atlas);
|
|
||||||
nk_font_atlas_begin(&glfw.atlas);
|
|
||||||
*atlas = &glfw.atlas;
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_font_stash_end(void)
|
|
||||||
{
|
|
||||||
const void *image; int w, h;
|
|
||||||
image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
|
|
||||||
nk_glfw3_device_upload_atlas(image, w, h);
|
|
||||||
nk_font_atlas_end(&glfw.atlas, nk_handle_id((int)glfw.ogl.font_tex), &glfw.ogl.null);
|
|
||||||
if (glfw.atlas.default_font)
|
|
||||||
nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API void
|
|
||||||
nk_glfw3_new_frame(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x, y;
|
|
||||||
struct nk_context *ctx = &glfw.ctx;
|
|
||||||
struct GLFWwindow *win = glfw.win;
|
|
||||||
|
|
||||||
glfwGetWindowSize(win, &glfw.width, &glfw.height);
|
|
||||||
glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height);
|
|
||||||
glfw.fb_scale.x = (float)glfw.display_width/(float)glfw.width;
|
|
||||||
glfw.fb_scale.y = (float)glfw.display_height/(float)glfw.height;
|
|
||||||
|
|
||||||
nk_input_begin(ctx);
|
|
||||||
for (i = 0; i < glfw.text_len; ++i)
|
|
||||||
nk_input_unicode(ctx, glfw.text[i]);
|
|
||||||
|
|
||||||
/* optional grabbing behavior */
|
|
||||||
if (ctx->input.mouse.grab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
|
||||||
else if (ctx->input.mouse.ungrab)
|
|
||||||
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
|
||||||
|
|
||||||
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
|
|
||||||
|
|
||||||
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
|
|
||||||
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
|
|
||||||
} else {
|
|
||||||
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_key(ctx, NK_KEY_COPY, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_PASTE, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_CUT, 0);
|
|
||||||
nk_input_key(ctx, NK_KEY_SHIFT, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwGetCursorPos(win, &x, &y);
|
|
||||||
nk_input_motion(ctx, (int)x, (int)y);
|
|
||||||
if (ctx->input.mouse.grabbed) {
|
|
||||||
glfwSetCursorPos(glfw.win, (double)ctx->input.mouse.prev.x, (double)ctx->input.mouse.prev.y);
|
|
||||||
ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
|
|
||||||
ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);
|
|
||||||
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down);
|
|
||||||
nk_input_scroll(ctx, glfw.scroll);
|
|
||||||
nk_input_end(&glfw.ctx);
|
|
||||||
glfw.text_len = 0;
|
|
||||||
glfw.scroll = nk_vec2(0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NK_API
|
|
||||||
void nk_glfw3_shutdown(void)
|
|
||||||
{
|
|
||||||
struct nk_glfw_device *dev = &glfw.ogl;
|
|
||||||
nk_font_atlas_clear(&glfw.atlas);
|
|
||||||
nk_free(&glfw.ctx);
|
|
||||||
glDeleteTextures(1, &dev->font_tex);
|
|
||||||
nk_buffer_free(&dev->cmds);
|
|
||||||
NK_MEMSET(&glfw, 0, sizeof(glfw));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
1724
deps/stb_image_write.h
vendored
1724
deps/stb_image_write.h
vendored
File diff suppressed because it is too large
Load Diff
2
deps/tinycthread.c
vendored
2
deps/tinycthread.c
vendored
|
@ -21,7 +21,7 @@ freely, subject to the following restrictions:
|
||||||
distribution.
|
distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* 2013-01-06 Camilla Löwy <elmindreda@glfw.org>
|
/* 2013-01-06 Camilla Berglund <elmindreda@glfw.org>
|
||||||
*
|
*
|
||||||
* Added casts from time_t to DWORD to avoid warnings on VC++.
|
* Added casts from time_t to DWORD to avoid warnings on VC++.
|
||||||
* Fixed time retrieval on POSIX systems.
|
* Fixed time retrieval on POSIX systems.
|
||||||
|
|
4
deps/tinycthread.h
vendored
4
deps/tinycthread.h
vendored
|
@ -123,9 +123,7 @@ typedef int _tthread_clockid_t;
|
||||||
/* Emulate clock_gettime */
|
/* Emulate clock_gettime */
|
||||||
int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts);
|
int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts);
|
||||||
#define clock_gettime _tthread_clock_gettime
|
#define clock_gettime _tthread_clock_gettime
|
||||||
#ifndef CLOCK_REALTIME
|
#define CLOCK_REALTIME 0
|
||||||
#define CLOCK_REALTIME 0
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
247
deps/vs2008/stdint.h
vendored
247
deps/vs2008/stdint.h
vendored
|
@ -1,247 +0,0 @@
|
||||||
// ISO C9x compliant stdint.h for Microsoft Visual Studio
|
|
||||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
|
||||||
//
|
|
||||||
// Copyright (c) 2006-2008 Alexander Chemeris
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the distribution.
|
|
||||||
//
|
|
||||||
// 3. The name of the author may be used to endorse or promote products
|
|
||||||
// derived from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef _MSC_VER // [
|
|
||||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
|
||||||
#endif // _MSC_VER ]
|
|
||||||
|
|
||||||
#ifndef _MSC_STDINT_H_ // [
|
|
||||||
#define _MSC_STDINT_H_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
|
|
||||||
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
|
|
||||||
// or compiler give many errors like this:
|
|
||||||
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
# include <wchar.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Define _W64 macros to mark types changing their size, like intptr_t.
|
|
||||||
#ifndef _W64
|
|
||||||
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
|
|
||||||
# define _W64 __w64
|
|
||||||
# else
|
|
||||||
# define _W64
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.1 Integer types
|
|
||||||
|
|
||||||
// 7.18.1.1 Exact-width integer types
|
|
||||||
|
|
||||||
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
|
|
||||||
// realize that, e.g. char has the same size as __int8
|
|
||||||
// so we give up on __intX for them.
|
|
||||||
#if (_MSC_VER < 1300)
|
|
||||||
typedef signed char int8_t;
|
|
||||||
typedef signed short int16_t;
|
|
||||||
typedef signed int int32_t;
|
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
typedef unsigned short uint16_t;
|
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
#else
|
|
||||||
typedef signed __int8 int8_t;
|
|
||||||
typedef signed __int16 int16_t;
|
|
||||||
typedef signed __int32 int32_t;
|
|
||||||
typedef unsigned __int8 uint8_t;
|
|
||||||
typedef unsigned __int16 uint16_t;
|
|
||||||
typedef unsigned __int32 uint32_t;
|
|
||||||
#endif
|
|
||||||
typedef signed __int64 int64_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.1.2 Minimum-width integer types
|
|
||||||
typedef int8_t int_least8_t;
|
|
||||||
typedef int16_t int_least16_t;
|
|
||||||
typedef int32_t int_least32_t;
|
|
||||||
typedef int64_t int_least64_t;
|
|
||||||
typedef uint8_t uint_least8_t;
|
|
||||||
typedef uint16_t uint_least16_t;
|
|
||||||
typedef uint32_t uint_least32_t;
|
|
||||||
typedef uint64_t uint_least64_t;
|
|
||||||
|
|
||||||
// 7.18.1.3 Fastest minimum-width integer types
|
|
||||||
typedef int8_t int_fast8_t;
|
|
||||||
typedef int16_t int_fast16_t;
|
|
||||||
typedef int32_t int_fast32_t;
|
|
||||||
typedef int64_t int_fast64_t;
|
|
||||||
typedef uint8_t uint_fast8_t;
|
|
||||||
typedef uint16_t uint_fast16_t;
|
|
||||||
typedef uint32_t uint_fast32_t;
|
|
||||||
typedef uint64_t uint_fast64_t;
|
|
||||||
|
|
||||||
// 7.18.1.4 Integer types capable of holding object pointers
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
typedef signed __int64 intptr_t;
|
|
||||||
typedef unsigned __int64 uintptr_t;
|
|
||||||
#else // _WIN64 ][
|
|
||||||
typedef _W64 signed int intptr_t;
|
|
||||||
typedef _W64 unsigned int uintptr_t;
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
// 7.18.1.5 Greatest-width integer types
|
|
||||||
typedef int64_t intmax_t;
|
|
||||||
typedef uint64_t uintmax_t;
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.2 Limits of specified-width integer types
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
|
|
||||||
|
|
||||||
// 7.18.2.1 Limits of exact-width integer types
|
|
||||||
#define INT8_MIN ((int8_t)_I8_MIN)
|
|
||||||
#define INT8_MAX _I8_MAX
|
|
||||||
#define INT16_MIN ((int16_t)_I16_MIN)
|
|
||||||
#define INT16_MAX _I16_MAX
|
|
||||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
|
||||||
#define INT32_MAX _I32_MAX
|
|
||||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
|
||||||
#define INT64_MAX _I64_MAX
|
|
||||||
#define UINT8_MAX _UI8_MAX
|
|
||||||
#define UINT16_MAX _UI16_MAX
|
|
||||||
#define UINT32_MAX _UI32_MAX
|
|
||||||
#define UINT64_MAX _UI64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.2 Limits of minimum-width integer types
|
|
||||||
#define INT_LEAST8_MIN INT8_MIN
|
|
||||||
#define INT_LEAST8_MAX INT8_MAX
|
|
||||||
#define INT_LEAST16_MIN INT16_MIN
|
|
||||||
#define INT_LEAST16_MAX INT16_MAX
|
|
||||||
#define INT_LEAST32_MIN INT32_MIN
|
|
||||||
#define INT_LEAST32_MAX INT32_MAX
|
|
||||||
#define INT_LEAST64_MIN INT64_MIN
|
|
||||||
#define INT_LEAST64_MAX INT64_MAX
|
|
||||||
#define UINT_LEAST8_MAX UINT8_MAX
|
|
||||||
#define UINT_LEAST16_MAX UINT16_MAX
|
|
||||||
#define UINT_LEAST32_MAX UINT32_MAX
|
|
||||||
#define UINT_LEAST64_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.3 Limits of fastest minimum-width integer types
|
|
||||||
#define INT_FAST8_MIN INT8_MIN
|
|
||||||
#define INT_FAST8_MAX INT8_MAX
|
|
||||||
#define INT_FAST16_MIN INT16_MIN
|
|
||||||
#define INT_FAST16_MAX INT16_MAX
|
|
||||||
#define INT_FAST32_MIN INT32_MIN
|
|
||||||
#define INT_FAST32_MAX INT32_MAX
|
|
||||||
#define INT_FAST64_MIN INT64_MIN
|
|
||||||
#define INT_FAST64_MAX INT64_MAX
|
|
||||||
#define UINT_FAST8_MAX UINT8_MAX
|
|
||||||
#define UINT_FAST16_MAX UINT16_MAX
|
|
||||||
#define UINT_FAST32_MAX UINT32_MAX
|
|
||||||
#define UINT_FAST64_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.4 Limits of integer types capable of holding object pointers
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
# define INTPTR_MIN INT64_MIN
|
|
||||||
# define INTPTR_MAX INT64_MAX
|
|
||||||
# define UINTPTR_MAX UINT64_MAX
|
|
||||||
#else // _WIN64 ][
|
|
||||||
# define INTPTR_MIN INT32_MIN
|
|
||||||
# define INTPTR_MAX INT32_MAX
|
|
||||||
# define UINTPTR_MAX UINT32_MAX
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
// 7.18.2.5 Limits of greatest-width integer types
|
|
||||||
#define INTMAX_MIN INT64_MIN
|
|
||||||
#define INTMAX_MAX INT64_MAX
|
|
||||||
#define UINTMAX_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.3 Limits of other integer types
|
|
||||||
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
# define PTRDIFF_MIN _I64_MIN
|
|
||||||
# define PTRDIFF_MAX _I64_MAX
|
|
||||||
#else // _WIN64 ][
|
|
||||||
# define PTRDIFF_MIN _I32_MIN
|
|
||||||
# define PTRDIFF_MAX _I32_MAX
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
#define SIG_ATOMIC_MIN INT_MIN
|
|
||||||
#define SIG_ATOMIC_MAX INT_MAX
|
|
||||||
|
|
||||||
#ifndef SIZE_MAX // [
|
|
||||||
# ifdef _WIN64 // [
|
|
||||||
# define SIZE_MAX _UI64_MAX
|
|
||||||
# else // _WIN64 ][
|
|
||||||
# define SIZE_MAX _UI32_MAX
|
|
||||||
# endif // _WIN64 ]
|
|
||||||
#endif // SIZE_MAX ]
|
|
||||||
|
|
||||||
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
|
|
||||||
#ifndef WCHAR_MIN // [
|
|
||||||
# define WCHAR_MIN 0
|
|
||||||
#endif // WCHAR_MIN ]
|
|
||||||
#ifndef WCHAR_MAX // [
|
|
||||||
# define WCHAR_MAX _UI16_MAX
|
|
||||||
#endif // WCHAR_MAX ]
|
|
||||||
|
|
||||||
#define WINT_MIN 0
|
|
||||||
#define WINT_MAX _UI16_MAX
|
|
||||||
|
|
||||||
#endif // __STDC_LIMIT_MACROS ]
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.4 Limits of other integer types
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
|
|
||||||
|
|
||||||
// 7.18.4.1 Macros for minimum-width integer constants
|
|
||||||
|
|
||||||
#define INT8_C(val) val##i8
|
|
||||||
#define INT16_C(val) val##i16
|
|
||||||
#define INT32_C(val) val##i32
|
|
||||||
#define INT64_C(val) val##i64
|
|
||||||
|
|
||||||
#define UINT8_C(val) val##ui8
|
|
||||||
#define UINT16_C(val) val##ui16
|
|
||||||
#define UINT32_C(val) val##ui32
|
|
||||||
#define UINT64_C(val) val##ui64
|
|
||||||
|
|
||||||
// 7.18.4.2 Macros for greatest-width integer constants
|
|
||||||
#define INTMAX_C INT64_C
|
|
||||||
#define UINTMAX_C UINT64_C
|
|
||||||
|
|
||||||
#endif // __STDC_CONSTANT_MACROS ]
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _MSC_STDINT_H_ ]
|
|
120
deps/vulkan/vk_platform.h
vendored
Normal file
120
deps/vulkan/vk_platform.h
vendored
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
//
|
||||||
|
// File: vk_platform.h
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2014-2015 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef VK_PLATFORM_H_
|
||||||
|
#define VK_PLATFORM_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
/*
|
||||||
|
***************************************************************************************************
|
||||||
|
* Platform-specific directives and type declarations
|
||||||
|
***************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Platform-specific calling convention macros.
|
||||||
|
*
|
||||||
|
* Platforms should define these so that Vulkan clients call Vulkan commands
|
||||||
|
* with the same calling conventions that the Vulkan implementation expects.
|
||||||
|
*
|
||||||
|
* VKAPI_ATTR - Placed before the return type in function declarations.
|
||||||
|
* Useful for C++11 and GCC/Clang-style function attribute syntax.
|
||||||
|
* VKAPI_CALL - Placed after the return type in function declarations.
|
||||||
|
* Useful for MSVC-style calling convention syntax.
|
||||||
|
* VKAPI_PTR - Placed between the '(' and '*' in function pointer types.
|
||||||
|
*
|
||||||
|
* Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void);
|
||||||
|
* Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32)
|
||||||
|
// On Windows, Vulkan commands use the stdcall convention
|
||||||
|
#define VKAPI_ATTR
|
||||||
|
#define VKAPI_CALL __stdcall
|
||||||
|
#define VKAPI_PTR VKAPI_CALL
|
||||||
|
#elif defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__)
|
||||||
|
// Android does not support Vulkan in native code using the "armeabi" ABI.
|
||||||
|
#error "Vulkan requires the 'armeabi-v7a' or 'armeabi-v7a-hard' ABI on 32-bit ARM CPUs"
|
||||||
|
#elif defined(__ANDROID__) && defined(__ARM_ARCH_7A__)
|
||||||
|
// On Android/ARMv7a, Vulkan functions use the armeabi-v7a-hard calling
|
||||||
|
// convention, even if the application's native code is compiled with the
|
||||||
|
// armeabi-v7a calling convention.
|
||||||
|
#define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
|
||||||
|
#define VKAPI_CALL
|
||||||
|
#define VKAPI_PTR VKAPI_ATTR
|
||||||
|
#else
|
||||||
|
// On other platforms, use the default calling convention
|
||||||
|
#define VKAPI_ATTR
|
||||||
|
#define VKAPI_CALL
|
||||||
|
#define VKAPI_PTR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#if !defined(VK_NO_STDINT_H)
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||||
|
typedef signed __int8 int8_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef signed __int16 int16_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef signed __int32 int32_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef signed __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#endif // !defined(VK_NO_STDINT_H)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// Platform-specific headers required by platform window system extensions.
|
||||||
|
// These are enabled prior to #including "vulkan.h". The same enable then
|
||||||
|
// controls inclusion of the extension interfaces in vulkan.h.
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_ANDROID_KHR
|
||||||
|
#include <android/native_window.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_MIR_KHR
|
||||||
|
#include <mir_toolkit/client_types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_WIN32_KHR
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_XLIB_KHR
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_XCB_KHR
|
||||||
|
#include <xcb/xcb.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
3835
deps/vulkan/vulkan.h
vendored
Normal file
3835
deps/vulkan/vulkan.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -1,46 +1,32 @@
|
||||||
|
|
||||||
# NOTE: The order of this list determines the order of items in the Guides
|
set(glfw_DOCS_SOURCES
|
||||||
# (i.e. Pages) list in the generated documentation
|
|
||||||
set(source_files
|
|
||||||
main.dox
|
|
||||||
news.dox
|
|
||||||
quick.dox
|
|
||||||
moving.dox
|
|
||||||
compile.dox
|
|
||||||
build.dox
|
|
||||||
intro.dox
|
|
||||||
context.dox
|
|
||||||
monitor.dox
|
|
||||||
window.dox
|
|
||||||
input.dox
|
|
||||||
vulkan.dox
|
|
||||||
compat.dox
|
|
||||||
internal.dox)
|
|
||||||
|
|
||||||
set(extra_files DoxygenLayout.xml header.html footer.html extra.css spaces.svg)
|
|
||||||
|
|
||||||
set(header_paths
|
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h")
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/main.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/news.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/moving.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/quick.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/compile.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/build.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/intro.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/context.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/monitor.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/window.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/input.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/vulkan.dox"
|
||||||
|
"${GLFW_SOURCE_DIR}/docs/compat.dox")
|
||||||
|
|
||||||
# Format the source list into a Doxyfile INPUT value that Doxygen can parse
|
if (GLFW_DOCUMENT_INTERNALS)
|
||||||
foreach(path IN LISTS header_paths)
|
list(APPEND glfw_DOCS_SOURCES "${GLFW_SOURCE_DIR}/src/internal.h")
|
||||||
string(APPEND GLFW_DOXYGEN_INPUT " \\\n\"${path}\"")
|
endif()
|
||||||
endforeach()
|
|
||||||
foreach(file IN LISTS source_files)
|
foreach(arg ${glfw_DOCS_SOURCES})
|
||||||
string(APPEND GLFW_DOXYGEN_INPUT " \\\n\"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"")
|
set(GLFW_DOCS_SOURCES "${GLFW_DOCS_SOURCES} ${arg}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
configure_file(Doxyfile.in Doxyfile @ONLY)
|
configure_file(Doxyfile.in Doxyfile @ONLY)
|
||||||
|
|
||||||
add_custom_command(OUTPUT "html/index.html"
|
add_custom_target(docs ALL "${DOXYGEN_EXECUTABLE}"
|
||||||
COMMAND "${DOXYGEN_EXECUTABLE}"
|
WORKING_DIRECTORY "${GLFW_BINARY_DIR}/docs"
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
COMMENT "Generating HTML documentation" VERBATIM)
|
||||||
MAIN_DEPENDENCY Doxyfile
|
|
||||||
DEPENDS ${header_paths} ${source_files} ${extra_files}
|
|
||||||
COMMENT "Generating HTML documentation"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
add_custom_target(docs ALL SOURCES "html/index.html")
|
|
||||||
set_target_properties(docs PROPERTIES FOLDER "GLFW3")
|
|
||||||
|
|
||||||
|
|
|
@ -1,391 +0,0 @@
|
||||||
# Contribution Guide
|
|
||||||
|
|
||||||
## Contents
|
|
||||||
|
|
||||||
- [Asking a question](#asking-a-question)
|
|
||||||
- [Reporting a bug](#reporting-a-bug)
|
|
||||||
- [Reporting a compile or link bug](#reporting-a-compile-or-link-bug)
|
|
||||||
- [Reporting a segfault or other crash bug](#reporting-a-segfault-or-other-crash-bug)
|
|
||||||
- [Reporting a context creation bug](#reporting-a-context-creation-bug)
|
|
||||||
- [Reporting a monitor or video mode bug](#reporting-a-monitor-or-video-mode-bug)
|
|
||||||
- [Reporting a window, input or event bug](#reporting-a-window-input-or-event-bug)
|
|
||||||
- [Reporting some other library bug](#reporting-some-other-library-bug)
|
|
||||||
- [Reporting a documentation bug](#reporting-a-documentation-bug)
|
|
||||||
- [Reporting a website bug](#reporting-a-website-bug)
|
|
||||||
- [Requesting a feature](#requesting-a-feature)
|
|
||||||
- [Contributing a bug fix](#contributing-a-bug-fix)
|
|
||||||
- [Contributing a feature](#contributing-a-feature)
|
|
||||||
|
|
||||||
|
|
||||||
## Asking a question
|
|
||||||
|
|
||||||
Questions about how to use GLFW should be asked either in the [support
|
|
||||||
section](https://discourse.glfw.org/c/support) of the forum, under the [Stack
|
|
||||||
Overflow tag](https://stackoverflow.com/questions/tagged/glfw) or [Game
|
|
||||||
Development tag](https://gamedev.stackexchange.com/questions/tagged/glfw) on
|
|
||||||
Stack Exchange or in the IRC channel `#glfw` on
|
|
||||||
[Libera.Chat](https://libera.chat/).
|
|
||||||
|
|
||||||
Questions about the design or implementation of GLFW or about future plans
|
|
||||||
should be asked in the [dev section](https://discourse.glfw.org/c/dev) of the
|
|
||||||
forum or in the IRC channel. Please don't open a GitHub issue to discuss design
|
|
||||||
questions without first checking with a maintainer.
|
|
||||||
|
|
||||||
|
|
||||||
## Reporting a bug
|
|
||||||
|
|
||||||
If GLFW is behaving unexpectedly at run-time, start by setting an [error
|
|
||||||
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling).
|
|
||||||
GLFW will often tell you the cause of an error via this callback. If it
|
|
||||||
doesn't, that might be a separate bug.
|
|
||||||
|
|
||||||
If GLFW is crashing or triggering asserts, make sure that all your object
|
|
||||||
handles and other pointers are valid.
|
|
||||||
|
|
||||||
For bugs where it makes sense, a short, self contained example is absolutely
|
|
||||||
invaluable. Just put it inline in the body text. Note that if the bug is
|
|
||||||
reproducible with one of the test programs that come with GLFW, just mention
|
|
||||||
that instead.
|
|
||||||
|
|
||||||
__Don't worry about adding too much information__. Unimportant information can
|
|
||||||
be abbreviated or removed later, but missing information can stall bug fixing,
|
|
||||||
especially when your schedule doesn't align with that of the maintainer.
|
|
||||||
|
|
||||||
__Please provide text as text, not as images__. This includes code, error
|
|
||||||
messages and any other text. Text in images cannot be found by other users
|
|
||||||
searching for the same problem and may have to be re-typed by maintainers when
|
|
||||||
debugging.
|
|
||||||
|
|
||||||
You don't need to manually indent your code or other text to quote it with
|
|
||||||
GitHub Markdown; just surround it with triple backticks:
|
|
||||||
|
|
||||||
```
|
|
||||||
Some quoted text.
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also add syntax highlighting by appending the common file extension:
|
|
||||||
|
|
||||||
```c
|
|
||||||
int five(void)
|
|
||||||
{
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
There are issue labels for both platforms and GPU manufacturers, so there is no
|
|
||||||
need to mention these in the subject line. If you do, it will be removed when
|
|
||||||
the issue is labeled.
|
|
||||||
|
|
||||||
If your bug is already reported, please add any new information you have, or if
|
|
||||||
it already has everything, give it a :+1:.
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a compile or link bug
|
|
||||||
|
|
||||||
__Note:__ GLFW needs many system APIs to do its job, which on some platforms
|
|
||||||
means linking to many system libraries. If you are using GLFW as a static
|
|
||||||
library, that means your application needs to link to these in addition to GLFW.
|
|
||||||
|
|
||||||
__Note:__ Check the [Compiling
|
|
||||||
GLFW](https://www.glfw.org/docs/latest/compile.html) guide and or [Building
|
|
||||||
applications](https://www.glfw.org/docs/latest/build.html) guide for before
|
|
||||||
opening an issue of this kind. Most issues are caused by a missing package or
|
|
||||||
linker flag.
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`) and the __compiler name and version__ (e.g. `Visual
|
|
||||||
C++ 2015 Update 2`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
Please also include the __complete build log__ from your compiler and linker,
|
|
||||||
even if it's long. It can always be shortened later, if necessary.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
Compiler version:
|
|
||||||
Release or commit:
|
|
||||||
Build log:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a segfault or other crash bug
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
|
||||||
[error
|
|
||||||
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
|
||||||
the __full call stack__ of the crash, or if the crash does not occur in debug
|
|
||||||
mode, mention that instead.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
Release or commit:
|
|
||||||
Error messages:
|
|
||||||
Call stack:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a context creation bug
|
|
||||||
|
|
||||||
__Note:__ Windows ships with graphics drivers that do not support OpenGL. If
|
|
||||||
GLFW says that your machine lacks support for OpenGL, it very likely does.
|
|
||||||
Install drivers from the computer manufacturer or graphics card manufacturer
|
|
||||||
([Nvidia](https://www.geforce.com/drivers),
|
|
||||||
[AMD](https://www.amd.com/en/support),
|
|
||||||
[Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to
|
|
||||||
fix this.
|
|
||||||
|
|
||||||
__Note:__ AMD only supports OpenGL ES on Windows via EGL. See the
|
|
||||||
[GLFW\_CONTEXT\_CREATION\_API](https://www.glfw.org/docs/latest/window_guide.html#window_hints_ctx)
|
|
||||||
hint for how to select EGL.
|
|
||||||
|
|
||||||
Please verify that context creation also fails with the `glfwinfo` tool before
|
|
||||||
reporting it as a bug. This tool is included in the GLFW source tree as
|
|
||||||
`tests/glfwinfo.c` and is built along with the library. It has switches for all
|
|
||||||
GLFW context and framebuffer hints. Run `glfwinfo -h` for a complete list.
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
If you are running your program in a virtual machine, please mention this and
|
|
||||||
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
|
||||||
|
|
||||||
Please also include the __GLFW version string__ (`3.2.0 X11 EGL clock_gettime
|
|
||||||
/dev/js`), as described
|
|
||||||
[here](https://www.glfw.org/docs/latest/intro.html#intro_version_string), the
|
|
||||||
__GPU model and driver version__ (e.g. `GeForce GTX660 with 352.79`), and the
|
|
||||||
__output of `glfwinfo`__ (with switches matching any hints you set in your
|
|
||||||
code) when reporting this kind of bug. If this tool doesn't run on the machine,
|
|
||||||
mention that instead.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
GPU and driver:
|
|
||||||
Release or commit:
|
|
||||||
Version string:
|
|
||||||
glfwinfo output:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a monitor or video mode bug
|
|
||||||
|
|
||||||
__Note:__ On headless systems on some platforms, no monitors are reported. This
|
|
||||||
causes glfwGetPrimaryMonitor to return `NULL`, which not all applications are
|
|
||||||
prepared for.
|
|
||||||
|
|
||||||
__Note:__ Some third-party tools report more video modes than are approved of
|
|
||||||
by the OS. For safety and compatibility, GLFW only reports video modes the OS
|
|
||||||
wants programs to use. This is not a bug.
|
|
||||||
|
|
||||||
The `monitors` tool is included in the GLFW source tree as `tests/monitors.c`
|
|
||||||
and is built along with the library. It lists all information GLFW provides
|
|
||||||
about monitors it detects.
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
If you are running your program in a virtual machine, please mention this and
|
|
||||||
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
|
||||||
[error
|
|
||||||
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
|
||||||
the __output of `monitors`__ when reporting this kind of bug. If this tool
|
|
||||||
doesn't run on the machine, mention this instead.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
Release or commit:
|
|
||||||
Error messages:
|
|
||||||
monitors output:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a window, input or event bug
|
|
||||||
|
|
||||||
__Note:__ The exact ordering of related window events will sometimes differ.
|
|
||||||
|
|
||||||
__Note:__ Window moving and resizing (by the user) will block the main thread on
|
|
||||||
some platforms. This is not a bug. Set a [refresh
|
|
||||||
callback](https://www.glfw.org/docs/latest/window.html#window_refresh) if you
|
|
||||||
want to keep the window contents updated during a move or size operation.
|
|
||||||
|
|
||||||
The `events` tool is included in the GLFW source tree as `tests/events.c` and is
|
|
||||||
built along with the library. It prints all information provided to every
|
|
||||||
callback supported by GLFW as events occur. Each event is listed with the time
|
|
||||||
and a unique number to make discussions about event logs easier. The tool has
|
|
||||||
command-line options for creating multiple windows and full screen windows.
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
If you are running your program in a virtual machine, please mention this and
|
|
||||||
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
|
||||||
[error
|
|
||||||
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
|
||||||
if relevant, the __output of `events`__ when reporting this kind of bug. If
|
|
||||||
this tool doesn't run on the machine, mention this instead.
|
|
||||||
|
|
||||||
__X11:__ If possible, please include what desktop environment (e.g. GNOME,
|
|
||||||
Unity, KDE) and/or window manager (e.g. Openbox, dwm, Window Maker) you are
|
|
||||||
running. If the bug is related to keyboard input, please include any input
|
|
||||||
method (e.g. ibus, SCIM) you are using.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
Release or commit:
|
|
||||||
Error messages:
|
|
||||||
events output:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting some other library bug
|
|
||||||
|
|
||||||
Always include the __operating system name and version__ (e.g. `Windows
|
|
||||||
7 64-bit` or `Ubuntu 15.10`). If you are using an official release of GLFW,
|
|
||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
|
||||||
[error
|
|
||||||
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling), if
|
|
||||||
relevant.
|
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
|
||||||
|
|
||||||
```
|
|
||||||
OS and version:
|
|
||||||
Release or commit:
|
|
||||||
Error messages:
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a documentation bug
|
|
||||||
|
|
||||||
If you found a bug in the documentation, including this file, then it's fine to
|
|
||||||
just link to that web page or mention that source file. You don't need to match
|
|
||||||
the source to the output or vice versa.
|
|
||||||
|
|
||||||
|
|
||||||
### Reporting a website bug
|
|
||||||
|
|
||||||
If the bug is in the documentation (anything under `/docs/`) then please see the
|
|
||||||
section above. Bugs in the rest of the site are reported to the [website
|
|
||||||
source repository](https://github.com/glfw/website/issues).
|
|
||||||
|
|
||||||
|
|
||||||
## Requesting a feature
|
|
||||||
|
|
||||||
Please explain why you need the feature and how you intend to use it. If you
|
|
||||||
have a specific API design in mind, please add that as well. If you have or are
|
|
||||||
planning to write code for the feature, see the section below.
|
|
||||||
|
|
||||||
If there already is a request for the feature you need, add your specific use
|
|
||||||
case unless it is already mentioned. If it is, give it a :+1:.
|
|
||||||
|
|
||||||
|
|
||||||
## Contributing a bug fix
|
|
||||||
|
|
||||||
__Note:__ You must have all necessary [intellectual
|
|
||||||
property rights](https://en.wikipedia.org/wiki/Intellectual_property) to any
|
|
||||||
code you contribute. If you did not write the code yourself, you must explain
|
|
||||||
where it came from and under what license you received it. Even code using the
|
|
||||||
same license as GLFW may not be copied without attribution.
|
|
||||||
|
|
||||||
__There is no preferred patch size__. A one character fix is just as welcome as
|
|
||||||
a thousand line one, if that is the appropriate size for the fix.
|
|
||||||
|
|
||||||
In addition to the code, a complete bug fix includes:
|
|
||||||
|
|
||||||
- Change log entry in `README.md`, describing the incorrect behavior
|
|
||||||
- Credits entries for all authors of the bug fix
|
|
||||||
|
|
||||||
Bug fixes will not be rejected because they don't include all the above parts,
|
|
||||||
but please keep in mind that maintainer time is finite and that there are many
|
|
||||||
other bugs and features to work on.
|
|
||||||
|
|
||||||
If the patch fixes a bug introduced after the last release, it should not get
|
|
||||||
a change log entry.
|
|
||||||
|
|
||||||
If you haven't already, read the excellent article [How to Write a Git Commit
|
|
||||||
Message](https://chris.beams.io/posts/git-commit/).
|
|
||||||
|
|
||||||
|
|
||||||
## Contributing a feature
|
|
||||||
|
|
||||||
__Note:__ You must have all necessary rights to any code you contribute. If you
|
|
||||||
did not write the code yourself, you must explain where it came from and under
|
|
||||||
what license. Even code using the same license as GLFW may not be copied
|
|
||||||
without attribution.
|
|
||||||
|
|
||||||
__Note:__ If you haven't already implemented the feature, check first if there
|
|
||||||
already is an open issue for it and if it's already being developed in an
|
|
||||||
[experimental branch](https://github.com/glfw/glfw/branches/all).
|
|
||||||
|
|
||||||
__There is no preferred patch size__. A one-character change is just as welcome
|
|
||||||
as one adding a thousand lines, if that is the appropriate size for the
|
|
||||||
feature.
|
|
||||||
|
|
||||||
In addition to the code, a complete feature includes:
|
|
||||||
|
|
||||||
- Change log entry in `README.md`, listing all new symbols
|
|
||||||
- News page entry, briefly describing the feature
|
|
||||||
- Guide documentation, with minimal examples, in the relevant guide
|
|
||||||
- Reference documentation, with all applicable tags
|
|
||||||
- Cross-references and mentions in appropriate places
|
|
||||||
- Credits entries for all authors of the feature
|
|
||||||
|
|
||||||
If the feature requires platform-specific code, at minimum stubs must be added
|
|
||||||
for the new platform function to all supported and experimental platforms.
|
|
||||||
|
|
||||||
If it adds a new callback, support for it must be added to `tests/event.c`.
|
|
||||||
|
|
||||||
If it adds a new monitor property, support for it must be added to
|
|
||||||
`tests/monitor.c`.
|
|
||||||
|
|
||||||
If it adds a new OpenGL, OpenGL ES or Vulkan option or extension, support
|
|
||||||
for it must be added to `tests/glfwinfo.c` and the behavior of the library when
|
|
||||||
the extension is missing documented in `docs/compat.dox`.
|
|
||||||
|
|
||||||
If you haven't already, read the excellent article [How to Write a Git Commit
|
|
||||||
Message](https://chris.beams.io/posts/git-commit/).
|
|
||||||
|
|
||||||
Features will not be rejected because they don't include all the above parts,
|
|
||||||
but please keep in mind that maintainer time is finite and that there are many
|
|
||||||
other features and bugs to work on.
|
|
||||||
|
|
||||||
Please also keep in mind that any part of the public API that has been included
|
|
||||||
in a release cannot be changed until the next _major_ version. Features can be
|
|
||||||
added and existing parts can sometimes be overloaded (in the general sense of
|
|
||||||
doing more things, not in the C++ sense), but code written to the API of one
|
|
||||||
minor release should both compile and run on subsequent minor releases.
|
|
||||||
|
|
2796
docs/Doxyfile.in
2796
docs/Doxyfile.in
File diff suppressed because it is too large
Load Diff
|
@ -1,21 +1,115 @@
|
||||||
<doxygenlayout version="1.0">
|
<doxygenlayout version="1.0">
|
||||||
<!-- Generated by doxygen 1.8.14 -->
|
<!-- Generated by doxygen 1.8.3.1 -->
|
||||||
<!-- Navigation index tabs for HTML output -->
|
<!-- Navigation index tabs for HTML output -->
|
||||||
<navindex>
|
<navindex>
|
||||||
<tab type="mainpage" visible="yes" title="Introduction"/>
|
<tab type="mainpage" visible="yes" title="Introduction"/>
|
||||||
<tab type="user" url="quick_guide.html" title="Tutorial"/>
|
|
||||||
<tab type="pages" visible="yes" title="Guides" intro=""/>
|
<tab type="pages" visible="yes" title="Guides" intro=""/>
|
||||||
<tab type="modules" visible="yes" title="Reference" intro=""/>
|
<tab type="modules" visible="yes" title="Reference" intro=""/>
|
||||||
<tab type="filelist" visible="yes" title="Files"/>
|
<tab type="namespaces" visible="yes" title="">
|
||||||
|
<tab type="namespacelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="namespacemembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="classes" visible="no" title="">
|
||||||
|
<tab type="classlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="hierarchy" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classmembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="files" visible="yes" title="Header Files">
|
||||||
|
<tab type="filelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="globals" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="examples" visible="yes" title="" intro=""/>
|
||||||
</navindex>
|
</navindex>
|
||||||
|
|
||||||
|
<!-- Layout definition for a class page -->
|
||||||
|
<class>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<inheritancegraph visible="$CLASS_GRAPH"/>
|
||||||
|
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedclasses visible="yes" title=""/>
|
||||||
|
<publictypes title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicmethods title=""/>
|
||||||
|
<publicstaticmethods title=""/>
|
||||||
|
<publicattributes title=""/>
|
||||||
|
<publicstaticattributes title=""/>
|
||||||
|
<protectedtypes title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<protectedmethods title=""/>
|
||||||
|
<protectedstaticmethods title=""/>
|
||||||
|
<protectedattributes title=""/>
|
||||||
|
<protectedstaticattributes title=""/>
|
||||||
|
<packagetypes title=""/>
|
||||||
|
<packagemethods title=""/>
|
||||||
|
<packagestaticmethods title=""/>
|
||||||
|
<packageattributes title=""/>
|
||||||
|
<packagestaticattributes title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<privatetypes title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<privatemethods title=""/>
|
||||||
|
<privatestaticmethods title=""/>
|
||||||
|
<privateattributes title=""/>
|
||||||
|
<privatestaticattributes title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<related title="" subtitle=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<constructors title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<related title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<allmemberslink visible="yes"/>
|
||||||
|
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</class>
|
||||||
|
|
||||||
|
<!-- Layout definition for a namespace page -->
|
||||||
|
<namespace>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestednamespaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</namespace>
|
||||||
|
|
||||||
<!-- Layout definition for a file page -->
|
<!-- Layout definition for a file page -->
|
||||||
<file>
|
<file>
|
||||||
<detaileddescription title="Description"/>
|
<briefdescription visible="yes"/>
|
||||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<includegraph visible="$INCLUDE_GRAPH"/>
|
||||||
|
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
||||||
<sourcelink visible="yes"/>
|
<sourcelink visible="yes"/>
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<constantgroups visible="yes" title=""/>
|
<classes visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
|
@ -23,7 +117,9 @@
|
||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
<membergroups visible="yes"/>
|
<membergroups visible="yes"/>
|
||||||
</memberdecl>
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
<memberdef>
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
|
@ -35,26 +131,46 @@
|
||||||
|
|
||||||
<!-- Layout definition for a group page -->
|
<!-- Layout definition for a group page -->
|
||||||
<group>
|
<group>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
<detaileddescription title="Description"/>
|
<detaileddescription title="Description"/>
|
||||||
|
<groupgraph visible="$GROUP_GRAPHS"/>
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<nestedgroups visible="yes" title=""/>
|
<nestedgroups visible="yes" title=""/>
|
||||||
<dirs visible="yes" title=""/>
|
<dirs visible="yes" title=""/>
|
||||||
<files visible="yes" title=""/>
|
<files visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
<enumvalues title=""/>
|
<enumvalues title=""/>
|
||||||
<functions title=""/>
|
<functions title=""/>
|
||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
</memberdecl>
|
</memberdecl>
|
||||||
<memberdef>
|
<memberdef>
|
||||||
<pagedocs/>
|
<pagedocs/>
|
||||||
|
<inlineclasses title=""/>
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
<enumvalues title=""/>
|
<enumvalues title=""/>
|
||||||
<functions title=""/>
|
<functions title=""/>
|
||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
</memberdef>
|
</memberdef>
|
||||||
<authorsection visible="yes"/>
|
<authorsection visible="yes"/>
|
||||||
</group>
|
</group>
|
||||||
|
@ -62,6 +178,7 @@
|
||||||
<!-- Layout definition for a directory page -->
|
<!-- Layout definition for a directory page -->
|
||||||
<directory>
|
<directory>
|
||||||
<briefdescription visible="yes"/>
|
<briefdescription visible="yes"/>
|
||||||
|
<directorygraph visible="yes"/>
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<dirs visible="yes"/>
|
<dirs visible="yes"/>
|
||||||
<files visible="yes"/>
|
<files visible="yes"/>
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
# Support resources
|
|
||||||
|
|
||||||
See the [latest documentation](https://www.glfw.org/docs/latest/) for tutorials,
|
|
||||||
guides and the API reference.
|
|
||||||
|
|
||||||
If you have questions about using GLFW, we have a
|
|
||||||
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
|
||||||
[Libera.Chat](https://libera.chat/).
|
|
||||||
|
|
||||||
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
|
||||||
Please check the [contribution
|
|
||||||
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
|
||||||
information on what to include when reporting a bug.
|
|
||||||
|
|
259
docs/build.dox
259
docs/build.dox
|
@ -15,57 +15,42 @@ specific compiler of your chosen development environment. The compilation
|
||||||
and linking process should be explained in your C programming material and in
|
and linking process should be explained in your C programming material and in
|
||||||
the documentation for your development environment.
|
the documentation for your development environment.
|
||||||
|
|
||||||
|
|
||||||
@section build_include Including the GLFW header file
|
@section build_include Including the GLFW header file
|
||||||
|
|
||||||
You should include the GLFW header in the source files where you use OpenGL or
|
In the source files of your application where you use OpenGL or GLFW, you should
|
||||||
GLFW.
|
include the GLFW header file, i.e.:
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This header defines all the constants and declares all the types and function
|
The GLFW header declares the GLFW API and by default also includes the OpenGL
|
||||||
prototypes of the GLFW API. By default, it also includes the OpenGL header from
|
header of your development environment, which in turn defines all the constants,
|
||||||
your development environment. See [option macros](@ref build_macros) below for
|
types and function prototypes of the OpenGL API.
|
||||||
how to select OpenGL ES headers and more.
|
|
||||||
|
|
||||||
The GLFW header also defines any platform-specific macros needed by your OpenGL
|
The GLFW header also defines everything necessary for your OpenGL header to
|
||||||
header, so that it can be included without needing any window system headers.
|
function. For example, under Windows you are normally required to include
|
||||||
|
`windows.h` before the OpenGL header, which would pollute your code namespace
|
||||||
|
with the entire Win32 API.
|
||||||
|
|
||||||
It does this only when needed, so if window system headers are included, the
|
Instead, the GLFW header takes care of this for you, not by including
|
||||||
GLFW header does not try to redefine those symbols. The reverse is not true,
|
`windows.h`, but by duplicating only the very few necessary parts of it. It
|
||||||
i.e. `windows.h` cannot cope if any Win32 symbols have already been defined.
|
does this only when needed, so if `windows.h` _is_ included, the GLFW header
|
||||||
|
does not try to redefine those symbols. The reverse is not true, i.e.
|
||||||
|
`windows.h` cannot cope if any of its symbols have already been defined.
|
||||||
|
|
||||||
In other words:
|
In other words:
|
||||||
|
|
||||||
- Use the GLFW header to include OpenGL or OpenGL ES headers portably
|
- Do _not_ include the OpenGL headers yourself, as GLFW does this for you
|
||||||
- Do not include window system headers unless you will use those APIs directly
|
- Do _not_ include `windows.h` or other platform-specific headers unless you
|
||||||
- If you do need such headers, include them before the GLFW header
|
plan on using those APIs directly
|
||||||
|
- If you _do_ need to include such headers, do it _before_ including
|
||||||
|
the GLFW header and it will handle this
|
||||||
|
|
||||||
If you are using an OpenGL extension loading library such as
|
If you are using an OpenGL extension loading library such as
|
||||||
[glad](https://github.com/Dav1dde/glad), the extension loader header should
|
[glad](https://github.com/Dav1dde/glad), the extension loader header should
|
||||||
be included before the GLFW one. GLFW attempts to detect any OpenGL or OpenGL
|
either be included _before_ the GLFW one, or the `GLFW_INCLUDE_NONE` macro
|
||||||
ES header or extension loader header included before it and will then disable
|
(described below) should be defined.
|
||||||
the inclusion of the default OpenGL header. Most extension loaders also define
|
|
||||||
macros that disable similar headers below it.
|
|
||||||
|
|
||||||
@code
|
|
||||||
#include <glad/gl.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
@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
|
|
||||||
@ref GLFW_INCLUDE_NONE macro will explicitly prevent the GLFW header from
|
|
||||||
including the OpenGL header. This will also allow you to include the two
|
|
||||||
headers in any order.
|
|
||||||
|
|
||||||
@code
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
#include <glad/gl.h>
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_macros GLFW header option macros
|
@subsection build_macros GLFW header option macros
|
||||||
|
@ -73,70 +58,53 @@ headers in any order.
|
||||||
These macros may be defined before the inclusion of the GLFW header and affect
|
These macros may be defined before the inclusion of the GLFW header and affect
|
||||||
its behavior.
|
its behavior.
|
||||||
|
|
||||||
@anchor GLFW_DLL
|
`GLFW_DLL` is required on Windows when using the GLFW DLL, to tell the compiler
|
||||||
__GLFW_DLL__ is required on Windows when using the GLFW DLL, to tell the
|
that the GLFW functions are defined in a DLL.
|
||||||
compiler that the GLFW functions are defined in a DLL.
|
|
||||||
|
|
||||||
The following macros control which OpenGL or OpenGL ES API header is included.
|
The following macros control which OpenGL or OpenGL ES API header is included.
|
||||||
Only one of these may be defined at a time.
|
Only one of these may be defined at a time.
|
||||||
|
|
||||||
@note GLFW does not provide any of the API headers mentioned below. They are
|
`GLFW_INCLUDE_GLCOREARB` makes the GLFW header include the modern
|
||||||
provided by your development environment or your OpenGL, OpenGL ES or Vulkan
|
`GL/glcorearb.h` header (`OpenGL/gl3.h` on OS X) instead of the regular OpenGL
|
||||||
SDK, and most of them can be downloaded from the
|
|
||||||
[Khronos Registry](https://www.khronos.org/registry/).
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_GLCOREARB
|
|
||||||
__GLFW_INCLUDE_GLCOREARB__ makes the GLFW header include the modern
|
|
||||||
`GL/glcorearb.h` header (`OpenGL/gl3.h` on macOS) instead of the regular OpenGL
|
|
||||||
header.
|
header.
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_ES1
|
`GLFW_INCLUDE_ES1` makes the GLFW header include the OpenGL ES 1.x `GLES/gl.h`
|
||||||
__GLFW_INCLUDE_ES1__ makes the GLFW header include the OpenGL ES 1.x `GLES/gl.h`
|
|
||||||
header instead of the regular OpenGL header.
|
header instead of the regular OpenGL header.
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_ES2
|
`GLFW_INCLUDE_ES2` makes the GLFW header include the OpenGL ES 2.0 `GLES2/gl2.h`
|
||||||
__GLFW_INCLUDE_ES2__ makes the GLFW header include the OpenGL ES 2.0
|
header instead of the regular OpenGL header.
|
||||||
`GLES2/gl2.h` header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_ES3
|
`GLFW_INCLUDE_ES3` makes the GLFW header include the OpenGL ES 3.0 `GLES3/gl3.h`
|
||||||
__GLFW_INCLUDE_ES3__ makes the GLFW header include the OpenGL ES 3.0
|
header instead of the regular OpenGL header.
|
||||||
`GLES3/gl3.h` header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_ES31
|
`GLFW_INCLUDE_ES31` makes the GLFW header include the OpenGL ES 3.1 `GLES3/gl31.h`
|
||||||
__GLFW_INCLUDE_ES31__ makes the GLFW header include the OpenGL ES 3.1
|
header instead of the regular OpenGL header.
|
||||||
`GLES3/gl31.h` header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_ES32
|
`GLFW_INCLUDE_VULKAN` makes the GLFW header include the Vulkan `vulkan/vulkan.h`
|
||||||
__GLFW_INCLUDE_ES32__ makes the GLFW header include the OpenGL ES 3.2
|
header instead of the regular OpenGL header.
|
||||||
`GLES3/gl32.h` header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_NONE
|
`GLFW_INCLUDE_NONE` makes the GLFW header not include any OpenGL or OpenGL ES API
|
||||||
__GLFW_INCLUDE_NONE__ makes the GLFW header not include any OpenGL or OpenGL ES
|
header. This is useful in combination with an extension loading library.
|
||||||
API header. This is useful in combination with an extension loading library.
|
|
||||||
|
|
||||||
If none of the above inclusion macros are defined, the standard OpenGL `GL/gl.h`
|
If none of the above inclusion macros are defined, the standard OpenGL `GL/gl.h`
|
||||||
header (`OpenGL/gl.h` on macOS) is included, unless GLFW detects the inclusion
|
header (`OpenGL/gl.h` on OS X) is included.
|
||||||
guards of any OpenGL, OpenGL ES or extension loader header it knows about.
|
|
||||||
|
|
||||||
The following macros control the inclusion of additional API headers. Any
|
The following macros control the inclusion of additional API headers. Any
|
||||||
number of these may be defined simultaneously, and/or together with one of the
|
number of these may be defined simultaneously, and/or together with one of the
|
||||||
above macros.
|
above macros.
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_VULKAN
|
`GLFW_INCLUDE_GLEXT` makes the GLFW header include the appropriate extension
|
||||||
__GLFW_INCLUDE_VULKAN__ makes the GLFW header include the Vulkan
|
|
||||||
`vulkan/vulkan.h` header in addition to any selected OpenGL or OpenGL ES header.
|
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_GLEXT
|
|
||||||
__GLFW_INCLUDE_GLEXT__ makes the GLFW header include the appropriate extension
|
|
||||||
header for the OpenGL or OpenGL ES header selected above after and in addition
|
header for the OpenGL or OpenGL ES header selected above after and in addition
|
||||||
to that header.
|
to that header.
|
||||||
|
|
||||||
@anchor GLFW_INCLUDE_GLU
|
`GLFW_INCLUDE_GLU` makes the header include the GLU header in addition to the
|
||||||
__GLFW_INCLUDE_GLU__ makes the header include the GLU header in addition to the
|
|
||||||
header selected above. This should only be used with the standard OpenGL header
|
header selected above. This should only be used with the standard OpenGL header
|
||||||
and only for compatibility with legacy code. GLU has been deprecated and should
|
and only for compatibility with legacy code. GLU has been deprecated and should
|
||||||
not be used in new code.
|
not be used in new code.
|
||||||
|
|
||||||
|
@note GLFW does not provide any of the API headers mentioned above. They must
|
||||||
|
be provided by your development environment or your OpenGL or OpenGL ES SDK.
|
||||||
|
|
||||||
@note None of these macros may be defined during the compilation of GLFW itself.
|
@note None of these macros may be defined during the compilation of GLFW itself.
|
||||||
If your build includes GLFW and you define any these in your build files, make
|
If your build includes GLFW and you define any these in your build files, make
|
||||||
sure they are not applied to the GLFW sources.
|
sure they are not applied to the GLFW sources.
|
||||||
|
@ -150,13 +118,13 @@ a shared library / dynamic library / DLL then it takes care of these links.
|
||||||
However, if you are using GLFW as a static library then your executable will
|
However, if you are using GLFW as a static library then your executable will
|
||||||
need to link against these libraries.
|
need to link against these libraries.
|
||||||
|
|
||||||
On Windows and macOS, the list of system libraries is static and can be
|
On Windows and OS X, the list of system libraries is static and can be
|
||||||
hard-coded into your build environment. See the section for your development
|
hard-coded into your build environment. See the section for your development
|
||||||
environment below. On Linux and other Unix-like operating systems, the list
|
environment below. On Linux and other Unix-like operating systems, the list
|
||||||
varies but can be retrieved in various ways as described below.
|
varies but can be retrieved in various ways as described below.
|
||||||
|
|
||||||
A good general introduction to linking is
|
A good general introduction to linking is
|
||||||
[Beginner's Guide to Linkers](https://www.lurklurk.org/linkers/linkers.html) by
|
[Beginner's Guide to Linkers](http://www.lurklurk.org/linkers/linkers.html) by
|
||||||
David Drysdale.
|
David Drysdale.
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,15 +133,20 @@ David Drysdale.
|
||||||
The static version of the GLFW library is named `glfw3`. When using this
|
The static version of the GLFW library is named `glfw3`. When using this
|
||||||
version, it is also necessary to link with some libraries that GLFW uses.
|
version, it is also necessary to link with some libraries that GLFW uses.
|
||||||
|
|
||||||
When using MinGW to link an application with the static version of GLFW, you
|
When linking an application under Windows that uses the static version of GLFW,
|
||||||
must also explicitly link with `gdi32`. Other toolchains including MinGW-w64
|
you must link with `opengl32`. On some versions of MinGW, you must also
|
||||||
include it in the set of default libraries along with other dependencies like
|
explicitly link with `gdi32`, while other versions of MinGW include it in the
|
||||||
`user32` and `kernel32`.
|
set of default libraries along with other dependencies like `user32` and
|
||||||
|
`kernel32`. If you are using GLU, you must also link with `glu32`.
|
||||||
|
|
||||||
The link library for the GLFW DLL is named `glfw3dll`. When compiling an
|
The link library for the GLFW DLL is named `glfw3dll`. When compiling an
|
||||||
application that uses the DLL version of GLFW, you need to define the @ref
|
application that uses the DLL version of GLFW, you need to define the `GLFW_DLL`
|
||||||
GLFW_DLL macro _before_ any inclusion of the GLFW header. This can be done
|
macro _before_ any inclusion of the GLFW header. This can be done either with
|
||||||
either with a compiler switch or by defining it in your source code.
|
a compiler switch or by defining it in your source code.
|
||||||
|
|
||||||
|
An application using the GLFW DLL does not need to link against any of its
|
||||||
|
dependencies, but you still have to link against `opengl32` if your application
|
||||||
|
uses OpenGL and `glu32` if it uses GLU.
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_cmake_source With CMake and GLFW source
|
@subsection build_link_cmake_source With CMake and GLFW source
|
||||||
|
@ -182,45 +155,50 @@ This section is about using CMake to compile and link GLFW along with your
|
||||||
application. If you want to use an installed binary instead, see @ref
|
application. If you want to use an installed binary instead, see @ref
|
||||||
build_link_cmake_package.
|
build_link_cmake_package.
|
||||||
|
|
||||||
With a few changes to your `CMakeLists.txt` you can have the GLFW source tree
|
With just a few changes to your `CMakeLists.txt` you can have the GLFW source
|
||||||
built along with your application.
|
tree built along with your application.
|
||||||
|
|
||||||
Add the root directory of the GLFW source tree to your project. This will add
|
When including GLFW as part of your build, you probably don't want to build the
|
||||||
the `glfw` target to your project.
|
GLFW tests, examples and documentation. To disable these, set the corresponding
|
||||||
|
cache variables before adding the GLFW source tree.
|
||||||
|
|
||||||
|
@code
|
||||||
|
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Then add the root directory of the GLFW source tree to your project. This
|
||||||
|
will add the `glfw` target and the necessary cache variables to your project.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
add_subdirectory(path/to/glfw)
|
add_subdirectory(path/to/glfw)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Once GLFW has been added, link your application against the `glfw` target.
|
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 as it is currently
|
This adds all link-time dependencies of GLFW as it is currently configured,
|
||||||
configured, the include directory for the GLFW header and, when applicable, the
|
the include directory for the GLFW header and, when applicable, the
|
||||||
@ref GLFW_DLL macro.
|
[GLFW_DLL](@ref build_macros) macro.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
target_link_libraries(myapp glfw)
|
target_link_libraries(myapp glfw)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL,
|
Note that it does not include GLU, as GLFW does not use it. If your application
|
||||||
OpenGL ES or Vulkan libraries it needs at runtime. If your application calls
|
needs GLU, you can find it by requiring the OpenGL package.
|
||||||
OpenGL directly, instead of using a modern
|
|
||||||
[extension loader library](@ref context_glext_auto), use the OpenGL CMake
|
|
||||||
package.
|
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If OpenGL is found, the `OpenGL::GL` target is added to your project, containing
|
If GLU is found, the `OPENGL_GLU_FOUND` variable is true and the
|
||||||
library and include directory paths. Link against this like any other library.
|
`OPENGL_INCLUDE_DIR` and `OPENGL_glu_LIBRARY` cache variables can be used.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
target_link_libraries(myapp OpenGL::GL)
|
target_include_directories(myapp ${OPENGL_INCLUDE_DIR})
|
||||||
|
target_link_libraries(myapp ${OPENGL_glu_LIBRARY})
|
||||||
@endcode
|
@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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_cmake_package With CMake and installed GLFW binaries
|
@subsection build_link_cmake_package With CMake and installed GLFW binaries
|
||||||
|
|
||||||
|
@ -228,42 +206,41 @@ This section is about using CMake to link GLFW after it has been built and
|
||||||
installed. If you want to build it along with your application instead, see
|
installed. If you want to build it along with your application instead, see
|
||||||
@ref build_link_cmake_source.
|
@ref build_link_cmake_source.
|
||||||
|
|
||||||
With a few changes to your `CMakeLists.txt` you can locate the package and
|
With just a few changes to your `CMakeLists.txt`, you can locate the package and
|
||||||
target files generated when GLFW is installed.
|
target files generated when GLFW is installed.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
find_package(glfw3 3.4 REQUIRED)
|
find_package(glfw3 3.2 REQUIRED)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Once GLFW has been added to the project, link against it with the `glfw` target.
|
Once GLFW has been located, link against it with the `glfw` target. This adds
|
||||||
This adds the GLFW library and its link-time dependencies, the include directory
|
all link-time dependencies of GLFW as it is currently configured, the include
|
||||||
for the GLFW header and, when applicable, the @ref GLFW_DLL macro.
|
directory for the GLFW header and, when applicable, the
|
||||||
|
[GLFW_DLL](@ref build_macros) macro.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
target_link_libraries(myapp glfw)
|
target_link_libraries(myapp glfw)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL,
|
Note that it does not include GLU, as GLFW does not use it. If your application
|
||||||
OpenGL ES or Vulkan libraries it needs at runtime. If your application calls
|
needs GLU, you can find it by requiring the OpenGL package.
|
||||||
OpenGL directly, instead of using a modern
|
|
||||||
[extension loader library](@ref context_glext_auto), use the OpenGL CMake
|
|
||||||
package.
|
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If OpenGL is found, the `OpenGL::GL` target is added to your project, containing
|
If GLU is found, the `OPENGL_GLU_FOUND` variable is true and the
|
||||||
library and include directory paths. Link against this like any other library.
|
`OPENGL_INCLUDE_DIR` and `OPENGL_glu_LIBRARY` cache variables can be used.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
target_link_libraries(myapp OpenGL::GL)
|
target_include_directories(myapp ${OPENGL_INCLUDE_DIR})
|
||||||
|
target_link_libraries(myapp ${OPENGL_glu_LIBRARY})
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_pkgconfig With makefiles and pkg-config on Unix
|
@subsection build_link_pkgconfig With makefiles and pkg-config on Unix
|
||||||
|
|
||||||
GLFW supports [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/),
|
GLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/),
|
||||||
and the `glfw3.pc` pkg-config file is generated when the GLFW library is built
|
and the `glfw3.pc` pkg-config file is generated when the GLFW library is built
|
||||||
and is installed along with it. A pkg-config file describes all necessary
|
and is installed along with it. A pkg-config file describes all necessary
|
||||||
compile-time and link-time flags and dependencies needed to use a library. When
|
compile-time and link-time flags and dependencies needed to use a library. When
|
||||||
|
@ -274,48 +251,54 @@ A typical compile and link command-line when using the static version of the
|
||||||
GLFW library may look like this:
|
GLFW library may look like this:
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --static --libs glfw3)
|
cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --static --libs glfw3`
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If you are using the shared version of the GLFW library, omit the `--static`
|
If you are using the shared version of the GLFW library, simply omit the
|
||||||
flag.
|
`--static` flag.
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3)
|
cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
You can also use the `glfw3.pc` file without installing it first, by using the
|
You can also use the `glfw3.pc` file without installing it first, by using the
|
||||||
`PKG_CONFIG_PATH` environment variable.
|
`PKG_CONFIG_PATH` environment variable.
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
env PKG_CONFIG_PATH=path/to/glfw/src cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3)
|
env PKG_CONFIG_PATH=path/to/glfw/src cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The dependencies do not include OpenGL, as GLFW loads any OpenGL, OpenGL ES or
|
The dependencies do not include GLU, as GLFW does not use it. On OS X, GLU is
|
||||||
Vulkan libraries it needs at runtime. If your application calls OpenGL
|
built into the OpenGL framework, so if you need GLU you don't need to do
|
||||||
directly, instead of using a modern
|
anything extra. If you need GLU and are using Linux or BSD, you should add the
|
||||||
[extension loader library](@ref context_glext_auto), you should add the `gl`
|
`glu` pkg-config package.
|
||||||
pkg-config package.
|
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cc $(pkg-config --cflags glfw3 gl) -o myprog myprog.c $(pkg-config --libs glfw3 gl)
|
cc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --libs glfw3 glu`
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
If you are using the static version of the GLFW library, make sure you don't
|
||||||
|
link statically against GLU.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --static --libs glfw3` `pkg-config --libs glu`
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_xcode With Xcode on macOS
|
@subsection build_link_xcode With Xcode on OS X
|
||||||
|
|
||||||
If you are using the dynamic library version of GLFW, add it to the project
|
If you are using the dynamic library version of GLFW, simply add it to the
|
||||||
dependencies.
|
project dependencies.
|
||||||
|
|
||||||
If you are using the static library version of GLFW, add it and the Cocoa,
|
If you are using the static library version of GLFW, add it and the Cocoa,
|
||||||
OpenGL and IOKit frameworks to the project as dependencies. They can all be
|
OpenGL, IOKit and CoreVideo frameworks to the project as dependencies. They can
|
||||||
found in `/System/Library/Frameworks`.
|
all be found in `/System/Library/Frameworks`.
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_osx With command-line on macOS
|
@subsection build_link_osx With command-line on OS X
|
||||||
|
|
||||||
It is recommended that you use [pkg-config](@ref build_link_pkgconfig) when
|
It is recommended that you use [pkg-config](@ref build_link_pkgconfig) when
|
||||||
building from the command line on macOS. That way you will get any new
|
building from the command line on OS X. That way you will get any new
|
||||||
dependencies added automatically. If you still wish to build manually, you need
|
dependencies added automatically. If you still wish to build manually, you need
|
||||||
to add the required frameworks and libraries to your command-line yourself using
|
to add the required frameworks and libraries to your command-line yourself using
|
||||||
the `-l` and `-framework` switches.
|
the `-l` and `-framework` switches.
|
||||||
|
@ -323,7 +306,7 @@ the `-l` and `-framework` switches.
|
||||||
If you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do:
|
If you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do:
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit
|
cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
||||||
|
@ -332,7 +315,9 @@ for `-lglfw`.
|
||||||
Note that you do not add the `.framework` extension to a framework when linking
|
Note that you do not add the `.framework` extension to a framework when linking
|
||||||
against it from the command-line.
|
against it from the command-line.
|
||||||
|
|
||||||
@note Your machine may have `libGL.*.dylib` style OpenGL library, but that is
|
The OpenGL framework contains both the OpenGL and GLU APIs, so there is nothing
|
||||||
for the X Window System and will not work with the macOS native version of GLFW.
|
special to do when using GLU. Also note that even though your machine may have
|
||||||
|
`libGL`-style OpenGL libraries, they are for use with the X Window System and
|
||||||
|
will _not_ work with the OS X native version of GLFW.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
140
docs/compat.dox
140
docs/compat.dox
|
@ -23,9 +23,9 @@ varied window managers in use on Unix-like systems. In order for applications
|
||||||
and window managers to work well together, a number of standards and
|
and window managers to work well together, a number of standards and
|
||||||
conventions have been developed that regulate behavior outside the scope of the
|
conventions have been developed that regulate behavior outside the scope of the
|
||||||
X11 API; most importantly the
|
X11 API; most importantly the
|
||||||
[Inter-Client Communication Conventions Manual](https://www.tronche.com/gui/x/icccm/)
|
[Inter-Client Communication Conventions Manual](http://www.tronche.com/gui/x/icccm/)
|
||||||
(ICCCM) and
|
(ICCCM) and
|
||||||
[Extended Window Manager Hints](https://standards.freedesktop.org/wm-spec/wm-spec-latest.html)
|
[Extended Window Manager Hints](http://standards.freedesktop.org/wm-spec/wm-spec-latest.html)
|
||||||
(EWMH) standards.
|
(EWMH) standards.
|
||||||
|
|
||||||
GLFW uses the `_MOTIF_WM_HINTS` window property to support borderless windows.
|
GLFW uses the `_MOTIF_WM_HINTS` window property to support borderless windows.
|
||||||
|
@ -53,13 +53,13 @@ running window manager uses compositing but does not support this property then
|
||||||
additional copying may be performed for each buffer swap of full screen windows.
|
additional copying may be performed for each buffer swap of full screen windows.
|
||||||
|
|
||||||
GLFW uses the
|
GLFW uses the
|
||||||
[clipboard manager protocol](https://www.freedesktop.org/wiki/ClipboardManager/)
|
[clipboard manager protocol](http://www.freedesktop.org/wiki/ClipboardManager/)
|
||||||
to push a clipboard string (i.e. selection) owned by a GLFW window about to be
|
to push a clipboard string (i.e. selection) owned by a GLFW window about to be
|
||||||
destroyed to the clipboard manager. If there is no running clipboard manager,
|
destroyed to the clipboard manager. If there is no running clipboard manager,
|
||||||
the clipboard string will be unavailable once the window has been destroyed.
|
the clipboard string will be unavailable once the window has been destroyed.
|
||||||
|
|
||||||
GLFW uses the
|
GLFW uses the
|
||||||
[X drag-and-drop protocol](https://www.freedesktop.org/wiki/Specifications/XDND/)
|
[X drag-and-drop protocol](http://www.freedesktop.org/wiki/Specifications/XDND/)
|
||||||
to provide file drop events. If the application originating the drag does not
|
to provide file drop events. If the application originating the drag does not
|
||||||
support this protocol, drag and drop will not work.
|
support this protocol, drag and drop will not work.
|
||||||
|
|
||||||
|
@ -76,79 +76,6 @@ GLFW uses the Xkb extension and detectable auto-repeat to provide keyboard
|
||||||
input. If the running X server does not support this extension, a non-Xkb
|
input. If the running X server does not support this extension, a non-Xkb
|
||||||
fallback path is used.
|
fallback path is used.
|
||||||
|
|
||||||
GLFW uses the XInput2 extension to provide raw, non-accelerated mouse motion
|
|
||||||
when the cursor is disabled. If the running X server does not support this
|
|
||||||
extension, regular accelerated mouse motion will be used.
|
|
||||||
|
|
||||||
GLFW uses both the XRender extension and the compositing manager to support
|
|
||||||
transparent window framebuffers. If the running X server does not support this
|
|
||||||
extension or there is no running compositing manager, the
|
|
||||||
`GLFW_TRANSPARENT_FRAMEBUFFER` framebuffer hint will have no effect.
|
|
||||||
|
|
||||||
GLFW uses both the Xcursor extension and the freedesktop cursor conventions to
|
|
||||||
provide an expanded set of standard cursor shapes. If the running X server does
|
|
||||||
not support this extension or the current cursor theme does not support the
|
|
||||||
conventions, the `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR` and
|
|
||||||
`GLFW_NOT_ALLOWED_CURSOR` shapes will not be available and other shapes may use
|
|
||||||
legacy images.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_wayland Wayland protocols and IPC standards
|
|
||||||
|
|
||||||
As GLFW uses libwayland directly, without any intervening toolkit library, it
|
|
||||||
has sole responsibility for interacting well with every compositor in use on
|
|
||||||
Unix-like systems. Most of the features are provided by the core protocol,
|
|
||||||
while cursor support is provided by the libwayland-cursor helper library, EGL
|
|
||||||
integration by libwayland-egl, and keyboard handling by
|
|
||||||
[libxkbcommon](https://xkbcommon.org/). In addition, GLFW uses some protocols
|
|
||||||
from wayland-protocols to provide additional features if the compositor
|
|
||||||
supports them.
|
|
||||||
|
|
||||||
GLFW uses xkbcommon 0.5.0 to provide key and text input support. Earlier
|
|
||||||
versions are not supported.
|
|
||||||
|
|
||||||
GLFW uses the [xdg-shell
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/xdg-shell/xdg-shell.xml)
|
|
||||||
to provide better window management. This protocol is part of
|
|
||||||
wayland-protocols 1.12, and is mandatory for GLFW to display a window.
|
|
||||||
|
|
||||||
GLFW uses the [relative pointer
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/relative-pointer/relative-pointer-unstable-v1.xml)
|
|
||||||
alongside the [pointer constraints
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml)
|
|
||||||
to implement disabled cursor. These two protocols are part of
|
|
||||||
wayland-protocols 1.1, and mandatory at build time. If the running compositor
|
|
||||||
does not support both of these protocols, disabling the cursor will have no
|
|
||||||
effect.
|
|
||||||
|
|
||||||
GLFW uses the [idle inhibit
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml)
|
|
||||||
to prohibit the screensaver from starting. This protocol is part of
|
|
||||||
wayland-protocols 1.6, and mandatory at build time. If the running compositor
|
|
||||||
does not support this protocol, the screensaver may start even for full screen
|
|
||||||
windows.
|
|
||||||
|
|
||||||
GLFW uses the [libdecor library](https://gitlab.freedesktop.org/libdecor/libdecor)
|
|
||||||
for window decorations, where available. This in turn provides good quality
|
|
||||||
client-side decorations (drawn by the application) on desktop systems that do
|
|
||||||
not support server-side decorations (drawn by the window manager). On systems
|
|
||||||
that do not provide either libdecor or xdg-decoration, very basic window
|
|
||||||
decorations are provided. These do not include the window title or any caption
|
|
||||||
buttons.
|
|
||||||
|
|
||||||
GLFW uses the [xdg-decoration
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml)
|
|
||||||
to request decorations to be drawn around its windows. This protocol is part
|
|
||||||
of wayland-protocols 1.15, and mandatory at build time. If the running
|
|
||||||
compositor does not support this protocol, a very simple frame will be drawn by
|
|
||||||
GLFW itself, using the [viewporter
|
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/viewporter/viewporter.xml)
|
|
||||||
alongside
|
|
||||||
[subsurfaces](https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml#n2598).
|
|
||||||
This protocol is part of wayland-protocols 1.4, and mandatory at build time.
|
|
||||||
If the running compositor does not support this protocol either, no decorations
|
|
||||||
will be drawn around windows.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_glx GLX extensions
|
@section compat_glx GLX extensions
|
||||||
|
|
||||||
|
@ -160,7 +87,7 @@ formats. If GLX 1.3 is not supported, @ref glfwInit will fail.
|
||||||
|
|
||||||
GLFW uses the `GLX_MESA_swap_control,` `GLX_EXT_swap_control` and
|
GLFW uses the `GLX_MESA_swap_control,` `GLX_EXT_swap_control` and
|
||||||
`GLX_SGI_swap_control` extensions to provide vertical retrace synchronization
|
`GLX_SGI_swap_control` extensions to provide vertical retrace synchronization
|
||||||
(or _vsync_), in that order of preference. When none of these extensions are
|
(or _vsync_), in that order of preference. Where none of these extension are
|
||||||
available, calling @ref glfwSwapInterval will have no effect.
|
available, calling @ref glfwSwapInterval will have no effect.
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_multisample` extension to create contexts with
|
GLFW uses the `GLX_ARB_multisample` extension to create contexts with
|
||||||
|
@ -170,9 +97,10 @@ multisampling anti-aliasing. Where this extension is unavailable, the
|
||||||
GLFW uses the `GLX_ARB_create_context` extension when available, even when
|
GLFW uses the `GLX_ARB_create_context` extension when available, even when
|
||||||
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
||||||
no effect, and setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT`
|
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
||||||
hints to `GLFW_TRUE` will cause @ref glfwCreateWindow to fail.
|
`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref
|
||||||
|
glfwCreateWindow to fail.
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_create_context_profile` extension to provide support for
|
GLFW uses the `GLX_ARB_create_context_profile` extension to provide support for
|
||||||
context profiles. Where this extension is unavailable, setting the
|
context profiles. Where this extension is unavailable, setting the
|
||||||
|
@ -212,9 +140,10 @@ unavailable, the `GLFW_SAMPLES` hint will have no effect.
|
||||||
GLFW uses the `WGL_ARB_create_context` extension when available, even when
|
GLFW uses the `WGL_ARB_create_context` extension when available, even when
|
||||||
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
||||||
no effect, and setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT`
|
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
||||||
hints to `GLFW_TRUE` will cause @ref glfwCreateWindow to fail.
|
`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref
|
||||||
|
glfwCreateWindow to fail.
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_create_context_profile` extension to provide support for
|
GLFW uses the `WGL_ARB_create_context_profile` extension to provide support for
|
||||||
context profiles. Where this extension is unavailable, setting the
|
context profiles. Where this extension is unavailable, setting the
|
||||||
|
@ -227,40 +156,39 @@ extension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no
|
||||||
effect and the context will always be flushed when released.
|
effect and the context will always be flushed when released.
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_framebuffer_sRGB` and `WGL_EXT_framebuffer_sRGB`
|
GLFW uses the `WGL_ARB_framebuffer_sRGB` and `WGL_EXT_framebuffer_sRGB`
|
||||||
extensions to provide support for sRGB framebuffers. When both of these
|
extensions to provide support for sRGB framebuffers. Where both of these
|
||||||
extensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
extension are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
||||||
|
|
||||||
|
|
||||||
@section compat_osx OpenGL on macOS
|
@section compat_osx OpenGL 3.2 and later on OS X
|
||||||
|
|
||||||
Support for OpenGL 3.2 and above was introduced with OS X 10.7 and even then
|
Support for OpenGL 3.2 and above was introduced with OS X 10.7 and even then
|
||||||
only forward-compatible, core profile contexts are supported. Support for
|
only forward-compatible, core profile contexts are supported. Support for
|
||||||
OpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,
|
OpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,
|
||||||
core profile contexts. There is also still no mechanism for requesting debug
|
core profile contexts. There is also still no mechanism for requesting debug
|
||||||
contexts or no-error contexts. Versions of Mac OS X earlier than 10.7 support
|
contexts. Versions of Mac OS X earlier than 10.7 support at most OpenGL
|
||||||
at most OpenGL version 2.1.
|
version 2.1.
|
||||||
|
|
||||||
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
||||||
given version 3.0 or 3.1. The `GLFW_OPENGL_PROFILE` hint must be set to
|
given version 3.0 or 3.1, the `GLFW_OPENGL_FORWARD_COMPAT` hint must be set to
|
||||||
`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts. The
|
`GLFW_TRUE` and the `GLFW_OPENGL_PROFILE` hint must be set to
|
||||||
`GLFW_CONTEXT_DEBUG` and `GLFW_CONTEXT_NO_ERROR` hints are ignored.
|
`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts and the
|
||||||
|
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
|
||||||
|
|
||||||
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
|
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
|
||||||
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
||||||
a non-default value will cause @ref glfwCreateWindow to fail and the
|
a non-default value will cause @ref glfwCreateWindow to fail and the
|
||||||
`GLFW_CONTEXT_DEBUG` hint is ignored.
|
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
|
||||||
|
|
||||||
|
|
||||||
@section compat_vulkan Vulkan loader and API
|
@section compat_vulkan Vulkan loader and API
|
||||||
|
|
||||||
By default, GLFW uses the standard system-wide Vulkan loader to access the
|
GLFW uses the standard system-wside Vulkan loader to access the Vulkan API.
|
||||||
Vulkan API on all platforms except macOS. This is installed by both graphics
|
This should be installed by graphics drivers and Vulkan SDKs. If this is not
|
||||||
drivers and Vulkan SDKs. If either the loader or at least one minimally
|
available, @ref glfwVulkanSupported will return `GLFW_FALSE` and all other
|
||||||
functional ICD is missing, @ref glfwVulkanSupported will return `GLFW_FALSE` and
|
Vulkan-related functions will fail with an @ref GLFW_API_UNAVAILABLE error.
|
||||||
all other Vulkan-related functions will fail with an @ref GLFW_API_UNAVAILABLE
|
|
||||||
error.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_wsi Vulkan WSI extensions
|
@section compat_wsi Vulkan WSI extensions
|
||||||
|
@ -273,11 +201,6 @@ surfaces on Microsoft Windows. If any of these extensions are not available,
|
||||||
@ref glfwGetRequiredInstanceExtensions will return an empty list and window
|
@ref glfwGetRequiredInstanceExtensions will return an empty list and window
|
||||||
surface creation will fail.
|
surface creation will fail.
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and either the `VK_MVK_macos_surface` or
|
|
||||||
`VK_EXT_metal_surface` extensions to create surfaces on macOS. If any of these
|
|
||||||
extensions are not available, @ref glfwGetRequiredInstanceExtensions will
|
|
||||||
return an empty list and window surface creation will fail.
|
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and either the `VK_KHR_xlib_surface` or
|
GLFW uses the `VK_KHR_surface` and either the `VK_KHR_xlib_surface` or
|
||||||
`VK_KHR_xcb_surface` extensions to create surfaces on X11. If `VK_KHR_surface`
|
`VK_KHR_xcb_surface` extensions to create surfaces on X11. If `VK_KHR_surface`
|
||||||
or both `VK_KHR_xlib_surface` and `VK_KHR_xcb_surface` are not available, @ref
|
or both `VK_KHR_xlib_surface` and `VK_KHR_xcb_surface` are not available, @ref
|
||||||
|
@ -289,4 +212,13 @@ surfaces on Wayland. If any of these extensions are not available, @ref
|
||||||
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
||||||
creation will fail.
|
creation will fail.
|
||||||
|
|
||||||
|
GLFW uses the `VK_KHR_surface` and `VK_KHR_mir_surface` extensions to create
|
||||||
|
surfaces on Mir. If any of these extensions are not available, @ref
|
||||||
|
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
||||||
|
creation will fail.
|
||||||
|
|
||||||
|
GLFW does not support any extensions for window surface creation on OS X,
|
||||||
|
meaning@ref glfwGetRequiredInstanceExtensions will return an empty list and
|
||||||
|
window surface creation will fail.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
441
docs/compile.dox
441
docs/compile.dox
|
@ -10,179 +10,140 @@ build applications that use GLFW, see @ref build_guide.
|
||||||
|
|
||||||
@section compile_cmake Using CMake
|
@section compile_cmake Using CMake
|
||||||
|
|
||||||
GLFW behaves like most other libraries that use CMake so this guide mostly
|
GLFW uses [CMake](http://www.cmake.org/) to generate project files or makefiles
|
||||||
describes the standard configure, generate and compile sequence. If you are already
|
for a particular development environment. If you are on a Unix-like system such
|
||||||
familiar with this from other projects, you may want to focus on the @ref
|
as Linux or FreeBSD or have a package system like Fink, MacPorts, Cygwin or
|
||||||
compile_deps and @ref compile_options sections for GLFW-specific information.
|
Homebrew, you can simply install its CMake package. If not, you can download
|
||||||
|
installers for Windows and OS X from the [CMake website](http://www.cmake.org/).
|
||||||
|
|
||||||
GLFW uses [CMake](https://cmake.org/) to generate project files or makefiles
|
@note CMake only generates project files or makefiles. It does not compile the
|
||||||
for your chosen development environment. To compile GLFW, first generate these
|
actual GLFW library. To compile GLFW, first generate these files for your
|
||||||
files with CMake and then use them to compile the GLFW library.
|
chosen development environment and then use them to compile the actual GLFW
|
||||||
|
library.
|
||||||
If you are on Windows and macOS you can
|
|
||||||
[download CMake](https://cmake.org/download/) from their site.
|
|
||||||
|
|
||||||
If you are on a Unix-like system such as Linux, FreeBSD or Cygwin or have
|
|
||||||
a package system like Fink, MacPorts or Homebrew, you can install its CMake
|
|
||||||
package.
|
|
||||||
|
|
||||||
CMake is a complex tool and this guide will only show a few of the possible ways
|
|
||||||
to set up and compile GLFW. The CMake project has their own much more detailed
|
|
||||||
[CMake user guide](https://cmake.org/cmake/help/latest/guide/user-interaction/)
|
|
||||||
that includes everything in this guide not specific to GLFW. It may be a useful
|
|
||||||
companion to this one.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_deps Installing dependencies
|
@subsection compile_deps Dependencies
|
||||||
|
|
||||||
The C/C++ development environments in Visual Studio, Xcode and MinGW come with
|
Once you have installed CMake, make sure that all other dependencies are
|
||||||
all necessary dependencies for compiling GLFW, but on Unix-like systems like
|
available. On some platforms, GLFW needs a few additional packages to be
|
||||||
Linux and FreeBSD you will need a few extra packages.
|
installed. See the section for your chosen platform and development environment
|
||||||
|
below.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_x11 Dependencies for X11
|
@subsubsection compile_deps_msvc Dependencies for Visual C++ on Windows
|
||||||
|
|
||||||
To compile GLFW for X11, you need to have the X11 development packages
|
The Microsoft Platform SDK that is installed along with Visual C++ already
|
||||||
installed. They are not needed to build or run programs that use GLFW.
|
contains all the necessary headers, link libraries and tools except for CMake.
|
||||||
|
Move on to @ref compile_generate.
|
||||||
|
|
||||||
On Debian and derivatives like Ubuntu and Linux Mint the `xorg-dev` meta-package
|
|
||||||
pulls in the development packages for all of X11.
|
@subsubsection compile_deps_mingw Dependencies for MinGW or MinGW-w64 on Windows
|
||||||
|
|
||||||
|
Both the MinGW and the MinGW-w64 packages already contain all the necessary
|
||||||
|
headers, link libraries and tools except for CMake. Move on to @ref
|
||||||
|
compile_generate.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection compile_deps_mingw_cross Dependencies for MinGW or MinGW-w64 cross-compilation
|
||||||
|
|
||||||
|
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
||||||
|
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
||||||
|
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
||||||
|
like Ubuntu have the `mingw-w64` package for both.
|
||||||
|
|
||||||
|
GLFW has CMake toolchain files in the `CMake/` directory that allow for easy
|
||||||
|
cross-compilation of Windows binaries. To use these files you need to add a
|
||||||
|
special parameter when generating the project files or makefiles:
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
sudo apt install xorg-dev
|
cmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-file> .
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
On Fedora and derivatives like Red Hat the X11 extension packages
|
The exact toolchain file to use depends on the prefix used by the MinGW or
|
||||||
`libXcursor-devel`, `libXi-devel`, `libXinerama-devel` and `libXrandr-devel`
|
MinGW-w64 binaries on your system. You can usually see this in the /usr
|
||||||
required by GLFW pull in all its other dependencies.
|
directory. For example, both the Debian/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}
|
@code{.sh}
|
||||||
sudo dnf install libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
cmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
On FreeBSD the X11 headers are installed along the end-user X11 packages, so if
|
For more details see the article
|
||||||
you have an X server running you should have the headers as well. If not,
|
[CMake Cross Compiling](http://www.paraview.org/Wiki/CMake_Cross_Compiling) on
|
||||||
install the `xorgproto` package.
|
the CMake wiki.
|
||||||
|
|
||||||
@code{.sh}
|
Once you have this set up, move on to @ref compile_generate.
|
||||||
pkg install xorgproto
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
On Cygwin the `libXcursor-devel`, `libXi-devel`, `libXinerama-devel`,
|
|
||||||
`libXrandr-devel` and `libXrender-devel` packages in the Libs section of the GUI
|
|
||||||
installer will install all the headers and other development related files GLFW
|
|
||||||
requires for X11.
|
|
||||||
|
|
||||||
Once you have the required dependencies, move on to @ref compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_wayland Dependencies for Wayland and X11
|
@subsubsection compile_deps_xcode Dependencies for Xcode on OS X
|
||||||
|
|
||||||
To compile GLFW for both Wayland and X11, you need to have the X11, Wayland and xkbcommon
|
Xcode comes with all necessary tools except for CMake. The required headers
|
||||||
development packages installed. They are not needed to build or run programs that use
|
and libraries are included in the core OS X frameworks. Xcode can be downloaded
|
||||||
GLFW. You will also need to set the @ref GLFW_BUILD_WAYLAND CMake option in the next
|
from the Mac App Store or from the ADC Member Center.
|
||||||
step when generating build files.
|
|
||||||
|
|
||||||
On Debian and derivatives like Ubuntu and Linux Mint you will need the `libwayland-dev`,
|
Once you have Xcode installed, move on to @ref compile_generate.
|
||||||
`libxkbcommon-dev` and `wayland-protocols` packages and the `xorg-dev` meta-package.
|
|
||||||
These will pull in all other dependencies.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols xorg-dev
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
On Fedora and derivatives like Red Hat you will need the `wayland-devel`,
|
@subsubsection compile_deps_x11 Dependencies for Linux and X11
|
||||||
`libxkbcommon-devel`, `wayland-protocols-devel`, `libXcursor-devel`, `libXi-devel`,
|
|
||||||
`libXinerama-devel` and `libXrandr-devel` packages. These will pull in all other
|
|
||||||
dependencies.
|
|
||||||
|
|
||||||
@code{.sh}
|
To compile GLFW for X11, you need to have the X11 packages installed, as well as
|
||||||
sudo dnf install wayland-devel libxkbcommon-devel wayland-protocols-devel libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
the basic development tools like GCC and make. For example, on Ubuntu and other
|
||||||
@endcode
|
distributions based on Debian GNU/Linux, you need to install the `xorg-dev`
|
||||||
|
package, which pulls in all X.org header packages.
|
||||||
|
|
||||||
On FreeBSD you will need the `wayland`, `libxkbcommon` and `wayland-protocols` packages.
|
Once you have installed the necessary packages, move on to @ref
|
||||||
The X11 headers are installed along the end-user X11 packages, so if you have an X server
|
compile_generate.
|
||||||
running you should have the headers as well. If not, install the `xorgproto` package.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
pkg install wayland libxkbcommon wayland-protocols xorgproto
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once you have the required dependencies, move on to @ref compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_generate Generating build files with CMake
|
@subsection compile_generate Generating build files with CMake
|
||||||
|
|
||||||
Once you have all necessary dependencies it is time to generate the project
|
Once you have all necessary dependencies it is time to generate the project
|
||||||
files or makefiles for your development environment. CMake needs two paths for
|
files or makefiles for your development environment. CMake needs to know two
|
||||||
this:
|
paths for this: the path to the _root_ directory of the GLFW source tree (i.e.
|
||||||
|
_not_ the `src` subdirectory) and the target path for the generated files and
|
||||||
|
compiled binaries. If these are the same, it is called an in-tree build,
|
||||||
|
otherwise it is called an out-of-tree build.
|
||||||
|
|
||||||
- the path to the root directory of the GLFW source tree (not its `src`
|
One of several advantages of out-of-tree builds is that you can generate files
|
||||||
subdirectory)
|
and compile for different development environments using a single source tree.
|
||||||
- the path to the directory where the generated build files and compiled
|
|
||||||
binaries will be placed
|
|
||||||
|
|
||||||
If these are the same, it is called an in-tree build, otherwise it is called an
|
@note This section is about generating the project files or makefiles necessary
|
||||||
out-of-tree build.
|
to compile the GLFW library, not about compiling the actual library.
|
||||||
|
|
||||||
Out-of-tree builds are recommended as they avoid cluttering up the source tree.
|
|
||||||
They also allow you to have several build directories for different
|
|
||||||
configurations all using the same source tree.
|
|
||||||
|
|
||||||
A common pattern when building a single configuration is to have a build
|
|
||||||
directory named `build` in the root of the source tree.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_gui Generating with the CMake GUI
|
@subsubsection compile_generate_cli Generating files with the CMake command-line tool
|
||||||
|
|
||||||
Start the CMake GUI and set the paths to the source and build directories
|
To make an in-tree build, enter the _root_ directory of the GLFW source tree
|
||||||
described above. Then press _Configure_ and _Generate_.
|
(i.e. _not_ the `src` subdirectory) and run CMake. The current directory is
|
||||||
|
used as target path, while the path provided as an argument is used to find the
|
||||||
|
source tree.
|
||||||
|
|
||||||
If you wish change any CMake variables in the list, press _Configure_ and then
|
@code{.sh}
|
||||||
_Generate_ to have the new values take effect. The variable list will be
|
cd <glfw-root-dir>
|
||||||
populated after the first configure step.
|
cmake .
|
||||||
|
@endcode
|
||||||
|
|
||||||
By default, GLFW will use X11 on Linux and other Unix-like systems other than macOS. To
|
To make an out-of-tree build, make a directory outside of the source tree, enter
|
||||||
include support for Wayland as well, set the @ref GLFW_BUILD_WAYLAND option in the GLFW
|
it and run CMake with the (relative or absolute) path to the root of the source
|
||||||
section of the variable list, then apply the new value as described above.
|
tree as an argument.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
mkdir glfw-build
|
||||||
|
cd glfw-build
|
||||||
|
cmake <glfw-root-dir>
|
||||||
|
@endcode
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
Once you have generated the project files or makefiles for your chosen
|
||||||
development environment, move on to @ref compile_compile.
|
development environment, move on to @ref compile_compile.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_cli Generating with command-line CMake
|
@subsubsection compile_generate_gui Generating files with the CMake GUI
|
||||||
|
|
||||||
To make a build directory, pass the source and build directories to the `cmake`
|
If you are using the GUI version, choose the root of the GLFW source tree as
|
||||||
command. These can be relative or absolute paths. The build directory is
|
source location and the same directory or another, empty directory as the
|
||||||
created if it doesn't already exist.
|
destination for binaries. Choose _Configure_, change any options you wish to,
|
||||||
|
_Configure_ again to let the changes take effect and then _Generate_.
|
||||||
@code{.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}
|
|
||||||
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}
|
|
||||||
cmake -S path/to/glfw -B path/to/build -G Xcode
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
By default, GLFW will use X11 on Linux and other Unix-like systems other
|
|
||||||
than macOS. To also include support for Wayland, set the @ref GLFW_BUILD_WAYLAND CMake
|
|
||||||
option.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cmake -S path/to/glfw -B path/to/build -D GLFW_BUILD_WAYLAND=1
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
Once you have generated the project files or makefiles for your chosen
|
||||||
development environment, move on to @ref compile_compile.
|
development environment, move on to @ref compile_compile.
|
||||||
|
@ -192,39 +153,13 @@ development environment, move on to @ref compile_compile.
|
||||||
|
|
||||||
You should now have all required dependencies and the project files or makefiles
|
You should now have all required dependencies and the project files or makefiles
|
||||||
necessary to compile GLFW. Go ahead and compile the actual GLFW library with
|
necessary to compile GLFW. Go ahead and compile the actual GLFW library with
|
||||||
these files as you would with any other project.
|
these files, as you would with any other project.
|
||||||
|
|
||||||
With Visual Studio open `GLFW.sln` and use the Build menu. With Xcode open
|
Once the GLFW library is compiled, you are ready to build your applications,
|
||||||
`GLFW.xcodeproj` and use the Project menu.
|
|
||||||
|
|
||||||
With Linux, macOS and other forms of Unix, run `make`.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cd path/to/build
|
|
||||||
make
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
With MinGW, it is `mingw32-make`.
|
|
||||||
|
|
||||||
@code{.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}
|
|
||||||
cmake --build path/to/build
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This will run the platform specific build tool the directory was generated for.
|
|
||||||
|
|
||||||
Once the GLFW library is compiled you are ready to build your application,
|
|
||||||
linking it to the GLFW library. See @ref build_guide for more information.
|
linking it to the GLFW library. See @ref build_guide for more information.
|
||||||
|
|
||||||
|
|
||||||
@section compile_options CMake options
|
@subsection compile_options CMake options
|
||||||
|
|
||||||
The CMake files for GLFW provide a number of options, although not all are
|
The CMake files for GLFW provide a number of options, although not all are
|
||||||
available on all supported platforms. Some of these are de facto standards
|
available on all supported platforms. Some of these are de facto standards
|
||||||
|
@ -240,152 +175,102 @@ Finally, if you don't want to use any GUI, you can set options from the `cmake`
|
||||||
command-line with the `-D` flag.
|
command-line with the `-D` flag.
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cmake -S path/to/glfw -B path/to/build -D BUILD_SHARED_LIBS=ON
|
cmake -DBUILD_SHARED_LIBS=ON .
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options_shared Shared CMake options
|
@subsubsection compile_options_shared Shared CMake options
|
||||||
|
|
||||||
@anchor BUILD_SHARED_LIBS
|
`BUILD_SHARED_LIBS` determines whether GLFW is built as a static
|
||||||
__BUILD_SHARED_LIBS__ determines whether GLFW is built as a static library or as
|
library or as a DLL / shared library / dynamic library.
|
||||||
a DLL / shared library / dynamic library. This is disabled by default,
|
|
||||||
producing a static GLFW library. This variable has no `GLFW_` prefix because it
|
|
||||||
is defined by CMake. If you want to change the library only for GLFW when it is
|
|
||||||
part of a larger project, see @ref GLFW_LIBRARY_TYPE.
|
|
||||||
|
|
||||||
@anchor GLFW_LIBRARY_TYPE
|
`LIB_SUFFIX` affects where the GLFW shared /dynamic library is installed. If it
|
||||||
__GLFW_LIBRARY_TYPE__ allows you to override @ref BUILD_SHARED_LIBS only for
|
is empty, it is installed to `${CMAKE_INSTALL_PREFIX}/lib`. If it is set to
|
||||||
GLFW, without affecting other libraries in a larger project. When set, the
|
`64`, it is installed to `${CMAKE_INSTALL_PREFIX}/lib64`.
|
||||||
value of this option must be a valid CMake library type. Set it to `STATIC` to
|
|
||||||
build GLFW as a static library, `SHARED` to build it as a shared library
|
|
||||||
/ dynamic library / DLL, or `OBJECT` to make GLFW a CMake object library.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_EXAMPLES
|
`GLFW_BUILD_EXAMPLES` determines whether the GLFW examples are built
|
||||||
__GLFW_BUILD_EXAMPLES__ determines whether the GLFW examples are built
|
along with the library.
|
||||||
along with the library. This is enabled by default unless GLFW is being built
|
|
||||||
as a subproject of a larger CMake project.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_TESTS
|
`GLFW_BUILD_TESTS` determines whether the GLFW test programs are
|
||||||
__GLFW_BUILD_TESTS__ determines whether the GLFW test programs are
|
built along with the library.
|
||||||
built along with the library. This is enabled by default unless GLFW is being
|
|
||||||
built as a subproject of a larger CMake project.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_DOCS
|
`GLFW_BUILD_DOCS` determines whether the GLFW documentation is built along with
|
||||||
__GLFW_BUILD_DOCS__ determines whether the GLFW documentation is built along
|
the library.
|
||||||
with the library. This is enabled by default if
|
|
||||||
[Doxygen](https://www.doxygen.nl/) is found by CMake during configuration.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options_win32 Win32 specific CMake options
|
@subsubsection compile_options_osx OS X specific CMake options
|
||||||
|
|
||||||
@anchor GLFW_BUILD_WIN32
|
`GLFW_USE_CHDIR` determines whether `glfwInit` changes the current
|
||||||
__GLFW_BUILD_WIN32__ determines whether to include support for Win32 when compiling the
|
directory of bundled applications to the `Contents/Resources` directory.
|
||||||
library. This option is only available when compiling for Windows. This is enabled by
|
|
||||||
default.
|
|
||||||
|
|
||||||
@anchor USE_MSVC_RUNTIME_LIBRARY_DLL
|
`GLFW_USE_MENUBAR` determines whether the first call to
|
||||||
__USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or the
|
`glfwCreateWindow` sets up a minimal menu bar.
|
||||||
static library version of the Visual C++ runtime library. When enabled, the
|
|
||||||
DLL version of the Visual C++ library is used. This is enabled by default.
|
|
||||||
|
|
||||||
On CMake 3.15 and later you can set the standard CMake
|
`GLFW_USE_RETINA` determines whether windows will use the full resolution of
|
||||||
[CMAKE_MSVC_RUNTIME_LIBRARY](https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html)
|
Retina displays.
|
||||||
variable instead of this GLFW-specific option.
|
|
||||||
|
|
||||||
@anchor GLFW_USE_HYBRID_HPG
|
|
||||||
__GLFW_USE_HYBRID_HPG__ determines whether to export the `NvOptimusEnablement` and
|
@subsubsection compile_options_win32 Windows specific CMake options
|
||||||
|
|
||||||
|
`USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the
|
||||||
|
static library version of the Visual C++ runtime library. If set to `ON`, the
|
||||||
|
DLL version of the Visual C++ library is used. It is recommended to set this to
|
||||||
|
`ON`, as this keeps the executable smaller and benefits from security and bug
|
||||||
|
fix updates of the Visual C++ runtime.
|
||||||
|
|
||||||
|
`GLFW_USE_HYBRID_HPG` determines whether to export the `NvOptimusEnablement` and
|
||||||
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
||||||
high-performance GPU on Nvidia Optimus and AMD PowerXpress systems. These symbols
|
high-performance GPU on Nvidia Optimus and AMD PowerXpress systems. These symbols
|
||||||
need to be exported by the EXE to be detected by the driver, so the override
|
need to be exported by the EXE to be detected by the driver, so the override
|
||||||
will not work if GLFW is built as a DLL. This is disabled by default, letting
|
will not work if GLFW is built as a DLL.
|
||||||
the operating system and driver decide.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options_macos macOS specific CMake options
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_COCOA
|
|
||||||
__GLFW_BUILD_COCOA__ determines whether to include support for Cocoa when compiling the
|
|
||||||
library. This option is only available when compiling for macOS. This is enabled by
|
|
||||||
default.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options_unix Unix-like system specific CMake options
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_WAYLAND
|
|
||||||
__GLFW_BUILD_WAYLAND__ determines whether to include support for Wayland when compiling
|
|
||||||
the library. This option is only available when compiling for Linux and other Unix-like
|
|
||||||
systems other than macOS. This is disabled by default.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_X11
|
|
||||||
__GLFW_BUILD_X11__ determines whether to include support for X11 when compiling the
|
|
||||||
library. This option is only available when compiling for Linux and other Unix-like
|
|
||||||
systems other than macOS. This is enabled by default.
|
|
||||||
|
|
||||||
|
|
||||||
@section compile_mingw_cross Cross-compilation with CMake and MinGW
|
|
||||||
|
|
||||||
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
|
||||||
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
|
||||||
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
|
||||||
like Ubuntu have the `mingw-w64` package for both.
|
|
||||||
|
|
||||||
GLFW has CMake toolchain files in the `CMake` subdirectory that set up
|
|
||||||
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}
|
|
||||||
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
|
|
||||||
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}
|
|
||||||
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.
|
|
||||||
|
|
||||||
For more details see the
|
|
||||||
[CMake toolchain guide](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html).
|
|
||||||
|
|
||||||
|
|
||||||
@section compile_manual Compiling GLFW manually
|
@section compile_manual Compiling GLFW manually
|
||||||
|
|
||||||
If you wish to compile GLFW without its CMake build environment then you will have to do
|
If you wish to compile GLFW without its CMake build environment then you will
|
||||||
at least some platform-detection yourself. There are preprocessor macros for
|
have to do at least some of the platform detection yourself. GLFW needs
|
||||||
enabling support for the platforms (window systems) available. There are also optional,
|
a configuration macro to be defined in order to know what window system it's
|
||||||
platform-specific macros for various features.
|
being compiled for and also has optional, platform-specific ones for various
|
||||||
|
features.
|
||||||
|
|
||||||
When building, GLFW will expect the necessary configuration macros to be defined
|
When building with CMake, the `glfw_config.h` configuration header is generated
|
||||||
on the command-line. The GLFW CMake files set these as private compile
|
based on the current platform and CMake options. The GLFW CMake environment
|
||||||
definitions on the GLFW target but if you compile the GLFW sources manually you
|
defines `_GLFW_USE_CONFIG_H`, which causes this header to be included by
|
||||||
will need to define them yourself.
|
`internal.h`. Without this macro, GLFW will expect the necessary configuration
|
||||||
|
macros to be defined on the command-line.
|
||||||
|
|
||||||
The window system is used to create windows, handle input, monitors, gamma ramps and
|
The window creation API is used to create windows, handle input, monitors, gamma
|
||||||
clipboard. The options are:
|
ramps and clipboard. The options are:
|
||||||
|
|
||||||
- @b _GLFW_COCOA to use the Cocoa frameworks
|
- `_GLFW_COCOA` to use the Cocoa frameworks
|
||||||
- @b _GLFW_WIN32 to use the Win32 API
|
- `_GLFW_WIN32` to use the Win32 API
|
||||||
- @b _GLFW_X11 to use the X Window System
|
- `_GLFW_X11` to use the X Window System
|
||||||
- @b _GLFW_WAYLAND to use the Wayland API (incomplete)
|
- `_GLFW_WAYLAND` to use the Wayland API (experimental and incomplete)
|
||||||
|
- `_GLFW_MIR` to use the Mir API (experimental and incomplete)
|
||||||
The @b _GLFW_WAYLAND and @b _GLFW_X11 macros may be combined and produces a library that
|
|
||||||
attempts to detect the appropriate platform at initialization.
|
|
||||||
|
|
||||||
If you are building GLFW as a shared library / dynamic library / DLL then you
|
If you are building GLFW as a shared library / dynamic library / DLL then you
|
||||||
must also define @b _GLFW_BUILD_DLL. Otherwise, you must not define it.
|
must also define `_GLFW_BUILD_DLL`. Otherwise, you must not define it.
|
||||||
|
|
||||||
If you are using a custom name for the Vulkan, EGL, GLX, OSMesa, OpenGL, GLESv1
|
For the EGL context creation API, the following options are available:
|
||||||
or GLESv2 library, you can override the default names by defining those you need
|
|
||||||
of @b _GLFW_VULKAN_LIBRARY, @b _GLFW_EGL_LIBRARY, @b _GLFW_GLX_LIBRARY, @b
|
- `_GLFW_USE_EGLPLATFORM_H` to use `EGL/eglplatform.h` for native handle
|
||||||
_GLFW_OSMESA_LIBRARY, @b _GLFW_OPENGL_LIBRARY, @b _GLFW_GLESV1_LIBRARY and @b
|
definitions (fallback)
|
||||||
_GLFW_GLESV2_LIBRARY. Otherwise, GLFW will use the built-in default names.
|
|
||||||
|
If you are using the X11 window creation API, support for the following X11
|
||||||
|
extensions can be enabled:
|
||||||
|
|
||||||
|
- `_GLFW_HAS_XF86VM` to use Xxf86vm as a fallback when RandR gamma is broken
|
||||||
|
(recommended)
|
||||||
|
|
||||||
|
If you are using the Cocoa window creation API, the following options are
|
||||||
|
available:
|
||||||
|
|
||||||
|
- `_GLFW_USE_CHDIR` to `chdir` to the `Resources` subdirectory of the
|
||||||
|
application bundle during @ref glfwInit (recommended)
|
||||||
|
- `_GLFW_USE_MENUBAR` to create and populate the menu bar when the first window
|
||||||
|
is created (recommended)
|
||||||
|
- `_GLFW_USE_RETINA` to have windows use the full resolution of Retina displays
|
||||||
|
(recommended)
|
||||||
|
|
||||||
@note None of the @ref build_macros may be defined during the compilation of
|
@note None of the @ref build_macros may be defined during the compilation of
|
||||||
GLFW. If you define any of these in your build files, make sure they are not
|
GLFW. If you define any of these in your build files, make sure they are not
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide introduces the OpenGL and OpenGL ES context related functions of
|
This guide introduces the OpenGL and OpenGL ES context related functions of
|
||||||
GLFW. For details on a specific function in this category, see the @ref
|
GLFW. For details on a specific function, see the
|
||||||
context. There are also guides for the other areas of the GLFW API.
|
[reference documentation](@ref context). There are also guides for the other
|
||||||
|
areas of the GLFW API.
|
||||||
|
|
||||||
- @ref intro_guide
|
- @ref intro_guide
|
||||||
- @ref window_guide
|
- @ref window_guide
|
||||||
|
@ -30,8 +31,8 @@ the `glfwinfo` test program.
|
||||||
|
|
||||||
@note Vulkan does not have a context and the Vulkan instance is created via the
|
@note Vulkan does not have a context and the Vulkan instance is created via the
|
||||||
Vulkan API itself. If you will be using Vulkan to render to a window, disable
|
Vulkan API itself. If you will be using Vulkan to render to a window, disable
|
||||||
context creation by setting the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint)
|
context creation by setting the [GLFW_CLIENT_API](@ref window_hints_ctx) hint to
|
||||||
hint to `GLFW_NO_API`. For more information, see the @ref vulkan_guide.
|
`GLFW_NO_API`. For more information, see the @ref vulkan_guide.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_hints Context creation hints
|
@subsection context_hints Context creation hints
|
||||||
|
@ -56,19 +57,19 @@ platforms where it is possible to choose which types of objects are shared, GLFW
|
||||||
requests that all types are shared.
|
requests that all types are shared.
|
||||||
|
|
||||||
See the relevant chapter of the [OpenGL](https://www.opengl.org/registry/) or
|
See the relevant chapter of the [OpenGL](https://www.opengl.org/registry/) or
|
||||||
[OpenGL ES](https://www.khronos.org/opengles/) reference documents for more
|
[OpenGL ES](http://www.khronos.org/opengles/) reference documents for more
|
||||||
information. The name and number of this chapter unfortunately varies between
|
information. The name and number of this chapter unfortunately varies between
|
||||||
versions and APIs, but has at times been named _Shared Objects and Multiple
|
versions and APIs, but has at times been named _Shared Objects and Multiple
|
||||||
Contexts_.
|
Contexts_.
|
||||||
|
|
||||||
GLFW comes with a bare-bones object sharing example program called `sharing`.
|
GLFW comes with a simple object sharing test program called `sharing`.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_offscreen Offscreen contexts
|
@subsection context_offscreen Offscreen contexts
|
||||||
|
|
||||||
GLFW doesn't support creating contexts without an associated window. However,
|
GLFW doesn't support creating contexts without an associated window. However,
|
||||||
contexts with hidden windows can be created with the
|
contexts with hidden windows can be created with the
|
||||||
[GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint.
|
[GLFW_VISIBLE](@ref window_hints_wnd) window hint.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
||||||
|
@ -84,12 +85,17 @@ objects are recommended for rendering with such contexts.
|
||||||
You should still [process events](@ref events) as long as you have at least one
|
You should still [process events](@ref events) as long as you have at least one
|
||||||
window, even if none of them are visible.
|
window, even if none of them are visible.
|
||||||
|
|
||||||
|
__OS X:__ The first time a window is created the menu bar is populated with
|
||||||
|
common commands like Hide, Quit and About. This is not desirable for example
|
||||||
|
when writing a command-line only application. The menu bar setup can be
|
||||||
|
disabled with a [compile-time option](@ref compile_options_osx).
|
||||||
|
|
||||||
|
|
||||||
@subsection context_less Windows without contexts
|
@subsection context_less Windows without contexts
|
||||||
|
|
||||||
You can disable context creation by setting the
|
You can disable context creation by setting the
|
||||||
[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_NO_API`. Windows
|
[GLFW_CLIENT_API](@ref window_hints_ctx) hint to `GLFW_NO_API`. Windows without
|
||||||
without contexts must not be passed to @ref glfwMakeContextCurrent or @ref
|
contexts must not be passed to @ref glfwMakeContextCurrent or @ref
|
||||||
glfwSwapBuffers.
|
glfwSwapBuffers.
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,9 +105,6 @@ Before you can make OpenGL or OpenGL ES calls, you need to have a current
|
||||||
context of the correct type. A context can only be current for a single thread
|
context of the correct type. A context can only be current for a single thread
|
||||||
at a time, and a thread can only have a single context current at a time.
|
at a time, and a thread can only have a single context current 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.
|
|
||||||
|
|
||||||
The context of a window is made current with @ref glfwMakeContextCurrent.
|
The context of a window is made current with @ref glfwMakeContextCurrent.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -125,7 +128,8 @@ error.
|
||||||
|
|
||||||
@section context_swap Buffer swapping
|
@section context_swap Buffer swapping
|
||||||
|
|
||||||
See @ref buffer_swap in the window guide.
|
Buffer swapping is part of the window and framebuffer, not the context. See
|
||||||
|
@ref buffer_swap.
|
||||||
|
|
||||||
|
|
||||||
@section context_glext OpenGL and OpenGL ES extensions
|
@section context_glext OpenGL and OpenGL ES extensions
|
||||||
|
@ -138,16 +142,16 @@ as extensions until they become obsolete.
|
||||||
|
|
||||||
An extension is defined by:
|
An extension is defined by:
|
||||||
|
|
||||||
- An extension name (e.g. `GL_ARB_gl_spirv`)
|
- An extension name (e.g. `GL_ARB_debug_output`)
|
||||||
- New OpenGL tokens (e.g. `GL_SPIR_V_BINARY_ARB`)
|
- New OpenGL tokens (e.g. `GL_DEBUG_SEVERITY_HIGH_ARB`)
|
||||||
- New OpenGL functions (e.g. `glSpecializeShaderARB`)
|
- New OpenGL functions (e.g. `glGetDebugMessageLogARB`)
|
||||||
|
|
||||||
Note the `ARB` affix, which stands for Architecture Review Board and is used
|
Note the `ARB` affix, which stands for Architecture Review Board and is used
|
||||||
for official extensions. The extension above was created by the ARB, but there
|
for official extensions. The extension above was created by the ARB, but there
|
||||||
are many different affixes, like `NV` for Nvidia and `AMD` for, well, AMD. Any
|
are many different affixes, like `NV` for Nvidia and `AMD` for, well, AMD. Any
|
||||||
group may also use the generic `EXT` affix. Lists of extensions, together with
|
group may also use the generic `EXT` affix. Lists of extensions, together with
|
||||||
their specifications, can be found at the
|
their specifications, can be found at the
|
||||||
[OpenGL Registry](https://www.opengl.org/registry/) and
|
[OpenGL Registry](http://www.opengl.org/registry/) and
|
||||||
[OpenGL ES Registry](https://www.khronos.org/registry/gles/).
|
[OpenGL ES Registry](https://www.khronos.org/registry/gles/).
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,7 +161,7 @@ An extension loader library is the easiest and best way to access both OpenGL an
|
||||||
OpenGL ES extensions and modern versions of the core OpenGL or OpenGL ES APIs.
|
OpenGL ES extensions and modern versions of the core OpenGL or OpenGL ES APIs.
|
||||||
They will take care of all the details of declaring and loading everything you
|
They will take care of all the details of declaring and loading everything you
|
||||||
need. One such library is [glad](https://github.com/Dav1dde/glad) and there are
|
need. One such library is [glad](https://github.com/Dav1dde/glad) and there are
|
||||||
several others.
|
several others.
|
||||||
|
|
||||||
The following example will use glad but all extension loader libraries work
|
The following example will use glad but all extension loader libraries work
|
||||||
similarly.
|
similarly.
|
||||||
|
@ -189,7 +193,7 @@ it suppresses the development environment's OpenGL or OpenGL ES header.
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Finally, you need to initialize glad once you have a suitable current context.
|
Finally you need to initialize glad once you have a suitable current context.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
window = glfwCreateWindow(640, 480, "My Window", NULL, NULL);
|
window = glfwCreateWindow(640, 480, "My Window", NULL, NULL);
|
||||||
|
@ -205,7 +209,7 @@ gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
|
|
||||||
Once glad has been loaded, you have access to all OpenGL core and extension
|
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
|
functions supported by both the context you created and the glad loader you
|
||||||
generated. After that, you are ready to start rendering.
|
generated and you are ready to start rendering.
|
||||||
|
|
||||||
You can specify a minimum required OpenGL or OpenGL ES version with
|
You can specify a minimum required OpenGL or OpenGL ES version with
|
||||||
[context hints](@ref window_hints_ctx). If your needs are more complex, you can
|
[context hints](@ref window_hints_ctx). If your needs are more complex, you can
|
||||||
|
@ -225,9 +229,9 @@ To check whether a specific extension is supported, use the `GLAD_GL_xxx`
|
||||||
booleans.
|
booleans.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
if (GLAD_GL_ARB_gl_spirv)
|
if (GLAD_GL_ARB_debug_output)
|
||||||
{
|
{
|
||||||
// Use GL_ARB_gl_spirv
|
// Use GL_ARB_debug_output
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
@ -251,7 +255,7 @@ of OpenGL ES extensions is identical except for the name of the extension header
|
||||||
|
|
||||||
The `glext.h` extension header is a continually updated file that defines the
|
The `glext.h` extension header is a continually updated file that defines the
|
||||||
interfaces for all OpenGL extensions. The latest version of this can always be
|
interfaces for all OpenGL extensions. The latest version of this can always be
|
||||||
found at the [OpenGL Registry](https://www.opengl.org/registry/). There are also
|
found at the [OpenGL Registry](http://www.opengl.org/registry/). There are also
|
||||||
extension headers for the various versions of OpenGL ES at the
|
extension headers for the various versions of OpenGL ES at the
|
||||||
[OpenGL ES Registry](https://www.khronos.org/registry/gles/). It it strongly
|
[OpenGL ES Registry](https://www.khronos.org/registry/gles/). It it strongly
|
||||||
recommended that you use your own copy of the extension header, as the one
|
recommended that you use your own copy of the extension header, as the one
|
||||||
|
@ -259,12 +263,12 @@ included in your development environment may be several years out of date and
|
||||||
may not include the extensions you wish to use.
|
may not include the extensions you wish to use.
|
||||||
|
|
||||||
The header defines function pointer types for all functions of all extensions it
|
The header defines function pointer types for all functions of all extensions it
|
||||||
supports. These have names like `PFNGLSPECIALIZESHADERARBPROC` (for
|
supports. These have names like `PFNGLGETDEBUGMESSAGELOGARBPROC` (for
|
||||||
`glSpecializeShaderARB`), i.e. the name is made uppercase and `PFN` (pointer
|
`glGetDebugMessageLogARB`), i.e. the name is made uppercase and `PFN` (pointer
|
||||||
to function) and `PROC` (procedure) are added to the ends.
|
to function) and `PROC` (procedure) are added to the ends.
|
||||||
|
|
||||||
To include the extension header, define @ref GLFW_INCLUDE_GLEXT before including
|
To include the extension header, define [GLFW_INCLUDE_GLEXT](@ref build_macros)
|
||||||
the GLFW header.
|
before including the GLFW header.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#define GLFW_INCLUDE_GLEXT
|
#define GLFW_INCLUDE_GLEXT
|
||||||
|
@ -280,7 +284,7 @@ is necessary to check at run-time whether the context supports the extension.
|
||||||
This is done with @ref glfwExtensionSupported.
|
This is done with @ref glfwExtensionSupported.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
if (glfwExtensionSupported("GL_ARB_gl_spirv"))
|
if (glfwExtensionSupported("GL_ARB_debug_output"))
|
||||||
{
|
{
|
||||||
// The extension is supported by the current context
|
// The extension is supported by the current context
|
||||||
}
|
}
|
||||||
|
@ -299,7 +303,7 @@ your operating system, making it necessary to fetch them at run time. You can
|
||||||
retrieve pointers to these functions with @ref glfwGetProcAddress.
|
retrieve pointers to these functions with @ref glfwGetProcAddress.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB = glfwGetProcAddress("glSpecializeShaderARB");
|
PFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog = glfwGetProcAddress("glGetDebugMessageLogARB");
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
In general, you should avoid giving the function pointer variables the (exact)
|
In general, you should avoid giving the function pointer variables the (exact)
|
||||||
|
@ -313,28 +317,28 @@ when used together.
|
||||||
#define GLFW_INCLUDE_GLEXT
|
#define GLFW_INCLUDE_GLEXT
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#define glSpecializeShaderARB pfnSpecializeShaderARB
|
#define glGetDebugMessageLogARB pfnGetDebugMessageLog
|
||||||
PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB;
|
PFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog;
|
||||||
|
|
||||||
// Flag indicating whether the extension is supported
|
// Flag indicating whether the extension is supported
|
||||||
int has_ARB_gl_spirv = 0;
|
int has_ARB_debug_output = 0;
|
||||||
|
|
||||||
void load_extensions(void)
|
void load_extensions(void)
|
||||||
{
|
{
|
||||||
if (glfwExtensionSupported("GL_ARB_gl_spirv"))
|
if (glfwExtensionSupported("GL_ARB_debug_output"))
|
||||||
{
|
{
|
||||||
pfnSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)
|
pfnGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGARBPROC)
|
||||||
glfwGetProcAddress("glSpecializeShaderARB");
|
glfwGetProcAddress("glGetDebugMessageLogARB");
|
||||||
has_ARB_gl_spirv = 1;
|
has_ARB_debug_output = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void some_function(void)
|
void some_function(void)
|
||||||
{
|
{
|
||||||
if (has_ARB_gl_spirv)
|
if (has_ARB_debug_output)
|
||||||
{
|
{
|
||||||
// Now the extension function can be called as usual
|
// Now the extension function can be called as usual
|
||||||
glSpecializeShaderARB(...);
|
glGetDebugMessageLogARB(...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"mappings": "AA8EA,2GAA4G,CAC3G,UAAU,CAAC,IAAI,CACf,WAAW,CAAC,IAAI,CAGjB,wBAAyB,CACxB,YAAY,CAAC,2CAAsD,CAGpE,4HAA6H,CAC5H,YAAY,CAAC,wCAAuD,CAGrE,wIAAyI,CACxI,YAAY,CAAC,wCAAuD,CAGrE,kBAAmB,CAClB,UAAU,CA9EgB,IAAa,CA+EvC,WAAW,CAAC,IAAI,CAGjB,sBAAuB,CACtB,KAAK,CAzFe,OAAa,CA0FjC,WAAW,CAAC,IAAI,CAGjB,4UAA6U,CAC5U,UAAU,CAAC,IAAI,CAGhB,kJAAmJ,CAClJ,MAAM,CAAC,IAAI,CAGZ,wHAAyH,CACxH,WAAW,CAAC,IAAI,CAGjB,qBAAsB,CACrB,UAAU,CAAC,IAAI,CAGhB,2LAA4L,CAC3L,OAAO,CAAC,CAAC,CAGV,wCAAyC,CACxC,OAAO,CAAC,IAAI,CAGb,iMAAkM,CACjM,UAAU,CApGW,OAA+B,CAuGrD,IAAK,CACJ,KAAK,CA1He,OAAa,CA6HlC,SAAU,CACN,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,aAAa,CAGzB,qDAAsD,CACrD,KAAK,CApHU,OAAa,CAqH5B,aAAa,CAAC,IAAI,CAGnB,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,SAAS,CAAC,IAAI,CAGf,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,aAAa,CAAC,CAAC,CACf,SAAS,CAAC,IAAI,CAGf,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,aAAa,CAAC,CAAC,CACf,SAAS,CAAC,IAAI,CAGf,WAAY,CACX,SAAS,CAAC,IAAI,CACd,UAAU,CAAC,IAAI,CACf,SAAS,CAAC,KAAK,CACf,OAAO,CAAC,MAAM,CACd,MAAM,CAAC,MAAM,CAEb,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,SAAS,CAAE,IAAI,CACf,eAAe,CAAE,UAAU,CAC3B,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,OAAO,CAGvB,SAAU,CACT,WAAW,CAAC,IAAI,CAChB,aAAa,CAAC,IAAI,CAClB,KAAK,CApKqB,IAAa,CAqKvC,SAAS,CAAC,KAAK,CACf,UAAU,CAAC,yDAAyD,CAGrE,WAAY,CACX,eAAe,CAAC,IAAI,CACpB,MAAM,CAAC,UAAU,CACjB,KAAK,CAAC,KAAK,CAGZ,wBAAyB,CACxB,KAAK,CAAC,IAAI,CAGX,mCAAoC,CACnC,WAAW,CAAC,IAAI,CAChB,WAAW,CAAC,GAAG,CACf,OAAO,CAAC,KAAK,CACb,KAAK,CAvLqB,IAAa,CA0LxC,WAAY,CACX,YAAY,CAAE,CAAC,CAGhB,6CAA8C,CAC7C,UAAU,CAAC,SAAS,CAGrB,kBAAmB,CAClB,KAAK,CAnMqB,IAAa,CAsMxC,cAAe,CACd,UAAU,CAAC,MAAM,CACjB,OAAO,CAAC,GAAG,CACX,UAAU,CAAC,GAAG,CAGf,IAAK,CACJ,UAAU,CA7MgB,IAAa,CAgNxC,SAAU,CACT,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,SAAS,CAAC,IAAI,CAGf,UAAW,CACV,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,SAAS,CAAC,IAAI,CAGf,SAAU,CACT,OAAO,CAAC,IAAI,CAGb,kBAAmB,CAClB,WAAW,CAAC,IAAI,CAChB,WAAW,CAAC,IAAI,CAGjB,UAAW,CACV,UAAU,CAAC,IAAI,CACf,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,SAAS,CAAE,IAAI,CACf,eAAe,CAAE,UAAU,CAC3B,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,OAAO,CAGvB,kEAAmE,CAClE,KAAK,CApOgB,OAA+B,CAuOrD,+BAAgC,CAC/B,KAAK,CA1Pe,OAAa,CA6PlC,qCAAsC,CACrC,KAAK,CA1NoB,IAAsB,CA6NhD,wBAA2B,CAC1B,MAAM,CAAE,UAAU,CAGnB,SAAU,CACT,UAAU,CAAC,KAAK,CAGjB,uBAAwB,CACvB,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,OAAO,CAAC,MAAM,CACd,UAAU,CAAC,SAA8B,CAG1C,sDAAuD,CACtD,UAAU,CAAC,iDAAoF,CAC/F,UAAU,CAAC,mBAAuC,CAClD,WAAW,CAAC,kBAAgD,CAC5D,UAAU,CAAC,IAAI,CACf,KAAK,CAlPa,IAAe,CAqPlC,kBAAmB,CAClB,KAAK,CArPoB,IAAsB,CAsP/C,OAAO,CAAC,IAAI,CACZ,aAAa,CAAC,GAAG,CACjB,gBAAgB,CAAC,OAAiC,CAGnD,OAAQ,CACP,KAAK,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAGV,oCAAoC,CACnC,OAAQ,CACP,KAAK,CAAC,IAAI,CACV,KAAK,CAAC,OAAO,CACb,MAAM,CAAC,CAAC,EAIV,UAAW,CACV,SAAS,CAAC,MAAM,CAGjB,UAAW,CACV,YAAY,CAAC,KAAK,CAGnB,UAAW,CACV,SAAS,CAAC,GAAG,CACb,YAAY,CAAC,CAAC,CACd,eAAe,CAAC,IAAI,CAIjB,mCAAqB,CACjB,WAAW,CAAC,KAAK,CAIzB,mCAAoC,CACnC,UAAU,CAAC,oDAAgF,CAC3F,UAAU,CAAC,sBAAqC,CAChD,WAAW,CAAC,cAA8C,CAC1D,KAAK,CArTU,OAAa,CAsT5B,MAAM,CAAC,iBAAgC,CACvC,aAAa,CAAC,GAAG,CAGlB,UAAW,CACV,KAAK,CA9RkB,OAAgC,CAiSxD,aAAc,CACb,MAAM,CAAC,cAA+B,CACtC,sBAAsB,CAAC,GAAG,CAC1B,uBAAuB,CAAC,GAAG,CAC3B,aAAa,CAAC,IAAI,CAGnB,aAAc,CACb,MAAM,CAAC,cAA+B,CACtC,0BAA0B,CAAC,GAAG,CAC9B,yBAAyB,CAAC,GAAG,CAC7B,UAAU,CAAC,IAAI,CAGhB,kCAAmC,CAClC,eAAe,CAAC,OAAO,CACvB,cAAc,CAAC,CAAC,CAChB,MAAM,CAAC,cAA+B,CACtC,aAAa,CAAC,GAAG,CAGlB,+HAAgI,CAC/H,KAAK,CA/ToB,IAAsB,CAgU/C,eAAe,CAAC,IAAI,CAGrB,aAAc,CACb,eAAe,CAAC,OAAO,CACvB,cAAc,CAAC,CAAC,CAChB,MAAM,CAAC,cAA+B,CACtC,aAAa,CAAC,GAAG,CAGlB,gBAAiB,CAChB,MAAM,CAAC,GAAG,CACV,UAAU,CAAC,gEAAiH,CAG7H,mCAAoC,CAvTnC,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAwT3D,uBAAwB,CA3TvB,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CA4T3D,oBAAqB,CA/TpB,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAgU3D,eAAgB,CAnUf,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAoU3D,gGAAiG,CAChG,aAAa,CAAC,GAAG,CACjB,OAAO,CAAC,GAAG,CACX,WAAW,CAAC,cAAwB,CACpC,MAAM,CAAC,KAAK,CAGb,iRAAkR,CACjR,KAAK,CAAC,OAAO,CAGd,QAAS,CACR,WAAW,CAAC,OAAO,CAGpB,yBAA0B,CACzB,UAAU,CAAC,OAAa,CACxB,aAAa,CAAC,GAAG,CACjB,MAAM,CAAC,IAAI,CACX,OAAO,CAAC,GAAG,CACX,QAAQ,CAAC,IAAI,CACb,WAAW,CAAC,cAAuB,CACnC,MAAM,CAAC,KAAK,CAGb,8CAA+C,CAC9C,KAAK,CA7Ze,OAAa,CAgalC,8BAA+B,CAC9B,KAAK,CAAC,OAAiB,CAGxB,qBAAsB,CACrB,KAAK,CAAC,OAAgB,CAGvB,8CAA+C,CAC9C,KAAK,CAAC,OAA+B,CACrC,WAAW,CAAC,IAAI,CAGjB,kBAAmB,CAClB,KAAK,CAAC,OAAiB,CAGxB,IAAK,CACJ,OAAO,CAAC,IAAI,CACZ,aAAa,CAAC,GAAG",
|
|
||||||
"sources": ["extra.scss"],
|
|
||||||
"names": [],
|
|
||||||
"file": "extra.css"
|
|
||||||
}
|
|
370
docs/extra.less
Normal file
370
docs/extra.less
Normal file
|
@ -0,0 +1,370 @@
|
||||||
|
// NOTE: Please use this file to perform modifications on default style sheets.
|
||||||
|
//
|
||||||
|
// You need to install a few Ruby gems to generate extra.css from this file:
|
||||||
|
// gem install less therubyracer
|
||||||
|
//
|
||||||
|
// Run this command to regenerate extra.css after you're finished with changes:
|
||||||
|
// lessc --compress extra.less > extra.css
|
||||||
|
//
|
||||||
|
// Alternatively you can use online services to regenerate extra.css.
|
||||||
|
|
||||||
|
|
||||||
|
// Default text color for page contents
|
||||||
|
@default-text-color: hsl(0,0%,30%);
|
||||||
|
|
||||||
|
// Page header, footer, table rows, inline codes and definition lists
|
||||||
|
@header-footer-background-color: hsl(0,0%,95%);
|
||||||
|
|
||||||
|
// Page header, footer links and navigation bar background
|
||||||
|
@header-footer-link-color: hsl(0,0%,40%);
|
||||||
|
|
||||||
|
// Doxygen navigation bar links
|
||||||
|
@navbar-link-color: @header-footer-background-color;
|
||||||
|
|
||||||
|
// Page content background color
|
||||||
|
@content-background-color: hsl(0,0%,100%);
|
||||||
|
|
||||||
|
// Bold, italic, h1, h2, ... and table of contents
|
||||||
|
@heading-color: hsl(0,0%,10%);
|
||||||
|
|
||||||
|
// Function, enum and macro definition separator
|
||||||
|
@def-separator-color: @header-footer-background-color;
|
||||||
|
|
||||||
|
// Base color hue
|
||||||
|
@base-hue: 24;
|
||||||
|
|
||||||
|
// Default color used for links
|
||||||
|
@default-link-color: hsl(@base-hue,100%,50%);
|
||||||
|
|
||||||
|
// Doxygen navigation bar active tab
|
||||||
|
@tab-text-color: hsl(0,0%,100%);
|
||||||
|
@tab-background-color1: @default-link-color;
|
||||||
|
@tab-background-color2: lighten(spin(@tab-background-color1, 10), 10%);
|
||||||
|
|
||||||
|
// Table borders
|
||||||
|
@default-border-color: @default-link-color;
|
||||||
|
|
||||||
|
// Table header
|
||||||
|
@table-text-color: @tab-text-color;
|
||||||
|
@table-background-color1: @tab-background-color1;
|
||||||
|
@table-background-color2: @tab-background-color2;
|
||||||
|
|
||||||
|
// Table of contents, data structure index and prototypes
|
||||||
|
@toc-background-color1: hsl(0,0%,90%);
|
||||||
|
@toc-background-color2: lighten(@toc-background-color1, 5%);
|
||||||
|
|
||||||
|
// Function prototype parameters color
|
||||||
|
@prototype-param-color: darken(@default-link-color, 25%);
|
||||||
|
|
||||||
|
// Message box color: note, pre, post and invariant
|
||||||
|
@box-note-color: hsl(103,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: warning and attention
|
||||||
|
@box-warning-color: hsl(34,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: deprecated and bug
|
||||||
|
@box-bug-color: hsl(333,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: todo and test
|
||||||
|
@box-todo-color: hsl(200,80%,85%);
|
||||||
|
|
||||||
|
// Message box helper function
|
||||||
|
.message-box(@base-color) {
|
||||||
|
background:linear-gradient(to bottom,lighten(@base-color, 5%) 0%,@base-color 100%);
|
||||||
|
box-shadow:inset 0 0 32px darken(@base-color, 5%);
|
||||||
|
color:darken(@base-color, 67%);
|
||||||
|
border:2px solid desaturate(darken(@base-color, 10%), 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#navrow1,#navrow2,#navrow3,#navrow4,.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code {
|
||||||
|
background:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,hr,.memSeparator {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a,.reflist dt a.el,.levels span,.directory .levels span {
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.memdoc,dl.reflist dd {
|
||||||
|
box-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code {
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-path,.directory .levels,span.lineno {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code {
|
||||||
|
background:@header-footer-background-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color:@default-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
|
||||||
|
color:@heading-color;
|
||||||
|
border-bottom:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
font-size:180%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
margin-bottom:0;
|
||||||
|
font-size:140%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
margin-bottom:0;
|
||||||
|
font-size:110%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwheader {
|
||||||
|
font-size:16px;
|
||||||
|
height:64px;
|
||||||
|
max-width:920px;
|
||||||
|
min-width:800px;
|
||||||
|
padding:0 32px;
|
||||||
|
margin:0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome {
|
||||||
|
line-height:64px;
|
||||||
|
padding-right:48px;
|
||||||
|
color:@header-footer-link-color;
|
||||||
|
font-size:2.5em;
|
||||||
|
background:url("http://www.glfw.org/css/arrow.png") no-repeat right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwnavbar {
|
||||||
|
list-style-type:none;
|
||||||
|
margin:0 auto;
|
||||||
|
float:right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome,.glfwnavbar li {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwnavbar a,.glfwnavbar a:visited {
|
||||||
|
line-height:64px;
|
||||||
|
margin-left:2em;
|
||||||
|
display:block;
|
||||||
|
color:@header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
|
||||||
|
transition:.35s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#titlearea,.footer {
|
||||||
|
color:@header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
address.footer {
|
||||||
|
text-align:center;
|
||||||
|
padding:2em;
|
||||||
|
margin-top:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top {
|
||||||
|
background:@header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#navrow1,#navrow2,#navrow3,#navrow4 {
|
||||||
|
max-width:920px;
|
||||||
|
min-width:800px;
|
||||||
|
margin:0 auto;
|
||||||
|
font-size:13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablist {
|
||||||
|
height:36px;
|
||||||
|
display:block;
|
||||||
|
position:relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a {
|
||||||
|
color:@navbar-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablist li.current a {
|
||||||
|
background:linear-gradient(to bottom,@tab-background-color2 0%,@tab-background-color1 100%);
|
||||||
|
box-shadow:inset 0 0 32px @tab-background-color1;
|
||||||
|
text-shadow:0 -1px 1px darken(@tab-background-color1, 15%);
|
||||||
|
color:@tab-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contents {
|
||||||
|
min-height:590px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.contents,div.header {
|
||||||
|
max-width:920px;
|
||||||
|
margin:0 auto;
|
||||||
|
padding:0 32px;
|
||||||
|
background:@content-background-color none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.doxtable th,dl.reflist dt {
|
||||||
|
background:linear-gradient(to bottom,@table-background-color2 0%,@table-background-color1 100%);
|
||||||
|
box-shadow:inset 0 0 32px @table-background-color1;
|
||||||
|
text-shadow:0 -1px 1px darken(@table-background-color1, 15%);
|
||||||
|
color:@table-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dt a.el {
|
||||||
|
color:@default-link-color;
|
||||||
|
padding:.2em;
|
||||||
|
border-radius:4px;
|
||||||
|
background-color:lighten(@default-link-color, 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc {
|
||||||
|
float:none;
|
||||||
|
width:auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc h3 {
|
||||||
|
font-size:1.17em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc ul {
|
||||||
|
padding-left:1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc li {
|
||||||
|
font-size:1em;
|
||||||
|
padding-left:0;
|
||||||
|
list-style-type:disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc,.memproto,div.qindex,div.ah {
|
||||||
|
background:linear-gradient(to bottom,@toc-background-color2 0%,@toc-background-color1 100%);
|
||||||
|
box-shadow:inset 0 0 32px @toc-background-color1;
|
||||||
|
text-shadow:0 1px 1px lighten(@toc-background-color2, 10%);
|
||||||
|
color:@heading-color;
|
||||||
|
border:2px solid @toc-background-color1;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramname {
|
||||||
|
color:@prototype-param-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dt {
|
||||||
|
border:2px solid @default-border-color;
|
||||||
|
border-top-left-radius:4px;
|
||||||
|
border-top-right-radius:4px;
|
||||||
|
border-bottom:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dd {
|
||||||
|
border:2px solid @default-border-color;
|
||||||
|
border-bottom-right-radius:4px;
|
||||||
|
border-bottom-left-radius:4px;
|
||||||
|
border-top:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.doxtable {
|
||||||
|
border-collapse:inherit;
|
||||||
|
border-spacing:0;
|
||||||
|
border:2px solid @default-border-color;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,.tablist a:hover,span.lineno a:hover {
|
||||||
|
color:@default-link-color;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.directory {
|
||||||
|
border-collapse:inherit;
|
||||||
|
border-spacing:0;
|
||||||
|
border:2px solid @default-border-color;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr,.memSeparator {
|
||||||
|
height:2px;
|
||||||
|
background:linear-gradient(to right,@def-separator-color 0%,darken(@def-separator-color, 10%) 50%,@def-separator-color 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.note,dl.pre,dl.post,dl.invariant {
|
||||||
|
.message-box(@box-note-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.warning,dl.attention {
|
||||||
|
.message-box(@box-warning-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.deprecated,dl.bug {
|
||||||
|
.message-box(@box-bug-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.todo,dl.test {
|
||||||
|
.message-box(@box-todo-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {
|
||||||
|
border-radius:4px;
|
||||||
|
padding:1em;
|
||||||
|
text-shadow:0 1px 1px hsl(0,0%,100%);
|
||||||
|
margin:1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited {
|
||||||
|
color:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.line {
|
||||||
|
line-height:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.fragment,pre.fragment {
|
||||||
|
background:hsl(0,0%,95%);
|
||||||
|
border-radius:4px;
|
||||||
|
border:none;
|
||||||
|
padding:1em;
|
||||||
|
overflow:auto;
|
||||||
|
border-left:4px solid hsl(0,0%,80%);
|
||||||
|
margin:1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lineno a,.lineno a:visited,.line,pre.fragment {
|
||||||
|
color:@default-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.preprocessor,span.comment {
|
||||||
|
color:hsl(193,100%,30%);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.code,a.code:visited {
|
||||||
|
color:hsl(18,100%,45%);
|
||||||
|
}
|
||||||
|
|
||||||
|
span.keyword,span.keywordtype,span.keywordflow {
|
||||||
|
color:darken(@default-text-color, 5%);
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.stringliteral {
|
||||||
|
color:hsl(261,100%,30%);
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
padding:.1em;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
449
docs/extra.scss
449
docs/extra.scss
|
@ -1,449 +0,0 @@
|
||||||
// NOTE: Please use this file to perform modifications on default style sheets.
|
|
||||||
//
|
|
||||||
// You need to install the official Sass CLI tool:
|
|
||||||
// npm install -g sass
|
|
||||||
//
|
|
||||||
// Run this command to regenerate extra.css after you're finished with changes:
|
|
||||||
// sass --style=compressed extra.scss extra.css
|
|
||||||
//
|
|
||||||
// Alternatively you can use online services to regenerate extra.css.
|
|
||||||
|
|
||||||
|
|
||||||
// Default text color for page contents
|
|
||||||
$default-text-color: hsl(0,0%,30%);
|
|
||||||
|
|
||||||
// Page header, footer, table rows, inline codes and definition lists
|
|
||||||
$header-footer-background-color: hsl(0,0%,95%);
|
|
||||||
|
|
||||||
// Page header, footer links and navigation bar background
|
|
||||||
$header-footer-link-color: hsl(0,0%,40%);
|
|
||||||
|
|
||||||
// Doxygen navigation bar links
|
|
||||||
$navbar-link-color: $header-footer-background-color;
|
|
||||||
|
|
||||||
// Page content background color
|
|
||||||
$content-background-color: hsl(0,0%,100%);
|
|
||||||
|
|
||||||
// Bold, italic, h1, h2, ... and table of contents
|
|
||||||
$heading-color: hsl(0,0%,10%);
|
|
||||||
|
|
||||||
// Function, enum and macro definition separator
|
|
||||||
$def-separator-color: $header-footer-background-color;
|
|
||||||
|
|
||||||
// Base color hue
|
|
||||||
$base-hue: 24;
|
|
||||||
|
|
||||||
// Default color used for links
|
|
||||||
$default-link-color: hsl($base-hue,100%,50%);
|
|
||||||
|
|
||||||
// Doxygen navigation bar active tab
|
|
||||||
$tab-text-color: hsl(0,0%,100%);
|
|
||||||
$tab-background-color1: $default-link-color;
|
|
||||||
$tab-background-color2: lighten(adjust-hue($tab-background-color1, 10), 10%);
|
|
||||||
|
|
||||||
// Table borders
|
|
||||||
$default-border-color: $default-link-color;
|
|
||||||
|
|
||||||
// Table header
|
|
||||||
$table-text-color: $tab-text-color;
|
|
||||||
$table-background-color1: $tab-background-color1;
|
|
||||||
$table-background-color2: $tab-background-color2;
|
|
||||||
|
|
||||||
// Table of contents, data structure index and prototypes
|
|
||||||
$toc-background-color1: hsl(0,0%,90%);
|
|
||||||
$toc-background-color2: lighten($toc-background-color1, 5%);
|
|
||||||
|
|
||||||
// Function prototype parameters color
|
|
||||||
$prototype-param-color: darken($default-link-color, 25%);
|
|
||||||
|
|
||||||
// Message box color: note, pre, post and invariant
|
|
||||||
$box-note-color: hsl(103,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: warning and attention
|
|
||||||
$box-warning-color: hsl(34,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: deprecated and bug
|
|
||||||
$box-bug-color: hsl(333,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: todo and test
|
|
||||||
$box-todo-color: hsl(200,80%,85%);
|
|
||||||
|
|
||||||
// Message box helper function
|
|
||||||
@mixin message-box($base-color){
|
|
||||||
background:linear-gradient(to bottom,lighten($base-color, 5%) 0%,$base-color 100%);
|
|
||||||
box-shadow:inset 0 0 32px darken($base-color, 5%);
|
|
||||||
color:darken($base-color, 67%);
|
|
||||||
border:2px solid desaturate(darken($base-color, 10%), 20%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox,.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted,.sm-dox ul a:hover {
|
|
||||||
background:none;
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox a span.sub-arrow {
|
|
||||||
border-color:$navbar-link-color transparent transparent transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox a span.sub-arrow:active,.sm-dox a span.sub-arrow:focus,.sm-dox a span.sub-arrow:hover,.sm-dox a:hover span.sub-arrow {
|
|
||||||
border-color:$default-link-color transparent transparent transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox ul a span.sub-arrow:active,.sm-dox ul a span.sub-arrow:focus,.sm-dox ul a span.sub-arrow:hover,.sm-dox ul a:hover span.sub-arrow {
|
|
||||||
border-color:transparent transparent transparent $default-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox ul a:hover {
|
|
||||||
background:$header-footer-link-color;
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sm-dox ul.sm-nowrap a {
|
|
||||||
color:$default-text-color;
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-nav,#main-menu,#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code,.markdownTable code {
|
|
||||||
background:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,table.markdownTable td,table.markdownTable th,hr,.memSeparator {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.reflist dt a.el,.levels span,.directory .levels span {
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.memdoc,dl.reflist dd {
|
|
||||||
box-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code,table.markdownTable code {
|
|
||||||
padding:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav-path,.directory .levels,span.lineno {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
html,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),tr.markdownTableBody:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code,.markdownTableRowEven {
|
|
||||||
background:$header-footer-background-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color:$default-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.title {
|
|
||||||
font-size: 170%;
|
|
||||||
margin: 1em 0 0.5em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
|
|
||||||
color:$heading-color;
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
font-size:150%;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
margin-bottom:0;
|
|
||||||
font-size:130%;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
margin-bottom:0;
|
|
||||||
font-size:110%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwheader {
|
|
||||||
font-size:16px;
|
|
||||||
min-height:64px;
|
|
||||||
max-width:920px;
|
|
||||||
padding:0 32px;
|
|
||||||
margin:0 auto;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: center;
|
|
||||||
align-content: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome {
|
|
||||||
line-height:64px;
|
|
||||||
padding-right:48px;
|
|
||||||
color:$header-footer-link-color;
|
|
||||||
font-size:2.5em;
|
|
||||||
background:url("https://www.glfw.org/css/arrow.png") no-repeat right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwnavbar {
|
|
||||||
list-style-type:none;
|
|
||||||
margin:0 0 0 auto;
|
|
||||||
float:right;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome,.glfwnavbar li {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwnavbar a,.glfwnavbar a:visited {
|
|
||||||
line-height:64px;
|
|
||||||
margin-left:2em;
|
|
||||||
display:block;
|
|
||||||
color:$header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwnavbar {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
|
|
||||||
transition:.35s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#titlearea,.footer {
|
|
||||||
color:$header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
address.footer {
|
|
||||||
text-align:center;
|
|
||||||
padding:2em;
|
|
||||||
margin-top:3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#top {
|
|
||||||
background:$header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-nav {
|
|
||||||
max-width:960px;
|
|
||||||
margin:0 auto;
|
|
||||||
font-size:13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu {
|
|
||||||
max-width:920px;
|
|
||||||
margin:0 auto;
|
|
||||||
font-size:13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.memtitle {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.memproto,.memname {
|
|
||||||
font-weight:bold;
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu {
|
|
||||||
min-height:36px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: center;
|
|
||||||
align-content: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li {
|
|
||||||
color:$navbar-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu li ul.sm-nowrap li a {
|
|
||||||
color:$default-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu li ul.sm-nowrap li a:hover {
|
|
||||||
color:$default-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-menu > li:last-child {
|
|
||||||
margin: 0 0 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contents {
|
|
||||||
min-height:590px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.contents,div.header {
|
|
||||||
max-width:920px;
|
|
||||||
margin:0 auto;
|
|
||||||
padding:0 32px;
|
|
||||||
background:$content-background-color none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.doxtable th,table.markdownTable th,dl.reflist dt {
|
|
||||||
background:linear-gradient(to bottom,$table-background-color2 0%,$table-background-color1 100%);
|
|
||||||
box-shadow:inset 0 0 32px $table-background-color1;
|
|
||||||
text-shadow:0 -1px 1px darken($table-background-color1, 15%);
|
|
||||||
text-align:left;
|
|
||||||
color:$table-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dt a.el {
|
|
||||||
color:$default-link-color;
|
|
||||||
padding:.2em;
|
|
||||||
border-radius:4px;
|
|
||||||
background-color:lighten($default-link-color, 40%);
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc {
|
|
||||||
float:right;
|
|
||||||
width:35%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width:600px) {
|
|
||||||
div.toc {
|
|
||||||
float:none;
|
|
||||||
width:inherit;
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc h3 {
|
|
||||||
font-size:1.17em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc ul {
|
|
||||||
padding-left:1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc li {
|
|
||||||
font-size:1em;
|
|
||||||
padding-left:0;
|
|
||||||
list-style-type:disc;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc {
|
|
||||||
li.level2, li.level3 {
|
|
||||||
margin-left:0.5em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc,.memproto,div.qindex,div.ah {
|
|
||||||
background:linear-gradient(to bottom,$toc-background-color2 0%,$toc-background-color1 100%);
|
|
||||||
box-shadow:inset 0 0 32px $toc-background-color1;
|
|
||||||
text-shadow:0 1px 1px lighten($toc-background-color2, 10%);
|
|
||||||
color:$heading-color;
|
|
||||||
border:2px solid $toc-background-color1;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paramname {
|
|
||||||
color:$prototype-param-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dt {
|
|
||||||
border:2px solid $default-border-color;
|
|
||||||
border-top-left-radius:4px;
|
|
||||||
border-top-right-radius:4px;
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dd {
|
|
||||||
border:2px solid $default-border-color;
|
|
||||||
border-bottom-right-radius:4px;
|
|
||||||
border-bottom-left-radius:4px;
|
|
||||||
border-top:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.doxtable,table.markdownTable {
|
|
||||||
border-collapse:inherit;
|
|
||||||
border-spacing:0;
|
|
||||||
border:2px solid $default-border-color;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,#main-menu a:hover,span.lineno a:hover {
|
|
||||||
color:$default-link-color;
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.directory {
|
|
||||||
border-collapse:inherit;
|
|
||||||
border-spacing:0;
|
|
||||||
border:2px solid $default-border-color;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr,.memSeparator {
|
|
||||||
height:2px;
|
|
||||||
background:linear-gradient(to right,$def-separator-color 0%,darken($def-separator-color, 10%) 50%,$def-separator-color 100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.note,dl.pre,dl.post,dl.invariant {
|
|
||||||
@include message-box($box-note-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.warning,dl.attention {
|
|
||||||
@include message-box($box-warning-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.deprecated,dl.bug {
|
|
||||||
@include message-box($box-bug-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.todo,dl.test {
|
|
||||||
@include message-box($box-todo-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {
|
|
||||||
border-radius:4px;
|
|
||||||
padding:1em;
|
|
||||||
text-shadow:0 1px 1px hsl(0,0%,100%);
|
|
||||||
margin:1em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited {
|
|
||||||
color:inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.line {
|
|
||||||
line-height:inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.fragment,pre.fragment {
|
|
||||||
background:hsl(0,0%,95%);
|
|
||||||
border-radius:4px;
|
|
||||||
border:none;
|
|
||||||
padding:1em;
|
|
||||||
overflow:auto;
|
|
||||||
border-left:4px solid hsl(0,0%,80%);
|
|
||||||
margin:1em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lineno a,.lineno a:visited,.line,pre.fragment {
|
|
||||||
color:$default-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
span.preprocessor,span.comment {
|
|
||||||
color:hsl(193,100%,30%);
|
|
||||||
}
|
|
||||||
|
|
||||||
a.code,a.code:visited {
|
|
||||||
color:hsl(18,100%,45%);
|
|
||||||
}
|
|
||||||
|
|
||||||
span.keyword,span.keywordtype,span.keywordflow {
|
|
||||||
color:darken($default-text-color, 5%);
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
span.stringliteral {
|
|
||||||
color:hsl(261,100%,30%);
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
padding:.1em;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
|
@ -1,8 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
@ -22,11 +21,12 @@ $extrastylesheet
|
||||||
<!--BEGIN TITLEAREA-->
|
<!--BEGIN TITLEAREA-->
|
||||||
<div id="titlearea">
|
<div id="titlearea">
|
||||||
<div class="glfwheader">
|
<div class="glfwheader">
|
||||||
<a href="https://www.glfw.org/" id="glfwhome">GLFW</a>
|
<a href="http://www.glfw.org/" id="glfwhome">GLFW</a>
|
||||||
<ul class="glfwnavbar">
|
<ul class="glfwnavbar">
|
||||||
<li><a href="https://www.glfw.org/documentation.html">Documentation</a></li>
|
<li><a href="http://www.glfw.org/documentation.html">Documentation</a></li>
|
||||||
<li><a href="https://www.glfw.org/download.html">Download</a></li>
|
<li><a href="http://www.glfw.org/download.html">Download</a></li>
|
||||||
<li><a href="https://www.glfw.org/community.html">Community</a></li>
|
<li><a href="http://www.glfw.org/media.html">Media</a></li>
|
||||||
|
<li><a href="http://www.glfw.org/community.html">Community</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
527
docs/input.dox
527
docs/input.dox
|
@ -1,44 +1,44 @@
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
@page input_guide Input guide
|
@page input_guide Input guide
|
||||||
|
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide introduces the input related functions of GLFW. For details on
|
This guide introduces the input related functions of GLFW. For details on
|
||||||
a specific function in this category, see the @ref input. There are also guides
|
a specific function, see the [reference documentation](@ref input). There are
|
||||||
for the other areas of GLFW.
|
also guides for the other areas of GLFW.
|
||||||
|
|
||||||
- @ref intro_guide
|
- @ref intro_guide
|
||||||
- @ref window_guide
|
- @ref window_guide
|
||||||
- @ref context_guide
|
- @ref context_guide
|
||||||
- @ref vulkan_guide
|
|
||||||
- @ref monitor_guide
|
- @ref monitor_guide
|
||||||
|
|
||||||
GLFW provides many kinds of input. While some can only be polled, like time, or
|
GLFW provides many kinds of input. While some can only be polled, like time, or
|
||||||
only received via callbacks, like scrolling, many provide both callbacks and
|
only received via callbacks, like scrolling, there are those that provide both
|
||||||
polling. Callbacks are more work to use than polling but is less CPU intensive
|
callbacks and polling. Where a callback is provided, that is the recommended
|
||||||
and guarantees that you do not miss state changes.
|
way to receive that kind of input. The more you can use callbacks the less time
|
||||||
|
your users' machines will need to spend polling.
|
||||||
|
|
||||||
All input callbacks receive a window handle. By using the
|
All input callbacks receive a window handle. By using the
|
||||||
[window user pointer](@ref window_userptr), you can access non-global structures
|
[window user pointer](@ref window_userptr), you can access non-global structures
|
||||||
or objects from your callbacks.
|
or objects from your callbacks.
|
||||||
|
|
||||||
To get a better feel for how the various events callbacks behave, run the
|
To get a better feel for how the various events callbacks behave, run the
|
||||||
`events` test program. It registers every callback supported by GLFW and prints
|
`events` test program. It register every callback supported by GLFW and prints
|
||||||
out all arguments provided for every event, along with time and sequence
|
out all arguments provided for every event, along with time and sequence
|
||||||
information.
|
information.
|
||||||
|
|
||||||
|
|
||||||
@section events Event processing
|
@section events Event processing
|
||||||
|
|
||||||
GLFW needs to poll the window system for events both to provide input to the
|
GLFW needs to communicate regularly with the window system both in order to
|
||||||
application and to prove to the window system that the application hasn't locked
|
receive events and to show that the application hasn't locked up. Event
|
||||||
up. Event processing is normally done each frame after
|
processing must be done regularly while you have any windows and is normally
|
||||||
[buffer swapping](@ref buffer_swap). Even when you have no windows, event
|
done each frame after [buffer swapping](@ref buffer_swap). Even when you have
|
||||||
polling needs to be done in order to receive monitor and joystick connection
|
no windows, event polling needs to be done in order to receive monitor
|
||||||
events.
|
connection events.
|
||||||
|
|
||||||
There are three functions for processing pending events. @ref glfwPollEvents,
|
There are two functions for processing pending events. @ref glfwPollEvents,
|
||||||
processes only those events that have already been received and then returns
|
processes only those events that have already been received and then returns
|
||||||
immediately.
|
immediately.
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ immediately.
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This is the best choice when rendering continuously, like most games do.
|
This is the best choice when rendering continually, like most games do.
|
||||||
|
|
||||||
If you only need to update the contents of the window when you receive new
|
If you only need to update the contents of the window when you receive new
|
||||||
input, @ref glfwWaitEvents is a better choice.
|
input, @ref glfwWaitEvents is a better choice.
|
||||||
|
@ -57,10 +57,11 @@ glfwWaitEvents();
|
||||||
|
|
||||||
It puts the thread to sleep until at least one event has been received and then
|
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
|
processes all received events. This saves a great deal of CPU cycles and is
|
||||||
useful for, for example, editing tools.
|
useful for, for example, editing tools. There must be at least one GLFW window
|
||||||
|
for this function to sleep.
|
||||||
|
|
||||||
If you want to wait for events but have UI elements or other tasks that need
|
If you want to wait for events but have UI elements that need periodic updates,
|
||||||
periodic updates, @ref glfwWaitEventsTimeout lets you specify a timeout.
|
call @ref glfwWaitEventsTimeout.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwWaitEventsTimeout(0.7);
|
glfwWaitEventsTimeout(0.7);
|
||||||
|
@ -78,17 +79,10 @@ glfwPostEmptyEvent.
|
||||||
glfwPostEmptyEvent();
|
glfwPostEmptyEvent();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Do not assume that callbacks will _only_ be called in response to the above
|
Do not assume that callbacks will _only_ be called through either of the above
|
||||||
functions. While it is necessary to process events in one or more of the ways
|
functions. While it is necessary to process events in the event queue, some
|
||||||
above, window systems that require GLFW to register callbacks of its own can
|
window systems will send some events directly to the application, which in turn
|
||||||
pass events to GLFW in response to many window system function calls. GLFW will
|
causes callbacks to be called outside of regular event processing.
|
||||||
pass those events on to the application callbacks before returning.
|
|
||||||
|
|
||||||
For example, on Windows the system function that @ref glfwSetWindowSize is
|
|
||||||
implemented with will send window size events directly to the event callback
|
|
||||||
that every window has and that GLFW implements for its windows. If you have set
|
|
||||||
a [window size callback](@ref window_size) GLFW will call it in turn with the
|
|
||||||
new size before everything returns back out of the @ref glfwSetWindowSize call.
|
|
||||||
|
|
||||||
|
|
||||||
@section input_keyboard Keyboard input
|
@section input_keyboard Keyboard input
|
||||||
|
@ -123,57 +117,35 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The action is one of `GLFW_PRESS`, `GLFW_REPEAT` or `GLFW_RELEASE`. Events with
|
The action is one of `GLFW_PRESS`, `GLFW_REPEAT` or `GLFW_RELEASE`. The key
|
||||||
`GLFW_PRESS` and `GLFW_RELEASE` actions are emitted for every key press. Most
|
will be `GLFW_KEY_UNKNOWN` if GLFW lacks a key token for it, for example
|
||||||
keys will also emit events with `GLFW_REPEAT` actions while a key is held down.
|
_E-mail_ and _Play_ keys.
|
||||||
|
|
||||||
Key events with `GLFW_REPEAT` actions are intended for text input. They are
|
|
||||||
emitted at the rate set in the user's keyboard settings. At most one key is
|
|
||||||
repeated even if several keys are held down. `GLFW_REPEAT` actions should not
|
|
||||||
be relied on to know which keys are being held down or to drive animation.
|
|
||||||
Instead you should either save the state of relevant keys based on `GLFW_PRESS`
|
|
||||||
and `GLFW_RELEASE` actions, or call @ref glfwGetKey, which provides basic cached
|
|
||||||
key state.
|
|
||||||
|
|
||||||
The key will be one of the existing [key tokens](@ref keys), or
|
|
||||||
`GLFW_KEY_UNKNOWN` if GLFW lacks a token for it, for example _E-mail_ and _Play_
|
|
||||||
keys.
|
|
||||||
|
|
||||||
The scancode is unique for every key, regardless of whether it has a key token.
|
The scancode is unique for every key, regardless of whether it has a key token.
|
||||||
Scancodes are platform-specific but consistent over time, so keys will have
|
Scancodes are platform-specific but consistent over time, so keys will have
|
||||||
different scancodes depending on the platform but they are safe to save to disk.
|
different scancodes depending on the platform but they are safe to save to disk.
|
||||||
You can query the scancode for any [named key](@ref keys) on the current
|
|
||||||
platform with @ref glfwGetKeyScancode.
|
|
||||||
|
|
||||||
@code
|
Key states for [named keys](@ref keys) are also saved in per-window state arrays
|
||||||
const int scancode = glfwGetKeyScancode(GLFW_KEY_X);
|
that can be polled with @ref glfwGetKey.
|
||||||
set_key_mapping(scancode, swap_weapons);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The last reported state for every [named key](@ref keys) is also saved in
|
|
||||||
per-window state arrays that can be polled with @ref glfwGetKey.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
int state = glfwGetKey(window, GLFW_KEY_E);
|
int state = glfwGetKey(window, GLFW_KEY_E);
|
||||||
if (state == GLFW_PRESS)
|
if (state == GLFW_PRESS)
|
||||||
{
|
|
||||||
activate_airship();
|
activate_airship();
|
||||||
}
|
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
|
|
||||||
This function only returns cached key event state. It does not poll the
|
This function only returns cached key event state. It does not poll the
|
||||||
system for the current physical state of the key.
|
system for the current state of the key.
|
||||||
|
|
||||||
@anchor GLFW_STICKY_KEYS
|
|
||||||
Whenever you poll state, you risk missing the state change you are looking for.
|
Whenever you poll state, you risk missing the state change you are looking for.
|
||||||
If a pressed key is released again before you poll its state, you will have
|
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
|
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.
|
key callback, but there is also the `GLFW_STICKY_KEYS` input mode.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetInputMode(window, GLFW_STICKY_KEYS, GLFW_TRUE);
|
glfwSetInputMode(window, GLFW_STICKY_KEYS, 1);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
When sticky keys mode is enabled, the pollable state of a key will remain
|
When sticky keys mode is enabled, the pollable state of a key will remain
|
||||||
|
@ -181,19 +153,6 @@ When sticky keys mode is enabled, the pollable state of a key will remain
|
||||||
it has been polled, if a key release event had been processed in the meantime,
|
it has been polled, if a key release event had been processed in the meantime,
|
||||||
the state will reset to `GLFW_RELEASE`, otherwise it will remain `GLFW_PRESS`.
|
the state will reset to `GLFW_RELEASE`, otherwise it will remain `GLFW_PRESS`.
|
||||||
|
|
||||||
@anchor GLFW_LOCK_KEY_MODS
|
|
||||||
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
|
|
||||||
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
|
|
||||||
Lock was on when the event occurred and the @ref GLFW_MOD_NUM_LOCK bit set if
|
|
||||||
Num Lock was on.
|
|
||||||
|
|
||||||
The `GLFW_KEY_LAST` constant holds the highest value of any
|
The `GLFW_KEY_LAST` constant holds the highest value of any
|
||||||
[named key](@ref keys).
|
[named key](@ref keys).
|
||||||
|
|
||||||
|
@ -205,12 +164,15 @@ GLFW supports text input in the form of a stream of
|
||||||
operating system text input system. Unlike key input, text input obeys keyboard
|
operating system text input system. Unlike key input, text input obeys keyboard
|
||||||
layouts and modifier keys and supports composing characters using
|
layouts and modifier keys and supports composing characters using
|
||||||
[dead keys](https://en.wikipedia.org/wiki/Dead_key). Once received, you can
|
[dead keys](https://en.wikipedia.org/wiki/Dead_key). Once received, you can
|
||||||
encode the code points into UTF-8 or any other encoding you prefer.
|
encode the code points into
|
||||||
|
[UTF-8](https://en.wikipedia.org/wiki/UTF-8) or any other encoding you prefer.
|
||||||
|
|
||||||
Because an `unsigned int` is 32 bits long on all platforms supported by GLFW,
|
Because an `unsigned int` is 32 bits long on all platforms supported by GLFW,
|
||||||
you can treat the code point argument as native endian UTF-32.
|
you can treat the code point argument as native endian
|
||||||
|
[UTF-32](https://en.wikipedia.org/wiki/UTF-32).
|
||||||
|
|
||||||
If you wish to offer regular text input, set a character callback.
|
There are two callbacks for receiving Unicode code points. If you wish to
|
||||||
|
offer regular text input, set a character callback.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetCharCallback(window, character_callback);
|
glfwSetCharCallback(window, character_callback);
|
||||||
|
@ -226,6 +188,23 @@ void character_callback(GLFWwindow* window, unsigned int codepoint)
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
If you wish to receive even those Unicode code points generated with modifier
|
||||||
|
key combinations that a plain text field would ignore, or just want to know
|
||||||
|
exactly what modifier keys were used, set a character with modifiers callback.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetCharModsCallback(window, charmods_callback);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The callback function receives Unicode code points and
|
||||||
|
[modifier bits](@ref mods).
|
||||||
|
|
||||||
|
@code
|
||||||
|
void charmods_callback(GLFWwindow* window, unsigned int codepoint, int mods)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection input_key_name Key names
|
@subsection input_key_name Key names
|
||||||
|
|
||||||
|
@ -245,7 +224,7 @@ arguments can always be passed unmodified to this function.
|
||||||
|
|
||||||
@section input_mouse Mouse input
|
@section input_mouse Mouse input
|
||||||
|
|
||||||
Mouse input comes in many forms, including mouse motion, button presses and
|
Mouse input comes in many forms, including cursor motion, button presses and
|
||||||
scrolling offsets. The cursor appearance can also be changed, either to
|
scrolling offsets. The cursor appearance can also be changed, either to
|
||||||
a custom image or a standard cursor shape from the system theme.
|
a custom image or a standard cursor shape from the system theme.
|
||||||
|
|
||||||
|
@ -256,11 +235,11 @@ If you wish to be notified when the cursor moves over the window, set a cursor
|
||||||
position callback.
|
position callback.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetCursorPosCallback(window, cursor_position_callback);
|
glfwSetCursorPosCallback(window, cursor_pos_callback);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The callback functions receives the cursor position, measured in screen
|
The callback functions receives the cursor position, measured in screen
|
||||||
coordinates but relative to the top-left corner of the window content area. On
|
coordinates but relative to the top-left corner of the window client area. On
|
||||||
platforms that provide it, the full sub-pixel cursor position is passed on.
|
platforms that provide it, the full sub-pixel cursor position is passed on.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -278,9 +257,8 @@ glfwGetCursorPos(window, &xpos, &ypos);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_mode Cursor mode
|
@subsection cursor_mode Cursor modes
|
||||||
|
|
||||||
@anchor GLFW_CURSOR
|
|
||||||
The `GLFW_CURSOR` input mode provides several cursor modes for special forms of
|
The `GLFW_CURSOR` input mode provides several cursor modes for special forms of
|
||||||
mouse motion input. By default, the cursor mode is `GLFW_CURSOR_NORMAL`,
|
mouse motion input. By default, the cursor mode is `GLFW_CURSOR_NORMAL`,
|
||||||
meaning the regular arrow cursor (or another cursor set with @ref glfwSetCursor)
|
meaning the regular arrow cursor (or another cursor set with @ref glfwSetCursor)
|
||||||
|
@ -303,8 +281,8 @@ is provided normally via both the cursor position callback and through polling.
|
||||||
other features of GLFW. It is not supported and will not work as robustly as
|
other features of GLFW. It is not supported and will not work as robustly as
|
||||||
`GLFW_CURSOR_DISABLED`.
|
`GLFW_CURSOR_DISABLED`.
|
||||||
|
|
||||||
If you only wish the cursor to become hidden when it is over a window but still
|
If you just wish the cursor to become hidden when it is over a window, set
|
||||||
want it to behave normally, set the cursor mode to `GLFW_CURSOR_HIDDEN`.
|
the cursor mode to `GLFW_CURSOR_HIDDEN`.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
|
@ -312,16 +290,6 @@ glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
|
|
||||||
This mode puts no limit on the motion of the cursor.
|
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
To exit out of either of these special modes, restore the `GLFW_CURSOR_NORMAL`
|
To exit out of either of these special modes, restore the `GLFW_CURSOR_NORMAL`
|
||||||
cursor mode.
|
cursor mode.
|
||||||
|
|
||||||
|
@ -329,33 +297,6 @@ cursor mode.
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If the cursor was disabled, this will move it back to its last visible position.
|
|
||||||
|
|
||||||
|
|
||||||
@anchor GLFW_RAW_MOUSE_MOTION
|
|
||||||
@subsection raw_mouse_motion Raw mouse motion
|
|
||||||
|
|
||||||
When the cursor is disabled, raw (unscaled and unaccelerated) mouse motion can
|
|
||||||
be enabled if available.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_object Cursor objects
|
@subsection cursor_object Cursor objects
|
||||||
|
|
||||||
|
@ -387,25 +328,22 @@ If cursor creation fails, `NULL` will be returned, so it is necessary to check
|
||||||
the return value.
|
the return value.
|
||||||
|
|
||||||
The image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits
|
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
|
per channel. The pixels are arranged canonically as sequential rows, starting
|
||||||
sequential rows, starting from the top-left corner.
|
from the top-left corner.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_standard Standard cursor creation
|
@subsubsection cursor_standard Standard cursor creation
|
||||||
|
|
||||||
A cursor with a [standard shape](@ref shapes) from the current system cursor
|
A cursor with a [standard shape](@ref shapes) from the current system cursor
|
||||||
theme can be created with @ref glfwCreateStandardCursor.
|
theme can be can be created with @ref glfwCreateStandardCursor.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
GLFWcursor* url_cursor = glfwCreateStandardCursor(GLFW_POINTING_HAND_CURSOR);
|
GLFWcursor* cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
These cursor objects behave in the exact same way as those created with @ref
|
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.
|
glfwCreateCursor except that the system cursor theme provides the actual image.
|
||||||
|
|
||||||
A few of these shapes are not available everywhere. If a shape is unavailable,
|
|
||||||
`NULL` is returned. See @ref glfwCreateStandardCursor for details.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_destruction Cursor destruction
|
@subsubsection cursor_destruction Cursor destruction
|
||||||
|
|
||||||
|
@ -415,9 +353,8 @@ When a cursor is no longer needed, destroy it with @ref glfwDestroyCursor.
|
||||||
glfwDestroyCursor(cursor);
|
glfwDestroyCursor(cursor);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Cursor destruction always succeeds. If the cursor is current for any window,
|
Cursor destruction always succeeds. All cursors remaining when @ref
|
||||||
that window will revert to the default cursor. This does not affect the cursor
|
glfwTerminate is called are destroyed as well.
|
||||||
mode. All remaining cursors are destroyed when @ref glfwTerminate is called.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_set Cursor setting
|
@subsubsection cursor_set Cursor setting
|
||||||
|
@ -429,24 +366,24 @@ glfwSetCursor(window, cursor);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Once set, the cursor image will be used as long as the system cursor is over the
|
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
|
client area of the window and the [cursor mode](@ref cursor_mode) is set
|
||||||
to `GLFW_CURSOR_NORMAL`.
|
to `GLFW_CURSOR_NORMAL`.
|
||||||
|
|
||||||
A single cursor may be set for any number of windows.
|
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`.
|
To remove a cursor from a window, set the cursor of that window to `NULL`.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetCursor(window, NULL);
|
glfwSetCursor(window, NULL);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
When a cursor is destroyed, any window that has it set will revert to the
|
When a cursor is destroyed, it is removed from any window where it is set. This
|
||||||
default cursor. This does not affect the cursor mode.
|
does not affect the cursor modes of those windows.
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_enter Cursor enter/leave events
|
@subsection cursor_enter Cursor enter/leave events
|
||||||
|
|
||||||
If you wish to be notified when the cursor enters or leaves the content area of
|
If you wish to be notified when the cursor enters or leaves the client area of
|
||||||
a window, set a cursor enter/leave callback.
|
a window, set a cursor enter/leave callback.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -460,25 +397,15 @@ void cursor_enter_callback(GLFWwindow* window, int entered)
|
||||||
{
|
{
|
||||||
if (entered)
|
if (entered)
|
||||||
{
|
{
|
||||||
// The cursor entered the content area of the window
|
// The cursor entered the client area of the window
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The cursor left the content area of the window
|
// The cursor left the client area of the window
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@endcode
|
@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
|
|
||||||
if (glfwGetWindowAttrib(window, GLFW_HOVERED))
|
|
||||||
{
|
|
||||||
highlight_interface();
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection input_mouse_button Mouse button input
|
@subsection input_mouse_button Mouse button input
|
||||||
|
|
||||||
|
@ -508,9 +435,7 @@ per-window state arrays that can be polled with @ref glfwGetMouseButton.
|
||||||
@code
|
@code
|
||||||
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
|
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
|
||||||
if (state == GLFW_PRESS)
|
if (state == GLFW_PRESS)
|
||||||
{
|
|
||||||
upgrade_cow();
|
upgrade_cow();
|
||||||
}
|
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
|
@ -518,7 +443,6 @@ The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
This function only returns cached mouse button event state. It does not poll
|
This function only returns cached mouse button event state. It does not poll
|
||||||
the system for the current state of the mouse button.
|
the system for the current state of the mouse button.
|
||||||
|
|
||||||
@anchor GLFW_STICKY_MOUSE_BUTTONS
|
|
||||||
Whenever you poll state, you risk missing the state change you are looking for.
|
Whenever you poll state, you risk missing the state change you are looking for.
|
||||||
If a pressed mouse button is released again before you poll its state, you will have
|
If a pressed mouse button is released again before you poll its state, you will have
|
||||||
missed the button press. The recommended solution for this is to use a
|
missed the button press. The recommended solution for this is to use a
|
||||||
|
@ -526,7 +450,7 @@ mouse button callback, but there is also the `GLFW_STICKY_MOUSE_BUTTONS`
|
||||||
input mode.
|
input mode.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, GLFW_TRUE);
|
glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
When sticky mouse buttons mode is enabled, the pollable state of a mouse button
|
When sticky mouse buttons mode is enabled, the pollable state of a mouse button
|
||||||
|
@ -556,37 +480,28 @@ void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
A normal mouse wheel, being vertical, provides offsets along the Y-axis.
|
A simple mouse wheel, being vertical, provides offsets along the Y-axis.
|
||||||
|
|
||||||
|
|
||||||
@section joystick Joystick input
|
@section joystick Joystick input
|
||||||
|
|
||||||
The joystick functions expose connected joysticks and controllers, with both
|
The joystick functions expose connected joysticks and controllers, with both
|
||||||
referred to as joysticks. It supports up to sixteen joysticks, ranging from
|
referred to as joysticks. It supports up to sixteen joysticks, ranging from
|
||||||
`GLFW_JOYSTICK_1`, `GLFW_JOYSTICK_2` up to and including `GLFW_JOYSTICK_16` or
|
`GLFW_JOYSTICK_1`, `GLFW_JOYSTICK_2` up to `GLFW_JOYSTICK_LAST`. You can test
|
||||||
`GLFW_JOYSTICK_LAST`. You can test whether a [joystick](@ref joysticks) is
|
whether a [joystick](@ref joysticks) is present with @ref glfwJoystickPresent.
|
||||||
present with @ref glfwJoystickPresent.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
int present = glfwJoystickPresent(GLFW_JOYSTICK_1);
|
int present = glfwJoystickPresent(GLFW_JOYSTICK_1);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Each joystick has zero or more axes, zero or more buttons, zero or more hats,
|
When GLFW is initialized, detected joysticks are added to to the beginning of
|
||||||
a human-readable name, a user pointer and an SDL compatible GUID.
|
the array, starting with `GLFW_JOYSTICK_1`. Once a joystick is detected, it
|
||||||
|
keeps its assigned index until it is disconnected, so as joysticks are connected
|
||||||
|
and disconnected, they will become spread out.
|
||||||
|
|
||||||
Detected joysticks are added to the beginning of the array. Once a joystick is
|
Joystick state is updated as needed when a joystick function is called and does
|
||||||
detected, it keeps its assigned ID until it is disconnected or the library is
|
not require a window to be created or @ref glfwPollEvents or @ref glfwWaitEvents
|
||||||
terminated, so as joysticks are connected and disconnected, there may appear
|
to be called.
|
||||||
gaps in the IDs.
|
|
||||||
|
|
||||||
Joystick axis, button and hat state is updated when polled and does not require
|
|
||||||
a window to be created or events to be processed. However, if you want joystick
|
|
||||||
connection and disconnection events reliably delivered to the
|
|
||||||
[joystick callback](@ref joystick_event) then you must
|
|
||||||
[process events](@ref events).
|
|
||||||
|
|
||||||
To see all the properties of all connected joysticks in real-time, run the
|
|
||||||
`joysticks` test program.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_axis Joystick axis states
|
@subsection joystick_axis Joystick axis states
|
||||||
|
@ -597,7 +512,7 @@ returned array.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
int count;
|
int count;
|
||||||
const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_5, &count);
|
const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &count);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Each element in the returned array is a value between -1.0 and 1.0.
|
Each element in the returned array is a value between -1.0 and 1.0.
|
||||||
|
@ -611,82 +526,27 @@ returned array.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
int count;
|
int count;
|
||||||
const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_3, &count);
|
const unsigned char* axes = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &count);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Each element in the returned array is either `GLFW_PRESS` or `GLFW_RELEASE`.
|
Each element in the returned array is either `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
|
|
||||||
For backward compatibility with earlier versions that did not have @ref
|
|
||||||
glfwGetJoystickHats, the button array by default also includes all hats. See
|
|
||||||
the reference documentation for @ref glfwGetJoystickButtons for details.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_hat Joystick hat states
|
|
||||||
|
|
||||||
The states of all hats are returned by @ref glfwGetJoystickHats. See the
|
|
||||||
reference documentation for the lifetime of the returned array.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int count;
|
|
||||||
const unsigned char* hats = glfwGetJoystickHats(GLFW_JOYSTICK_7, &count);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Each element in the returned array is one of the following:
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
For backward compatibility with earlier versions that did not have @ref
|
|
||||||
glfwGetJoystickHats, all hats are by default also included in the button array.
|
|
||||||
See the reference documentation for @ref glfwGetJoystickButtons for details.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_name Joystick name
|
@subsection joystick_name Joystick name
|
||||||
|
|
||||||
The human-readable, UTF-8 encoded name of a joystick is returned by @ref
|
The human-readable, UTF-8 encoded name of a joystick is returned by @ref
|
||||||
glfwGetJoystickName. See the reference documentation for the lifetime of the
|
glfwGetJoystickName. See the reference documentation for the lifetime of the
|
||||||
returned string.
|
returned string.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
const char* name = glfwGetJoystickName(GLFW_JOYSTICK_4);
|
const char* name = glfwGetJoystickName(GLFW_JOYSTICK_1);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Joystick names are not guaranteed to be unique. Two joysticks of the same model
|
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
|
and make may have the same name. Only the [joystick token](@ref joysticks) is
|
||||||
guaranteed to be unique, and only until that joystick is disconnected.
|
guaranteed to be unique, and only until that joystick is disconnected.
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_userptr Joystick user pointer
|
|
||||||
|
|
||||||
Each joystick has a user pointer that can be set with @ref
|
|
||||||
glfwSetJoystickUserPointer and queried with @ref glfwGetJoystickUserPointer.
|
|
||||||
This can be used for any purpose you need and will not be modified by GLFW. The
|
|
||||||
value will be kept until the joystick is disconnected or until the library is
|
|
||||||
terminated.
|
|
||||||
|
|
||||||
The initial value of the pointer is `NULL`.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_event Joystick configuration changes
|
@subsection joystick_event Joystick configuration changes
|
||||||
|
|
||||||
If you wish to be notified when a joystick is connected or disconnected, set
|
If you wish to be notified when a joystick is connected or disconnected, set
|
||||||
|
@ -700,7 +560,7 @@ The callback function receives the ID of the joystick that has been connected
|
||||||
and disconnected and the event that occurred.
|
and disconnected and the event that occurred.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
void joystick_callback(int jid, int event)
|
void joystick_callback(int joy, int event)
|
||||||
{
|
{
|
||||||
if (event == GLFW_CONNECTED)
|
if (event == GLFW_CONNECTED)
|
||||||
{
|
{
|
||||||
|
@ -713,180 +573,6 @@ void joystick_callback(int jid, int event)
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
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 for a disconnected joystick.
|
|
||||||
|
|
||||||
Only @ref glfwGetJoystickName and @ref glfwGetJoystickUserPointer will return
|
|
||||||
useful values for a disconnected joystick and only before the monitor callback
|
|
||||||
returns.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection gamepad Gamepad input
|
|
||||||
|
|
||||||
The joystick functions provide unlabeled axes, buttons and hats, with no
|
|
||||||
indication of where they are located on the device. Their order may also vary
|
|
||||||
between platforms even with the same device.
|
|
||||||
|
|
||||||
To solve this problem the SDL community crowdsourced the
|
|
||||||
[SDL_GameControllerDB](https://github.com/gabomdq/SDL_GameControllerDB) project,
|
|
||||||
a database of mappings from many different devices to an Xbox-like gamepad.
|
|
||||||
|
|
||||||
GLFW supports this mapping format and contains a copy of the mappings
|
|
||||||
available at the time of release. See @ref gamepad_mapping for how to update
|
|
||||||
this at runtime. Mappings will be assigned to joysticks automatically any time
|
|
||||||
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
|
||||||
const char* name = glfwGetGamepadName(GLFW_JOYSTICK_7);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
To retrieve the gamepad state of a joystick, call @ref glfwGetGamepadState.
|
|
||||||
|
|
||||||
@code
|
|
||||||
GLFWgamepadstate state;
|
|
||||||
|
|
||||||
if (glfwGetGamepadState(GLFW_JOYSTICK_3, &state))
|
|
||||||
{
|
|
||||||
if (state.buttons[GLFW_GAMEPAD_BUTTON_A])
|
|
||||||
{
|
|
||||||
input_jump();
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
@ref glfwGetJoystickButtons and @ref glfwGetJoystickAxes functions, i.e.
|
|
||||||
`GLFW_PRESS` or `GLFW_RELEASE` for buttons and -1.0 to 1.0 inclusive for axes.
|
|
||||||
|
|
||||||
The sizes of the arrays and the positions within each array are fixed.
|
|
||||||
|
|
||||||
The [button indices](@ref gamepad_buttons) are `GLFW_GAMEPAD_BUTTON_A`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_B`, `GLFW_GAMEPAD_BUTTON_X`, `GLFW_GAMEPAD_BUTTON_Y`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_LEFT_BUMPER`, `GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_BACK`, `GLFW_GAMEPAD_BUTTON_START`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_GUIDE`, `GLFW_GAMEPAD_BUTTON_LEFT_THUMB`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_RIGHT_THUMB`, `GLFW_GAMEPAD_BUTTON_DPAD_UP`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_DPAD_RIGHT`, `GLFW_GAMEPAD_BUTTON_DPAD_DOWN` and
|
|
||||||
`GLFW_GAMEPAD_BUTTON_DPAD_LEFT`.
|
|
||||||
|
|
||||||
For those who prefer, there are also the `GLFW_GAMEPAD_BUTTON_CROSS`,
|
|
||||||
`GLFW_GAMEPAD_BUTTON_CIRCLE`, `GLFW_GAMEPAD_BUTTON_SQUARE` and
|
|
||||||
`GLFW_GAMEPAD_BUTTON_TRIANGLE` aliases for the A, B, X and Y button indices.
|
|
||||||
|
|
||||||
The [axis indices](@ref gamepad_axes) are `GLFW_GAMEPAD_AXIS_LEFT_X`,
|
|
||||||
`GLFW_GAMEPAD_AXIS_LEFT_Y`, `GLFW_GAMEPAD_AXIS_RIGHT_X`,
|
|
||||||
`GLFW_GAMEPAD_AXIS_RIGHT_Y`, `GLFW_GAMEPAD_AXIS_LEFT_TRIGGER` and
|
|
||||||
`GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER`.
|
|
||||||
|
|
||||||
The `GLFW_GAMEPAD_BUTTON_LAST` and `GLFW_GAMEPAD_AXIS_LAST` constants equal
|
|
||||||
the largest available index for each array.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection gamepad_mapping Gamepad mappings
|
|
||||||
|
|
||||||
GLFW contains a copy of the mappings available in
|
|
||||||
[SDL_GameControllerDB](https://github.com/gabomdq/SDL_GameControllerDB) at the
|
|
||||||
time of release. Newer ones can be added at runtime with @ref
|
|
||||||
glfwUpdateGamepadMappings.
|
|
||||||
|
|
||||||
@code
|
|
||||||
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.
|
|
||||||
|
|
||||||
If you are compiling GLFW from source with CMake you can update the built-in mappings by
|
|
||||||
building the _update_mappings_ target. This runs the `GenerateMappings.cmake` CMake
|
|
||||||
script, which downloads `gamecontrollerdb.txt` and regenerates the `mappings.h` header
|
|
||||||
file.
|
|
||||||
|
|
||||||
Below is a description of the mapping format. Please keep in mind that __this
|
|
||||||
description is not authoritative__. The format is defined by the SDL and
|
|
||||||
SDL_GameControllerDB projects and their documentation and code takes precedence.
|
|
||||||
|
|
||||||
Each mapping is a single line of comma-separated values describing the GUID,
|
|
||||||
name and layout of the gamepad. Lines that do not begin with a hexadecimal
|
|
||||||
digit are ignored.
|
|
||||||
|
|
||||||
The first value is always the gamepad GUID, a 32 character long hexadecimal
|
|
||||||
string that typically identifies its make, model, revision and the type of
|
|
||||||
connection to the computer. When this information is not available, the GUID is
|
|
||||||
generated using the gamepad name. GLFW uses the SDL 2.0.5+ GUID format but can
|
|
||||||
convert from the older formats.
|
|
||||||
|
|
||||||
The second value is always the human-readable name of the gamepad.
|
|
||||||
|
|
||||||
All subsequent values are in the form `<field>:<value>` and describe the layout
|
|
||||||
of the mapping. These fields may not all be present and may occur in any order.
|
|
||||||
|
|
||||||
The button fields are `a`, `b`, `x`, `y`, `back`, `start`, `guide`, `dpup`,
|
|
||||||
`dpright`, `dpdown`, `dpleft`, `leftshoulder`, `rightshoulder`, `leftstick` and
|
|
||||||
`rightstick`.
|
|
||||||
|
|
||||||
The axis fields are `leftx`, `lefty`, `rightx`, `righty`, `lefttrigger` and
|
|
||||||
`righttrigger`.
|
|
||||||
|
|
||||||
The value of an axis or button field can be a joystick button, a joystick axis,
|
|
||||||
a hat bitmask or empty. Joystick buttons are specified as `bN`, for example
|
|
||||||
`b2` for the third button. Joystick axes are specified as `aN`, for example
|
|
||||||
`a7` for the eighth button. Joystick hat bit masks are specified as `hN.N`, for
|
|
||||||
example `h0.8` for left on the first hat. More than one bit may be set in the
|
|
||||||
mask.
|
|
||||||
|
|
||||||
Before an axis there may be a `+` or `-` range modifier, for example `+a3` for
|
|
||||||
the positive half of the fourth axis. This restricts input to only the positive
|
|
||||||
or negative halves of the joystick axis. After an axis or half-axis there may
|
|
||||||
be the `~` inversion modifier, for example `a2~` or `-a7~`. This negates the
|
|
||||||
values of the gamepad axis.
|
|
||||||
|
|
||||||
The hat bit mask match the [hat states](@ref hat_state) in the joystick
|
|
||||||
functions.
|
|
||||||
|
|
||||||
There is also the special `platform` field that specifies which platform the
|
|
||||||
mapping is valid for. Possible values are `Windows`, `Mac OS X` and `Linux`.
|
|
||||||
|
|
||||||
Below is an example of what a gamepad mapping might look like. It is the
|
|
||||||
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
|
|
||||||
and described above.
|
|
||||||
|
|
||||||
|
|
||||||
@section time Time input
|
@section time Time input
|
||||||
|
|
||||||
|
@ -896,32 +582,31 @@ GLFW provides high-resolution time input, in seconds, with @ref glfwGetTime.
|
||||||
double seconds = glfwGetTime();
|
double seconds = glfwGetTime();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
It returns the number of seconds since the library was initialized with @ref
|
It returns the number of seconds since the timer was started when the library
|
||||||
glfwInit. The platform-specific time sources used typically have micro- or
|
was initialized with @ref glfwInit. The platform-specific time sources used
|
||||||
nanosecond resolution.
|
usually have micro- or nanosecond resolution.
|
||||||
|
|
||||||
You can modify the base time with @ref glfwSetTime.
|
You can modify the reference time with @ref glfwSetTime.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetTime(4.0);
|
glfwSetTime(4.0);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This sets the time to the specified time, in seconds, and it continues to count
|
This sets the timer to the specified time, in seconds.
|
||||||
from there.
|
|
||||||
|
|
||||||
You can also access the raw timer used to implement the functions above,
|
You can also access the raw timer value, measured in 1 / frequency
|
||||||
with @ref glfwGetTimerValue.
|
seconds, with @ref glfwGetTimerValue.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
uint64_t value = glfwGetTimerValue();
|
uint64_t value = glfwGetTimerValue();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This value is in 1 / frequency seconds. The frequency of the raw
|
The frequency of the raw timer varies depending on what time sources are
|
||||||
timer varies depending on the operating system and hardware. You can query the
|
available on the machine. You can query its frequency, in Hz, with @ref
|
||||||
frequency, in Hz, with @ref glfwGetTimerFrequency.
|
glfwGetTimerFrequency.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
uint64_t frequency = glfwGetTimerFrequency();
|
uint64_t freqency = glfwGetTimerFrequency();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
|
@ -932,11 +617,9 @@ converted to one, you can retrieve it with @ref glfwGetClipboardString. See the
|
||||||
reference documentation for the lifetime of the returned string.
|
reference documentation for the lifetime of the returned string.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
const char* text = glfwGetClipboardString(NULL);
|
const char* text = glfwGetClipboardString(window);
|
||||||
if (text)
|
if (text)
|
||||||
{
|
|
||||||
insert_text(text);
|
insert_text(text);
|
||||||
}
|
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If the clipboard is empty or if its contents could not be converted, `NULL` is
|
If the clipboard is empty or if its contents could not be converted, `NULL` is
|
||||||
|
@ -946,9 +629,13 @@ The contents of the system clipboard can be set to a UTF-8 encoded string with
|
||||||
@ref glfwSetClipboardString.
|
@ref glfwSetClipboardString.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetClipboardString(NULL, "A string with words in it");
|
glfwSetClipboardString(window, "A string with words in it");
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
The clipboard functions take a window handle argument because some window
|
||||||
|
systems require a window to communicate with the system clipboard. Any valid
|
||||||
|
window may be used.
|
||||||
|
|
||||||
|
|
||||||
@section path_drop Path drop input
|
@section path_drop Path drop input
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,8 @@ The public interface uses the OpenGL naming conventions except with GLFW and
|
||||||
glfw instead of GL and gl. For struct members, where OpenGL sets no precedent,
|
glfw instead of GL and gl. For struct members, where OpenGL sets no precedent,
|
||||||
it use headless camel case.
|
it use headless camel case.
|
||||||
|
|
||||||
Examples: `glfwCreateWindow`, `GLFWwindow`, `GLFW_RED_BITS`
|
Examples: @ref glfwCreateWindow, @ref GLFWwindow, @ref GLFWvidmode.redBits,
|
||||||
|
`GLFW_RED_BITS`
|
||||||
|
|
||||||
|
|
||||||
@section internals_native Native interface
|
@section internals_native Native interface
|
||||||
|
@ -33,7 +34,7 @@ The function names of the native interface are similar to those of the public
|
||||||
interface, but embeds the name of the interface that the returned handle is
|
interface, but embeds the name of the interface that the returned handle is
|
||||||
from.
|
from.
|
||||||
|
|
||||||
Examples: `glfwGetX11Window`, `glfwGetWGLContext`
|
Examples: @ref glfwGetX11Window, @ref glfwGetWGLContext
|
||||||
|
|
||||||
|
|
||||||
@section internals_internal Internal interface
|
@section internals_internal Internal interface
|
||||||
|
@ -49,7 +50,7 @@ a `_GLFWlibrary` struct named `_glfw`.
|
||||||
The internal interface uses the same style as the public interface, except all
|
The internal interface uses the same style as the public interface, except all
|
||||||
global names have a leading underscore.
|
global names have a leading underscore.
|
||||||
|
|
||||||
Examples: `_glfwIsValidContextConfig`, `_GLFWwindow`, `_glfw.monitorCount`
|
Examples: @ref _glfwIsValidContextConfig, @ref _GLFWwindow, `_glfw.currentRamp`
|
||||||
|
|
||||||
|
|
||||||
@section internals_platform Platform interface
|
@section internals_platform Platform interface
|
||||||
|
@ -61,21 +62,12 @@ application-provided callbacks. It is also prohibited from modifying the
|
||||||
platform-independent part of the internal structs. Instead, it calls the event
|
platform-independent part of the internal structs. Instead, it calls the event
|
||||||
interface when events interesting to GLFW are received.
|
interface when events interesting to GLFW are received.
|
||||||
|
|
||||||
The platform interface mostly mirrors those parts of the public interface that needs to
|
The platform interface mirrors those parts of the public interface that needs to
|
||||||
perform platform-specific operations on some or all platforms.
|
perform platform-specific operations on some or all platforms. The are also
|
||||||
|
named the same except that the glfw function prefix is replaced by
|
||||||
|
_glfwPlatform.
|
||||||
|
|
||||||
The window system bits of the platform API is called through the `_GLFWplatform` struct of
|
Examples: @ref _glfwPlatformCreateWindow
|
||||||
function pointers, to allow runtime selection of platform. This includes the window and
|
|
||||||
context creation, input and event processing, monitor and Vulkan surface creation parts of
|
|
||||||
GLFW. This is located in the global `_glfw` struct.
|
|
||||||
|
|
||||||
Examples: `_glfw.platform.createWindow`
|
|
||||||
|
|
||||||
The timer, threading and module loading bits of the platform API are plain functions with
|
|
||||||
a `_glfwPlatform` prefix, as these things are independent of what window system is being
|
|
||||||
used.
|
|
||||||
|
|
||||||
Examples: `_glfwPlatformGetTimerValue`
|
|
||||||
|
|
||||||
The platform interface also defines structs that contain platform-specific
|
The platform interface also defines structs that contain platform-specific
|
||||||
global and per-object state. Their names mirror those of the internal
|
global and per-object state. Their names mirror those of the internal
|
||||||
|
@ -87,7 +79,7 @@ These structs are incorporated as members into the internal interface structs
|
||||||
using special macros that name them after the specific interface used. This
|
using special macros that name them after the specific interface used. This
|
||||||
prevents shared code from accidentally using these members.
|
prevents shared code from accidentally using these members.
|
||||||
|
|
||||||
Examples: `window->win32.handle`, `_glfw.x11.display`
|
Examples: `window.win32.handle`, `_glfw.x11.display`
|
||||||
|
|
||||||
|
|
||||||
@section internals_event Event interface
|
@section internals_event Event interface
|
||||||
|
@ -99,7 +91,7 @@ application, either via callbacks, via window state changes or both.
|
||||||
The function names of the event interface use a `_glfwInput` prefix and the
|
The function names of the event interface use a `_glfwInput` prefix and the
|
||||||
ObjectEvent pattern.
|
ObjectEvent pattern.
|
||||||
|
|
||||||
Examples: `_glfwInputWindowFocus`, `_glfwInputCursorPos`
|
Examples: @ref _glfwInputWindowFocus, @ref _glfwInputCursorMotion
|
||||||
|
|
||||||
|
|
||||||
@section internals_static Static functions
|
@section internals_static Static functions
|
||||||
|
@ -107,17 +99,18 @@ Examples: `_glfwInputWindowFocus`, `_glfwInputCursorPos`
|
||||||
Static functions may be used by any interface and have no prefixes or suffixes.
|
Static functions may be used by any interface and have no prefixes or suffixes.
|
||||||
These use headless camel case.
|
These use headless camel case.
|
||||||
|
|
||||||
Examples: `isValidElementForJoystick`
|
Examples: `clearScrollOffsets`
|
||||||
|
|
||||||
|
|
||||||
@section internals_config Configuration macros
|
@section internals_config Configuration macros
|
||||||
|
|
||||||
GLFW uses a number of configuration macros to select at compile time which
|
GLFW uses a number of configuration macros to select at compile time which
|
||||||
interfaces and code paths to use. They are defined in the GLFW CMake target.
|
interfaces and code paths to use. They are defined in the glfw_config.h header file,
|
||||||
|
which is generated from the `glfw_config.h.in` file by CMake.
|
||||||
|
|
||||||
Configuration macros the same style as tokens in the public interface, except
|
Configuration macros the same style as tokens in the public interface, except
|
||||||
with a leading underscore.
|
with a leading underscore.
|
||||||
|
|
||||||
Examples: `_GLFW_WIN32`, `_GLFW_BUILD_DLL`
|
Examples: `_GLFW_HAS_XF86VM`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
442
docs/intro.dox
442
docs/intro.dox
|
@ -1,13 +1,13 @@
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
@page intro_guide Introduction to the API
|
@page intro_guide Introduction to the API
|
||||||
|
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide introduces the basic concepts of GLFW and describes initialization,
|
This guide introduces the basic concepts of GLFW and describes initialization reference
|
||||||
error handling and API guarantees and limitations. For a broad but shallow
|
error handling and API guarantees and limitations. For a broad but shallow
|
||||||
tutorial, see @ref quick_guide instead. For details on a specific function in
|
tutorial, see @ref quick_guide instead. For details on a specific function, see the
|
||||||
this category, see the @ref init.
|
[reference documentation](@ref init).
|
||||||
|
|
||||||
There are also guides for the other areas of GLFW.
|
There are also guides for the other areas of GLFW.
|
||||||
|
|
||||||
|
@ -22,25 +22,20 @@ There are also guides for the other areas of GLFW.
|
||||||
|
|
||||||
Before most GLFW functions may be called, the library must be initialized.
|
Before most GLFW functions may be called, the library must be initialized.
|
||||||
This initialization checks what features are available on the machine,
|
This initialization checks what features are available on the machine,
|
||||||
enumerates monitors, initializes the timer and performs any required
|
enumerates monitors and joysticks, initializes the timer and performs any
|
||||||
platform-specific initialization.
|
required platform-specific initialization.
|
||||||
|
|
||||||
Only the following functions may be called before the library has been
|
Only the following functions may be called before the library has been
|
||||||
successfully initialized, and only from the main thread.
|
successfully initialized, and only from the main thread.
|
||||||
|
|
||||||
- @ref glfwGetVersion
|
- @ref glfwGetVersion
|
||||||
- @ref glfwGetVersionString
|
- @ref glfwGetVersionString
|
||||||
- @ref glfwPlatformSupported
|
|
||||||
- @ref glfwGetError
|
|
||||||
- @ref glfwSetErrorCallback
|
- @ref glfwSetErrorCallback
|
||||||
- @ref glfwInitHint
|
|
||||||
- @ref glfwInitAllocator
|
|
||||||
- @ref glfwInitVulkanLoader
|
|
||||||
- @ref glfwInit
|
- @ref glfwInit
|
||||||
- @ref glfwTerminate
|
- @ref glfwTerminate
|
||||||
|
|
||||||
Calling any other function before successful initialization will cause a @ref
|
Calling any other function before that time will cause a @ref
|
||||||
GLFW_NOT_INITIALIZED error.
|
GLFW_NOT_INITIALIZED error.
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_init_init Initializing GLFW
|
@subsection intro_init_init Initializing GLFW
|
||||||
|
@ -55,215 +50,13 @@ if (!glfwInit())
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If any part of initialization fails, any parts that succeeded are terminated as
|
If any part of initialization fails, all remaining bits are terminated as if
|
||||||
if @ref glfwTerminate had been called. The library only needs to be initialized
|
@ref glfwTerminate was called. The library only needs to be initialized once
|
||||||
once and additional calls to an already initialized library will return
|
and additional calls to an already initialized library will simply return
|
||||||
`GLFW_TRUE` immediately.
|
`GLFW_TRUE` immediately.
|
||||||
|
|
||||||
Once the library has been successfully initialized, it should be terminated
|
Once the library has been successfully initialized, it should be terminated
|
||||||
before the application exits. Modern systems are very good at freeing resources
|
before the application exits.
|
||||||
allocated by programs that exit, but GLFW sometimes has to change global system
|
|
||||||
settings and these might not be restored without termination.
|
|
||||||
|
|
||||||
@macos When the library is initialized the main menu and dock icon are created.
|
|
||||||
These are not desirable for a command-line only program. The creation of the
|
|
||||||
main menu and dock icon can be disabled with the @ref GLFW_COCOA_MENUBAR init
|
|
||||||
hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection init_hints Initialization hints
|
|
||||||
|
|
||||||
Initialization hints are set before @ref glfwInit and affect how the library
|
|
||||||
behaves until termination. Hints are set with @ref glfwInitHint.
|
|
||||||
|
|
||||||
@code
|
|
||||||
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
|
|
||||||
be ignored until the library is terminated and initialized again.
|
|
||||||
|
|
||||||
Some hints are platform specific. These may be set on any platform but they
|
|
||||||
will only affect their specific platform. Other platforms will ignore them.
|
|
||||||
Setting these hints requires no platform specific headers or functions.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_shared Shared init hints
|
|
||||||
|
|
||||||
@anchor GLFW_PLATFORM
|
|
||||||
__GLFW_PLATFORM__ specifies the platform to use for windowing and input.
|
|
||||||
Possible values are `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`,
|
|
||||||
`GLFW_PLATFORM_COCOA`, `GLFW_PLATFORM_X11`, `GLFW_PLATFORM_WAYLAND` and
|
|
||||||
`GLFW_PLATFORM_NULL`. The default value is `GLFW_ANY_PLATFORM`, which will
|
|
||||||
choose any platform the library includes support for except for the Null
|
|
||||||
backend.
|
|
||||||
|
|
||||||
|
|
||||||
@anchor GLFW_JOYSTICK_HAT_BUTTONS
|
|
||||||
__GLFW_JOYSTICK_HAT_BUTTONS__ specifies whether to also expose joystick hats as
|
|
||||||
buttons, for compatibility with earlier versions of GLFW that did not have @ref
|
|
||||||
glfwGetJoystickHats. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
||||||
|
|
||||||
@anchor GLFW_ANGLE_PLATFORM_TYPE_hint
|
|
||||||
__GLFW_ANGLE_PLATFORM_TYPE__ specifies the platform type (rendering backend) to
|
|
||||||
request when using OpenGL ES and EGL via
|
|
||||||
[ANGLE](https://chromium.googlesource.com/angle/angle/). If the requested
|
|
||||||
platform type is unavailable, ANGLE will use its default. Possible values are
|
|
||||||
one of `GLFW_ANGLE_PLATFORM_TYPE_NONE`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGL`,
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_OPENGLES`, `GLFW_ANGLE_PLATFORM_TYPE_D3D9`,
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_D3D11`, `GLFW_ANGLE_PLATFORM_TYPE_VULKAN` and
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_METAL`.
|
|
||||||
|
|
||||||
The ANGLE platform type is specified via the `EGL_ANGLE_platform_angle`
|
|
||||||
extension. This extension is not used if this hint is
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_NONE`, which is the default value.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_osx macOS specific init hints
|
|
||||||
|
|
||||||
@anchor GLFW_COCOA_CHDIR_RESOURCES_hint
|
|
||||||
__GLFW_COCOA_CHDIR_RESOURCES__ specifies whether to set the current directory to
|
|
||||||
the application to the `Contents/Resources` subdirectory of the application's
|
|
||||||
bundle, if present. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
|
||||||
ignored on other platforms.
|
|
||||||
|
|
||||||
@anchor GLFW_COCOA_MENUBAR_hint
|
|
||||||
__GLFW_COCOA_MENUBAR__ specifies whether to create the menu bar and dock icon
|
|
||||||
when GLFW is initialized. This applies whether the menu bar is created from
|
|
||||||
a nib or manually by GLFW. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
|
||||||
This is ignored on other platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_x11 X11 specific init hints
|
|
||||||
|
|
||||||
@anchor GLFW_X11_XCB_VULKAN_SURFACE_hint
|
|
||||||
__GLFW_X11_XCB_VULKAN_SURFACE__ specifies whether to prefer the
|
|
||||||
`VK_KHR_xcb_surface` extension for creating Vulkan surfaces, or whether to use
|
|
||||||
the `VK_KHR_xlib_surface` extension. Possible values are `GLFW_TRUE` and
|
|
||||||
`GLFW_FALSE`. This is ignored on other platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_wayland Wayland specific init hints
|
|
||||||
|
|
||||||
@anchor GLFW_WAYLAND_LIBDECOR_hint
|
|
||||||
__GLFW_WAYLAND_LIBDECOR__ specifies whether to use
|
|
||||||
[libdecor](https://gitlab.freedesktop.org/libdecor/libdecor) for window
|
|
||||||
decorations where available. Possible values are `GLFW_WAYLAND_PREFER_LIBDECOR`
|
|
||||||
and `GLFW_WAYLAND_DISABLE_LIBDECOR`. This is ignored on other platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_values Supported and default values
|
|
||||||
|
|
||||||
Initialization hint | Default value | Supported values
|
|
||||||
-------------------------------- | ------------------------------- | ----------------
|
|
||||||
@ref GLFW_PLATFORM | `GLFW_ANY_PLATFORM` | `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, `GLFW_PLATFORM_X11`, `GLFW_PLATFORM_WAYLAND` or `GLFW_PLATFORM_NULL`
|
|
||||||
@ref GLFW_JOYSTICK_HAT_BUTTONS | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
@ref GLFW_ANGLE_PLATFORM_TYPE | `GLFW_ANGLE_PLATFORM_TYPE_NONE` | `GLFW_ANGLE_PLATFORM_TYPE_NONE`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGL`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGLES`, `GLFW_ANGLE_PLATFORM_TYPE_D3D9`, `GLFW_ANGLE_PLATFORM_TYPE_D3D11`, `GLFW_ANGLE_PLATFORM_TYPE_VULKAN` or `GLFW_ANGLE_PLATFORM_TYPE_METAL`
|
|
||||||
@ref GLFW_COCOA_CHDIR_RESOURCES | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
@ref GLFW_COCOA_MENUBAR | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
@ref GLFW_X11_XCB_VULKAN_SURFACE | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
@ref GLFW_WAYLAND_LIBDECOR | `GLFW_WAYLAND_PREFER_LIBDECOR` | `GLFW_WAYLAND_PREFER_LIBDECOR` or `GLFW_WAYLAND_DISABLE_LIBDECOR`
|
|
||||||
|
|
||||||
|
|
||||||
@subsection platform Runtime platform selection
|
|
||||||
|
|
||||||
GLFW can be compiled for more than one platform (window system) at once. This lets
|
|
||||||
a single library binary support both X11 and Wayland on Linux and other Unix-like systems.
|
|
||||||
|
|
||||||
You can control platform selection via the @ref GLFW_PLATFORM initialization hint. By
|
|
||||||
default, this is set to @ref GLFW_ANY_PLATFORM, which will look for supported window
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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
|
|
||||||
selected platform.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection init_allocator Custom heap memory allocator
|
|
||||||
|
|
||||||
The heap memory allocator can be customized before initialization with @ref
|
|
||||||
glfwInitAllocator.
|
|
||||||
|
|
||||||
@code
|
|
||||||
GLFWallocator allocator;
|
|
||||||
allocator.allocate = my_malloc;
|
|
||||||
allocator.reallocate = my_realloc;
|
|
||||||
allocator.deallocate = my_free;
|
|
||||||
allocator.user = NULL;
|
|
||||||
|
|
||||||
glfwInitAllocator(&allocator);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The allocator will be picked up at the beginning of initialization and will be
|
|
||||||
used until GLFW has been fully terminated. Any allocator set after
|
|
||||||
initialization will be picked up only at the next initialization.
|
|
||||||
|
|
||||||
The allocator will only be used for allocations that would have been made with
|
|
||||||
the C standard library. Memory allocations that must be made with platform
|
|
||||||
specific APIs will still use those.
|
|
||||||
|
|
||||||
The allocation function must have a signature matching @ref GLFWallocatefun. It receives
|
|
||||||
the desired size, in bytes, and the user pointer passed to @ref glfwInitAllocator and
|
|
||||||
returns the address to the allocated memory block.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void* my_malloc(size_t size, void* user)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The reallocation function must have a function signature matching @ref GLFWreallocatefun.
|
|
||||||
It receives the memory block to be reallocated, the new desired size, in bytes, and the user
|
|
||||||
pointer passed to @ref glfwInitAllocator and returns the address to the resized memory
|
|
||||||
block.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void* my_realloc(void* block, size_t size, void* user)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The deallocation function must have a function signature matching @ref GLFWdeallocatefun.
|
|
||||||
It receives the memory block to be deallocated and the user pointer passed to @ref
|
|
||||||
glfwInitAllocator.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void my_free(void* block, void* user)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_init_terminate Terminating GLFW
|
@subsection intro_init_terminate Terminating GLFW
|
||||||
|
@ -277,110 +70,75 @@ glfwTerminate();
|
||||||
|
|
||||||
This will destroy any remaining window, monitor and cursor objects, restore any
|
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
|
modified gamma ramps, re-enable the screensaver if it had been disabled and free
|
||||||
any other resources allocated by GLFW.
|
any resources allocated by GLFW.
|
||||||
|
|
||||||
Once the library is terminated, it is as if it had never been initialized, therefore
|
Once the library is terminated, it is as if it had never been initialized and
|
||||||
you will need to initialize it again before being able to use GLFW. If the
|
you will need to initialize it again before being able to use GLFW. If the
|
||||||
library was not initialized or had already been terminated, it returns
|
library was not initialized or had already been terminated, it return
|
||||||
immediately.
|
immediately.
|
||||||
|
|
||||||
|
|
||||||
@section error_handling Error handling
|
@section error_handling Error handling
|
||||||
|
|
||||||
Some GLFW functions have return values that indicate an error, but this is often
|
Some GLFW functions have return values that indicate an error, but this is often
|
||||||
not very helpful when trying to figure out what happened or why it occurred.
|
not very helpful when trying to figure out _why_ the error occurred. Some
|
||||||
Other functions have no return value reserved for errors, so error notification
|
functions also return otherwise valid values on error. Finally, far from all
|
||||||
needs a separate channel. Finally, far from all GLFW functions have return
|
GLFW functions have return values.
|
||||||
values.
|
|
||||||
|
|
||||||
The last [error code](@ref errors) for the calling thread can be queried at any
|
This is where the error callback comes in. This callback is called whenever an
|
||||||
time with @ref glfwGetError.
|
error occurs. It is set with @ref glfwSetErrorCallback, a function that may be
|
||||||
|
called regardless of whether GLFW is initialized.
|
||||||
@code
|
|
||||||
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.
|
|
||||||
|
|
||||||
The error code indicates the general category of the error. Some error codes,
|
|
||||||
such as @ref GLFW_NOT_INITIALIZED has only a single meaning, whereas others like
|
|
||||||
@ref GLFW_PLATFORM_ERROR are used for many different errors.
|
|
||||||
|
|
||||||
GLFW often has more information about an error than its general category. You
|
|
||||||
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
You can also set an error callback, which will be called each time an error
|
|
||||||
occurs. It is set with @ref glfwSetErrorCallback.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The error callback receives the same error code and human-readable description
|
The error callback receives a human-readable description of the error and (when
|
||||||
returned by @ref glfwGetError.
|
possible) its cause. The description encoded as UTF-8. The callback is also
|
||||||
|
provided with an [error code](@ref errors).
|
||||||
|
|
||||||
@code
|
@code
|
||||||
void error_callback(int code, const char* description)
|
void error_callback(int error, const char* description)
|
||||||
{
|
{
|
||||||
display_error_message(code, description);
|
puts(description);
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The error callback is called after the error is stored, so calling @ref
|
The error code indicates the general category of the error. Some error codes,
|
||||||
glfwGetError from within the error callback returns the same values as the
|
such as @ref GLFW_NOT_INITIALIZED has only a single meaning, whereas others like
|
||||||
callback argument.
|
@ref GLFW_PLATFORM_ERROR are used for many different errors.
|
||||||
|
|
||||||
The description string passed to the callback is only valid until the error
|
The description string is only valid until the error callback returns, as it may
|
||||||
callback returns. This means you must make a copy of it if you want to keep it.
|
have been generated specifically for that error. This lets GLFW provide much
|
||||||
|
more specific error descriptions but means you must make a copy if you want to
|
||||||
|
keep the description string.
|
||||||
|
|
||||||
__Reported errors are never fatal.__ As long as GLFW was successfully
|
@note Relying on erroneous behavior is not forward compatible. In other words,
|
||||||
initialized, it will remain initialized and in a safe state until terminated
|
do not rely on a currently invalid call to generate a specific error, as that
|
||||||
regardless of how many errors occur. If an error occurs during initialization
|
same call may in future versions generate a different error or become valid.
|
||||||
that causes @ref glfwInit to fail, any part of the library that was initialized
|
|
||||||
will be safely terminated.
|
|
||||||
|
|
||||||
Do not rely on a currently invalid call to generate a specific error, as in the
|
|
||||||
future that same call may generate a different error or become valid.
|
|
||||||
|
|
||||||
|
|
||||||
@section coordinate_systems Coordinate systems
|
@section coordinate_systems Coordinate systems
|
||||||
|
|
||||||
GLFW has two primary coordinate systems: the _virtual screen_ and the window
|
GLFW has two primary coordinate systems: the _virtual screen_ and the window
|
||||||
_content area_ or _content area_. Both use the same unit: _virtual screen
|
_client area_ or _content area_. Both use the same unit: _virtual screen
|
||||||
coordinates_, or just _screen coordinates_, which don't necessarily correspond
|
coordinates_, or just _screen coordinates_, which don't necessarily correspond
|
||||||
to pixels.
|
to pixels.
|
||||||
|
|
||||||
<img src="spaces.svg" width="90%" />
|
<img src="spaces.svg" width="90%" />
|
||||||
|
|
||||||
Both the virtual screen and the content area coordinate systems have the X-axis
|
Both the virtual screen and the client area coordinate systems have the X-axis
|
||||||
pointing to the right and the Y-axis pointing down.
|
pointing to the right and the Y-axis pointing down.
|
||||||
|
|
||||||
Window and monitor positions are specified as the position of the upper-left
|
Window and monitor positions are specified as the position of the upper-left
|
||||||
corners of their content areas relative to the virtual screen, while cursor
|
corners of their content areas relative to the virtual screen, while cursor
|
||||||
positions are specified relative to a window's content area.
|
positions are specified relative to a window's client area.
|
||||||
|
|
||||||
Because the origin of the window's content area coordinate system is also the
|
Because the origin of the window's client area coordinate system is also the
|
||||||
point from which the window position is specified, you can translate content
|
point from which the window position is specified, you can translate client area
|
||||||
area coordinates to the virtual screen by adding the window position. The
|
coordinates to the virtual screen by adding the window position. The window
|
||||||
window frame, when present, extends out from the content area but does not
|
frame, when present, extends out from the client area but does not affect the
|
||||||
affect the window position.
|
window position.
|
||||||
|
|
||||||
Almost all positions and sizes in GLFW are measured in screen coordinates
|
Almost all positions and sizes in GLFW are measured in screen coordinates
|
||||||
relative to one of the two origins above. This includes cursor positions,
|
relative to one of the two origins above. This includes cursor positions,
|
||||||
|
@ -401,14 +159,14 @@ which monitor the window is currently considered to be on.
|
||||||
|
|
||||||
This section describes the conditions under which GLFW can be expected to
|
This section describes the conditions under which GLFW can be expected to
|
||||||
function, barring bugs in the operating system or drivers. Use of GLFW outside
|
function, barring bugs in the operating system or drivers. Use of GLFW outside
|
||||||
these limits may work on some platforms, or on some machines, or some of the
|
of these limits may work on some platforms, or on some machines, or some of the
|
||||||
time, or on some versions of GLFW, but it may break at any time and this will
|
time, or on some versions of GLFW, but it may break at any time and this will
|
||||||
not be considered a bug.
|
not be considered a bug.
|
||||||
|
|
||||||
|
|
||||||
@subsection lifetime Pointer lifetimes
|
@subsection lifetime Pointer lifetimes
|
||||||
|
|
||||||
GLFW will never free any pointer you provide to it, and you must never free any
|
GLFW will never free any pointer you provide to it and you must never free any
|
||||||
pointer it provides to you.
|
pointer it provides to you.
|
||||||
|
|
||||||
Many GLFW functions return pointers to dynamically allocated structures, strings
|
Many GLFW functions return pointers to dynamically allocated structures, strings
|
||||||
|
@ -428,10 +186,14 @@ releases.
|
||||||
|
|
||||||
@subsection reentrancy Reentrancy
|
@subsection reentrancy Reentrancy
|
||||||
|
|
||||||
GLFW event processing and object destruction are not reentrant. This means that
|
GLFW event processing and object creation and destruction are not reentrant.
|
||||||
the following functions must not be called from any callback function:
|
This means that the following functions must not be called from any callback
|
||||||
|
function:
|
||||||
|
|
||||||
|
- @ref glfwCreateWindow
|
||||||
- @ref glfwDestroyWindow
|
- @ref glfwDestroyWindow
|
||||||
|
- @ref glfwCreateCursor
|
||||||
|
- @ref glfwCreateStandardCursor
|
||||||
- @ref glfwDestroyCursor
|
- @ref glfwDestroyCursor
|
||||||
- @ref glfwPollEvents
|
- @ref glfwPollEvents
|
||||||
- @ref glfwWaitEvents
|
- @ref glfwWaitEvents
|
||||||
|
@ -444,39 +206,35 @@ functions not on this list will not be made non-reentrant.
|
||||||
|
|
||||||
@subsection thread_safety Thread safety
|
@subsection thread_safety Thread safety
|
||||||
|
|
||||||
Most GLFW functions must only be called from the main thread (the thread that
|
Most GLFW functions must only be called from the main thread, but some may be
|
||||||
calls main), but some may be called from any thread once the library has been
|
called from any thread. However, no GLFW function may be called from any thread
|
||||||
initialized. Before initialization the whole library is thread-unsafe.
|
but the main thread until GLFW has been successfully initialized, including
|
||||||
|
functions that may called before initialization.
|
||||||
|
|
||||||
The reference documentation for every GLFW function states whether it is limited
|
The reference documentation for every GLFW function states whether it is limited
|
||||||
to the main thread.
|
to the main thread.
|
||||||
|
|
||||||
Initialization, termination, event processing and the creation and
|
Initialization and termination, event processing and the creation and
|
||||||
destruction of windows, cursors and OpenGL and OpenGL ES contexts are all
|
destruction of windows, contexts and cursors are all limited to the main thread
|
||||||
restricted to the main thread due to limitations of one or several platforms.
|
due to limitations of one or several platforms.
|
||||||
|
|
||||||
Because event processing must be performed on the main thread, all callbacks
|
Because event processing must be performed on the main thread, all callbacks
|
||||||
except for the error callback will only be called on that thread. The error
|
except for the error callback will only be called on that thread. The error
|
||||||
callback may be called on any thread, as any GLFW function may generate errors.
|
callback may be called on any thread, as any GLFW function may generate errors.
|
||||||
|
|
||||||
The error code and description may be queried from any thread.
|
The posting of empty events may be done from any thread. The window user
|
||||||
|
pointer and close flag may also be accessed and modified from any thread, but
|
||||||
- @ref glfwGetError
|
this is not synchronized by GLFW. The following window related functions may
|
||||||
|
be called from any thread:
|
||||||
Empty events may be posted from any thread.
|
|
||||||
|
|
||||||
- @ref glfwPostEmptyEvent
|
- @ref glfwPostEmptyEvent
|
||||||
|
|
||||||
The window user pointer and close flag may be read and written from any thread,
|
|
||||||
but this is not synchronized by GLFW.
|
|
||||||
|
|
||||||
- @ref glfwGetWindowUserPointer
|
- @ref glfwGetWindowUserPointer
|
||||||
- @ref glfwSetWindowUserPointer
|
- @ref glfwSetWindowUserPointer
|
||||||
- @ref glfwWindowShouldClose
|
- @ref glfwWindowShouldClose
|
||||||
- @ref glfwSetWindowShouldClose
|
- @ref glfwSetWindowShouldClose
|
||||||
|
|
||||||
These functions for working with OpenGL and OpenGL ES contexts may be called
|
Rendering may be done on any thread. The following context related functions
|
||||||
from any thread, but the window object is not synchronized by GLFW.
|
may be called from any thread:
|
||||||
|
|
||||||
- @ref glfwMakeContextCurrent
|
- @ref glfwMakeContextCurrent
|
||||||
- @ref glfwGetCurrentContext
|
- @ref glfwGetCurrentContext
|
||||||
|
@ -485,28 +243,27 @@ from any thread, but the window object is not synchronized by GLFW.
|
||||||
- @ref glfwExtensionSupported
|
- @ref glfwExtensionSupported
|
||||||
- @ref glfwGetProcAddress
|
- @ref glfwGetProcAddress
|
||||||
|
|
||||||
The raw timer functions may be called from any thread.
|
The raw timer may be queried from any thread. The following raw timer related
|
||||||
|
functions may be called from any thread:
|
||||||
|
|
||||||
- @ref glfwGetTimerFrequency
|
- @ref glfwGetTimerFrequency
|
||||||
- @ref glfwGetTimerValue
|
- @ref glfwGetTimerValue
|
||||||
|
|
||||||
The regular timer may be used from any thread, but reading and writing the timer
|
The regular timer may be used from any thread, but the reading and writing of
|
||||||
offset is not synchronized by GLFW.
|
the timer offset is not synchronized by GLFW. The following timer related
|
||||||
|
functions may be called from any thread:
|
||||||
|
|
||||||
- @ref glfwGetTime
|
- @ref glfwGetTime
|
||||||
- @ref glfwSetTime
|
- @ref glfwSetTime
|
||||||
|
|
||||||
Library version information may be queried from any thread.
|
Library version information may be queried from any thread. The following
|
||||||
|
version related functions may be called from any thread:
|
||||||
|
|
||||||
- @ref glfwGetVersion
|
- @ref glfwGetVersion
|
||||||
- @ref glfwGetVersionString
|
- @ref glfwGetVersionString
|
||||||
|
|
||||||
Platform information may be queried from any thread.
|
Vulkan objects may be created and information queried from any thread. The
|
||||||
|
following Vulkan related functions may be called from any thread:
|
||||||
- @ref glfwPlatformSupported
|
|
||||||
- @ref glfwGetPlatform
|
|
||||||
|
|
||||||
All Vulkan related functions may be called from any thread.
|
|
||||||
|
|
||||||
- @ref glfwVulkanSupported
|
- @ref glfwVulkanSupported
|
||||||
- @ref glfwGetRequiredInstanceExtensions
|
- @ref glfwGetRequiredInstanceExtensions
|
||||||
|
@ -514,9 +271,9 @@ All Vulkan related functions may be called from any thread.
|
||||||
- @ref glfwGetPhysicalDevicePresentationSupport
|
- @ref glfwGetPhysicalDevicePresentationSupport
|
||||||
- @ref glfwCreateWindowSurface
|
- @ref glfwCreateWindowSurface
|
||||||
|
|
||||||
GLFW uses synchronization objects internally only to manage the per-thread
|
GLFW uses no synchronization objects internally except for thread-local storage
|
||||||
context and error states. Additional synchronization is left to the
|
to keep track of the current context for each thread. Synchronization is left
|
||||||
application.
|
to the application.
|
||||||
|
|
||||||
Functions that may currently be called from any thread will always remain so,
|
Functions that may currently be called from any thread will always remain so,
|
||||||
but functions that are currently limited to the main thread may be updated to
|
but functions that are currently limited to the main thread may be updated to
|
||||||
|
@ -525,10 +282,9 @@ allow calls from any thread in future releases.
|
||||||
|
|
||||||
@subsection compatibility Version compatibility
|
@subsection compatibility Version compatibility
|
||||||
|
|
||||||
GLFW uses [Semantic Versioning](https://semver.org/). This guarantees source
|
GLFW guarantees binary backward compatibility with earlier minor versions of the
|
||||||
and binary backward compatibility with earlier minor versions of the API. This
|
API. This means that you can drop in a newer version of the GLFW DLL / shared
|
||||||
means that you can drop in a newer version of the library and existing programs
|
library / dynamic library and existing applications will continue to run.
|
||||||
will continue to compile and existing binaries will continue to run.
|
|
||||||
|
|
||||||
Once a function or constant has been added, the signature of that function or
|
Once a function or constant has been added, the signature of that function or
|
||||||
value of that constant will remain unchanged until the next major version of
|
value of that constant will remain unchanged until the next major version of
|
||||||
|
@ -538,9 +294,8 @@ Undocumented behavior, i.e. behavior that is not described in the documentation,
|
||||||
may change at any time until it is documented.
|
may change at any time until it is documented.
|
||||||
|
|
||||||
If the reference documentation and the implementation differ, the reference
|
If the reference documentation and the implementation differ, the reference
|
||||||
documentation will almost always take precedence and the implementation will be
|
documentation is correct and the implementation will be fixed in the next
|
||||||
fixed in the next release. The reference documentation will also take
|
release.
|
||||||
precedence over anything stated in a guide.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection event_order Event order
|
@subsection event_order Event order
|
||||||
|
@ -598,32 +353,17 @@ __Do not use the version string__ to parse the GLFW library version. The @ref
|
||||||
glfwGetVersion function already provides the version of the running library
|
glfwGetVersion function already provides the version of the running library
|
||||||
binary.
|
binary.
|
||||||
|
|
||||||
__Do not use the version string__ to parse what platforms are supported. The @ref
|
|
||||||
glfwPlatformSupported function lets you query platform support.
|
|
||||||
|
|
||||||
__GLFW 3.4:__ The format of this string was changed to support the addition of
|
|
||||||
[runtime platform selection](@ref platform).
|
|
||||||
|
|
||||||
The format of the string is as follows:
|
The format of the string is as follows:
|
||||||
- The version of GLFW
|
- The version of GLFW
|
||||||
- For each supported platform:
|
- The name of the window system API
|
||||||
- The name of the window system API
|
- The name of the context creation API
|
||||||
- The name of the window system specific context creation API, if applicable
|
- Any additional options or APIs
|
||||||
- The names of the always supported context creation APIs EGL and OSMesa
|
|
||||||
- Any additional compile-time options, APIs and (on Windows) what compiler was used
|
|
||||||
|
|
||||||
For example, compiling GLFW 3.4 with MinGW as a DLL for Windows, may result in a version string
|
For example, when compiling GLFW 3.0 with MinGW using the Win32 and WGL
|
||||||
like this:
|
back ends, the version string may look something like this:
|
||||||
|
|
||||||
@code
|
@code
|
||||||
3.4.0 Win32 WGL Null EGL OSMesa MinGW DLL
|
3.0.0 Win32 WGL MinGW
|
||||||
@endcode
|
|
||||||
|
|
||||||
Compiling GLFW as a static library for Linux, with both Wayland and X11 enabled, may
|
|
||||||
result in a version string like this:
|
|
||||||
|
|
||||||
@code
|
|
||||||
3.4.0 Wayland X11 GLX Null EGL OSMesa monotonic
|
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,7 +8,8 @@ GLFW is a free, Open Source, multi-platform library for OpenGL, OpenGL ES and
|
||||||
Vulkan application development. It provides a simple, platform-independent API
|
Vulkan application development. It provides a simple, platform-independent API
|
||||||
for creating windows, contexts and surfaces, reading input, handling events, etc.
|
for creating windows, contexts and surfaces, reading input, handling events, etc.
|
||||||
|
|
||||||
@ref news_34 list new features, caveats and deprecations.
|
See @ref news_32 for release highlights or the
|
||||||
|
[version history](http://www.glfw.org/changelog.html) for details.
|
||||||
|
|
||||||
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
||||||
write a small but complete program.
|
write a small but complete program.
|
||||||
|
@ -33,14 +34,14 @@ use the new API.
|
||||||
There is a section on @ref guarantees_limitations for pointer lifetimes,
|
There is a section on @ref guarantees_limitations for pointer lifetimes,
|
||||||
reentrancy, thread safety, event order and backward and forward compatibility.
|
reentrancy, thread safety, event order and backward and forward compatibility.
|
||||||
|
|
||||||
The [FAQ](https://www.glfw.org/faq.html) answers many common questions about the
|
The [FAQ](http://www.glfw.org/faq.html) answers many common questions about the
|
||||||
design, implementation and use of GLFW.
|
design, implementation and use of GLFW.
|
||||||
|
|
||||||
Finally, @ref compat_guide explains what APIs, standards and protocols GLFW uses
|
Finally, @ref compat_guide explains what APIs, standards and protocols GLFW uses
|
||||||
and what happens when they are not present on a given machine.
|
and what happens when they are not present on a given machine.
|
||||||
|
|
||||||
This documentation was generated with Doxygen. The sources for it are available
|
This documentation was generated with Doxygen. The sources for it are available
|
||||||
in both the [source distribution](https://www.glfw.org/download.html) and
|
in both the [source distribution](http://www.glfw.org/download.html) and
|
||||||
[GitHub repository](https://github.com/glfw/glfw).
|
[GitHub repository](https://github.com/glfw/glfw).
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -5,13 +5,12 @@
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide introduces the monitor related functions of GLFW. For details on
|
This guide introduces the monitor related functions of GLFW. For details on
|
||||||
a specific function in this category, see the @ref monitor. There are also
|
a specific function, see the [reference documentation](@ref monitor). There are
|
||||||
guides for the other areas of GLFW.
|
also guides for the other areas of GLFW.
|
||||||
|
|
||||||
- @ref intro_guide
|
- @ref intro_guide
|
||||||
- @ref window_guide
|
- @ref window_guide
|
||||||
- @ref context_guide
|
- @ref context_guide
|
||||||
- @ref vulkan_guide
|
|
||||||
- @ref input_guide
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,23 +84,21 @@ void monitor_callback(GLFWmonitor* monitor, int event)
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If a monitor is disconnected, all windows that are full screen on it will be
|
If a monitor is disconnected, any windows that are full screen on it get forced
|
||||||
switched to windowed mode before the callback is called. Only @ref
|
into windowed mode.
|
||||||
glfwGetMonitorName and @ref glfwGetMonitorUserPointer will return useful values
|
|
||||||
for a disconnected monitor and only before the monitor callback returns.
|
|
||||||
|
|
||||||
|
|
||||||
@section monitor_properties Monitor properties
|
@section monitor_properties Monitor properties
|
||||||
|
|
||||||
Each monitor has a current video mode, a list of supported video modes,
|
Each monitor has a current video mode, a list of supported video modes,
|
||||||
a virtual position, a content scale, a human-readable name, a user pointer, an
|
a virtual position, a human-readable name, an estimated physical size and
|
||||||
estimated physical size and a gamma ramp.
|
a gamma ramp.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_modes Video modes
|
@subsection monitor_modes Video modes
|
||||||
|
|
||||||
GLFW generally does a good job selecting a suitable video mode when you create
|
GLFW generally does a good job selecting a suitable video mode when you create
|
||||||
a full screen window, change its video mode or make a windowed one full
|
a full screen window, change its video mode or or make a windowed one full
|
||||||
screen, but it is sometimes useful to know exactly which video modes are
|
screen, but it is sometimes useful to know exactly which video modes are
|
||||||
supported.
|
supported.
|
||||||
|
|
||||||
|
@ -133,36 +130,17 @@ current _resolution_, i.e. the width and height of its current
|
||||||
[video mode](@ref monitor_modes).
|
[video mode](@ref monitor_modes).
|
||||||
|
|
||||||
@code
|
@code
|
||||||
int width_mm, height_mm;
|
int widthMM, heightMM;
|
||||||
glfwGetMonitorPhysicalSize(monitor, &width_mm, &height_mm);
|
glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
While this can be used to calculate the raw DPI of a monitor, this is often not
|
This can, for example, be used together with the current video mode to calculate
|
||||||
useful. Instead, use the [monitor content scale](@ref monitor_scale) and
|
the DPI of a monitor.
|
||||||
[window content scale](@ref window_scale) to scale your content.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_scale Content scale
|
|
||||||
|
|
||||||
The content scale for a monitor can be retrieved with @ref
|
|
||||||
glfwGetMonitorContentScale.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
float xscale, yscale;
|
const double dpi = mode->width / (widthMM / 25.4);
|
||||||
glfwGetMonitorContentScale(monitor, &xscale, &yscale);
|
|
||||||
@endcode
|
@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
|
|
||||||
pixel dimensions of your UI scaled by this look appropriate on your machine then
|
|
||||||
it should appear at a reasonable size on other machines regardless of their DPI
|
|
||||||
and scaling settings. This relies on the system DPI and scaling settings being
|
|
||||||
somewhat correct.
|
|
||||||
|
|
||||||
The content scale may depend on both the monitor resolution and pixel density
|
|
||||||
and on user settings. It may be very different from the raw DPI calculated from
|
|
||||||
the physical size and current resolution.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_pos Virtual position
|
@subsection monitor_pos Virtual position
|
||||||
|
|
||||||
|
@ -176,18 +154,6 @@ glfwGetMonitorPos(monitor, &xpos, &ypos);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_workarea Work area
|
|
||||||
|
|
||||||
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
|
|
||||||
int xpos, ypos, width, height;
|
|
||||||
glfwGetMonitorWorkarea(monitor, &xpos, &ypos, &width, &height);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_name Human-readable name
|
@subsection monitor_name Human-readable name
|
||||||
|
|
||||||
The human-readable, UTF-8 encoded name of a monitor is returned by @ref
|
The human-readable, UTF-8 encoded name of a monitor is returned by @ref
|
||||||
|
@ -203,17 +169,6 @@ and make may have the same name. Only the monitor handle is guaranteed to be
|
||||||
unique, and only until that monitor is disconnected.
|
unique, and only until that monitor is disconnected.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_userptr User pointer
|
|
||||||
|
|
||||||
Each monitor has a user pointer that can be set with @ref
|
|
||||||
glfwSetMonitorUserPointer and queried with @ref glfwGetMonitorUserPointer. This
|
|
||||||
can be used for any purpose you need and will not be modified by GLFW. The
|
|
||||||
value will be kept until the monitor is disconnected or until the library is
|
|
||||||
terminated.
|
|
||||||
|
|
||||||
The initial value of the pointer is `NULL`.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_gamma Gamma ramp
|
@subsection monitor_gamma Gamma ramp
|
||||||
|
|
||||||
The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts
|
The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts
|
||||||
|
@ -239,8 +194,8 @@ glfwSetGammaRamp(monitor, &ramp);
|
||||||
The gamma ramp data is copied before the function returns, so there is no need
|
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.
|
to keep it around once the ramp has been set.
|
||||||
|
|
||||||
It is recommended that your gamma ramp have the same size as the current gamma
|
@note It is recommended to use gamma ramps of size 256, as that is the size
|
||||||
ramp for that monitor.
|
supported by all graphics cards on all platforms.
|
||||||
|
|
||||||
The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See
|
The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See
|
||||||
the reference documentation for the lifetime of the returned structure.
|
the reference documentation for the lifetime of the returned structure.
|
||||||
|
@ -257,12 +212,4 @@ glfwSetGammaRamp with the resulting ramp.
|
||||||
glfwSetGamma(monitor, 1.0);
|
glfwSetGamma(monitor, 1.0);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
To experiment with gamma correction via the @ref glfwSetGamma function, run the
|
|
||||||
`gamma` test program.
|
|
||||||
|
|
||||||
@note The software controlled gamma ramp is applied _in addition_ to the
|
|
||||||
hardware gamma correction, which today is typically an approximation of sRGB
|
|
||||||
gamma. This means that setting a perfectly linear ramp, or gamma 1.0, will
|
|
||||||
produce the default (usually sRGB-like) behavior.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -38,9 +38,9 @@ The threading functions have been removed, including the per-thread sleep
|
||||||
function. They were fairly primitive, under-used, poorly integrated and took
|
function. They were fairly primitive, under-used, poorly integrated and took
|
||||||
time away from the focus of GLFW (i.e. context, input and window). There are
|
time away from the focus of GLFW (i.e. context, input and window). There are
|
||||||
better threading libraries available and native threading support is available
|
better threading libraries available and native threading support is available
|
||||||
in both [C++11](https://en.cppreference.com/w/cpp/thread) and
|
in both [C++11](http://en.cppreference.com/w/cpp/thread) and
|
||||||
[C11](https://en.cppreference.com/w/c/thread), both of which are gaining
|
[C11](http://en.cppreference.com/w/c/thread), both of which are gaining
|
||||||
traction.
|
traction.
|
||||||
|
|
||||||
If you wish to use the C++11 or C11 facilities but your compiler doesn't yet
|
If you wish to use the C++11 or C11 facilities but your compiler doesn't yet
|
||||||
support them, see the
|
support them, see the
|
||||||
|
@ -73,7 +73,7 @@ To become of sufficiently high quality to warrant keeping them in GLFW 3, they
|
||||||
would need not only to support other formats, but also modern extensions to
|
would need not only to support other formats, but also modern extensions to
|
||||||
OpenGL texturing. This would either add a number of external
|
OpenGL texturing. This would either add a number of external
|
||||||
dependencies (libjpeg, libpng, etc.), or force GLFW to ship with inline versions
|
dependencies (libjpeg, libpng, etc.), or force GLFW to ship with inline versions
|
||||||
of these libraries.
|
of these libraries.
|
||||||
|
|
||||||
As there already are libraries doing this, it is unnecessary both to duplicate
|
As there already are libraries doing this, it is unnecessary both to duplicate
|
||||||
the work and to tie the duplicate to GLFW. The resulting library would also be
|
the work and to tie the duplicate to GLFW. The resulting library would also be
|
||||||
|
@ -87,12 +87,12 @@ platform-independent, as both OpenGL and stdio are available wherever GLFW is.
|
||||||
@subsection moving_stdcall Removal of GLFWCALL macro
|
@subsection moving_stdcall Removal of GLFWCALL macro
|
||||||
|
|
||||||
The `GLFWCALL` macro, which made callback functions use
|
The `GLFWCALL` macro, which made callback functions use
|
||||||
[__stdcall](https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) on Windows,
|
[__stdcall](http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) on Windows,
|
||||||
has been removed. GLFW is written in C, not Pascal. Removing this macro means
|
has been removed. GLFW is written in C, not Pascal. Removing this macro means
|
||||||
there's one less thing for application programmers to remember, i.e. the
|
there's one less thing for application programmers to remember, i.e. the
|
||||||
requirement to mark all callback functions with `GLFWCALL`. It also simplifies
|
requirement to mark all callback functions with `GLFWCALL`. It also simplifies
|
||||||
the creation of DLLs and DLL link libraries, as there's no need to explicitly
|
the creation of DLLs and DLL link libraries, as there's no need to explicitly
|
||||||
disable `@n` entry point suffixes.
|
disable `@n` entry point suffixes.
|
||||||
|
|
||||||
@par Old syntax
|
@par Old syntax
|
||||||
@code
|
@code
|
||||||
|
@ -221,7 +221,7 @@ GLFW 2, windows and contexts created with GLFW 3 will never be destroyed unless
|
||||||
you choose them to be. Each window now has a close flag that is set to
|
you choose them to be. Each window now has a close flag that is set to
|
||||||
`GLFW_TRUE` when the user attempts to close that window. By default, nothing else
|
`GLFW_TRUE` when the user attempts to close that window. By default, nothing else
|
||||||
happens and the window stays visible. It is then up to you to either destroy
|
happens and the window stays visible. It is then up to you to either destroy
|
||||||
the window, take some other action or ignore the request.
|
the window, take some other action or simply ignore the request.
|
||||||
|
|
||||||
You can query the close flag at any time with @ref glfwWindowShouldClose and set
|
You can query the close flag at any time with @ref glfwWindowShouldClose and set
|
||||||
it at any time with @ref glfwSetWindowShouldClose.
|
it at any time with @ref glfwSetWindowShouldClose.
|
||||||
|
@ -243,7 +243,7 @@ while (!glfwWindowShouldClose(window))
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The close callback no longer returns a value. Instead, it is called after the
|
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
|
close flag has been set so it can override its value, if it chooses to, before
|
||||||
event processing completes. You may however not call @ref glfwDestroyWindow
|
event processing completes. You may however not call @ref glfwDestroyWindow
|
||||||
from the close callback (or any other window related callback).
|
from the close callback (or any other window related callback).
|
||||||
|
|
||||||
|
@ -350,11 +350,11 @@ from a repeat. Note that @ref glfwGetKey still returns only `GLFW_PRESS` or
|
||||||
|
|
||||||
GLFW 3 key tokens map to physical keys, unlike in GLFW 2 where they mapped to
|
GLFW 3 key tokens map to physical keys, unlike in GLFW 2 where they mapped to
|
||||||
the values generated by the current keyboard layout. The tokens are named
|
the values generated by the current keyboard layout. The tokens are named
|
||||||
according to the values they would have in the standard US layout, but this
|
according to the values they would have using the standard US layout, but this
|
||||||
is only a convenience, as most programmers are assumed to know that layout.
|
is only a convenience, as most programmers are assumed to know that layout.
|
||||||
This means that (for example) `GLFW_KEY_LEFT_BRACKET` is always a single key and
|
This means that (for example) `GLFW_KEY_LEFT_BRACKET` is always a single key and
|
||||||
is the same key in the same place regardless of what keyboard layouts the users
|
is the same key in the same place regardless of what keyboard layouts the users
|
||||||
of your program have.
|
of your program has.
|
||||||
|
|
||||||
The key input facility was never meant for text input, although using it that
|
The key input facility was never meant for text input, although using it that
|
||||||
way worked slightly better in GLFW 2. If you were using it to input text, you
|
way worked slightly better in GLFW 2. If you were using it to input text, you
|
||||||
|
@ -362,8 +362,8 @@ should be using the character callback instead, on both GLFW 2 and 3. This will
|
||||||
give you the characters being input, as opposed to the keys being pressed.
|
give you the characters being input, as opposed to the keys being pressed.
|
||||||
|
|
||||||
GLFW 3 has key tokens for all keys on a standard 105 key keyboard, so instead of
|
GLFW 3 has key tokens for all keys on a standard 105 key keyboard, so instead of
|
||||||
having to remember whether to check for `a` or `A`, you now check for
|
having to remember whether to check for `'a'` or `'A'`, you now check for
|
||||||
@ref GLFW_KEY_A.
|
`GLFW_KEY_A`.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_joystick Joystick function changes
|
@subsection moving_joystick Joystick function changes
|
||||||
|
@ -379,7 +379,7 @@ glfwGetJoystickAxes and @ref glfwGetJoystickButtons functions.
|
||||||
@subsection moving_mbcs Win32 MBCS support
|
@subsection moving_mbcs Win32 MBCS support
|
||||||
|
|
||||||
The Win32 port of GLFW 3 will not compile in
|
The Win32 port of GLFW 3 will not compile in
|
||||||
[MBCS mode](https://msdn.microsoft.com/en-us/library/5z097dxa.aspx).
|
[MBCS mode](http://msdn.microsoft.com/en-us/library/5z097dxa.aspx).
|
||||||
However, because the use of the Unicode version of the Win32 API doesn't affect
|
However, because the use of the Unicode version of the Win32 API doesn't affect
|
||||||
the process as a whole, but only those windows created using it, it's perfectly
|
the process as a whole, but only those windows created using it, it's perfectly
|
||||||
possible to call MBCS functions from other parts of the same application.
|
possible to call MBCS functions from other parts of the same application.
|
||||||
|
@ -434,7 +434,7 @@ GLFW 3 does not by default include the GLU header and GLU itself has been
|
||||||
deprecated by [Khronos](https://en.wikipedia.org/wiki/Khronos_Group). __New
|
deprecated by [Khronos](https://en.wikipedia.org/wiki/Khronos_Group). __New
|
||||||
projects should not use GLU__, but if you need it for legacy code that
|
projects should not use GLU__, but if you need it for legacy code that
|
||||||
has been moved to GLFW 3, you can request that the GLFW header includes it by
|
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.
|
defining `GLFW_INCLUDE_GLU` before the inclusion of the GLFW header.
|
||||||
|
|
||||||
@par Old syntax
|
@par Old syntax
|
||||||
@code
|
@code
|
||||||
|
@ -447,13 +447,6 @@ defining @ref GLFW_INCLUDE_GLU before the inclusion of the GLFW header.
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
There are many libraries that offer replacements for the functionality offered
|
|
||||||
by GLU. For the matrix helper functions, see math libraries like
|
|
||||||
[GLM](https://github.com/g-truc/glm) (for C++),
|
|
||||||
[linmath.h](https://github.com/datenwolf/linmath.h) (for C) and others. For the
|
|
||||||
tessellation functions, see for example
|
|
||||||
[libtess2](https://github.com/memononen/libtess2).
|
|
||||||
|
|
||||||
|
|
||||||
@section moving_tables Name change tables
|
@section moving_tables Name change tables
|
||||||
|
|
||||||
|
|
466
docs/news.dox
466
docs/news.dox
|
@ -1,292 +1,376 @@
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
@page news Release notes
|
@page news New features
|
||||||
|
|
||||||
@tableofcontents
|
@section news_32 New features in 3.2
|
||||||
|
|
||||||
|
|
||||||
@section news_34 Release notes for version 3.4
|
@subsection news_32_vulkan Support for Vulkan
|
||||||
|
|
||||||
@subsection features_34 New features in version 3.4
|
GLFW now supports basic integration with Vulkan with @ref glfwVulkanSupported,
|
||||||
|
@ref glfwGetRequiredInstanceExtensions, @ref glfwGetInstanceProcAddress, @ref
|
||||||
|
glfwGetPhysicalDevicePresentationSupport and @ref glfwCreateWindowSurface.
|
||||||
|
Vulkan header inclusion can be selected with
|
||||||
|
[GLFW_INCLUDE_VULKAN](@ref build_macros).
|
||||||
|
|
||||||
@subsubsection runtime_platform_34 Runtime platform selection
|
|
||||||
|
|
||||||
GLFW now supports being compiled for multiple backends and selecting between
|
@subsection news_32_setwindowmonitor Window mode switching
|
||||||
them at runtime with the @ref GLFW_PLATFORM init hint. After initialization the
|
|
||||||
selected platform can be queried with @ref glfwGetPlatform. You can check if
|
|
||||||
support for a given platform is compiled in with @ref glfwPlatformSupported.
|
|
||||||
|
|
||||||
|
GLFW now supports switching between windowed and full screen modes and updating
|
||||||
|
the monitor and desired resolution and refresh rate of full screen windows with
|
||||||
|
@ref glfwSetWindowMonitor.
|
||||||
|
|
||||||
@subsubsection standard_cursors_34 More standard cursors
|
|
||||||
|
|
||||||
GLFW now provides the standard cursor shapes @ref GLFW_RESIZE_NWSE_CURSOR and
|
@subsection news_32_maximize Window maxmimization support
|
||||||
@ref GLFW_RESIZE_NESW_CURSOR for diagonal resizing, @ref GLFW_RESIZE_ALL_CURSOR
|
|
||||||
for omnidirectional resizing and @ref GLFW_NOT_ALLOWED_CURSOR for showing an
|
|
||||||
action is not allowed.
|
|
||||||
|
|
||||||
Unlike the original set, these shapes may not be available everywhere and
|
GLFW now supports window maximization with @ref glfwMaximizeWindow and the
|
||||||
creation will then fail with the new @ref GLFW_CURSOR_UNAVAILABLE error.
|
[GLFW_MAXIMIZED](@ref window_attribs_wnd) window hint and attribute.
|
||||||
|
|
||||||
The cursors for horizontal and vertical resizing are now referred to as @ref
|
|
||||||
GLFW_RESIZE_EW_CURSOR and @ref GLFW_RESIZE_NS_CURSOR, and the pointing hand
|
|
||||||
cursor is now referred to as @ref GLFW_POINTING_HAND_CURSOR. The older names
|
|
||||||
are still available.
|
|
||||||
|
|
||||||
For more information see @ref cursor_standard.
|
@subsection news_32_focus Window input focus control
|
||||||
|
|
||||||
|
GLFW now supports giving windows input focus with @ref glfwFocusWindow.
|
||||||
|
|
||||||
@subsubsection mouse_passthrough_34 Mouse event passthrough
|
|
||||||
|
|
||||||
GLFW now provides the [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_hint)
|
@subsection news_32_sizelimits Window size limit support
|
||||||
window hint for making a window transparent to mouse input, lettings events pass
|
|
||||||
to whatever window is behind it. This can also be changed after window
|
|
||||||
creation with the matching [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib).
|
|
||||||
|
|
||||||
|
GLFW now supports setting both absolute and relative window size limits with
|
||||||
|
@ref glfwSetWindowSizeLimits and @ref glfwSetWindowAspectRatio.
|
||||||
|
|
||||||
@subsubsection wayland_libdecor_34 Wayland libdecor decorations
|
|
||||||
|
|
||||||
GLFW now supports improved fallback window decorations via
|
@subsection news_32_keyname Localized key names
|
||||||
[libdecor](https://gitlab.freedesktop.org/libdecor/libdecor).
|
|
||||||
|
|
||||||
Support for libdecor can be toggled before GLFW is initialized with the
|
GLFW now supports querying the localized name of printable keys with @ref
|
||||||
[GLFW_WAYLAND_LIBDECOR](@ref GLFW_WAYLAND_LIBDECOR_hint) init hint. It is
|
glfwGetKeyName, either by key token or by scancode.
|
||||||
enabled by default.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection wayland_app_id_34 Wayland app_id specification
|
@subsection news_32_waittimeout Wait for events with timeout
|
||||||
|
|
||||||
GLFW now supports specifying the app_id for a Wayland window using the
|
GLFW now supports waiting for events for a set amount of time with @ref
|
||||||
[GLFW_WAYLAND_APP_ID](@ref GLFW_WAYLAND_APP_ID_hint) window hint string.
|
glfwWaitEventsTimeout.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection features_34_angle_backend Support for ANGLE rendering backend selection
|
@subsection news_32_icon Window icon support
|
||||||
|
|
||||||
GLFW now provides the
|
GLFW now supports setting the icon of windows with @ref glfwSetWindowIcon.
|
||||||
[GLFW_ANGLE_PLATFORM_TYPE](@ref GLFW_ANGLE_PLATFORM_TYPE_hint) init hint for
|
|
||||||
requesting a specific rendering backend when using
|
|
||||||
[ANGLE](https://chromium.googlesource.com/angle/angle/) to create OpenGL ES
|
|
||||||
contexts.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection captured_cursor_34 Captured cursor mode
|
@subsection news_32_timer Raw timer access
|
||||||
|
|
||||||
GLFW now supports confining the cursor to the window content area with the @ref
|
GLFW now supports raw timer values with @ref glfwGetTimerValue and @ref
|
||||||
GLFW_CURSOR_CAPTURED cursor mode.
|
glfwGetTimerFrequency.
|
||||||
|
|
||||||
For more information see @ref cursor_mode.
|
|
||||||
|
|
||||||
|
@subsection news_32_joystick Joystick connection callback
|
||||||
|
|
||||||
@subsubsection features_34_init_allocator Support for custom memory allocator
|
GLFW now supports notifying when a joystick has been connected or disconnected
|
||||||
|
with @ref glfwSetJoystickCallback.
|
||||||
|
|
||||||
GLFW now supports plugging a custom memory allocator at initialization with @ref
|
|
||||||
glfwInitAllocator. The allocator is a struct of type @ref GLFWallocator with
|
|
||||||
function pointers corresponding to the standard library functions `malloc`,
|
|
||||||
`realloc` and `free`.
|
|
||||||
|
|
||||||
For more information see @ref init_allocator.
|
@subsection news_32_noapi Context-less windows
|
||||||
|
|
||||||
|
GLFW now supports creating windows without a OpenGL or OpenGL ES context with
|
||||||
|
[GLFW_NO_API](@ref window_hints_ctx).
|
||||||
|
|
||||||
@subsubsection features_34_position_hint Window hints for initial position
|
|
||||||
|
|
||||||
GLFW now provides the @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints for
|
@subsection news_32_contextapi Run-time context creation API selection
|
||||||
specifying the initial position of the window. This removes the need to create a hidden
|
|
||||||
window, move it and then show it. The default value of these hints is
|
|
||||||
`GLFW_ANY_POSITION`, which selects the previous behavior.
|
|
||||||
|
|
||||||
|
GLFW now supports selecting the context creation API at run-time with the
|
||||||
|
[GLFW_CONTEXT_CREATION_API](@ref window_hints_ctx) window hint value.
|
||||||
|
|
||||||
@subsubsection features_34_win32_keymenu Support for keyboard access to Windows window menu
|
|
||||||
|
|
||||||
GLFW now provides the
|
@subsection news_32_noerror Error-free context creation
|
||||||
[GLFW_WIN32_KEYBOARD_MENU](@ref GLFW_WIN32_KEYBOARD_MENU_hint) window hint for
|
|
||||||
enabling keyboard access to the window menu via the Alt+Space and
|
|
||||||
Alt-and-then-Space shortcuts. This may be useful for more GUI-oriented
|
|
||||||
applications.
|
|
||||||
|
|
||||||
|
GLFW now supports creating OpenGL and OpenGL ES contexts that do not emit errors
|
||||||
|
with the [GLFW_CONTEXT_NO_ERROR](@ref window_hints_ctx) window hint, provided
|
||||||
|
the machine supports the `GL_KHR_no_error` extension.
|
||||||
|
|
||||||
@subsection caveats Caveats for version 3.4
|
|
||||||
|
|
||||||
@subsubsection native_34 Multiple sets of native access functions
|
@subsection news_32_cmake CMake config-file package support
|
||||||
|
|
||||||
Because GLFW now supports runtime selection of platform (window system), a library binary
|
GLFW now supports being used as a
|
||||||
may export native access functions for multiple platforms. Starting with version 3.4 you
|
[config-file package](@ref build_link_cmake_package) from other projects for
|
||||||
must not assume that GLFW is running on a platform just because it exports native access
|
easy linking with the library and its dependencies.
|
||||||
functions for it. After initialization, you can query the selected platform with @ref
|
|
||||||
glfwGetPlatform.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection version_string_34 Version string format has been changed
|
@section news_31 New features in 3.1
|
||||||
|
|
||||||
Because GLFW now supports runtime selection of platform (window system), the version
|
These are the release highlights. For a full list of changes see the
|
||||||
string returned by @ref glfwGetVersionString has been expanded. It now contains the names
|
[version history](http://www.glfw.org/changelog.html).
|
||||||
of all APIs for all the platforms that the library binary supports.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection joysticks_34 Joystick support is initialized on demand
|
@subsection news_31_cursor Custom mouse cursor images
|
||||||
|
|
||||||
The joystick part of GLFW is now initialized when first used, primarily to work
|
GLFW now supports creating and setting both custom cursor images and standard
|
||||||
around faulty Windows drivers that cause DirectInput to take up to several
|
cursor shapes. They are created with @ref glfwCreateCursor or @ref
|
||||||
seconds to enumerate devices.
|
glfwCreateStandardCursor, set with @ref glfwSetCursor and destroyed with @ref
|
||||||
|
glfwDestroyCursor.
|
||||||
|
|
||||||
This change will usually not be observable. However, if your application waits
|
@see @ref cursor_object
|
||||||
for events without having first called any joystick function or created any
|
|
||||||
visible windows, the wait may never unblock as GLFW may not yet have subscribed
|
|
||||||
to joystick related OS events.
|
|
||||||
|
|
||||||
To work around this, call any joystick function before waiting for events, for
|
|
||||||
example by setting a [joystick callback](@ref joystick_event).
|
|
||||||
|
|
||||||
|
@subsection news_31_drop Path drop event
|
||||||
|
|
||||||
@subsubsection wayland_alpha_34 Frambuffer may lack alpha channel on older Wayland systems
|
GLFW now provides a callback for receiving the paths of files and directories
|
||||||
|
dropped onto GLFW windows. The callback is set with @ref glfwSetDropCallback.
|
||||||
|
|
||||||
On Wayland, when creating an EGL context on a machine lacking the new
|
@see @ref path_drop
|
||||||
`EGL_EXT_present_opaque` extension, the @ref GLFW_ALPHA_BITS window hint will be
|
|
||||||
ignored and the framebuffer will have no alpha channel. This is because some
|
|
||||||
Wayland compositors treat any buffer with an alpha channel as per-pixel
|
|
||||||
transparent.
|
|
||||||
|
|
||||||
If you want a per-pixel transparent window, see the
|
|
||||||
[GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) window
|
|
||||||
hint.
|
|
||||||
|
|
||||||
|
@subsection news_31_emptyevent Main thread wake-up
|
||||||
|
|
||||||
@subsubsection standalone_34 Tests and examples are disabled when built as a subproject
|
GLFW now provides the @ref glfwPostEmptyEvent function for posting an empty
|
||||||
|
event from another thread to the main thread event queue, causing @ref
|
||||||
|
glfwWaitEvents to return.
|
||||||
|
|
||||||
GLFW now does not build the tests and examples when it is added as
|
@see @ref events
|
||||||
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}
|
|
||||||
set(GLFW_BUILD_EXAMPLES ON CACHE BOOL "" FORCE)
|
|
||||||
set(GLFW_BUILD_TESTS ON CACHE BOOL "" FORCE)
|
|
||||||
add_subdirectory(path/to/glfw)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
@subsection news_31_framesize Window frame size query
|
||||||
|
|
||||||
@subsubsection initmenu_34 macOS main menu now created at initialization
|
GLFW now supports querying the size, on each side, of the frame around the
|
||||||
|
client area of a window, with @ref glfwGetWindowFrameSize.
|
||||||
|
|
||||||
GLFW now creates the main menu and completes the initialization of NSApplication
|
@see [Window size](@ref window_size)
|
||||||
during initialization. Programs that do not want a main menu can disable it
|
|
||||||
with the [GLFW_COCOA_MENUBAR](@ref GLFW_COCOA_MENUBAR_hint) init hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection corevideo_34 CoreVideo dependency has been removed
|
@subsection news_31_autoiconify Simultaneous multi-monitor rendering
|
||||||
|
|
||||||
GLFW no longer depends on the CoreVideo framework on macOS and it no longer
|
GLFW now supports disabling auto-iconification of full screen windows with
|
||||||
needs to be specified during compilation or linking.
|
the [GLFW_AUTO_ICONIFY](@ref window_hints_wnd) window hint. This is intended
|
||||||
|
for people building multi-monitor installations, where you need windows to stay
|
||||||
|
in full screen despite losing input focus.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection caveat_fbtransparency_34 Framebuffer transparency requires DWM transparency
|
@subsection news_31_floating Floating windows
|
||||||
|
|
||||||
GLFW no longer supports framebuffer transparency enabled via @ref
|
GLFW now supports floating windows, also called topmost or always on top, for
|
||||||
GLFW_TRANSPARENT_FRAMEBUFFER on Windows 7 if DWM transparency is off
|
easier debugging with the [GLFW_FLOATING](@ref window_hints_wnd) window hint.
|
||||||
(the Transparency setting under Personalization > Window Color).
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection emptyevents_34 Empty events on X11 no longer round-trip to server
|
@subsection news_31_focused Initially unfocused windows
|
||||||
|
|
||||||
Events posted with @ref glfwPostEmptyEvent now use a separate unnamed pipe
|
GLFW now supports preventing a windowed mode window from gaining input focus on
|
||||||
instead of sending an X11 client event to the helper window.
|
creation, with the [GLFW_FOCUSED](@ref window_hints_wnd) window hint.
|
||||||
|
|
||||||
|
|
||||||
@subsection deprecations_34 Deprecations in version 3.4
|
@subsection news_31_direct Direct access for window attributes and cursor position
|
||||||
|
|
||||||
@subsection removals_34 Removals in 3.4
|
GLFW now queries the window input focus, visibility and iconification attributes
|
||||||
|
and the cursor position directly instead of returning cached data.
|
||||||
|
|
||||||
@subsubsection vulkan_static_34 GLFW_VULKAN_STATIC CMake option has been removed
|
|
||||||
|
|
||||||
This option was used to compile GLFW directly linked with the Vulkan loader, instead of
|
@subsection news_31_charmods Character with modifiers callback
|
||||||
using dynamic loading to get hold of `vkGetInstanceProcAddr` at initialization. This is
|
|
||||||
now done by calling the @ref glfwInitVulkanLoader function before initialization.
|
|
||||||
|
|
||||||
If you need backward compatibility, this macro can still be defined for GLFW 3.4 and will
|
GLFW now provides a callback for character events with modifier key bits. The
|
||||||
have no effect. The call to @ref glfwInitVulkanLoader can be conditionally enabled in
|
callback is set with @ref glfwSetCharModsCallback. Unlike the regular character
|
||||||
your code by checking the @ref GLFW_VERSION_MAJOR and @ref GLFW_VERSION_MINOR macros.
|
callback, this will report character events that will not result in a character
|
||||||
|
being input, for example if the Control key is held down.
|
||||||
|
|
||||||
|
@see @ref input_char
|
||||||
|
|
||||||
@subsubsection osmesa_option_34 GLFW_USE_OSMESA CMake option has been removed
|
|
||||||
|
|
||||||
This option was used to compile GLFW for the Null platform. The Null platform is now
|
@subsection news_31_single Single buffered framebuffers
|
||||||
always supported. To produce a library binary that only supports this platform, the way
|
|
||||||
this CMake option used to do, you will instead need to disable the default platform for
|
|
||||||
the target OS. This means setting the @ref GLFW_BUILD_WIN32, @ref GLFW_BUILD_COCOA or
|
|
||||||
@ref GLFW_BUILD_X11 CMake option to false.
|
|
||||||
|
|
||||||
You can set all of them to false and the ones that don't apply for the target OS will be
|
GLFW now supports the creation of single buffered windows, with the
|
||||||
ignored.
|
[GLFW_DOUBLEBUFFER](@ref window_hints_fb) window hint.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection wl_shell_34 Support for the wl_shell protocol has been removed
|
@subsection news_31_glext Macro for including extension header
|
||||||
|
|
||||||
Support for the wl_shell protocol has been removed and GLFW now only supports
|
GLFW now includes the extension header appropriate for the chosen OpenGL or
|
||||||
the XDG-Shell protocol. If your Wayland compositor does not support XDG-Shell
|
OpenGL ES header when [GLFW_INCLUDE_GLEXT](@ref build_macros) is defined. GLFW
|
||||||
then GLFW will fail to initialize.
|
does not provide these headers. They must be provided by your development
|
||||||
|
environment or your OpenGL or OpenGL ES SDK.
|
||||||
|
|
||||||
|
|
||||||
@subsection symbols_34 New symbols in version 3.4
|
@subsection news_31_release Context release behaviors
|
||||||
|
|
||||||
@subsubsection functions_34 New functions in version 3.4
|
GLFW now supports controlling whether the pipeline is flushed when a context is
|
||||||
|
made non-current, with the
|
||||||
|
[GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint, provided the
|
||||||
|
machine supports the `GL_KHR_context_flush_control` extension.
|
||||||
|
|
||||||
- @ref glfwInitAllocator
|
|
||||||
- @ref glfwGetPlatform
|
|
||||||
- @ref glfwPlatformSupported
|
|
||||||
- @ref glfwInitVulkanLoader
|
|
||||||
|
|
||||||
|
@subsection news_31_wayland (Experimental) Wayland support
|
||||||
|
|
||||||
@subsubsection types_34 New types in version 3.4
|
GLFW now has an _experimental_ Wayland display protocol backend that can be
|
||||||
|
selected on Linux with a CMake option.
|
||||||
|
|
||||||
- @ref GLFWallocator
|
|
||||||
- @ref GLFWallocatefun
|
|
||||||
- @ref GLFWreallocatefun
|
|
||||||
- @ref GLFWdeallocatefun
|
|
||||||
|
|
||||||
|
@subsection news_31_mir (Experimental) Mir support
|
||||||
|
|
||||||
@subsubsection constants_34 New constants in version 3.4
|
GLFW now has an _experimental_ Mir display server backend that can be selected
|
||||||
|
on Linux with a CMake option.
|
||||||
|
|
||||||
- @ref GLFW_PLATFORM
|
|
||||||
- @ref GLFW_ANY_PLATFORM
|
|
||||||
- @ref GLFW_PLATFORM_WIN32
|
|
||||||
- @ref GLFW_PLATFORM_COCOA
|
|
||||||
- @ref GLFW_PLATFORM_WAYLAND
|
|
||||||
- @ref GLFW_PLATFORM_X11
|
|
||||||
- @ref GLFW_PLATFORM_NULL
|
|
||||||
- @ref GLFW_PLATFORM_UNAVAILABLE
|
|
||||||
- @ref GLFW_POINTING_HAND_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_EW_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_NS_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_NWSE_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_NESW_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_ALL_CURSOR
|
|
||||||
- @ref GLFW_MOUSE_PASSTHROUGH
|
|
||||||
- @ref GLFW_NOT_ALLOWED_CURSOR
|
|
||||||
- @ref GLFW_CURSOR_UNAVAILABLE
|
|
||||||
- @ref GLFW_WIN32_KEYBOARD_MENU
|
|
||||||
- @ref GLFW_CONTEXT_DEBUG
|
|
||||||
- @ref GLFW_FEATURE_UNAVAILABLE
|
|
||||||
- @ref GLFW_FEATURE_UNIMPLEMENTED
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_NONE
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_OPENGL
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_OPENGLES
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_D3D9
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_D3D11
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_VULKAN
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_METAL
|
|
||||||
- @ref GLFW_X11_XCB_VULKAN_SURFACE
|
|
||||||
- @ref GLFW_CURSOR_CAPTURED
|
|
||||||
- @ref GLFW_POSITION_X
|
|
||||||
- @ref GLFW_POSITION_Y
|
|
||||||
- @ref GLFW_ANY_POSITION
|
|
||||||
- @ref GLFW_WAYLAND_LIBDECOR
|
|
||||||
- @ref GLFW_WAYLAND_PREFER_LIBDECOR
|
|
||||||
- @ref GLFW_WAYLAND_DISABLE_LIBDECOR
|
|
||||||
|
|
||||||
|
@section news_30 New features in 3.0
|
||||||
|
|
||||||
@section news_archive Release notes for earlier versions
|
These are the release highlights. For a full list of changes see the
|
||||||
|
[version history](http://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
- [Release notes for 3.3](https://www.glfw.org/docs/3.3/news.html)
|
|
||||||
- [Release notes for 3.2](https://www.glfw.org/docs/3.2/news.html)
|
@subsection news_30_cmake CMake build system
|
||||||
- [Release notes for 3.1](https://www.glfw.org/docs/3.1/news.html)
|
|
||||||
- [Release notes for 3.0](https://www.glfw.org/docs/3.0/news.html)
|
GLFW now uses the CMake build system instead of the various makefiles and
|
||||||
|
project files used by earlier versions. CMake is available for all platforms
|
||||||
|
supported by GLFW, is present in most package systems and can generate
|
||||||
|
makefiles and/or project files for most popular development environments.
|
||||||
|
|
||||||
|
For more information on how to use CMake, see the
|
||||||
|
[CMake manual](http://cmake.org/cmake/help/documentation.html).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_multiwnd Multi-window support
|
||||||
|
|
||||||
|
GLFW now supports the creation of multiple windows, each with their own OpenGL
|
||||||
|
or OpenGL ES context, and all window functions now take a window handle. Event
|
||||||
|
callbacks are now per-window and are provided with the handle of the window that
|
||||||
|
received the event. The @ref glfwMakeContextCurrent function has been added to
|
||||||
|
select which context is current on a given thread.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_multimon Multi-monitor support
|
||||||
|
|
||||||
|
GLFW now explicitly supports multiple monitors. They can be enumerated with
|
||||||
|
@ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref
|
||||||
|
glfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize,
|
||||||
|
and specified at window creation to make the newly created window full screen on
|
||||||
|
that specific monitor.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_unicode Unicode support
|
||||||
|
|
||||||
|
All string arguments to GLFW functions and all strings returned by GLFW now use
|
||||||
|
the UTF-8 encoding. This includes the window title, error string, clipboard
|
||||||
|
text, monitor and joystick names as well as the extension function arguments (as
|
||||||
|
ASCII is a subset of UTF-8).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_clipboard Clipboard text I/O
|
||||||
|
|
||||||
|
GLFW now supports reading and writing plain text to and from the system
|
||||||
|
clipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString
|
||||||
|
functions.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_gamma Gamma ramp support
|
||||||
|
|
||||||
|
GLFW now supports setting and reading back the gamma ramp of monitors, with the
|
||||||
|
@ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions. There is also @ref
|
||||||
|
glfwSetGamma, which generates a ramp from a gamma value and then sets it.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_gles OpenGL ES support
|
||||||
|
|
||||||
|
GLFW now supports the creation of OpenGL ES contexts, by setting the
|
||||||
|
`GLFW_CLIENT_API` window hint to `GLFW_OPENGL_ES_API`, where creation of such
|
||||||
|
contexts are supported. Note that GLFW _does not implement_ OpenGL ES, so your
|
||||||
|
driver must provide support in a way usable by GLFW. Modern Nvidia and Intel
|
||||||
|
drivers support creation of OpenGL ES context using the GLX and WGL APIs, while
|
||||||
|
AMD provides an EGL implementation instead.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_egl (Experimental) EGL support
|
||||||
|
|
||||||
|
GLFW now has an experimental EGL context creation back end that can be selected
|
||||||
|
through CMake options.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_hidpi High-DPI support
|
||||||
|
|
||||||
|
GLFW now supports high-DPI monitors on both Windows and OS X, giving windows full
|
||||||
|
resolution framebuffers where other UI elements are scaled up. To achieve this,
|
||||||
|
@ref glfwGetFramebufferSize and @ref glfwSetFramebufferSizeCallback have been
|
||||||
|
added. These work with pixels, while the rest of the GLFW API works with screen
|
||||||
|
coordinates. This is important as OpenGL uses pixels, not screen coordinates.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_error Error callback
|
||||||
|
|
||||||
|
GLFW now has an error callback, which can provide your application with much
|
||||||
|
more detailed diagnostics than was previously possible. The callback is passed
|
||||||
|
an error code and a description string.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_wndptr Per-window user pointer
|
||||||
|
|
||||||
|
Each window now has a user-defined pointer, retrieved with @ref
|
||||||
|
glfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it
|
||||||
|
easier to integrate GLFW into C++ code.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_iconifyfun Window iconification callback
|
||||||
|
|
||||||
|
Each window now has a callback for iconification and restoration events,
|
||||||
|
which is set with @ref glfwSetWindowIconifyCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_wndposfun Window position callback
|
||||||
|
|
||||||
|
Each window now has a callback for position events, which is set with @ref
|
||||||
|
glfwSetWindowPosCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_wndpos Window position query
|
||||||
|
|
||||||
|
The position of a window can now be retrieved using @ref glfwGetWindowPos.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_focusfun Window focus callback
|
||||||
|
|
||||||
|
Each windows now has a callback for focus events, which is set with @ref
|
||||||
|
glfwSetWindowFocusCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_enterleave Cursor enter/leave callback
|
||||||
|
|
||||||
|
Each window now has a callback for when the mouse cursor enters or leaves its
|
||||||
|
client area, which is set with @ref glfwSetCursorEnterCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_wndtitle Initial window title
|
||||||
|
|
||||||
|
The title of a window is now specified at creation time, as one of the arguments
|
||||||
|
to @ref glfwCreateWindow.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_hidden Hidden windows
|
||||||
|
|
||||||
|
Windows can now be hidden with @ref glfwHideWindow, shown using @ref
|
||||||
|
glfwShowWindow and created initially hidden with the `GLFW_VISIBLE` window hint.
|
||||||
|
This allows for off-screen rendering in a way compatible with most drivers, as
|
||||||
|
well as moving a window to a specific position before showing it.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_undecorated Undecorated windows
|
||||||
|
|
||||||
|
Windowed mode windows can now be created without decorations, i.e. things like
|
||||||
|
a frame, a title bar, with the `GLFW_DECORATED` window hint. This allows for
|
||||||
|
the creation of things like splash screens.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_keymods Modifier key bit masks
|
||||||
|
|
||||||
|
[Modifier key bit mask](@ref mods) parameters have been added to the
|
||||||
|
[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_scancode Platform-specific scancodes
|
||||||
|
|
||||||
|
A scancode parameter has been added to the [key callback](@ref GLFWkeyfun). Keys
|
||||||
|
that don't have a [key token](@ref keys) still get passed on with the key
|
||||||
|
parameter set to `GLFW_KEY_UNKNOWN`. These scancodes will vary between machines
|
||||||
|
and are intended to be used for key bindings.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_jsname Joystick names
|
||||||
|
|
||||||
|
The name of a joystick can now be retrieved using @ref glfwGetJoystickName.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_30_doxygen Doxygen documentation
|
||||||
|
|
||||||
|
You are reading it.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
111
docs/quick.dox
111
docs/quick.dox
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide takes you through writing a small application using GLFW 3. The
|
This guide takes you through writing a simple application using GLFW 3. The
|
||||||
application will create a window and OpenGL context, render a rotating triangle
|
application will create a window and OpenGL context, render a rotating triangle
|
||||||
and exit when the user closes the window or presses _Escape_. This guide will
|
and exit when the user closes the window or presses _Escape_. This guide will
|
||||||
introduce a few of the most commonly used functions, but there are many more.
|
introduce a few of the most commonly used functions, but there are many more.
|
||||||
|
@ -18,42 +18,43 @@ behave differently in GLFW 3.
|
||||||
|
|
||||||
@subsection quick_include Including the GLFW header
|
@subsection quick_include Including the GLFW header
|
||||||
|
|
||||||
In the source files of your application where you use GLFW, you need to include
|
In the source files of your application where you use OpenGL or GLFW, you need
|
||||||
its header file.
|
to include the GLFW 3 header file.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This header provides all the constants, types and function prototypes of the
|
This defines all the constants, types and function prototypes of the GLFW API.
|
||||||
GLFW API.
|
It also includes the OpenGL header from your development environment and
|
||||||
|
defines all the constants and types necessary for it to work on your platform
|
||||||
|
without including any platform-specific headers.
|
||||||
|
|
||||||
By default it also includes the OpenGL header from your development environment.
|
In other words:
|
||||||
On some platforms this header only supports older versions of OpenGL. The most
|
|
||||||
extreme case is Windows, where it typically only supports OpenGL 1.2.
|
|
||||||
|
|
||||||
Most programs will instead use an
|
- Do _not_ include the OpenGL header yourself, as GLFW does this for you in
|
||||||
[extension loader library](@ref context_glext_auto) and include its header.
|
a platform-independent way
|
||||||
This example uses files generated by [glad](https://gen.glad.sh/). The GLFW
|
- Do _not_ include `windows.h` or other platform-specific headers unless
|
||||||
header can detect most such headers if they are included first and will then not
|
you plan on using those APIs yourself
|
||||||
include the one from your development environment.
|
- If you _do_ need to include such headers, include them _before_ the GLFW
|
||||||
|
header and it will detect this
|
||||||
|
|
||||||
|
On some platforms supported by GLFW the OpenGL header and link library only
|
||||||
|
expose older versions of OpenGL. The most extreme case is Windows, which only
|
||||||
|
exposes OpenGL 1.2. The easiest way to work around this is to use an
|
||||||
|
[extension loader library](@ref context_glext_auto).
|
||||||
|
|
||||||
|
If you are using such a library then you should include its header _before_ the
|
||||||
|
GLFW header. This lets it replace the OpenGL header included by GLFW without
|
||||||
|
conflicts. This example uses
|
||||||
|
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
||||||
|
libraries.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#include <glad/gl.h>
|
#include <glad/glad.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@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
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
#include <glad/gl.h>
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_init_term Initializing and terminating GLFW
|
@subsection quick_init_term Initializing and terminating GLFW
|
||||||
|
|
||||||
|
@ -68,7 +69,7 @@ if (!glfwInit())
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Note that `GLFW_TRUE` and `GLFW_FALSE` are and will always be one and zero.
|
Note that `GLFW_TRUE` and `GLFW_FALSE` are and will always be just one and zero.
|
||||||
|
|
||||||
When you are done using GLFW, typically just before the application exits, you
|
When you are done using GLFW, typically just before the application exits, you
|
||||||
need to terminate GLFW.
|
need to terminate GLFW.
|
||||||
|
@ -85,12 +86,14 @@ functions that require it.
|
||||||
@subsection quick_capture_error Setting an error callback
|
@subsection quick_capture_error Setting an error callback
|
||||||
|
|
||||||
Most events are reported through callbacks, whether it's a key being pressed,
|
Most events are reported through callbacks, whether it's a key being pressed,
|
||||||
a GLFW window being moved, or an error occurring. Callbacks are C functions (or
|
a GLFW window being moved, or an error occurring. Callbacks are simply
|
||||||
C++ static methods) that are called by GLFW with arguments describing the event.
|
C functions (or C++ static methods) that are called by GLFW with arguments
|
||||||
|
describing the event.
|
||||||
|
|
||||||
In case a GLFW function fails, an error is reported to the GLFW error callback.
|
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
|
You can receive these reports with an error callback. This function must have
|
||||||
the signature below but may do anything permitted in other callbacks.
|
the signature below. This simple error callback just prints the error
|
||||||
|
description to `stderr`.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
void error_callback(int error, const char* description)
|
void error_callback(int error, const char* description)
|
||||||
|
@ -134,14 +137,9 @@ require a minimum OpenGL version by setting the `GLFW_CONTEXT_VERSION_MAJOR` and
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints _before_ creation. If the required minimum
|
`GLFW_CONTEXT_VERSION_MINOR` hints _before_ creation. If the required minimum
|
||||||
version is not supported on the machine, context (and window) creation fails.
|
version is not supported on the machine, context (and window) creation fails.
|
||||||
|
|
||||||
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
|
@code
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
|
@ -149,6 +147,10 @@ if (!window)
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
The window handle is passed to all window related functions and is provided to
|
||||||
|
along to all window related callbacks, so they can tell which window received
|
||||||
|
the event.
|
||||||
|
|
||||||
When a window and context is no longer needed, destroy it.
|
When a window and context is no longer needed, destroy it.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -174,10 +176,10 @@ If you are using an [extension loader library](@ref context_glext_auto) to
|
||||||
access modern OpenGL then this is when to initialize it, as the loader needs
|
access modern OpenGL then this is when to initialize it, as the loader needs
|
||||||
a current context to load from. This example uses
|
a current context to load from. This example uses
|
||||||
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
||||||
libraries.
|
libraries.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
|
@ -234,7 +236,7 @@ events as described below.
|
||||||
@subsection quick_render Rendering with OpenGL
|
@subsection quick_render Rendering with OpenGL
|
||||||
|
|
||||||
Once you have a current OpenGL context, you can use OpenGL normally. In this
|
Once you have a current OpenGL context, you can use OpenGL normally. In this
|
||||||
tutorial, a multicolored rotating triangle will be rendered. The framebuffer
|
tutorial, a multi-colored rotating triangle will be rendered. The framebuffer
|
||||||
size needs to be retrieved for `glViewport`.
|
size needs to be retrieved for `glViewport`.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -246,16 +248,12 @@ glViewport(0, 0, width, height);
|
||||||
You can also set a framebuffer size callback using @ref
|
You can also set a framebuffer size callback using @ref
|
||||||
glfwSetFramebufferSizeCallback and be notified when the size changes.
|
glfwSetFramebufferSizeCallback and be notified when the size changes.
|
||||||
|
|
||||||
The details of how to render with OpenGL is outside the scope of this tutorial,
|
Actual rendering with OpenGL is outside the scope of this tutorial, but there
|
||||||
but there are many excellent resources for learning modern OpenGL. Here are
|
are [many](https://open.gl/) [excellent](http://learnopengl.com/)
|
||||||
a few of them:
|
[tutorial](http://openglbook.com/) [sites](http://ogldev.atspace.co.uk/) that
|
||||||
|
teach modern OpenGL. Some of them use GLFW to create the context and window
|
||||||
- [Anton's OpenGL 4 Tutorials](https://antongerdelan.net/opengl/)
|
while others use GLUT or SDL, but remember that OpenGL itself always works the
|
||||||
- [Learn OpenGL](https://learnopengl.com/)
|
same.
|
||||||
- [Open.GL](https://open.gl/)
|
|
||||||
|
|
||||||
These all happen to use GLFW, but OpenGL itself works the same whatever API you
|
|
||||||
use to create the window and context.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_timer Reading the timer
|
@subsection quick_timer Reading the timer
|
||||||
|
@ -313,7 +311,7 @@ done each frame after buffer swapping.
|
||||||
|
|
||||||
There are two methods for processing pending events; polling and waiting. This
|
There are two methods for processing pending events; polling and waiting. This
|
||||||
example will use event polling, which processes only those events that have
|
example will use event polling, which processes only those events that have
|
||||||
already been received and then returns immediately.
|
already been received and then returns immediately.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
@ -330,20 +328,19 @@ for example, many kinds of editing tools.
|
||||||
@section quick_example Putting it together
|
@section quick_example Putting it together
|
||||||
|
|
||||||
Now that you know how to initialize GLFW, create a window and poll for
|
Now that you know how to initialize GLFW, create a window and poll for
|
||||||
keyboard input, it's possible to create a small program.
|
keyboard input, it's possible to create a simple program.
|
||||||
|
|
||||||
This program creates a 640 by 480 windowed mode window and starts a loop that
|
This program creates a 640 by 480 windowed mode window and starts a loop that
|
||||||
clears the screen, renders a triangle and processes events until the user either
|
clears the screen, renders a triangle and processes events until the user either
|
||||||
presses _Escape_ or closes the window.
|
presses _Escape_ or closes the window.
|
||||||
|
|
||||||
@snippet triangle-opengl.c code
|
@snippet simple.c code
|
||||||
|
|
||||||
The program above can be found in the
|
The program above can be found in the
|
||||||
[source package](https://www.glfw.org/download.html) as
|
[source package](http://www.glfw.org/download.html) as `examples/simple.c`
|
||||||
`examples/triangle-opengl.c` and is compiled along with all other examples when
|
and is compiled along with all other examples when you build GLFW. If you
|
||||||
you build GLFW. If you built GLFW from the source package then you already have
|
built GLFW from the source package then already have this as `simple.exe` on
|
||||||
this as `triangle-opengl.exe` on Windows, `triangle-opengl` on Linux or
|
Windows, `simple` on Linux or `simple.app` on OS X.
|
||||||
`triangle-opengl.app` on macOS.
|
|
||||||
|
|
||||||
This tutorial used only a few of the many functions GLFW provides. There are
|
This tutorial used only a few of the many functions GLFW provides. There are
|
||||||
guides for each of the areas covered by GLFW. Each guide will introduce all the
|
guides for each of the areas covered by GLFW. Each guide will introduce all the
|
||||||
|
|
157
docs/spaces.svg
157
docs/spaces.svg
|
@ -13,7 +13,7 @@
|
||||||
height="327.98221"
|
height="327.98221"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="0.48.4 r9939"
|
||||||
sodipodi:docname="spaces.svg">
|
sodipodi:docname="spaces.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs4">
|
id="defs4">
|
||||||
|
@ -38,11 +38,11 @@
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1.8110012"
|
inkscape:zoom="2.5611424"
|
||||||
inkscape:cx="320.68941"
|
inkscape:cx="344.24359"
|
||||||
inkscape:cy="159.80509"
|
inkscape:cy="163.9911"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="svg2"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1021"
|
inkscape:window-height="1021"
|
||||||
|
@ -475,18 +475,18 @@
|
||||||
inkscape:export-ydpi="109.89113" />
|
inkscape:export-ydpi="109.89113" />
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
x="21.213203"
|
x="21.213203"
|
||||||
y="340.20465"
|
y="340.20465"
|
||||||
id="text3803"
|
id="text3803"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
inkscape:export-filename="/home/elmindreda/projects/glfw/glfw/docs/spaces.png"
|
inkscape:export-filename="/home/elmindreda/projects/glfw/glfw/docs/spaces.png"
|
||||||
inkscape:export-xdpi="109.89113"
|
inkscape:export-xdpi="109.89113"
|
||||||
inkscape:export-ydpi="109.89113"><tspan
|
inkscape:export-ydpi="109.89113"><tspan
|
||||||
sodipodi:role="line"
|
sodipodi:role="line"
|
||||||
id="tspan3805"
|
id="tspan3805"
|
||||||
x="21.213203"
|
x="21.213203"
|
||||||
y="340.20465"
|
y="340.20465" /></text>
|
||||||
style="font-size:12px;line-height:1.25;font-family:sans-serif"> </tspan></text>
|
|
||||||
<g
|
<g
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
id="text3807">
|
id="text3807">
|
||||||
|
@ -647,6 +647,74 @@
|
||||||
style="font-size:10px"
|
style="font-size:10px"
|
||||||
id="path3239" />
|
id="path3239" />
|
||||||
</g>
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
id="text3826">
|
||||||
|
<path
|
||||||
|
d="m 172.22728,456.1171 0,1.04004 c -0.33204,-0.30924 -0.68686,-0.54036 -1.06445,-0.69336 -0.37436,-0.15299 -0.77312,-0.22949 -1.19629,-0.2295 -0.83334,10e-6 -1.47136,0.25554 -1.91407,0.76661 -0.44271,0.50781 -0.66406,1.24349 -0.66406,2.20703 0,0.96029 0.22135,1.69596 0.66406,2.20703 0.44271,0.50781 1.08073,0.76172 1.91407,0.76172 0.42317,0 0.82193,-0.0765 1.19629,-0.2295 0.37759,-0.15299 0.73241,-0.38411 1.06445,-0.69336 l 0,1.03028 c -0.34506,0.23437 -0.71127,0.41015 -1.09863,0.52734 -0.38412,0.11719 -0.79102,0.17578 -1.22071,0.17578 -1.10351,0 -1.97265,-0.33691 -2.60742,-1.01074 -0.63476,-0.67708 -0.95215,-1.59993 -0.95215,-2.76855 0,-1.17187 0.31739,-2.09472 0.95215,-2.76856 0.63477,-0.67707 1.50391,-1.01562 2.60742,-1.01562 0.4362,0 0.84635,0.0586 1.23047,0.17578 0.38737,0.11394 0.75032,0.28646 1.08887,0.51758"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3108" />
|
||||||
|
<path
|
||||||
|
d="m 173.72142,455.24796 0.89844,0 0,7.59765 -0.89844,0 0,-7.59765"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3110" />
|
||||||
|
<path
|
||||||
|
d="m 176.49486,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3112" />
|
||||||
|
<path
|
||||||
|
d="m 183.94603,459.88663 0,0.43945 -4.13086,0 c 0.0391,0.61849 0.22461,1.0905 0.55664,1.41602 0.33528,0.32226 0.80078,0.4834 1.39649,0.48339 0.34504,1e-5 0.6787,-0.0423 1.00097,-0.12695 0.32552,-0.0846 0.64778,-0.21159 0.9668,-0.38086 l 0,0.84961 c -0.32227,0.13672 -0.65268,0.24089 -0.99121,0.3125 -0.33855,0.0716 -0.68197,0.10742 -1.03028,0.10742 -0.87239,0 -1.56413,-0.2539 -2.07519,-0.76172 -0.50781,-0.50781 -0.76172,-1.19466 -0.76172,-2.06054 0,-0.89518 0.24088,-1.60482 0.72266,-2.12891 0.48502,-0.52734 1.13769,-0.79101 1.958,-0.79101 0.73568,0 1.31673,0.23763 1.74317,0.71289 0.42968,0.47201 0.64452,1.11491 0.64453,1.92871 m -0.89844,-0.26367 c -0.007,-0.49154 -0.14486,-0.88379 -0.41504,-1.17676 -0.26693,-0.29297 -0.62175,-0.43945 -1.06445,-0.43946 -0.5013,1e-5 -0.90332,0.14161 -1.20605,0.42481 -0.29949,0.28321 -0.47201,0.68197 -0.51758,1.19629 l 3.20312,-0.005"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3114" />
|
||||||
|
<path
|
||||||
|
d="m 189.96654,459.54483 0,3.30078 -0.89844,0 0,-3.27148 c 0,-0.51758 -0.10092,-0.90495 -0.30273,-1.16211 -0.20183,-0.25716 -0.50457,-0.38574 -0.90821,-0.38574 -0.48503,0 -0.86751,0.15462 -1.14746,0.46386 -0.27995,0.30925 -0.41992,0.7308 -0.41992,1.26465 l 0,3.09082 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.21484,-0.32877 0.46712,-0.57454 0.75684,-0.7373 0.29296,-0.16276 0.62988,-0.24414 1.01074,-0.24414 0.62825,0 1.10351,0.19531 1.42578,0.58593 0.32226,0.38738 0.48339,0.95867 0.4834,1.71387"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3116" />
|
||||||
|
<path
|
||||||
|
d="m 192.65697,455.82413 0,1.55273 1.85058,0 0,0.69824 -1.85058,0 0,2.96875 c 0,0.44597 0.0602,0.73243 0.18066,0.85938 0.1237,0.12695 0.37272,0.19043 0.74707,0.19043 l 0.92285,0 0,0.75195 -0.92285,0 c -0.69336,0 -1.17188,-0.12858 -1.43555,-0.38574 -0.26367,-0.26042 -0.3955,-0.73242 -0.3955,-1.41602 l 0,-2.96875 -0.65918,0 0,-0.69824 0.65918,0 0,-1.55273 0.90332,0"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3118" />
|
||||||
|
<path
|
||||||
|
d="m 201.36302,460.09659 c -0.72591,0 -1.22884,0.083 -1.50879,0.24902 -0.27995,0.16602 -0.41992,0.44922 -0.41992,0.84961 0,0.31901 0.10417,0.57292 0.3125,0.76172 0.21159,0.18555 0.49805,0.27832 0.85938,0.27832 0.49804,0 0.8968,-0.17578 1.19628,-0.52734 0.30274,-0.35482 0.4541,-0.8252 0.45411,-1.41114 l 0,-0.20019 -0.89356,0 m 1.79199,-0.3711 0,3.12012 -0.89843,0 0,-0.83008 c -0.20509,0.33204 -0.46062,0.5778 -0.76661,0.73731 -0.30599,0.15625 -0.68034,0.23437 -1.12304,0.23437 -0.5599,0 -1.00586,-0.15625 -1.33789,-0.46875 -0.32878,-0.31575 -0.49317,-0.7373 -0.49317,-1.26465 0,-0.61523 0.20508,-1.07909 0.61524,-1.3916 0.41341,-0.31249 1.02864,-0.46874 1.8457,-0.46875 l 1.25977,0 0,-0.0879 c -1e-5,-0.4134 -0.13673,-0.73242 -0.41016,-0.95703 -0.27019,-0.22786 -0.65104,-0.34179 -1.14258,-0.3418 -0.3125,1e-5 -0.61686,0.0374 -0.91308,0.11231 -0.29623,0.0749 -0.58106,0.18718 -0.8545,0.33691 l 0,-0.83007 c 0.32878,-0.12695 0.64779,-0.22135 0.95704,-0.28321 0.30924,-0.0651 0.61034,-0.0976 0.90332,-0.0976 0.79101,0 1.38183,0.20508 1.77246,0.61523 0.39062,0.41016 0.58593,1.03191 0.58593,1.86523"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3120" />
|
||||||
|
<path
|
||||||
|
d="m 208.17943,458.21671 c -0.10092,-0.0586 -0.21159,-0.10091 -0.33203,-0.12696 -0.11719,-0.0293 -0.2474,-0.0439 -0.39063,-0.0439 -0.50781,0 -0.89844,0.16602 -1.17187,0.49804 -0.27019,0.32878 -0.40528,0.80242 -0.40528,1.4209 l 0,2.88086 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.1888,-0.33203 0.43457,-0.57779 0.73731,-0.7373 0.30273,-0.16276 0.67057,-0.24414 1.10351,-0.24414 0.0618,0 0.13021,0.005 0.20508,0.0146 0.0749,0.007 0.15788,0.0179 0.24903,0.0342 l 0.005,0.92286"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3122" />
|
||||||
|
<path
|
||||||
|
d="m 213.59447,459.88663 0,0.43945 -4.13086,0 c 0.0391,0.61849 0.22461,1.0905 0.55664,1.41602 0.33528,0.32226 0.80078,0.4834 1.39648,0.48339 0.34505,1e-5 0.67871,-0.0423 1.00098,-0.12695 0.32552,-0.0846 0.64778,-0.21159 0.9668,-0.38086 l 0,0.84961 c -0.32227,0.13672 -0.65268,0.24089 -0.99121,0.3125 -0.33855,0.0716 -0.68197,0.10742 -1.03028,0.10742 -0.8724,0 -1.56413,-0.2539 -2.07519,-0.76172 -0.50782,-0.50781 -0.76172,-1.19466 -0.76172,-2.06054 0,-0.89518 0.24088,-1.60482 0.72265,-2.12891 0.48503,-0.52734 1.1377,-0.79101 1.95801,-0.79101 0.73567,0 1.31673,0.23763 1.74317,0.71289 0.42968,0.47201 0.64452,1.11491 0.64453,1.92871 m -0.89844,-0.26367 c -0.007,-0.49154 -0.14486,-0.88379 -0.41504,-1.17676 -0.26693,-0.29297 -0.62175,-0.43945 -1.06445,-0.43946 -0.50131,1e-5 -0.90333,0.14161 -1.20606,0.42481 -0.29948,0.28321 -0.472,0.68197 -0.51758,1.19629 l 3.20313,-0.005"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3124" />
|
||||||
|
<path
|
||||||
|
d="m 217.55443,460.09659 c -0.72592,0 -1.22885,0.083 -1.50879,0.24902 -0.27995,0.16602 -0.41992,0.44922 -0.41992,0.84961 0,0.31901 0.10416,0.57292 0.3125,0.76172 0.21158,0.18555 0.49804,0.27832 0.85937,0.27832 0.49805,0 0.89681,-0.17578 1.19629,-0.52734 0.30273,-0.35482 0.4541,-0.8252 0.4541,-1.41114 l 0,-0.20019 -0.89355,0 m 1.79199,-0.3711 0,3.12012 -0.89844,0 0,-0.83008 c -0.20508,0.33204 -0.46061,0.5778 -0.7666,0.73731 -0.30599,0.15625 -0.68034,0.23437 -1.12305,0.23437 -0.55989,0 -1.00586,-0.15625 -1.33789,-0.46875 -0.32877,-0.31575 -0.49316,-0.7373 -0.49316,-1.26465 0,-0.61523 0.20508,-1.07909 0.61523,-1.3916 0.41341,-0.31249 1.02865,-0.46874 1.84571,-0.46875 l 1.25976,0 0,-0.0879 c 0,-0.4134 -0.13672,-0.73242 -0.41015,-0.95703 -0.27019,-0.22786 -0.65105,-0.34179 -1.14258,-0.3418 -0.3125,1e-5 -0.61687,0.0374 -0.91309,0.11231 -0.29622,0.0749 -0.58105,0.18718 -0.85449,0.33691 l 0,-0.83007 c 0.32877,-0.12695 0.64779,-0.22135 0.95703,-0.28321 0.30924,-0.0651 0.61035,-0.0976 0.90332,-0.0976 0.79101,0 1.38183,0.20508 1.77246,0.61523 0.39062,0.41016 0.58594,1.03191 0.58594,1.86523"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3126" />
|
||||||
|
<path
|
||||||
|
d="m 226.50462,458.00674 c -0.48177,1e-5 -0.86263,0.18881 -1.14257,0.56641 -0.27995,0.37435 -0.41993,0.88868 -0.41993,1.54297 0,0.6543 0.13835,1.17025 0.41504,1.54785 0.27995,0.37435 0.66243,0.56153 1.14746,0.56152 0.47852,1e-5 0.85775,-0.1888 1.1377,-0.5664 0.27994,-0.3776 0.41992,-0.89193 0.41992,-1.54297 0,-0.64778 -0.13998,-1.16048 -0.41992,-1.53809 -0.27995,-0.38085 -0.65918,-0.57128 -1.1377,-0.57129 m 0,-0.76171 c 0.78125,0 1.39486,0.25391 1.84082,0.76171 0.44596,0.50782 0.66894,1.21095 0.66895,2.10938 -1e-5,0.89518 -0.22299,1.59831 -0.66895,2.10937 -0.44596,0.50782 -1.05957,0.76172 -1.84082,0.76172 -0.7845,0 -1.39974,-0.2539 -1.8457,-0.76172 -0.44271,-0.51106 -0.66406,-1.21419 -0.66406,-2.10937 0,-0.89843 0.22135,-1.60156 0.66406,-2.10938 0.44596,-0.5078 1.0612,-0.76171 1.8457,-0.76171"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3128" />
|
||||||
|
<path
|
||||||
|
d="m 233.66771,458.21671 c -0.10092,-0.0586 -0.21159,-0.10091 -0.33203,-0.12696 -0.11719,-0.0293 -0.2474,-0.0439 -0.39063,-0.0439 -0.50781,0 -0.89844,0.16602 -1.17187,0.49804 -0.27019,0.32878 -0.40528,0.80242 -0.40528,1.4209 l 0,2.88086 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.1888,-0.33203 0.43457,-0.57779 0.73731,-0.7373 0.30273,-0.16276 0.67057,-0.24414 1.10351,-0.24414 0.0618,0 0.13021,0.005 0.20508,0.0146 0.0749,0.007 0.15788,0.0179 0.24903,0.0342 l 0.005,0.92286"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3130" />
|
||||||
|
<path
|
||||||
|
d="m 234.61986,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3132" />
|
||||||
|
<path
|
||||||
|
d="m 240.99193,460.04776 c -1e-5,-0.65104 -0.1351,-1.15559 -0.40528,-1.51367 -0.26693,-0.35807 -0.6429,-0.53711 -1.12793,-0.53711 -0.48177,0 -0.85774,0.17904 -1.12792,0.53711 -0.26693,0.35808 -0.4004,0.86263 -0.4004,1.51367 0,0.64779 0.13347,1.15072 0.4004,1.50879 0.27018,0.35807 0.64615,0.53711 1.12792,0.53711 0.48503,0 0.861,-0.17904 1.12793,-0.53711 0.27018,-0.35807 0.40527,-0.861 0.40528,-1.50879 m 0.89844,2.11914 c -1e-5,0.93099 -0.20672,1.62272 -0.62012,2.0752 -0.41342,0.45572 -1.04655,0.68359 -1.89942,0.68359 -0.31575,0 -0.6136,-0.0244 -0.89355,-0.0732 -0.27995,-0.0456 -0.55176,-0.11719 -0.81543,-0.21485 l 0,-0.87402 c 0.26367,0.14323 0.52409,0.24902 0.78125,0.31738 0.25716,0.0684 0.5192,0.10254 0.78613,0.10254 0.58919,0 1.03027,-0.15462 1.32324,-0.46386 0.29297,-0.306 0.43945,-0.76986 0.43946,-1.39161 l 0,-0.44433 c -0.18555,0.32226 -0.42318,0.56315 -0.71289,0.72265 -0.28972,0.15951 -0.6364,0.23926 -1.04004,0.23926 -0.67058,0 -1.21094,-0.25553 -1.6211,-0.7666 -0.41015,-0.51107 -0.61523,-1.18815 -0.61523,-2.03125 0,-0.84635 0.20508,-1.52506 0.61523,-2.03613 0.41016,-0.51107 0.95052,-0.7666 1.6211,-0.7666 0.40364,0 0.75032,0.0797 1.04004,0.23925 0.28971,0.15951 0.52734,0.4004 0.71289,0.72266 l 0,-0.83008 0.89844,0 0,4.79004"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3134" />
|
||||||
|
<path
|
||||||
|
d="m 243.74095,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3136" />
|
||||||
|
<path
|
||||||
|
d="m 251.06029,459.54483 0,3.30078 -0.89844,0 0,-3.27148 c 0,-0.51758 -0.10092,-0.90495 -0.30273,-1.16211 -0.20183,-0.25716 -0.50457,-0.38574 -0.90821,-0.38574 -0.48503,0 -0.86751,0.15462 -1.14746,0.46386 -0.27995,0.30925 -0.41992,0.7308 -0.41992,1.26465 l 0,3.09082 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.21484,-0.32877 0.46712,-0.57454 0.75684,-0.7373 0.29296,-0.16276 0.62988,-0.24414 1.01074,-0.24414 0.62825,0 1.10351,0.19531 1.42578,0.58593 0.32226,0.38738 0.48339,0.95867 0.4834,1.71387"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path3138" />
|
||||||
|
</g>
|
||||||
<g
|
<g
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
id="text3017">
|
id="text3017">
|
||||||
|
@ -800,78 +868,5 @@
|
||||||
style="font-size:5px"
|
style="font-size:5px"
|
||||||
id="path3161" />
|
id="path3161" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
|
||||||
aria-label="Content area origin"
|
|
||||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
|
||||||
id="text4089">
|
|
||||||
<path
|
|
||||||
d="m 172.21587,456.09125 v 1.04004 q -0.49805,-0.46387 -1.06446,-0.69336 -0.56152,-0.22949 -1.19629,-0.22949 -1.25,0 -1.91406,0.7666 -0.66406,0.76172 -0.66406,2.20703 0,1.44043 0.66406,2.20703 0.66406,0.76172 1.91406,0.76172 0.63477,0 1.19629,-0.22949 0.56641,-0.2295 1.06446,-0.69336 v 1.03027 q -0.51758,0.35156 -1.09864,0.52734 -0.57617,0.17578 -1.2207,0.17578 -1.65527,0 -2.60742,-1.01074 -0.95215,-1.01562 -0.95215,-2.76855 0,-1.75781 0.95215,-2.76856 0.95215,-1.01562 2.60742,-1.01562 0.6543,0 1.23047,0.17578 0.58105,0.1709 1.08887,0.51758 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4091" />
|
|
||||||
<path
|
|
||||||
d="m 175.82915,457.9809 q -0.72266,0 -1.14258,0.5664 -0.41992,0.56153 -0.41992,1.54297 0,0.98145 0.41504,1.54785 0.41992,0.56153 1.14746,0.56153 0.71777,0 1.13769,-0.56641 0.41992,-0.56641 0.41992,-1.54297 0,-0.97168 -0.41992,-1.53808 -0.41992,-0.57129 -1.13769,-0.57129 z m 0,-0.76172 q 1.17187,0 1.84082,0.76172 0.66894,0.76171 0.66894,2.10937 0,1.34277 -0.66894,2.10938 -0.66895,0.76171 -1.84082,0.76171 -1.17676,0 -1.84571,-0.76171 -0.66406,-0.76661 -0.66406,-2.10938 0,-1.34766 0.66406,-2.10937 0.66895,-0.76172 1.84571,-0.76172 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4093" />
|
|
||||||
<path
|
|
||||||
d="m 184.36919,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30274,-1.16211 -0.30273,-0.38574 -0.9082,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32226,-0.49316 0.75683,-0.7373 0.43946,-0.24414 1.01075,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4095" />
|
|
||||||
<path
|
|
||||||
d="m 187.05962,455.79828 v 1.55273 h 1.85058 v 0.69825 h -1.85058 v 2.96875 q 0,0.66894 0.18066,0.85937 0.18555,0.19043 0.74707,0.19043 h 0.92285 v 0.75195 h -0.92285 q -1.04004,0 -1.43555,-0.38574 -0.3955,-0.39062 -0.3955,-1.41601 v -2.96875 h -0.65918 v -0.69825 h 0.65918 v -1.55273 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4097" />
|
|
||||||
<path
|
|
||||||
d="m 194.77446,459.86078 v 0.43945 h -4.13086 q 0.0586,0.92774 0.55664,1.41602 0.50293,0.4834 1.39649,0.4834 0.51757,0 1.00097,-0.12696 0.48828,-0.12695 0.9668,-0.38086 v 0.84961 q -0.4834,0.20508 -0.99121,0.3125 -0.50781,0.10742 -1.03028,0.10742 -1.30859,0 -2.07519,-0.76171 -0.76172,-0.76172 -0.76172,-2.06055 0,-1.34277 0.72266,-2.12891 0.72754,-0.79101 1.958,-0.79101 1.10352,0 1.74317,0.71289 0.64453,0.70801 0.64453,1.92871 z m -0.89844,-0.26367 q -0.01,-0.73731 -0.41504,-1.17676 -0.40039,-0.43945 -1.06445,-0.43945 -0.75195,0 -1.20605,0.4248 -0.44922,0.42481 -0.51758,1.19629 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4099" />
|
|
||||||
<path
|
|
||||||
d="m 200.79497,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30273,-1.16211 -0.30274,-0.38574 -0.90821,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32227,-0.49316 0.75684,-0.7373 0.43945,-0.24414 1.01074,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4101" />
|
|
||||||
<path
|
|
||||||
d="m 203.4854,455.79828 v 1.55273 h 1.85058 v 0.69825 h -1.85058 v 2.96875 q 0,0.66894 0.18066,0.85937 0.18555,0.19043 0.74707,0.19043 h 0.92285 v 0.75195 h -0.92285 q -1.04004,0 -1.43555,-0.38574 -0.3955,-0.39062 -0.3955,-1.41601 v -2.96875 h -0.65918 v -0.69825 h 0.65918 v -1.55273 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4103" />
|
|
||||||
<path
|
|
||||||
d="m 212.19145,460.07074 q -1.08887,0 -1.50879,0.24902 -0.41992,0.24903 -0.41992,0.84961 0,0.47852 0.3125,0.76172 0.31738,0.27832 0.85938,0.27832 0.74707,0 1.19629,-0.52734 0.4541,-0.53223 0.4541,-1.41113 v -0.2002 z m 1.79199,-0.37109 v 3.12011 h -0.89843 v -0.83007 q -0.30762,0.49804 -0.7666,0.7373 -0.45899,0.23437 -1.12305,0.23437 -0.83985,0 -1.33789,-0.46875 -0.49317,-0.47363 -0.49317,-1.26464 0,-0.92286 0.61524,-1.39161 0.62012,-0.46875 1.8457,-0.46875 h 1.25977 v -0.0879 q 0,-0.62011 -0.41016,-0.95703 -0.40527,-0.34179 -1.14258,-0.34179 -0.46875,0 -0.91308,0.1123 -0.44434,0.11231 -0.8545,0.33691 v -0.83007 q 0.49317,-0.19043 0.95704,-0.28321 0.46386,-0.0976 0.90332,-0.0976 1.18652,0 1.77246,0.61523 0.58593,0.61524 0.58593,1.86524 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4105" />
|
|
||||||
<path
|
|
||||||
d="m 219.00786,458.19086 q -0.15137,-0.0879 -0.33203,-0.12696 -0.17578,-0.0439 -0.39063,-0.0439 -0.76172,0 -1.17187,0.49805 -0.40528,0.49316 -0.40528,1.42089 v 2.88086 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.28321,-0.49804 0.73731,-0.7373 0.4541,-0.24414 1.10351,-0.24414 0.0928,0 0.20508,0.0147 0.11231,0.01 0.24903,0.0342 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4107" />
|
|
||||||
<path
|
|
||||||
d="m 224.4229,459.86078 v 0.43945 h -4.13086 q 0.0586,0.92774 0.55664,1.41602 0.50293,0.4834 1.39648,0.4834 0.51758,0 1.00098,-0.12696 0.48828,-0.12695 0.9668,-0.38086 v 0.84961 q -0.4834,0.20508 -0.99121,0.3125 -0.50782,0.10742 -1.03028,0.10742 -1.30859,0 -2.07519,-0.76171 -0.76172,-0.76172 -0.76172,-2.06055 0,-1.34277 0.72265,-2.12891 0.72754,-0.79101 1.95801,-0.79101 1.10352,0 1.74317,0.71289 0.64453,0.70801 0.64453,1.92871 z m -0.89844,-0.26367 q -0.01,-0.73731 -0.41504,-1.17676 -0.40039,-0.43945 -1.06445,-0.43945 -0.75196,0 -1.20606,0.4248 -0.44922,0.42481 -0.51758,1.19629 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4109" />
|
|
||||||
<path
|
|
||||||
d="m 228.38286,460.07074 q -1.08887,0 -1.50879,0.24902 -0.41992,0.24903 -0.41992,0.84961 0,0.47852 0.3125,0.76172 0.31738,0.27832 0.85937,0.27832 0.74707,0 1.19629,-0.52734 0.4541,-0.53223 0.4541,-1.41113 v -0.2002 z m 1.79199,-0.37109 v 3.12011 h -0.89844 v -0.83007 q -0.30761,0.49804 -0.7666,0.7373 -0.45898,0.23437 -1.12305,0.23437 -0.83984,0 -1.33789,-0.46875 -0.49316,-0.47363 -0.49316,-1.26464 0,-0.92286 0.61523,-1.39161 0.62012,-0.46875 1.84571,-0.46875 h 1.25976 v -0.0879 q 0,-0.62011 -0.41015,-0.95703 -0.40528,-0.34179 -1.14258,-0.34179 -0.46875,0 -0.91309,0.1123 -0.44433,0.11231 -0.85449,0.33691 v -0.83007 q 0.49316,-0.19043 0.95703,-0.28321 0.46387,-0.0976 0.90332,-0.0976 1.18653,0 1.77246,0.61523 0.58594,0.61524 0.58594,1.86524 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4111" />
|
|
||||||
<path
|
|
||||||
d="m 237.33305,457.9809 q -0.72265,0 -1.14257,0.5664 -0.41993,0.56153 -0.41993,1.54297 0,0.98145 0.41504,1.54785 0.41992,0.56153 1.14746,0.56153 0.71778,0 1.1377,-0.56641 0.41992,-0.56641 0.41992,-1.54297 0,-0.97168 -0.41992,-1.53808 -0.41992,-0.57129 -1.1377,-0.57129 z m 0,-0.76172 q 1.17188,0 1.84082,0.76172 0.66895,0.76171 0.66895,2.10937 0,1.34277 -0.66895,2.10938 -0.66894,0.76171 -1.84082,0.76171 -1.17675,0 -1.8457,-0.76171 -0.66406,-0.76661 -0.66406,-2.10938 0,-1.34766 0.66406,-2.10937 0.66895,-0.76172 1.8457,-0.76172 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4113" />
|
|
||||||
<path
|
|
||||||
d="m 244.49614,458.19086 q -0.15137,-0.0879 -0.33203,-0.12696 -0.17578,-0.0439 -0.39063,-0.0439 -0.76172,0 -1.17187,0.49805 -0.40528,0.49316 -0.40528,1.42089 v 2.88086 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.28321,-0.49804 0.73731,-0.7373 0.4541,-0.24414 1.10352,-0.24414 0.0928,0 0.20507,0.0147 0.11231,0.01 0.24903,0.0342 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4115" />
|
|
||||||
<path
|
|
||||||
d="m 245.44829,457.35101 h 0.89844 v 5.46875 h -0.89844 z m 0,-2.1289 h 0.89844 v 1.13769 h -0.89844 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4117" />
|
|
||||||
<path
|
|
||||||
d="m 251.82036,460.02191 q 0,-0.97656 -0.40528,-1.51367 -0.40039,-0.53711 -1.12792,-0.53711 -0.72266,0 -1.12793,0.53711 -0.4004,0.53711 -0.4004,1.51367 0,0.97168 0.4004,1.50879 0.40527,0.53711 1.12793,0.53711 0.72753,0 1.12792,-0.53711 0.40528,-0.53711 0.40528,-1.50879 z m 0.89844,2.11914 q 0,1.39649 -0.62012,2.0752 -0.62012,0.68359 -1.89942,0.68359 -0.47363,0 -0.89355,-0.0732 -0.41992,-0.0684 -0.81543,-0.21484 v -0.87403 q 0.39551,0.21485 0.78125,0.31738 0.38574,0.10254 0.78613,0.10254 0.88379,0 1.32325,-0.46386 0.43945,-0.45899 0.43945,-1.3916 v -0.44434 q -0.27832,0.4834 -0.71289,0.72266 -0.43457,0.23925 -1.04004,0.23925 -1.00586,0 -1.6211,-0.7666 -0.61523,-0.7666 -0.61523,-2.03125 0,-1.26953 0.61523,-2.03613 0.61524,-0.7666 1.6211,-0.7666 0.60547,0 1.04004,0.23926 0.43457,0.23925 0.71289,0.72265 v -0.83008 h 0.89844 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4119" />
|
|
||||||
<path
|
|
||||||
d="m 254.56938,457.35101 h 0.89844 v 5.46875 h -0.89844 z m 0,-2.1289 h 0.89844 v 1.13769 h -0.89844 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4121" />
|
|
||||||
<path
|
|
||||||
d="m 261.88872,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30273,-1.16211 -0.30274,-0.38574 -0.90821,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32227,-0.49316 0.75684,-0.7373 0.43945,-0.24414 1.01074,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path4123" />
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 109 KiB |
103
docs/vulkan.dox
103
docs/vulkan.dox
|
@ -1,26 +1,26 @@
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
@page vulkan_guide Vulkan guide
|
@page vulkan_guide Vulkan guide
|
||||||
|
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide is intended to fill the gaps between the official [Vulkan
|
This guide is intended to fill the gaps between the [Vulkan
|
||||||
resources](https://www.khronos.org/vulkan/) and the rest of the GLFW
|
documentation](https://www.khronos.org/vulkan/) and the rest of the GLFW
|
||||||
documentation and is not a replacement for either. It assumes some familiarity
|
documentation and is not a replacement for either. It assumes some familiarity
|
||||||
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to
|
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to
|
||||||
the Vulkan documentation to explain the details of Vulkan functions.
|
the Vulkan documentation to explain the details of Vulkan functions.
|
||||||
|
|
||||||
To develop for Vulkan you should download the [LunarG Vulkan
|
To develop for Vulkan you should install an SDK for your platform, for example
|
||||||
SDK](https://vulkan.lunarg.com/) for your platform. Apart from headers and link
|
the [LunarG Vulkan SDK](https://vulkan.lunarg.com/). Apart from the headers and
|
||||||
libraries, they also provide the validation layers necessary for development.
|
libraries, it also provides the validation layers necessary for development.
|
||||||
|
|
||||||
The [Vulkan Tutorial](https://vulkan-tutorial.com/) has more information on how
|
The GLFW library does not need the Vulkan SDK to enable support for Vulkan.
|
||||||
to use GLFW and Vulkan. The [Khronos Vulkan
|
However, any Vulkan-specific test and example programs are built only if the
|
||||||
Samples](https://github.com/KhronosGroup/Vulkan-Samples) also use GLFW, although
|
CMake files find a Vulkan SDK.
|
||||||
with a small framework in between.
|
|
||||||
|
|
||||||
For details on a specific Vulkan support function, see the @ref vulkan. There
|
For details on a specific function, see the
|
||||||
are also guides for the other areas of the GLFW API.
|
[reference documentation](@ref vulkan). There are also guides for the other
|
||||||
|
areas of the GLFW API.
|
||||||
|
|
||||||
- @ref intro_guide
|
- @ref intro_guide
|
||||||
- @ref window_guide
|
- @ref window_guide
|
||||||
|
@ -29,56 +29,26 @@ are also guides for the other areas of the GLFW API.
|
||||||
- @ref input_guide
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_loader Finding the Vulkan loader
|
@section vulkan_include Including the Vulkan and GLFW header files
|
||||||
|
|
||||||
GLFW itself does not ever need to be linked against the Vulkan loader.
|
To include the Vulkan header, define [GLFW_INCLUDE_VULKAN](@ref build_macros)
|
||||||
|
before including the GLFW header.
|
||||||
By default, GLFW will load the Vulkan loader dynamically at runtime via its standard name:
|
|
||||||
`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other Unix-like systems and
|
|
||||||
`libvulkan.1.dylib` on macOS.
|
|
||||||
|
|
||||||
@macos GLFW will also look up and search the `Frameworks` subdirectory of your
|
|
||||||
application bundle.
|
|
||||||
|
|
||||||
If your code is using a Vulkan loader with a different name or in a non-standard location
|
|
||||||
you will need to direct GLFW to it. Pass your version of `vkGetInstanceProcAddr` to @ref
|
|
||||||
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
|
|
||||||
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
|
|
||||||
[SDK documentation for macOS](https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html).
|
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_include Including the Vulkan header file
|
|
||||||
|
|
||||||
To have GLFW include the Vulkan header, define @ref GLFW_INCLUDE_VULKAN before including
|
|
||||||
the GLFW header.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#define GLFW_INCLUDE_VULKAN
|
#define GLFW_INCLUDE_VULKAN
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
If you instead want to include the Vulkan header from a custom location or use
|
If you want to include the Vulkan header from a custom location or use your own
|
||||||
your own custom Vulkan header then do this before the GLFW header.
|
custom Vulkan header then you need to include them before the GLFW header.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#include <path/to/vulkan.h>
|
#include <path/to/vulkan.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Unless a Vulkan header is included, either by the GLFW header or above it, the following
|
Unless a Vulkan header is included, either by the GLFW header or above it, any
|
||||||
GLFW functions will not be declared, as depend on Vulkan types.
|
GLFW functions that take or return Vulkan types will not be declared.
|
||||||
|
|
||||||
- @ref glfwInitVulkanLoader
|
|
||||||
- @ref glfwGetInstanceProcAddress
|
|
||||||
- @ref glfwGetPhysicalDevicePresentationSupport
|
|
||||||
- @ref glfwCreateWindowSurface
|
|
||||||
|
|
||||||
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part
|
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part
|
||||||
of GLFW to work. Define them only if you are using these extensions directly.
|
of GLFW to work. Define them only if you are using these extensions directly.
|
||||||
|
@ -91,7 +61,7 @@ section. The canonical desktop loader library exports all Vulkan core and
|
||||||
Khronos extension functions, allowing them to be called directly.
|
Khronos extension functions, allowing them to be called directly.
|
||||||
|
|
||||||
If you are loading the Vulkan loader dynamically instead of linking directly
|
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
|
against it, you can check for the availability of a loader with @ref
|
||||||
glfwVulkanSupported.
|
glfwVulkanSupported.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
@ -101,11 +71,11 @@ if (glfwVulkanSupported())
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
This function returns `GLFW_TRUE` if the Vulkan loader and any minimally
|
This function returns `GLFW_TRUE` if the Vulkan loader was found. This check is
|
||||||
functional ICD was found.
|
performed by @ref glfwInit.
|
||||||
|
|
||||||
If one or both were not found, calling any other Vulkan related GLFW function
|
If no loader was found, calling any other Vulkan related GLFW function will
|
||||||
will generate a @ref GLFW_API_UNAVAILABLE error.
|
generate a @ref GLFW_API_UNAVAILABLE error.
|
||||||
|
|
||||||
|
|
||||||
@subsection vulkan_proc Querying Vulkan function pointers
|
@subsection vulkan_proc Querying Vulkan function pointers
|
||||||
|
@ -142,7 +112,7 @@ PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)
|
||||||
glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr");
|
glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr");
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
Device-specific functions may execute a little faster, due to not having to
|
Device-specific functions may execute a little bit faster, due to not having to
|
||||||
dispatch internally based on the device passed to them. For more information
|
dispatch internally based on the device passed to them. For more information
|
||||||
about `vkGetDeviceProcAddr`, see the Vulkan documentation.
|
about `vkGetDeviceProcAddr`, see the Vulkan documentation.
|
||||||
|
|
||||||
|
@ -170,9 +140,9 @@ If it fails it will return `NULL` and GLFW will not be able to create Vulkan
|
||||||
window surfaces. You can still use Vulkan for off-screen rendering and compute
|
window surfaces. You can still use Vulkan for off-screen rendering and compute
|
||||||
work.
|
work.
|
||||||
|
|
||||||
If successful the returned array will always include `VK_KHR_surface`, so if
|
The returned array will always contain `VK_KHR_surface`, so if you don't
|
||||||
you don't require any additional extensions you can pass this list directly to
|
require any additional extensions you can pass this list directly to the
|
||||||
the `VkInstanceCreateInfo` struct.
|
`VkInstanceCreateInfo` struct.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
VkInstanceCreateInfo ici;
|
VkInstanceCreateInfo ici;
|
||||||
|
@ -186,14 +156,7 @@ ici.ppEnabledExtensionNames = extensions;
|
||||||
Additional extensions may be required by future versions of GLFW. You should
|
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
|
check whether 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
|
array, as it is an error to specify an extension more than once in the
|
||||||
`VkInstanceCreateInfo` struct.
|
`VkInstanceCreateInfo` struct.
|
||||||
|
|
||||||
@macos MoltenVK is (as of July 2022) not yet a fully conformant implementation
|
|
||||||
of Vulkan. As of Vulkan SDK 1.3.216.0, this means you must also enable the
|
|
||||||
`VK_KHR_portability_enumeration` instance extension and set the
|
|
||||||
`VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR` bit in the instance creation
|
|
||||||
info flags for MoltenVK to show up in the list of physical devices. For more
|
|
||||||
information, see the Vulkan and MoltenVK documentation.
|
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_present Querying for Vulkan presentation support
|
@section vulkan_present Querying for Vulkan presentation support
|
||||||
|
@ -210,7 +173,7 @@ if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_fa
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The `VK_KHR_surface` extension additionally provides the
|
The `VK_KHR_surface` extension additionally provides the
|
||||||
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on
|
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on
|
||||||
an existing Vulkan surface.
|
an existing Vulkan surface.
|
||||||
|
|
||||||
|
@ -219,7 +182,7 @@ an existing Vulkan surface.
|
||||||
|
|
||||||
Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan,
|
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
|
there is no need to create a context. You can disable context creation with the
|
||||||
[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint.
|
[GLFW_CLIENT_API](@ref window_hints_ctx) hint.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||||
|
@ -243,10 +206,6 @@ if (err)
|
||||||
}
|
}
|
||||||
@endcode
|
@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
|
|
||||||
created.
|
|
||||||
|
|
||||||
It is your responsibility to destroy the surface. GLFW does not destroy it for
|
It is your responsibility to destroy the surface. GLFW does not destroy it for
|
||||||
you. Call `vkDestroySurfaceKHR` function from the same extension to destroy it.
|
you. Call `vkDestroySurfaceKHR` function from the same extension to destroy it.
|
||||||
|
|
||||||
|
|
959
docs/window.dox
959
docs/window.dox
File diff suppressed because it is too large
Load Diff
|
@ -1,63 +1,51 @@
|
||||||
|
|
||||||
link_libraries(glfw)
|
link_libraries(glfw)
|
||||||
|
|
||||||
include_directories("${GLFW_SOURCE_DIR}/deps")
|
include_directories(${glfw_INCLUDE_DIRS})
|
||||||
|
|
||||||
if (MATH_LIBRARY)
|
if (BUILD_SHARED_LIBS)
|
||||||
link_libraries("${MATH_LIBRARY}")
|
link_libraries("${MATH_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Workaround for the MS CRT deprecating parts of the standard library
|
if (MSVC)
|
||||||
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include_directories("${GLFW_SOURCE_DIR}/deps")
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(ICON glfw.rc)
|
set(ICON glfw.rc)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set(ICON glfw.icns)
|
set(ICON glfw.icns)
|
||||||
|
set_source_files_properties(glfw.icns PROPERTIES
|
||||||
|
MAXOSX_PACKAGE_LOCATION "Resources")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h")
|
set(GLAD "${GLFW_SOURCE_DIR}/deps/glad/glad.h"
|
||||||
set(GLAD_GLES2 "${GLFW_SOURCE_DIR}/deps/glad/gles2.h")
|
"${GLFW_SOURCE_DIR}/deps/glad.c")
|
||||||
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/getopt.c")
|
"${GLFW_SOURCE_DIR}/deps/getopt.c")
|
||||||
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
||||||
|
|
||||||
add_executable(boing WIN32 MACOSX_BUNDLE boing.c ${ICON} ${GLAD_GL})
|
add_executable(boing WIN32 MACOSX_BUNDLE boing.c ${ICON} ${GLAD})
|
||||||
add_executable(gears WIN32 MACOSX_BUNDLE gears.c ${ICON} ${GLAD_GL})
|
add_executable(gears WIN32 MACOSX_BUNDLE gears.c ${ICON} ${GLAD})
|
||||||
add_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD_GL})
|
add_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD})
|
||||||
add_executable(offscreen offscreen.c ${ICON} ${GLAD_GL})
|
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD})
|
||||||
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD_GL})
|
add_executable(simple WIN32 MACOSX_BUNDLE simple.c ${ICON} ${GLAD})
|
||||||
add_executable(sharing WIN32 MACOSX_BUNDLE sharing.c ${ICON} ${GLAD_GL})
|
add_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD})
|
||||||
add_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD_GL})
|
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD})
|
||||||
add_executable(triangle-opengl WIN32 MACOSX_BUNDLE triangle-opengl.c ${ICON} ${GLAD_GL})
|
|
||||||
add_executable(triangle-opengles WIN32 MACOSX_BUNDLE triangle-opengles.c ${ICON} ${GLAD_GLES2})
|
|
||||||
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD_GL})
|
|
||||||
add_executable(windows WIN32 MACOSX_BUNDLE windows.c ${ICON} ${GLAD_GL})
|
|
||||||
|
|
||||||
target_link_libraries(particles Threads::Threads)
|
target_link_libraries(particles "${CMAKE_THREAD_LIBS_INIT}" "${RT_LIBRARY}")
|
||||||
if (RT_LIBRARY)
|
|
||||||
target_link_libraries(particles "${RT_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(GUI_ONLY_BINARIES boing gears heightmap particles sharing splitview
|
set(WINDOWS_BINARIES boing gears heightmap particles simple splitview wave)
|
||||||
triangle-opengl triangle-opengles wave windows)
|
|
||||||
set(CONSOLE_BINARIES offscreen)
|
|
||||||
|
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
set_target_properties(${WINDOWS_BINARIES} PROPERTIES FOLDER "GLFW3/Examples")
|
||||||
C_STANDARD 99
|
|
||||||
FOLDER "GLFW3/Examples")
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
# Tell MSVC to use main instead of WinMain
|
# Tell MSVC to use main instead of WinMain for Windows subsystem executables
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
set_target_properties(${WINDOWS_BINARIES} PROPERTIES
|
||||||
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
||||||
elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
|
||||||
# Tell Clang using MS CRT to use main instead of WinMain
|
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
|
||||||
LINK_FLAGS "-Wl,/entry:mainCRTStartup")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
|
@ -65,19 +53,15 @@ if (APPLE)
|
||||||
set_target_properties(gears PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gears")
|
set_target_properties(gears PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gears")
|
||||||
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
||||||
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
||||||
set_target_properties(sharing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Sharing")
|
set_target_properties(simple PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Simple")
|
||||||
set_target_properties(triangle-opengl PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "OpenGL Triangle")
|
|
||||||
set_target_properties(triangle-opengles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "OpenGL ES Triangle")
|
|
||||||
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
||||||
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
||||||
set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows")
|
|
||||||
|
|
||||||
set_source_files_properties(glfw.icns PROPERTIES
|
set_target_properties(${WINDOWS_BINARIES} PROPERTIES
|
||||||
MACOSX_PACKAGE_LOCATION "Resources")
|
RESOURCE glfw.icns
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION_FULL}
|
||||||
MACOSX_BUNDLE_ICON_FILE glfw.icns
|
MACOSX_BUNDLE_ICON_FILE glfw.icns
|
||||||
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/Info.plist.in")
|
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/MacOSXBundleInfo.plist.in")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
|
@ -167,7 +165,7 @@ void CrossProduct( vertex_t a, vertex_t b, vertex_t c, vertex_t *n )
|
||||||
v2 = c.y - a.y;
|
v2 = c.y - a.y;
|
||||||
v3 = c.z - a.z;
|
v3 = c.z - a.z;
|
||||||
|
|
||||||
n->x = u2 * v3 - v2 * u3;
|
n->x = u2 * v3 - v2 * v3;
|
||||||
n->y = u3 * v1 - v3 * u1;
|
n->y = u3 * v1 - v3 * u1;
|
||||||
n->z = u1 * v2 - v1 * u2;
|
n->z = u1 * v2 - v1 * u2;
|
||||||
}
|
}
|
||||||
|
@ -304,7 +302,7 @@ void cursor_position_callback( GLFWwindow* window, double x, double y )
|
||||||
* The Boing ball is sphere in which each facet is a rectangle.
|
* The Boing ball is sphere in which each facet is a rectangle.
|
||||||
* Facet colors alternate between red and white.
|
* Facet colors alternate between red and white.
|
||||||
* The ball is built by stacking latitudinal circles. Each circle is composed
|
* The ball is built by stacking latitudinal circles. Each circle is composed
|
||||||
* of a widely-separated set of points, so that each facet is noticeably large.
|
* of a widely-separated set of points, so that each facet is noticably large.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void DrawBoingBall( void )
|
void DrawBoingBall( void )
|
||||||
{
|
{
|
||||||
|
@ -448,7 +446,7 @@ void DrawBoingBallBand( GLfloat long_lo,
|
||||||
static int colorToggle = 0;
|
static int colorToggle = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iterate through the points of a latitude circle.
|
* Iterate thru the points of a latitude circle.
|
||||||
* A latitude circle is a 2D set of X,Z points.
|
* A latitude circle is a 2D set of X,Z points.
|
||||||
*/
|
*/
|
||||||
for ( lat_deg = 0;
|
for ( lat_deg = 0;
|
||||||
|
@ -644,7 +642,7 @@ int main( void )
|
||||||
glfwSetCursorPosCallback(window, cursor_position_callback);
|
glfwSetCursorPosCallback(window, cursor_position_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
* - Slightly modified camera that should work better for stereo viewing
|
* - Slightly modified camera that should work better for stereo viewing
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Camilla Löwy:
|
* Camilla Berglund:
|
||||||
* - Removed FPS counter (this is not a benchmark)
|
* - Removed FPS counter (this is not a benchmark)
|
||||||
* - Added a few comments
|
* - Added a few comments
|
||||||
* - Enabled vsync
|
* - Enabled vsync
|
||||||
|
@ -31,9 +31,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -174,7 +172,6 @@ static GLfloat angle = 0.f;
|
||||||
/* OpenGL draw function & timing */
|
/* OpenGL draw function & timing */
|
||||||
static void draw(void)
|
static void draw(void)
|
||||||
{
|
{
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
@ -314,7 +311,6 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
||||||
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
|
|
||||||
|
|
||||||
window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
|
window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
|
||||||
if (!window)
|
if (!window)
|
||||||
|
@ -329,7 +325,7 @@ int main(int argc, char *argv[])
|
||||||
glfwSetKeyCallback(window, key);
|
glfwSetKeyCallback(window, key);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
|
|
||||||
GLFW_ICON ICON "glfw.ico"
|
GLFW_ICON ICON "glfw.ico"
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
/* Map height updates */
|
/* Map height updates */
|
||||||
|
@ -293,12 +291,12 @@ static void generate_heightmap__circle(float* center_x, float* center_y,
|
||||||
{
|
{
|
||||||
float sign;
|
float sign;
|
||||||
/* random value for element in between [0-1.0] */
|
/* random value for element in between [0-1.0] */
|
||||||
*center_x = (MAP_SIZE * rand()) / (float) RAND_MAX;
|
*center_x = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);
|
||||||
*center_y = (MAP_SIZE * rand()) / (float) RAND_MAX;
|
*center_y = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);
|
||||||
*size = (MAX_CIRCLE_SIZE * rand()) / (float) RAND_MAX;
|
*size = (MAX_CIRCLE_SIZE * rand()) / (1.0f * RAND_MAX);
|
||||||
sign = (1.0f * rand()) / (float) RAND_MAX;
|
sign = (1.0f * rand()) / (1.0f * RAND_MAX);
|
||||||
sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f;
|
sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f;
|
||||||
*displacement = (sign * (MAX_DISPLACEMENT * rand())) / (float) RAND_MAX;
|
*displacement = (sign * (MAX_DISPLACEMENT * rand())) / (1.0f * RAND_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run the specified number of iterations of the generation process for the
|
/* Run the specified number of iterations of the generation process for the
|
||||||
|
@ -434,7 +432,7 @@ int main(int argc, char** argv)
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
|
|
||||||
/* Prepare opengl resources for rendering */
|
/* Prepare opengl resources for rendering */
|
||||||
shader_program = make_shader_program(vertex_shader_text, fragment_shader_text);
|
shader_program = make_shader_program(vertex_shader_text, fragment_shader_text);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// A simple particle engine with threaded physics
|
// A simple particle engine with threaded physics
|
||||||
// Copyright (c) Marcus Geelnard
|
// Copyright (c) Marcus Geelnard
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -39,9 +39,7 @@
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
// Define tokens for GL_EXT_separate_specular_color if not already defined
|
// Define tokens for GL_EXT_separate_specular_color if not already defined
|
||||||
|
@ -445,7 +443,7 @@ static void draw_particles(GLFWwindow* window, double t, float dt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up vertex arrays. We use interleaved arrays, which is easier to
|
// Set up vertex arrays. We use interleaved arrays, which is easier to
|
||||||
// handle (in most situations) and it gives a linear memory access
|
// handle (in most situations) and it gives a linear memeory access
|
||||||
// access pattern (which may give better performance in some
|
// access pattern (which may give better performance in some
|
||||||
// situations). GL_T2F_C4UB_V3F means: 2 floats for texture coords,
|
// situations). GL_T2F_C4UB_V3F means: 2 floats for texture coords,
|
||||||
// 4 ubytes for color and 3 floats for vertex coord (in that order).
|
// 4 ubytes for color and 3 floats for vertex coord (in that order).
|
||||||
|
@ -459,9 +457,7 @@ static void draw_particles(GLFWwindow* window, double t, float dt)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
ts.tv_nsec += 100 * 1000 * 1000;
|
ts.tv_nsec += 100000000;
|
||||||
ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);
|
|
||||||
ts.tv_nsec %= 1000 * 1000 * 1000;
|
|
||||||
cnd_timedwait(&thread_sync.p_done, &thread_sync.particles_lock, &ts);
|
cnd_timedwait(&thread_sync.p_done, &thread_sync.particles_lock, &ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +651,7 @@ static void draw_fountain(void)
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Recursive function for building variable tessellated floor
|
// Recursive function for building variable tesselated floor
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
static void tessellate_floor(float x1, float y1, float x2, float y2, int depth)
|
static void tessellate_floor(float x1, float y1, float x2, float y2, int depth)
|
||||||
|
@ -722,7 +718,7 @@ static void draw_floor(void)
|
||||||
glMaterialfv(GL_FRONT, GL_SPECULAR, floor_specular);
|
glMaterialfv(GL_FRONT, GL_SPECULAR, floor_specular);
|
||||||
glMaterialf(GL_FRONT, GL_SHININESS, floor_shininess);
|
glMaterialf(GL_FRONT, GL_SHININESS, floor_shininess);
|
||||||
|
|
||||||
// Draw floor as a bunch of triangle strips (high tessellation
|
// Draw floor as a bunch of triangle strips (high tesselation
|
||||||
// improves lighting)
|
// improves lighting)
|
||||||
glNormal3f(0.f, 0.f, 1.f);
|
glNormal3f(0.f, 0.f, 1.f);
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
@ -912,9 +908,7 @@ static int physics_thread_main(void* arg)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
ts.tv_nsec += 100 * 1000 * 1000;
|
ts.tv_nsec += 100000000;
|
||||||
ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);
|
|
||||||
ts.tv_nsec %= 1000 * 1000 * 1000;
|
|
||||||
cnd_timedwait(&thread_sync.d_done, &thread_sync.particles_lock, &ts);
|
cnd_timedwait(&thread_sync.d_done, &thread_sync.particles_lock, &ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -996,7 +990,7 @@ int main(int argc, char** argv)
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetFramebufferSizeCallback(window, resize_callback);
|
glfwSetFramebufferSizeCallback(window, resize_callback);
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
//========================================================================
|
|
||||||
// Context sharing example
|
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "getopt.h"
|
|
||||||
#include "linmath.h"
|
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
|
||||||
"#version 110\n"
|
|
||||||
"uniform mat4 MVP;\n"
|
|
||||||
"attribute vec2 vPos;\n"
|
|
||||||
"varying vec2 texcoord;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
|
||||||
" texcoord = vPos;\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
|
||||||
"#version 110\n"
|
|
||||||
"uniform sampler2D texture;\n"
|
|
||||||
"uniform vec3 color;\n"
|
|
||||||
"varying vec2 texcoord;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_FragColor = vec4(color * texture2D(texture, texcoord).rgb, 1.0);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static const vec2 vertices[4] =
|
|
||||||
{
|
|
||||||
{ 0.f, 0.f },
|
|
||||||
{ 1.f, 0.f },
|
|
||||||
{ 1.f, 1.f },
|
|
||||||
{ 0.f, 1.f }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Error: %s\n", description);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
|
||||||
{
|
|
||||||
if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)
|
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
GLFWwindow* windows[2];
|
|
||||||
GLuint texture, program, vertex_buffer;
|
|
||||||
GLint mvp_location, vpos_location, color_location, texture_location;
|
|
||||||
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
|
|
||||||
if (!glfwInit())
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
||||||
|
|
||||||
windows[0] = glfwCreateWindow(400, 400, "First", NULL, NULL);
|
|
||||||
if (!windows[0])
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetKeyCallback(windows[0], key_callback);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(windows[0]);
|
|
||||||
|
|
||||||
// Only enable vsync for the first of the windows to be swapped to
|
|
||||||
// avoid waiting out the interval for each window
|
|
||||||
glfwSwapInterval(1);
|
|
||||||
|
|
||||||
// The contexts are created with the same APIs so the function
|
|
||||||
// pointers should be re-usable between them
|
|
||||||
gladLoadGL(glfwGetProcAddress);
|
|
||||||
|
|
||||||
// Create the OpenGL objects inside the first context, created above
|
|
||||||
// All objects will be shared with the second context, created below
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
char pixels[16 * 16];
|
|
||||||
GLuint vertex_shader, fragment_shader;
|
|
||||||
|
|
||||||
glGenTextures(1, &texture);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
|
||||||
|
|
||||||
srand((unsigned int) glfwGetTimerValue());
|
|
||||||
|
|
||||||
for (y = 0; y < 16; y++)
|
|
||||||
{
|
|
||||||
for (x = 0; x < 16; x++)
|
|
||||||
pixels[y * 16 + x] = rand() % 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
|
|
||||||
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
|
||||||
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
|
||||||
glCompileShader(vertex_shader);
|
|
||||||
|
|
||||||
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
||||||
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
|
||||||
glCompileShader(fragment_shader);
|
|
||||||
|
|
||||||
program = glCreateProgram();
|
|
||||||
glAttachShader(program, vertex_shader);
|
|
||||||
glAttachShader(program, fragment_shader);
|
|
||||||
glLinkProgram(program);
|
|
||||||
|
|
||||||
mvp_location = glGetUniformLocation(program, "MVP");
|
|
||||||
color_location = glGetUniformLocation(program, "color");
|
|
||||||
texture_location = glGetUniformLocation(program, "texture");
|
|
||||||
vpos_location = glGetAttribLocation(program, "vPos");
|
|
||||||
|
|
||||||
glGenBuffers(1, &vertex_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
glUseProgram(program);
|
|
||||||
glUniform1i(texture_location, 0);
|
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(vertices[0]), (void*) 0);
|
|
||||||
|
|
||||||
windows[1] = glfwCreateWindow(400, 400, "Second", NULL, windows[0]);
|
|
||||||
if (!windows[1])
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Place the second window to the right of the first
|
|
||||||
{
|
|
||||||
int xpos, ypos, left, right, width;
|
|
||||||
|
|
||||||
glfwGetWindowSize(windows[0], &width, NULL);
|
|
||||||
glfwGetWindowFrameSize(windows[0], &left, NULL, &right, NULL);
|
|
||||||
glfwGetWindowPos(windows[0], &xpos, &ypos);
|
|
||||||
|
|
||||||
glfwSetWindowPos(windows[1], xpos + width + left + right, ypos);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetKeyCallback(windows[1], key_callback);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(windows[1]);
|
|
||||||
|
|
||||||
// While objects are shared, the global context state is not and will
|
|
||||||
// need to be set up for each context
|
|
||||||
|
|
||||||
glUseProgram(program);
|
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(vertices[0]), (void*) 0);
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(windows[0]) &&
|
|
||||||
!glfwWindowShouldClose(windows[1]))
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
const vec3 colors[2] =
|
|
||||||
{
|
|
||||||
{ 0.8f, 0.4f, 1.f },
|
|
||||||
{ 0.3f, 0.4f, 1.f }
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
mat4x4 mvp;
|
|
||||||
|
|
||||||
glfwGetFramebufferSize(windows[i], &width, &height);
|
|
||||||
glfwMakeContextCurrent(windows[i]);
|
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
|
|
||||||
mat4x4_ortho(mvp, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f);
|
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
|
||||||
glUniform3fv(color_location, 1, colors[i]);
|
|
||||||
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
||||||
|
|
||||||
glfwSwapBuffers(windows[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwWaitEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Offscreen rendering example
|
// Simple GLFW example
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -22,10 +22,9 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
//! [code]
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include "linmath.h"
|
#include "linmath.h"
|
||||||
|
@ -33,9 +32,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
|
||||||
#include <stb_image_write.h>
|
|
||||||
|
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
float x, y;
|
float x, y;
|
||||||
|
@ -48,7 +44,6 @@ static const struct
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
static const char* vertex_shader_text =
|
||||||
"#version 110\n"
|
|
||||||
"uniform mat4 MVP;\n"
|
"uniform mat4 MVP;\n"
|
||||||
"attribute vec3 vCol;\n"
|
"attribute vec3 vCol;\n"
|
||||||
"attribute vec2 vPos;\n"
|
"attribute vec2 vPos;\n"
|
||||||
|
@ -60,7 +55,6 @@ static const char* vertex_shader_text =
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
static const char* fragment_shader_text =
|
||||||
"#version 110\n"
|
|
||||||
"varying vec3 color;\n"
|
"varying vec3 color;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -72,26 +66,25 @@ static void error_callback(int error, const char* description)
|
||||||
fprintf(stderr, "Error: %s\n", description);
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
GLFWwindow* window;
|
GLFWwindow* window;
|
||||||
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
|
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
|
||||||
GLint mvp_location, vpos_location, vcol_location;
|
GLint mvp_location, vpos_location, vcol_location;
|
||||||
float ratio;
|
|
||||||
int width, height;
|
|
||||||
mat4x4 mvp;
|
|
||||||
char* buffer;
|
|
||||||
|
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE);
|
|
||||||
|
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
|
||||||
|
|
||||||
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
|
@ -100,8 +93,11 @@ int main(void)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
// NOTE: OpenGL error checks have been omitted for brevity
|
// NOTE: OpenGL error checks have been omitted for brevity
|
||||||
|
|
||||||
|
@ -128,34 +124,35 @@ int main(void)
|
||||||
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
glEnableVertexAttribArray(vpos_location);
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
sizeof(vertices[0]), (void*) 0);
|
sizeof(float) * 5, (void*) 0);
|
||||||
glEnableVertexAttribArray(vcol_location);
|
glEnableVertexAttribArray(vcol_location);
|
||||||
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
||||||
sizeof(vertices[0]), (void*) (sizeof(float) * 2));
|
sizeof(float) * 5, (void*) (sizeof(float) * 2));
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
while (!glfwWindowShouldClose(window))
|
||||||
ratio = width / (float) height;
|
{
|
||||||
|
float ratio;
|
||||||
|
int width, height;
|
||||||
|
mat4x4 m, p, mvp;
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
ratio = width / (float) height;
|
||||||
|
|
||||||
mat4x4_ortho(mvp, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
glViewport(0, 0, width, height);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glUseProgram(program);
|
mat4x4_identity(m);
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
glFinish();
|
mat4x4_mul(mvp, p, m);
|
||||||
|
|
||||||
buffer = calloc(4, width * height);
|
glUseProgram(program);
|
||||||
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
// Write image Y-flipped because OpenGL
|
glfwSwapBuffers(window);
|
||||||
stbi_write_png("offscreen.png",
|
glfwPollEvents();
|
||||||
width, height, 4,
|
}
|
||||||
buffer + (width * 4 * (height - 1)),
|
|
||||||
-width * 4);
|
|
||||||
|
|
||||||
free(buffer);
|
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
|
|
||||||
|
@ -163,3 +160,4 @@ int main(void)
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! [code]
|
|
@ -2,17 +2,15 @@
|
||||||
// This is an example program for the GLFW library
|
// This is an example program for the GLFW library
|
||||||
//
|
//
|
||||||
// The program uses a "split window" view, rendering four views of the
|
// The program uses a "split window" view, rendering four views of the
|
||||||
// same scene in one window (e.g. useful for 3D modelling software). This
|
// same scene in one window (e.g. uesful for 3D modelling software). This
|
||||||
// demo uses scissors to separate the four different rendering areas from
|
// demo uses scissors to separete the four different rendering areas from
|
||||||
// each other.
|
// each other.
|
||||||
//
|
//
|
||||||
// (If the code seems a little bit strange here and there, it may be
|
// (If the code seems a little bit strange here and there, it may be
|
||||||
// because I am not a friend of orthogonal projections)
|
// because I am not a friend of orthogonal projections)
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
|
@ -515,7 +513,7 @@ int main(void)
|
||||||
|
|
||||||
// Enable vsync
|
// Enable vsync
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
if (GLAD_GL_ARB_multisample || GLAD_GL_VERSION_1_3)
|
if (GLAD_GL_ARB_multisample || GLAD_GL_VERSION_1_3)
|
||||||
|
|
|
@ -1,171 +0,0 @@
|
||||||
//========================================================================
|
|
||||||
// OpenGL triangle example
|
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
//! [code]
|
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#include "linmath.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct Vertex
|
|
||||||
{
|
|
||||||
vec2 pos;
|
|
||||||
vec3 col;
|
|
||||||
} Vertex;
|
|
||||||
|
|
||||||
static const Vertex vertices[3] =
|
|
||||||
{
|
|
||||||
{ { -0.6f, -0.4f }, { 1.f, 0.f, 0.f } },
|
|
||||||
{ { 0.6f, -0.4f }, { 0.f, 1.f, 0.f } },
|
|
||||||
{ { 0.f, 0.6f }, { 0.f, 0.f, 1.f } }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
|
||||||
"#version 330\n"
|
|
||||||
"uniform mat4 MVP;\n"
|
|
||||||
"in vec3 vCol;\n"
|
|
||||||
"in vec2 vPos;\n"
|
|
||||||
"out vec3 color;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
|
||||||
" color = vCol;\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
|
||||||
"#version 330\n"
|
|
||||||
"in vec3 color;\n"
|
|
||||||
"out vec4 fragment;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" fragment = vec4(color, 1.0);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Error: %s\n", description);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
|
|
||||||
if (!glfwInit())
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
|
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL Triangle", NULL, NULL);
|
|
||||||
if (!window)
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
|
||||||
gladLoadGL(glfwGetProcAddress);
|
|
||||||
glfwSwapInterval(1);
|
|
||||||
|
|
||||||
// NOTE: OpenGL error checks have been omitted for brevity
|
|
||||||
|
|
||||||
GLuint vertex_buffer;
|
|
||||||
glGenBuffers(1, &vertex_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
|
||||||
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
|
||||||
glCompileShader(vertex_shader);
|
|
||||||
|
|
||||||
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
||||||
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
|
||||||
glCompileShader(fragment_shader);
|
|
||||||
|
|
||||||
const GLuint program = glCreateProgram();
|
|
||||||
glAttachShader(program, vertex_shader);
|
|
||||||
glAttachShader(program, fragment_shader);
|
|
||||||
glLinkProgram(program);
|
|
||||||
|
|
||||||
const GLint mvp_location = glGetUniformLocation(program, "MVP");
|
|
||||||
const GLint vpos_location = glGetAttribLocation(program, "vPos");
|
|
||||||
const GLint vcol_location = glGetAttribLocation(program, "vCol");
|
|
||||||
|
|
||||||
GLuint vertex_array;
|
|
||||||
glGenVertexArrays(1, &vertex_array);
|
|
||||||
glBindVertexArray(vertex_array);
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, pos));
|
|
||||||
glEnableVertexAttribArray(vcol_location);
|
|
||||||
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, col));
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
|
||||||
const float ratio = width / (float) height;
|
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
mat4x4 m, p, mvp;
|
|
||||||
mat4x4_identity(m);
|
|
||||||
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
|
||||||
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
|
||||||
mat4x4_mul(mvp, p, m);
|
|
||||||
|
|
||||||
glUseProgram(program);
|
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) &mvp);
|
|
||||||
glBindVertexArray(vertex_array);
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
|
||||||
glfwPollEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
|
||||||
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! [code]
|
|
|
@ -1,170 +0,0 @@
|
||||||
//========================================================================
|
|
||||||
// OpenGL ES 2.0 triangle example
|
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#define GLAD_GLES2_IMPLEMENTATION
|
|
||||||
#include <glad/gles2.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#include "linmath.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct Vertex
|
|
||||||
{
|
|
||||||
vec2 pos;
|
|
||||||
vec3 col;
|
|
||||||
} Vertex;
|
|
||||||
|
|
||||||
static const Vertex vertices[3] =
|
|
||||||
{
|
|
||||||
{ { -0.6f, -0.4f }, { 1.f, 0.f, 0.f } },
|
|
||||||
{ { 0.6f, -0.4f }, { 0.f, 1.f, 0.f } },
|
|
||||||
{ { 0.f, 0.6f }, { 0.f, 0.f, 1.f } }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
|
||||||
"#version 100\n"
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"uniform mat4 MVP;\n"
|
|
||||||
"attribute vec3 vCol;\n"
|
|
||||||
"attribute vec2 vPos;\n"
|
|
||||||
"varying vec3 color;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
|
||||||
" color = vCol;\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
|
||||||
"#version 100\n"
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"varying vec3 color;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_FragColor = vec4(color, 1.0);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "GLFW Error: %s\n", description);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
|
|
||||||
if (!glfwInit())
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API);
|
|
||||||
|
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL ES 2.0 Triangle (EGL)", NULL, NULL);
|
|
||||||
if (!window)
|
|
||||||
{
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);
|
|
||||||
window = glfwCreateWindow(640, 480, "OpenGL ES 2.0 Triangle", NULL, NULL);
|
|
||||||
if (!window)
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
|
||||||
gladLoadGLES2(glfwGetProcAddress);
|
|
||||||
glfwSwapInterval(1);
|
|
||||||
|
|
||||||
GLuint vertex_buffer;
|
|
||||||
glGenBuffers(1, &vertex_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
|
||||||
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
|
||||||
glCompileShader(vertex_shader);
|
|
||||||
|
|
||||||
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
||||||
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
|
||||||
glCompileShader(fragment_shader);
|
|
||||||
|
|
||||||
const GLuint program = glCreateProgram();
|
|
||||||
glAttachShader(program, vertex_shader);
|
|
||||||
glAttachShader(program, fragment_shader);
|
|
||||||
glLinkProgram(program);
|
|
||||||
|
|
||||||
const GLint mvp_location = glGetUniformLocation(program, "MVP");
|
|
||||||
const GLint vpos_location = glGetAttribLocation(program, "vPos");
|
|
||||||
const GLint vcol_location = glGetAttribLocation(program, "vCol");
|
|
||||||
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
|
||||||
glEnableVertexAttribArray(vcol_location);
|
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, pos));
|
|
||||||
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, col));
|
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
|
||||||
const float ratio = width / (float) height;
|
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
mat4x4 m, p, mvp;
|
|
||||||
mat4x4_identity(m);
|
|
||||||
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
|
||||||
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
|
||||||
mat4x4_mul(mvp, p, m);
|
|
||||||
|
|
||||||
glUseProgram(program);
|
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) &mvp);
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
|
||||||
glfwPollEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
|
||||||
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
||||||
* Modified for variable frame rate by Marcus Geelnard
|
* Modified for variable frame rate by Marcus Geelnard
|
||||||
* 2003-Jan-31: Minor cleanups and speedups / MG
|
* 2003-Jan-31: Minor cleanups and speedups / MG
|
||||||
* 2010-10-24: Formatting and cleanup - Camilla Löwy
|
* 2010-10-24: Formatting and cleanup - Camilla Berglund
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
|
@ -17,9 +17,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
#include <glad/glad.h>
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
|
@ -414,7 +412,7 @@ int main(int argc, char* argv[])
|
||||||
glfwSetScrollCallback(window, scroll_callback);
|
glfwSetScrollCallback(window, scroll_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
@ -457,7 +455,6 @@ int main(int argc, char* argv[])
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,106 +0,0 @@
|
||||||
//========================================================================
|
|
||||||
// Simple multi-window example
|
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
int xpos, ypos, height;
|
|
||||||
const char* description;
|
|
||||||
GLFWwindow* windows[4];
|
|
||||||
|
|
||||||
if (!glfwInit())
|
|
||||||
{
|
|
||||||
glfwGetError(&description);
|
|
||||||
printf("Error: %s\n", description);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
||||||
|
|
||||||
glfwGetMonitorWorkarea(glfwGetPrimaryMonitor(), &xpos, &ypos, NULL, &height);
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
const int size = height / 5;
|
|
||||||
const struct
|
|
||||||
{
|
|
||||||
float r, g, b;
|
|
||||||
} colors[] =
|
|
||||||
{
|
|
||||||
{ 0.95f, 0.32f, 0.11f },
|
|
||||||
{ 0.50f, 0.80f, 0.16f },
|
|
||||||
{ 0.f, 0.68f, 0.94f },
|
|
||||||
{ 0.98f, 0.74f, 0.04f }
|
|
||||||
};
|
|
||||||
|
|
||||||
if (i > 0)
|
|
||||||
glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE);
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_POSITION_X, xpos + size * (1 + (i & 1)));
|
|
||||||
glfwWindowHint(GLFW_POSITION_Y, ypos + size * (1 + (i >> 1)));
|
|
||||||
|
|
||||||
windows[i] = glfwCreateWindow(size, size, "Multi-Window Example", NULL, NULL);
|
|
||||||
if (!windows[i])
|
|
||||||
{
|
|
||||||
glfwGetError(&description);
|
|
||||||
printf("Error: %s\n", description);
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetInputMode(windows[i], GLFW_STICKY_KEYS, GLFW_TRUE);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(windows[i]);
|
|
||||||
gladLoadGL(glfwGetProcAddress);
|
|
||||||
glClearColor(colors[i].r, colors[i].g, colors[i].b, 1.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
glfwMakeContextCurrent(windows[i]);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glfwSwapBuffers(windows[i]);
|
|
||||||
|
|
||||||
if (glfwWindowShouldClose(windows[i]) ||
|
|
||||||
glfwGetKey(windows[i], GLFW_KEY_ESCAPE))
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwWaitEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
3333
include/GLFW/glfw3.h
3333
include/GLFW/glfw3.h
File diff suppressed because it is too large
Load Diff
|
@ -1,9 +1,9 @@
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.4 - www.glfw.org
|
* GLFW 3.2 - www.glfw.org
|
||||||
* A library for OpenGL, window and input
|
* A library for OpenGL, window and input
|
||||||
*------------------------------------------------------------------------
|
*------------------------------------------------------------------------
|
||||||
* Copyright (c) 2002-2006 Marcus Geelnard
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
* Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
* Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -45,13 +45,12 @@ extern "C" {
|
||||||
* more information.
|
* more information.
|
||||||
*/
|
*/
|
||||||
/*! @defgroup native Native access
|
/*! @defgroup native Native access
|
||||||
* @brief Functions related to accessing native handles.
|
|
||||||
*
|
*
|
||||||
* **By using the native access functions you assert that you know what you're
|
* **By using the native access functions you assert that you know what you're
|
||||||
* doing and how to fix problems caused by using them. If you don't, you
|
* doing and how to fix problems caused by using them. If you don't, you
|
||||||
* shouldn't be using them.**
|
* shouldn't be using them.**
|
||||||
*
|
*
|
||||||
* Before the inclusion of @ref glfw3native.h, you may define zero or more
|
* Before the inclusion of @ref glfw3native.h, you may define exactly one
|
||||||
* window system API macro and zero or more context creation API macros.
|
* window system API macro and zero or more context creation API macros.
|
||||||
*
|
*
|
||||||
* The chosen backends must match those the library was compiled for. Failure
|
* The chosen backends must match those the library was compiled for. Failure
|
||||||
|
@ -62,28 +61,18 @@ extern "C" {
|
||||||
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
||||||
* * `GLFW_EXPOSE_NATIVE_X11`
|
* * `GLFW_EXPOSE_NATIVE_X11`
|
||||||
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_MIR`
|
||||||
*
|
*
|
||||||
* The available context API macros are:
|
* The available context API macros are:
|
||||||
* * `GLFW_EXPOSE_NATIVE_WGL`
|
* * `GLFW_EXPOSE_NATIVE_WGL`
|
||||||
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
||||||
* * `GLFW_EXPOSE_NATIVE_GLX`
|
* * `GLFW_EXPOSE_NATIVE_GLX`
|
||||||
* * `GLFW_EXPOSE_NATIVE_EGL`
|
* * `GLFW_EXPOSE_NATIVE_EGL`
|
||||||
* * `GLFW_EXPOSE_NATIVE_OSMESA`
|
|
||||||
*
|
*
|
||||||
* These macros select which of the native access functions that are declared
|
* These macros select which of the native access functions that are declared
|
||||||
* and which platform-specific headers to include. It is then up your (by
|
* and which platform-specific headers to include. It is then up your (by
|
||||||
* definition platform-specific) code to handle which of these should be
|
* definition platform-specific) code to handle which of these should be
|
||||||
* defined.
|
* defined.
|
||||||
*
|
|
||||||
* If you do not want the platform-specific headers to be included, define
|
|
||||||
* `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header.
|
|
||||||
*
|
|
||||||
* @code
|
|
||||||
* #define GLFW_EXPOSE_NATIVE_WIN32
|
|
||||||
* #define GLFW_EXPOSE_NATIVE_WGL
|
|
||||||
* #define GLFW_NATIVE_INCLUDE_NONE
|
|
||||||
* #include <GLFW/glfw3native.h>
|
|
||||||
* @endcode
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,71 +80,40 @@ extern "C" {
|
||||||
* System headers and types
|
* System headers and types
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
#if !defined(GLFW_NATIVE_INCLUDE_NONE)
|
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
|
||||||
|
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||||
|
// example to allow applications to correctly declare a GL_ARB_debug_output
|
||||||
|
// callback) but windows.h assumes no one will define APIENTRY before it does
|
||||||
|
#undef APIENTRY
|
||||||
|
#include <windows.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
|
||||||
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
#if defined(__OBJC__)
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#else
|
||||||
|
typedef void* id;
|
||||||
|
#endif
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_X11)
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/extensions/Xrandr.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_MIR)
|
||||||
|
#include <mir_toolkit/mir_client_library.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
|
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
/* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
/* WGL is declared by windows.h */
|
||||||
* example to allow applications to correctly declare a GL_KHR_debug callback)
|
#endif
|
||||||
* but windows.h assumes no one will define APIENTRY before it does
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
*/
|
/* NSGL is declared by Cocoa.h */
|
||||||
#if defined(GLFW_APIENTRY_DEFINED)
|
#endif
|
||||||
#undef APIENTRY
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
#undef GLFW_APIENTRY_DEFINED
|
#include <GL/glx.h>
|
||||||
#endif
|
#endif
|
||||||
#include <windows.h>
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
#endif
|
#include <EGL/egl.h>
|
||||||
|
#endif
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL)
|
|
||||||
#if defined(__OBJC__)
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#else
|
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
|
||||||
#include <objc/objc.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX)
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/Xrandr.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
|
||||||
/* WGL is declared by windows.h */
|
|
||||||
#endif
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
|
||||||
/* NSGL is declared by Cocoa.h */
|
|
||||||
#endif
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
|
||||||
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
|
||||||
* default it also acts as an OpenGL header
|
|
||||||
* However, glx.h will include gl.h, which will define it unconditionally
|
|
||||||
*/
|
|
||||||
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
|
||||||
#undef GLAPIENTRY
|
|
||||||
#undef GLFW_GLAPIENTRY_DEFINED
|
|
||||||
#endif
|
|
||||||
#include <GL/glx.h>
|
|
||||||
#endif
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
|
||||||
#include <EGL/egl.h>
|
|
||||||
#endif
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
|
||||||
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
|
||||||
* default it also acts as an OpenGL header
|
|
||||||
* However, osmesa.h will include gl.h, which will define it unconditionally
|
|
||||||
*/
|
|
||||||
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
|
||||||
#undef GLAPIENTRY
|
|
||||||
#undef GLFW_GLAPIENTRY_DEFINED
|
|
||||||
#endif
|
|
||||||
#include <GL/osmesa.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*GLFW_NATIVE_INCLUDE_NONE*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -169,8 +127,6 @@ extern "C" {
|
||||||
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
||||||
* occurred.
|
* occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -186,8 +142,6 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
|
||||||
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -202,16 +156,6 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
|
||||||
* @return The `HWND` of the specified window, or `NULL` if an
|
* @return The `HWND` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @remark The `HDC` associated with the window can be queried with the
|
|
||||||
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
|
||||||
* function.
|
|
||||||
* @code
|
|
||||||
* HDC dc = GetDC(glfwGetWin32Window(window));
|
|
||||||
* @endcode
|
|
||||||
* This DC is private and does not need to be released.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -228,17 +172,6 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
||||||
* @return The `HGLRC` of the specified window, or `NULL` if an
|
* @return The `HGLRC` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @remark The `HDC` associated with the window can be queried with the
|
|
||||||
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
|
||||||
* function.
|
|
||||||
* @code
|
|
||||||
* HDC dc = GetDC(glfwGetWin32Window(window));
|
|
||||||
* @endcode
|
|
||||||
* This DC is private and does not need to be released.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -255,8 +188,6 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
|
||||||
* @return The `CGDirectDisplayID` of the specified monitor, or
|
* @return The `CGDirectDisplayID` of the specified monitor, or
|
||||||
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -271,8 +202,6 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
||||||
* @return The `NSWindow` of the specified window, or `nil` if an
|
* @return The `NSWindow` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -289,9 +218,6 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
||||||
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -308,8 +234,6 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
|
||||||
* @return The `Display` used by GLFW, or `NULL` if an
|
* @return The `Display` used by GLFW, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -324,8 +248,6 @@ GLFWAPI Display* glfwGetX11Display(void);
|
||||||
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -340,8 +262,6 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
|
||||||
* @return The `RROutput` of the specified monitor, or `None` if an
|
* @return The `RROutput` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -356,8 +276,6 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
||||||
* @return The `Window` of the specified window, or `None` if an
|
* @return The `Window` of the specified window, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -366,56 +284,6 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
||||||
|
|
||||||
/*! @brief Sets the current primary selection to the specified string.
|
|
||||||
*
|
|
||||||
* @param[in] string A UTF-8 encoded string.
|
|
||||||
*
|
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
|
||||||
* GLFW_PLATFORM_ERROR.
|
|
||||||
*
|
|
||||||
* @pointer_lifetime The specified string is copied before this function
|
|
||||||
* returns.
|
|
||||||
*
|
|
||||||
* @thread_safety This function must only be called from the main thread.
|
|
||||||
*
|
|
||||||
* @sa @ref clipboard
|
|
||||||
* @sa glfwGetX11SelectionString
|
|
||||||
* @sa glfwSetClipboardString
|
|
||||||
*
|
|
||||||
* @since Added in version 3.3.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI void glfwSetX11SelectionString(const char* string);
|
|
||||||
|
|
||||||
/*! @brief Returns the contents of the current primary selection as a string.
|
|
||||||
*
|
|
||||||
* If the selection is empty or if its contents cannot be converted, `NULL`
|
|
||||||
* is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated.
|
|
||||||
*
|
|
||||||
* @return The contents of the selection as a UTF-8 encoded string, or `NULL`
|
|
||||||
* if an [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
|
||||||
* GLFW_PLATFORM_ERROR.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
* glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the
|
|
||||||
* library is terminated.
|
|
||||||
*
|
|
||||||
* @thread_safety This function must only be called from the main thread.
|
|
||||||
*
|
|
||||||
* @sa @ref clipboard
|
|
||||||
* @sa glfwSetX11SelectionString
|
|
||||||
* @sa glfwGetClipboardString
|
|
||||||
*
|
|
||||||
* @since Added in version 3.3.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI const char* glfwGetX11SelectionString(void);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
@ -424,9 +292,6 @@ GLFWAPI const char* glfwGetX11SelectionString(void);
|
||||||
* @return The `GLXContext` of the specified window, or `NULL` if an
|
* @return The `GLXContext` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -441,9 +306,6 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
||||||
* @return The `GLXWindow` of the specified window, or `None` if an
|
* @return The `GLXWindow` of the specified window, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -460,8 +322,6 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
||||||
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -476,8 +336,6 @@ GLFWAPI struct wl_display* glfwGetWaylandDisplay(void);
|
||||||
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -492,8 +350,6 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
||||||
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
||||||
* an [error](@ref error_handling) occurred.
|
* an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -504,17 +360,56 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
||||||
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_MIR)
|
||||||
|
/*! @brief Returns the `MirConnection*` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `MirConnection*` used by GLFW, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI MirConnection* glfwGetMirDisplay(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the Mir output ID of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The Mir output ID of the specified monitor, or zero if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `MirSurface*` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `MirSurface*` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
||||||
*
|
*
|
||||||
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @remark Because EGL is initialized on demand, this function will return
|
|
||||||
* `EGL_NO_DISPLAY` until the first context has been created via EGL.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -529,9 +424,6 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
|
||||||
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -546,9 +438,6 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
||||||
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
@ -559,73 +448,6 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
||||||
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
|
||||||
/*! @brief Retrieves the color buffer associated with the specified window.
|
|
||||||
*
|
|
||||||
* @param[in] window The window whose color buffer to retrieve.
|
|
||||||
* @param[out] width Where to store the width of the color buffer, or `NULL`.
|
|
||||||
* @param[out] height Where to store the height of the color buffer, or `NULL`.
|
|
||||||
* @param[out] format Where to store the OSMesa pixel format of the color
|
|
||||||
* buffer, or `NULL`.
|
|
||||||
* @param[out] buffer Where to store the address of the color buffer, or
|
|
||||||
* `NULL`.
|
|
||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.3.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer);
|
|
||||||
|
|
||||||
/*! @brief Retrieves the depth buffer associated with the specified window.
|
|
||||||
*
|
|
||||||
* @param[in] window The window whose depth buffer to retrieve.
|
|
||||||
* @param[out] width Where to store the width of the depth buffer, or `NULL`.
|
|
||||||
* @param[out] height Where to store the height of the depth buffer, or `NULL`.
|
|
||||||
* @param[out] bytesPerValue Where to store the number of bytes per depth
|
|
||||||
* buffer element, or `NULL`.
|
|
||||||
* @param[out] buffer Where to store the address of the depth buffer, or
|
|
||||||
* `NULL`.
|
|
||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.3.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer);
|
|
||||||
|
|
||||||
/*! @brief Returns the `OSMesaContext` of the specified window.
|
|
||||||
*
|
|
||||||
* @return The `OSMesaContext` of the specified window, or `NULL` if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
|
||||||
* GLFW_NOT_INITIALIZED.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.3.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
109
premake5.lua
109
premake5.lua
|
@ -1,109 +0,0 @@
|
||||||
project "GLFW"
|
|
||||||
kind "StaticLib"
|
|
||||||
language "C"
|
|
||||||
staticruntime "on"
|
|
||||||
|
|
||||||
targetdir ("bin/" .. outputdir .. "/%{prj.name}")
|
|
||||||
objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
|
|
||||||
|
|
||||||
files
|
|
||||||
{
|
|
||||||
"include/GLFW/glfw3.h",
|
|
||||||
"include/GLFW/glfw3native.h",
|
|
||||||
"src/glfw_config.h",
|
|
||||||
"src/context.c",
|
|
||||||
"src/init.c",
|
|
||||||
"src/input.c",
|
|
||||||
"src/monitor.c",
|
|
||||||
"src/vulkan.c",
|
|
||||||
"src/window.c",
|
|
||||||
"src/platform.c",
|
|
||||||
"src/null_init.c",
|
|
||||||
"src/null_monitor.c",
|
|
||||||
"src/null_window.c",
|
|
||||||
"src/null_joystick.c"
|
|
||||||
}
|
|
||||||
filter "system:linux"
|
|
||||||
pic "On"
|
|
||||||
|
|
||||||
systemversion "latest"
|
|
||||||
|
|
||||||
files
|
|
||||||
{
|
|
||||||
"src/x11_init.c",
|
|
||||||
"src/x11_monitor.c",
|
|
||||||
"src/x11_window.c",
|
|
||||||
"src/xkb_unicode.c",
|
|
||||||
"src/posix_time.c",
|
|
||||||
"src/posix_thread.c",
|
|
||||||
"src/posix_module.c",
|
|
||||||
"src/posix_poll.c",
|
|
||||||
"src/glx_context.c",
|
|
||||||
"src/egl_context.c",
|
|
||||||
"src/osmesa_context.c",
|
|
||||||
"src/linux_joystick.c",
|
|
||||||
"src/posix_poll.c"
|
|
||||||
}
|
|
||||||
|
|
||||||
defines
|
|
||||||
{
|
|
||||||
"_GLFW_X11"
|
|
||||||
}
|
|
||||||
filter "system:macosx"
|
|
||||||
pic "On"
|
|
||||||
systemversion "latest"
|
|
||||||
|
|
||||||
sysincludedirs {"include"}
|
|
||||||
files
|
|
||||||
{
|
|
||||||
"src/cocoa_init.m",
|
|
||||||
"src/cocoa_joystick.m",
|
|
||||||
"src/cocoa_monitor.m",
|
|
||||||
"src/cocoa_window.m",
|
|
||||||
"src/cocoa_time.c",
|
|
||||||
"src/posix_thread.c",
|
|
||||||
"src/posix_module.c",
|
|
||||||
"src/posix_poll.c",
|
|
||||||
"src/nsgl_context.m",
|
|
||||||
"src/egl_context.c",
|
|
||||||
"src/osmesa_context.c"
|
|
||||||
}
|
|
||||||
|
|
||||||
defines
|
|
||||||
{
|
|
||||||
defines "_GLFW_COCOA"
|
|
||||||
}
|
|
||||||
|
|
||||||
filter "files:**.m"
|
|
||||||
compileas "Objective-C"
|
|
||||||
|
|
||||||
filter "system:windows"
|
|
||||||
systemversion "latest"
|
|
||||||
|
|
||||||
files
|
|
||||||
{
|
|
||||||
"src/win32_init.c",
|
|
||||||
"src/win32_joystick.c",
|
|
||||||
"src/win32_monitor.c",
|
|
||||||
"src/win32_time.c",
|
|
||||||
"src/win32_thread.c",
|
|
||||||
"src/win32_window.c",
|
|
||||||
"src/win32_module.c",
|
|
||||||
"src/wgl_context.c",
|
|
||||||
"src/egl_context.c",
|
|
||||||
"src/osmesa_context.c"
|
|
||||||
}
|
|
||||||
|
|
||||||
defines
|
|
||||||
{
|
|
||||||
"_GLFW_WIN32",
|
|
||||||
"_CRT_SECURE_NO_WARNINGS"
|
|
||||||
}
|
|
||||||
|
|
||||||
filter "configurations:Debug"
|
|
||||||
runtime "Debug"
|
|
||||||
symbols "on"
|
|
||||||
|
|
||||||
filter "configurations:Release"
|
|
||||||
runtime "Release"
|
|
||||||
optimize "on"
|
|
|
@ -1,334 +1,90 @@
|
||||||
|
|
||||||
add_library(glfw ${GLFW_LIBRARY_TYPE}
|
set(common_HEADERS internal.h
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
"${GLFW_BINARY_DIR}/src/glfw_config.h"
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
||||||
internal.h platform.h mappings.h
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h")
|
||||||
context.c init.c input.c monitor.c platform.c vulkan.c window.c
|
set(common_SOURCES context.c init.c input.c monitor.c vulkan.c window.c)
|
||||||
egl_context.c osmesa_context.c null_platform.h null_joystick.h
|
|
||||||
null_init.c null_monitor.c null_window.c null_joystick.c)
|
if (_GLFW_COCOA)
|
||||||
|
set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h cocoa_joystick.h
|
||||||
|
posix_tls.h nsgl_context.h)
|
||||||
|
set(glfw_SOURCES ${common_SOURCES} cocoa_init.m cocoa_joystick.m
|
||||||
|
cocoa_monitor.m cocoa_window.m cocoa_time.c posix_tls.c
|
||||||
|
nsgl_context.m)
|
||||||
|
elseif (_GLFW_WIN32)
|
||||||
|
set(glfw_HEADERS ${common_HEADERS} win32_platform.h win32_joystick.h
|
||||||
|
wgl_context.h egl_context.h)
|
||||||
|
set(glfw_SOURCES ${common_SOURCES} win32_init.c win32_joystick.c
|
||||||
|
win32_monitor.c win32_time.c win32_tls.c win32_window.c
|
||||||
|
wgl_context.c egl_context.c)
|
||||||
|
elseif (_GLFW_X11)
|
||||||
|
set(glfw_HEADERS ${common_HEADERS} x11_platform.h xkb_unicode.h
|
||||||
|
linux_joystick.h posix_time.h posix_tls.h glx_context.h
|
||||||
|
egl_context.h)
|
||||||
|
set(glfw_SOURCES ${common_SOURCES} x11_init.c x11_monitor.c x11_window.c
|
||||||
|
xkb_unicode.c linux_joystick.c posix_time.c posix_tls.c
|
||||||
|
glx_context.c egl_context.c)
|
||||||
|
elseif (_GLFW_WAYLAND)
|
||||||
|
set(glfw_HEADERS ${common_HEADERS} wl_platform.h linux_joystick.h
|
||||||
|
posix_time.h posix_tls.h xkb_unicode.h egl_context.h)
|
||||||
|
set(glfw_SOURCES ${common_SOURCES} wl_init.c wl_monitor.c wl_window.c
|
||||||
|
linux_joystick.c posix_time.c posix_tls.c xkb_unicode.c
|
||||||
|
egl_context.c)
|
||||||
|
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml
|
||||||
|
BASENAME relative-pointer-unstable-v1)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
|
||||||
|
BASENAME pointer-constraints-unstable-v1)
|
||||||
|
elseif (_GLFW_MIR)
|
||||||
|
set(glfw_HEADERS ${common_HEADERS} mir_platform.h linux_joystick.h
|
||||||
|
posix_time.h posix_tls.h xkb_unicode.h egl_context.h)
|
||||||
|
set(glfw_SOURCES ${common_SOURCES} mir_init.c mir_monitor.c mir_window.c
|
||||||
|
linux_joystick.c posix_time.c posix_tls.c xkb_unicode.c
|
||||||
|
egl_context.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
# The time, thread and module code is shared between all backends on a given OS,
|
|
||||||
# including the null backend, which still needs those bits to be functional
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
target_sources(glfw PRIVATE cocoa_time.h cocoa_time.c posix_thread.h
|
# For some reason, CMake doesn't know about .m
|
||||||
posix_module.c posix_thread.c)
|
set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C)
|
||||||
elseif (WIN32)
|
|
||||||
target_sources(glfw PRIVATE win32_time.h win32_thread.h win32_module.c
|
|
||||||
win32_time.c win32_thread.c)
|
|
||||||
else()
|
|
||||||
target_sources(glfw PRIVATE posix_time.h posix_thread.h posix_module.c
|
|
||||||
posix_time.c posix_thread.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(update_mappings
|
|
||||||
COMMAND "${CMAKE_COMMAND}" -P "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake" mappings.h.in mappings.h
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
COMMENT "Updating gamepad mappings from upstream repository"
|
|
||||||
SOURCES mappings.h.in "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3")
|
|
||||||
|
|
||||||
if (GLFW_BUILD_COCOA)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_COCOA)
|
|
||||||
target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h cocoa_init.m
|
|
||||||
cocoa_joystick.m cocoa_monitor.m cocoa_window.m
|
|
||||||
nsgl_context.m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WIN32)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_WIN32)
|
|
||||||
target_sources(glfw PRIVATE win32_platform.h win32_joystick.h win32_init.c
|
|
||||||
win32_joystick.c win32_monitor.c win32_window.c
|
|
||||||
wgl_context.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_X11)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_X11)
|
|
||||||
target_sources(glfw PRIVATE x11_platform.h xkb_unicode.h x11_init.c
|
|
||||||
x11_monitor.c x11_window.c xkb_unicode.c
|
|
||||||
glx_context.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_WAYLAND)
|
|
||||||
target_sources(glfw PRIVATE wl_platform.h xkb_unicode.h wl_init.c
|
|
||||||
wl_monitor.c wl_window.c xkb_unicode.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_X11 OR GLFW_BUILD_WAYLAND)
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
target_sources(glfw PRIVATE linux_joystick.h linux_joystick.c)
|
|
||||||
endif()
|
|
||||||
target_sources(glfw PRIVATE posix_poll.h posix_poll.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
|
||||||
include(CheckIncludeFiles)
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
check_function_exists(memfd_create HAVE_MEMFD_CREATE)
|
|
||||||
if (HAVE_MEMFD_CREATE)
|
|
||||||
target_compile_definitions(glfw PRIVATE HAVE_MEMFD_CREATE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
|
|
||||||
|
|
||||||
include(FindPkgConfig)
|
|
||||||
pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.15)
|
|
||||||
pkg_get_variable(WAYLAND_PROTOCOLS_BASE wayland-protocols pkgdatadir)
|
|
||||||
pkg_get_variable(WAYLAND_CLIENT_PKGDATADIR wayland-client pkgdatadir)
|
|
||||||
|
|
||||||
macro(wayland_generate protocol_file output_file)
|
|
||||||
add_custom_command(OUTPUT "${output_file}.h"
|
|
||||||
COMMAND "${WAYLAND_SCANNER_EXECUTABLE}" client-header "${protocol_file}" "${output_file}.h"
|
|
||||||
DEPENDS "${protocol_file}"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT "${output_file}-code.h"
|
|
||||||
COMMAND "${WAYLAND_SCANNER_EXECUTABLE}" private-code "${protocol_file}" "${output_file}-code.h"
|
|
||||||
DEPENDS "${protocol_file}"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
target_sources(glfw PRIVATE "${output_file}.h" "${output_file}-code.h")
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_CLIENT_PKGDATADIR}/wayland.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/stable/xdg-shell/xdg-shell.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-xdg-shell-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-xdg-decoration-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/stable/viewporter/viewporter.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-viewporter-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/unstable/relative-pointer/relative-pointer-unstable-v1.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-relative-pointer-unstable-v1-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-pointer-constraints-unstable-v1-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml"
|
|
||||||
"${GLFW_BINARY_DIR}/src/wayland-idle-inhibit-unstable-v1-client-protocol")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WIN32 AND GLFW_BUILD_SHARED_LIBRARY)
|
|
||||||
configure_file(glfw.rc.in glfw.rc @ONLY)
|
|
||||||
target_sources(glfw PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/glfw.rc")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX AND GLFW_BUILD_SHARED_LIBRARY)
|
|
||||||
# On Unix-like systems, shared libraries can use the soname system.
|
|
||||||
set(GLFW_LIB_NAME glfw)
|
|
||||||
else()
|
|
||||||
set(GLFW_LIB_NAME glfw3)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS})
|
||||||
set_target_properties(glfw PROPERTIES
|
set_target_properties(glfw PROPERTIES
|
||||||
OUTPUT_NAME ${GLFW_LIB_NAME}
|
OUTPUT_NAME ${GLFW_LIB_NAME}
|
||||||
VERSION ${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}
|
VERSION ${GLFW_VERSION}
|
||||||
SOVERSION ${GLFW_VERSION_MAJOR}
|
SOVERSION ${GLFW_VERSION_MAJOR}
|
||||||
POSITION_INDEPENDENT_CODE ON
|
POSITION_INDEPENDENT_CODE ON
|
||||||
C_STANDARD 99
|
|
||||||
C_EXTENSIONS OFF
|
|
||||||
DEFINE_SYMBOL _GLFW_BUILD_DLL
|
|
||||||
FOLDER "GLFW3")
|
FOLDER "GLFW3")
|
||||||
|
|
||||||
|
target_compile_definitions(glfw PRIVATE -D_GLFW_USE_CONFIG_H)
|
||||||
target_include_directories(glfw PUBLIC
|
target_include_directories(glfw PUBLIC
|
||||||
"$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>"
|
$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>
|
||||||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>)
|
||||||
target_include_directories(glfw PRIVATE
|
target_include_directories(glfw PRIVATE
|
||||||
"${GLFW_SOURCE_DIR}/src"
|
"${GLFW_SOURCE_DIR}/src"
|
||||||
"${GLFW_BINARY_DIR}/src")
|
"${GLFW_BINARY_DIR}/src"
|
||||||
target_link_libraries(glfw PRIVATE Threads::Threads)
|
${glfw_INCLUDE_DIRS})
|
||||||
|
|
||||||
# Workaround for CMake not knowing about .m files before version 3.16
|
|
||||||
if (CMAKE_VERSION VERSION_LESS "3.16" AND APPLE)
|
|
||||||
set_source_files_properties(cocoa_init.m cocoa_joystick.m cocoa_monitor.m
|
|
||||||
cocoa_window.m nsgl_context.m PROPERTIES
|
|
||||||
LANGUAGE C)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WIN32)
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_COCOA)
|
|
||||||
target_link_libraries(glfw PRIVATE "-framework Cocoa"
|
|
||||||
"-framework IOKit"
|
|
||||||
"-framework CoreFoundation")
|
|
||||||
|
|
||||||
set(glfw_PKG_DEPS "")
|
|
||||||
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
|
||||||
pkg_check_modules(Wayland REQUIRED
|
|
||||||
wayland-client>=0.2.7
|
|
||||||
wayland-cursor>=0.2.7
|
|
||||||
wayland-egl>=0.2.7
|
|
||||||
xkbcommon>=0.5.0)
|
|
||||||
|
|
||||||
target_include_directories(glfw PRIVATE ${Wayland_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
find_package(EpollShim)
|
|
||||||
if (EPOLLSHIM_FOUND)
|
|
||||||
target_include_directories(glfw PRIVATE ${EPOLLSHIM_INCLUDE_DIRS})
|
|
||||||
target_link_libraries(glfw PRIVATE ${EPOLLSHIM_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_X11)
|
|
||||||
find_package(X11 REQUIRED)
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_X11_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for XRandR (modern resolution switching and gamma control)
|
|
||||||
if (NOT X11_Xrandr_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "RandR headers not found; install libxrandr development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xrandr_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for Xinerama (legacy multi-monitor support)
|
|
||||||
if (NOT X11_Xinerama_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "Xinerama headers not found; install libxinerama development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xinerama_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for Xkb (X keyboard extension)
|
|
||||||
if (NOT X11_Xkb_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "XKB headers not found; install X11 development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xkb_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for Xcursor (cursor creation from RGBA images)
|
|
||||||
if (NOT X11_Xcursor_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "Xcursor headers not found; install libxcursor development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xcursor_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for XInput (modern HID input)
|
|
||||||
if (NOT X11_Xi_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "XInput headers not found; install libxi development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xi_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for X Shape (custom window input shape)
|
|
||||||
if (NOT X11_Xshape_INCLUDE_PATH)
|
|
||||||
message(FATAL_ERROR "X Shape headers not found; install libxext development package")
|
|
||||||
endif()
|
|
||||||
target_include_directories(glfw PRIVATE "${X11_Xshape_INCLUDE_PATH}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
|
||||||
find_library(RT_LIBRARY rt)
|
|
||||||
mark_as_advanced(RT_LIBRARY)
|
|
||||||
if (RT_LIBRARY)
|
|
||||||
target_link_libraries(glfw PRIVATE "${RT_LIBRARY}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lrt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(MATH_LIBRARY m)
|
|
||||||
mark_as_advanced(MATH_LIBRARY)
|
|
||||||
if (MATH_LIBRARY)
|
|
||||||
target_link_libraries(glfw PRIVATE "${MATH_LIBRARY}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lm")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_DL_LIBS)
|
|
||||||
target_link_libraries(glfw PRIVATE "${CMAKE_DL_LIBS}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Make GCC warn about declarations that VS 2010 and 2012 won't accept for all
|
|
||||||
# source files that VS will build (Clang ignores this because we set -std=c99)
|
|
||||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
|
||||||
set_source_files_properties(context.c init.c input.c monitor.c platform.c vulkan.c
|
|
||||||
window.c null_init.c null_joystick.c null_monitor.c
|
|
||||||
null_window.c win32_init.c win32_joystick.c win32_module.c
|
|
||||||
win32_monitor.c win32_time.c win32_thread.c win32_window.c
|
|
||||||
wgl_context.c egl_context.c osmesa_context.c PROPERTIES
|
|
||||||
COMPILE_FLAGS -Wdeclaration-after-statement)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (GLFW_USE_HYBRID_HPG)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_USE_HYBRID_HPG)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Enable a reasonable set of warnings
|
|
||||||
# NOTE: The order matters here, Clang-CL matches both MSVC and Clang
|
|
||||||
if (MSVC)
|
|
||||||
target_compile_options(glfw PRIVATE "/W3")
|
|
||||||
elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR
|
|
||||||
CMAKE_C_COMPILER_ID STREQUAL "Clang" OR
|
|
||||||
CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
|
|
||||||
|
|
||||||
target_compile_options(glfw PRIVATE "-Wall")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_WIN32)
|
|
||||||
target_compile_definitions(glfw PRIVATE UNICODE _UNICODE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
||||||
# the inclusion of stddef.h (by glfw3.h), which is itself included before
|
# the inclusion of stddef.h (by glfw3.h), which is itself included before
|
||||||
# win32_platform.h. We define them here until a saner solution can be found
|
# win32_platform.h. We define them here until a saner solution can be found
|
||||||
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
||||||
if (MINGW)
|
target_compile_definitions(glfw PRIVATE
|
||||||
target_compile_definitions(glfw PRIVATE WINVER=0x0501)
|
"$<$<BOOL:${MINGW}>:UNICODE;WINVER=0x0501>")
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for legacy MinGW not providing XInput and DirectInput
|
# Enable a reasonable set of warnings (no, -Wextra is not reasonable)
|
||||||
if (MINGW)
|
target_compile_options(glfw PRIVATE
|
||||||
include(CheckIncludeFile)
|
"$<$<C_COMPILER_ID:Clang>:-Wall>"
|
||||||
check_include_file(dinput.h DINPUT_H_FOUND)
|
"$<$<C_COMPILER_ID:GNU>:-Wall>")
|
||||||
check_include_file(xinput.h XINPUT_H_FOUND)
|
|
||||||
if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)
|
|
||||||
target_include_directories(glfw PRIVATE "${GLFW_SOURCE_DIR}/deps/mingw")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for the MS CRT deprecating parts of the standard library
|
if (BUILD_SHARED_LIBS)
|
||||||
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
|
||||||
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for VS 2008 not shipping with stdint.h
|
|
||||||
if (MSVC90)
|
|
||||||
target_include_directories(glfw PUBLIC "${GLFW_SOURCE_DIR}/deps/vs2008")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for the DirectX 9 SDK as it is not included with VS 2008
|
|
||||||
if (MSVC90)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
check_include_file(dinput.h DINPUT_H_FOUND)
|
|
||||||
if (NOT DINPUT_H_FOUND)
|
|
||||||
message(FATAL_ERROR "DirectX 9 headers not found; install DirectX 9 SDK")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for -std=c99 on Linux disabling _DEFAULT_SOURCE (POSIX 2008 and more)
|
|
||||||
if (GLFW_BUILD_X11 OR GLFW_BUILD_WAYLAND)
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
target_compile_definitions(glfw PRIVATE _DEFAULT_SOURCE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_BUILD_SHARED_LIBRARY)
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
# Remove the dependency on the shared version of libgcc
|
# Remove the lib prefix on the DLL (but not the import library
|
||||||
# NOTE: MinGW-w64 has the correct default but MinGW needs this
|
|
||||||
target_link_libraries(glfw PRIVATE "-static-libgcc")
|
|
||||||
|
|
||||||
# Remove the lib prefix on the DLL (but not the import library)
|
|
||||||
set_target_properties(glfw PROPERTIES PREFIX "")
|
set_target_properties(glfw PROPERTIES PREFIX "")
|
||||||
|
|
||||||
# Add a suffix to the import library to avoid naming conflicts
|
# Add a suffix to the import library to avoid naming conflicts
|
||||||
|
@ -337,64 +93,28 @@ if (GLFW_BUILD_SHARED_LIBRARY)
|
||||||
# Add a suffix to the import library to avoid naming conflicts
|
# Add a suffix to the import library to avoid naming conflicts
|
||||||
set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib")
|
set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib")
|
||||||
endif()
|
endif()
|
||||||
|
elseif (APPLE)
|
||||||
|
# Add -fno-common to work around a bug in Apple's GCC
|
||||||
|
target_compile_options(glfw PRIVATE "-fno-common")
|
||||||
|
|
||||||
target_compile_definitions(glfw INTERFACE GLFW_DLL)
|
set_target_properties(glfw PROPERTIES
|
||||||
endif()
|
INSTALL_NAME_DIR "lib${LIB_SUFFIX}")
|
||||||
|
elseif (UNIX)
|
||||||
if (MINGW)
|
|
||||||
# Enable link-time exploit mitigation features enabled by default on MSVC
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
|
|
||||||
# Compatibility with data execution prevention (DEP)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
|
||||||
if (_GLFW_HAS_DEP)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--nxcompat")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
|
||||||
if (_GLFW_HAS_ASLR)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--dynamicbase")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with 64-bit address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
|
||||||
if (_GLFW_HAS_64ASLR)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--high-entropy-va")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Clear flags again to avoid breaking later tests
|
|
||||||
set(CMAKE_REQUIRED_FLAGS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX)
|
|
||||||
# Hide symbols not explicitly tagged for export from the shared library
|
# Hide symbols not explicitly tagged for export from the shared library
|
||||||
target_compile_options(glfw PRIVATE "-fvisibility=hidden")
|
target_compile_options(glfw PRIVATE "-fvisibility=hidden")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
target_compile_definitions(glfw INTERFACE -DGLFW_DLL)
|
||||||
|
target_link_libraries(glfw PRIVATE ${glfw_LIBRARIES})
|
||||||
|
else()
|
||||||
|
target_link_libraries(glfw INTERFACE ${glfw_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(arg ${glfw_PKG_DEPS})
|
if (MSVC)
|
||||||
string(APPEND deps " ${arg}")
|
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
endforeach()
|
endif()
|
||||||
foreach(arg ${glfw_PKG_LIBS})
|
|
||||||
string(APPEND libs " ${arg}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(GLFW_PKG_CONFIG_REQUIRES_PRIVATE "${deps}" CACHE INTERNAL
|
|
||||||
"GLFW pkg-config Requires.private")
|
|
||||||
set(GLFW_PKG_CONFIG_LIBS_PRIVATE "${libs}" CACHE INTERNAL
|
|
||||||
"GLFW pkg-config Libs.private")
|
|
||||||
|
|
||||||
configure_file("${GLFW_SOURCE_DIR}/CMake/glfw3.pc.in" glfw3.pc @ONLY)
|
|
||||||
|
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
install(TARGETS glfw
|
install(TARGETS glfw EXPORT glfwTargets DESTINATION lib${LIB_SUFFIX})
|
||||||
EXPORT glfwTargets
|
|
||||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
|
||||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
||||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
666
src/cocoa_init.m
666
src/cocoa_init.m
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.2 OS X - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -23,17 +23,12 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// It is fine to use C99 in this file because it will not be built with VS
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(_GLFW_COCOA)
|
|
||||||
|
|
||||||
#include <sys/param.h> // For MAXPATHLEN
|
#include <sys/param.h> // For MAXPATHLEN
|
||||||
|
|
||||||
// Needed for _NSGetProgname
|
|
||||||
#include <crt_externs.h>
|
#if defined(_GLFW_USE_CHDIR)
|
||||||
|
|
||||||
// Change to our application bundle's resources directory, if present
|
// Change to our application bundle's resources directory, if present
|
||||||
//
|
//
|
||||||
|
@ -71,243 +66,143 @@ static void changeToResourcesDirectory(void)
|
||||||
chdir(resourcesPath);
|
chdir(resourcesPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up the menu bar (manually)
|
#endif /* _GLFW_USE_CHDIR */
|
||||||
// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that
|
|
||||||
// could go away at any moment, lots of stuff that really should be
|
|
||||||
// localize(d|able), etc. Add a nib to save us this horror.
|
|
||||||
//
|
|
||||||
static void createMenuBar(void)
|
|
||||||
{
|
|
||||||
NSString* appName = nil;
|
|
||||||
NSDictionary* bundleInfo = [[NSBundle mainBundle] infoDictionary];
|
|
||||||
NSString* nameKeys[] =
|
|
||||||
{
|
|
||||||
@"CFBundleDisplayName",
|
|
||||||
@"CFBundleName",
|
|
||||||
@"CFBundleExecutable",
|
|
||||||
};
|
|
||||||
|
|
||||||
// Try to figure out what the calling application is called
|
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(nameKeys) / sizeof(nameKeys[0]); i++)
|
|
||||||
{
|
|
||||||
id name = bundleInfo[nameKeys[i]];
|
|
||||||
if (name &&
|
|
||||||
[name isKindOfClass:[NSString class]] &&
|
|
||||||
![name isEqualToString:@""])
|
|
||||||
{
|
|
||||||
appName = name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!appName)
|
|
||||||
{
|
|
||||||
char** progname = _NSGetProgname();
|
|
||||||
if (progname && *progname)
|
|
||||||
appName = @(*progname);
|
|
||||||
else
|
|
||||||
appName = @"GLFW Application";
|
|
||||||
}
|
|
||||||
|
|
||||||
NSMenu* bar = [[NSMenu alloc] init];
|
|
||||||
[NSApp setMainMenu:bar];
|
|
||||||
|
|
||||||
NSMenuItem* appMenuItem =
|
|
||||||
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
|
||||||
NSMenu* appMenu = [[NSMenu alloc] init];
|
|
||||||
[appMenuItem setSubmenu:appMenu];
|
|
||||||
|
|
||||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName]
|
|
||||||
action:@selector(orderFrontStandardAboutPanel:)
|
|
||||||
keyEquivalent:@""];
|
|
||||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
|
||||||
NSMenu* servicesMenu = [[NSMenu alloc] init];
|
|
||||||
[NSApp setServicesMenu:servicesMenu];
|
|
||||||
[[appMenu addItemWithTitle:@"Services"
|
|
||||||
action:NULL
|
|
||||||
keyEquivalent:@""] setSubmenu:servicesMenu];
|
|
||||||
[servicesMenu release];
|
|
||||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
|
||||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName]
|
|
||||||
action:@selector(hide:)
|
|
||||||
keyEquivalent:@"h"];
|
|
||||||
[[appMenu addItemWithTitle:@"Hide Others"
|
|
||||||
action:@selector(hideOtherApplications:)
|
|
||||||
keyEquivalent:@"h"]
|
|
||||||
setKeyEquivalentModifierMask:NSEventModifierFlagOption | NSEventModifierFlagCommand];
|
|
||||||
[appMenu addItemWithTitle:@"Show All"
|
|
||||||
action:@selector(unhideAllApplications:)
|
|
||||||
keyEquivalent:@""];
|
|
||||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
|
||||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName]
|
|
||||||
action:@selector(terminate:)
|
|
||||||
keyEquivalent:@"q"];
|
|
||||||
|
|
||||||
NSMenuItem* windowMenuItem =
|
|
||||||
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
|
||||||
[bar release];
|
|
||||||
NSMenu* windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
|
|
||||||
[NSApp setWindowsMenu:windowMenu];
|
|
||||||
[windowMenuItem setSubmenu:windowMenu];
|
|
||||||
|
|
||||||
[windowMenu addItemWithTitle:@"Minimize"
|
|
||||||
action:@selector(performMiniaturize:)
|
|
||||||
keyEquivalent:@"m"];
|
|
||||||
[windowMenu addItemWithTitle:@"Zoom"
|
|
||||||
action:@selector(performZoom:)
|
|
||||||
keyEquivalent:@""];
|
|
||||||
[windowMenu addItem:[NSMenuItem separatorItem]];
|
|
||||||
[windowMenu addItemWithTitle:@"Bring All to Front"
|
|
||||||
action:@selector(arrangeInFront:)
|
|
||||||
keyEquivalent:@""];
|
|
||||||
|
|
||||||
// TODO: Make this appear at the bottom of the menu (for consistency)
|
|
||||||
[windowMenu addItem:[NSMenuItem separatorItem]];
|
|
||||||
[[windowMenu addItemWithTitle:@"Enter Full Screen"
|
|
||||||
action:@selector(toggleFullScreen:)
|
|
||||||
keyEquivalent:@"f"]
|
|
||||||
setKeyEquivalentModifierMask:NSEventModifierFlagControl | NSEventModifierFlagCommand];
|
|
||||||
|
|
||||||
// Prior to Snow Leopard, we need to use this oddly-named semi-private API
|
|
||||||
// to get the application menu working properly.
|
|
||||||
SEL setAppleMenuSelector = NSSelectorFromString(@"setAppleMenu:");
|
|
||||||
[NSApp performSelector:setAppleMenuSelector withObject:appMenu];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create key code translation tables
|
// Create key code translation tables
|
||||||
//
|
//
|
||||||
static void createKeyTables(void)
|
static void createKeyTables(void)
|
||||||
{
|
{
|
||||||
memset(_glfw.ns.keycodes, -1, sizeof(_glfw.ns.keycodes));
|
int scancode;
|
||||||
memset(_glfw.ns.scancodes, -1, sizeof(_glfw.ns.scancodes));
|
|
||||||
|
|
||||||
_glfw.ns.keycodes[0x1D] = GLFW_KEY_0;
|
memset(_glfw.ns.publicKeys, -1, sizeof(_glfw.ns.publicKeys));
|
||||||
_glfw.ns.keycodes[0x12] = GLFW_KEY_1;
|
memset(_glfw.ns.nativeKeys, -1, sizeof(_glfw.ns.nativeKeys));
|
||||||
_glfw.ns.keycodes[0x13] = GLFW_KEY_2;
|
|
||||||
_glfw.ns.keycodes[0x14] = GLFW_KEY_3;
|
|
||||||
_glfw.ns.keycodes[0x15] = GLFW_KEY_4;
|
|
||||||
_glfw.ns.keycodes[0x17] = GLFW_KEY_5;
|
|
||||||
_glfw.ns.keycodes[0x16] = GLFW_KEY_6;
|
|
||||||
_glfw.ns.keycodes[0x1A] = GLFW_KEY_7;
|
|
||||||
_glfw.ns.keycodes[0x1C] = GLFW_KEY_8;
|
|
||||||
_glfw.ns.keycodes[0x19] = GLFW_KEY_9;
|
|
||||||
_glfw.ns.keycodes[0x00] = GLFW_KEY_A;
|
|
||||||
_glfw.ns.keycodes[0x0B] = GLFW_KEY_B;
|
|
||||||
_glfw.ns.keycodes[0x08] = GLFW_KEY_C;
|
|
||||||
_glfw.ns.keycodes[0x02] = GLFW_KEY_D;
|
|
||||||
_glfw.ns.keycodes[0x0E] = GLFW_KEY_E;
|
|
||||||
_glfw.ns.keycodes[0x03] = GLFW_KEY_F;
|
|
||||||
_glfw.ns.keycodes[0x05] = GLFW_KEY_G;
|
|
||||||
_glfw.ns.keycodes[0x04] = GLFW_KEY_H;
|
|
||||||
_glfw.ns.keycodes[0x22] = GLFW_KEY_I;
|
|
||||||
_glfw.ns.keycodes[0x26] = GLFW_KEY_J;
|
|
||||||
_glfw.ns.keycodes[0x28] = GLFW_KEY_K;
|
|
||||||
_glfw.ns.keycodes[0x25] = GLFW_KEY_L;
|
|
||||||
_glfw.ns.keycodes[0x2E] = GLFW_KEY_M;
|
|
||||||
_glfw.ns.keycodes[0x2D] = GLFW_KEY_N;
|
|
||||||
_glfw.ns.keycodes[0x1F] = GLFW_KEY_O;
|
|
||||||
_glfw.ns.keycodes[0x23] = GLFW_KEY_P;
|
|
||||||
_glfw.ns.keycodes[0x0C] = GLFW_KEY_Q;
|
|
||||||
_glfw.ns.keycodes[0x0F] = GLFW_KEY_R;
|
|
||||||
_glfw.ns.keycodes[0x01] = GLFW_KEY_S;
|
|
||||||
_glfw.ns.keycodes[0x11] = GLFW_KEY_T;
|
|
||||||
_glfw.ns.keycodes[0x20] = GLFW_KEY_U;
|
|
||||||
_glfw.ns.keycodes[0x09] = GLFW_KEY_V;
|
|
||||||
_glfw.ns.keycodes[0x0D] = GLFW_KEY_W;
|
|
||||||
_glfw.ns.keycodes[0x07] = GLFW_KEY_X;
|
|
||||||
_glfw.ns.keycodes[0x10] = GLFW_KEY_Y;
|
|
||||||
_glfw.ns.keycodes[0x06] = GLFW_KEY_Z;
|
|
||||||
|
|
||||||
_glfw.ns.keycodes[0x27] = GLFW_KEY_APOSTROPHE;
|
_glfw.ns.publicKeys[0x1D] = GLFW_KEY_0;
|
||||||
_glfw.ns.keycodes[0x2A] = GLFW_KEY_BACKSLASH;
|
_glfw.ns.publicKeys[0x12] = GLFW_KEY_1;
|
||||||
_glfw.ns.keycodes[0x2B] = GLFW_KEY_COMMA;
|
_glfw.ns.publicKeys[0x13] = GLFW_KEY_2;
|
||||||
_glfw.ns.keycodes[0x18] = GLFW_KEY_EQUAL;
|
_glfw.ns.publicKeys[0x14] = GLFW_KEY_3;
|
||||||
_glfw.ns.keycodes[0x32] = GLFW_KEY_GRAVE_ACCENT;
|
_glfw.ns.publicKeys[0x15] = GLFW_KEY_4;
|
||||||
_glfw.ns.keycodes[0x21] = GLFW_KEY_LEFT_BRACKET;
|
_glfw.ns.publicKeys[0x17] = GLFW_KEY_5;
|
||||||
_glfw.ns.keycodes[0x1B] = GLFW_KEY_MINUS;
|
_glfw.ns.publicKeys[0x16] = GLFW_KEY_6;
|
||||||
_glfw.ns.keycodes[0x2F] = GLFW_KEY_PERIOD;
|
_glfw.ns.publicKeys[0x1A] = GLFW_KEY_7;
|
||||||
_glfw.ns.keycodes[0x1E] = GLFW_KEY_RIGHT_BRACKET;
|
_glfw.ns.publicKeys[0x1C] = GLFW_KEY_8;
|
||||||
_glfw.ns.keycodes[0x29] = GLFW_KEY_SEMICOLON;
|
_glfw.ns.publicKeys[0x19] = GLFW_KEY_9;
|
||||||
_glfw.ns.keycodes[0x2C] = GLFW_KEY_SLASH;
|
_glfw.ns.publicKeys[0x00] = GLFW_KEY_A;
|
||||||
_glfw.ns.keycodes[0x0A] = GLFW_KEY_WORLD_1;
|
_glfw.ns.publicKeys[0x0B] = GLFW_KEY_B;
|
||||||
|
_glfw.ns.publicKeys[0x08] = GLFW_KEY_C;
|
||||||
|
_glfw.ns.publicKeys[0x02] = GLFW_KEY_D;
|
||||||
|
_glfw.ns.publicKeys[0x0E] = GLFW_KEY_E;
|
||||||
|
_glfw.ns.publicKeys[0x03] = GLFW_KEY_F;
|
||||||
|
_glfw.ns.publicKeys[0x05] = GLFW_KEY_G;
|
||||||
|
_glfw.ns.publicKeys[0x04] = GLFW_KEY_H;
|
||||||
|
_glfw.ns.publicKeys[0x22] = GLFW_KEY_I;
|
||||||
|
_glfw.ns.publicKeys[0x26] = GLFW_KEY_J;
|
||||||
|
_glfw.ns.publicKeys[0x28] = GLFW_KEY_K;
|
||||||
|
_glfw.ns.publicKeys[0x25] = GLFW_KEY_L;
|
||||||
|
_glfw.ns.publicKeys[0x2E] = GLFW_KEY_M;
|
||||||
|
_glfw.ns.publicKeys[0x2D] = GLFW_KEY_N;
|
||||||
|
_glfw.ns.publicKeys[0x1F] = GLFW_KEY_O;
|
||||||
|
_glfw.ns.publicKeys[0x23] = GLFW_KEY_P;
|
||||||
|
_glfw.ns.publicKeys[0x0C] = GLFW_KEY_Q;
|
||||||
|
_glfw.ns.publicKeys[0x0F] = GLFW_KEY_R;
|
||||||
|
_glfw.ns.publicKeys[0x01] = GLFW_KEY_S;
|
||||||
|
_glfw.ns.publicKeys[0x11] = GLFW_KEY_T;
|
||||||
|
_glfw.ns.publicKeys[0x20] = GLFW_KEY_U;
|
||||||
|
_glfw.ns.publicKeys[0x09] = GLFW_KEY_V;
|
||||||
|
_glfw.ns.publicKeys[0x0D] = GLFW_KEY_W;
|
||||||
|
_glfw.ns.publicKeys[0x07] = GLFW_KEY_X;
|
||||||
|
_glfw.ns.publicKeys[0x10] = GLFW_KEY_Y;
|
||||||
|
_glfw.ns.publicKeys[0x06] = GLFW_KEY_Z;
|
||||||
|
|
||||||
_glfw.ns.keycodes[0x33] = GLFW_KEY_BACKSPACE;
|
_glfw.ns.publicKeys[0x27] = GLFW_KEY_APOSTROPHE;
|
||||||
_glfw.ns.keycodes[0x39] = GLFW_KEY_CAPS_LOCK;
|
_glfw.ns.publicKeys[0x2A] = GLFW_KEY_BACKSLASH;
|
||||||
_glfw.ns.keycodes[0x75] = GLFW_KEY_DELETE;
|
_glfw.ns.publicKeys[0x2B] = GLFW_KEY_COMMA;
|
||||||
_glfw.ns.keycodes[0x7D] = GLFW_KEY_DOWN;
|
_glfw.ns.publicKeys[0x18] = GLFW_KEY_EQUAL;
|
||||||
_glfw.ns.keycodes[0x77] = GLFW_KEY_END;
|
_glfw.ns.publicKeys[0x32] = GLFW_KEY_GRAVE_ACCENT;
|
||||||
_glfw.ns.keycodes[0x24] = GLFW_KEY_ENTER;
|
_glfw.ns.publicKeys[0x21] = GLFW_KEY_LEFT_BRACKET;
|
||||||
_glfw.ns.keycodes[0x35] = GLFW_KEY_ESCAPE;
|
_glfw.ns.publicKeys[0x1B] = GLFW_KEY_MINUS;
|
||||||
_glfw.ns.keycodes[0x7A] = GLFW_KEY_F1;
|
_glfw.ns.publicKeys[0x2F] = GLFW_KEY_PERIOD;
|
||||||
_glfw.ns.keycodes[0x78] = GLFW_KEY_F2;
|
_glfw.ns.publicKeys[0x1E] = GLFW_KEY_RIGHT_BRACKET;
|
||||||
_glfw.ns.keycodes[0x63] = GLFW_KEY_F3;
|
_glfw.ns.publicKeys[0x29] = GLFW_KEY_SEMICOLON;
|
||||||
_glfw.ns.keycodes[0x76] = GLFW_KEY_F4;
|
_glfw.ns.publicKeys[0x2C] = GLFW_KEY_SLASH;
|
||||||
_glfw.ns.keycodes[0x60] = GLFW_KEY_F5;
|
_glfw.ns.publicKeys[0x0A] = GLFW_KEY_WORLD_1;
|
||||||
_glfw.ns.keycodes[0x61] = GLFW_KEY_F6;
|
|
||||||
_glfw.ns.keycodes[0x62] = GLFW_KEY_F7;
|
|
||||||
_glfw.ns.keycodes[0x64] = GLFW_KEY_F8;
|
|
||||||
_glfw.ns.keycodes[0x65] = GLFW_KEY_F9;
|
|
||||||
_glfw.ns.keycodes[0x6D] = GLFW_KEY_F10;
|
|
||||||
_glfw.ns.keycodes[0x67] = GLFW_KEY_F11;
|
|
||||||
_glfw.ns.keycodes[0x6F] = GLFW_KEY_F12;
|
|
||||||
_glfw.ns.keycodes[0x69] = GLFW_KEY_PRINT_SCREEN;
|
|
||||||
_glfw.ns.keycodes[0x6B] = GLFW_KEY_F14;
|
|
||||||
_glfw.ns.keycodes[0x71] = GLFW_KEY_F15;
|
|
||||||
_glfw.ns.keycodes[0x6A] = GLFW_KEY_F16;
|
|
||||||
_glfw.ns.keycodes[0x40] = GLFW_KEY_F17;
|
|
||||||
_glfw.ns.keycodes[0x4F] = GLFW_KEY_F18;
|
|
||||||
_glfw.ns.keycodes[0x50] = GLFW_KEY_F19;
|
|
||||||
_glfw.ns.keycodes[0x5A] = GLFW_KEY_F20;
|
|
||||||
_glfw.ns.keycodes[0x73] = GLFW_KEY_HOME;
|
|
||||||
_glfw.ns.keycodes[0x72] = GLFW_KEY_INSERT;
|
|
||||||
_glfw.ns.keycodes[0x7B] = GLFW_KEY_LEFT;
|
|
||||||
_glfw.ns.keycodes[0x3A] = GLFW_KEY_LEFT_ALT;
|
|
||||||
_glfw.ns.keycodes[0x3B] = GLFW_KEY_LEFT_CONTROL;
|
|
||||||
_glfw.ns.keycodes[0x38] = GLFW_KEY_LEFT_SHIFT;
|
|
||||||
_glfw.ns.keycodes[0x37] = GLFW_KEY_LEFT_SUPER;
|
|
||||||
_glfw.ns.keycodes[0x6E] = GLFW_KEY_MENU;
|
|
||||||
_glfw.ns.keycodes[0x47] = GLFW_KEY_NUM_LOCK;
|
|
||||||
_glfw.ns.keycodes[0x79] = GLFW_KEY_PAGE_DOWN;
|
|
||||||
_glfw.ns.keycodes[0x74] = GLFW_KEY_PAGE_UP;
|
|
||||||
_glfw.ns.keycodes[0x7C] = GLFW_KEY_RIGHT;
|
|
||||||
_glfw.ns.keycodes[0x3D] = GLFW_KEY_RIGHT_ALT;
|
|
||||||
_glfw.ns.keycodes[0x3E] = GLFW_KEY_RIGHT_CONTROL;
|
|
||||||
_glfw.ns.keycodes[0x3C] = GLFW_KEY_RIGHT_SHIFT;
|
|
||||||
_glfw.ns.keycodes[0x36] = GLFW_KEY_RIGHT_SUPER;
|
|
||||||
_glfw.ns.keycodes[0x31] = GLFW_KEY_SPACE;
|
|
||||||
_glfw.ns.keycodes[0x30] = GLFW_KEY_TAB;
|
|
||||||
_glfw.ns.keycodes[0x7E] = GLFW_KEY_UP;
|
|
||||||
|
|
||||||
_glfw.ns.keycodes[0x52] = GLFW_KEY_KP_0;
|
_glfw.ns.publicKeys[0x33] = GLFW_KEY_BACKSPACE;
|
||||||
_glfw.ns.keycodes[0x53] = GLFW_KEY_KP_1;
|
_glfw.ns.publicKeys[0x39] = GLFW_KEY_CAPS_LOCK;
|
||||||
_glfw.ns.keycodes[0x54] = GLFW_KEY_KP_2;
|
_glfw.ns.publicKeys[0x75] = GLFW_KEY_DELETE;
|
||||||
_glfw.ns.keycodes[0x55] = GLFW_KEY_KP_3;
|
_glfw.ns.publicKeys[0x7D] = GLFW_KEY_DOWN;
|
||||||
_glfw.ns.keycodes[0x56] = GLFW_KEY_KP_4;
|
_glfw.ns.publicKeys[0x77] = GLFW_KEY_END;
|
||||||
_glfw.ns.keycodes[0x57] = GLFW_KEY_KP_5;
|
_glfw.ns.publicKeys[0x24] = GLFW_KEY_ENTER;
|
||||||
_glfw.ns.keycodes[0x58] = GLFW_KEY_KP_6;
|
_glfw.ns.publicKeys[0x35] = GLFW_KEY_ESCAPE;
|
||||||
_glfw.ns.keycodes[0x59] = GLFW_KEY_KP_7;
|
_glfw.ns.publicKeys[0x7A] = GLFW_KEY_F1;
|
||||||
_glfw.ns.keycodes[0x5B] = GLFW_KEY_KP_8;
|
_glfw.ns.publicKeys[0x78] = GLFW_KEY_F2;
|
||||||
_glfw.ns.keycodes[0x5C] = GLFW_KEY_KP_9;
|
_glfw.ns.publicKeys[0x63] = GLFW_KEY_F3;
|
||||||
_glfw.ns.keycodes[0x45] = GLFW_KEY_KP_ADD;
|
_glfw.ns.publicKeys[0x76] = GLFW_KEY_F4;
|
||||||
_glfw.ns.keycodes[0x41] = GLFW_KEY_KP_DECIMAL;
|
_glfw.ns.publicKeys[0x60] = GLFW_KEY_F5;
|
||||||
_glfw.ns.keycodes[0x4B] = GLFW_KEY_KP_DIVIDE;
|
_glfw.ns.publicKeys[0x61] = GLFW_KEY_F6;
|
||||||
_glfw.ns.keycodes[0x4C] = GLFW_KEY_KP_ENTER;
|
_glfw.ns.publicKeys[0x62] = GLFW_KEY_F7;
|
||||||
_glfw.ns.keycodes[0x51] = GLFW_KEY_KP_EQUAL;
|
_glfw.ns.publicKeys[0x64] = GLFW_KEY_F8;
|
||||||
_glfw.ns.keycodes[0x43] = GLFW_KEY_KP_MULTIPLY;
|
_glfw.ns.publicKeys[0x65] = GLFW_KEY_F9;
|
||||||
_glfw.ns.keycodes[0x4E] = GLFW_KEY_KP_SUBTRACT;
|
_glfw.ns.publicKeys[0x6D] = GLFW_KEY_F10;
|
||||||
|
_glfw.ns.publicKeys[0x67] = GLFW_KEY_F11;
|
||||||
|
_glfw.ns.publicKeys[0x6F] = GLFW_KEY_F12;
|
||||||
|
_glfw.ns.publicKeys[0x69] = GLFW_KEY_F13;
|
||||||
|
_glfw.ns.publicKeys[0x6B] = GLFW_KEY_F14;
|
||||||
|
_glfw.ns.publicKeys[0x71] = GLFW_KEY_F15;
|
||||||
|
_glfw.ns.publicKeys[0x6A] = GLFW_KEY_F16;
|
||||||
|
_glfw.ns.publicKeys[0x40] = GLFW_KEY_F17;
|
||||||
|
_glfw.ns.publicKeys[0x4F] = GLFW_KEY_F18;
|
||||||
|
_glfw.ns.publicKeys[0x50] = GLFW_KEY_F19;
|
||||||
|
_glfw.ns.publicKeys[0x5A] = GLFW_KEY_F20;
|
||||||
|
_glfw.ns.publicKeys[0x73] = GLFW_KEY_HOME;
|
||||||
|
_glfw.ns.publicKeys[0x72] = GLFW_KEY_INSERT;
|
||||||
|
_glfw.ns.publicKeys[0x7B] = GLFW_KEY_LEFT;
|
||||||
|
_glfw.ns.publicKeys[0x3A] = GLFW_KEY_LEFT_ALT;
|
||||||
|
_glfw.ns.publicKeys[0x3B] = GLFW_KEY_LEFT_CONTROL;
|
||||||
|
_glfw.ns.publicKeys[0x38] = GLFW_KEY_LEFT_SHIFT;
|
||||||
|
_glfw.ns.publicKeys[0x37] = GLFW_KEY_LEFT_SUPER;
|
||||||
|
_glfw.ns.publicKeys[0x6E] = GLFW_KEY_MENU;
|
||||||
|
_glfw.ns.publicKeys[0x47] = GLFW_KEY_NUM_LOCK;
|
||||||
|
_glfw.ns.publicKeys[0x79] = GLFW_KEY_PAGE_DOWN;
|
||||||
|
_glfw.ns.publicKeys[0x74] = GLFW_KEY_PAGE_UP;
|
||||||
|
_glfw.ns.publicKeys[0x7C] = GLFW_KEY_RIGHT;
|
||||||
|
_glfw.ns.publicKeys[0x3D] = GLFW_KEY_RIGHT_ALT;
|
||||||
|
_glfw.ns.publicKeys[0x3E] = GLFW_KEY_RIGHT_CONTROL;
|
||||||
|
_glfw.ns.publicKeys[0x3C] = GLFW_KEY_RIGHT_SHIFT;
|
||||||
|
_glfw.ns.publicKeys[0x36] = GLFW_KEY_RIGHT_SUPER;
|
||||||
|
_glfw.ns.publicKeys[0x31] = GLFW_KEY_SPACE;
|
||||||
|
_glfw.ns.publicKeys[0x30] = GLFW_KEY_TAB;
|
||||||
|
_glfw.ns.publicKeys[0x7E] = GLFW_KEY_UP;
|
||||||
|
|
||||||
for (int scancode = 0; scancode < 256; scancode++)
|
_glfw.ns.publicKeys[0x52] = GLFW_KEY_KP_0;
|
||||||
|
_glfw.ns.publicKeys[0x53] = GLFW_KEY_KP_1;
|
||||||
|
_glfw.ns.publicKeys[0x54] = GLFW_KEY_KP_2;
|
||||||
|
_glfw.ns.publicKeys[0x55] = GLFW_KEY_KP_3;
|
||||||
|
_glfw.ns.publicKeys[0x56] = GLFW_KEY_KP_4;
|
||||||
|
_glfw.ns.publicKeys[0x57] = GLFW_KEY_KP_5;
|
||||||
|
_glfw.ns.publicKeys[0x58] = GLFW_KEY_KP_6;
|
||||||
|
_glfw.ns.publicKeys[0x59] = GLFW_KEY_KP_7;
|
||||||
|
_glfw.ns.publicKeys[0x5B] = GLFW_KEY_KP_8;
|
||||||
|
_glfw.ns.publicKeys[0x5C] = GLFW_KEY_KP_9;
|
||||||
|
_glfw.ns.publicKeys[0x45] = GLFW_KEY_KP_ADD;
|
||||||
|
_glfw.ns.publicKeys[0x41] = GLFW_KEY_KP_DECIMAL;
|
||||||
|
_glfw.ns.publicKeys[0x4B] = GLFW_KEY_KP_DIVIDE;
|
||||||
|
_glfw.ns.publicKeys[0x4C] = GLFW_KEY_KP_ENTER;
|
||||||
|
_glfw.ns.publicKeys[0x51] = GLFW_KEY_KP_EQUAL;
|
||||||
|
_glfw.ns.publicKeys[0x43] = GLFW_KEY_KP_MULTIPLY;
|
||||||
|
_glfw.ns.publicKeys[0x4E] = GLFW_KEY_KP_SUBTRACT;
|
||||||
|
|
||||||
|
for (scancode = 0; scancode < 256; scancode++)
|
||||||
{
|
{
|
||||||
// Store the reverse translation for faster key name lookup
|
// Store the reverse translation for faster key name lookup
|
||||||
if (_glfw.ns.keycodes[scancode] >= 0)
|
if (_glfw.ns.publicKeys[scancode] >= 0)
|
||||||
_glfw.ns.scancodes[_glfw.ns.keycodes[scancode]] = scancode;
|
_glfw.ns.nativeKeys[_glfw.ns.publicKeys[scancode]] = scancode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve Unicode data for the current keyboard layout
|
// Retrieve Unicode data for the current keyboard layout
|
||||||
//
|
//
|
||||||
static GLFWbool updateUnicodeData(void)
|
static GLFWbool updateUnicodeDataNS(void)
|
||||||
{
|
{
|
||||||
if (_glfw.ns.inputSource)
|
if (_glfw.ns.inputSource)
|
||||||
{
|
{
|
||||||
|
@ -324,9 +219,8 @@ static GLFWbool updateUnicodeData(void)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfw.ns.unicodeData =
|
_glfw.ns.unicodeData = TISGetInputSourceProperty(_glfw.ns.inputSource,
|
||||||
TISGetInputSourceProperty(_glfw.ns.inputSource,
|
kTISPropertyUnicodeKeyLayoutData);
|
||||||
kTISPropertyUnicodeKeyLayoutData);
|
|
||||||
if (!_glfw.ns.unicodeData)
|
if (!_glfw.ns.unicodeData)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
@ -342,8 +236,7 @@ static GLFWbool updateUnicodeData(void)
|
||||||
static GLFWbool initializeTIS(void)
|
static GLFWbool initializeTIS(void)
|
||||||
{
|
{
|
||||||
// This works only because Cocoa has already loaded it properly
|
// This works only because Cocoa has already loaded it properly
|
||||||
_glfw.ns.tis.bundle =
|
_glfw.ns.tis.bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox"));
|
||||||
CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox"));
|
|
||||||
if (!_glfw.ns.tis.bundle)
|
if (!_glfw.ns.tis.bundle)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
@ -354,6 +247,9 @@ static GLFWbool initializeTIS(void)
|
||||||
CFStringRef* kPropertyUnicodeKeyLayoutData =
|
CFStringRef* kPropertyUnicodeKeyLayoutData =
|
||||||
CFBundleGetDataPointerForName(_glfw.ns.tis.bundle,
|
CFBundleGetDataPointerForName(_glfw.ns.tis.bundle,
|
||||||
CFSTR("kTISPropertyUnicodeKeyLayoutData"));
|
CFSTR("kTISPropertyUnicodeKeyLayoutData"));
|
||||||
|
CFStringRef* kNotifySelectedKeyboardInputSourceChanged =
|
||||||
|
CFBundleGetDataPointerForName(_glfw.ns.tis.bundle,
|
||||||
|
CFSTR("kTISNotifySelectedKeyboardInputSourceChanged"));
|
||||||
_glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource =
|
_glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource =
|
||||||
CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle,
|
CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle,
|
||||||
CFSTR("TISCopyCurrentKeyboardLayoutInputSource"));
|
CFSTR("TISCopyCurrentKeyboardLayoutInputSource"));
|
||||||
|
@ -365,6 +261,7 @@ static GLFWbool initializeTIS(void)
|
||||||
CFSTR("LMGetKbdType"));
|
CFSTR("LMGetKbdType"));
|
||||||
|
|
||||||
if (!kPropertyUnicodeKeyLayoutData ||
|
if (!kPropertyUnicodeKeyLayoutData ||
|
||||||
|
!kNotifySelectedKeyboardInputSourceChanged ||
|
||||||
!TISCopyCurrentKeyboardLayoutInputSource ||
|
!TISCopyCurrentKeyboardLayoutInputSource ||
|
||||||
!TISGetInputSourceProperty ||
|
!TISGetInputSourceProperty ||
|
||||||
!LMGetKbdType)
|
!LMGetKbdType)
|
||||||
|
@ -376,250 +273,44 @@ static GLFWbool initializeTIS(void)
|
||||||
|
|
||||||
_glfw.ns.tis.kPropertyUnicodeKeyLayoutData =
|
_glfw.ns.tis.kPropertyUnicodeKeyLayoutData =
|
||||||
*kPropertyUnicodeKeyLayoutData;
|
*kPropertyUnicodeKeyLayoutData;
|
||||||
|
_glfw.ns.tis.kNotifySelectedKeyboardInputSourceChanged =
|
||||||
|
*kNotifySelectedKeyboardInputSourceChanged;
|
||||||
|
|
||||||
return updateUnicodeData();
|
return updateUnicodeDataNS();
|
||||||
}
|
}
|
||||||
|
|
||||||
@interface GLFWHelper : NSObject
|
@interface GLFWLayoutListener : NSObject
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation GLFWHelper
|
@implementation GLFWLayoutListener
|
||||||
|
|
||||||
- (void)selectedKeyboardInputSourceChanged:(NSObject* )object
|
- (void)selectedKeyboardInputSourceChanged:(NSObject* )object
|
||||||
{
|
{
|
||||||
updateUnicodeData();
|
updateUnicodeDataNS();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)doNothing:(id)object
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@end // GLFWHelper
|
|
||||||
|
|
||||||
@interface GLFWApplicationDelegate : NSObject <NSApplicationDelegate>
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation GLFWApplicationDelegate
|
|
||||||
|
|
||||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next)
|
|
||||||
_glfwInputWindowCloseRequest(window);
|
|
||||||
|
|
||||||
return NSTerminateCancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidChangeScreenParameters:(NSNotification *) notification
|
|
||||||
{
|
|
||||||
for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next)
|
|
||||||
{
|
|
||||||
if (window->context.client != GLFW_NO_API)
|
|
||||||
[window->context.nsgl.object update];
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwPollMonitorsCocoa();
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.ns.menubar)
|
|
||||||
{
|
|
||||||
// Menu bar setup must go between sharedApplication and finishLaunching
|
|
||||||
// in order to properly emulate the behavior of NSApplicationMain
|
|
||||||
|
|
||||||
if ([[NSBundle mainBundle] pathForResource:@"MainMenu" ofType:@"nib"])
|
|
||||||
{
|
|
||||||
[[NSBundle mainBundle] loadNibNamed:@"MainMenu"
|
|
||||||
owner:NSApp
|
|
||||||
topLevelObjects:&_glfw.ns.nibObjects];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
createMenuBar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
_glfwPostEmptyEventCocoa();
|
|
||||||
[NSApp stop:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidHide:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
for (int i = 0; i < _glfw.monitorCount; i++)
|
|
||||||
_glfwRestoreVideoModeCocoa(_glfw.monitors[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end // GLFWApplicationDelegate
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
////// GLFW internal API //////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void* _glfwLoadLocalVulkanLoaderCocoa(void)
|
|
||||||
{
|
|
||||||
CFBundleRef bundle = CFBundleGetMainBundle();
|
|
||||||
if (!bundle)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
CFURLRef frameworksUrl = CFBundleCopyPrivateFrameworksURL(bundle);
|
|
||||||
if (!frameworksUrl)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
CFURLRef loaderUrl = CFURLCreateCopyAppendingPathComponent(
|
|
||||||
kCFAllocatorDefault, frameworksUrl, CFSTR("libvulkan.1.dylib"), false);
|
|
||||||
if (!loaderUrl)
|
|
||||||
{
|
|
||||||
CFRelease(frameworksUrl);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char path[PATH_MAX];
|
|
||||||
void* handle = NULL;
|
|
||||||
|
|
||||||
if (CFURLGetFileSystemRepresentation(loaderUrl, true, (UInt8*) path, sizeof(path) - 1))
|
|
||||||
handle = _glfwPlatformLoadModule(path);
|
|
||||||
|
|
||||||
CFRelease(loaderUrl);
|
|
||||||
CFRelease(frameworksUrl);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
|
int _glfwPlatformInit(void)
|
||||||
{
|
{
|
||||||
const _GLFWplatform cocoa =
|
_glfw.ns.autoreleasePool = [[NSAutoreleasePool alloc] init];
|
||||||
{
|
|
||||||
GLFW_PLATFORM_COCOA,
|
|
||||||
_glfwInitCocoa,
|
|
||||||
_glfwTerminateCocoa,
|
|
||||||
_glfwGetCursorPosCocoa,
|
|
||||||
_glfwSetCursorPosCocoa,
|
|
||||||
_glfwSetCursorModeCocoa,
|
|
||||||
_glfwSetRawMouseMotionCocoa,
|
|
||||||
_glfwRawMouseMotionSupportedCocoa,
|
|
||||||
_glfwCreateCursorCocoa,
|
|
||||||
_glfwCreateStandardCursorCocoa,
|
|
||||||
_glfwDestroyCursorCocoa,
|
|
||||||
_glfwSetCursorCocoa,
|
|
||||||
_glfwGetScancodeNameCocoa,
|
|
||||||
_glfwGetKeyScancodeCocoa,
|
|
||||||
_glfwSetClipboardStringCocoa,
|
|
||||||
_glfwGetClipboardStringCocoa,
|
|
||||||
_glfwInitJoysticksCocoa,
|
|
||||||
_glfwTerminateJoysticksCocoa,
|
|
||||||
_glfwPollJoystickCocoa,
|
|
||||||
_glfwGetMappingNameCocoa,
|
|
||||||
_glfwUpdateGamepadGUIDCocoa,
|
|
||||||
_glfwFreeMonitorCocoa,
|
|
||||||
_glfwGetMonitorPosCocoa,
|
|
||||||
_glfwGetMonitorContentScaleCocoa,
|
|
||||||
_glfwGetMonitorWorkareaCocoa,
|
|
||||||
_glfwGetVideoModesCocoa,
|
|
||||||
_glfwGetVideoModeCocoa,
|
|
||||||
_glfwGetGammaRampCocoa,
|
|
||||||
_glfwSetGammaRampCocoa,
|
|
||||||
_glfwCreateWindowCocoa,
|
|
||||||
_glfwDestroyWindowCocoa,
|
|
||||||
_glfwSetWindowTitleCocoa,
|
|
||||||
_glfwSetWindowIconCocoa,
|
|
||||||
_glfwGetWindowPosCocoa,
|
|
||||||
_glfwSetWindowPosCocoa,
|
|
||||||
_glfwGetWindowSizeCocoa,
|
|
||||||
_glfwSetWindowSizeCocoa,
|
|
||||||
_glfwSetWindowSizeLimitsCocoa,
|
|
||||||
_glfwSetWindowAspectRatioCocoa,
|
|
||||||
_glfwGetFramebufferSizeCocoa,
|
|
||||||
_glfwGetWindowFrameSizeCocoa,
|
|
||||||
_glfwGetWindowContentScaleCocoa,
|
|
||||||
_glfwIconifyWindowCocoa,
|
|
||||||
_glfwRestoreWindowCocoa,
|
|
||||||
_glfwMaximizeWindowCocoa,
|
|
||||||
_glfwShowWindowCocoa,
|
|
||||||
_glfwHideWindowCocoa,
|
|
||||||
_glfwRequestWindowAttentionCocoa,
|
|
||||||
_glfwFocusWindowCocoa,
|
|
||||||
_glfwSetWindowMonitorCocoa,
|
|
||||||
_glfwWindowFocusedCocoa,
|
|
||||||
_glfwWindowIconifiedCocoa,
|
|
||||||
_glfwWindowVisibleCocoa,
|
|
||||||
_glfwWindowMaximizedCocoa,
|
|
||||||
_glfwWindowHoveredCocoa,
|
|
||||||
_glfwFramebufferTransparentCocoa,
|
|
||||||
_glfwGetWindowOpacityCocoa,
|
|
||||||
_glfwSetWindowResizableCocoa,
|
|
||||||
_glfwSetWindowDecoratedCocoa,
|
|
||||||
_glfwSetWindowFloatingCocoa,
|
|
||||||
_glfwSetWindowOpacityCocoa,
|
|
||||||
_glfwSetWindowMousePassthroughCocoa,
|
|
||||||
_glfwPollEventsCocoa,
|
|
||||||
_glfwWaitEventsCocoa,
|
|
||||||
_glfwWaitEventsTimeoutCocoa,
|
|
||||||
_glfwPostEmptyEventCocoa,
|
|
||||||
_glfwGetEGLPlatformCocoa,
|
|
||||||
_glfwGetEGLNativeDisplayCocoa,
|
|
||||||
_glfwGetEGLNativeWindowCocoa,
|
|
||||||
_glfwGetRequiredInstanceExtensionsCocoa,
|
|
||||||
_glfwGetPhysicalDevicePresentationSupportCocoa,
|
|
||||||
_glfwCreateWindowSurfaceCocoa,
|
|
||||||
};
|
|
||||||
|
|
||||||
*platform = cocoa;
|
_glfw.ns.listener = [[GLFWLayoutListener alloc] init];
|
||||||
return GLFW_TRUE;
|
[[NSDistributedNotificationCenter defaultCenter]
|
||||||
}
|
addObserver:_glfw.ns.listener
|
||||||
|
|
||||||
int _glfwInitCocoa(void)
|
|
||||||
{
|
|
||||||
@autoreleasepool {
|
|
||||||
|
|
||||||
_glfw.ns.helper = [[GLFWHelper alloc] init];
|
|
||||||
|
|
||||||
[NSThread detachNewThreadSelector:@selector(doNothing:)
|
|
||||||
toTarget:_glfw.ns.helper
|
|
||||||
withObject:nil];
|
|
||||||
|
|
||||||
[NSApplication sharedApplication];
|
|
||||||
|
|
||||||
_glfw.ns.delegate = [[GLFWApplicationDelegate alloc] init];
|
|
||||||
if (_glfw.ns.delegate == nil)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Cocoa: Failed to create application delegate");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
[NSApp setDelegate:_glfw.ns.delegate];
|
|
||||||
|
|
||||||
NSEvent* (^block)(NSEvent*) = ^ NSEvent* (NSEvent* event)
|
|
||||||
{
|
|
||||||
if ([event modifierFlags] & NSEventModifierFlagCommand)
|
|
||||||
[[NSApp keyWindow] sendEvent:event];
|
|
||||||
|
|
||||||
return event;
|
|
||||||
};
|
|
||||||
|
|
||||||
_glfw.ns.keyUpMonitor =
|
|
||||||
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyUp
|
|
||||||
handler:block];
|
|
||||||
|
|
||||||
if (_glfw.hints.init.ns.chdir)
|
|
||||||
changeToResourcesDirectory();
|
|
||||||
|
|
||||||
// Press and Hold prevents some keys from emitting repeated characters
|
|
||||||
NSDictionary* defaults = @{@"ApplePressAndHoldEnabled":@NO};
|
|
||||||
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
|
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter]
|
|
||||||
addObserver:_glfw.ns.helper
|
|
||||||
selector:@selector(selectedKeyboardInputSourceChanged:)
|
selector:@selector(selectedKeyboardInputSourceChanged:)
|
||||||
name:NSTextInputContextKeyboardSelectionDidChangeNotification
|
name:(__bridge NSString*)kTISNotifySelectedKeyboardInputSourceChanged
|
||||||
object:nil];
|
object:nil];
|
||||||
|
|
||||||
|
#if defined(_GLFW_USE_CHDIR)
|
||||||
|
changeToResourcesDirectory();
|
||||||
|
#endif
|
||||||
|
|
||||||
createKeyTables();
|
createKeyTables();
|
||||||
|
|
||||||
_glfw.ns.eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
_glfw.ns.eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
@ -631,24 +322,20 @@ int _glfwInitCocoa(void)
|
||||||
if (!initializeTIS())
|
if (!initializeTIS())
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
_glfwPollMonitorsCocoa();
|
if (!_glfwInitThreadLocalStoragePOSIX())
|
||||||
|
return GLFW_FALSE;
|
||||||
|
|
||||||
if (![[NSRunningApplication currentApplication] isFinishedLaunching])
|
if (!_glfwInitNSGL())
|
||||||
[NSApp run];
|
return GLFW_FALSE;
|
||||||
|
|
||||||
// In case we are unbundled, make us a proper UI application
|
_glfwInitTimerNS();
|
||||||
if (_glfw.hints.init.ns.menubar)
|
_glfwInitJoysticksNS();
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwTerminateCocoa(void)
|
void _glfwPlatformTerminate(void)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
|
||||||
|
|
||||||
if (_glfw.ns.inputSource)
|
if (_glfw.ns.inputSource)
|
||||||
{
|
{
|
||||||
CFRelease(_glfw.ns.inputSource);
|
CFRelease(_glfw.ns.inputSource);
|
||||||
|
@ -669,29 +356,44 @@ void _glfwTerminateCocoa(void)
|
||||||
_glfw.ns.delegate = nil;
|
_glfw.ns.delegate = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.ns.helper)
|
if (_glfw.ns.listener)
|
||||||
{
|
{
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSDistributedNotificationCenter defaultCenter]
|
||||||
removeObserver:_glfw.ns.helper
|
removeObserver:_glfw.ns.listener
|
||||||
name:NSTextInputContextKeyboardSelectionDidChangeNotification
|
name:(__bridge NSString*)kTISNotifySelectedKeyboardInputSourceChanged
|
||||||
object:nil];
|
object:nil];
|
||||||
[[NSNotificationCenter defaultCenter]
|
[_glfw.ns.listener release];
|
||||||
removeObserver:_glfw.ns.helper];
|
_glfw.ns.listener = nil;
|
||||||
[_glfw.ns.helper release];
|
|
||||||
_glfw.ns.helper = nil;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.ns.keyUpMonitor)
|
[_glfw.ns.cursor release];
|
||||||
[NSEvent removeMonitor:_glfw.ns.keyUpMonitor];
|
_glfw.ns.cursor = nil;
|
||||||
|
|
||||||
_glfw_free(_glfw.ns.clipboardString);
|
free(_glfw.ns.clipboardString);
|
||||||
|
|
||||||
_glfwTerminateNSGL();
|
_glfwTerminateNSGL();
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateJoysticksNS();
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateThreadLocalStoragePOSIX();
|
||||||
|
|
||||||
} // autoreleasepool
|
[_glfw.ns.autoreleasePool release];
|
||||||
|
_glfw.ns.autoreleasePool = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_COCOA
|
const char* _glfwPlatformGetVersionString(void)
|
||||||
|
{
|
||||||
|
return _GLFW_VERSION_NUMBER " Cocoa NSGL"
|
||||||
|
#if defined(_GLFW_USE_CHDIR)
|
||||||
|
" chdir"
|
||||||
|
#endif
|
||||||
|
#if defined(_GLFW_USE_MENUBAR)
|
||||||
|
" menubar"
|
||||||
|
#endif
|
||||||
|
#if defined(_GLFW_USE_RETINA)
|
||||||
|
" retina"
|
||||||
|
#endif
|
||||||
|
#if defined(_GLFW_BUILD_DLL)
|
||||||
|
" dynamic"
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.2 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -24,26 +24,44 @@
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _glfw3_cocoa_joystick_h_
|
||||||
|
#define _glfw3_cocoa_joystick_h_
|
||||||
|
|
||||||
#include <IOKit/IOKitLib.h>
|
#include <IOKit/IOKitLib.h>
|
||||||
#include <IOKit/IOCFPlugIn.h>
|
#include <IOKit/IOCFPlugIn.h>
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
#include <IOKit/hid/IOHIDKeys.h>
|
#include <IOKit/hid/IOHIDKeys.h>
|
||||||
|
|
||||||
#define GLFW_COCOA_JOYSTICK_STATE _GLFWjoystickNS ns;
|
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE _GLFWjoystickNS ns_js
|
||||||
#define GLFW_COCOA_LIBRARY_JOYSTICK_STATE
|
|
||||||
|
|
||||||
// Cocoa-specific per-joystick data
|
// Cocoa-specific per-joystick data
|
||||||
//
|
//
|
||||||
|
typedef struct _GLFWjoydeviceNS
|
||||||
|
{
|
||||||
|
GLFWbool present;
|
||||||
|
char name[256];
|
||||||
|
|
||||||
|
IOHIDDeviceRef deviceRef;
|
||||||
|
|
||||||
|
CFMutableArrayRef axisElements;
|
||||||
|
CFMutableArrayRef buttonElements;
|
||||||
|
CFMutableArrayRef hatElements;
|
||||||
|
|
||||||
|
float* axes;
|
||||||
|
unsigned char* buttons;
|
||||||
|
} _GLFWjoydeviceNS;
|
||||||
|
|
||||||
|
// Cocoa-specific joystick API data
|
||||||
|
//
|
||||||
typedef struct _GLFWjoystickNS
|
typedef struct _GLFWjoystickNS
|
||||||
{
|
{
|
||||||
IOHIDDeviceRef device;
|
_GLFWjoydeviceNS js[GLFW_JOYSTICK_LAST + 1];
|
||||||
CFMutableArrayRef axes;
|
|
||||||
CFMutableArrayRef buttons;
|
IOHIDManagerRef managerRef;
|
||||||
CFMutableArrayRef hats;
|
|
||||||
} _GLFWjoystickNS;
|
} _GLFWjoystickNS;
|
||||||
|
|
||||||
GLFWbool _glfwInitJoysticksCocoa(void);
|
void _glfwInitJoysticksNS(void);
|
||||||
void _glfwTerminateJoysticksCocoa(void);
|
void _glfwTerminateJoysticksNS(void);
|
||||||
GLFWbool _glfwPollJoystickCocoa(_GLFWjoystick* js, int mode);
|
|
||||||
const char* _glfwGetMappingNameCocoa(void);
|
|
||||||
void _glfwUpdateGamepadGUIDCocoa(char* guid);
|
|
||||||
|
|
||||||
|
#endif // _glfw3_cocoa_joystick_h_
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.2 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>
|
// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
@ -24,13 +24,9 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// It is fine to use C99 in this file because it will not be built with VS
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(_GLFW_COCOA)
|
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -46,162 +42,42 @@
|
||||||
//
|
//
|
||||||
typedef struct _GLFWjoyelementNS
|
typedef struct _GLFWjoyelementNS
|
||||||
{
|
{
|
||||||
IOHIDElementRef native;
|
IOHIDElementRef elementRef;
|
||||||
uint32_t usage;
|
|
||||||
int index;
|
long min;
|
||||||
long minimum;
|
long max;
|
||||||
long maximum;
|
|
||||||
|
long minReport;
|
||||||
|
long maxReport;
|
||||||
|
|
||||||
} _GLFWjoyelementNS;
|
} _GLFWjoyelementNS;
|
||||||
|
|
||||||
|
|
||||||
// Returns the value of the specified element of the specified joystick
|
static void getElementsCFArrayHandler(const void* value, void* parameter);
|
||||||
|
|
||||||
|
// Adds an element to the specified joystick
|
||||||
//
|
//
|
||||||
static long getElementValue(_GLFWjoystick* js, _GLFWjoyelementNS* element)
|
static void addJoystickElement(_GLFWjoydeviceNS* js,
|
||||||
|
IOHIDElementRef elementRef)
|
||||||
{
|
{
|
||||||
IOHIDValueRef valueRef;
|
IOHIDElementType elementType;
|
||||||
long value = 0;
|
long usagePage, usage;
|
||||||
|
CFMutableArrayRef elementsArray = NULL;
|
||||||
|
|
||||||
if (js->ns.device)
|
elementType = IOHIDElementGetType(elementRef);
|
||||||
|
usagePage = IOHIDElementGetUsagePage(elementRef);
|
||||||
|
usage = IOHIDElementGetUsage(elementRef);
|
||||||
|
|
||||||
|
if ((elementType != kIOHIDElementTypeInput_Axis) &&
|
||||||
|
(elementType != kIOHIDElementTypeInput_Button) &&
|
||||||
|
(elementType != kIOHIDElementTypeInput_Misc))
|
||||||
{
|
{
|
||||||
if (IOHIDDeviceGetValue(js->ns.device,
|
return;
|
||||||
element->native,
|
|
||||||
&valueRef) == kIOReturnSuccess)
|
|
||||||
{
|
|
||||||
value = IOHIDValueGetIntegerValue(valueRef);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
switch (usagePage)
|
||||||
}
|
|
||||||
|
|
||||||
// Comparison function for matching the SDL element order
|
|
||||||
//
|
|
||||||
static CFComparisonResult compareElements(const void* fp,
|
|
||||||
const void* sp,
|
|
||||||
void* user)
|
|
||||||
{
|
|
||||||
const _GLFWjoyelementNS* fe = fp;
|
|
||||||
const _GLFWjoyelementNS* se = sp;
|
|
||||||
if (fe->usage < se->usage)
|
|
||||||
return kCFCompareLessThan;
|
|
||||||
if (fe->usage > se->usage)
|
|
||||||
return kCFCompareGreaterThan;
|
|
||||||
if (fe->index < se->index)
|
|
||||||
return kCFCompareLessThan;
|
|
||||||
if (fe->index > se->index)
|
|
||||||
return kCFCompareGreaterThan;
|
|
||||||
return kCFCompareEqualTo;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes the specified joystick
|
|
||||||
//
|
|
||||||
static void closeJoystick(_GLFWjoystick* js)
|
|
||||||
{
|
|
||||||
_glfwInputJoystick(js, GLFW_DISCONNECTED);
|
|
||||||
|
|
||||||
for (int i = 0; i < CFArrayGetCount(js->ns.axes); i++)
|
|
||||||
_glfw_free((void*) CFArrayGetValueAtIndex(js->ns.axes, i));
|
|
||||||
CFRelease(js->ns.axes);
|
|
||||||
|
|
||||||
for (int i = 0; i < CFArrayGetCount(js->ns.buttons); i++)
|
|
||||||
_glfw_free((void*) CFArrayGetValueAtIndex(js->ns.buttons, i));
|
|
||||||
CFRelease(js->ns.buttons);
|
|
||||||
|
|
||||||
for (int i = 0; i < CFArrayGetCount(js->ns.hats); i++)
|
|
||||||
_glfw_free((void*) CFArrayGetValueAtIndex(js->ns.hats, i));
|
|
||||||
CFRelease(js->ns.hats);
|
|
||||||
|
|
||||||
_glfwFreeJoystick(js);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback for user-initiated joystick addition
|
|
||||||
//
|
|
||||||
static void matchCallback(void* context,
|
|
||||||
IOReturn result,
|
|
||||||
void* sender,
|
|
||||||
IOHIDDeviceRef device)
|
|
||||||
{
|
|
||||||
int jid;
|
|
||||||
char name[256];
|
|
||||||
char guid[33];
|
|
||||||
CFTypeRef property;
|
|
||||||
uint32_t vendor = 0, product = 0, version = 0;
|
|
||||||
_GLFWjoystick* js;
|
|
||||||
CFMutableArrayRef axes, buttons, hats;
|
|
||||||
|
|
||||||
for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
|
||||||
{
|
{
|
||||||
if (_glfw.joysticks[jid].ns.device == device)
|
case kHIDPage_GenericDesktop:
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
axes = CFArrayCreateMutable(NULL, 0, NULL);
|
|
||||||
buttons = CFArrayCreateMutable(NULL, 0, NULL);
|
|
||||||
hats = CFArrayCreateMutable(NULL, 0, NULL);
|
|
||||||
|
|
||||||
property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));
|
|
||||||
if (property)
|
|
||||||
{
|
|
||||||
CFStringGetCString(property,
|
|
||||||
name,
|
|
||||||
sizeof(name),
|
|
||||||
kCFStringEncodingUTF8);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
strncpy(name, "Unknown", sizeof(name));
|
|
||||||
|
|
||||||
property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey));
|
|
||||||
if (property)
|
|
||||||
CFNumberGetValue(property, kCFNumberSInt32Type, &vendor);
|
|
||||||
|
|
||||||
property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey));
|
|
||||||
if (property)
|
|
||||||
CFNumberGetValue(property, kCFNumberSInt32Type, &product);
|
|
||||||
|
|
||||||
property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVersionNumberKey));
|
|
||||||
if (property)
|
|
||||||
CFNumberGetValue(property, kCFNumberSInt32Type, &version);
|
|
||||||
|
|
||||||
// Generate a joystick GUID that matches the SDL 2.0.5+ one
|
|
||||||
if (vendor && product)
|
|
||||||
{
|
|
||||||
sprintf(guid, "03000000%02x%02x0000%02x%02x0000%02x%02x0000",
|
|
||||||
(uint8_t) vendor, (uint8_t) (vendor >> 8),
|
|
||||||
(uint8_t) product, (uint8_t) (product >> 8),
|
|
||||||
(uint8_t) version, (uint8_t) (version >> 8));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(guid, "05000000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00",
|
|
||||||
name[0], name[1], name[2], name[3],
|
|
||||||
name[4], name[5], name[6], name[7],
|
|
||||||
name[8], name[9], name[10]);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFArrayRef elements =
|
|
||||||
IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone);
|
|
||||||
|
|
||||||
for (CFIndex i = 0; i < CFArrayGetCount(elements); i++)
|
|
||||||
{
|
|
||||||
IOHIDElementRef native = (IOHIDElementRef)
|
|
||||||
CFArrayGetValueAtIndex(elements, i);
|
|
||||||
if (CFGetTypeID(native) != IOHIDElementGetTypeID())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const IOHIDElementType type = IOHIDElementGetType(native);
|
|
||||||
if ((type != kIOHIDElementTypeInput_Axis) &&
|
|
||||||
(type != kIOHIDElementTypeInput_Button) &&
|
|
||||||
(type != kIOHIDElementTypeInput_Misc))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFMutableArrayRef target = NULL;
|
|
||||||
|
|
||||||
const uint32_t usage = IOHIDElementGetUsage(native);
|
|
||||||
const uint32_t page = IOHIDElementGetUsagePage(native);
|
|
||||||
if (page == kHIDPage_GenericDesktop)
|
|
||||||
{
|
{
|
||||||
switch (usage)
|
switch (usage)
|
||||||
{
|
{
|
||||||
|
@ -214,70 +90,241 @@ static void matchCallback(void* context,
|
||||||
case kHIDUsage_GD_Slider:
|
case kHIDUsage_GD_Slider:
|
||||||
case kHIDUsage_GD_Dial:
|
case kHIDUsage_GD_Dial:
|
||||||
case kHIDUsage_GD_Wheel:
|
case kHIDUsage_GD_Wheel:
|
||||||
target = axes;
|
elementsArray = js->axisElements;
|
||||||
break;
|
break;
|
||||||
case kHIDUsage_GD_Hatswitch:
|
case kHIDUsage_GD_Hatswitch:
|
||||||
target = hats;
|
elementsArray = js->hatElements;
|
||||||
break;
|
|
||||||
case kHIDUsage_GD_DPadUp:
|
|
||||||
case kHIDUsage_GD_DPadRight:
|
|
||||||
case kHIDUsage_GD_DPadDown:
|
|
||||||
case kHIDUsage_GD_DPadLeft:
|
|
||||||
case kHIDUsage_GD_SystemMainMenu:
|
|
||||||
case kHIDUsage_GD_Select:
|
|
||||||
case kHIDUsage_GD_Start:
|
|
||||||
target = buttons;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (page == kHIDPage_Simulation)
|
|
||||||
{
|
|
||||||
switch (usage)
|
|
||||||
{
|
|
||||||
case kHIDUsage_Sim_Accelerator:
|
|
||||||
case kHIDUsage_Sim_Brake:
|
|
||||||
case kHIDUsage_Sim_Throttle:
|
|
||||||
case kHIDUsage_Sim_Rudder:
|
|
||||||
case kHIDUsage_Sim_Steering:
|
|
||||||
target = axes;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (page == kHIDPage_Button || page == kHIDPage_Consumer)
|
|
||||||
target = buttons;
|
|
||||||
|
|
||||||
if (target)
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kHIDPage_Button:
|
||||||
|
elementsArray = js->buttonElements;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elementsArray)
|
||||||
|
{
|
||||||
|
_GLFWjoyelementNS* element = calloc(1, sizeof(_GLFWjoyelementNS));
|
||||||
|
|
||||||
|
CFArrayAppendValue(elementsArray, element);
|
||||||
|
|
||||||
|
element->elementRef = elementRef;
|
||||||
|
|
||||||
|
element->minReport = IOHIDElementGetLogicalMin(elementRef);
|
||||||
|
element->maxReport = IOHIDElementGetLogicalMax(elementRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adds an element to the specified joystick
|
||||||
|
//
|
||||||
|
static void getElementsCFArrayHandler(const void* value, void* parameter)
|
||||||
|
{
|
||||||
|
if (CFGetTypeID(value) == IOHIDElementGetTypeID())
|
||||||
|
{
|
||||||
|
addJoystickElement((_GLFWjoydeviceNS*) parameter,
|
||||||
|
(IOHIDElementRef) value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the value of the specified element of the specified joystick
|
||||||
|
//
|
||||||
|
static long getElementValue(_GLFWjoydeviceNS* js, _GLFWjoyelementNS* element)
|
||||||
|
{
|
||||||
|
IOReturn result = kIOReturnSuccess;
|
||||||
|
IOHIDValueRef valueRef;
|
||||||
|
long value = 0;
|
||||||
|
|
||||||
|
if (js && element && js->deviceRef)
|
||||||
|
{
|
||||||
|
result = IOHIDDeviceGetValue(js->deviceRef,
|
||||||
|
element->elementRef,
|
||||||
|
&valueRef);
|
||||||
|
|
||||||
|
if (kIOReturnSuccess == result)
|
||||||
{
|
{
|
||||||
_GLFWjoyelementNS* element = _glfw_calloc(1, sizeof(_GLFWjoyelementNS));
|
value = IOHIDValueGetIntegerValue(valueRef);
|
||||||
element->native = native;
|
|
||||||
element->usage = usage;
|
// Record min and max for auto calibration
|
||||||
element->index = (int) CFArrayGetCount(target);
|
if (value < element->minReport)
|
||||||
element->minimum = IOHIDElementGetLogicalMin(native);
|
element->minReport = value;
|
||||||
element->maximum = IOHIDElementGetLogicalMax(native);
|
if (value > element->maxReport)
|
||||||
CFArrayAppendValue(target, element);
|
element->maxReport = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(elements);
|
// Auto user scale
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
CFArraySortValues(axes, CFRangeMake(0, CFArrayGetCount(axes)),
|
// Removes the specified joystick
|
||||||
compareElements, NULL);
|
//
|
||||||
CFArraySortValues(buttons, CFRangeMake(0, CFArrayGetCount(buttons)),
|
static void removeJoystick(_GLFWjoydeviceNS* js)
|
||||||
compareElements, NULL);
|
{
|
||||||
CFArraySortValues(hats, CFRangeMake(0, CFArrayGetCount(hats)),
|
int i;
|
||||||
compareElements, NULL);
|
|
||||||
|
|
||||||
js = _glfwAllocJoystick(name, guid,
|
if (!js->present)
|
||||||
(int) CFArrayGetCount(axes),
|
return;
|
||||||
(int) CFArrayGetCount(buttons),
|
|
||||||
(int) CFArrayGetCount(hats));
|
|
||||||
|
|
||||||
js->ns.device = device;
|
for (i = 0; i < CFArrayGetCount(js->axisElements); i++)
|
||||||
js->ns.axes = axes;
|
free((void*) CFArrayGetValueAtIndex(js->axisElements, i));
|
||||||
js->ns.buttons = buttons;
|
CFArrayRemoveAllValues(js->axisElements);
|
||||||
js->ns.hats = hats;
|
CFRelease(js->axisElements);
|
||||||
|
|
||||||
_glfwInputJoystick(js, GLFW_CONNECTED);
|
for (i = 0; i < CFArrayGetCount(js->buttonElements); i++)
|
||||||
|
free((void*) CFArrayGetValueAtIndex(js->buttonElements, i));
|
||||||
|
CFArrayRemoveAllValues(js->buttonElements);
|
||||||
|
CFRelease(js->buttonElements);
|
||||||
|
|
||||||
|
for (i = 0; i < CFArrayGetCount(js->hatElements); i++)
|
||||||
|
free((void*) CFArrayGetValueAtIndex(js->hatElements, i));
|
||||||
|
CFArrayRemoveAllValues(js->hatElements);
|
||||||
|
CFRelease(js->hatElements);
|
||||||
|
|
||||||
|
free(js->axes);
|
||||||
|
free(js->buttons);
|
||||||
|
|
||||||
|
memset(js, 0, sizeof(_GLFWjoydeviceNS));
|
||||||
|
|
||||||
|
_glfwInputJoystickChange(js - _glfw.ns_js.js, GLFW_DISCONNECTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Polls for joystick axis events and updates GLFW state
|
||||||
|
//
|
||||||
|
static GLFWbool pollJoystickAxisEvents(_GLFWjoydeviceNS* js)
|
||||||
|
{
|
||||||
|
CFIndex i;
|
||||||
|
|
||||||
|
if (!js->present)
|
||||||
|
return GLFW_FALSE;
|
||||||
|
|
||||||
|
for (i = 0; i < CFArrayGetCount(js->axisElements); i++)
|
||||||
|
{
|
||||||
|
_GLFWjoyelementNS* axis = (_GLFWjoyelementNS*)
|
||||||
|
CFArrayGetValueAtIndex(js->axisElements, i);
|
||||||
|
|
||||||
|
long value = getElementValue(js, axis);
|
||||||
|
long readScale = axis->maxReport - axis->minReport;
|
||||||
|
|
||||||
|
if (readScale == 0)
|
||||||
|
js->axes[i] = value;
|
||||||
|
else
|
||||||
|
js->axes[i] = (2.f * (value - axis->minReport) / readScale) - 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Polls for joystick button events and updates GLFW state
|
||||||
|
//
|
||||||
|
static GLFWbool pollJoystickButtonEvents(_GLFWjoydeviceNS* js)
|
||||||
|
{
|
||||||
|
CFIndex i;
|
||||||
|
int buttonIndex = 0;
|
||||||
|
|
||||||
|
if (!js->present)
|
||||||
|
return GLFW_FALSE;
|
||||||
|
|
||||||
|
for (i = 0; i < CFArrayGetCount(js->buttonElements); i++)
|
||||||
|
{
|
||||||
|
_GLFWjoyelementNS* button = (_GLFWjoyelementNS*)
|
||||||
|
CFArrayGetValueAtIndex(js->buttonElements, i);
|
||||||
|
|
||||||
|
if (getElementValue(js, button))
|
||||||
|
js->buttons[buttonIndex++] = GLFW_PRESS;
|
||||||
|
else
|
||||||
|
js->buttons[buttonIndex++] = GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < CFArrayGetCount(js->hatElements); i++)
|
||||||
|
{
|
||||||
|
_GLFWjoyelementNS* hat = (_GLFWjoyelementNS*)
|
||||||
|
CFArrayGetValueAtIndex(js->hatElements, i);
|
||||||
|
|
||||||
|
// Bit fields of button presses for each direction, including nil
|
||||||
|
const int directions[9] = { 1, 3, 2, 6, 4, 12, 8, 9, 0 };
|
||||||
|
|
||||||
|
long j, value = getElementValue(js, hat);
|
||||||
|
if (value < 0 || value > 8)
|
||||||
|
value = 8;
|
||||||
|
|
||||||
|
for (j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
if (directions[value] & (1 << j))
|
||||||
|
js->buttons[buttonIndex++] = GLFW_PRESS;
|
||||||
|
else
|
||||||
|
js->buttons[buttonIndex++] = GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback for user-initiated joystick addition
|
||||||
|
//
|
||||||
|
static void matchCallback(void* context,
|
||||||
|
IOReturn result,
|
||||||
|
void* sender,
|
||||||
|
IOHIDDeviceRef deviceRef)
|
||||||
|
{
|
||||||
|
_GLFWjoydeviceNS* js;
|
||||||
|
int joy;
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy <= GLFW_JOYSTICK_LAST; joy++)
|
||||||
|
{
|
||||||
|
if (_glfw.ns_js.js[joy].present && _glfw.ns_js.js[joy].deviceRef == deviceRef)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy <= GLFW_JOYSTICK_LAST; joy++)
|
||||||
|
{
|
||||||
|
if (!_glfw.ns_js.js[joy].present)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (joy > GLFW_JOYSTICK_LAST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
js = _glfw.ns_js.js + joy;
|
||||||
|
js->present = GLFW_TRUE;
|
||||||
|
js->deviceRef = deviceRef;
|
||||||
|
|
||||||
|
CFStringRef name = IOHIDDeviceGetProperty(deviceRef,
|
||||||
|
CFSTR(kIOHIDProductKey));
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
CFStringGetCString(name,
|
||||||
|
js->name,
|
||||||
|
sizeof(js->name),
|
||||||
|
kCFStringEncodingUTF8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strncpy(js->name, "Unknown", sizeof(js->name));
|
||||||
|
|
||||||
|
js->axisElements = CFArrayCreateMutable(NULL, 0, NULL);
|
||||||
|
js->buttonElements = CFArrayCreateMutable(NULL, 0, NULL);
|
||||||
|
js->hatElements = CFArrayCreateMutable(NULL, 0, NULL);
|
||||||
|
|
||||||
|
CFArrayRef arrayRef = IOHIDDeviceCopyMatchingElements(deviceRef,
|
||||||
|
NULL,
|
||||||
|
kIOHIDOptionsTypeNone);
|
||||||
|
CFRange range = { 0, CFArrayGetCount(arrayRef) };
|
||||||
|
CFArrayApplyFunction(arrayRef,
|
||||||
|
range,
|
||||||
|
getElementsCFArrayHandler,
|
||||||
|
(void*) js);
|
||||||
|
|
||||||
|
CFRelease(arrayRef);
|
||||||
|
|
||||||
|
js->axes = calloc(CFArrayGetCount(js->axisElements), sizeof(float));
|
||||||
|
js->buttons = calloc(CFArrayGetCount(js->buttonElements) +
|
||||||
|
CFArrayGetCount(js->hatElements) * 4, 1);
|
||||||
|
|
||||||
|
_glfwInputJoystickChange(joy, GLFW_CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback for user-initiated joystick removal
|
// Callback for user-initiated joystick removal
|
||||||
|
@ -285,198 +332,180 @@ static void matchCallback(void* context,
|
||||||
static void removeCallback(void* context,
|
static void removeCallback(void* context,
|
||||||
IOReturn result,
|
IOReturn result,
|
||||||
void* sender,
|
void* sender,
|
||||||
IOHIDDeviceRef device)
|
IOHIDDeviceRef deviceRef)
|
||||||
{
|
{
|
||||||
for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
int joy;
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy <= GLFW_JOYSTICK_LAST; joy++)
|
||||||
{
|
{
|
||||||
if (_glfw.joysticks[jid].connected && _glfw.joysticks[jid].ns.device == device)
|
if (_glfw.ns_js.js[joy].deviceRef == deviceRef)
|
||||||
{
|
{
|
||||||
closeJoystick(&_glfw.joysticks[jid]);
|
removeJoystick(_glfw.ns_js.js + joy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creates a dictionary to match against devices with the specified usage page
|
||||||
|
// and usage
|
||||||
|
//
|
||||||
|
static CFMutableDictionaryRef createMatchingDictionary(long usagePage,
|
||||||
|
long usage)
|
||||||
|
{
|
||||||
|
CFMutableDictionaryRef result =
|
||||||
|
CFDictionaryCreateMutable(kCFAllocatorDefault,
|
||||||
|
0,
|
||||||
|
&kCFTypeDictionaryKeyCallBacks,
|
||||||
|
&kCFTypeDictionaryValueCallBacks);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
CFNumberRef pageRef = CFNumberCreate(kCFAllocatorDefault,
|
||||||
|
kCFNumberLongType,
|
||||||
|
&usagePage);
|
||||||
|
if (pageRef)
|
||||||
|
{
|
||||||
|
CFDictionarySetValue(result,
|
||||||
|
CFSTR(kIOHIDDeviceUsagePageKey),
|
||||||
|
pageRef);
|
||||||
|
CFRelease(pageRef);
|
||||||
|
|
||||||
|
CFNumberRef usageRef = CFNumberCreate(kCFAllocatorDefault,
|
||||||
|
kCFNumberLongType,
|
||||||
|
&usage);
|
||||||
|
if (usageRef)
|
||||||
|
{
|
||||||
|
CFDictionarySetValue(result,
|
||||||
|
CFSTR(kIOHIDDeviceUsageKey),
|
||||||
|
usageRef);
|
||||||
|
CFRelease(usageRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
////// GLFW internal API //////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Initialize joystick interface
|
||||||
|
//
|
||||||
|
void _glfwInitJoysticksNS(void)
|
||||||
|
{
|
||||||
|
CFMutableArrayRef matchingCFArrayRef;
|
||||||
|
|
||||||
|
_glfw.ns_js.managerRef = IOHIDManagerCreate(kCFAllocatorDefault,
|
||||||
|
kIOHIDOptionsTypeNone);
|
||||||
|
|
||||||
|
matchingCFArrayRef = CFArrayCreateMutable(kCFAllocatorDefault,
|
||||||
|
0,
|
||||||
|
&kCFTypeArrayCallBacks);
|
||||||
|
if (matchingCFArrayRef)
|
||||||
|
{
|
||||||
|
CFDictionaryRef matchingCFDictRef =
|
||||||
|
createMatchingDictionary(kHIDPage_GenericDesktop,
|
||||||
|
kHIDUsage_GD_Joystick);
|
||||||
|
if (matchingCFDictRef)
|
||||||
|
{
|
||||||
|
CFArrayAppendValue(matchingCFArrayRef, matchingCFDictRef);
|
||||||
|
CFRelease(matchingCFDictRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
matchingCFDictRef = createMatchingDictionary(kHIDPage_GenericDesktop,
|
||||||
|
kHIDUsage_GD_GamePad);
|
||||||
|
if (matchingCFDictRef)
|
||||||
|
{
|
||||||
|
CFArrayAppendValue(matchingCFArrayRef, matchingCFDictRef);
|
||||||
|
CFRelease(matchingCFDictRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
matchingCFDictRef =
|
||||||
|
createMatchingDictionary(kHIDPage_GenericDesktop,
|
||||||
|
kHIDUsage_GD_MultiAxisController);
|
||||||
|
if (matchingCFDictRef)
|
||||||
|
{
|
||||||
|
CFArrayAppendValue(matchingCFArrayRef, matchingCFDictRef);
|
||||||
|
CFRelease(matchingCFDictRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
IOHIDManagerSetDeviceMatchingMultiple(_glfw.ns_js.managerRef,
|
||||||
|
matchingCFArrayRef);
|
||||||
|
CFRelease(matchingCFArrayRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
IOHIDManagerRegisterDeviceMatchingCallback(_glfw.ns_js.managerRef,
|
||||||
|
&matchCallback, NULL);
|
||||||
|
IOHIDManagerRegisterDeviceRemovalCallback(_glfw.ns_js.managerRef,
|
||||||
|
&removeCallback, NULL);
|
||||||
|
|
||||||
|
IOHIDManagerScheduleWithRunLoop(_glfw.ns_js.managerRef,
|
||||||
|
CFRunLoopGetMain(),
|
||||||
|
kCFRunLoopDefaultMode);
|
||||||
|
|
||||||
|
IOHIDManagerOpen(_glfw.ns_js.managerRef, kIOHIDOptionsTypeNone);
|
||||||
|
|
||||||
|
// Execute the run loop once in order to register any initially-attached
|
||||||
|
// joysticks
|
||||||
|
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close all opened joystick handles
|
||||||
|
//
|
||||||
|
void _glfwTerminateJoysticksNS(void)
|
||||||
|
{
|
||||||
|
int joy;
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy <= GLFW_JOYSTICK_LAST; joy++)
|
||||||
|
{
|
||||||
|
_GLFWjoydeviceNS* js = _glfw.ns_js.js + joy;
|
||||||
|
removeJoystick(js);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease(_glfw.ns_js.managerRef);
|
||||||
|
_glfw.ns_js.managerRef = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
GLFWbool _glfwInitJoysticksCocoa(void)
|
int _glfwPlatformJoystickPresent(int joy)
|
||||||
{
|
{
|
||||||
CFMutableArrayRef matching;
|
_GLFWjoydeviceNS* js = _glfw.ns_js.js + joy;
|
||||||
const long usages[] =
|
return js->present;
|
||||||
{
|
|
||||||
kHIDUsage_GD_Joystick,
|
|
||||||
kHIDUsage_GD_GamePad,
|
|
||||||
kHIDUsage_GD_MultiAxisController
|
|
||||||
};
|
|
||||||
|
|
||||||
_glfw.ns.hidManager = IOHIDManagerCreate(kCFAllocatorDefault,
|
|
||||||
kIOHIDOptionsTypeNone);
|
|
||||||
|
|
||||||
matching = CFArrayCreateMutable(kCFAllocatorDefault,
|
|
||||||
0,
|
|
||||||
&kCFTypeArrayCallBacks);
|
|
||||||
if (!matching)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to create array");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(usages) / sizeof(long); i++)
|
|
||||||
{
|
|
||||||
const long page = kHIDPage_GenericDesktop;
|
|
||||||
|
|
||||||
CFMutableDictionaryRef dict =
|
|
||||||
CFDictionaryCreateMutable(kCFAllocatorDefault,
|
|
||||||
0,
|
|
||||||
&kCFTypeDictionaryKeyCallBacks,
|
|
||||||
&kCFTypeDictionaryValueCallBacks);
|
|
||||||
if (!dict)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
CFNumberRef pageRef = CFNumberCreate(kCFAllocatorDefault,
|
|
||||||
kCFNumberLongType,
|
|
||||||
&page);
|
|
||||||
CFNumberRef usageRef = CFNumberCreate(kCFAllocatorDefault,
|
|
||||||
kCFNumberLongType,
|
|
||||||
&usages[i]);
|
|
||||||
if (pageRef && usageRef)
|
|
||||||
{
|
|
||||||
CFDictionarySetValue(dict,
|
|
||||||
CFSTR(kIOHIDDeviceUsagePageKey),
|
|
||||||
pageRef);
|
|
||||||
CFDictionarySetValue(dict,
|
|
||||||
CFSTR(kIOHIDDeviceUsageKey),
|
|
||||||
usageRef);
|
|
||||||
CFArrayAppendValue(matching, dict);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pageRef)
|
|
||||||
CFRelease(pageRef);
|
|
||||||
if (usageRef)
|
|
||||||
CFRelease(usageRef);
|
|
||||||
|
|
||||||
CFRelease(dict);
|
|
||||||
}
|
|
||||||
|
|
||||||
IOHIDManagerSetDeviceMatchingMultiple(_glfw.ns.hidManager, matching);
|
|
||||||
CFRelease(matching);
|
|
||||||
|
|
||||||
IOHIDManagerRegisterDeviceMatchingCallback(_glfw.ns.hidManager,
|
|
||||||
&matchCallback, NULL);
|
|
||||||
IOHIDManagerRegisterDeviceRemovalCallback(_glfw.ns.hidManager,
|
|
||||||
&removeCallback, NULL);
|
|
||||||
IOHIDManagerScheduleWithRunLoop(_glfw.ns.hidManager,
|
|
||||||
CFRunLoopGetMain(),
|
|
||||||
kCFRunLoopDefaultMode);
|
|
||||||
IOHIDManagerOpen(_glfw.ns.hidManager, kIOHIDOptionsTypeNone);
|
|
||||||
|
|
||||||
// Execute the run loop once in order to register any initially-attached
|
|
||||||
// joysticks
|
|
||||||
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);
|
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwTerminateJoysticksCocoa(void)
|
const float* _glfwPlatformGetJoystickAxes(int joy, int* count)
|
||||||
{
|
{
|
||||||
for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
_GLFWjoydeviceNS* js = _glfw.ns_js.js + joy;
|
||||||
{
|
if (!pollJoystickAxisEvents(js))
|
||||||
if (_glfw.joysticks[jid].connected)
|
return NULL;
|
||||||
closeJoystick(&_glfw.joysticks[jid]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.ns.hidManager)
|
*count = (int) CFArrayGetCount(js->axisElements);
|
||||||
{
|
return js->axes;
|
||||||
CFRelease(_glfw.ns.hidManager);
|
|
||||||
_glfw.ns.hidManager = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unsigned char* _glfwPlatformGetJoystickButtons(int joy, int* count)
|
||||||
GLFWbool _glfwPollJoystickCocoa(_GLFWjoystick* js, int mode)
|
|
||||||
{
|
{
|
||||||
if (mode & _GLFW_POLL_AXES)
|
_GLFWjoydeviceNS* js = _glfw.ns_js.js + joy;
|
||||||
{
|
if (!pollJoystickButtonEvents(js))
|
||||||
for (CFIndex i = 0; i < CFArrayGetCount(js->ns.axes); i++)
|
return NULL;
|
||||||
{
|
|
||||||
_GLFWjoyelementNS* axis = (_GLFWjoyelementNS*)
|
|
||||||
CFArrayGetValueAtIndex(js->ns.axes, i);
|
|
||||||
|
|
||||||
const long raw = getElementValue(js, axis);
|
*count = (int) CFArrayGetCount(js->buttonElements) +
|
||||||
// Perform auto calibration
|
(int) CFArrayGetCount(js->hatElements) * 4;
|
||||||
if (raw < axis->minimum)
|
return js->buttons;
|
||||||
axis->minimum = raw;
|
|
||||||
if (raw > axis->maximum)
|
|
||||||
axis->maximum = raw;
|
|
||||||
|
|
||||||
const long size = axis->maximum - axis->minimum;
|
|
||||||
if (size == 0)
|
|
||||||
_glfwInputJoystickAxis(js, (int) i, 0.f);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const float value = (2.f * (raw - axis->minimum) / size) - 1.f;
|
|
||||||
_glfwInputJoystickAxis(js, (int) i, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode & _GLFW_POLL_BUTTONS)
|
|
||||||
{
|
|
||||||
for (CFIndex i = 0; i < CFArrayGetCount(js->ns.buttons); i++)
|
|
||||||
{
|
|
||||||
_GLFWjoyelementNS* button = (_GLFWjoyelementNS*)
|
|
||||||
CFArrayGetValueAtIndex(js->ns.buttons, i);
|
|
||||||
const char value = getElementValue(js, button) - button->minimum;
|
|
||||||
const int state = (value > 0) ? GLFW_PRESS : GLFW_RELEASE;
|
|
||||||
_glfwInputJoystickButton(js, (int) i, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (CFIndex i = 0; i < CFArrayGetCount(js->ns.hats); i++)
|
|
||||||
{
|
|
||||||
const int states[9] =
|
|
||||||
{
|
|
||||||
GLFW_HAT_UP,
|
|
||||||
GLFW_HAT_RIGHT_UP,
|
|
||||||
GLFW_HAT_RIGHT,
|
|
||||||
GLFW_HAT_RIGHT_DOWN,
|
|
||||||
GLFW_HAT_DOWN,
|
|
||||||
GLFW_HAT_LEFT_DOWN,
|
|
||||||
GLFW_HAT_LEFT,
|
|
||||||
GLFW_HAT_LEFT_UP,
|
|
||||||
GLFW_HAT_CENTERED
|
|
||||||
};
|
|
||||||
|
|
||||||
_GLFWjoyelementNS* hat = (_GLFWjoyelementNS*)
|
|
||||||
CFArrayGetValueAtIndex(js->ns.hats, i);
|
|
||||||
long state = getElementValue(js, hat) - hat->minimum;
|
|
||||||
if (state < 0 || state > 8)
|
|
||||||
state = 8;
|
|
||||||
|
|
||||||
_glfwInputJoystickHat(js, (int) i, states[state]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return js->connected;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* _glfwGetMappingNameCocoa(void)
|
const char* _glfwPlatformGetJoystickName(int joy)
|
||||||
{
|
{
|
||||||
return "Mac OS X";
|
_GLFWjoydeviceNS* js = _glfw.ns_js.js + joy;
|
||||||
|
if (!js->present)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return js->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwUpdateGamepadGUIDCocoa(char* guid)
|
|
||||||
{
|
|
||||||
if ((strncmp(guid + 4, "000000000000", 12) == 0) &&
|
|
||||||
(strncmp(guid + 20, "000000000000", 12) == 0))
|
|
||||||
{
|
|
||||||
char original[33];
|
|
||||||
strncpy(original, guid, sizeof(original) - 1);
|
|
||||||
sprintf(guid, "03000000%.4s0000%.4s000000000000",
|
|
||||||
original, original + 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _GLFW_COCOA
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.2 OS X - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -24,104 +24,53 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// It is fine to use C99 in this file because it will not be built with VS
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(_GLFW_COCOA)
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||||
|
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||||
|
#include <CoreVideo/CVBase.h>
|
||||||
|
#include <CoreVideo/CVDisplayLink.h>
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
|
||||||
|
|
||||||
// Get the name of the specified display, or NULL
|
// Get the name of the specified display
|
||||||
//
|
//
|
||||||
static char* getMonitorName(CGDirectDisplayID displayID, NSScreen* screen)
|
static char* getDisplayName(CGDirectDisplayID displayID)
|
||||||
{
|
{
|
||||||
// IOKit doesn't work on Apple Silicon anymore
|
char* name;
|
||||||
// Luckily, 10.15 introduced -[NSScreen localizedName].
|
CFDictionaryRef info, names;
|
||||||
// Use it if available, and fall back to IOKit otherwise.
|
CFStringRef value;
|
||||||
if (screen)
|
CFIndex size;
|
||||||
{
|
|
||||||
if ([screen respondsToSelector:@selector(localizedName)])
|
|
||||||
{
|
|
||||||
NSString* name = [screen valueForKey:@"localizedName"];
|
|
||||||
if (name)
|
|
||||||
return _glfw_strdup([name UTF8String]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
io_iterator_t it;
|
// NOTE: This uses a deprecated function because Apple has
|
||||||
io_service_t service;
|
// (as of January 2015) not provided any alternative
|
||||||
CFDictionaryRef info;
|
info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID),
|
||||||
|
kIODisplayOnlyPreferredName);
|
||||||
if (IOServiceGetMatchingServices(MACH_PORT_NULL,
|
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
||||||
IOServiceMatching("IODisplayConnect"),
|
|
||||||
&it) != 0)
|
|
||||||
{
|
|
||||||
// This may happen if a desktop Mac is running headless
|
|
||||||
return _glfw_strdup("Display");
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((service = IOIteratorNext(it)) != 0)
|
|
||||||
{
|
|
||||||
info = IODisplayCreateInfoDictionary(service,
|
|
||||||
kIODisplayOnlyPreferredName);
|
|
||||||
|
|
||||||
CFNumberRef vendorIDRef =
|
|
||||||
CFDictionaryGetValue(info, CFSTR(kDisplayVendorID));
|
|
||||||
CFNumberRef productIDRef =
|
|
||||||
CFDictionaryGetValue(info, CFSTR(kDisplayProductID));
|
|
||||||
if (!vendorIDRef || !productIDRef)
|
|
||||||
{
|
|
||||||
CFRelease(info);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int vendorID, productID;
|
|
||||||
CFNumberGetValue(vendorIDRef, kCFNumberIntType, &vendorID);
|
|
||||||
CFNumberGetValue(productIDRef, kCFNumberIntType, &productID);
|
|
||||||
|
|
||||||
if (CGDisplayVendorNumber(displayID) == vendorID &&
|
|
||||||
CGDisplayModelNumber(displayID) == productID)
|
|
||||||
{
|
|
||||||
// Info dictionary is used and freed below
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFRelease(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
IOObjectRelease(it);
|
|
||||||
|
|
||||||
if (!service)
|
|
||||||
return _glfw_strdup("Display");
|
|
||||||
|
|
||||||
CFDictionaryRef names =
|
|
||||||
CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
|
||||||
|
|
||||||
CFStringRef nameRef;
|
|
||||||
|
|
||||||
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
||||||
(const void**) &nameRef))
|
(const void**) &value))
|
||||||
{
|
{
|
||||||
// This may happen if a desktop Mac is running headless
|
// This may happen if a desktop Mac is running headless
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Cocoa: Failed to retrieve display name");
|
||||||
|
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
return _glfw_strdup("Display");
|
return strdup("Unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
const CFIndex size =
|
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),
|
||||||
CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef),
|
kCFStringEncodingUTF8);
|
||||||
kCFStringEncodingUTF8);
|
name = calloc(size + 1, sizeof(char));
|
||||||
char* name = _glfw_calloc(size + 1, 1);
|
CFStringGetCString(value, name, size, kCFStringEncodingUTF8);
|
||||||
CFStringGetCString(nameRef, name, size, kCFStringEncodingUTF8);
|
|
||||||
|
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,15 +79,15 @@ static char* getMonitorName(CGDirectDisplayID displayID, NSScreen* screen)
|
||||||
static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
||||||
{
|
{
|
||||||
uint32_t flags = CGDisplayModeGetIOFlags(mode);
|
uint32_t flags = CGDisplayModeGetIOFlags(mode);
|
||||||
|
|
||||||
if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))
|
if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
if (flags & kDisplayModeInterlacedFlag)
|
if (flags & kDisplayModeInterlacedFlag)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
if (flags & kDisplayModeStretchedFlag)
|
if (flags & kDisplayModeStretchedFlag)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
|
||||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&
|
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&
|
||||||
CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))
|
CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))
|
||||||
|
@ -148,25 +97,28 @@ static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(format);
|
CFRelease(format);
|
||||||
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert Core Graphics display mode to GLFW video mode
|
// Convert Core Graphics display mode to GLFW video mode
|
||||||
//
|
//
|
||||||
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
||||||
double fallbackRefreshRate)
|
CVDisplayLinkRef link)
|
||||||
{
|
{
|
||||||
GLFWvidmode result;
|
GLFWvidmode result;
|
||||||
result.width = (int) CGDisplayModeGetWidth(mode);
|
result.width = (int) CGDisplayModeGetWidth(mode);
|
||||||
result.height = (int) CGDisplayModeGetHeight(mode);
|
result.height = (int) CGDisplayModeGetHeight(mode);
|
||||||
result.refreshRate = (int) round(CGDisplayModeGetRefreshRate(mode));
|
result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);
|
||||||
|
|
||||||
if (result.refreshRate == 0)
|
if (result.refreshRate == 0)
|
||||||
result.refreshRate = (int) round(fallbackRefreshRate);
|
{
|
||||||
|
const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
|
||||||
|
if (!(time.flags & kCVTimeIsIndefinite))
|
||||||
|
result.refreshRate = (int) (time.timeScale / (double) time.timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
|
||||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||||
|
|
||||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)
|
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)
|
||||||
{
|
{
|
||||||
result.redBits = 5;
|
result.redBits = 5;
|
||||||
|
@ -174,16 +126,13 @@ static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
||||||
result.blueBits = 5;
|
result.blueBits = 5;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
|
|
||||||
{
|
{
|
||||||
result.redBits = 8;
|
result.redBits = 8;
|
||||||
result.greenBits = 8;
|
result.greenBits = 8;
|
||||||
result.blueBits = 8;
|
result.blueBits = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
|
||||||
CFRelease(format);
|
CFRelease(format);
|
||||||
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,13 +143,7 @@ static CGDisplayFadeReservationToken beginFadeReservation(void)
|
||||||
CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;
|
CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;
|
||||||
|
|
||||||
if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)
|
if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)
|
||||||
{
|
CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);
|
||||||
CGDisplayFade(token, 0.3,
|
|
||||||
kCGDisplayBlendNormal,
|
|
||||||
kCGDisplayBlendSolidColor,
|
|
||||||
0.0, 0.0, 0.0,
|
|
||||||
TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
@ -211,199 +154,44 @@ static void endFadeReservation(CGDisplayFadeReservationToken token)
|
||||||
{
|
{
|
||||||
if (token != kCGDisplayFadeReservationInvalidToken)
|
if (token != kCGDisplayFadeReservationInvalidToken)
|
||||||
{
|
{
|
||||||
CGDisplayFade(token, 0.5,
|
CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
|
||||||
kCGDisplayBlendSolidColor,
|
|
||||||
kCGDisplayBlendNormal,
|
|
||||||
0.0, 0.0, 0.0,
|
|
||||||
FALSE);
|
|
||||||
CGReleaseDisplayFadeReservation(token);
|
CGReleaseDisplayFadeReservation(token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the display refresh rate queried from the I/O registry
|
|
||||||
//
|
|
||||||
static double getFallbackRefreshRate(CGDirectDisplayID displayID)
|
|
||||||
{
|
|
||||||
double refreshRate = 60.0;
|
|
||||||
|
|
||||||
io_iterator_t it;
|
|
||||||
io_service_t service;
|
|
||||||
|
|
||||||
if (IOServiceGetMatchingServices(MACH_PORT_NULL,
|
|
||||||
IOServiceMatching("IOFramebuffer"),
|
|
||||||
&it) != 0)
|
|
||||||
{
|
|
||||||
return refreshRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((service = IOIteratorNext(it)) != 0)
|
|
||||||
{
|
|
||||||
const CFNumberRef indexRef =
|
|
||||||
IORegistryEntryCreateCFProperty(service,
|
|
||||||
CFSTR("IOFramebufferOpenGLIndex"),
|
|
||||||
kCFAllocatorDefault,
|
|
||||||
kNilOptions);
|
|
||||||
if (!indexRef)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
uint32_t index = 0;
|
|
||||||
CFNumberGetValue(indexRef, kCFNumberIntType, &index);
|
|
||||||
CFRelease(indexRef);
|
|
||||||
|
|
||||||
if (CGOpenGLDisplayMaskToDisplayID(1 << index) != displayID)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const CFNumberRef clockRef =
|
|
||||||
IORegistryEntryCreateCFProperty(service,
|
|
||||||
CFSTR("IOFBCurrentPixelClock"),
|
|
||||||
kCFAllocatorDefault,
|
|
||||||
kNilOptions);
|
|
||||||
const CFNumberRef countRef =
|
|
||||||
IORegistryEntryCreateCFProperty(service,
|
|
||||||
CFSTR("IOFBCurrentPixelCount"),
|
|
||||||
kCFAllocatorDefault,
|
|
||||||
kNilOptions);
|
|
||||||
|
|
||||||
uint32_t clock = 0, count = 0;
|
|
||||||
|
|
||||||
if (clockRef)
|
|
||||||
{
|
|
||||||
CFNumberGetValue(clockRef, kCFNumberIntType, &clock);
|
|
||||||
CFRelease(clockRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (countRef)
|
|
||||||
{
|
|
||||||
CFNumberGetValue(countRef, kCFNumberIntType, &count);
|
|
||||||
CFRelease(countRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clock > 0 && count > 0)
|
|
||||||
refreshRate = clock / (double) count;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
IOObjectRelease(it);
|
|
||||||
return refreshRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Poll for changes in the set of connected monitors
|
|
||||||
//
|
|
||||||
void _glfwPollMonitorsCocoa(void)
|
|
||||||
{
|
|
||||||
uint32_t displayCount;
|
|
||||||
CGGetOnlineDisplayList(0, NULL, &displayCount);
|
|
||||||
CGDirectDisplayID* displays = _glfw_calloc(displayCount, sizeof(CGDirectDisplayID));
|
|
||||||
CGGetOnlineDisplayList(displayCount, displays, &displayCount);
|
|
||||||
|
|
||||||
for (int i = 0; i < _glfw.monitorCount; i++)
|
|
||||||
_glfw.monitors[i]->ns.screen = nil;
|
|
||||||
|
|
||||||
_GLFWmonitor** disconnected = NULL;
|
|
||||||
uint32_t disconnectedCount = _glfw.monitorCount;
|
|
||||||
if (disconnectedCount)
|
|
||||||
{
|
|
||||||
disconnected = _glfw_calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));
|
|
||||||
memcpy(disconnected,
|
|
||||||
_glfw.monitors,
|
|
||||||
_glfw.monitorCount * sizeof(_GLFWmonitor*));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < displayCount; i++)
|
|
||||||
{
|
|
||||||
if (CGDisplayIsAsleep(displays[i]))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const uint32_t unitNumber = CGDisplayUnitNumber(displays[i]);
|
|
||||||
NSScreen* screen = nil;
|
|
||||||
|
|
||||||
for (screen in [NSScreen screens])
|
|
||||||
{
|
|
||||||
NSNumber* screenNumber = [screen deviceDescription][@"NSScreenNumber"];
|
|
||||||
|
|
||||||
// HACK: Compare unit numbers instead of display IDs to work around
|
|
||||||
// display replacement on machines with automatic graphics
|
|
||||||
// switching
|
|
||||||
if (CGDisplayUnitNumber([screenNumber unsignedIntValue]) == unitNumber)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HACK: Compare unit numbers instead of display IDs to work around
|
|
||||||
// display replacement on machines with automatic graphics
|
|
||||||
// switching
|
|
||||||
uint32_t j;
|
|
||||||
for (j = 0; j < disconnectedCount; j++)
|
|
||||||
{
|
|
||||||
if (disconnected[j] && disconnected[j]->ns.unitNumber == unitNumber)
|
|
||||||
{
|
|
||||||
disconnected[j]->ns.screen = screen;
|
|
||||||
disconnected[j] = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j < disconnectedCount)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const CGSize size = CGDisplayScreenSize(displays[i]);
|
|
||||||
char* name = getMonitorName(displays[i], screen);
|
|
||||||
if (!name)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
_GLFWmonitor* monitor = _glfwAllocMonitor(name, size.width, size.height);
|
|
||||||
monitor->ns.displayID = displays[i];
|
|
||||||
monitor->ns.unitNumber = unitNumber;
|
|
||||||
monitor->ns.screen = screen;
|
|
||||||
|
|
||||||
_glfw_free(name);
|
|
||||||
|
|
||||||
CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displays[i]);
|
|
||||||
if (CGDisplayModeGetRefreshRate(mode) == 0.0)
|
|
||||||
monitor->ns.fallbackRefreshRate = getFallbackRefreshRate(displays[i]);
|
|
||||||
CGDisplayModeRelease(mode);
|
|
||||||
|
|
||||||
_glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < disconnectedCount; i++)
|
|
||||||
{
|
|
||||||
if (disconnected[i])
|
|
||||||
_glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw_free(disconnected);
|
|
||||||
_glfw_free(displays);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Change the current video mode
|
// Change the current video mode
|
||||||
//
|
//
|
||||||
void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired)
|
GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired)
|
||||||
{
|
{
|
||||||
GLFWvidmode current;
|
CFArrayRef modes;
|
||||||
_glfwGetVideoModeCocoa(monitor, ¤t);
|
CFIndex count, i;
|
||||||
|
CVDisplayLinkRef link;
|
||||||
const GLFWvidmode* best = _glfwChooseVideoMode(monitor, desired);
|
|
||||||
if (_glfwCompareVideoModes(¤t, best) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
CFArrayRef modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
|
||||||
const CFIndex count = CFArrayGetCount(modes);
|
|
||||||
CGDisplayModeRef native = NULL;
|
CGDisplayModeRef native = NULL;
|
||||||
|
GLFWvidmode current;
|
||||||
|
const GLFWvidmode* best;
|
||||||
|
|
||||||
for (CFIndex i = 0; i < count; i++)
|
best = _glfwChooseVideoMode(monitor, desired);
|
||||||
|
_glfwPlatformGetVideoMode(monitor, ¤t);
|
||||||
|
if (_glfwCompareVideoModes(¤t, best) == 0)
|
||||||
|
return GLFW_TRUE;
|
||||||
|
|
||||||
|
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||||
|
|
||||||
|
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||||
|
count = CFArrayGetCount(modes);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||||
if (!modeIsGood(dm))
|
if (!modeIsGood(dm))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const GLFWvidmode mode =
|
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||||
vidmodeFromCGDisplayMode(dm, monitor->ns.fallbackRefreshRate);
|
|
||||||
if (_glfwCompareVideoModes(best, &mode) == 0)
|
if (_glfwCompareVideoModes(best, &mode) == 0)
|
||||||
{
|
{
|
||||||
native = dm;
|
native = dm;
|
||||||
|
@ -422,11 +210,21 @@ void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired)
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(modes);
|
CFRelease(modes);
|
||||||
|
CVDisplayLinkRelease(link);
|
||||||
|
|
||||||
|
if (!native)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Cocoa: Monitor mode list changed");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore the previously saved (original) video mode
|
// Restore the previously saved (original) video mode
|
||||||
//
|
//
|
||||||
void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor)
|
void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor)
|
||||||
{
|
{
|
||||||
if (monitor->ns.previousMode)
|
if (monitor->ns.previousMode)
|
||||||
{
|
{
|
||||||
|
@ -445,91 +243,85 @@ void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor)
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void _glfwFreeMonitorCocoa(_GLFWmonitor* monitor)
|
_GLFWmonitor** _glfwPlatformGetMonitors(int* count)
|
||||||
{
|
{
|
||||||
|
uint32_t i, found = 0, displayCount;
|
||||||
|
_GLFWmonitor** monitors;
|
||||||
|
CGDirectDisplayID* displays;
|
||||||
|
|
||||||
|
*count = 0;
|
||||||
|
|
||||||
|
CGGetOnlineDisplayList(0, NULL, &displayCount);
|
||||||
|
displays = calloc(displayCount, sizeof(CGDirectDisplayID));
|
||||||
|
monitors = calloc(displayCount, sizeof(_GLFWmonitor*));
|
||||||
|
|
||||||
|
CGGetOnlineDisplayList(displayCount, displays, &displayCount);
|
||||||
|
|
||||||
|
for (i = 0; i < displayCount; i++)
|
||||||
|
{
|
||||||
|
_GLFWmonitor* monitor;
|
||||||
|
|
||||||
|
if (CGDisplayIsAsleep(displays[i]))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const CGSize size = CGDisplayScreenSize(displays[i]);
|
||||||
|
char* name = getDisplayName(displays[i]);
|
||||||
|
|
||||||
|
monitor = _glfwAllocMonitor(name, size.width, size.height);
|
||||||
|
monitor->ns.displayID = displays[i];
|
||||||
|
monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]);
|
||||||
|
|
||||||
|
free(name);
|
||||||
|
|
||||||
|
found++;
|
||||||
|
monitors[found - 1] = monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(displays);
|
||||||
|
|
||||||
|
*count = found;
|
||||||
|
return monitors;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwGetMonitorPosCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
// HACK: Compare unit numbers instead of display IDs to work around display
|
||||||
|
// replacement on machines with automatic graphics switching
|
||||||
|
return first->ns.unitNumber == second->ns.unitNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
||||||
|
{
|
||||||
const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);
|
const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);
|
||||||
|
|
||||||
if (xpos)
|
if (xpos)
|
||||||
*xpos = (int) bounds.origin.x;
|
*xpos = (int) bounds.origin.x;
|
||||||
if (ypos)
|
if (ypos)
|
||||||
*ypos = (int) bounds.origin.y;
|
*ypos = (int) bounds.origin.y;
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwGetMonitorContentScaleCocoa(_GLFWmonitor* monitor,
|
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)
|
||||||
float* xscale, float* yscale)
|
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
CFArrayRef modes;
|
||||||
|
CFIndex found, i, j;
|
||||||
if (!monitor->ns.screen)
|
GLFWvidmode* result;
|
||||||
{
|
CVDisplayLinkRef link;
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Cocoa: Cannot query content scale without screen");
|
|
||||||
}
|
|
||||||
|
|
||||||
const NSRect points = [monitor->ns.screen frame];
|
|
||||||
const NSRect pixels = [monitor->ns.screen convertRectToBacking:points];
|
|
||||||
|
|
||||||
if (xscale)
|
|
||||||
*xscale = (float) (pixels.size.width / points.size.width);
|
|
||||||
if (yscale)
|
|
||||||
*yscale = (float) (pixels.size.height / points.size.height);
|
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwGetMonitorWorkareaCocoa(_GLFWmonitor* monitor,
|
|
||||||
int* xpos, int* ypos,
|
|
||||||
int* width, int* height)
|
|
||||||
{
|
|
||||||
@autoreleasepool {
|
|
||||||
|
|
||||||
if (!monitor->ns.screen)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Cocoa: Cannot query workarea without screen");
|
|
||||||
}
|
|
||||||
|
|
||||||
const NSRect frameRect = [monitor->ns.screen visibleFrame];
|
|
||||||
|
|
||||||
if (xpos)
|
|
||||||
*xpos = frameRect.origin.x;
|
|
||||||
if (ypos)
|
|
||||||
*ypos = _glfwTransformYCocoa(frameRect.origin.y + frameRect.size.height - 1);
|
|
||||||
if (width)
|
|
||||||
*width = frameRect.size.width;
|
|
||||||
if (height)
|
|
||||||
*height = frameRect.size.height;
|
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
|
||||||
|
|
||||||
GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count)
|
|
||||||
{
|
|
||||||
@autoreleasepool {
|
|
||||||
|
|
||||||
*count = 0;
|
*count = 0;
|
||||||
|
|
||||||
CFArrayRef modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||||
const CFIndex found = CFArrayGetCount(modes);
|
|
||||||
GLFWvidmode* result = _glfw_calloc(found, sizeof(GLFWvidmode));
|
|
||||||
|
|
||||||
for (CFIndex i = 0; i < found; i++)
|
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||||
|
found = CFArrayGetCount(modes);
|
||||||
|
result = calloc(found, sizeof(GLFWvidmode));
|
||||||
|
|
||||||
|
for (i = 0; i < found; i++)
|
||||||
{
|
{
|
||||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||||
if (!modeIsGood(dm))
|
if (!modeIsGood(dm))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const GLFWvidmode mode =
|
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||||
vidmodeFromCGDisplayMode(dm, monitor->ns.fallbackRefreshRate);
|
|
||||||
CFIndex j;
|
|
||||||
|
|
||||||
for (j = 0; j < *count; j++)
|
for (j = 0; j < *count; j++)
|
||||||
{
|
{
|
||||||
|
@ -538,7 +330,7 @@ GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip duplicate modes
|
// Skip duplicate modes
|
||||||
if (j < *count)
|
if (i < *count)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
(*count)++;
|
(*count)++;
|
||||||
|
@ -546,28 +338,28 @@ GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count)
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(modes);
|
CFRelease(modes);
|
||||||
|
CVDisplayLinkRelease(link);
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwGetVideoModeCocoa(_GLFWmonitor* monitor, GLFWvidmode *mode)
|
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
CGDisplayModeRef displayMode;
|
||||||
|
CVDisplayLinkRef link;
|
||||||
|
|
||||||
CGDisplayModeRef native = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||||
*mode = vidmodeFromCGDisplayMode(native, monitor->ns.fallbackRefreshRate);
|
|
||||||
CGDisplayModeRelease(native);
|
|
||||||
|
|
||||||
} // autoreleasepool
|
displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
||||||
|
*mode = vidmodeFromCGDisplayMode(displayMode, link);
|
||||||
|
CGDisplayModeRelease(displayMode);
|
||||||
|
|
||||||
|
CVDisplayLinkRelease(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWbool _glfwGetGammaRampCocoa(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);
|
||||||
|
CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));
|
||||||
uint32_t size = CGDisplayGammaTableCapacity(monitor->ns.displayID);
|
|
||||||
CGGammaValue* values = _glfw_calloc(size * 3, sizeof(CGGammaValue));
|
|
||||||
|
|
||||||
CGGetDisplayTransferByTable(monitor->ns.displayID,
|
CGGetDisplayTransferByTable(monitor->ns.displayID,
|
||||||
size,
|
size,
|
||||||
|
@ -578,26 +370,22 @@ GLFWbool _glfwGetGammaRampCocoa(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||||
|
|
||||||
_glfwAllocGammaArrays(ramp, size);
|
_glfwAllocGammaArrays(ramp, size);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < size; i++)
|
for (i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
ramp->red[i] = (unsigned short) (values[i] * 65535);
|
ramp->red[i] = (unsigned short) (values[i] * 65535);
|
||||||
ramp->green[i] = (unsigned short) (values[i + size] * 65535);
|
ramp->green[i] = (unsigned short) (values[i + size] * 65535);
|
||||||
ramp->blue[i] = (unsigned short) (values[i + size * 2] * 65535);
|
ramp->blue[i] = (unsigned short) (values[i + size * 2] * 65535);
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfw_free(values);
|
free(values);
|
||||||
return GLFW_TRUE;
|
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
int i;
|
||||||
|
CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));
|
||||||
|
|
||||||
CGGammaValue* values = _glfw_calloc(ramp->size * 3, sizeof(CGGammaValue));
|
for (i = 0; i < ramp->size; i++)
|
||||||
|
|
||||||
for (unsigned int i = 0; i < ramp->size; i++)
|
|
||||||
{
|
{
|
||||||
values[i] = ramp->red[i] / 65535.f;
|
values[i] = ramp->red[i] / 65535.f;
|
||||||
values[i + ramp->size] = ramp->green[i] / 65535.f;
|
values[i + ramp->size] = ramp->green[i] / 65535.f;
|
||||||
|
@ -610,9 +398,7 @@ void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
||||||
values + ramp->size,
|
values + ramp->size,
|
||||||
values + ramp->size * 2);
|
values + ramp->size * 2);
|
||||||
|
|
||||||
_glfw_free(values);
|
free(values);
|
||||||
|
|
||||||
} // autoreleasepool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -627,5 +413,3 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
||||||
return monitor->ns.displayID;
|
return monitor->ns.displayID;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_COCOA
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.2 OS X - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -24,92 +24,41 @@
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _glfw3_cocoa_platform_h_
|
||||||
|
#define _glfw3_cocoa_platform_h_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <Carbon/Carbon.h>
|
|
||||||
#include <IOKit/hid/IOHIDLib.h>
|
|
||||||
|
|
||||||
// NOTE: All of NSGL was deprecated in the 10.14 SDK
|
|
||||||
// This disables the pointless warnings for every symbol we use
|
|
||||||
#ifndef GL_SILENCE_DEPRECATION
|
|
||||||
#define GL_SILENCE_DEPRECATION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__OBJC__)
|
#if defined(__OBJC__)
|
||||||
|
#import <Carbon/Carbon.h>
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#else
|
#else
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
typedef void* id;
|
typedef void* id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// NOTE: Many Cocoa enum values have been renamed and we need to build across
|
#include "posix_tls.h"
|
||||||
// SDK versions where one is unavailable or deprecated.
|
#include "cocoa_joystick.h"
|
||||||
// We use the newer names in code and replace them with the older names if
|
#include "nsgl_context.h"
|
||||||
// the base SDK does not provide the newer names.
|
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101400
|
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
||||||
#define NSOpenGLContextParameterSwapInterval NSOpenGLCPSwapInterval
|
#define _glfw_dlclose(handle) dlclose(handle)
|
||||||
#define NSOpenGLContextParameterSurfaceOpacity NSOpenGLCPSurfaceOpacity
|
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101200
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS ns
|
||||||
#define NSBitmapFormatAlphaNonpremultiplied NSAlphaNonpremultipliedBitmapFormat
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns
|
||||||
#define NSEventMaskAny NSAnyEventMask
|
#define _GLFW_PLATFORM_LIBRARY_TIME_STATE _GLFWtimeNS ns_time
|
||||||
#define NSEventMaskKeyUp NSKeyUpMask
|
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNS ns
|
||||||
#define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask
|
#define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorNS ns
|
||||||
#define NSEventModifierFlagCommand NSCommandKeyMask
|
|
||||||
#define NSEventModifierFlagControl NSControlKeyMask
|
|
||||||
#define NSEventModifierFlagDeviceIndependentFlagsMask NSDeviceIndependentModifierFlagsMask
|
|
||||||
#define NSEventModifierFlagOption NSAlternateKeyMask
|
|
||||||
#define NSEventModifierFlagShift NSShiftKeyMask
|
|
||||||
#define NSEventTypeApplicationDefined NSApplicationDefined
|
|
||||||
#define NSWindowStyleMaskBorderless NSBorderlessWindowMask
|
|
||||||
#define NSWindowStyleMaskClosable NSClosableWindowMask
|
|
||||||
#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask
|
|
||||||
#define NSWindowStyleMaskResizable NSResizableWindowMask
|
|
||||||
#define NSWindowStyleMaskTitled NSTitledWindowMask
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// NOTE: Many Cocoa dynamically linked constants have been renamed and we need
|
#define _GLFW_EGL_CONTEXT_STATE
|
||||||
// to build across SDK versions where one is unavailable or deprecated.
|
#define _GLFW_EGL_LIBRARY_CONTEXT_STATE
|
||||||
// We use the newer names in code and replace them with the older names if
|
|
||||||
// the deployment target is older than the newer names.
|
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 101300
|
|
||||||
#define NSPasteboardTypeURL NSURLPboardType
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
|
|
||||||
typedef VkFlags VkMetalSurfaceCreateFlagsEXT;
|
|
||||||
|
|
||||||
typedef struct VkMacOSSurfaceCreateInfoMVK
|
|
||||||
{
|
|
||||||
VkStructureType sType;
|
|
||||||
const void* pNext;
|
|
||||||
VkMacOSSurfaceCreateFlagsMVK flags;
|
|
||||||
const void* pView;
|
|
||||||
} VkMacOSSurfaceCreateInfoMVK;
|
|
||||||
|
|
||||||
typedef struct VkMetalSurfaceCreateInfoEXT
|
|
||||||
{
|
|
||||||
VkStructureType sType;
|
|
||||||
const void* pNext;
|
|
||||||
VkMetalSurfaceCreateFlagsEXT flags;
|
|
||||||
const void* pLayer;
|
|
||||||
} VkMetalSurfaceCreateInfoEXT;
|
|
||||||
|
|
||||||
typedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
|
||||||
typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMetalSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
|
||||||
|
|
||||||
#define GLFW_COCOA_WINDOW_STATE _GLFWwindowNS ns;
|
|
||||||
#define GLFW_COCOA_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns;
|
|
||||||
#define GLFW_COCOA_MONITOR_STATE _GLFWmonitorNS ns;
|
|
||||||
#define GLFW_COCOA_CURSOR_STATE _GLFWcursorNS ns;
|
|
||||||
|
|
||||||
#define GLFW_NSGL_CONTEXT_STATE _GLFWcontextNSGL nsgl;
|
|
||||||
#define GLFW_NSGL_LIBRARY_CONTEXT_STATE _GLFWlibraryNSGL nsgl;
|
|
||||||
|
|
||||||
// HIToolbox.framework pointer typedefs
|
// HIToolbox.framework pointer typedefs
|
||||||
#define kTISPropertyUnicodeKeyLayoutData _glfw.ns.tis.kPropertyUnicodeKeyLayoutData
|
#define kTISPropertyUnicodeKeyLayoutData _glfw.ns.tis.kPropertyUnicodeKeyLayoutData
|
||||||
|
#define kTISNotifySelectedKeyboardInputSourceChanged _glfw.ns.tis.kNotifySelectedKeyboardInputSourceChanged
|
||||||
typedef TISInputSourceRef (*PFN_TISCopyCurrentKeyboardLayoutInputSource)(void);
|
typedef TISInputSourceRef (*PFN_TISCopyCurrentKeyboardLayoutInputSource)(void);
|
||||||
#define TISCopyCurrentKeyboardLayoutInputSource _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource
|
#define TISCopyCurrentKeyboardLayoutInputSource _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource
|
||||||
typedef void* (*PFN_TISGetInputSourceProperty)(TISInputSourceRef,CFStringRef);
|
typedef void* (*PFN_TISGetInputSourceProperty)(TISInputSourceRef,CFStringRef);
|
||||||
|
@ -118,22 +67,6 @@ typedef UInt8 (*PFN_LMGetKbdType)(void);
|
||||||
#define LMGetKbdType _glfw.ns.tis.GetKbdType
|
#define LMGetKbdType _glfw.ns.tis.GetKbdType
|
||||||
|
|
||||||
|
|
||||||
// NSGL-specific per-context data
|
|
||||||
//
|
|
||||||
typedef struct _GLFWcontextNSGL
|
|
||||||
{
|
|
||||||
id pixelFormat;
|
|
||||||
id object;
|
|
||||||
} _GLFWcontextNSGL;
|
|
||||||
|
|
||||||
// NSGL-specific global data
|
|
||||||
//
|
|
||||||
typedef struct _GLFWlibraryNSGL
|
|
||||||
{
|
|
||||||
// dlopen handle for OpenGL.framework (for glfwGetProcAddress)
|
|
||||||
CFBundleRef framework;
|
|
||||||
} _GLFWlibraryNSGL;
|
|
||||||
|
|
||||||
// Cocoa-specific per-window data
|
// Cocoa-specific per-window data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWwindowNS
|
typedef struct _GLFWwindowNS
|
||||||
|
@ -141,42 +74,31 @@ typedef struct _GLFWwindowNS
|
||||||
id object;
|
id object;
|
||||||
id delegate;
|
id delegate;
|
||||||
id view;
|
id view;
|
||||||
id layer;
|
|
||||||
|
|
||||||
GLFWbool maximized;
|
|
||||||
GLFWbool occluded;
|
|
||||||
GLFWbool retina;
|
|
||||||
|
|
||||||
// Cached window properties to filter out duplicate events
|
|
||||||
int width, height;
|
|
||||||
int fbWidth, fbHeight;
|
|
||||||
float xscale, yscale;
|
|
||||||
|
|
||||||
// The total sum of the distances the cursor has been warped
|
// The total sum of the distances the cursor has been warped
|
||||||
// since the last cursor motion event was processed
|
// since the last cursor motion event was processed
|
||||||
// This is kept to counteract Cocoa doing the same internally
|
// This is kept to counteract Cocoa doing the same internally
|
||||||
double cursorWarpDeltaX, cursorWarpDeltaY;
|
double cursorWarpDeltaX, cursorWarpDeltaY;
|
||||||
|
|
||||||
} _GLFWwindowNS;
|
} _GLFWwindowNS;
|
||||||
|
|
||||||
|
|
||||||
// Cocoa-specific global data
|
// Cocoa-specific global data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWlibraryNS
|
typedef struct _GLFWlibraryNS
|
||||||
{
|
{
|
||||||
CGEventSourceRef eventSource;
|
CGEventSourceRef eventSource;
|
||||||
id delegate;
|
id delegate;
|
||||||
GLFWbool cursorHidden;
|
id autoreleasePool;
|
||||||
|
id cursor;
|
||||||
TISInputSourceRef inputSource;
|
TISInputSourceRef inputSource;
|
||||||
IOHIDManagerRef hidManager;
|
|
||||||
id unicodeData;
|
id unicodeData;
|
||||||
id helper;
|
id listener;
|
||||||
id keyUpMonitor;
|
|
||||||
id nibObjects;
|
|
||||||
|
|
||||||
char keynames[GLFW_KEY_LAST + 1][17];
|
char keyName[64];
|
||||||
short int keycodes[256];
|
short int publicKeys[256];
|
||||||
short int scancodes[GLFW_KEY_LAST + 1];
|
short int nativeKeys[GLFW_KEY_LAST + 1];
|
||||||
char* clipboardString;
|
char* clipboardString;
|
||||||
CGPoint cascadePoint;
|
|
||||||
// Where to place the cursor when re-enabled
|
// Where to place the cursor when re-enabled
|
||||||
double restoreCursorPosX, restoreCursorPosY;
|
double restoreCursorPosX, restoreCursorPosY;
|
||||||
// The window whose disabled cursor mode is active
|
// The window whose disabled cursor mode is active
|
||||||
|
@ -188,9 +110,12 @@ typedef struct _GLFWlibraryNS
|
||||||
PFN_TISGetInputSourceProperty GetInputSourceProperty;
|
PFN_TISGetInputSourceProperty GetInputSourceProperty;
|
||||||
PFN_LMGetKbdType GetKbdType;
|
PFN_LMGetKbdType GetKbdType;
|
||||||
CFStringRef kPropertyUnicodeKeyLayoutData;
|
CFStringRef kPropertyUnicodeKeyLayoutData;
|
||||||
|
CFStringRef kNotifySelectedKeyboardInputSourceChanged;
|
||||||
} tis;
|
} tis;
|
||||||
|
|
||||||
} _GLFWlibraryNS;
|
} _GLFWlibraryNS;
|
||||||
|
|
||||||
|
|
||||||
// Cocoa-specific per-monitor data
|
// Cocoa-specific per-monitor data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWmonitorNS
|
typedef struct _GLFWmonitorNS
|
||||||
|
@ -198,105 +123,31 @@ typedef struct _GLFWmonitorNS
|
||||||
CGDirectDisplayID displayID;
|
CGDirectDisplayID displayID;
|
||||||
CGDisplayModeRef previousMode;
|
CGDisplayModeRef previousMode;
|
||||||
uint32_t unitNumber;
|
uint32_t unitNumber;
|
||||||
id screen;
|
|
||||||
double fallbackRefreshRate;
|
|
||||||
} _GLFWmonitorNS;
|
} _GLFWmonitorNS;
|
||||||
|
|
||||||
|
|
||||||
// Cocoa-specific per-cursor data
|
// Cocoa-specific per-cursor data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWcursorNS
|
typedef struct _GLFWcursorNS
|
||||||
{
|
{
|
||||||
id object;
|
id object;
|
||||||
|
|
||||||
} _GLFWcursorNS;
|
} _GLFWcursorNS;
|
||||||
|
|
||||||
|
|
||||||
GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform);
|
// Cocoa-specific global timer data
|
||||||
int _glfwInitCocoa(void);
|
//
|
||||||
void _glfwTerminateCocoa(void);
|
typedef struct _GLFWtimeNS
|
||||||
|
{
|
||||||
|
uint64_t frequency;
|
||||||
|
|
||||||
GLFWbool _glfwCreateWindowCocoa(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);
|
} _GLFWtimeNS;
|
||||||
void _glfwDestroyWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwSetWindowTitleCocoa(_GLFWwindow* window, const char* title);
|
|
||||||
void _glfwSetWindowIconCocoa(_GLFWwindow* window, int count, const GLFWimage* images);
|
|
||||||
void _glfwGetWindowPosCocoa(_GLFWwindow* window, int* xpos, int* ypos);
|
|
||||||
void _glfwSetWindowPosCocoa(_GLFWwindow* window, int xpos, int ypos);
|
|
||||||
void _glfwGetWindowSizeCocoa(_GLFWwindow* window, int* width, int* height);
|
|
||||||
void _glfwSetWindowSizeCocoa(_GLFWwindow* window, int width, int height);
|
|
||||||
void _glfwSetWindowSizeLimitsCocoa(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
|
||||||
void _glfwSetWindowAspectRatioCocoa(_GLFWwindow* window, int numer, int denom);
|
|
||||||
void _glfwGetFramebufferSizeCocoa(_GLFWwindow* window, int* width, int* height);
|
|
||||||
void _glfwGetWindowFrameSizeCocoa(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);
|
|
||||||
void _glfwGetWindowContentScaleCocoa(_GLFWwindow* window, float* xscale, float* yscale);
|
|
||||||
void _glfwIconifyWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwRestoreWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwMaximizeWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwShowWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwHideWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwRequestWindowAttentionCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwFocusWindowCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwSetWindowMonitorCocoa(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
|
|
||||||
GLFWbool _glfwWindowFocusedCocoa(_GLFWwindow* window);
|
|
||||||
GLFWbool _glfwWindowIconifiedCocoa(_GLFWwindow* window);
|
|
||||||
GLFWbool _glfwWindowVisibleCocoa(_GLFWwindow* window);
|
|
||||||
GLFWbool _glfwWindowMaximizedCocoa(_GLFWwindow* window);
|
|
||||||
GLFWbool _glfwWindowHoveredCocoa(_GLFWwindow* window);
|
|
||||||
GLFWbool _glfwFramebufferTransparentCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwSetWindowResizableCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
||||||
void _glfwSetWindowDecoratedCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
||||||
void _glfwSetWindowFloatingCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
||||||
float _glfwGetWindowOpacityCocoa(_GLFWwindow* window);
|
|
||||||
void _glfwSetWindowOpacityCocoa(_GLFWwindow* window, float opacity);
|
|
||||||
void _glfwSetWindowMousePassthroughCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
||||||
|
|
||||||
void _glfwSetRawMouseMotionCocoa(_GLFWwindow *window, GLFWbool enabled);
|
|
||||||
GLFWbool _glfwRawMouseMotionSupportedCocoa(void);
|
|
||||||
|
|
||||||
void _glfwPollEventsCocoa(void);
|
void _glfwInitTimerNS(void);
|
||||||
void _glfwWaitEventsCocoa(void);
|
|
||||||
void _glfwWaitEventsTimeoutCocoa(double timeout);
|
|
||||||
void _glfwPostEmptyEventCocoa(void);
|
|
||||||
|
|
||||||
void _glfwGetCursorPosCocoa(_GLFWwindow* window, double* xpos, double* ypos);
|
GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
||||||
void _glfwSetCursorPosCocoa(_GLFWwindow* window, double xpos, double ypos);
|
void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor);
|
||||||
void _glfwSetCursorModeCocoa(_GLFWwindow* window, int mode);
|
|
||||||
const char* _glfwGetScancodeNameCocoa(int scancode);
|
|
||||||
int _glfwGetKeyScancodeCocoa(int key);
|
|
||||||
GLFWbool _glfwCreateCursorCocoa(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);
|
|
||||||
GLFWbool _glfwCreateStandardCursorCocoa(_GLFWcursor* cursor, int shape);
|
|
||||||
void _glfwDestroyCursorCocoa(_GLFWcursor* cursor);
|
|
||||||
void _glfwSetCursorCocoa(_GLFWwindow* window, _GLFWcursor* cursor);
|
|
||||||
void _glfwSetClipboardStringCocoa(const char* string);
|
|
||||||
const char* _glfwGetClipboardStringCocoa(void);
|
|
||||||
|
|
||||||
EGLenum _glfwGetEGLPlatformCocoa(EGLint** attribs);
|
|
||||||
EGLNativeDisplayType _glfwGetEGLNativeDisplayCocoa(void);
|
|
||||||
EGLNativeWindowType _glfwGetEGLNativeWindowCocoa(_GLFWwindow* window);
|
|
||||||
|
|
||||||
void _glfwGetRequiredInstanceExtensionsCocoa(char** extensions);
|
|
||||||
GLFWbool _glfwGetPhysicalDevicePresentationSupportCocoa(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);
|
|
||||||
VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
|
|
||||||
|
|
||||||
void _glfwFreeMonitorCocoa(_GLFWmonitor* monitor);
|
|
||||||
void _glfwGetMonitorPosCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos);
|
|
||||||
void _glfwGetMonitorContentScaleCocoa(_GLFWmonitor* monitor, float* xscale, float* yscale);
|
|
||||||
void _glfwGetMonitorWorkareaCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);
|
|
||||||
GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count);
|
|
||||||
void _glfwGetVideoModeCocoa(_GLFWmonitor* monitor, GLFWvidmode* mode);
|
|
||||||
GLFWbool _glfwGetGammaRampCocoa(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
|
|
||||||
void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
|
|
||||||
|
|
||||||
void _glfwPollMonitorsCocoa(void);
|
|
||||||
void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
|
||||||
void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor);
|
|
||||||
|
|
||||||
float _glfwTransformYCocoa(float y);
|
|
||||||
|
|
||||||
void* _glfwLoadLocalVulkanLoaderCocoa(void);
|
|
||||||
|
|
||||||
GLFWbool _glfwInitNSGL(void);
|
|
||||||
void _glfwTerminateNSGL(void);
|
|
||||||
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|
||||||
const _GLFWctxconfig* ctxconfig,
|
|
||||||
const _GLFWfbconfig* fbconfig);
|
|
||||||
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
|
||||||
|
|
||||||
|
#endif // _glfw3_cocoa_platform_h_
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.2 OS X - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -23,28 +23,31 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// It is fine to use C99 in this file because it will not be built with VS
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(GLFW_BUILD_COCOA_TIMER)
|
|
||||||
|
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void _glfwPlatformInitTimer(void)
|
// Initialise timer
|
||||||
|
//
|
||||||
|
void _glfwInitTimerNS(void)
|
||||||
{
|
{
|
||||||
mach_timebase_info_data_t info;
|
mach_timebase_info_data_t info;
|
||||||
mach_timebase_info(&info);
|
mach_timebase_info(&info);
|
||||||
|
|
||||||
_glfw.timer.ns.frequency = (info.denom * 1e9) / info.numer;
|
_glfw.ns_time.frequency = (info.denom * 1e9) / info.numer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
////// GLFW platform API //////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerValue(void)
|
uint64_t _glfwPlatformGetTimerValue(void)
|
||||||
{
|
{
|
||||||
return mach_absolute_time();
|
return mach_absolute_time();
|
||||||
|
@ -52,8 +55,6 @@ uint64_t _glfwPlatformGetTimerValue(void)
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerFrequency(void)
|
uint64_t _glfwPlatformGetTimerFrequency(void)
|
||||||
{
|
{
|
||||||
return _glfw.timer.ns.frequency;
|
return _glfw.ns_time.frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // GLFW_BUILD_COCOA_TIMER
|
|
||||||
|
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
//========================================================================
|
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// Copyright (c) 2009-2021 Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#define GLFW_COCOA_LIBRARY_TIMER_STATE _GLFWtimerNS ns;
|
|
||||||
|
|
||||||
// Cocoa-specific global timer data
|
|
||||||
//
|
|
||||||
typedef struct _GLFWtimerNS
|
|
||||||
{
|
|
||||||
uint64_t frequency;
|
|
||||||
} _GLFWtimerNS;
|
|
||||||
|
|
1544
src/cocoa_window.m
1544
src/cocoa_window.m
File diff suppressed because it is too large
Load Diff
243
src/context.c
243
src/context.c
|
@ -1,8 +1,8 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.2 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -24,8 +24,6 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Please use C89 style variable declarations in this file because VS 2010
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
@ -36,24 +34,67 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Parses the client API version string and extracts the version number
|
||||||
|
//
|
||||||
|
static GLFWbool parseVersionString(int* api, int* major, int* minor, int* rev)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
_GLFWwindow* window;
|
||||||
|
const char* version;
|
||||||
|
const char* prefixes[] =
|
||||||
|
{
|
||||||
|
"OpenGL ES-CM ",
|
||||||
|
"OpenGL ES-CL ",
|
||||||
|
"OpenGL ES ",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
*api = GLFW_OPENGL_API;
|
||||||
|
|
||||||
|
window = _glfwPlatformGetCurrentContext();
|
||||||
|
|
||||||
|
version = (const char*) window->context.GetString(GL_VERSION);
|
||||||
|
if (!version)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Client API version string retrieval is broken");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; prefixes[i]; i++)
|
||||||
|
{
|
||||||
|
const size_t length = strlen(prefixes[i]);
|
||||||
|
|
||||||
|
if (strncmp(version, prefixes[i], length) == 0)
|
||||||
|
{
|
||||||
|
version += length;
|
||||||
|
*api = GLFW_OPENGL_ES_API;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sscanf(version, "%d.%d.%d", major, minor, rev))
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"No version found in client API version string");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Checks whether the desired context attributes are valid
|
|
||||||
//
|
|
||||||
// This function checks things like whether the specified client API version
|
|
||||||
// exists and whether all relevant options have supported and non-conflicting
|
|
||||||
// values
|
|
||||||
//
|
|
||||||
GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
{
|
{
|
||||||
if (ctxconfig->source != GLFW_NATIVE_CONTEXT_API &&
|
if (ctxconfig->source != GLFW_NATIVE_CONTEXT_API &&
|
||||||
ctxconfig->source != GLFW_EGL_CONTEXT_API &&
|
ctxconfig->source != GLFW_EGL_CONTEXT_API)
|
||||||
ctxconfig->source != GLFW_OSMESA_CONTEXT_API)
|
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
_glfwInputError(GLFW_INVALID_ENUM,
|
||||||
"Invalid context creation API 0x%08X",
|
"Invalid context creation API %i",
|
||||||
ctxconfig->source);
|
ctxconfig->source);
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -63,28 +104,11 @@ GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
ctxconfig->client != GLFW_OPENGL_ES_API)
|
ctxconfig->client != GLFW_OPENGL_ES_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
_glfwInputError(GLFW_INVALID_ENUM,
|
||||||
"Invalid client API 0x%08X",
|
"Invalid client API %i",
|
||||||
ctxconfig->client);
|
ctxconfig->client);
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctxconfig->share)
|
|
||||||
{
|
|
||||||
if (ctxconfig->client == GLFW_NO_API ||
|
|
||||||
ctxconfig->share->context.client == GLFW_NO_API)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctxconfig->source != ctxconfig->share->context.source)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
|
||||||
"Context creation APIs do not match between contexts");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_API)
|
if (ctxconfig->client == GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
if ((ctxconfig->major < 1 || ctxconfig->minor < 0) ||
|
if ((ctxconfig->major < 1 || ctxconfig->minor < 0) ||
|
||||||
|
@ -110,7 +134,7 @@ GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
ctxconfig->profile != GLFW_OPENGL_COMPAT_PROFILE)
|
ctxconfig->profile != GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
_glfwInputError(GLFW_INVALID_ENUM,
|
||||||
"Invalid OpenGL profile 0x%08X",
|
"Invalid OpenGL profile %i",
|
||||||
ctxconfig->profile);
|
ctxconfig->profile);
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -159,7 +183,7 @@ GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
ctxconfig->robustness != GLFW_LOSE_CONTEXT_ON_RESET)
|
ctxconfig->robustness != GLFW_LOSE_CONTEXT_ON_RESET)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
_glfwInputError(GLFW_INVALID_ENUM,
|
||||||
"Invalid context robustness mode 0x%08X",
|
"Invalid context robustness mode %i",
|
||||||
ctxconfig->robustness);
|
ctxconfig->robustness);
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +195,7 @@ GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
ctxconfig->release != GLFW_RELEASE_BEHAVIOR_FLUSH)
|
ctxconfig->release != GLFW_RELEASE_BEHAVIOR_FLUSH)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM,
|
_glfwInputError(GLFW_INVALID_ENUM,
|
||||||
"Invalid context release behavior 0x%08X",
|
"Invalid context release behavior %i",
|
||||||
ctxconfig->release);
|
ctxconfig->release);
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -180,8 +204,6 @@ GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Chooses the framebuffer config that best matches the desired one
|
|
||||||
//
|
|
||||||
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
const _GLFWfbconfig* alternatives,
|
const _GLFWfbconfig* alternatives,
|
||||||
unsigned int count)
|
unsigned int count)
|
||||||
|
@ -203,6 +225,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (desired->doublebuffer != current->doublebuffer)
|
||||||
|
{
|
||||||
|
// Double buffering is a hard constraint
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Count number of missing buffers
|
// Count number of missing buffers
|
||||||
{
|
{
|
||||||
missing = 0;
|
missing = 0;
|
||||||
|
@ -229,9 +257,6 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
// not important to us here, so we count them as one
|
// not important to us here, so we count them as one
|
||||||
missing++;
|
missing++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desired->transparent != current->transparent)
|
|
||||||
missing++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// These polynomials make many small channel size differences matter
|
// These polynomials make many small channel size differences matter
|
||||||
|
@ -342,88 +367,29 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
||||||
return closest;
|
return closest;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieves the attributes of the current context
|
GLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig)
|
||||||
//
|
|
||||||
GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
|
||||||
const _GLFWctxconfig* ctxconfig)
|
|
||||||
{
|
{
|
||||||
int i;
|
_GLFWwindow* window = _glfwPlatformGetCurrentContext();
|
||||||
_GLFWwindow* previous;
|
|
||||||
const char* version;
|
|
||||||
const char* prefixes[] =
|
|
||||||
{
|
|
||||||
"OpenGL ES-CM ",
|
|
||||||
"OpenGL ES-CL ",
|
|
||||||
"OpenGL ES ",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
window->context.source = ctxconfig->source;
|
|
||||||
window->context.client = GLFW_OPENGL_API;
|
|
||||||
|
|
||||||
previous = _glfwPlatformGetTls(&_glfw.contextSlot);
|
|
||||||
glfwMakeContextCurrent((GLFWwindow*) window);
|
|
||||||
|
|
||||||
window->context.GetIntegerv = (PFNGLGETINTEGERVPROC)
|
window->context.GetIntegerv = (PFNGLGETINTEGERVPROC)
|
||||||
window->context.getProcAddress("glGetIntegerv");
|
glfwGetProcAddress("glGetIntegerv");
|
||||||
window->context.GetString = (PFNGLGETSTRINGPROC)
|
window->context.GetString = (PFNGLGETSTRINGPROC)
|
||||||
window->context.getProcAddress("glGetString");
|
glfwGetProcAddress("glGetString");
|
||||||
if (!window->context.GetIntegerv || !window->context.GetString)
|
if (!window->context.GetIntegerv || !window->context.GetString)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken");
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
version = (const char*) window->context.GetString(GL_VERSION);
|
if (!parseVersionString(&window->context.client,
|
||||||
if (!version)
|
&window->context.major,
|
||||||
|
&window->context.minor,
|
||||||
|
&window->context.revision))
|
||||||
{
|
{
|
||||||
if (ctxconfig->client == GLFW_OPENGL_API)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"OpenGL version string retrieval is broken");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"OpenGL ES version string retrieval is broken");
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; prefixes[i]; i++)
|
window->context.source = ctxconfig->source;
|
||||||
{
|
|
||||||
const size_t length = strlen(prefixes[i]);
|
|
||||||
|
|
||||||
if (strncmp(version, prefixes[i], length) == 0)
|
|
||||||
{
|
|
||||||
version += length;
|
|
||||||
window->context.client = GLFW_OPENGL_ES_API;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sscanf(version, "%d.%d.%d",
|
|
||||||
&window->context.major,
|
|
||||||
&window->context.minor,
|
|
||||||
&window->context.revision))
|
|
||||||
{
|
|
||||||
if (window->context.client == GLFW_OPENGL_API)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"No version found in OpenGL version string");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"No version found in OpenGL ES version string");
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->context.major < ctxconfig->major ||
|
if (window->context.major < ctxconfig->major ||
|
||||||
(window->context.major == ctxconfig->major &&
|
(window->context.major == ctxconfig->major &&
|
||||||
|
@ -436,22 +402,10 @@ GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
||||||
// For API consistency, we emulate the behavior of the
|
// For API consistency, we emulate the behavior of the
|
||||||
// {GLX|WGL}_ARB_create_context extension and fail here
|
// {GLX|WGL}_ARB_create_context extension and fail here
|
||||||
|
|
||||||
if (window->context.client == GLFW_OPENGL_API)
|
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
||||||
{
|
"Requested client API version %i.%i, got version %i.%i",
|
||||||
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
ctxconfig->major, ctxconfig->minor,
|
||||||
"Requested OpenGL version %i.%i, got version %i.%i",
|
window->context.major, window->context.minor);
|
||||||
ctxconfig->major, ctxconfig->minor,
|
|
||||||
window->context.major, window->context.minor);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
|
||||||
"Requested OpenGL ES version %i.%i, got version %i.%i",
|
|
||||||
ctxconfig->major, ctxconfig->minor,
|
|
||||||
window->context.major, window->context.minor);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,12 +416,11 @@ GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
||||||
// users as early as possible that their build may be broken
|
// users as early as possible that their build may be broken
|
||||||
|
|
||||||
window->context.GetStringi = (PFNGLGETSTRINGIPROC)
|
window->context.GetStringi = (PFNGLGETSTRINGIPROC)
|
||||||
window->context.getProcAddress("glGetStringi");
|
glfwGetProcAddress("glGetStringi");
|
||||||
if (!window->context.GetStringi)
|
if (!window->context.GetStringi)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Entry point retrieval is broken");
|
"Entry point retrieval is broken");
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -568,20 +521,14 @@ GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
||||||
// Clearing the front buffer to black to avoid garbage pixels left over from
|
// Clearing the front buffer to black to avoid garbage pixels left over from
|
||||||
// previous uses of our bit of VRAM
|
// previous uses of our bit of VRAM
|
||||||
{
|
{
|
||||||
PFNGLCLEARPROC glClear = (PFNGLCLEARPROC)
|
PFNGLCLEARPROC glClear = (PFNGLCLEARPROC) glfwGetProcAddress("glClear");
|
||||||
window->context.getProcAddress("glClear");
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
window->context.swapBuffers(window);
|
||||||
if (window->doublebuffer)
|
|
||||||
window->context.swapBuffers(window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Searches an extension string for the specified extension
|
|
||||||
//
|
|
||||||
GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions)
|
GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions)
|
||||||
{
|
{
|
||||||
const char* start = extensions;
|
const char* start = extensions;
|
||||||
|
@ -616,16 +563,13 @@ GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions
|
||||||
GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
|
GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFWwindow* previous;
|
_GLFWwindow* previous = _glfwPlatformGetCurrentContext();
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
previous = _glfwPlatformGetTls(&_glfw.contextSlot);
|
|
||||||
|
|
||||||
if (window && window->context.client == GLFW_NO_API)
|
if (window && window->context.client == GLFW_NO_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT,
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
"Cannot make current with a window that has no OpenGL or OpenGL ES context");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,7 +586,7 @@ GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
|
||||||
GLFWAPI GLFWwindow* glfwGetCurrentContext(void)
|
GLFWAPI GLFWwindow* glfwGetCurrentContext(void)
|
||||||
{
|
{
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
return _glfwPlatformGetTls(&_glfw.contextSlot);
|
return (GLFWwindow*) _glfwPlatformGetCurrentContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSwapBuffers(GLFWwindow* handle)
|
GLFWAPI void glfwSwapBuffers(GLFWwindow* handle)
|
||||||
|
@ -654,8 +598,7 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* handle)
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.client == GLFW_NO_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT,
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
"Cannot swap buffers of a window that has no OpenGL or OpenGL ES context");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -668,11 +611,10 @@ GLFWAPI void glfwSwapInterval(int interval)
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
window = _glfwPlatformGetCurrentContext();
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_CURRENT_CONTEXT,
|
_glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);
|
||||||
"Cannot set swap interval without a current OpenGL or OpenGL ES context");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,21 +624,21 @@ GLFWAPI void glfwSwapInterval(int interval)
|
||||||
GLFWAPI int glfwExtensionSupported(const char* extension)
|
GLFWAPI int glfwExtensionSupported(const char* extension)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window;
|
_GLFWwindow* window;
|
||||||
|
|
||||||
assert(extension != NULL);
|
assert(extension != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
window = _glfwPlatformGetCurrentContext();
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_CURRENT_CONTEXT,
|
_glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);
|
||||||
"Cannot query extension without a current OpenGL or OpenGL ES context");
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*extension == '\0')
|
if (*extension == '\0')
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Extension name cannot be an empty string");
|
_glfwInputError(GLFW_INVALID_VALUE, "Extension name is empty string");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,11 +694,10 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname)
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
window = _glfwPlatformGetCurrentContext();
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_CURRENT_CONTEXT,
|
_glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);
|
||||||
"Cannot query entry point without a current OpenGL or OpenGL ES context");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 EGL - www.glfw.org
|
// GLFW 3.2 EGL - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -24,20 +24,17 @@
|
||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Please use C89 style variable declarations in this file because VS 2010
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
// Return a description of the specified EGL error
|
// Return a description of the specified EGL error
|
||||||
//
|
//
|
||||||
static const char* getEGLErrorString(EGLint error)
|
static const char* getErrorString(EGLint error)
|
||||||
{
|
{
|
||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
|
@ -78,40 +75,23 @@ static const char* getEGLErrorString(EGLint error)
|
||||||
|
|
||||||
// Returns the specified attribute of the specified EGLConfig
|
// Returns the specified attribute of the specified EGLConfig
|
||||||
//
|
//
|
||||||
static int getEGLConfigAttrib(EGLConfig config, int attrib)
|
static int getConfigAttrib(EGLConfig config, int attrib)
|
||||||
{
|
{
|
||||||
int value;
|
int value;
|
||||||
eglGetConfigAttrib(_glfw.egl.display, config, attrib, &value);
|
eglGetConfigAttrib(_glfw.egl.display, config, attrib, &value);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the EGLConfig most closely matching the specified hints
|
// Return a list of available and usable framebuffer configs
|
||||||
//
|
//
|
||||||
static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
static GLFWbool chooseFBConfigs(const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig,
|
const _GLFWfbconfig* desired,
|
||||||
EGLConfig* result)
|
EGLConfig* result)
|
||||||
{
|
{
|
||||||
EGLConfig* nativeConfigs;
|
EGLConfig* nativeConfigs;
|
||||||
_GLFWfbconfig* usableConfigs;
|
_GLFWfbconfig* usableConfigs;
|
||||||
const _GLFWfbconfig* closest;
|
const _GLFWfbconfig* closest;
|
||||||
int i, nativeCount, usableCount, apiBit;
|
int i, nativeCount, usableCount;
|
||||||
GLFWbool wrongApiAvailable = GLFW_FALSE;
|
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
|
||||||
{
|
|
||||||
if (ctxconfig->major == 1)
|
|
||||||
apiBit = EGL_OPENGL_ES_BIT;
|
|
||||||
else
|
|
||||||
apiBit = EGL_OPENGL_ES2_BIT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
apiBit = EGL_OPENGL_BIT;
|
|
||||||
|
|
||||||
if (fbconfig->stereo)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_FORMAT_UNAVAILABLE, "EGL: Stereo rendering not supported");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
eglGetConfigs(_glfw.egl.display, NULL, 0, &nativeCount);
|
eglGetConfigs(_glfw.egl.display, NULL, 0, &nativeCount);
|
||||||
if (!nativeCount)
|
if (!nativeCount)
|
||||||
|
@ -120,10 +100,10 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeConfigs = _glfw_calloc(nativeCount, sizeof(EGLConfig));
|
nativeConfigs = calloc(nativeCount, sizeof(EGLConfig));
|
||||||
eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount);
|
eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount);
|
||||||
|
|
||||||
usableConfigs = _glfw_calloc(nativeCount, sizeof(_GLFWfbconfig));
|
usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));
|
||||||
usableCount = 0;
|
usableCount = 0;
|
||||||
|
|
||||||
for (i = 0; i < nativeCount; i++)
|
for (i = 0; i < nativeCount; i++)
|
||||||
|
@ -132,113 +112,64 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
||||||
_GLFWfbconfig* u = usableConfigs + usableCount;
|
_GLFWfbconfig* u = usableConfigs + usableCount;
|
||||||
|
|
||||||
// Only consider RGB(A) EGLConfigs
|
// Only consider RGB(A) EGLConfigs
|
||||||
if (getEGLConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) != EGL_RGB_BUFFER)
|
if (!(getConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Only consider window EGLConfigs
|
// Only consider window EGLConfigs
|
||||||
if (!(getEGLConfigAttrib(n, EGL_SURFACE_TYPE) & EGL_WINDOW_BIT))
|
if (!(getConfigAttrib(n, EGL_SURFACE_TYPE) & EGL_WINDOW_BIT))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#if defined(_GLFW_X11)
|
#if defined(_GLFW_X11)
|
||||||
if (_glfw.platform.platformID == GLFW_PLATFORM_X11)
|
// Only consider EGLConfigs with associated Visuals
|
||||||
{
|
if (!getConfigAttrib(n, EGL_NATIVE_VISUAL_ID))
|
||||||
XVisualInfo vi = {0};
|
continue;
|
||||||
|
|
||||||
// Only consider EGLConfigs with associated Visuals
|
|
||||||
vi.visualid = getEGLConfigAttrib(n, EGL_NATIVE_VISUAL_ID);
|
|
||||||
if (!vi.visualid)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (fbconfig->transparent)
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
XVisualInfo* vis =
|
|
||||||
XGetVisualInfo(_glfw.x11.display, VisualIDMask, &vi, &count);
|
|
||||||
if (vis)
|
|
||||||
{
|
|
||||||
u->transparent = _glfwIsVisualTransparentX11(vis[0].visual);
|
|
||||||
XFree(vis);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // _GLFW_X11
|
#endif // _GLFW_X11
|
||||||
|
|
||||||
if (!(getEGLConfigAttrib(n, EGL_RENDERABLE_TYPE) & apiBit))
|
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
||||||
{
|
{
|
||||||
wrongApiAvailable = GLFW_TRUE;
|
if (ctxconfig->major == 1)
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
u->redBits = getEGLConfigAttrib(n, EGL_RED_SIZE);
|
|
||||||
u->greenBits = getEGLConfigAttrib(n, EGL_GREEN_SIZE);
|
|
||||||
u->blueBits = getEGLConfigAttrib(n, EGL_BLUE_SIZE);
|
|
||||||
|
|
||||||
u->alphaBits = getEGLConfigAttrib(n, EGL_ALPHA_SIZE);
|
|
||||||
u->depthBits = getEGLConfigAttrib(n, EGL_DEPTH_SIZE);
|
|
||||||
u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);
|
|
||||||
|
|
||||||
#if defined(_GLFW_WAYLAND)
|
|
||||||
if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND)
|
|
||||||
{
|
|
||||||
// NOTE: The wl_surface opaque region is no guarantee that its buffer
|
|
||||||
// is presented as opaque, if it also has an alpha channel
|
|
||||||
// HACK: If EGL_EXT_present_opaque is unavailable, ignore any config
|
|
||||||
// with an alpha channel to ensure the buffer is opaque
|
|
||||||
if (!_glfw.egl.EXT_present_opaque)
|
|
||||||
{
|
{
|
||||||
if (!fbconfig->transparent && u->alphaBits > 0)
|
if (!(getConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(getConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // _GLFW_WAYLAND
|
else if (ctxconfig->client == GLFW_OPENGL_API)
|
||||||
|
{
|
||||||
|
if (!(getConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_BIT))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);
|
u->redBits = getConfigAttrib(n, EGL_RED_SIZE);
|
||||||
u->doublebuffer = fbconfig->doublebuffer;
|
u->greenBits = getConfigAttrib(n, EGL_GREEN_SIZE);
|
||||||
|
u->blueBits = getConfigAttrib(n, EGL_BLUE_SIZE);
|
||||||
|
|
||||||
|
u->alphaBits = getConfigAttrib(n, EGL_ALPHA_SIZE);
|
||||||
|
u->depthBits = getConfigAttrib(n, EGL_DEPTH_SIZE);
|
||||||
|
u->stencilBits = getConfigAttrib(n, EGL_STENCIL_SIZE);
|
||||||
|
|
||||||
|
u->samples = getConfigAttrib(n, EGL_SAMPLES);
|
||||||
|
u->doublebuffer = GLFW_TRUE;
|
||||||
|
|
||||||
u->handle = (uintptr_t) n;
|
u->handle = (uintptr_t) n;
|
||||||
usableCount++;
|
usableCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
closest = _glfwChooseFBConfig(fbconfig, usableConfigs, usableCount);
|
closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount);
|
||||||
if (closest)
|
if (closest)
|
||||||
*result = (EGLConfig) closest->handle;
|
*result = (EGLConfig) closest->handle;
|
||||||
else
|
|
||||||
{
|
|
||||||
if (wrongApiAvailable)
|
|
||||||
{
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
|
||||||
{
|
|
||||||
if (ctxconfig->major == 1)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
|
||||||
"EGL: Failed to find support for OpenGL ES 1.x");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
|
||||||
"EGL: Failed to find support for OpenGL ES 2 or later");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
|
||||||
"EGL: Failed to find support for OpenGL");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_FORMAT_UNAVAILABLE,
|
|
||||||
"EGL: Failed to find a suitable EGLConfig");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw_free(nativeConfigs);
|
free(nativeConfigs);
|
||||||
_glfw_free(usableConfigs);
|
free(usableConfigs);
|
||||||
|
|
||||||
return closest != NULL;
|
return closest != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void makeContextCurrentEGL(_GLFWwindow* window)
|
static void makeContextCurrent(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (window)
|
if (window)
|
||||||
{
|
{
|
||||||
|
@ -249,7 +180,7 @@ static void makeContextCurrentEGL(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"EGL: Failed to make context current: %s",
|
"EGL: Failed to make context current: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,41 +193,32 @@ static void makeContextCurrentEGL(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"EGL: Failed to clear current context: %s",
|
"EGL: Failed to clear current context: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwPlatformSetTls(&_glfw.contextSlot, window);
|
_glfwPlatformSetCurrentContext(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void swapBuffersEGL(_GLFWwindow* window)
|
static void swapBuffers(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (window != _glfwPlatformGetTls(&_glfw.contextSlot))
|
if (window != _glfwPlatformGetCurrentContext())
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"EGL: The context must be current on the calling thread when swapping buffers");
|
"EGL: The context must be current on the calling thread when swapping buffers");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_GLFW_WAYLAND)
|
|
||||||
if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND)
|
|
||||||
{
|
|
||||||
// NOTE: Swapping buffers on a hidden window on Wayland makes it visible
|
|
||||||
if (!window->wl.visible)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
eglSwapBuffers(_glfw.egl.display, window->context.egl.surface);
|
eglSwapBuffers(_glfw.egl.display, window->context.egl.surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void swapIntervalEGL(int interval)
|
static void swapInterval(int interval)
|
||||||
{
|
{
|
||||||
eglSwapInterval(_glfw.egl.display, interval);
|
eglSwapInterval(_glfw.egl.display, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int extensionSupportedEGL(const char* extension)
|
static int extensionSupported(const char* extension)
|
||||||
{
|
{
|
||||||
const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS);
|
const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS);
|
||||||
if (extensions)
|
if (extensions)
|
||||||
|
@ -308,14 +230,14 @@ static int extensionSupportedEGL(const char* extension)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLFWglproc getProcAddressEGL(const char* procname)
|
static GLFWglproc getProcAddress(const char* procname)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
_GLFWwindow* window = _glfwPlatformGetCurrentContext();
|
||||||
|
|
||||||
if (window->context.egl.client)
|
if (window->context.egl.client)
|
||||||
{
|
{
|
||||||
GLFWglproc proc = (GLFWglproc)
|
GLFWglproc proc = (GLFWglproc) _glfw_dlsym(window->context.egl.client,
|
||||||
_glfwPlatformGetModuleSymbol(window->context.egl.client, procname);
|
procname);
|
||||||
if (proc)
|
if (proc)
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
@ -323,16 +245,17 @@ static GLFWglproc getProcAddressEGL(const char* procname)
|
||||||
return eglGetProcAddress(procname);
|
return eglGetProcAddress(procname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyContextEGL(_GLFWwindow* window)
|
static void destroyContext(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
#if defined(_GLFW_X11)
|
||||||
// NOTE: Do not unload libGL.so.1 while the X11 display is still open,
|
// NOTE: Do not unload libGL.so.1 while the X11 display is still open,
|
||||||
// as it will make XCloseDisplay segfault
|
// as it will make XCloseDisplay segfault
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11 ||
|
if (window->context.client != GLFW_OPENGL_API)
|
||||||
window->context.client != GLFW_OPENGL_API)
|
#endif // _GLFW_X11
|
||||||
{
|
{
|
||||||
if (window->context.egl.client)
|
if (window->context.egl.client)
|
||||||
{
|
{
|
||||||
_glfwPlatformFreeModule(window->context.egl.client);
|
_glfw_dlclose(window->context.egl.client);
|
||||||
window->context.egl.client = NULL;
|
window->context.egl.client = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -360,152 +283,68 @@ static void destroyContextEGL(_GLFWwindow* window)
|
||||||
GLFWbool _glfwInitEGL(void)
|
GLFWbool _glfwInitEGL(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
EGLint* attribs = NULL;
|
|
||||||
const char* extensions;
|
|
||||||
const char* sonames[] =
|
const char* sonames[] =
|
||||||
{
|
{
|
||||||
#if defined(_GLFW_EGL_LIBRARY)
|
#if defined(_GLFW_WIN32)
|
||||||
_GLFW_EGL_LIBRARY,
|
|
||||||
#elif defined(_GLFW_WIN32)
|
|
||||||
"libEGL.dll",
|
"libEGL.dll",
|
||||||
"EGL.dll",
|
"EGL.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
"libEGL.dylib",
|
"libEGL.dylib",
|
||||||
#elif defined(__CYGWIN__)
|
|
||||||
"libEGL-1.so",
|
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
"libEGL.so",
|
|
||||||
#else
|
#else
|
||||||
"libEGL.so.1",
|
"libEGL.so.1",
|
||||||
#endif
|
#endif
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_glfw.egl.handle)
|
|
||||||
return GLFW_TRUE;
|
|
||||||
|
|
||||||
for (i = 0; sonames[i]; i++)
|
for (i = 0; sonames[i]; i++)
|
||||||
{
|
{
|
||||||
_glfw.egl.handle = _glfwPlatformLoadModule(sonames[i]);
|
_glfw.egl.handle = _glfw_dlopen(sonames[i]);
|
||||||
if (_glfw.egl.handle)
|
if (_glfw.egl.handle)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_glfw.egl.handle)
|
if (!_glfw.egl.handle)
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Library not found");
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.egl.prefix = (strncmp(sonames[i], "lib", 3) == 0);
|
_glfw.egl.GetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC)
|
||||||
|
_glfw_dlsym(_glfw.egl.handle, "eglGetConfigAttrib");
|
||||||
_glfw.egl.GetConfigAttrib = (PFN_eglGetConfigAttrib)
|
_glfw.egl.GetConfigs = (PFNEGLGETCONFIGSPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetConfigAttrib");
|
_glfw_dlsym(_glfw.egl.handle, "eglGetConfigs");
|
||||||
_glfw.egl.GetConfigs = (PFN_eglGetConfigs)
|
_glfw.egl.GetDisplay = (PFNEGLGETDISPLAYPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetConfigs");
|
_glfw_dlsym(_glfw.egl.handle, "eglGetDisplay");
|
||||||
_glfw.egl.GetDisplay = (PFN_eglGetDisplay)
|
_glfw.egl.GetError = (PFNEGLGETERRORPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetDisplay");
|
_glfw_dlsym(_glfw.egl.handle, "eglGetError");
|
||||||
_glfw.egl.GetError = (PFN_eglGetError)
|
_glfw.egl.Initialize = (PFNEGLINITIALIZEPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetError");
|
_glfw_dlsym(_glfw.egl.handle, "eglInitialize");
|
||||||
_glfw.egl.Initialize = (PFN_eglInitialize)
|
_glfw.egl.Terminate = (PFNEGLTERMINATEPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglInitialize");
|
_glfw_dlsym(_glfw.egl.handle, "eglTerminate");
|
||||||
_glfw.egl.Terminate = (PFN_eglTerminate)
|
_glfw.egl.BindAPI = (PFNEGLBINDAPIPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglTerminate");
|
_glfw_dlsym(_glfw.egl.handle, "eglBindAPI");
|
||||||
_glfw.egl.BindAPI = (PFN_eglBindAPI)
|
_glfw.egl.CreateContext = (PFNEGLCREATECONTEXTPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglBindAPI");
|
_glfw_dlsym(_glfw.egl.handle, "eglCreateContext");
|
||||||
_glfw.egl.CreateContext = (PFN_eglCreateContext)
|
_glfw.egl.DestroySurface = (PFNEGLDESTROYSURFACEPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateContext");
|
_glfw_dlsym(_glfw.egl.handle, "eglDestroySurface");
|
||||||
_glfw.egl.DestroySurface = (PFN_eglDestroySurface)
|
_glfw.egl.DestroyContext = (PFNEGLDESTROYCONTEXTPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroySurface");
|
_glfw_dlsym(_glfw.egl.handle, "eglDestroyContext");
|
||||||
_glfw.egl.DestroyContext = (PFN_eglDestroyContext)
|
_glfw.egl.CreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroyContext");
|
_glfw_dlsym(_glfw.egl.handle, "eglCreateWindowSurface");
|
||||||
_glfw.egl.CreateWindowSurface = (PFN_eglCreateWindowSurface)
|
_glfw.egl.MakeCurrent = (PFNEGLMAKECURRENTPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateWindowSurface");
|
_glfw_dlsym(_glfw.egl.handle, "eglMakeCurrent");
|
||||||
_glfw.egl.MakeCurrent = (PFN_eglMakeCurrent)
|
_glfw.egl.SwapBuffers = (PFNEGLSWAPBUFFERSPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglMakeCurrent");
|
_glfw_dlsym(_glfw.egl.handle, "eglSwapBuffers");
|
||||||
_glfw.egl.SwapBuffers = (PFN_eglSwapBuffers)
|
_glfw.egl.SwapInterval = (PFNEGLSWAPINTERVALPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglSwapBuffers");
|
_glfw_dlsym(_glfw.egl.handle, "eglSwapInterval");
|
||||||
_glfw.egl.SwapInterval = (PFN_eglSwapInterval)
|
_glfw.egl.QueryString = (PFNEGLQUERYSTRINGPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglSwapInterval");
|
_glfw_dlsym(_glfw.egl.handle, "eglQueryString");
|
||||||
_glfw.egl.QueryString = (PFN_eglQueryString)
|
_glfw.egl.GetProcAddress = (PFNEGLGETPROCADDRESSPROC)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglQueryString");
|
_glfw_dlsym(_glfw.egl.handle, "eglGetProcAddress");
|
||||||
_glfw.egl.GetProcAddress = (PFN_eglGetProcAddress)
|
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetProcAddress");
|
|
||||||
|
|
||||||
if (!_glfw.egl.GetConfigAttrib ||
|
|
||||||
!_glfw.egl.GetConfigs ||
|
|
||||||
!_glfw.egl.GetDisplay ||
|
|
||||||
!_glfw.egl.GetError ||
|
|
||||||
!_glfw.egl.Initialize ||
|
|
||||||
!_glfw.egl.Terminate ||
|
|
||||||
!_glfw.egl.BindAPI ||
|
|
||||||
!_glfw.egl.CreateContext ||
|
|
||||||
!_glfw.egl.DestroySurface ||
|
|
||||||
!_glfw.egl.DestroyContext ||
|
|
||||||
!_glfw.egl.CreateWindowSurface ||
|
|
||||||
!_glfw.egl.MakeCurrent ||
|
|
||||||
!_glfw.egl.SwapBuffers ||
|
|
||||||
!_glfw.egl.SwapInterval ||
|
|
||||||
!_glfw.egl.QueryString ||
|
|
||||||
!_glfw.egl.GetProcAddress)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"EGL: Failed to load required entry points");
|
|
||||||
|
|
||||||
_glfwTerminateEGL();
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
|
||||||
if (extensions && eglGetError() == EGL_SUCCESS)
|
|
||||||
_glfw.egl.EXT_client_extensions = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.egl.EXT_client_extensions)
|
|
||||||
{
|
|
||||||
_glfw.egl.EXT_platform_base =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_base", extensions);
|
|
||||||
_glfw.egl.EXT_platform_x11 =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_x11", extensions);
|
|
||||||
_glfw.egl.EXT_platform_wayland =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_wayland", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_opengl =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_opengl", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_d3d =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_d3d", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_vulkan =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_vulkan", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_metal =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_metal", extensions);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.EXT_platform_base)
|
|
||||||
{
|
|
||||||
_glfw.egl.GetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
|
|
||||||
eglGetProcAddress("eglGetPlatformDisplayEXT");
|
|
||||||
_glfw.egl.CreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
|
|
||||||
eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.egl.platform = _glfw.platform.getEGLPlatform(&attribs);
|
|
||||||
if (_glfw.egl.platform)
|
|
||||||
{
|
|
||||||
_glfw.egl.display =
|
|
||||||
eglGetPlatformDisplayEXT(_glfw.egl.platform,
|
|
||||||
_glfw.platform.getEGLNativeDisplay(),
|
|
||||||
attribs);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_glfw.egl.display = eglGetDisplay(_glfw.platform.getEGLNativeDisplay());
|
|
||||||
|
|
||||||
_glfw_free(attribs);
|
|
||||||
|
|
||||||
|
_glfw.egl.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY);
|
||||||
if (_glfw.egl.display == EGL_NO_DISPLAY)
|
if (_glfw.egl.display == EGL_NO_DISPLAY)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
"EGL: Failed to get EGL display: %s",
|
"EGL: Failed to get EGL display: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
|
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
@ -515,24 +354,18 @@ GLFWbool _glfwInitEGL(void)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
"EGL: Failed to initialize EGL: %s",
|
"EGL: Failed to initialize EGL: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
|
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfw.egl.KHR_create_context =
|
_glfw.egl.KHR_create_context =
|
||||||
extensionSupportedEGL("EGL_KHR_create_context");
|
extensionSupported("EGL_KHR_create_context");
|
||||||
_glfw.egl.KHR_create_context_no_error =
|
_glfw.egl.KHR_create_context_no_error =
|
||||||
extensionSupportedEGL("EGL_KHR_create_context_no_error");
|
extensionSupported("EGL_KHR_create_context_no_error");
|
||||||
_glfw.egl.KHR_gl_colorspace =
|
_glfw.egl.KHR_gl_colorspace =
|
||||||
extensionSupportedEGL("EGL_KHR_gl_colorspace");
|
extensionSupported("EGL_KHR_gl_colorspace");
|
||||||
_glfw.egl.KHR_get_all_proc_addresses =
|
|
||||||
extensionSupportedEGL("EGL_KHR_get_all_proc_addresses");
|
|
||||||
_glfw.egl.KHR_context_flush_control =
|
|
||||||
extensionSupportedEGL("EGL_KHR_context_flush_control");
|
|
||||||
_glfw.egl.EXT_present_opaque =
|
|
||||||
extensionSupportedEGL("EGL_EXT_present_opaque");
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -549,16 +382,16 @@ void _glfwTerminateEGL(void)
|
||||||
|
|
||||||
if (_glfw.egl.handle)
|
if (_glfw.egl.handle)
|
||||||
{
|
{
|
||||||
_glfwPlatformFreeModule(_glfw.egl.handle);
|
_glfw_dlclose(_glfw.egl.handle);
|
||||||
_glfw.egl.handle = NULL;
|
_glfw.egl.handle = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ATTRIB(a, v) \
|
#define setEGLattrib(attribName, attribValue) \
|
||||||
{ \
|
{ \
|
||||||
assert(((size_t) index + 1) < sizeof(attribs) / sizeof(attribs[0])); \
|
attribs[index++] = attribName; \
|
||||||
attribs[index++] = a; \
|
attribs[index++] = attribValue; \
|
||||||
attribs[index++] = v; \
|
assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the OpenGL or OpenGL ES context
|
// Create the OpenGL or OpenGL ES context
|
||||||
|
@ -570,8 +403,6 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
EGLint attribs[40];
|
EGLint attribs[40];
|
||||||
EGLConfig config;
|
EGLConfig config;
|
||||||
EGLContext share = NULL;
|
EGLContext share = NULL;
|
||||||
EGLNativeWindowType native;
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
if (!_glfw.egl.display)
|
if (!_glfw.egl.display)
|
||||||
{
|
{
|
||||||
|
@ -582,8 +413,12 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
if (ctxconfig->share)
|
if (ctxconfig->share)
|
||||||
share = ctxconfig->share->context.egl.handle;
|
share = ctxconfig->share->context.egl.handle;
|
||||||
|
|
||||||
if (!chooseEGLConfig(ctxconfig, fbconfig, &config))
|
if (!chooseFBConfigs(ctxconfig, fbconfig, &config))
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_FORMAT_UNAVAILABLE,
|
||||||
|
"EGL: Failed to find a suitable EGLConfig");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
||||||
{
|
{
|
||||||
|
@ -591,7 +426,7 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
"EGL: Failed to bind OpenGL ES: %s",
|
"EGL: Failed to bind OpenGL ES: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -601,14 +436,14 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
"EGL: Failed to bind OpenGL: %s",
|
"EGL: Failed to bind OpenGL: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.egl.KHR_create_context)
|
if (_glfw.egl.KHR_create_context)
|
||||||
{
|
{
|
||||||
int mask = 0, flags = 0;
|
int index = 0, mask = 0, flags = 0;
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_API)
|
if (ctxconfig->client == GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
|
@ -619,6 +454,12 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
mask |= EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
|
mask |= EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
|
||||||
else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)
|
else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)
|
||||||
mask |= EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR;
|
mask |= EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR;
|
||||||
|
|
||||||
|
if (_glfw.egl.KHR_create_context_no_error)
|
||||||
|
{
|
||||||
|
if (ctxconfig->noerror)
|
||||||
|
flags |= EGL_CONTEXT_OPENGL_NO_ERROR_KHR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctxconfig->debug)
|
if (ctxconfig->debug)
|
||||||
|
@ -628,57 +469,44 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
{
|
{
|
||||||
if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION)
|
if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION)
|
||||||
{
|
{
|
||||||
SET_ATTRIB(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,
|
setEGLattrib(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,
|
||||||
EGL_NO_RESET_NOTIFICATION_KHR);
|
EGL_NO_RESET_NOTIFICATION_KHR);
|
||||||
}
|
}
|
||||||
else if (ctxconfig->robustness == GLFW_LOSE_CONTEXT_ON_RESET)
|
else if (ctxconfig->robustness == GLFW_LOSE_CONTEXT_ON_RESET)
|
||||||
{
|
{
|
||||||
SET_ATTRIB(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,
|
setEGLattrib(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,
|
||||||
EGL_LOSE_CONTEXT_ON_RESET_KHR);
|
EGL_LOSE_CONTEXT_ON_RESET_KHR);
|
||||||
}
|
}
|
||||||
|
|
||||||
flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
|
flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctxconfig->noerror)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.KHR_create_context_no_error)
|
|
||||||
SET_ATTRIB(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, GLFW_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctxconfig->major != 1 || ctxconfig->minor != 0)
|
if (ctxconfig->major != 1 || ctxconfig->minor != 0)
|
||||||
{
|
{
|
||||||
SET_ATTRIB(EGL_CONTEXT_MAJOR_VERSION_KHR, ctxconfig->major);
|
setEGLattrib(EGL_CONTEXT_MAJOR_VERSION_KHR, ctxconfig->major);
|
||||||
SET_ATTRIB(EGL_CONTEXT_MINOR_VERSION_KHR, ctxconfig->minor);
|
setEGLattrib(EGL_CONTEXT_MINOR_VERSION_KHR, ctxconfig->minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask)
|
if (mask)
|
||||||
SET_ATTRIB(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, mask);
|
setEGLattrib(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, mask);
|
||||||
|
|
||||||
if (flags)
|
if (flags)
|
||||||
SET_ATTRIB(EGL_CONTEXT_FLAGS_KHR, flags);
|
setEGLattrib(EGL_CONTEXT_FLAGS_KHR, flags);
|
||||||
|
|
||||||
|
setEGLattrib(EGL_NONE, EGL_NONE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
||||||
SET_ATTRIB(EGL_CONTEXT_CLIENT_VERSION, ctxconfig->major);
|
setEGLattrib(EGL_CONTEXT_CLIENT_VERSION, ctxconfig->major);
|
||||||
|
|
||||||
|
setEGLattrib(EGL_NONE, EGL_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.egl.KHR_context_flush_control)
|
// Context release behaviors (GL_KHR_context_flush_control) are not yet
|
||||||
{
|
// supported on EGL but are not a hard constraint, so ignore and continue
|
||||||
if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_NONE)
|
|
||||||
{
|
|
||||||
SET_ATTRIB(EGL_CONTEXT_RELEASE_BEHAVIOR_KHR,
|
|
||||||
EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR);
|
|
||||||
}
|
|
||||||
else if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_FLUSH)
|
|
||||||
{
|
|
||||||
SET_ATTRIB(EGL_CONTEXT_RELEASE_BEHAVIOR_KHR,
|
|
||||||
EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_ATTRIB(EGL_NONE, EGL_NONE);
|
|
||||||
|
|
||||||
window->context.egl.handle = eglCreateContext(_glfw.egl.display,
|
window->context.egl.handle = eglCreateContext(_glfw.egl.display,
|
||||||
config, share, attribs);
|
config, share, attribs);
|
||||||
|
@ -687,67 +515,51 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
||||||
"EGL: Failed to create context: %s",
|
"EGL: Failed to create context: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up attributes for surface creation
|
// Set up attributes for surface creation
|
||||||
index = 0;
|
|
||||||
|
|
||||||
if (fbconfig->sRGB)
|
|
||||||
{
|
{
|
||||||
if (_glfw.egl.KHR_gl_colorspace)
|
int index = 0;
|
||||||
SET_ATTRIB(EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR);
|
|
||||||
}
|
if (fbconfig->sRGB)
|
||||||
|
{
|
||||||
if (!fbconfig->doublebuffer)
|
if (_glfw.egl.KHR_gl_colorspace)
|
||||||
SET_ATTRIB(EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER);
|
{
|
||||||
|
setEGLattrib(EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR);
|
||||||
if (_glfw.egl.EXT_present_opaque)
|
}
|
||||||
SET_ATTRIB(EGL_PRESENT_OPAQUE_EXT, !fbconfig->transparent);
|
}
|
||||||
|
|
||||||
SET_ATTRIB(EGL_NONE, EGL_NONE);
|
setEGLattrib(EGL_NONE, EGL_NONE);
|
||||||
|
|
||||||
native = _glfw.platform.getEGLNativeWindow(window);
|
|
||||||
// HACK: ANGLE does not implement eglCreatePlatformWindowSurfaceEXT
|
|
||||||
// despite reporting EGL_EXT_platform_base
|
|
||||||
if (_glfw.egl.platform && _glfw.egl.platform != EGL_PLATFORM_ANGLE_ANGLE)
|
|
||||||
{
|
|
||||||
window->context.egl.surface =
|
|
||||||
eglCreatePlatformWindowSurfaceEXT(_glfw.egl.display, config, native, attribs);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
window->context.egl.surface =
|
|
||||||
eglCreateWindowSurface(_glfw.egl.display, config, native, attribs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window->context.egl.surface =
|
||||||
|
eglCreateWindowSurface(_glfw.egl.display,
|
||||||
|
config,
|
||||||
|
_GLFW_EGL_NATIVE_WINDOW,
|
||||||
|
attribs);
|
||||||
if (window->context.egl.surface == EGL_NO_SURFACE)
|
if (window->context.egl.surface == EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"EGL: Failed to create window surface: %s",
|
"EGL: Failed to create window surface: %s",
|
||||||
getEGLErrorString(eglGetError()));
|
getErrorString(eglGetError()));
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
window->context.egl.config = config;
|
window->context.egl.config = config;
|
||||||
|
|
||||||
// Load the appropriate client library
|
// Load the appropriate client library
|
||||||
if (!_glfw.egl.KHR_get_all_proc_addresses)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const char** sonames;
|
const char** sonames;
|
||||||
const char* es1sonames[] =
|
const char* es1sonames[] =
|
||||||
{
|
{
|
||||||
#if defined(_GLFW_GLESV1_LIBRARY)
|
#if defined(_GLFW_WIN32)
|
||||||
_GLFW_GLESV1_LIBRARY,
|
|
||||||
#elif defined(_GLFW_WIN32)
|
|
||||||
"GLESv1_CM.dll",
|
"GLESv1_CM.dll",
|
||||||
"libGLES_CM.dll",
|
"libGLES_CM.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
"libGLESv1_CM.dylib",
|
"libGLESv1_CM.dylib",
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
"libGLESv1_CM.so",
|
|
||||||
#else
|
#else
|
||||||
"libGLESv1_CM.so.1",
|
"libGLESv1_CM.so.1",
|
||||||
"libGLES_CM.so.1",
|
"libGLES_CM.so.1",
|
||||||
|
@ -756,17 +568,11 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
};
|
};
|
||||||
const char* es2sonames[] =
|
const char* es2sonames[] =
|
||||||
{
|
{
|
||||||
#if defined(_GLFW_GLESV2_LIBRARY)
|
#if defined(_GLFW_WIN32)
|
||||||
_GLFW_GLESV2_LIBRARY,
|
|
||||||
#elif defined(_GLFW_WIN32)
|
|
||||||
"GLESv2.dll",
|
"GLESv2.dll",
|
||||||
"libGLESv2.dll",
|
"libGLESv2.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
"libGLESv2.dylib",
|
"libGLESv2.dylib",
|
||||||
#elif defined(__CYGWIN__)
|
|
||||||
"libGLESv2-2.so",
|
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
"libGLESv2.so",
|
|
||||||
#else
|
#else
|
||||||
"libGLESv2.so.2",
|
"libGLESv2.so.2",
|
||||||
#endif
|
#endif
|
||||||
|
@ -774,14 +580,9 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
};
|
};
|
||||||
const char* glsonames[] =
|
const char* glsonames[] =
|
||||||
{
|
{
|
||||||
#if defined(_GLFW_OPENGL_LIBRARY)
|
#if defined(_GLFW_WIN32)
|
||||||
_GLFW_OPENGL_LIBRARY,
|
|
||||||
#elif defined(_GLFW_WIN32)
|
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
"libGL.so",
|
|
||||||
#else
|
#else
|
||||||
"libOpenGL.so.0",
|
|
||||||
"libGL.so.1",
|
"libGL.so.1",
|
||||||
#endif
|
#endif
|
||||||
NULL
|
NULL
|
||||||
|
@ -799,12 +600,7 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
|
|
||||||
for (i = 0; sonames[i]; i++)
|
for (i = 0; sonames[i]; i++)
|
||||||
{
|
{
|
||||||
// HACK: Match presence of lib prefix to increase chance of finding
|
window->context.egl.client = _glfw_dlopen(sonames[i]);
|
||||||
// a matching pair in the jungle that is Win32 EGL/GLES
|
|
||||||
if (_glfw.egl.prefix != (strncmp(sonames[i], "lib", 3) == 0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
window->context.egl.client = _glfwPlatformLoadModule(sonames[i]);
|
|
||||||
if (window->context.egl.client)
|
if (window->context.egl.client)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -817,23 +613,22 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window->context.makeCurrent = makeContextCurrentEGL;
|
window->context.makeCurrent = makeContextCurrent;
|
||||||
window->context.swapBuffers = swapBuffersEGL;
|
window->context.swapBuffers = swapBuffers;
|
||||||
window->context.swapInterval = swapIntervalEGL;
|
window->context.swapInterval = swapInterval;
|
||||||
window->context.extensionSupported = extensionSupportedEGL;
|
window->context.extensionSupported = extensionSupported;
|
||||||
window->context.getProcAddress = getProcAddressEGL;
|
window->context.getProcAddress = getProcAddress;
|
||||||
window->context.destroy = destroyContextEGL;
|
window->context.destroy = destroyContext;
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef SET_ATTRIB
|
#undef setEGLattrib
|
||||||
|
|
||||||
// Returns the Visual and depth of the chosen EGLConfig
|
// Returns the Visual and depth of the chosen EGLConfig
|
||||||
//
|
//
|
||||||
#if defined(_GLFW_X11)
|
#if defined(_GLFW_X11)
|
||||||
GLFWbool _glfwChooseVisualEGL(const _GLFWwndconfig* wndconfig,
|
GLFWbool _glfwChooseVisualEGL(const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWctxconfig* ctxconfig,
|
|
||||||
const _GLFWfbconfig* fbconfig,
|
const _GLFWfbconfig* fbconfig,
|
||||||
Visual** visual, int* depth)
|
Visual** visual, int* depth)
|
||||||
{
|
{
|
||||||
|
@ -843,8 +638,12 @@ GLFWbool _glfwChooseVisualEGL(const _GLFWwndconfig* wndconfig,
|
||||||
EGLint visualID = 0, count = 0;
|
EGLint visualID = 0, count = 0;
|
||||||
const long vimask = VisualScreenMask | VisualIDMask;
|
const long vimask = VisualScreenMask | VisualIDMask;
|
||||||
|
|
||||||
if (!chooseEGLConfig(ctxconfig, fbconfig, &native))
|
if (!chooseFBConfigs(ctxconfig, fbconfig, &native))
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_FORMAT_UNAVAILABLE,
|
||||||
|
"EGL: Failed to find a suitable EGLConfig");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
eglGetConfigAttrib(_glfw.egl.display, native,
|
eglGetConfigAttrib(_glfw.egl.display, native,
|
||||||
EGL_NATIVE_VISUAL_ID, &visualID);
|
EGL_NATIVE_VISUAL_ID, &visualID);
|
||||||
|
@ -884,7 +683,7 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
||||||
|
|
||||||
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
if (window->context.client == GLFW_NO_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return EGL_NO_CONTEXT;
|
return EGL_NO_CONTEXT;
|
||||||
|
@ -898,7 +697,7 @@ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* handle)
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
||||||
|
|
||||||
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
if (window->context.client == GLFW_NO_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return EGL_NO_SURFACE;
|
return EGL_NO_SURFACE;
|
||||||
|
|
213
src/egl_context.h
Normal file
213
src/egl_context.h
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW 3.2 EGL - www.glfw.org
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _glfw3_egl_context_h_
|
||||||
|
#define _glfw3_egl_context_h_
|
||||||
|
|
||||||
|
#if defined(_GLFW_USE_EGLPLATFORM_H)
|
||||||
|
#include <EGL/eglplatform.h>
|
||||||
|
#elif defined(_GLFW_WIN32)
|
||||||
|
#define EGLAPIENTRY __stdcall
|
||||||
|
typedef HDC EGLNativeDisplayType;
|
||||||
|
typedef HWND EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_X11)
|
||||||
|
#define EGLAPIENTRY
|
||||||
|
typedef Display* EGLNativeDisplayType;
|
||||||
|
typedef Window EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_WAYLAND)
|
||||||
|
#define EGLAPIENTRY
|
||||||
|
typedef struct wl_display* EGLNativeDisplayType;
|
||||||
|
typedef struct wl_egl_window* EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_MIR)
|
||||||
|
#define EGLAPIENTRY
|
||||||
|
typedef MirEGLNativeDisplayType EGLNativeDisplayType;
|
||||||
|
typedef MirEGLNativeWindowType EGLNativeWindowType;
|
||||||
|
#else
|
||||||
|
#error "No supported EGL platform selected"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EGL_SUCCESS 0x3000
|
||||||
|
#define EGL_NOT_INITIALIZED 0x3001
|
||||||
|
#define EGL_BAD_ACCESS 0x3002
|
||||||
|
#define EGL_BAD_ALLOC 0x3003
|
||||||
|
#define EGL_BAD_ATTRIBUTE 0x3004
|
||||||
|
#define EGL_BAD_CONFIG 0x3005
|
||||||
|
#define EGL_BAD_CONTEXT 0x3006
|
||||||
|
#define EGL_BAD_CURRENT_SURFACE 0x3007
|
||||||
|
#define EGL_BAD_DISPLAY 0x3008
|
||||||
|
#define EGL_BAD_MATCH 0x3009
|
||||||
|
#define EGL_BAD_NATIVE_PIXMAP 0x300a
|
||||||
|
#define EGL_BAD_NATIVE_WINDOW 0x300b
|
||||||
|
#define EGL_BAD_PARAMETER 0x300c
|
||||||
|
#define EGL_BAD_SURFACE 0x300d
|
||||||
|
#define EGL_CONTEXT_LOST 0x300e
|
||||||
|
#define EGL_COLOR_BUFFER_TYPE 0x303f
|
||||||
|
#define EGL_RGB_BUFFER 0x308e
|
||||||
|
#define EGL_SURFACE_TYPE 0x3033
|
||||||
|
#define EGL_WINDOW_BIT 0x0004
|
||||||
|
#define EGL_RENDERABLE_TYPE 0x3040
|
||||||
|
#define EGL_OPENGL_ES_BIT 0x0001
|
||||||
|
#define EGL_OPENGL_ES2_BIT 0x0004
|
||||||
|
#define EGL_OPENGL_BIT 0x0008
|
||||||
|
#define EGL_ALPHA_SIZE 0x3021
|
||||||
|
#define EGL_BLUE_SIZE 0x3022
|
||||||
|
#define EGL_GREEN_SIZE 0x3023
|
||||||
|
#define EGL_RED_SIZE 0x3024
|
||||||
|
#define EGL_DEPTH_SIZE 0x3025
|
||||||
|
#define EGL_STENCIL_SIZE 0x3026
|
||||||
|
#define EGL_SAMPLES 0x3031
|
||||||
|
#define EGL_OPENGL_ES_API 0x30a0
|
||||||
|
#define EGL_OPENGL_API 0x30a2
|
||||||
|
#define EGL_NONE 0x3038
|
||||||
|
#define EGL_EXTENSIONS 0x3055
|
||||||
|
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
||||||
|
#define EGL_NATIVE_VISUAL_ID 0x302e
|
||||||
|
#define EGL_NO_SURFACE ((EGLSurface) 0)
|
||||||
|
#define EGL_NO_DISPLAY ((EGLDisplay) 0)
|
||||||
|
#define EGL_NO_CONTEXT ((EGLContext) 0)
|
||||||
|
#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0)
|
||||||
|
|
||||||
|
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
|
||||||
|
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
|
||||||
|
#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
|
||||||
|
#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
|
||||||
|
#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31bd
|
||||||
|
#define EGL_NO_RESET_NOTIFICATION_KHR 0x31be
|
||||||
|
#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31bf
|
||||||
|
#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004
|
||||||
|
#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098
|
||||||
|
#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30fb
|
||||||
|
#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30fd
|
||||||
|
#define EGL_CONTEXT_FLAGS_KHR 0x30fc
|
||||||
|
#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31b3
|
||||||
|
#define EGL_GL_COLORSPACE_KHR 0x309d
|
||||||
|
#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089
|
||||||
|
|
||||||
|
typedef int EGLint;
|
||||||
|
typedef unsigned int EGLBoolean;
|
||||||
|
typedef unsigned int EGLenum;
|
||||||
|
typedef void* EGLConfig;
|
||||||
|
typedef void* EGLContext;
|
||||||
|
typedef void* EGLDisplay;
|
||||||
|
typedef void* EGLSurface;
|
||||||
|
|
||||||
|
// EGL function pointer typedefs
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay,EGLConfig,EGLint,EGLint*);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLGETCONFIGSPROC)(EGLDisplay,EGLConfig*,EGLint,EGLint*);
|
||||||
|
typedef EGLDisplay (EGLAPIENTRY * PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType);
|
||||||
|
typedef EGLint (EGLAPIENTRY * PFNEGLGETERRORPROC)(void);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLINITIALIZEPROC)(EGLDisplay,EGLint*,EGLint*);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLTERMINATEPROC)(EGLDisplay);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLBINDAPIPROC)(EGLenum);
|
||||||
|
typedef EGLContext (EGLAPIENTRY * PFNEGLCREATECONTEXTPROC)(EGLDisplay,EGLConfig,EGLContext,const EGLint*);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLDESTROYSURFACEPROC)(EGLDisplay,EGLSurface);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLDESTROYCONTEXTPROC)(EGLDisplay,EGLContext);
|
||||||
|
typedef EGLSurface (EGLAPIENTRY * PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLMAKECURRENTPROC)(EGLDisplay,EGLSurface,EGLSurface,EGLContext);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLSWAPBUFFERSPROC)(EGLDisplay,EGLSurface);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRY * PFNEGLSWAPINTERVALPROC)(EGLDisplay,EGLint);
|
||||||
|
typedef const char* (EGLAPIENTRY * PFNEGLQUERYSTRINGPROC)(EGLDisplay,EGLint);
|
||||||
|
typedef GLFWglproc (EGLAPIENTRY * PFNEGLGETPROCADDRESSPROC)(const char*);
|
||||||
|
#define eglGetConfigAttrib _glfw.egl.GetConfigAttrib
|
||||||
|
#define eglGetConfigs _glfw.egl.GetConfigs
|
||||||
|
#define eglGetDisplay _glfw.egl.GetDisplay
|
||||||
|
#define eglGetError _glfw.egl.GetError
|
||||||
|
#define eglInitialize _glfw.egl.Initialize
|
||||||
|
#define eglTerminate _glfw.egl.Terminate
|
||||||
|
#define eglBindAPI _glfw.egl.BindAPI
|
||||||
|
#define eglCreateContext _glfw.egl.CreateContext
|
||||||
|
#define eglDestroySurface _glfw.egl.DestroySurface
|
||||||
|
#define eglDestroyContext _glfw.egl.DestroyContext
|
||||||
|
#define eglCreateWindowSurface _glfw.egl.CreateWindowSurface
|
||||||
|
#define eglMakeCurrent _glfw.egl.MakeCurrent
|
||||||
|
#define eglSwapBuffers _glfw.egl.SwapBuffers
|
||||||
|
#define eglSwapInterval _glfw.egl.SwapInterval
|
||||||
|
#define eglQueryString _glfw.egl.QueryString
|
||||||
|
#define eglGetProcAddress _glfw.egl.GetProcAddress
|
||||||
|
|
||||||
|
#define _GLFW_EGL_CONTEXT_STATE _GLFWcontextEGL egl
|
||||||
|
#define _GLFW_EGL_LIBRARY_CONTEXT_STATE _GLFWlibraryEGL egl
|
||||||
|
|
||||||
|
|
||||||
|
// EGL-specific per-context data
|
||||||
|
//
|
||||||
|
typedef struct _GLFWcontextEGL
|
||||||
|
{
|
||||||
|
EGLConfig config;
|
||||||
|
EGLContext handle;
|
||||||
|
EGLSurface surface;
|
||||||
|
|
||||||
|
void* client;
|
||||||
|
|
||||||
|
} _GLFWcontextEGL;
|
||||||
|
|
||||||
|
|
||||||
|
// EGL-specific global data
|
||||||
|
//
|
||||||
|
typedef struct _GLFWlibraryEGL
|
||||||
|
{
|
||||||
|
EGLDisplay display;
|
||||||
|
EGLint major, minor;
|
||||||
|
|
||||||
|
GLFWbool KHR_create_context;
|
||||||
|
GLFWbool KHR_create_context_no_error;
|
||||||
|
GLFWbool KHR_gl_colorspace;
|
||||||
|
|
||||||
|
void* handle;
|
||||||
|
|
||||||
|
PFNEGLGETCONFIGATTRIBPROC GetConfigAttrib;
|
||||||
|
PFNEGLGETCONFIGSPROC GetConfigs;
|
||||||
|
PFNEGLGETDISPLAYPROC GetDisplay;
|
||||||
|
PFNEGLGETERRORPROC GetError;
|
||||||
|
PFNEGLINITIALIZEPROC Initialize;
|
||||||
|
PFNEGLTERMINATEPROC Terminate;
|
||||||
|
PFNEGLBINDAPIPROC BindAPI;
|
||||||
|
PFNEGLCREATECONTEXTPROC CreateContext;
|
||||||
|
PFNEGLDESTROYSURFACEPROC DestroySurface;
|
||||||
|
PFNEGLDESTROYCONTEXTPROC DestroyContext;
|
||||||
|
PFNEGLCREATEWINDOWSURFACEPROC CreateWindowSurface;
|
||||||
|
PFNEGLMAKECURRENTPROC MakeCurrent;
|
||||||
|
PFNEGLSWAPBUFFERSPROC SwapBuffers;
|
||||||
|
PFNEGLSWAPINTERVALPROC SwapInterval;
|
||||||
|
PFNEGLQUERYSTRINGPROC QueryString;
|
||||||
|
PFNEGLGETPROCADDRESSPROC GetProcAddress;
|
||||||
|
|
||||||
|
} _GLFWlibraryEGL;
|
||||||
|
|
||||||
|
|
||||||
|
GLFWbool _glfwInitEGL(void);
|
||||||
|
void _glfwTerminateEGL(void);
|
||||||
|
GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
|
const _GLFWctxconfig* ctxconfig,
|
||||||
|
const _GLFWfbconfig* fbconfig);
|
||||||
|
#if defined(_GLFW_X11)
|
||||||
|
GLFWbool _glfwChooseVisualEGL(const _GLFWctxconfig* ctxconfig,
|
||||||
|
const _GLFWfbconfig* fbconfig,
|
||||||
|
Visual** visual, int* depth);
|
||||||
|
#endif /*_GLFW_X11*/
|
||||||
|
|
||||||
|
#endif // _glfw3_egl_context_h_
|
|
@ -1,30 +0,0 @@
|
||||||
|
|
||||||
#include <winver.h>
|
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
|
||||||
FILEVERSION @GLFW_VERSION_MAJOR@,@GLFW_VERSION_MINOR@,@GLFW_VERSION_PATCH@,0
|
|
||||||
PRODUCTVERSION @GLFW_VERSION_MAJOR@,@GLFW_VERSION_MINOR@,@GLFW_VERSION_PATCH@,0
|
|
||||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
|
||||||
FILEFLAGS 0
|
|
||||||
FILEOS VOS_NT_WINDOWS32
|
|
||||||
FILETYPE VFT_DLL
|
|
||||||
FILESUBTYPE 0
|
|
||||||
{
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
{
|
|
||||||
BLOCK "040904B0"
|
|
||||||
{
|
|
||||||
VALUE "CompanyName", "GLFW"
|
|
||||||
VALUE "FileDescription", "GLFW @GLFW_VERSION@ DLL"
|
|
||||||
VALUE "FileVersion", "@GLFW_VERSION@"
|
|
||||||
VALUE "OriginalFilename", "glfw3.dll"
|
|
||||||
VALUE "ProductName", "GLFW"
|
|
||||||
VALUE "ProductVersion", "@GLFW_VERSION@"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
{
|
|
||||||
VALUE "Translation", 0x409, 1200
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
13
src/glfw3.pc.in
Normal file
13
src/glfw3.pc.in
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
includedir=${prefix}/include
|
||||||
|
libdir=${exec_prefix}/lib@LIB_SUFFIX@
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A multi-platform library for OpenGL, window and input
|
||||||
|
Version: @GLFW_VERSION_FULL@
|
||||||
|
URL: http://www.glfw.org/
|
||||||
|
Requires.private: @GLFW_PKG_DEPS@
|
||||||
|
Libs: -L${libdir} -l@GLFW_LIB_NAME@
|
||||||
|
Libs.private: @GLFW_PKG_LIBS@
|
||||||
|
Cflags: -I${includedir}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user