mirror of
https://github.com/glfw/glfw.git
synced 2026-09-18 22:55:46 +00:00
Compare commits
112 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d9d6f0f1f9 | |||
| deeadd3c30 | |||
| 0984b4354a | |||
| b7ef2919b0 | |||
| 463cf73610 | |||
| ed6452b13c | |||
| e94108d9db | |||
| dc86d02ff1 | |||
| 06406a00a0 | |||
| de0c378aa2 | |||
| 567b1ec244 | |||
| 0136febb1e | |||
| 6c397996b8 | |||
| b00e6a8a88 | |||
| 51683a6f1c | |||
| 55fd451d5f | |||
| 1929088dd9 | |||
| 3130c004e1 | |||
| bb8048122a | |||
| 50b0a135a5 | |||
| fdd14e65b1 | |||
| 54b18d5547 | |||
| 05f57c0bee | |||
| 0d15b54c7a | |||
| f472380d7e | |||
| 1839271de4 | |||
| aa5047709d | |||
| bae8aa6e7d | |||
| c5c0b69149 | |||
| 29cd880ab5 | |||
| 3d89365fdb | |||
| 7c9ea95233 | |||
| abfbf07830 | |||
| 99cdcfb0a4 | |||
| 001f94eaa7 | |||
| 3f14b6feed | |||
| f0b2992b3a | |||
| b579ea6792 | |||
| a3095e1aa5 | |||
| a98badf088 | |||
| c4684b288d | |||
| 232164f62b | |||
| abb9db0d75 | |||
| 0aa77a9a3a | |||
| 7b370d8df0 | |||
| f871f14d5e | |||
| bafb134769 | |||
| 2d7ae8f2d0 | |||
| 96e0f49395 | |||
| 9352d8fe93 | |||
| a228a8b447 | |||
| dbadda2683 | |||
| 08449b7183 | |||
| 1ce855b0b1 | |||
| ebff6606ee | |||
| 162896e5b9 | |||
| 936307558e | |||
| 4df5129529 | |||
| 6de70d8252 | |||
| 8e15281d34 | |||
| 621e99d53e | |||
| 1a0b7827d4 | |||
| 4c64184455 | |||
| bfcb98fb6c | |||
| f8582d26d0 | |||
| 1fdd39cf3e | |||
| c9b129753a | |||
| 04a67c8267 | |||
| 5c87937e44 | |||
| 63a7e8b7f8 | |||
| acb92944d4 | |||
| 7ef6efeb66 | |||
| 3cf9f6726d | |||
| bfa1c424e5 | |||
| 0d2d85d19c | |||
| 768e81a0eb | |||
| 161fb1b6f6 | |||
| 645a35a38e | |||
| 7523b0e6bd | |||
| 5190a30d8a | |||
| ddbb8e0f2c | |||
| 5245180c56 | |||
| 7b51a8eb31 | |||
| ac10768495 | |||
| feb2a6b728 | |||
| d11cb3779b | |||
| d1b87143bc | |||
| 506c11ba43 | |||
| d30d63313c | |||
| e7ea71be03 | |||
| cf4734ce8a | |||
| 21fea01161 | |||
| a576a56a8d | |||
| b850107a32 | |||
| 043378876a | |||
| b35641f4a3 | |||
| 64906f8e64 | |||
| 51b6434ac4 | |||
| dfebad786d | |||
| 97892c6037 | |||
| 8b574030a8 | |||
| 228e58262e | |||
| 3573c5a890 | |||
| 072f660d93 | |||
| 68dcea0d7f | |||
| 38ec7abd3b | |||
| 738dd6ff1d | |||
| 860c8ef38f | |||
| 42dc1ffaee | |||
| bf945f1213 | |||
| dc557ecf38 | |||
| d24ee9953f |
+1
-1
@@ -29,7 +29,7 @@ for:
|
|||||||
only:
|
only:
|
||||||
- GENERATOR: MinGW Makefiles
|
- GENERATOR: MinGW Makefiles
|
||||||
build_script:
|
build_script:
|
||||||
- set PATH=%PATH:C:\Program Files\Git\usr\bin=C:\MinGW\bin%
|
- set PATH=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;%PATH:C:\Program Files\Git\usr\bin=%
|
||||||
- cmake -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
- cmake -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
||||||
- cmake --build build
|
- cmake --build build
|
||||||
-
|
-
|
||||||
|
|||||||
@@ -41,12 +41,6 @@ indent_size = 2
|
|||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = unset
|
indent_size = unset
|
||||||
|
|
||||||
[deps/mingw/*.h]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
tab_width = 8
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[deps/getopt.{c,h}]
|
[deps/getopt.{c,h}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|||||||
@@ -3,3 +3,5 @@
|
|||||||
.gitattributes export-ignore
|
.gitattributes export-ignore
|
||||||
.travis.yml export-ignore
|
.travis.yml export-ignore
|
||||||
.appveyor.yml export-ignore
|
.appveyor.yml export-ignore
|
||||||
|
.mailmap export-ignore
|
||||||
|
.github export-ignore
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ jobs:
|
|||||||
CC: clang
|
CC: clang
|
||||||
CFLAGS: -Werror
|
CFLAGS: -Werror
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@@ -54,10 +54,10 @@ jobs:
|
|||||||
timeout-minutes: 4
|
timeout-minutes: 4
|
||||||
env:
|
env:
|
||||||
CFLAGS: -Werror
|
CFLAGS: -Werror
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.8
|
MACOSX_DEPLOYMENT_TARGET: 10.11
|
||||||
CMAKE_OSX_ARCHITECTURES: x86_64;arm64
|
CMAKE_OSX_ARCHITECTURES: x86_64;arm64
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Configure Null shared library
|
- name: Configure Null shared library
|
||||||
run: cmake -B build-null-shared -D GLFW_BUILD_COCOA=OFF -D BUILD_SHARED_LIBS=ON
|
run: cmake -B build-null-shared -D GLFW_BUILD_COCOA=OFF -D BUILD_SHARED_LIBS=ON
|
||||||
@@ -74,27 +74,27 @@ jobs:
|
|||||||
- name: Build Cocoa shared library
|
- name: Build Cocoa shared library
|
||||||
run: cmake --build build-cocoa-shared --parallel
|
run: cmake --build build-cocoa-shared --parallel
|
||||||
|
|
||||||
build-windows-vs2022:
|
build-windows-msvc:
|
||||||
name: Windows (VS2022)
|
name: Windows (MSVC)
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
timeout-minutes: 4
|
timeout-minutes: 4
|
||||||
env:
|
env:
|
||||||
CFLAGS: /WX
|
CFLAGS: /WX
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Configure Win32 shared x86 library
|
- name: Configure Win32 shared x86 library
|
||||||
run: cmake -B build-win32-shared-x86 -G "Visual Studio 17 2022" -A Win32 -D BUILD_SHARED_LIBS=ON
|
run: cmake -B build-win32-shared-x86 -A Win32 -D BUILD_SHARED_LIBS=ON
|
||||||
- name: Build Win32 shared x86 library
|
- name: Build Win32 shared x86 library
|
||||||
run: cmake --build build-win32-shared-x86 --parallel
|
run: cmake --build build-win32-shared-x86 --parallel
|
||||||
|
|
||||||
- name: Configure Win32 static x64 library
|
- name: Configure Win32 static x64 library
|
||||||
run: cmake -B build-win32-static-x64 -G "Visual Studio 17 2022" -A x64
|
run: cmake -B build-win32-static-x64 -A x64
|
||||||
- name: Build Win32 static x64 library
|
- name: Build Win32 static x64 library
|
||||||
run: cmake --build build-win32-static-x64 --parallel
|
run: cmake --build build-win32-static-x64 --parallel
|
||||||
|
|
||||||
- name: Configure Win32 shared x64 library
|
- name: Configure Win32 shared x64 library
|
||||||
run: cmake -B build-win32-shared-x64 -G "Visual Studio 17 2022" -A x64 -D BUILD_SHARED_LIBS=ON
|
run: cmake -B build-win32-shared-x64 -A x64 -D BUILD_SHARED_LIBS=ON
|
||||||
- name: Build Win32 shared x64 library
|
- name: Build Win32 shared x64 library
|
||||||
run: cmake --build build-win32-shared-x64 --parallel
|
run: cmake --build build-win32-shared-x64 --parallel
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -57,11 +57,11 @@ src/glfw3ConfigVersion.cmake
|
|||||||
# 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.5
|
||||||
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.5.dylib
|
||||||
src/libglfw3.a
|
src/libglfw3.a
|
||||||
src/glfw3.lib
|
src/glfw3.lib
|
||||||
src/glfw3.dll
|
src/glfw3.dll
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# Usage:
|
# Usage:
|
||||||
# cmake -P GenerateMappings.cmake <path/to/mappings.h.in> <path/to/mappings.h>
|
# cmake -P GenerateMappings.cmake <path/to/mappings.h.in> <path/to/mappings.h>
|
||||||
|
|
||||||
|
cmake_policy(VERSION 3.16)
|
||||||
|
|
||||||
set(source_url "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt")
|
set(source_url "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt")
|
||||||
set(source_path "${CMAKE_CURRENT_BINARY_DIR}/gamecontrollerdb.txt")
|
set(source_path "${CMAKE_CURRENT_BINARY_DIR}/gamecontrollerdb.txt")
|
||||||
set(template_path "${CMAKE_ARGV3}")
|
set(template_path "${CMAKE_ARGV3}")
|
||||||
@@ -22,24 +24,24 @@ if (status_code)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(STRINGS "${source_path}" lines)
|
file(STRINGS "${source_path}" lines)
|
||||||
foreach(line ${lines})
|
list(FILTER lines INCLUDE REGEX "^[0-9a-fA-F]")
|
||||||
if (line MATCHES "^[0-9a-fA-F]")
|
|
||||||
if (line MATCHES "platform:Windows")
|
foreach(line IN LISTS lines)
|
||||||
if (GLFW_WIN32_MAPPINGS)
|
if (line MATCHES "platform:Windows")
|
||||||
string(APPEND GLFW_WIN32_MAPPINGS "\n")
|
if (GLFW_WIN32_MAPPINGS)
|
||||||
endif()
|
string(APPEND GLFW_WIN32_MAPPINGS "\n")
|
||||||
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()
|
||||||
|
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()
|
endforeach()
|
||||||
|
|
||||||
|
|||||||
@@ -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 ()
|
|
||||||
+4
-33
@@ -1,14 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.4...3.28 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.16...3.28 FATAL_ERROR)
|
||||||
|
|
||||||
project(GLFW VERSION 3.4.0 LANGUAGES C)
|
project(GLFW VERSION 3.5.1 LANGUAGES C HOMEPAGE_URL "https://www.glfw.org/")
|
||||||
|
|
||||||
if (POLICY CMP0069)
|
|
||||||
cmake_policy(SET CMP0069 NEW)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (POLICY CMP0077)
|
|
||||||
cmake_policy(SET CMP0077 NEW)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
@@ -46,11 +38,7 @@ set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING
|
|||||||
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
||||||
|
|
||||||
if (GLFW_LIBRARY_TYPE)
|
if (GLFW_LIBRARY_TYPE)
|
||||||
if (GLFW_LIBRARY_TYPE STREQUAL "SHARED")
|
string(COMPARE EQUAL "${GLFW_LIBRARY_TYPE}" "SHARED" GLFW_BUILD_SHARED_LIBRARY)
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY TRUE)
|
|
||||||
else()
|
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY FALSE)
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||||
endif()
|
endif()
|
||||||
@@ -80,24 +68,7 @@ endif()
|
|||||||
# This is here because it also applies to tests and examples
|
# This is here because it also applies to tests and examples
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (MSVC AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
if (MSVC AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
||||||
if (CMAKE_VERSION VERSION_LESS 3.15)
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||||
foreach (flag CMAKE_C_FLAGS
|
|
||||||
CMAKE_C_FLAGS_DEBUG
|
|
||||||
CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL
|
|
||||||
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
||||||
|
|
||||||
if (flag MATCHES "/MD")
|
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
|
||||||
endif()
|
|
||||||
if (flag MATCHES "/MDd")
|
|
||||||
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
else()
|
|
||||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
|
|||||||
+22
-1
@@ -6,10 +6,12 @@ excludes other invaluable contributions like language bindings and text and
|
|||||||
video tutorials.
|
video tutorials.
|
||||||
|
|
||||||
- Bobyshev Alexander
|
- Bobyshev Alexander
|
||||||
|
- Alzathar
|
||||||
- Laurent Aphecetche
|
- Laurent Aphecetche
|
||||||
- Matt Arsenault
|
- Matt Arsenault
|
||||||
- Takuro Ashie
|
- Takuro Ashie
|
||||||
- ashishgamedev
|
- ashishgamedev
|
||||||
|
- avagordon01
|
||||||
- David Avedissian
|
- David Avedissian
|
||||||
- Luca Bacci
|
- Luca Bacci
|
||||||
- Keith Bauer
|
- Keith Bauer
|
||||||
@@ -23,6 +25,7 @@ video tutorials.
|
|||||||
- Denis Bernard
|
- Denis Bernard
|
||||||
- BiBi
|
- BiBi
|
||||||
- Doug Binks
|
- Doug Binks
|
||||||
|
- bitb4ker
|
||||||
- blanco
|
- blanco
|
||||||
- Waris Boonyasiriwat
|
- Waris Boonyasiriwat
|
||||||
- Kyle Brenneman
|
- Kyle Brenneman
|
||||||
@@ -33,6 +36,7 @@ video tutorials.
|
|||||||
- Nicolas Caramelli
|
- Nicolas Caramelli
|
||||||
- David Carlier
|
- David Carlier
|
||||||
- Arturo Castro
|
- Arturo Castro
|
||||||
|
- Jose Luis Cercós Pita
|
||||||
- Chi-kwan Chan
|
- Chi-kwan Chan
|
||||||
- Victor Chernyakin
|
- Victor Chernyakin
|
||||||
- TheChocolateOre
|
- TheChocolateOre
|
||||||
@@ -48,11 +52,15 @@ video tutorials.
|
|||||||
- Andrew Corrigan
|
- Andrew Corrigan
|
||||||
- Bailey Cosier
|
- Bailey Cosier
|
||||||
- Noel Cower
|
- Noel Cower
|
||||||
|
- James Cowgill
|
||||||
- CuriouserThing
|
- CuriouserThing
|
||||||
- Bill Currie
|
- Bill Currie
|
||||||
- Jason Daly
|
- Jason Daly
|
||||||
- danhambleton
|
- danhambleton
|
||||||
|
- danijel1023
|
||||||
- Jarrod Davis
|
- Jarrod Davis
|
||||||
|
- Aaron Day
|
||||||
|
- decce
|
||||||
- Olivier Delannoy
|
- Olivier Delannoy
|
||||||
- Paul R. Deppe
|
- Paul R. Deppe
|
||||||
- Michael Dickens
|
- Michael Dickens
|
||||||
@@ -65,14 +73,18 @@ video tutorials.
|
|||||||
- Robin Eklind
|
- Robin Eklind
|
||||||
- Jan Ekström
|
- Jan Ekström
|
||||||
- Siavash Eliasi
|
- Siavash Eliasi
|
||||||
|
- er-azh
|
||||||
|
- Jan Hendrik Farr
|
||||||
- Ahmad Fatoum
|
- Ahmad Fatoum
|
||||||
- Nikita Fediuchin
|
- Nikita Fediuchin
|
||||||
- Felipe Ferreira
|
- Felipe Ferreira
|
||||||
- Michael Fogleman
|
- Michael Fogleman
|
||||||
|
- Folling
|
||||||
- forworldm
|
- forworldm
|
||||||
- Jason Francis
|
- Jason Francis
|
||||||
- Gerald Franz
|
- Gerald Franz
|
||||||
- Mário Freitas
|
- Mário Freitas
|
||||||
|
- Friz64
|
||||||
- GeO4d
|
- GeO4d
|
||||||
- Marcus Geelnard
|
- Marcus Geelnard
|
||||||
- Gegy
|
- Gegy
|
||||||
@@ -88,6 +100,7 @@ video tutorials.
|
|||||||
- Andrew Gutekanst
|
- Andrew Gutekanst
|
||||||
- Stephen Gutekanst
|
- Stephen Gutekanst
|
||||||
- Jonathan Hale
|
- Jonathan Hale
|
||||||
|
- halx99
|
||||||
- Daniel Hauser
|
- Daniel Hauser
|
||||||
- hdf89shfdfs
|
- hdf89shfdfs
|
||||||
- Moritz Heinemann
|
- Moritz Heinemann
|
||||||
@@ -118,6 +131,7 @@ video tutorials.
|
|||||||
- Josh Kilmer
|
- Josh Kilmer
|
||||||
- Byunghoon Kim
|
- Byunghoon Kim
|
||||||
- Cameron King
|
- Cameron King
|
||||||
|
- knokko
|
||||||
- Peter Knut
|
- Peter Knut
|
||||||
- Christoph Kubisch
|
- Christoph Kubisch
|
||||||
- Yuri Kunde Schlesner
|
- Yuri Kunde Schlesner
|
||||||
@@ -153,8 +167,10 @@ video tutorials.
|
|||||||
- Bryce Mehring
|
- Bryce Mehring
|
||||||
- Jonathan Mercier
|
- Jonathan Mercier
|
||||||
- Marcel Metz
|
- Marcel Metz
|
||||||
|
- Lucas Michaudel
|
||||||
- Liam Middlebrook
|
- Liam Middlebrook
|
||||||
- mightgoyardstill
|
- mightgoyardstill
|
||||||
|
- Mihail
|
||||||
- Ave Milia
|
- Ave Milia
|
||||||
- Icyllis Milica
|
- Icyllis Milica
|
||||||
- Jonathan Miller
|
- Jonathan Miller
|
||||||
@@ -168,6 +184,7 @@ video tutorials.
|
|||||||
- Jon Morton
|
- Jon Morton
|
||||||
- Pierre Moulon
|
- Pierre Moulon
|
||||||
- Martins Mozeiko
|
- Martins Mozeiko
|
||||||
|
- Tomáš Mráz
|
||||||
- Pascal Muetschard
|
- Pascal Muetschard
|
||||||
- James Murphy
|
- James Murphy
|
||||||
- Julian Møller
|
- Julian Møller
|
||||||
@@ -214,6 +231,7 @@ video tutorials.
|
|||||||
- Philip Rideout
|
- Philip Rideout
|
||||||
- Eddie Ringle
|
- Eddie Ringle
|
||||||
- Max Risuhin
|
- Max Risuhin
|
||||||
|
- road2react
|
||||||
- Joe Roback
|
- Joe Roback
|
||||||
- Jorge Rodriguez
|
- Jorge Rodriguez
|
||||||
- Jari Ronkainen
|
- Jari Ronkainen
|
||||||
@@ -221,12 +239,13 @@ video tutorials.
|
|||||||
- Ed Ropple
|
- Ed Ropple
|
||||||
- Aleksey Rybalkin
|
- Aleksey Rybalkin
|
||||||
- Mikko Rytkönen
|
- Mikko Rytkönen
|
||||||
|
- saikyun
|
||||||
- Riku Salminen
|
- Riku Salminen
|
||||||
- Yoshinori Sano
|
- Yoshinori Sano
|
||||||
- Brandon Schaefer
|
- Brandon Schaefer
|
||||||
- Sebastian Schuberth
|
- Sebastian Schuberth
|
||||||
- Scr3amer
|
- Scr3amer
|
||||||
- Jan Schuerkamp
|
- Jan Schürkamp
|
||||||
- Christian Sdunek
|
- Christian Sdunek
|
||||||
- Matt Sealey
|
- Matt Sealey
|
||||||
- Steve Sexton
|
- Steve Sexton
|
||||||
@@ -275,10 +294,12 @@ video tutorials.
|
|||||||
- Corentin Wallez
|
- Corentin Wallez
|
||||||
- Torsten Walluhn
|
- Torsten Walluhn
|
||||||
- Patrick Walton
|
- Patrick Walton
|
||||||
|
- Ivor Wanders
|
||||||
- Jim Wang
|
- Jim Wang
|
||||||
- Xo Wang
|
- Xo Wang
|
||||||
- Andre Weissflog
|
- Andre Weissflog
|
||||||
- Jay Weisskopf
|
- Jay Weisskopf
|
||||||
|
- Drew Weymouth
|
||||||
- Frank Wille
|
- Frank Wille
|
||||||
- Andy Williams
|
- Andy Williams
|
||||||
- Joel Winarske
|
- Joel Winarske
|
||||||
|
|||||||
@@ -9,34 +9,28 @@ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan
|
|||||||
application development. It provides a simple, platform-independent API for
|
application development. It provides a simple, platform-independent API for
|
||||||
creating windows, contexts and surfaces, reading input, handling events, etc.
|
creating windows, contexts and surfaces, reading input, handling events, etc.
|
||||||
|
|
||||||
GLFW natively supports Windows, macOS and Linux and other Unix-like systems. On
|
GLFW is written primarily in C99, with parts of macOS support being written in
|
||||||
Linux both Wayland and X11 are supported.
|
Objective-C.
|
||||||
|
|
||||||
|
GLFW supports Windows, macOS and Linux, and also works on many other Unix-like
|
||||||
|
systems. On Linux both Wayland and X11 are supported.
|
||||||
|
|
||||||
GLFW is licensed under the [zlib/libpng
|
GLFW is licensed under the [zlib/libpng
|
||||||
license](https://www.glfw.org/license.html).
|
license](https://www.glfw.org/license.html).
|
||||||
|
|
||||||
You can [download](https://www.glfw.org/download.html) the latest stable release
|
You can [download](https://www.glfw.org/download.html) the latest stable release
|
||||||
as source or Windows binaries. Each release starting with 3.0 also has
|
as source or Windows and macOS binaries. There are [release
|
||||||
a corresponding [annotated tag](https://github.com/glfw/glfw/releases) with
|
tags](https://github.com/glfw/glfw/releases) with source and binary archives
|
||||||
source and binary archives.
|
attached for every version since 3.0.
|
||||||
|
|
||||||
The [documentation](https://www.glfw.org/docs/latest/) is available online and is
|
The [documentation](https://www.glfw.org/docs/latest/) is available online and is
|
||||||
included in all source and binary archives. See the [release
|
also included in source and binary archives, except those generated
|
||||||
notes](https://www.glfw.org/docs/latest/news.html) for new features, caveats and
|
automatically by Github. The documentation contains guides, a tutorial and the
|
||||||
deprecations in the latest release. For more details see the [version
|
API reference. The [release
|
||||||
history](https://www.glfw.org/changelog.html).
|
notes](https://www.glfw.org/docs/latest/news.html) list the new features,
|
||||||
|
caveats and deprecations in the latest release. The [version
|
||||||
The `master` branch is the stable integration branch and _should_ always compile
|
history](https://www.glfw.org/changelog.html) lists every user-visible change
|
||||||
and run on all supported platforms, although details of newly added features may
|
for every release.
|
||||||
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
|
|
||||||
[tutorial](https://www.glfw.org/docs/latest/quick.html) for GLFW 3 useful. If
|
|
||||||
you have used GLFW 2 in the past, there is a [transition
|
|
||||||
guide](https://www.glfw.org/docs/latest/moving.html) for moving to the GLFW
|
|
||||||
3 API.
|
|
||||||
|
|
||||||
GLFW exists because of the contributions of [many people](CONTRIBUTORS.md)
|
GLFW exists because of the contributions of [many people](CONTRIBUTORS.md)
|
||||||
around the world, whether by reporting bugs, providing community support, adding
|
around the world, whether by reporting bugs, providing community support, adding
|
||||||
@@ -44,57 +38,37 @@ features, reviewing or testing code, debugging, proofreading docs, suggesting
|
|||||||
features or fixing bugs.
|
features or fixing bugs.
|
||||||
|
|
||||||
|
|
||||||
## Compiling GLFW
|
|
||||||
|
|
||||||
GLFW is written primarily in C99, with parts of macOS support being written in
|
|
||||||
Objective-C. GLFW itself requires only the headers and libraries for your OS
|
|
||||||
and window system. It does not need any additional headers for context creation
|
|
||||||
APIs (WGL, GLX, EGL, NSGL, OSMesa) or rendering APIs (OpenGL, OpenGL ES, Vulkan)
|
|
||||||
to enable support for them.
|
|
||||||
|
|
||||||
GLFW supports compilation on Windows with Visual C++ 2013 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 binaries](https://www.glfw.org/download.html) available
|
|
||||||
for all supported compilers on Windows and macOS.
|
|
||||||
|
|
||||||
See the [compilation guide](https://www.glfw.org/docs/latest/compile.html) for
|
|
||||||
more information about how to compile GLFW yourself.
|
|
||||||
|
|
||||||
|
|
||||||
## Using GLFW
|
|
||||||
|
|
||||||
See the [documentation](https://www.glfw.org/docs/latest/) for tutorials, guides
|
|
||||||
and the API reference.
|
|
||||||
|
|
||||||
|
|
||||||
## Contributing to GLFW
|
|
||||||
|
|
||||||
See the [contribution
|
|
||||||
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
|
||||||
more information.
|
|
||||||
|
|
||||||
|
|
||||||
## System requirements
|
## System requirements
|
||||||
|
|
||||||
GLFW supports Windows XP and later and macOS 10.8 and later. Linux and other
|
GLFW supports Windows 7 and later and macOS 10.11 and later. On GNOME Wayland,
|
||||||
Unix-like systems running the X Window System are supported even without
|
window decorations will be very basic unless the
|
||||||
a desktop environment or modern extensions, although some features require
|
[libdecor](https://gitlab.freedesktop.org/libdecor/libdecor) package is
|
||||||
a running window or clipboard manager. The OSMesa backend requires Mesa 6.3.
|
installed. Linux and other Unix-like systems running X11 are supported even
|
||||||
|
without a desktop environment or modern extensions, although some features
|
||||||
|
require a clipboard manager or a modern window manager.
|
||||||
|
|
||||||
See the [compatibility guide](https://www.glfw.org/docs/latest/compat.html)
|
See the [compatibility guide](https://www.glfw.org/docs/latest/compat.html)
|
||||||
in the documentation for more information.
|
for more detailed information.
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Compiling GLFW
|
||||||
|
|
||||||
GLFW itself needs only CMake 3.1 or later and the headers and libraries for your
|
GLFW supports compilation with Visual C++ (2013 and later), GCC and Clang. Both
|
||||||
OS and window system.
|
Clang-CL and MinGW-w64 are supported. Other C99 compilers will likely also
|
||||||
|
work, but this is not regularly tested.
|
||||||
|
|
||||||
|
There are [pre-compiled binaries](https://www.glfw.org/download.html)
|
||||||
|
available for Windows and macOS.
|
||||||
|
|
||||||
|
GLFW itself needs only CMake and the headers and libraries for your operating
|
||||||
|
system and window system. No other SDKs are required.
|
||||||
|
|
||||||
|
See the [compilation guide](https://www.glfw.org/docs/latest/compile.html) for
|
||||||
|
more information about compiling GLFW and the exact dependencies required for
|
||||||
|
each window system.
|
||||||
|
|
||||||
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.
|
bundled in the `deps/` directory. The repository has no submodules.
|
||||||
|
|
||||||
- [getopt\_port](https://github.com/kimgr/getopt_port/) for examples
|
- [getopt\_port](https://github.com/kimgr/getopt_port/) for examples
|
||||||
with command-line options
|
with command-line options
|
||||||
@@ -107,8 +81,33 @@ located in the `deps/` directory.
|
|||||||
- [Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) for test and example UI
|
- [Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) for test and example UI
|
||||||
- [stb\_image\_write](https://github.com/nothings/stb) for writing images to disk
|
- [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 documentation is generated with [Doxygen](https://doxygen.org/) when the
|
||||||
find that tool.
|
library is built, provided CMake could find a sufficiently new version of it
|
||||||
|
during configuration.
|
||||||
|
|
||||||
|
|
||||||
|
## Using GLFW
|
||||||
|
|
||||||
|
See the [HTML documentation](https://www.glfw.org/docs/latest/) for a tutorial,
|
||||||
|
guides and the API reference.
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing to GLFW
|
||||||
|
|
||||||
|
See the [contribution
|
||||||
|
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
The `master` branch is the stable integration branch and _should_ always compile
|
||||||
|
and run on all supported platforms. Details of a newly added feature,
|
||||||
|
including the public API, may change until it has been included in a release.
|
||||||
|
|
||||||
|
The `latest` branch is equivalent to the [highest numbered](https://semver.org/)
|
||||||
|
release, although it may not always point to the same commit as the tag for that
|
||||||
|
release.
|
||||||
|
|
||||||
|
The `ci` branch is used to trigger continuous integration jobs for code under
|
||||||
|
testing and should never be relied on for any purpose.
|
||||||
|
|
||||||
|
|
||||||
## Reporting bugs
|
## Reporting bugs
|
||||||
@@ -119,326 +118,67 @@ guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
|||||||
information on what to include when reporting a bug.
|
information on what to include when reporting a bug.
|
||||||
|
|
||||||
|
|
||||||
## Changelog since 3.3.10
|
## Changelog since 3.5
|
||||||
|
|
||||||
- Added `GLFW_PLATFORM` init hint for runtime platform selection (#1958)
|
None.
|
||||||
- Added `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`,
|
|
||||||
`GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` and `GLFW_PLATFORM_NULL` symbols to
|
|
||||||
specify the desired platform (#1958)
|
|
||||||
- Added `glfwGetPlatform` function to query what platform was selected (#1655,#1958)
|
|
||||||
- Added `glfwPlatformSupported` function to query if a platform is supported
|
|
||||||
(#1655,#1958)
|
|
||||||
- Added `glfwInitAllocator` for setting a custom memory allocator (#544,#1628,#1947)
|
|
||||||
- Added `GLFWallocator` struct and `GLFWallocatefun`, `GLFWreallocatefun` and
|
|
||||||
`GLFWdeallocatefun` types (#544,#1628,#1947)
|
|
||||||
- Added `glfwGetWindowTitle` function for querying window title (#1448,#1909,#2482)
|
|
||||||
- Added `glfwInitVulkanLoader` for using a non-default Vulkan loader (#1374,#1890)
|
|
||||||
- Added `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR`,
|
|
||||||
`GLFW_RESIZE_ALL_CURSOR` and `GLFW_NOT_ALLOWED_CURSOR` cursor shapes (#427)
|
|
||||||
- Added `GLFW_RESIZE_EW_CURSOR` alias for `GLFW_HRESIZE_CURSOR` (#427)
|
|
||||||
- Added `GLFW_RESIZE_NS_CURSOR` alias for `GLFW_VRESIZE_CURSOR` (#427)
|
|
||||||
- Added `GLFW_POINTING_HAND_CURSOR` alias for `GLFW_HAND_CURSOR` (#427)
|
|
||||||
- Added `GLFW_MOUSE_PASSTHROUGH` window hint for letting mouse input pass
|
|
||||||
through the window (#1236,#1568)
|
|
||||||
- Added `GLFW_CURSOR_CAPTURED` cursor mode to confine the cursor to the window
|
|
||||||
content area (#58)
|
|
||||||
- Added `GLFW_POSITION_X` and `GLFW_POSITION_Y` window hints for initial position
|
|
||||||
(#1603,#1747)
|
|
||||||
- Added `GLFW_SCALE_FRAMEBUFFER` window hint for Wayland and macOS scaling (#2457)
|
|
||||||
- Added `GLFW_ANY_POSITION` hint value for letting the window manager choose (#1603,#1747)
|
|
||||||
- Added `GLFW_PLATFORM_UNAVAILABLE` error for platform detection failures (#1958)
|
|
||||||
- Added `GLFW_FEATURE_UNAVAILABLE` error for platform limitations (#1692)
|
|
||||||
- Added `GLFW_FEATURE_UNIMPLEMENTED` error for incomplete backends (#1692)
|
|
||||||
- Added `GLFW_WAYLAND_APP_ID` window hint string for Wayland app\_id selection
|
|
||||||
(#2121,#2122)
|
|
||||||
- Added `GLFW_ANGLE_PLATFORM_TYPE` init hint and `GLFW_ANGLE_PLATFORM_TYPE_*`
|
|
||||||
values to select ANGLE backend (#1380)
|
|
||||||
- Added `GLFW_X11_XCB_VULKAN_SURFACE` init hint for selecting X11 Vulkan
|
|
||||||
surface extension (#1793)
|
|
||||||
- Added `GLFW_WIN32_KEYBOARD_MENU` window hint for enabling access to the window menu
|
|
||||||
- Added `GLFW_WIN32_SHOWDEFAULT` window hint for applying the parent process
|
|
||||||
show command (#2359)
|
|
||||||
- Added `GLFW_NATIVE_INCLUDE_NONE` for disabling inclusion of native headers (#1348)
|
|
||||||
- Added `GLFW_BUILD_WIN32` CMake option for enabling Win32 support (#1958)
|
|
||||||
- Added `GLFW_BUILD_COCOA` CMake option for enabling Cocoa support (#1958)
|
|
||||||
- Added `GLFW_BUILD_X11` CMake option for enabling X11 support (#1958)
|
|
||||||
- Added `GLFW_LIBRARY_TYPE` CMake variable for overriding the library type
|
|
||||||
(#279,#1307,#1497,#1574,#1928)
|
|
||||||
- Added support for `XDG_SESSION_TYPE` environment variable
|
|
||||||
- Added `GLFW_PKG_CONFIG_REQUIRES_PRIVATE` and `GLFW_PKG_CONFIG_LIBS_PRIVATE` CMake
|
|
||||||
variables exposing pkg-config dependencies (#1307)
|
|
||||||
- Made joystick subsystem initialize at first use (#1284,#1646)
|
|
||||||
- Made `GLFW_DOUBLEBUFFER` a read-only window attribute
|
|
||||||
- Made Wayland the preferred platform over X11 if both are available (#2035)
|
|
||||||
- Updated the minimum required CMake version to 3.4
|
|
||||||
- Updated gamepad mappings from upstream
|
|
||||||
- Renamed `GLFW_USE_WAYLAND` CMake option to `GLFW_BUILD_WAYLAND` (#1958)
|
|
||||||
- Disabled tests and examples by default when built as a CMake subdirectory
|
|
||||||
- Removed `GLFW_USE_OSMESA` CMake option enabling the Null platform (#1958)
|
|
||||||
- Removed CMake generated configuration header
|
|
||||||
- Bugfix: `glfwGetVideoMode` returned an invalid mode on error (#1292)
|
|
||||||
- [Win32] Added a version info resource to the GLFW DLL
|
|
||||||
- [Win32] Made hidden helper window use its own window class
|
|
||||||
- [Win32] Bugfix: The foreground lock timeout was overridden, ignoring the user
|
|
||||||
- [Cocoa] Added `glfwGetCocoaView` native access function (#2235)
|
|
||||||
- [Cocoa] Moved main menu creation to GLFW initialization time (#1649)
|
|
||||||
- [Cocoa] Bugfix: Touching event queue from secondary thread before main thread
|
|
||||||
would abort (#1649)
|
|
||||||
- [Wayland] Added support for `glfwRequestWindowAttention` (#2287)
|
|
||||||
- [Wayland] Added support for `glfwFocusWindow`
|
|
||||||
- [Wayland] Added support for `GLFW_RESIZABLE` (#2203)
|
|
||||||
- [Wayland] Added support for fractional scaling of window contents
|
|
||||||
- [Wayland] Added dynamic loading of all Wayland libraries
|
|
||||||
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
|
|
||||||
- [Wayland] Bugfix: `GLFW_HOVERED` was true when the cursor was over any
|
|
||||||
fallback window decoration
|
|
||||||
- [Wayland] Bugfix: Fallback decorations allowed resizing to invalid size
|
|
||||||
(#2204)
|
|
||||||
- [X11] Bugfix: Termination would segfault if the IM had been destroyed
|
|
||||||
- [X11] Bugfix: Any IM started after initialization would not be detected
|
|
||||||
- [Linux] Bugfix: Joystick evdev fds remained open in forks (#2446)
|
|
||||||
- [POSIX] Removed use of deprecated function `gettimeofday`
|
|
||||||
- [POSIX] Bugfix: `CLOCK_MONOTONIC` was not correctly tested for or enabled
|
|
||||||
- [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: A core profile OpenGL context was returned if 3.2+
|
|
||||||
compatibility profile was requested
|
|
||||||
- [EGL] Added platform selection via the `EGL_EXT_platform_base` extension
|
|
||||||
(#442)
|
|
||||||
- [EGL] Added ANGLE backend selection via `EGL_ANGLE_platform_angle` extension
|
|
||||||
(#1380)
|
|
||||||
|
|
||||||
|
## Changelog since 3.4
|
||||||
|
|
||||||
## Changelog since 3.3
|
- Added `GLFW_UNLIMITED_MOUSE_BUTTONS` input mode that allows mouse buttons beyond
|
||||||
|
the limit of the mouse button tokens to be reported (#2423)
|
||||||
- Added `GLFW_WAYLAND_LIBDECOR` init hint for disabling libdecor support (#1639,#1693)
|
- Added `glfwGetEGLConfig` function to query the `EGLConfig` of a window (#2045)
|
||||||
- Bugfix: The CMake config-file package used an absolute path and was not
|
- Added `glfwGetGLXFBConfig` function to query the `GLXFBConfig` of a window (#1925)
|
||||||
relocatable (#1470)
|
- Updated minimum CMake version to 3.16 (#2541)
|
||||||
- Bugfix: Video modes with a duplicate screen area were discarded (#1555,#1556)
|
- Removed support for building with original MinGW (#2540)
|
||||||
- Bugfix: Compiling with -Wextra-semi caused warnings (#1440)
|
- [Win32] Removed support for Windows XP and Vista (#2505)
|
||||||
- Bugfix: Built-in mappings failed because some OEMs re-used VID/PID (#1583)
|
- [Win32] Bugfix: Media keys were reported with a scancode of 256 (#1768,#2417,#2625)
|
||||||
- Bugfix: Some extension loader headers did not prevent default OpenGL header
|
- [Cocoa] Added `QuartzCore` framework as link-time dependency
|
||||||
inclusion (#1695)
|
- [Cocoa] Removed support for OS X 10.10 Yosemite and earlier (#2506)
|
||||||
- Bugfix: Buffers were swapped at creation on single-buffered windows (#1873)
|
- [Cocoa] Bugfix: Cmd+Period, Ctrl+Tab and Ctrl+Esc key events were not emitted
|
||||||
- Bugfix: Gamepad mapping updates could spam `GLFW_INVALID_VALUE` due to
|
(#1362,#2278)
|
||||||
incompatible controllers sharing hardware ID (#1763)
|
- [Wayland] Bugfix: The fractional scaling related objects were not destroyed
|
||||||
- Bugfix: Native access functions for context handles did not check that the API matched
|
- [Wayland] Bugfix: `glfwInit` would segfault on compositor with no seat (#2517)
|
||||||
- Bugfix: `glfwMakeContextCurrent` would access TLS slot before initialization
|
- [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault
|
||||||
- Bugfix: `glfwSetGammaRamp` could emit `GLFW_INVALID_VALUE` before initialization
|
- [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727)
|
||||||
- Bugfix: `glfwGetJoystickUserPointer` returned `NULL` during disconnection (#2092)
|
- [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727)
|
||||||
- Bugfix: `glfwGetKeyScancode` returned `0` on error when initialized instead of `-1`
|
- [Wayland] Bugfix: Memory would leak if reading a data offer failed midway
|
||||||
- Bugfix: Failure to make a newly created context current could cause segfault (#2327)
|
- [Wayland] Bugfix: Retrieved cursor position would be incorrect when hovering over
|
||||||
- [Win32] Disabled framebuffer transparency on Windows 7 when DWM windows are
|
fallback decorations
|
||||||
opaque (#1512)
|
- [Wayland] Bugfix: Fallback decorations would report scroll events
|
||||||
- [Win32] Bugfix: `GLFW_INCLUDE_VULKAN` plus `VK_USE_PLATFORM_WIN32_KHR` caused
|
- [Wayland] Bugfix: Keyboard repeat events halted when any key is released (#2568)
|
||||||
symbol redefinition (#1524)
|
- [Wayland] Bugfix: Fallback decorations would show menu at wrong position
|
||||||
- [Win32] Bugfix: The cursor position event was emitted before its cursor enter
|
- [Wayland] Bugfix: The cursor was not updated when clicking through from
|
||||||
event (#1490)
|
a modal to a fallback decoration
|
||||||
- [Win32] Bugfix: The window hint `GLFW_MAXIMIZED` did not move or resize the
|
- [Wayland] Bugfix: The cursor position was not updated when clicking through
|
||||||
window (#1499)
|
from a modal to the content area
|
||||||
- [Win32] Bugfix: Disabled cursor mode interfered with some non-client actions
|
- [Wayland] Bugfix: free modules at end of terminate function to resolve
|
||||||
- [Win32] Bugfix: Super key was not released after Win+V hotkey (#1622)
|
potential segmentation fault (#2744)
|
||||||
- [Win32] Bugfix: `glfwGetKeyName` could access out of bounds and return an
|
- [Wayland] Bugfix: Confining or disabling the cursor could segfault on
|
||||||
invalid pointer
|
compositors without `pointer-constraints-unstable-v1`
|
||||||
- [Win32] Bugfix: Some synthetic key events were reported as `GLFW_KEY_UNKNOWN`
|
- [Wayland] Bugfix: Key repeat did not function on very old compositors
|
||||||
(#1623)
|
- [Wayland] Bugfix: The `libwayland-client` library was not unloaded at termination
|
||||||
- [Win32] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
|
- [Wayland] Bugfix: Scroll events were sent twice on some versions of GNOME (#2494)
|
||||||
- [Win32] Bugfix: Monitor functions could return invalid values after
|
- [Wayland] Bugfix: Two-dimensional scroll input was emitted as separate axes
|
||||||
configuration change (#1761)
|
- [Wayland] Bugfix: Mouse wheel scroll distance was incorrect on some compositors
|
||||||
- [Win32] Bugfix: Initialization would segfault on Windows 8 (not 8.1) (#1775)
|
- [Wayland] Bugfix: `glfwSwapBuffers` would halt with nonzero swap interval when window
|
||||||
- [Win32] Bugfix: Duplicate size events were not filtered (#1610)
|
was suspended (#1350,#2582,#2640,#2719,#2723,#2800,#2827)
|
||||||
- [Win32] Bugfix: Full screen windows were incorrectly resized by DPI changes
|
- [Wayland] Bugfix: `glfwPostEmptyEvent` would leak a callback proxy (#2836)
|
||||||
(#1582)
|
- [Wayland] Bugfix: `glfwHideWindow` did not always send its request immediately
|
||||||
- [Win32] Bugfix: `GLFW_SCALE_TO_MONITOR` had no effect on systems older than
|
- [Wayland] Bugfix: Some event types were not always processed by `glfwPollEvents` or
|
||||||
Windows 10 version 1703 (#1511)
|
`glfwWait*Events` (#2793,#2795)
|
||||||
- [Win32] Bugfix: `USE_MSVC_RUNTIME_LIBRARY_DLL` had no effect on CMake 3.15 or
|
- [Wayland] Bugfix: Scaled framebuffer size was sometimes incorect (#2713,#2810)
|
||||||
later (#1783,#1796)
|
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
|
||||||
- [Win32] Bugfix: Compilation with LLVM for Windows failed (#1807,#1824,#1874)
|
- [X11] Bugfix: Occasional crash when an idle display awakes (#2766)
|
||||||
- [Win32] Bugfix: Content scale queries could fail silently (#1615)
|
- [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale
|
||||||
- [Win32] Bugfix: Content scales could have garbage values if monitor was recently
|
less than 1 (#2754)
|
||||||
disconnected (#1615)
|
- [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit
|
||||||
- [Win32] Bugfix: A window created maximized and undecorated would cover the whole
|
- [X11] Bugfix: Floating windows silently became non-floating when hidden (#2276)
|
||||||
monitor (#1806)
|
- [X11] Bugfix: The `libXext` library was not unloaded at termination
|
||||||
- [Win32] Bugfix: The default restored window position was lost when creating a maximized
|
- [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778)
|
||||||
window
|
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
||||||
- [Win32] Bugfix: `glfwMaximizeWindow` would make a hidden window visible
|
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
||||||
- [Win32] Bugfix: `Alt+PrtSc` would emit `GLFW_KEY_UNKNOWN` and a different
|
- [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to
|
||||||
scancode than `PrtSc` (#1993)
|
`GLFW_NATIVE_CONTEXT_API` (#2518)
|
||||||
- [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)
|
|
||||||
- [Win32] Bugfix: `glfwWaitEventsTimeout` did not return for some sent messages (#2408)
|
|
||||||
- [Win32] Bugfix: Fix pkg-config for dynamic library on Windows (#2386, #2420)
|
|
||||||
- [Win32] Bugfix: XInput could reportedly provide invalid DPad bit masks (#2291)
|
|
||||||
- [Win32] Bugfix: Rapid clipboard calls could fail due to Clipboard History
|
|
||||||
- [Win32] Bugfix: Disabled cursor mode doesn't work right when connected over RDP (#1276,#1279,#2431)
|
|
||||||
- [Cocoa] Added support for `VK_EXT_metal_surface` (#1619)
|
|
||||||
- [Cocoa] Added locating the Vulkan loader at runtime in an application bundle
|
|
||||||
- [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: 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)
|
|
||||||
- [Cocoa] Bugfix: Compilation failed on OS X 10.8 due to unconditional use of 10.9+
|
|
||||||
symbols (#2161)
|
|
||||||
- [Cocoa] Bugfix: Querying joystick elements could reportedly segfault on macOS
|
|
||||||
13 Ventura (#2320)
|
|
||||||
- [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: 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 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: 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)
|
|
||||||
- [Wayland] Bugfix: Fallback decorations emitted `GLFW_CURSOR_UNAVAILABLE` errors
|
|
||||||
- [Linux] Bugfix: Joysticks without buttons were ignored (#2042,#2043)
|
|
||||||
- [Linux] Bugfix: A small amount of memory could leak if initialization failed (#2229)
|
|
||||||
- [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 loading of glvnd `libOpenGL.so.0` where available for OpenGL
|
|
||||||
- [EGL] Bugfix: The `GLFW_DOUBLEBUFFER` context attribute was ignored (#1843)
|
|
||||||
- [EGL] Bugfix: Setting `GLFW_CONTEXT_DEBUG` caused creation to fail (#2348)
|
|
||||||
- [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
|
||||||
|
|||||||
Vendored
-117
@@ -1,117 +0,0 @@
|
|||||||
/**
|
|
||||||
* This file has no copyright assigned and is placed in the Public Domain.
|
|
||||||
* This file is part of the mingw-w64 runtime package.
|
|
||||||
* No warranty is given; refer to the file DISCLAIMER within this package.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS)
|
|
||||||
#define NONAMELESSUNION 1
|
|
||||||
#endif
|
|
||||||
#if defined(NONAMELESSSTRUCT) && \
|
|
||||||
!defined(NONAMELESSUNION)
|
|
||||||
#define NONAMELESSUNION 1
|
|
||||||
#endif
|
|
||||||
#if defined(NONAMELESSUNION) && \
|
|
||||||
!defined(NONAMELESSSTRUCT)
|
|
||||||
#define NONAMELESSSTRUCT 1
|
|
||||||
#endif
|
|
||||||
#if !defined(__GNU_EXTENSION)
|
|
||||||
#if defined(__GNUC__) || defined(__GNUG__)
|
|
||||||
#define __GNU_EXTENSION __extension__
|
|
||||||
#else
|
|
||||||
#define __GNU_EXTENSION
|
|
||||||
#endif
|
|
||||||
#endif /* __extension__ */
|
|
||||||
|
|
||||||
#ifndef __ANONYMOUS_DEFINED
|
|
||||||
#define __ANONYMOUS_DEFINED
|
|
||||||
#if defined(__GNUC__) || defined(__GNUG__)
|
|
||||||
#define _ANONYMOUS_UNION __extension__
|
|
||||||
#define _ANONYMOUS_STRUCT __extension__
|
|
||||||
#else
|
|
||||||
#define _ANONYMOUS_UNION
|
|
||||||
#define _ANONYMOUS_STRUCT
|
|
||||||
#endif
|
|
||||||
#ifndef NONAMELESSUNION
|
|
||||||
#define _UNION_NAME(x)
|
|
||||||
#define _STRUCT_NAME(x)
|
|
||||||
#else /* NONAMELESSUNION */
|
|
||||||
#define _UNION_NAME(x) x
|
|
||||||
#define _STRUCT_NAME(x) x
|
|
||||||
#endif
|
|
||||||
#endif /* __ANONYMOUS_DEFINED */
|
|
||||||
|
|
||||||
#ifndef DUMMYUNIONNAME
|
|
||||||
# ifdef NONAMELESSUNION
|
|
||||||
# define DUMMYUNIONNAME u
|
|
||||||
# define DUMMYUNIONNAME1 u1 /* Wine uses this variant */
|
|
||||||
# define DUMMYUNIONNAME2 u2
|
|
||||||
# define DUMMYUNIONNAME3 u3
|
|
||||||
# define DUMMYUNIONNAME4 u4
|
|
||||||
# define DUMMYUNIONNAME5 u5
|
|
||||||
# define DUMMYUNIONNAME6 u6
|
|
||||||
# define DUMMYUNIONNAME7 u7
|
|
||||||
# define DUMMYUNIONNAME8 u8
|
|
||||||
# define DUMMYUNIONNAME9 u9
|
|
||||||
# else /* NONAMELESSUNION */
|
|
||||||
# define DUMMYUNIONNAME
|
|
||||||
# define DUMMYUNIONNAME1 /* Wine uses this variant */
|
|
||||||
# define DUMMYUNIONNAME2
|
|
||||||
# define DUMMYUNIONNAME3
|
|
||||||
# define DUMMYUNIONNAME4
|
|
||||||
# define DUMMYUNIONNAME5
|
|
||||||
# define DUMMYUNIONNAME6
|
|
||||||
# define DUMMYUNIONNAME7
|
|
||||||
# define DUMMYUNIONNAME8
|
|
||||||
# define DUMMYUNIONNAME9
|
|
||||||
# endif
|
|
||||||
#endif /* DUMMYUNIONNAME */
|
|
||||||
|
|
||||||
#if !defined(DUMMYUNIONNAME1) /* MinGW does not define this one */
|
|
||||||
# ifdef NONAMELESSUNION
|
|
||||||
# define DUMMYUNIONNAME1 u1 /* Wine uses this variant */
|
|
||||||
# else
|
|
||||||
# define DUMMYUNIONNAME1 /* Wine uses this variant */
|
|
||||||
# endif
|
|
||||||
#endif /* DUMMYUNIONNAME1 */
|
|
||||||
|
|
||||||
#ifndef DUMMYSTRUCTNAME
|
|
||||||
# ifdef NONAMELESSUNION
|
|
||||||
# define DUMMYSTRUCTNAME s
|
|
||||||
# define DUMMYSTRUCTNAME1 s1 /* Wine uses this variant */
|
|
||||||
# define DUMMYSTRUCTNAME2 s2
|
|
||||||
# define DUMMYSTRUCTNAME3 s3
|
|
||||||
# define DUMMYSTRUCTNAME4 s4
|
|
||||||
# define DUMMYSTRUCTNAME5 s5
|
|
||||||
# else
|
|
||||||
# define DUMMYSTRUCTNAME
|
|
||||||
# define DUMMYSTRUCTNAME1 /* Wine uses this variant */
|
|
||||||
# define DUMMYSTRUCTNAME2
|
|
||||||
# define DUMMYSTRUCTNAME3
|
|
||||||
# define DUMMYSTRUCTNAME4
|
|
||||||
# define DUMMYSTRUCTNAME5
|
|
||||||
# endif
|
|
||||||
#endif /* DUMMYSTRUCTNAME */
|
|
||||||
|
|
||||||
/* These are for compatibility with the Wine source tree */
|
|
||||||
|
|
||||||
#ifndef WINELIB_NAME_AW
|
|
||||||
# ifdef __MINGW_NAME_AW
|
|
||||||
# define WINELIB_NAME_AW __MINGW_NAME_AW
|
|
||||||
# else
|
|
||||||
# ifdef UNICODE
|
|
||||||
# define WINELIB_NAME_AW(func) func##W
|
|
||||||
# else
|
|
||||||
# define WINELIB_NAME_AW(func) func##A
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif /* WINELIB_NAME_AW */
|
|
||||||
|
|
||||||
#ifndef DECL_WINELIB_TYPE_AW
|
|
||||||
# ifdef __MINGW_TYPEDEF_AW
|
|
||||||
# define DECL_WINELIB_TYPE_AW __MINGW_TYPEDEF_AW
|
|
||||||
# else
|
|
||||||
# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type;
|
|
||||||
# endif
|
|
||||||
#endif /* DECL_WINELIB_TYPE_AW */
|
|
||||||
|
|
||||||
Vendored
-2467
File diff suppressed because it is too large
Load Diff
Vendored
-239
@@ -1,239 +0,0 @@
|
|||||||
/*
|
|
||||||
* The Wine project - Xinput Joystick Library
|
|
||||||
* Copyright 2008 Andrew Fenn
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __WINE_XINPUT_H
|
|
||||||
#define __WINE_XINPUT_H
|
|
||||||
|
|
||||||
#include <windef.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bitmasks for the joysticks buttons, determines what has
|
|
||||||
* been pressed on the joystick, these need to be mapped
|
|
||||||
* to whatever device you're using instead of an xbox 360
|
|
||||||
* joystick
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_UP 0x0001
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_DOWN 0x0002
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_LEFT 0x0004
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_RIGHT 0x0008
|
|
||||||
#define XINPUT_GAMEPAD_START 0x0010
|
|
||||||
#define XINPUT_GAMEPAD_BACK 0x0020
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_THUMB 0x0040
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_THUMB 0x0080
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
|
|
||||||
#define XINPUT_GAMEPAD_A 0x1000
|
|
||||||
#define XINPUT_GAMEPAD_B 0x2000
|
|
||||||
#define XINPUT_GAMEPAD_X 0x4000
|
|
||||||
#define XINPUT_GAMEPAD_Y 0x8000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the flags used to determine if the user is pushing
|
|
||||||
* down on a button, not holding a button, etc
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XINPUT_KEYSTROKE_KEYDOWN 0x0001
|
|
||||||
#define XINPUT_KEYSTROKE_KEYUP 0x0002
|
|
||||||
#define XINPUT_KEYSTROKE_REPEAT 0x0004
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the codes which are returned by XInputGetKeystroke
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define VK_PAD_A 0x5800
|
|
||||||
#define VK_PAD_B 0x5801
|
|
||||||
#define VK_PAD_X 0x5802
|
|
||||||
#define VK_PAD_Y 0x5803
|
|
||||||
#define VK_PAD_RSHOULDER 0x5804
|
|
||||||
#define VK_PAD_LSHOULDER 0x5805
|
|
||||||
#define VK_PAD_LTRIGGER 0x5806
|
|
||||||
#define VK_PAD_RTRIGGER 0x5807
|
|
||||||
#define VK_PAD_DPAD_UP 0x5810
|
|
||||||
#define VK_PAD_DPAD_DOWN 0x5811
|
|
||||||
#define VK_PAD_DPAD_LEFT 0x5812
|
|
||||||
#define VK_PAD_DPAD_RIGHT 0x5813
|
|
||||||
#define VK_PAD_START 0x5814
|
|
||||||
#define VK_PAD_BACK 0x5815
|
|
||||||
#define VK_PAD_LTHUMB_PRESS 0x5816
|
|
||||||
#define VK_PAD_RTHUMB_PRESS 0x5817
|
|
||||||
#define VK_PAD_LTHUMB_UP 0x5820
|
|
||||||
#define VK_PAD_LTHUMB_DOWN 0x5821
|
|
||||||
#define VK_PAD_LTHUMB_RIGHT 0x5822
|
|
||||||
#define VK_PAD_LTHUMB_LEFT 0x5823
|
|
||||||
#define VK_PAD_LTHUMB_UPLEFT 0x5824
|
|
||||||
#define VK_PAD_LTHUMB_UPRIGHT 0x5825
|
|
||||||
#define VK_PAD_LTHUMB_DOWNRIGHT 0x5826
|
|
||||||
#define VK_PAD_LTHUMB_DOWNLEFT 0x5827
|
|
||||||
#define VK_PAD_RTHUMB_UP 0x5830
|
|
||||||
#define VK_PAD_RTHUMB_DOWN 0x5831
|
|
||||||
#define VK_PAD_RTHUMB_RIGHT 0x5832
|
|
||||||
#define VK_PAD_RTHUMB_LEFT 0x5833
|
|
||||||
#define VK_PAD_RTHUMB_UPLEFT 0x5834
|
|
||||||
#define VK_PAD_RTHUMB_UPRIGHT 0x5835
|
|
||||||
#define VK_PAD_RTHUMB_DOWNRIGHT 0x5836
|
|
||||||
#define VK_PAD_RTHUMB_DOWNLEFT 0x5837
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deadzones are for analogue joystick controls on the joypad
|
|
||||||
* which determine when input should be assumed to be in the
|
|
||||||
* middle of the pad. This is a threshold to stop a joypad
|
|
||||||
* controlling the game when the player isn't touching the
|
|
||||||
* controls.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
|
|
||||||
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines what type of abilities the type of joystick has
|
|
||||||
* DEVTYPE_GAMEPAD is available for all joysticks, however
|
|
||||||
* there may be more specific identifiers for other joysticks
|
|
||||||
* which are being used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XINPUT_DEVTYPE_GAMEPAD 0x01
|
|
||||||
#define XINPUT_DEVSUBTYPE_GAMEPAD 0x01
|
|
||||||
#define XINPUT_DEVSUBTYPE_WHEEL 0x02
|
|
||||||
#define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03
|
|
||||||
#define XINPUT_DEVSUBTYPE_FLIGHT_SICK 0x04
|
|
||||||
#define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
|
|
||||||
#define XINPUT_DEVSUBTYPE_GUITAR 0x06
|
|
||||||
#define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are used with the XInputGetCapabilities function to
|
|
||||||
* determine the abilities to the joystick which has been
|
|
||||||
* plugged in.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XINPUT_CAPS_VOICE_SUPPORTED 0x0004
|
|
||||||
#define XINPUT_FLAG_GAMEPAD 0x00000001
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the status of the battery if one is used in the
|
|
||||||
* attached joystick. The first two define if the joystick
|
|
||||||
* supports a battery. Disconnected means that the joystick
|
|
||||||
* isn't connected. Wired shows that the joystick is a wired
|
|
||||||
* joystick.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BATTERY_DEVTYPE_GAMEPAD 0x00
|
|
||||||
#define BATTERY_DEVTYPE_HEADSET 0x01
|
|
||||||
#define BATTERY_TYPE_DISCONNECTED 0x00
|
|
||||||
#define BATTERY_TYPE_WIRED 0x01
|
|
||||||
#define BATTERY_TYPE_ALKALINE 0x02
|
|
||||||
#define BATTERY_TYPE_NIMH 0x03
|
|
||||||
#define BATTERY_TYPE_UNKNOWN 0xFF
|
|
||||||
#define BATTERY_LEVEL_EMPTY 0x00
|
|
||||||
#define BATTERY_LEVEL_LOW 0x01
|
|
||||||
#define BATTERY_LEVEL_MEDIUM 0x02
|
|
||||||
#define BATTERY_LEVEL_FULL 0x03
|
|
||||||
|
|
||||||
/*
|
|
||||||
* How many joysticks can be used with this library. Games that
|
|
||||||
* use the xinput library will not go over this number.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define XUSER_MAX_COUNT 4
|
|
||||||
#define XUSER_INDEX_ANY 0x000000FF
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the structure of an xbox 360 joystick.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _XINPUT_GAMEPAD {
|
|
||||||
WORD wButtons;
|
|
||||||
BYTE bLeftTrigger;
|
|
||||||
BYTE bRightTrigger;
|
|
||||||
SHORT sThumbLX;
|
|
||||||
SHORT sThumbLY;
|
|
||||||
SHORT sThumbRX;
|
|
||||||
SHORT sThumbRY;
|
|
||||||
} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_STATE {
|
|
||||||
DWORD dwPacketNumber;
|
|
||||||
XINPUT_GAMEPAD Gamepad;
|
|
||||||
} XINPUT_STATE, *PXINPUT_STATE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the structure of how much vibration is set on both the
|
|
||||||
* right and left motors in a joystick. If you're not using a 360
|
|
||||||
* joystick you will have to map these to your device.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _XINPUT_VIBRATION {
|
|
||||||
WORD wLeftMotorSpeed;
|
|
||||||
WORD wRightMotorSpeed;
|
|
||||||
} XINPUT_VIBRATION, *PXINPUT_VIBRATION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the structure for what kind of abilities the joystick has
|
|
||||||
* such abilities are things such as if the joystick has the ability
|
|
||||||
* to send and receive audio, if the joystick is in fact a driving
|
|
||||||
* wheel or perhaps if the joystick is some kind of dance pad or
|
|
||||||
* guitar.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _XINPUT_CAPABILITIES {
|
|
||||||
BYTE Type;
|
|
||||||
BYTE SubType;
|
|
||||||
WORD Flags;
|
|
||||||
XINPUT_GAMEPAD Gamepad;
|
|
||||||
XINPUT_VIBRATION Vibration;
|
|
||||||
} XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the structure for a joystick input event which is
|
|
||||||
* retrieved using the function XInputGetKeystroke
|
|
||||||
*/
|
|
||||||
typedef struct _XINPUT_KEYSTROKE {
|
|
||||||
WORD VirtualKey;
|
|
||||||
WCHAR Unicode;
|
|
||||||
WORD Flags;
|
|
||||||
BYTE UserIndex;
|
|
||||||
BYTE HidCode;
|
|
||||||
} XINPUT_KEYSTROKE, *PXINPUT_KEYSTROKE;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_BATTERY_INFORMATION
|
|
||||||
{
|
|
||||||
BYTE BatteryType;
|
|
||||||
BYTE BatteryLevel;
|
|
||||||
} XINPUT_BATTERY_INFORMATION, *PXINPUT_BATTERY_INFORMATION;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void WINAPI XInputEnable(WINBOOL);
|
|
||||||
DWORD WINAPI XInputSetState(DWORD, XINPUT_VIBRATION*);
|
|
||||||
DWORD WINAPI XInputGetState(DWORD, XINPUT_STATE*);
|
|
||||||
DWORD WINAPI XInputGetKeystroke(DWORD, DWORD, PXINPUT_KEYSTROKE);
|
|
||||||
DWORD WINAPI XInputGetCapabilities(DWORD, DWORD, XINPUT_CAPABILITIES*);
|
|
||||||
DWORD WINAPI XInputGetDSoundAudioDeviceGuids(DWORD, GUID*, GUID*);
|
|
||||||
DWORD WINAPI XInputGetBatteryInformation(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __WINE_XINPUT_H */
|
|
||||||
Vendored
+5
@@ -423,6 +423,11 @@ NK_STATIC_ASSERT(sizeof(nk_rune) >= 4);
|
|||||||
NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*));
|
NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*));
|
||||||
NK_STATIC_ASSERT(sizeof(nk_ptr) >= sizeof(void*));
|
NK_STATIC_ASSERT(sizeof(nk_ptr) >= sizeof(void*));
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
/* disable `operands are different enum types` warning on MSVC */
|
||||||
|
#pragma warning( disable: 5287 )
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ============================================================================
|
/* ============================================================================
|
||||||
*
|
*
|
||||||
* API
|
* API
|
||||||
|
|||||||
+8
-4
@@ -1,4 +1,8 @@
|
|||||||
|
|
||||||
|
# Because of bugs and limitations in its Markdown support, only fairly recent
|
||||||
|
# versions of Doxygen can produce acceptable output
|
||||||
|
set(MINIMUM_DOXYGEN_VERSION 1.9.8)
|
||||||
|
|
||||||
# NOTE: The order of this list determines the order of items in the Guides
|
# NOTE: The order of this list determines the order of items in the Guides
|
||||||
# (i.e. Pages) list in the generated documentation
|
# (i.e. Pages) list in the generated documentation
|
||||||
set(source_files
|
set(source_files
|
||||||
@@ -32,10 +36,10 @@ foreach(file IN LISTS source_files)
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
set(DOXYGEN_SKIP_DOT TRUE)
|
set(DOXYGEN_SKIP_DOT TRUE)
|
||||||
find_package(Doxygen)
|
find_package(Doxygen ${MINIMUM_DOXYGEN_VERSION} QUIET)
|
||||||
|
|
||||||
if (NOT DOXYGEN_FOUND OR DOXYGEN_VERSION VERSION_LESS "1.9.8")
|
if (NOT DOXYGEN_FOUND)
|
||||||
message(STATUS "Documentation generation requires Doxygen 1.9.8 or later")
|
message(STATUS "Documentation generation requires Doxygen ${MINIMUM_DOXYGEN_VERSION} or later")
|
||||||
else()
|
else()
|
||||||
configure_file(Doxyfile.in Doxyfile @ONLY)
|
configure_file(Doxyfile.in Doxyfile @ONLY)
|
||||||
add_custom_command(OUTPUT "html/index.html"
|
add_custom_command(OUTPUT "html/index.html"
|
||||||
@@ -46,7 +50,7 @@ else()
|
|||||||
COMMENT "Generating HTML documentation"
|
COMMENT "Generating HTML documentation"
|
||||||
VERBATIM)
|
VERBATIM)
|
||||||
|
|
||||||
add_custom_target(docs ALL SOURCES "html/index.html")
|
add_custom_target(docs ALL SOURCES ${source_files} DEPENDS "html/index.html")
|
||||||
set_target_properties(docs PROPERTIES FOLDER "GLFW3")
|
set_target_properties(docs PROPERTIES FOLDER "GLFW3")
|
||||||
|
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
|
|||||||
+1
-7
@@ -278,13 +278,7 @@ ALIASES = "thread_safety=@par Thread safety^^" \
|
|||||||
"analysis=@par Analysis^^" \
|
"analysis=@par Analysis^^" \
|
||||||
"reentrancy=@par Reentrancy^^" \
|
"reentrancy=@par Reentrancy^^" \
|
||||||
"errors=@par Errors^^" \
|
"errors=@par Errors^^" \
|
||||||
"callback_signature=@par Callback signature^^" \
|
"callback_signature=@par Callback signature^^"
|
||||||
"glfw3=__GLFW 3:__" \
|
|
||||||
"x11=__X11:__" \
|
|
||||||
"wayland=__Wayland:__" \
|
|
||||||
"win32=__Windows:__" \
|
|
||||||
"macos=__macOS:__" \
|
|
||||||
"linux=__Linux:__"
|
|
||||||
|
|
||||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
||||||
# only. Doxygen will then generate output that is more tailored for C. For
|
# only. Doxygen will then generate output that is more tailored for C. For
|
||||||
|
|||||||
+4
-4
@@ -310,7 +310,7 @@ With 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.
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
find_package(glfw3 3.4 REQUIRED)
|
find_package(glfw3 3.5 REQUIRED)
|
||||||
```
|
```
|
||||||
|
|
||||||
Once GLFW has been added to the project, link against it with the `glfw` target.
|
Once GLFW has been added to the project, link against it with the `glfw` target.
|
||||||
@@ -390,8 +390,8 @@ If you are using the dynamic library version of GLFW, add it to the project
|
|||||||
dependencies.
|
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 QuartzCore frameworks to the project as dependencies. They
|
||||||
found in `/System/Library/Frameworks`.
|
can all be found in `/System/Library/Frameworks`.
|
||||||
|
|
||||||
|
|
||||||
### With command-line or makefile on macOS {#build_link_osx}
|
### With command-line or makefile on macOS {#build_link_osx}
|
||||||
@@ -405,7 +405,7 @@ command-line yourself using 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:
|
||||||
|
|
||||||
```sh
|
```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 QuartzCore
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
||||||
|
|||||||
+24
-20
@@ -50,10 +50,11 @@ compositing window manager to un-redirect full screen GLFW windows. If the
|
|||||||
running window manager uses compositing but does not support this property then
|
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 [clipboard manager protocol][ClipboardManager] to push a clipboard
|
GLFW uses the [clipboard manager protocol][ClipboardManager] to keep the
|
||||||
string (i.e. selection) owned by a GLFW window about to be destroyed to the
|
clipboard string availble for the user after the libary has been terminated. If
|
||||||
clipboard manager. If there is no running clipboard manager, the clipboard
|
there is no running clipboard manager and the clipboard contents has been set
|
||||||
string will be unavailable once the window has been destroyed.
|
with @ref glfwSetClipboardString, the clipboard will be emptied when the library
|
||||||
|
is terminated.
|
||||||
|
|
||||||
[clipboardManager]: https://www.freedesktop.org/wiki/ClipboardManager/
|
[clipboardManager]: https://www.freedesktop.org/wiki/ClipboardManager/
|
||||||
|
|
||||||
@@ -242,24 +243,27 @@ extensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
|||||||
|
|
||||||
## OpenGL on macOS {#compat_osx}
|
## OpenGL on macOS {#compat_osx}
|
||||||
|
|
||||||
Support for OpenGL 3.2 and above was introduced with OS X 10.7 and even then
|
macOS (as of version 14) still provides OpenGL but it has been deprecated by
|
||||||
only forward-compatible, core profile contexts are supported. Support for
|
Apple. While the API is still available, it is poorly maintained and frequently
|
||||||
OpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,
|
develops new issues. On modern systems, OpenGL is implemented on top of Metal
|
||||||
core profile contexts. There is also still no mechanism for requesting debug
|
and is not fully thread-safe.
|
||||||
contexts or no-error contexts. Versions of Mac OS X earlier than 10.7 support
|
|
||||||
at most OpenGL version 2.1.
|
|
||||||
|
|
||||||
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
macOS does not support OpenGL stereo rendering. If the `GLFW_STEREO` hint is
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
set to true, OpenGL context creation will always fail.
|
||||||
given version 3.0 or 3.1. The `GLFW_OPENGL_PROFILE` hint must be set to
|
|
||||||
`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts. The
|
|
||||||
`GLFW_CONTEXT_DEBUG` and `GLFW_CONTEXT_NO_ERROR` hints are ignored.
|
|
||||||
|
|
||||||
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
macOS only supports OpenGL core profile contexts that are forward-compatible,
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
|
but the `GLFW_OPENGL_FORWARD_COMPAT` hint is ignored since GLFW 3.4. Even if
|
||||||
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
this hint is set to false (the default), a forward-compatible context will be
|
||||||
a non-default value will cause @ref glfwCreateWindow to fail and the
|
returned if available.
|
||||||
`GLFW_CONTEXT_DEBUG` hint is ignored.
|
|
||||||
|
macOS does not support OpenGL debug contexts, no-error contexts or robustness.
|
||||||
|
The `GLFW_CONTEXT_DEBUG`, `GLFW_CONTEXT_NO_ERROR` and `GLFW_CONTEXT_ROBUSTNESS`
|
||||||
|
hints will be ignored and a context without these features will be returned.
|
||||||
|
|
||||||
|
macOS does not flush OpenGL contexts when they are made non-current. The
|
||||||
|
`GLFW_CONTEXT_RELEASE_BEHAVIOR` hint is ignored and the release behavior will
|
||||||
|
always be the equivalent of `GLFW_RELEASE_BEHAVIOR_NONE`. If you need a context
|
||||||
|
to be flushed, call `glFlush` before making it non-current.
|
||||||
|
|
||||||
|
|
||||||
## Vulkan loader and API {#compat_vulkan}
|
## Vulkan loader and API {#compat_vulkan}
|
||||||
|
|||||||
+14
-14
@@ -36,9 +36,9 @@ specific to GLFW. It may be a useful companion to this one.
|
|||||||
|
|
||||||
### Installing dependencies {#compile_deps}
|
### Installing dependencies {#compile_deps}
|
||||||
|
|
||||||
The C/C++ development environments in Visual Studio, Xcode and MinGW come with
|
The C/C++ development environments in Visual Studio, Xcode and MinGW-w64 come
|
||||||
all necessary dependencies for compiling GLFW, but on Unix-like systems like
|
with all necessary dependencies for compiling GLFW, but on Unix-like systems
|
||||||
Linux and FreeBSD you will need a few extra packages.
|
like Linux and FreeBSD you will need a few extra packages.
|
||||||
|
|
||||||
|
|
||||||
#### Dependencies for Wayland and X11 {#compile_deps_wayland}
|
#### Dependencies for Wayland and X11 {#compile_deps_wayland}
|
||||||
@@ -180,7 +180,7 @@ cd path/to/build
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
With MinGW, it is `mingw32-make`.
|
With MinGW-w64, it is `mingw32-make`.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd path/to/build
|
cd path/to/build
|
||||||
@@ -264,8 +264,8 @@ __USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or th
|
|||||||
static library version of the Visual C++ runtime library. When enabled, the
|
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.
|
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 [CMAKE_MSVC_RUNTIME_LIBRARY][]
|
It is recommended to set the standard CMake variable [CMAKE_MSVC_RUNTIME_LIBRARY][]
|
||||||
variable instead of this GLFW-specific option.
|
instead of this GLFW-specific option.
|
||||||
|
|
||||||
[CMAKE_MSVC_RUNTIME_LIBRARY]: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
|
[CMAKE_MSVC_RUNTIME_LIBRARY]: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
|
||||||
|
|
||||||
@@ -299,12 +299,12 @@ library. This option is only available when compiling for Linux and other Unix-
|
|||||||
systems other than macOS. This is enabled by default.
|
systems other than macOS. This is enabled by default.
|
||||||
|
|
||||||
|
|
||||||
## Cross-compilation with CMake and MinGW {#compile_mingw_cross}
|
## Cross-compilation with CMake and MinGW-w64 {#compile_mingw_cross}
|
||||||
|
|
||||||
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
Both Cygwin and many Linux distributions have MinGW-w64 packages. For example,
|
||||||
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages for 32- and
|
||||||
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives like Ubuntu
|
||||||
like Ubuntu have the `mingw-w64` package for both.
|
have the `mingw-w64` package for both.
|
||||||
|
|
||||||
GLFW has CMake toolchain files in the `CMake` subdirectory that set up
|
GLFW has CMake toolchain files in the `CMake` subdirectory that set up
|
||||||
cross-compilation of Windows binaries. To use these files you set the
|
cross-compilation of Windows binaries. To use these files you set the
|
||||||
@@ -315,9 +315,9 @@ configuring and generating the build files.
|
|||||||
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=path/to/file
|
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=path/to/file
|
||||||
```
|
```
|
||||||
|
|
||||||
The exact toolchain file to use depends on the prefix used by the MinGW or
|
The exact toolchain file to use depends on the prefix used by the MinGW-w64
|
||||||
MinGW-w64 binaries on your system. You can usually see this in the /usr
|
binaries on your system. You can usually see this in the /usr directory. For
|
||||||
directory. For example, both the Ubuntu and Cygwin MinGW-w64 packages have
|
example, both the Ubuntu and Cygwin MinGW-w64 packages have
|
||||||
`/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct invocation
|
`/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct invocation
|
||||||
would be:
|
would be:
|
||||||
|
|
||||||
|
|||||||
+22
-3
@@ -492,6 +492,20 @@ a mouse button callback.
|
|||||||
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@anchor GLFW_UNLIMITED_MOUSE_BUTTONS
|
||||||
|
To handle all mouse buttons in the callback, instead of only ones with associated
|
||||||
|
[button tokens](@ref buttons), set the @ref GLFW_UNLIMITED_MOUSE_BUTTONS
|
||||||
|
input mode.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwSetInputMode(window, GLFW_UNLIMITED_MOUSE_BUTTONS, GLFW_TRUE);
|
||||||
|
```
|
||||||
|
|
||||||
|
When this input mode is enabled, GLFW doesn't limit the reported mouse buttons
|
||||||
|
to only those that have an associated button token, for compatibility with
|
||||||
|
earlier versions of GLFW, which never reported any buttons over
|
||||||
|
@ref GLFW_MOUSE_BUTTON_LAST, on which users could have relied on.
|
||||||
|
|
||||||
The callback function receives the [mouse button](@ref buttons), button action
|
The callback function receives the [mouse button](@ref buttons), button action
|
||||||
and [modifier bits](@ref mods).
|
and [modifier bits](@ref mods).
|
||||||
|
|
||||||
@@ -503,11 +517,16 @@ void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The mouse button is an integer that can be one of the
|
||||||
|
[mouse button tokens](@ref buttons) or, if the
|
||||||
|
@ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode is set, any other positive value.
|
||||||
|
|
||||||
The action is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
The action is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
|
|
||||||
The last reported state for every [supported mouse button](@ref buttons) is also
|
The last reported state for every [mouse button token](@ref buttons) is also
|
||||||
saved in per-window state arrays that can be polled with @ref
|
saved in per-window state arrays that can be polled with @ref
|
||||||
glfwGetMouseButton.
|
glfwGetMouseButton. This is not effected by the @ref GLFW_UNLIMITED_MOUSE_BUTTONS
|
||||||
|
input mode.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
|
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
|
||||||
@@ -540,7 +559,7 @@ had been processed in the meantime, the state will reset to `GLFW_RELEASE`,
|
|||||||
otherwise it will remain `GLFW_PRESS`.
|
otherwise it will remain `GLFW_PRESS`.
|
||||||
|
|
||||||
The `GLFW_MOUSE_BUTTON_LAST` constant holds the highest value of any
|
The `GLFW_MOUSE_BUTTON_LAST` constant holds the highest value of any
|
||||||
[supported mouse button](@ref buttons).
|
[mouse button token](@ref buttons).
|
||||||
|
|
||||||
|
|
||||||
### Scroll input {#scrolling}
|
### Scroll input {#scrolling}
|
||||||
|
|||||||
+5
-5
@@ -63,7 +63,7 @@ before the application exits. Modern systems are very good at freeing resources
|
|||||||
allocated by programs that exit, but GLFW sometimes has to change global system
|
allocated by programs that exit, but GLFW sometimes has to change global system
|
||||||
settings and these might not be restored without termination.
|
settings and these might not be restored without termination.
|
||||||
|
|
||||||
@macos When the library is initialized the main menu and dock icon are created.
|
__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
|
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
|
main menu and dock icon can be disabled with the @ref GLFW_COCOA_MENUBAR init
|
||||||
hint.
|
hint.
|
||||||
@@ -621,17 +621,17 @@ The format of the string is as follows:
|
|||||||
- The names of the always supported context creation APIs EGL and OSMesa
|
- 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
|
- 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, compiling GLFW 3.5 with MinGW-64 as a DLL for Windows, may result
|
||||||
like this:
|
in a version string like this:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
3.4.0 Win32 WGL Null EGL OSMesa MinGW DLL
|
3.5.0 Win32 WGL Null EGL OSMesa MinGW-w64 DLL
|
||||||
```
|
```
|
||||||
|
|
||||||
Compiling GLFW as a static library for Linux, with both Wayland and X11 enabled, may
|
Compiling GLFW as a static library for Linux, with both Wayland and X11 enabled, may
|
||||||
result in a version string like this:
|
result in a version string like this:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
3.4.0 Wayland X11 GLX Null EGL OSMesa monotonic
|
3.5.0 Wayland X11 GLX Null EGL OSMesa monotonic
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -255,3 +255,7 @@ 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
|
gamma. This means that setting a perfectly linear ramp, or gamma 1.0, will
|
||||||
produce the default (usually sRGB-like) behavior.
|
produce the default (usually sRGB-like) behavior.
|
||||||
|
|
||||||
|
@note __Wayland:__ An application cannot read or modify the monitor gamma ramp.
|
||||||
|
The @ref glfwGetGammaRamp, @ref glfwSetGammaRamp and @ref glfwSetGamma functions
|
||||||
|
emit @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
|
|
||||||
|
|||||||
+34
-356
@@ -1,400 +1,78 @@
|
|||||||
# Release notes for version 3.4 {#news}
|
# Release notes for version 3.5 {#news}
|
||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
|
|
||||||
|
## Why was there no 3.5.0 release?
|
||||||
|
|
||||||
|
Due to a misconfigured tool, an incorrect `3.5.0` tag was briefly made available in the
|
||||||
|
main Git repository. Thanks to the manual intervention of many packaging volunteers this
|
||||||
|
has been almost entirely rolled back. To make sure the first actual release of GLFW 3.5
|
||||||
|
replaces the incorrect tag everywhere, the first release is named 3.5.1.
|
||||||
|
|
||||||
|
|
||||||
## New features {#features}
|
## New features {#features}
|
||||||
|
|
||||||
### Runtime platform selection {#runtime_platform_selection}
|
### Unlimited mouse buttons {#unlimited_mouse_buttons}
|
||||||
|
|
||||||
GLFW now supports being compiled for multiple backends and selecting between
|
GLFW now has an input mode which allows an unlimited number of mouse buttons to
|
||||||
them at runtime with the @ref GLFW_PLATFORM init hint. After initialization the
|
be reported by the mouse buttton callback, rather than just the associated
|
||||||
selected platform can be queried with @ref glfwGetPlatform. You can check if
|
[mouse button tokens](@ref buttons). This allows using mouse buttons with
|
||||||
support for a given platform is compiled in with @ref glfwPlatformSupported.
|
values over 8. For compatibility with older versions, the
|
||||||
|
@ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode needs to be set to make use of
|
||||||
For more information see @ref platform.
|
this.
|
||||||
|
|
||||||
|
|
||||||
### More standard cursor shapes {#more_cursor_shapes}
|
### EGLConfig native access function {#eglconfig}
|
||||||
|
|
||||||
GLFW now provides the standard cursor shapes @ref GLFW_RESIZE_NWSE_CURSOR and
|
GLFW now provides the @ref glfwGetEGLConfig native access function for querying
|
||||||
@ref GLFW_RESIZE_NESW_CURSOR for diagonal resizing, @ref GLFW_RESIZE_ALL_CURSOR
|
the `EGLConfig` of a window that has a `EGLSurface`.
|
||||||
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
|
|
||||||
creation will then fail with the new @ref GLFW_CURSOR_UNAVAILABLE error.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
### Mouse event passthrough {#mouse_input_passthrough}
|
### GLXFBConfig native access function {#glxfbconfig}
|
||||||
|
|
||||||
GLFW now provides the [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_hint)
|
GLFW now provides the @ref glfwGetGLXFBConfig native access function for
|
||||||
window hint for making a window transparent to mouse input, lettings events pass
|
querying the `GLXFBConfig` of a window that has a `GLXWindow`.
|
||||||
to whatever window is behind it. This can also be changed after window
|
|
||||||
creation with the matching [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib).
|
|
||||||
|
|
||||||
|
|
||||||
### Ability to get window title {#window_title_function}
|
|
||||||
|
|
||||||
GLFW now supports querying the title of a window with the @ref glfwGetWindowTitle
|
|
||||||
function.
|
|
||||||
|
|
||||||
For more information see @ref window_title.
|
|
||||||
|
|
||||||
|
|
||||||
### Captured cursor mode {#captured_cursor_mode}
|
|
||||||
|
|
||||||
GLFW now supports confining the cursor to the window content area with the @ref
|
|
||||||
GLFW_CURSOR_CAPTURED cursor mode.
|
|
||||||
|
|
||||||
For more information see @ref cursor_mode.
|
|
||||||
|
|
||||||
|
|
||||||
### Support for custom heap memory allocator {#custom_heap_allocator}
|
|
||||||
|
|
||||||
GLFW now supports plugging a custom heap 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.
|
|
||||||
|
|
||||||
|
|
||||||
### Window hint for framebuffer scaling {#scale_framebuffer_hint}
|
|
||||||
|
|
||||||
GLFW now allows provides the
|
|
||||||
[GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for
|
|
||||||
controlling framebuffer scaling on platforms that handle scaling by keeping the
|
|
||||||
window size the same while resizing the framebuffer. The default value is to
|
|
||||||
allow framebuffer scaling.
|
|
||||||
|
|
||||||
This was already possible on macOS via the
|
|
||||||
[GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) window
|
|
||||||
hint. This is now another name for the same hint value.
|
|
||||||
|
|
||||||
For more information see @ref window_scale.
|
|
||||||
|
|
||||||
|
|
||||||
### Window hints for initial window position {#window_position_hint}
|
|
||||||
|
|
||||||
GLFW now provides the @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints for
|
|
||||||
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.
|
|
||||||
|
|
||||||
For more information see @ref window_pos.
|
|
||||||
|
|
||||||
|
|
||||||
### ANGLE rendering backend hint {#angle_renderer_hint}
|
|
||||||
|
|
||||||
GLFW now provides the
|
|
||||||
[GLFW_ANGLE_PLATFORM_TYPE](@ref GLFW_ANGLE_PLATFORM_TYPE_hint) init hint for
|
|
||||||
requesting a specific rendering backend when using [ANGLE][] to create OpenGL ES
|
|
||||||
contexts.
|
|
||||||
|
|
||||||
[ANGLE]: https://chromium.googlesource.com/angle/angle/
|
|
||||||
|
|
||||||
|
|
||||||
### Windows window menu keyboard access hint {#win32_keymenu_hint}
|
|
||||||
|
|
||||||
GLFW now provides the
|
|
||||||
[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.
|
|
||||||
|
|
||||||
|
|
||||||
### Windows STARTUPINFO show command hint {#win32_showdefault_hint}
|
|
||||||
|
|
||||||
GLFW now provides the [GLFW_WIN32_SHOWDEFAULT](@ref GLFW_WIN32_SHOWDEFAULT_hint) window
|
|
||||||
hint for applying the show command in the program's `STARTUPINFO` when showing the window
|
|
||||||
for the first time. This may be useful for the main window of a windowed-mode tool.
|
|
||||||
|
|
||||||
|
|
||||||
### Cocoa NSView native access function {#cocoa_nsview_function}
|
|
||||||
|
|
||||||
GLFW now provides the @ref glfwGetCocoaView native access function
|
|
||||||
for returning the Cocoa NSView.
|
|
||||||
|
|
||||||
|
|
||||||
### Wayland libdecor decorations {#wayland_libdecor_decorations}
|
|
||||||
|
|
||||||
GLFW now supports improved client-side window decorations via
|
|
||||||
[libdecor](https://gitlab.freedesktop.org/libdecor/libdecor). This provides
|
|
||||||
fully featured window decorations on desktop environments like GNOME.
|
|
||||||
|
|
||||||
Support for libdecor can be toggled before GLFW is initialized with the
|
|
||||||
[GLFW_WAYLAND_LIBDECOR](@ref GLFW_WAYLAND_LIBDECOR_hint) init hint. It is
|
|
||||||
enabled by default.
|
|
||||||
|
|
||||||
This feature has also been available in GLFW 3.3 since 3.3.9.
|
|
||||||
|
|
||||||
|
|
||||||
### Wayland surface app_id hint {#wayland_app_id_hint}
|
|
||||||
|
|
||||||
GLFW now supports specifying the app_id for a Wayland window using the
|
|
||||||
[GLFW_WAYLAND_APP_ID](@ref GLFW_WAYLAND_APP_ID_hint) window hint string.
|
|
||||||
|
|
||||||
|
|
||||||
### X11 Vulkan window surface hint {#x11_xcb_vulkan_surface}
|
|
||||||
|
|
||||||
GLFW now supports disabling the use of `VK_KHR_xcb_surface` over
|
|
||||||
`VK_KHR_xlib_surface` where available, with the
|
|
||||||
[GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init hint.
|
|
||||||
This affects @ref glfwGetRequiredInstanceExtensions and @ref
|
|
||||||
glfwCreateWindowSurface.
|
|
||||||
|
|
||||||
|
|
||||||
## Caveats {#caveats}
|
## Caveats {#caveats}
|
||||||
|
|
||||||
### Multiple sets of native access functions {#multiplatform_caveat}
|
|
||||||
|
|
||||||
Because GLFW now supports runtime selection of platform (window system), a library binary
|
|
||||||
may export native access functions for multiple platforms. Starting with version 3.4 you
|
|
||||||
must not assume that GLFW is running on a platform just because it exports native access
|
|
||||||
functions for it. After initialization, you can query the selected platform with @ref
|
|
||||||
glfwGetPlatform.
|
|
||||||
|
|
||||||
|
|
||||||
### Version string format has been changed {#version_string_caveat}
|
|
||||||
|
|
||||||
Because GLFW now supports runtime selection of platform (window system), the version
|
|
||||||
string returned by @ref glfwGetVersionString has been expanded. It now contains the names
|
|
||||||
of all APIs for all the platforms that the library binary supports.
|
|
||||||
|
|
||||||
The version string is intended for bug reporting and should not be parsed. See
|
|
||||||
@ref glfwGetVersion and @ref glfwPlatformSupported instead.
|
|
||||||
|
|
||||||
|
|
||||||
### Joystick support is initialized on demand {#joystick_init_caveat}
|
|
||||||
|
|
||||||
The joystick part of GLFW is now initialized when first used, primarily to work
|
|
||||||
around faulty Windows drivers that cause DirectInput to take up to several
|
|
||||||
seconds to enumerate devices.
|
|
||||||
|
|
||||||
This change is mostly not observable. However, if your application waits 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).
|
|
||||||
|
|
||||||
|
|
||||||
### Tests and examples are disabled when built as a subproject {#standalone_caveat}
|
|
||||||
|
|
||||||
GLFW now by default does not build the tests or examples when it is added as
|
|
||||||
a subdirectory of another CMake project. If you were setting @ref
|
|
||||||
GLFW_BUILD_TESTS or @ref GLFW_BUILD_EXAMPLES to false in your CMake files, you
|
|
||||||
can now remove this.
|
|
||||||
|
|
||||||
If you do want these to be built, set @ref GLFW_BUILD_TESTS and @ref
|
|
||||||
GLFW_BUILD_EXAMPLES in your CMake files before adding the GLFW subdirectory.
|
|
||||||
|
|
||||||
```cmake
|
|
||||||
set(GLFW_BUILD_EXAMPLES ON CACHE BOOL "" FORCE)
|
|
||||||
set(GLFW_BUILD_TESTS ON CACHE BOOL "" FORCE)
|
|
||||||
add_subdirectory(path/to/glfw)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Configuration header is no longer generated {#config_header_caveat}
|
|
||||||
|
|
||||||
The `glfw_config.h` configuration header is no longer generated by CMake and the
|
|
||||||
platform selection macros are now part of the GLFW CMake target. The
|
|
||||||
`_GLFW_USE_CONFIG_H` macro is still supported in case you are generating
|
|
||||||
a configuration header in a custom build setup.
|
|
||||||
|
|
||||||
|
|
||||||
### Documentation generation requires Doxygen 1.9.8 or later {#docs_target_caveat}
|
|
||||||
|
|
||||||
Doxygen 1.9.8 or later is now required for the `docs` CMake target to be
|
|
||||||
generated. This is because the documentation now uses more of the Markdown
|
|
||||||
support in Doxygen and this support has until recently been relatively unstable.
|
|
||||||
|
|
||||||
|
|
||||||
### Windows 7 framebuffer transparency requires DWM transparency {#win7_framebuffer_caveat}
|
|
||||||
|
|
||||||
GLFW no longer supports per-pixel framebuffer transparency via @ref
|
|
||||||
GLFW_TRANSPARENT_FRAMEBUFFER on Windows 7 if DWM transparency is off
|
|
||||||
(the Transparency setting under Personalization > Window Color).
|
|
||||||
|
|
||||||
|
|
||||||
### macOS main menu now created at initialization {#macos_menu_caveat}
|
|
||||||
|
|
||||||
GLFW now creates the main menu and completes the initialization of NSApplication
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
### macOS CoreVideo dependency has been removed {#corevideo_caveat}
|
|
||||||
|
|
||||||
GLFW no longer depends on the CoreVideo framework on macOS and it no longer
|
|
||||||
needs to be specified during compilation or linking.
|
|
||||||
|
|
||||||
|
|
||||||
### Wayland framebuffer may lack alpha channel on older systems {#wayland_alpha_caveat}
|
|
||||||
|
|
||||||
On Wayland, when creating an EGL context on a machine lacking the new
|
|
||||||
`EGL_EXT_present_opaque` extension, the @ref GLFW_ALPHA_BITS window hint will be
|
|
||||||
ignored and the framebuffer will not have an 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.
|
|
||||||
|
|
||||||
|
|
||||||
### X11 empty events no longer round-trip to server {#x11_emptyevent_caveat}
|
|
||||||
|
|
||||||
Events posted with @ref glfwPostEmptyEvent now use a separate unnamed pipe
|
|
||||||
instead of sending an X11 client event to the helper window.
|
|
||||||
|
|
||||||
|
|
||||||
## Deprecations {#deprecations}
|
## Deprecations {#deprecations}
|
||||||
|
|
||||||
### Windows XP and Vista support is deprecated {#winxp_deprecated}
|
|
||||||
|
|
||||||
Support for Windows XP and Vista has been deprecated and will be removed in
|
|
||||||
a future release. Windows XP has been out of extended support since 2014.
|
|
||||||
|
|
||||||
|
|
||||||
### Original MinGW support is deprecated {#mingw_deprecated}
|
|
||||||
|
|
||||||
Support for the now unmaintained original MinGW distribution has been deprecated
|
|
||||||
and will be removed in a future release.
|
|
||||||
|
|
||||||
This does not apply to the much more capable MinGW-w64, which remains fully
|
|
||||||
supported, actively maintained and available on many platforms.
|
|
||||||
|
|
||||||
|
|
||||||
### OS X Yosemite support is deprecated {#yosemite_deprecated}
|
|
||||||
|
|
||||||
Support for OS X 10.10 Yosemite and earlier has been deprecated and will be
|
|
||||||
removed in a future release. OS X 10.10 has been out of support since 2017.
|
|
||||||
|
|
||||||
|
|
||||||
## Removals {#removals}
|
## Removals {#removals}
|
||||||
|
|
||||||
### GLFW_VULKAN_STATIC CMake option has been removed {#vulkan_static_removed}
|
### Windows XP and Vista support has been removed {#winxp_vista}
|
||||||
|
|
||||||
This option was used to compile GLFW directly linked with the Vulkan loader, instead of
|
Support for Windows XP and Vista has been removed. Windows XP has been out of extended
|
||||||
using dynamic loading to get hold of `vkGetInstanceProcAddr` at initialization. This is
|
support since 2014.
|
||||||
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
|
|
||||||
have no effect. The call to @ref glfwInitVulkanLoader can be conditionally enabled in
|
|
||||||
your code by checking the @ref GLFW_VERSION_MAJOR and @ref GLFW_VERSION_MINOR macros.
|
|
||||||
|
|
||||||
|
|
||||||
### GLFW_USE_WAYLAND CMake option has been removed {#use_wayland_removed}
|
### Original MinGW support has been removed {#original_mingw}
|
||||||
|
|
||||||
This option was used to compile GLFW for Wayland instead of X11. GLFW now
|
Support for the now unmaintained original MinGW distribution has been removed.
|
||||||
supports selecting the platform at run-time. By default GLFW is compiled for
|
|
||||||
both Wayland and X11 on Linux and other Unix-like systems.
|
|
||||||
|
|
||||||
To disable Wayland or X11 or both, set the @ref GLFW_BUILD_WAYLAND and @ref
|
This does not apply to the much more capable [MinGW-w64](https://www.mingw-w64.org/),
|
||||||
GLFW_BUILD_X11 CMake options.
|
which remains fully supported. MinGW-w64 can build both 32- and 64-bit binaries, is
|
||||||
|
actively maintained and available on many platforms.
|
||||||
The `GLFW_USE_WAYLAND` CMake variable must not be present in the CMake cache at
|
|
||||||
all, or GLFW will fail to configure. If you are getting this error, delete the
|
|
||||||
CMake cache for GLFW and configure again.
|
|
||||||
|
|
||||||
|
|
||||||
### GLFW_USE_OSMESA CMake option has been removed {#use_osmesa_removed}
|
|
||||||
|
|
||||||
This option was used to compile GLFW for the Null platform. The Null platform
|
|
||||||
is now always available. 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 platforms for the target OS. This means setting the @ref
|
|
||||||
GLFW_BUILD_WIN32, @ref GLFW_BUILD_COCOA or @ref GLFW_BUILD_WAYLAND and @ref
|
|
||||||
GLFW_BUILD_X11 CMake options to false.
|
|
||||||
|
|
||||||
You can set all of them to false and the ones that don't apply for the target OS
|
|
||||||
will be ignored.
|
|
||||||
|
|
||||||
|
|
||||||
### wl_shell protocol support has been removed {#wl_shell_removed}
|
|
||||||
|
|
||||||
Support for the deprecated wl_shell protocol has been removed and GLFW now only
|
|
||||||
supports the XDG-Shell protocol. If your Wayland compositor does not support
|
|
||||||
XDG-Shell then GLFW will fail to initialize.
|
|
||||||
|
|
||||||
|
|
||||||
## New symbols {#new_symbols}
|
## New symbols {#new_symbols}
|
||||||
|
|
||||||
### New functions {#new_functions}
|
### New functions {#new_functions}
|
||||||
|
|
||||||
- @ref glfwInitAllocator
|
- @ref glfwGetEGLConfig
|
||||||
- @ref glfwGetPlatform
|
- @ref glfwGetGLXFBConfig
|
||||||
- @ref glfwPlatformSupported
|
|
||||||
- @ref glfwInitVulkanLoader
|
|
||||||
- @ref glfwGetWindowTitle
|
|
||||||
- @ref glfwGetCocoaView
|
|
||||||
|
|
||||||
|
|
||||||
### New types {#new_types}
|
### New types {#new_types}
|
||||||
|
|
||||||
- @ref GLFWallocator
|
|
||||||
- @ref GLFWallocatefun
|
|
||||||
- @ref GLFWreallocatefun
|
|
||||||
- @ref GLFWdeallocatefun
|
|
||||||
|
|
||||||
|
|
||||||
### New constants {#new_constants}
|
### New constants {#new_constants}
|
||||||
|
|
||||||
- @ref GLFW_PLATFORM
|
- @ref GLFW_UNLIMITED_MOUSE_BUTTONS
|
||||||
- @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_WIN32_SHOWDEFAULT
|
|
||||||
- @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_APP_ID
|
|
||||||
- @ref GLFW_WAYLAND_LIBDECOR
|
|
||||||
- @ref GLFW_WAYLAND_PREFER_LIBDECOR
|
|
||||||
- @ref GLFW_WAYLAND_DISABLE_LIBDECOR
|
|
||||||
- @ref GLFW_SCALE_FRAMEBUFFER
|
|
||||||
|
|
||||||
|
|
||||||
## Release notes for earlier versions {#news_archive}
|
## Release notes for earlier versions {#news_archive}
|
||||||
|
|
||||||
|
- [Release notes for 3.4](https://www.glfw.org/docs/3.4/news.html)
|
||||||
- [Release notes for 3.3](https://www.glfw.org/docs/3.3/news.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)
|
- [Release notes for 3.2](https://www.glfw.org/docs/3.2/news.html)
|
||||||
- [Release notes for 3.1](https://www.glfw.org/docs/3.1/news.html)
|
- [Release notes for 3.1](https://www.glfw.org/docs/3.1/news.html)
|
||||||
|
|||||||
+3
-3
@@ -35,7 +35,7 @@ By default, GLFW will load the Vulkan loader dynamically at runtime via its stan
|
|||||||
`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other Unix-like systems and
|
`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other Unix-like systems and
|
||||||
`libvulkan.1.dylib` on macOS.
|
`libvulkan.1.dylib` on macOS.
|
||||||
|
|
||||||
@macos GLFW will also look up and search the `Frameworks` subdirectory of your
|
__macOS:__ GLFW will also look up and search the `Frameworks` subdirectory of your
|
||||||
application bundle.
|
application bundle.
|
||||||
|
|
||||||
If your code is using a Vulkan loader with a different name or in a non-standard location
|
If your code is using a Vulkan loader with a different name or in a non-standard location
|
||||||
@@ -47,7 +47,7 @@ entry point retrieval. This prevents GLFW from dynamically loading the Vulkan l
|
|||||||
glfwInitVulkanLoader(vkGetInstanceProcAddr);
|
glfwInitVulkanLoader(vkGetInstanceProcAddr);
|
||||||
```
|
```
|
||||||
|
|
||||||
@macos To make your application be redistributable you will need to set up the application
|
__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
|
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).
|
[SDK documentation for macOS](https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html).
|
||||||
|
|
||||||
@@ -186,7 +186,7 @@ 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
|
__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
|
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_KHR_portability_enumeration` instance extension and set the
|
||||||
`VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR` bit in the instance creation
|
`VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR` bit in the instance creation
|
||||||
|
|||||||
+15
-3
@@ -363,10 +363,10 @@ which API was used to create the current context may fail if you change this
|
|||||||
hint. This can be resolved by having it load functions via @ref
|
hint. This can be resolved by having it load functions via @ref
|
||||||
glfwGetProcAddress.
|
glfwGetProcAddress.
|
||||||
|
|
||||||
@note @wayland The EGL API _is_ the native context creation API, so this hint
|
@note __Wayland:__ The EGL API _is_ the native context creation API, so this hint
|
||||||
will have no effect.
|
will have no effect.
|
||||||
|
|
||||||
@note @x11 On some Linux systems, creating contexts via both the native and EGL
|
@note __X11:__ On some Linux systems, creating contexts via both the native and EGL
|
||||||
APIs in a single process will cause the application to segfault. Stick to one
|
APIs in a single process will cause the application to segfault. Stick to one
|
||||||
API or the other on Linux for now.
|
API or the other on Linux for now.
|
||||||
|
|
||||||
@@ -400,7 +400,7 @@ requested. Additionally, OpenGL ES 1.x cannot be returned if 2.0 or later was
|
|||||||
requested, and vice versa. This is because OpenGL ES 3.x is backward compatible
|
requested, and vice versa. This is because OpenGL ES 3.x is backward compatible
|
||||||
with 2.0, but OpenGL ES 2.0 is not backward compatible with 1.x.
|
with 2.0, but OpenGL ES 2.0 is not backward compatible with 1.x.
|
||||||
|
|
||||||
@note @macos The OS only supports core profile contexts for OpenGL versions 3.2
|
@note __macOS:__ The OS only supports core profile contexts for OpenGL versions 3.2
|
||||||
and later. Before creating an OpenGL context of version 3.2 or later you must
|
and later. Before creating an OpenGL context of version 3.2 or later you must
|
||||||
set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hint accordingly.
|
set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hint accordingly.
|
||||||
OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
|
OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
|
||||||
@@ -893,6 +893,12 @@ int xpos, ypos;
|
|||||||
glfwGetWindowPos(window, &xpos, &ypos);
|
glfwGetWindowPos(window, &xpos, &ypos);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@note __Wayland:__ An applications cannot know the positions of its windows or
|
||||||
|
whether one has been moved. The @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y
|
||||||
|
window hints are ignored. The @ref glfwGetWindowPos and @ref glfwSetWindowPos
|
||||||
|
functions emit @ref GLFW_FEATURE_UNAVAILABLE. The window position callback will
|
||||||
|
not be called.
|
||||||
|
|
||||||
|
|
||||||
### Window title {#window_title}
|
### Window title {#window_title}
|
||||||
|
|
||||||
@@ -1038,6 +1044,12 @@ You can also get the current iconification state with @ref glfwGetWindowAttrib.
|
|||||||
int iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED);
|
int iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@note __Wayland:__ An application cannot know if any of its windows have been
|
||||||
|
iconified or restore one from iconification. The @ref glfwRestoreWindow
|
||||||
|
function can only restore windows from maximization and the iconify callback
|
||||||
|
will not be called. The [GLFW_ICONIFIED](@ref GLFW_ICONIFIED_attrib) attribute
|
||||||
|
will be false. The @ref glfwIconifyWindow function works normally.
|
||||||
|
|
||||||
|
|
||||||
### Window maximization {#window_maximize}
|
### Window maximization {#window_maximize}
|
||||||
|
|
||||||
|
|||||||
+137
-107
@@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.4 - www.glfw.org
|
* GLFW 3.5 - 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
|
||||||
@@ -291,14 +291,14 @@ extern "C" {
|
|||||||
* features are added to the API but it remains backward-compatible.
|
* features are added to the API but it remains backward-compatible.
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
#define GLFW_VERSION_MINOR 4
|
#define GLFW_VERSION_MINOR 5
|
||||||
/*! @brief The revision number of the GLFW header.
|
/*! @brief The revision number of the GLFW header.
|
||||||
*
|
*
|
||||||
* The revision number of the GLFW header. This is incremented when a bug fix
|
* The revision number of the GLFW header. This is incremented when a bug fix
|
||||||
* release is made that does not contain any API changes.
|
* release is made that does not contain any API changes.
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
#define GLFW_VERSION_REVISION 0
|
#define GLFW_VERSION_REVISION 1
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
/*! @brief One.
|
/*! @brief One.
|
||||||
@@ -1149,11 +1149,12 @@ extern "C" {
|
|||||||
#define GLFW_OPENGL_CORE_PROFILE 0x00032001
|
#define GLFW_OPENGL_CORE_PROFILE 0x00032001
|
||||||
#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002
|
#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002
|
||||||
|
|
||||||
#define GLFW_CURSOR 0x00033001
|
#define GLFW_CURSOR 0x00033001
|
||||||
#define GLFW_STICKY_KEYS 0x00033002
|
#define GLFW_STICKY_KEYS 0x00033002
|
||||||
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
|
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
|
||||||
#define GLFW_LOCK_KEY_MODS 0x00033004
|
#define GLFW_LOCK_KEY_MODS 0x00033004
|
||||||
#define GLFW_RAW_MOUSE_MOTION 0x00033005
|
#define GLFW_RAW_MOUSE_MOTION 0x00033005
|
||||||
|
#define GLFW_UNLIMITED_MOUSE_BUTTONS 0x00033006
|
||||||
|
|
||||||
#define GLFW_CURSOR_NORMAL 0x00034001
|
#define GLFW_CURSOR_NORMAL 0x00034001
|
||||||
#define GLFW_CURSOR_HIDDEN 0x00034002
|
#define GLFW_CURSOR_HIDDEN 0x00034002
|
||||||
@@ -1227,13 +1228,13 @@ extern "C" {
|
|||||||
* The top-left to bottom-right diagonal resize/move shape. This is usually
|
* The top-left to bottom-right diagonal resize/move shape. This is usually
|
||||||
* a diagonal double-headed arrow.
|
* a diagonal double-headed arrow.
|
||||||
*
|
*
|
||||||
* @note @macos This shape is provided by a private system API and may fail
|
* @note __macOS:__ This shape is provided by a private system API and may fail
|
||||||
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
||||||
*
|
*
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
* @note __Wayland:__ This shape is provided by a newer standard not supported by
|
||||||
* all cursor themes.
|
* all cursor themes.
|
||||||
*
|
*
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
* @note __X11:__ This shape is provided by a newer standard not supported by all
|
||||||
* cursor themes.
|
* cursor themes.
|
||||||
*/
|
*/
|
||||||
#define GLFW_RESIZE_NWSE_CURSOR 0x00036007
|
#define GLFW_RESIZE_NWSE_CURSOR 0x00036007
|
||||||
@@ -1242,13 +1243,13 @@ extern "C" {
|
|||||||
* The top-right to bottom-left diagonal resize/move shape. This is usually
|
* The top-right to bottom-left diagonal resize/move shape. This is usually
|
||||||
* a diagonal double-headed arrow.
|
* a diagonal double-headed arrow.
|
||||||
*
|
*
|
||||||
* @note @macos This shape is provided by a private system API and may fail
|
* @note __macOS:__ This shape is provided by a private system API and may fail
|
||||||
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
||||||
*
|
*
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
* @note __Wayland:__ This shape is provided by a newer standard not supported by
|
||||||
* all cursor themes.
|
* all cursor themes.
|
||||||
*
|
*
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
* @note __X11:__ This shape is provided by a newer standard not supported by all
|
||||||
* cursor themes.
|
* cursor themes.
|
||||||
*/
|
*/
|
||||||
#define GLFW_RESIZE_NESW_CURSOR 0x00036008
|
#define GLFW_RESIZE_NESW_CURSOR 0x00036008
|
||||||
@@ -1263,10 +1264,10 @@ extern "C" {
|
|||||||
* The operation-not-allowed shape. This is usually a circle with a diagonal
|
* The operation-not-allowed shape. This is usually a circle with a diagonal
|
||||||
* line through it.
|
* line through it.
|
||||||
*
|
*
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
* @note __Wayland:__ This shape is provided by a newer standard not supported by
|
||||||
* all cursor themes.
|
* all cursor themes.
|
||||||
*
|
*
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
* @note __X11:__ This shape is provided by a newer standard not supported by all
|
||||||
* cursor themes.
|
* cursor themes.
|
||||||
*/
|
*/
|
||||||
#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A
|
#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A
|
||||||
@@ -1343,6 +1344,10 @@ extern "C" {
|
|||||||
#define GLFW_PLATFORM_NULL 0x00060005
|
#define GLFW_PLATFORM_NULL 0x00060005
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
|
/* Reserved platform define for external Emscripten ports: 0x00060006
|
||||||
|
* See https://github.com/pongasoft/emscripten-glfw
|
||||||
|
*/
|
||||||
|
|
||||||
#define GLFW_DONT_CARE -1
|
#define GLFW_DONT_CARE -1
|
||||||
|
|
||||||
|
|
||||||
@@ -1628,7 +1633,7 @@ typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos);
|
|||||||
* @sa @ref glfwSetWindowSizeCallback
|
* @sa @ref glfwSetWindowSizeCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -1648,7 +1653,7 @@ typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height);
|
|||||||
* @sa @ref glfwSetWindowCloseCallback
|
* @sa @ref glfwSetWindowCloseCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 2.5.
|
* @since Added in version 2.5.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -1668,7 +1673,7 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow* window);
|
|||||||
* @sa @ref glfwSetWindowRefreshCallback
|
* @sa @ref glfwSetWindowRefreshCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 2.5.
|
* @since Added in version 2.5.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -1799,7 +1804,7 @@ typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, flo
|
|||||||
* @sa @ref glfwSetMouseButtonCallback
|
* @sa @ref glfwSetMouseButtonCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle and modifier mask parameters.
|
* __GLFW 3:__ Added window handle and modifier mask parameters.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -1890,7 +1895,7 @@ typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffse
|
|||||||
* @sa @ref glfwSetKeyCallback
|
* @sa @ref glfwSetKeyCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle, scancode and modifier mask parameters.
|
* __GLFW 3:__ Added window handle, scancode and modifier mask parameters.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -1911,7 +1916,7 @@ typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int actio
|
|||||||
* @sa @ref glfwSetCharCallback
|
* @sa @ref glfwSetCharCallback
|
||||||
*
|
*
|
||||||
* @since Added in version 2.4.
|
* @since Added in version 2.4.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -2019,7 +2024,7 @@ typedef void (* GLFWjoystickfun)(int jid, int event);
|
|||||||
* @sa @ref glfwGetVideoModes
|
* @sa @ref glfwGetVideoModes
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added refresh rate member.
|
* __GLFW 3:__ Added refresh rate member.
|
||||||
*
|
*
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
*/
|
*/
|
||||||
@@ -2082,7 +2087,7 @@ typedef struct GLFWgammaramp
|
|||||||
* @sa @ref window_icon
|
* @sa @ref window_icon
|
||||||
*
|
*
|
||||||
* @since Added in version 2.1.
|
* @since Added in version 2.1.
|
||||||
* @glfw3 Removed format and bytes-per-pixel members.
|
* __GLFW 3:__ Removed format and bytes-per-pixel members.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -2182,12 +2187,12 @@ typedef struct GLFWallocator
|
|||||||
* @errors Possible errors include @ref GLFW_PLATFORM_UNAVAILABLE and @ref
|
* @errors Possible errors include @ref GLFW_PLATFORM_UNAVAILABLE and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @macos This function will change the current directory of the
|
* @remark __macOS:__ This function will change the current directory of the
|
||||||
* application to the `Contents/Resources` subdirectory of the application's
|
* application to the `Contents/Resources` subdirectory of the application's
|
||||||
* bundle, if present. This can be disabled with the @ref
|
* bundle, if present. This can be disabled with the @ref
|
||||||
* GLFW_COCOA_CHDIR_RESOURCES init hint.
|
* GLFW_COCOA_CHDIR_RESOURCES init hint.
|
||||||
*
|
*
|
||||||
* @remark @macos This function will create the main menu and dock icon for the
|
* @remark __macOS:__ This function will create the main menu and dock icon for the
|
||||||
* application. If GLFW finds a `MainMenu.nib` it is loaded and assumed to
|
* application. If GLFW finds a `MainMenu.nib` it is loaded and assumed to
|
||||||
* contain a menu bar. Otherwise a minimal menu bar is created manually with
|
* contain a menu bar. Otherwise a minimal menu bar is created manually with
|
||||||
* common commands like Hide, Quit and About. The About entry opens a minimal
|
* common commands like Hide, Quit and About. The About entry opens a minimal
|
||||||
@@ -2202,7 +2207,7 @@ typedef struct GLFWallocator
|
|||||||
* to something other than `wayland` or `x11`, the regular detection mechanism
|
* to something other than `wayland` or `x11`, the regular detection mechanism
|
||||||
* will be used instead.
|
* will be used instead.
|
||||||
*
|
*
|
||||||
* @remark @x11 This function will set the `LC_CTYPE` category of the
|
* @remark __X11:__ This function will set the `LC_CTYPE` category of the
|
||||||
* application locale according to the current environment if that category is
|
* application locale according to the current environment if that category is
|
||||||
* still "C". This is because the "C" locale breaks Unicode text input.
|
* still "C". This is because the "C" locale breaks Unicode text input.
|
||||||
*
|
*
|
||||||
@@ -2678,7 +2683,7 @@ GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos,
|
|||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
*
|
*
|
||||||
* @remark @win32 On Windows 8 and earlier the physical size is calculated from
|
* @remark __Win32:__ On Windows 8 and earlier the physical size is calculated from
|
||||||
* the current resolution and system DPI instead of querying the monitor EDID data.
|
* the current resolution and system DPI instead of querying the monitor EDID data.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -2712,7 +2717,7 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int*
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland Fractional scaling information is not yet available for
|
* @remark __Wayland:__ Fractional scaling information is not yet available for
|
||||||
* monitors, so this function only returns integer content scales.
|
* monitors, so this function only returns integer content scales.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -2860,7 +2865,7 @@ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback);
|
|||||||
* @sa @ref glfwGetVideoMode
|
* @sa @ref glfwGetVideoMode
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Changed to return an array of modes for a specific monitor.
|
* __GLFW 3:__ Changed to return an array of modes for a specific monitor.
|
||||||
*
|
*
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
*/
|
*/
|
||||||
@@ -2914,8 +2919,8 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_INVALID_VALUE,
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_INVALID_VALUE,
|
||||||
* @ref GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* @ref GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland Gamma handling is a privileged protocol, this function
|
* @remark __Wayland:__ Monitor gamma is a privileged protocol, so this function
|
||||||
* will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE.
|
* cannot be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -2938,8 +2943,8 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR
|
||||||
* and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland Gamma handling is a privileged protocol, this function
|
* @remark __Wayland:__ Monitor gamma is a privileged protocol, so this function
|
||||||
* will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE while
|
* cannot be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE while
|
||||||
* returning `NULL`.
|
* returning `NULL`.
|
||||||
*
|
*
|
||||||
* @pointer_lifetime The returned structure and its arrays are allocated and
|
* @pointer_lifetime The returned structure and its arrays are allocated and
|
||||||
@@ -2980,10 +2985,10 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);
|
|||||||
* @remark The size of the specified gamma ramp should match the size of the
|
* @remark The size of the specified gamma ramp should match the size of the
|
||||||
* current ramp for that monitor.
|
* current ramp for that monitor.
|
||||||
*
|
*
|
||||||
* @remark @win32 The gamma ramp size must be 256.
|
* @remark __Win32:__ The gamma ramp size must be 256.
|
||||||
*
|
*
|
||||||
* @remark @wayland Gamma handling is a privileged protocol, this function
|
* @remark __Wayland:__ Monitor gamma is a privileged protocol, so this function
|
||||||
* will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE.
|
* cannot be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @pointer_lifetime The specified gamma ramp is copied before this function
|
* @pointer_lifetime The specified gamma ramp is copied before this function
|
||||||
* returns.
|
* returns.
|
||||||
@@ -3158,32 +3163,32 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
* GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref
|
* GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref
|
||||||
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.
|
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @win32 Window creation will fail if the Microsoft GDI software
|
* @remark __Win32:__ Window creation will fail if the Microsoft GDI software
|
||||||
* OpenGL implementation is the only one available.
|
* OpenGL implementation is the only one available.
|
||||||
*
|
*
|
||||||
* @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it
|
* @remark __Win32:__ If the executable has an icon resource named `GLFW_ICON,` it
|
||||||
* will be set as the initial icon for the window. If no such icon is present,
|
* will be set as the initial icon for the window. If no such icon is present,
|
||||||
* the `IDI_APPLICATION` icon will be used instead. To set a different icon,
|
* the `IDI_APPLICATION` icon will be used instead. To set a different icon,
|
||||||
* see @ref glfwSetWindowIcon.
|
* see @ref glfwSetWindowIcon.
|
||||||
*
|
*
|
||||||
* @remark @win32 The context to share resources with must not be current on
|
* @remark __Win32:__ The context to share resources with must not be current on
|
||||||
* any other thread.
|
* any other thread.
|
||||||
*
|
*
|
||||||
* @remark @macos The OS only supports core profile contexts for OpenGL
|
* @remark __macOS:__ The OS only supports core profile contexts for OpenGL
|
||||||
* versions 3.2 and later. Before creating an OpenGL context of version 3.2 or
|
* versions 3.2 and later. Before creating an OpenGL context of version 3.2 or
|
||||||
* later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint)
|
* later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint)
|
||||||
* hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all
|
* hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all
|
||||||
* on macOS.
|
* on macOS.
|
||||||
*
|
*
|
||||||
* @remark @macos The GLFW window has no icon, as it is not a document
|
* @remark __macOS:__ The GLFW window has no icon, as it is not a document
|
||||||
* window, but the dock icon will be the same as the application bundle's icon.
|
* window, but the dock icon will be the same as the application bundle's icon.
|
||||||
* For more information on bundles, see the
|
* For more information on bundles, see the
|
||||||
* [Bundle Programming Guide][bundle-guide] in the Mac Developer Library.
|
* [Bundle Programming Guide][bundle-guide] in the Mac Developer Library.
|
||||||
*
|
*
|
||||||
* [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/
|
* [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/
|
||||||
*
|
*
|
||||||
* @remark @macos On OS X 10.10 and later the window frame will not be rendered
|
* @remark __macOS:__ The window frame will not be rendered at full resolution
|
||||||
* at full resolution on Retina displays unless the
|
* on Retina displays unless the
|
||||||
* [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint)
|
* [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint)
|
||||||
* hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the
|
* hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the
|
||||||
* application bundle's `Info.plist`. For more information, see
|
* application bundle's `Info.plist`. For more information, see
|
||||||
@@ -3194,11 +3199,11 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
*
|
*
|
||||||
* [hidpi-guide]: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
|
* [hidpi-guide]: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
|
||||||
*
|
*
|
||||||
* @remark @macos When activating frame autosaving with
|
* @remark __macOS:__ When activating frame autosaving with
|
||||||
* [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified
|
* [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified
|
||||||
* window size and position may be overridden by previously saved values.
|
* window size and position may be overridden by previously saved values.
|
||||||
*
|
*
|
||||||
* @remark @wayland GLFW uses [libdecor][] where available to create its window
|
* @remark __Wayland:__ GLFW uses [libdecor][] where available to create its window
|
||||||
* decorations. This in turn uses server-side XDG decorations where available
|
* decorations. This in turn uses server-side XDG decorations where available
|
||||||
* and provides high quality client-side decorations on compositors like GNOME.
|
* and provides high quality client-side decorations on compositors like GNOME.
|
||||||
* If both XDG decorations and libdecor are unavailable, GLFW falls back to
|
* If both XDG decorations and libdecor are unavailable, GLFW falls back to
|
||||||
@@ -3207,15 +3212,15 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
*
|
*
|
||||||
* [libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor
|
* [libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor
|
||||||
*
|
*
|
||||||
* @remark @x11 Some window managers will not respect the placement of
|
* @remark __X11:__ Some window managers will not respect the placement of
|
||||||
* initially hidden windows.
|
* initially hidden windows.
|
||||||
*
|
*
|
||||||
* @remark @x11 Due to the asynchronous nature of X11, it may take a moment for
|
* @remark __X11:__ Due to the asynchronous nature of X11, it may take a moment for
|
||||||
* a window to reach its requested state. This means you may not be able to
|
* a window to reach its requested state. This means you may not be able to
|
||||||
* query the final size, position or other attributes directly after window
|
* query the final size, position or other attributes directly after window
|
||||||
* creation.
|
* creation.
|
||||||
*
|
*
|
||||||
* @remark @x11 The class part of the `WM_CLASS` window property will by
|
* @remark __X11:__ The class part of the `WM_CLASS` window property will by
|
||||||
* default be set to the window title passed to this function. The instance
|
* default be set to the window title passed to this function. The instance
|
||||||
* part will use the contents of the `RESOURCE_NAME` environment variable, if
|
* part will use the contents of the `RESOURCE_NAME` environment variable, if
|
||||||
* present and not empty, or fall back to the window title. Set the
|
* present and not empty, or fall back to the window title. Set the
|
||||||
@@ -3348,7 +3353,7 @@ GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @macos The window title will not be updated until the next time you
|
* @remark __macOS:__ The window title will not be updated until the next time you
|
||||||
* process events.
|
* process events.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3357,7 +3362,7 @@ GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* window);
|
|||||||
* @sa @ref glfwGetWindowTitle
|
* @sa @ref glfwGetWindowTitle
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3391,14 +3396,14 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);
|
|||||||
* @pointer_lifetime The specified image data is copied before this function
|
* @pointer_lifetime The specified image data is copied before this function
|
||||||
* returns.
|
* returns.
|
||||||
*
|
*
|
||||||
* @remark @macos Regular windows do not have icons on macOS. This function
|
* @remark __macOS:__ Regular windows do not have icons on macOS. This function
|
||||||
* will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as
|
* will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as
|
||||||
* the application bundle's icon. For more information on bundles, see the
|
* the application bundle's icon. For more information on bundles, see the
|
||||||
* [Bundle Programming Guide][bundle-guide] in the Mac Developer Library.
|
* [Bundle Programming Guide][bundle-guide] in the Mac Developer Library.
|
||||||
*
|
*
|
||||||
* [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/
|
* [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no existing protocol to change an icon, the
|
* @remark __Wayland:__ There is no existing protocol to change an icon, the
|
||||||
* window will thus inherit the one defined in the application's desktop file.
|
* window will thus inherit the one defined in the application's desktop file.
|
||||||
* This function will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
* This function will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
@@ -3429,8 +3434,8 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* i
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no way for an application to retrieve the global
|
* @remark __Wayland:__ Window positions are not currently part of any common
|
||||||
* position of its windows. This function will emit @ref
|
* Wayland protocol, so this function cannot be implemented and will emit @ref
|
||||||
* GLFW_FEATURE_UNAVAILABLE.
|
* GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3463,8 +3468,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no way for an application to set the global
|
* @remark __Wayland:__ Window positions are not currently part of any common
|
||||||
* position of its windows. This function will emit @ref
|
* Wayland protocol, so this function cannot be implemented and will emit @ref
|
||||||
* GLFW_FEATURE_UNAVAILABLE.
|
* GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3473,7 +3478,7 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
|
|||||||
* @sa @ref glfwGetWindowPos
|
* @sa @ref glfwGetWindowPos
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3503,7 +3508,7 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
|
|||||||
* @sa @ref glfwSetWindowSize
|
* @sa @ref glfwSetWindowSize
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3538,7 +3543,7 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
|||||||
* @remark If you set size limits and an aspect ratio that conflict, the
|
* @remark If you set size limits and an aspect ratio that conflict, the
|
||||||
* results are undefined.
|
* results are undefined.
|
||||||
*
|
*
|
||||||
* @remark @wayland The size limits will not be applied until the window is
|
* @remark __Wayland:__ The size limits will not be applied until the window is
|
||||||
* actually resized, either by the user or by the compositor.
|
* actually resized, either by the user or by the compositor.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3581,7 +3586,7 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minhe
|
|||||||
* @remark If you set size limits and an aspect ratio that conflict, the
|
* @remark If you set size limits and an aspect ratio that conflict, the
|
||||||
* results are undefined.
|
* results are undefined.
|
||||||
*
|
*
|
||||||
* @remark @wayland The aspect ratio will not be applied until the window is
|
* @remark __Wayland:__ The aspect ratio will not be applied until the window is
|
||||||
* actually resized, either by the user or by the compositor.
|
* actually resized, either by the user or by the compositor.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3627,7 +3632,7 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
|
|||||||
* @sa @ref glfwSetWindowMonitor
|
* @sa @ref glfwSetWindowMonitor
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3777,7 +3782,7 @@ GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no way to set an opacity factor for a window.
|
* @remark __Wayland:__ There is no way to set an opacity factor for a window.
|
||||||
* This function will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
* This function will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3806,10 +3811,6 @@ GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland Once a window is iconified, @ref glfwRestoreWindow won’t
|
|
||||||
* be able to restore it. This is a design decision of the xdg-shell
|
|
||||||
* protocol.
|
|
||||||
*
|
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
* @sa @ref window_iconify
|
* @sa @ref window_iconify
|
||||||
@@ -3817,7 +3818,7 @@ GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity);
|
|||||||
* @sa @ref glfwMaximizeWindow
|
* @sa @ref glfwMaximizeWindow
|
||||||
*
|
*
|
||||||
* @since Added in version 2.1.
|
* @since Added in version 2.1.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3837,6 +3838,10 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
|
* @remark __Wayland:__ Restoring a window from maximization is not currently
|
||||||
|
* part of any common Wayland protocol, so this function can only restore
|
||||||
|
* windows from maximization.
|
||||||
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
* @sa @ref window_iconify
|
* @sa @ref window_iconify
|
||||||
@@ -3844,7 +3849,7 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow* window);
|
|||||||
* @sa @ref glfwMaximizeWindow
|
* @sa @ref glfwMaximizeWindow
|
||||||
*
|
*
|
||||||
* @since Added in version 2.1.
|
* @since Added in version 2.1.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -3891,7 +3896,7 @@ GLFWAPI void glfwMaximizeWindow(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland Because Wayland wants every frame of the desktop to be
|
* @remark __Wayland:__ Because Wayland wants every frame of the desktop to be
|
||||||
* complete, this function does not immediately make the window visible.
|
* complete, this function does not immediately make the window visible.
|
||||||
* Instead it will become visible the next time the window framebuffer is
|
* Instead it will become visible the next time the window framebuffer is
|
||||||
* updated after this call.
|
* updated after this call.
|
||||||
@@ -3954,7 +3959,7 @@ GLFWAPI void glfwHideWindow(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland The compositor will likely ignore focus requests unless
|
* @remark __Wayland:__ The compositor will likely ignore focus requests unless
|
||||||
* another window created by the same application already has input focus.
|
* another window created by the same application already has input focus.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -3982,7 +3987,7 @@ GLFWAPI void glfwFocusWindow(GLFWwindow* window);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @macos Attention is requested to the application as a whole, not the
|
* @remark __macOS:__ Attention is requested to the application as a whole, not the
|
||||||
* specific window.
|
* specific window.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -4057,8 +4062,8 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);
|
|||||||
* affected by any resizing or mode switching, although you may need to update
|
* affected by any resizing or mode switching, although you may need to update
|
||||||
* your viewport if the framebuffer size has changed.
|
* your viewport if the framebuffer size has changed.
|
||||||
*
|
*
|
||||||
* @remark @wayland The desired window position is ignored, as there is no way
|
* @remark __Wayland:__ Window positions are not currently part of any common
|
||||||
* for an application to set this property.
|
* Wayland protocol. The window position arguments are ignored.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -4095,8 +4100,9 @@ GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int
|
|||||||
* errors. However, this function should not fail as long as it is passed
|
* errors. However, this function should not fail as long as it is passed
|
||||||
* valid arguments and the library has been [initialized](@ref intro_init).
|
* valid arguments and the library has been [initialized](@ref intro_init).
|
||||||
*
|
*
|
||||||
* @remark @wayland The Wayland protocol provides no way to check whether a
|
* @remark __Wayland:__ Checking whether a window is iconified is not currently
|
||||||
* window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`.
|
* part of any common Wayland protocol, so the @ref GLFW_ICONIFIED attribute
|
||||||
|
* cannot be implemented and is always `GLFW_FALSE`.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -4138,7 +4144,7 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib);
|
|||||||
* @remark Calling @ref glfwGetWindowAttrib will always return the latest
|
* @remark Calling @ref glfwGetWindowAttrib will always return the latest
|
||||||
* value, even if that value is ignored by the current mode of the window.
|
* value, even if that value is ignored by the current mode of the window.
|
||||||
*
|
*
|
||||||
* @remark @wayland The [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) window attribute is
|
* @remark __Wayland:__ The [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) window attribute is
|
||||||
* not supported. Setting this will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
* not supported. Setting this will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -4218,8 +4224,8 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window);
|
|||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
*
|
*
|
||||||
* @remark @wayland This callback will never be called, as there is no way for
|
* @remark __Wayland:__ This callback will not be called. The Wayland protocol
|
||||||
* an application to know its global position.
|
* provides no way to be notified of when a window is moved.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -4257,7 +4263,7 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindow
|
|||||||
* @sa @ref window_size
|
* @sa @ref window_size
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -4289,7 +4295,7 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
|
|||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
*
|
*
|
||||||
* @remark @macos Selecting Quit from the application menu will trigger the
|
* @remark __macOS:__ Selecting Quit from the application menu will trigger the
|
||||||
* close callback for all windows.
|
* close callback for all windows.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -4297,7 +4303,7 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
|
|||||||
* @sa @ref window_close
|
* @sa @ref window_close
|
||||||
*
|
*
|
||||||
* @since Added in version 2.5.
|
* @since Added in version 2.5.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -4333,7 +4339,7 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwi
|
|||||||
* @sa @ref window_refresh
|
* @sa @ref window_refresh
|
||||||
*
|
*
|
||||||
* @since Added in version 2.5.
|
* @since Added in version 2.5.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -4394,6 +4400,10 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi
|
|||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
*
|
*
|
||||||
|
* @remark __Wayland:__ This callback will not be called. The Wayland protocol
|
||||||
|
* provides no way to be notified of when a window is iconified, and no way to
|
||||||
|
* check whether a window is currently iconified.
|
||||||
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
* @sa @ref window_iconify
|
* @sa @ref window_iconify
|
||||||
@@ -4514,7 +4524,8 @@ GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow*
|
|||||||
* GLFW will pass those events on to the application callbacks before
|
* GLFW will pass those events on to the application callbacks before
|
||||||
* returning.
|
* returning.
|
||||||
*
|
*
|
||||||
* Event processing is not required for joystick input to work.
|
* Event processing is not required to receive joystick input. Joystick state
|
||||||
|
* is polled when a joystick input or gamepad input function is called.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
@@ -4559,7 +4570,8 @@ GLFWAPI void glfwPollEvents(void);
|
|||||||
* GLFW will pass those events on to the application callbacks before
|
* GLFW will pass those events on to the application callbacks before
|
||||||
* returning.
|
* returning.
|
||||||
*
|
*
|
||||||
* Event processing is not required for joystick input to work.
|
* Event processing is not required to receive joystick input. Joystick state
|
||||||
|
* is polled when a joystick input or gamepad input function is called.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
@@ -4606,7 +4618,8 @@ GLFWAPI void glfwWaitEvents(void);
|
|||||||
* GLFW will pass those events on to the application callbacks before
|
* GLFW will pass those events on to the application callbacks before
|
||||||
* returning.
|
* returning.
|
||||||
*
|
*
|
||||||
* Event processing is not required for joystick input to work.
|
* Event processing is not required to receive joystick input. Joystick state
|
||||||
|
* is polled when a joystick input or gamepad input function is called.
|
||||||
*
|
*
|
||||||
* @param[in] timeout The maximum amount of time, in seconds, to wait.
|
* @param[in] timeout The maximum amount of time, in seconds, to wait.
|
||||||
*
|
*
|
||||||
@@ -4676,8 +4689,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
*
|
*
|
||||||
* This function sets an input mode option for the specified window. The mode
|
* This function sets an input mode option for the specified window. The mode
|
||||||
* must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
|
* must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
|
||||||
* @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or
|
* @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS
|
||||||
* @ref GLFW_RAW_MOUSE_MOTION.
|
* @ref GLFW_RAW_MOUSE_MOTION, or @ref GLFW_UNLIMITED_MOUSE_BUTTONS.
|
||||||
*
|
*
|
||||||
* If the mode is `GLFW_CURSOR`, the value must be one of the following cursor
|
* If the mode is `GLFW_CURSOR`, the value must be one of the following cursor
|
||||||
* modes:
|
* modes:
|
||||||
@@ -4717,6 +4730,11 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
* attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref
|
* attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref
|
||||||
* glfwRawMouseMotionSupported to check for support.
|
* glfwRawMouseMotionSupported to check for support.
|
||||||
*
|
*
|
||||||
|
* If the mode is `GLFW_UNLIMITED_MOUSE_BUTTONS`, the value must be either
|
||||||
|
* `GLFW_TRUE` to disable the mouse button limit when calling the mouse button
|
||||||
|
* callback, or `GLFW_FALSE` to limit the mouse buttons sent to the callback
|
||||||
|
* to the mouse button token values up to `GLFW_MOUSE_BUTTON_LAST`.
|
||||||
|
*
|
||||||
* @param[in] window The window whose input mode to set.
|
* @param[in] window The window whose input mode to set.
|
||||||
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
|
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
|
||||||
* `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
|
* `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
|
||||||
@@ -4894,7 +4912,7 @@ GLFWAPI int glfwGetKeyScancode(int key);
|
|||||||
* @sa @ref input_key
|
* @sa @ref input_key
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -4911,8 +4929,11 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key);
|
|||||||
* returns `GLFW_PRESS` the first time you call it for a mouse button that was
|
* returns `GLFW_PRESS` the first time you call it for a mouse button that was
|
||||||
* pressed, even if that mouse button has already been released.
|
* pressed, even if that mouse button has already been released.
|
||||||
*
|
*
|
||||||
|
* The @ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode does not effect the
|
||||||
|
* limit on buttons which can be polled with this function.
|
||||||
|
*
|
||||||
* @param[in] window The desired window.
|
* @param[in] window The desired window.
|
||||||
* @param[in] button The desired [mouse button](@ref buttons).
|
* @param[in] button The desired [mouse button token](@ref buttons).
|
||||||
* @return One of `GLFW_PRESS` or `GLFW_RELEASE`.
|
* @return One of `GLFW_PRESS` or `GLFW_RELEASE`.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
@@ -4923,7 +4944,7 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key);
|
|||||||
* @sa @ref input_mouse_button
|
* @sa @ref input_mouse_button
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -4993,7 +5014,7 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
||||||
*
|
*
|
||||||
* @remark @wayland This function will only work when the cursor mode is
|
* @remark __Wayland:__ This function will only work when the cursor mode is
|
||||||
* `GLFW_CURSOR_DISABLED`, otherwise it will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
* `GLFW_CURSOR_DISABLED`, otherwise it will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
@@ -5191,7 +5212,7 @@ GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
|
|||||||
* @sa @ref input_key
|
* @sa @ref input_key
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -5234,7 +5255,7 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback);
|
|||||||
* @sa @ref input_char
|
* @sa @ref input_char
|
||||||
*
|
*
|
||||||
* @since Added in version 2.4.
|
* @since Added in version 2.4.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -5288,10 +5309,15 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmods
|
|||||||
* is called when a mouse button is pressed or released.
|
* is called when a mouse button is pressed or released.
|
||||||
*
|
*
|
||||||
* When a window loses input focus, it will generate synthetic mouse button
|
* When a window loses input focus, it will generate synthetic mouse button
|
||||||
* release events for all pressed mouse buttons. You can tell these events
|
* release events for all pressed mouse buttons with associated button tokens.
|
||||||
* from user-generated events by the fact that the synthetic ones are generated
|
* You can tell these events from user-generated events by the fact that the
|
||||||
* after the focus loss event has been processed, i.e. after the
|
* synthetic ones are generated after the focus loss event has been processed,
|
||||||
* [window focus callback](@ref glfwSetWindowFocusCallback) has been called.
|
* i.e. after the [window focus callback](@ref glfwSetWindowFocusCallback) has
|
||||||
|
* been called.
|
||||||
|
*
|
||||||
|
* The reported `button` value can be higher than `GLFW_MOUSE_BUTTON_LAST` if
|
||||||
|
* the button does not have an associated [button token](@ref buttons) and the
|
||||||
|
* @ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode is set.
|
||||||
*
|
*
|
||||||
* @param[in] window The window whose callback to set.
|
* @param[in] window The window whose callback to set.
|
||||||
* @param[in] callback The new callback, or `NULL` to remove the currently set
|
* @param[in] callback The new callback, or `NULL` to remove the currently set
|
||||||
@@ -5313,7 +5339,7 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmods
|
|||||||
* @sa @ref input_mouse_button
|
* @sa @ref input_mouse_button
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter and return value.
|
* __GLFW 3:__ Added window handle parameter and return value.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -5543,7 +5569,7 @@ GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count);
|
|||||||
* @sa @ref joystick_button
|
* @sa @ref joystick_button
|
||||||
*
|
*
|
||||||
* @since Added in version 2.2.
|
* @since Added in version 2.2.
|
||||||
* @glfw3 Changed to return a dynamic array.
|
* __GLFW 3:__ Changed to return a dynamic array.
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
@@ -5907,7 +5933,7 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @win32 The clipboard on Windows has a single global lock for reading and
|
* @remark __Win32:__ The clipboard on Windows has a single global lock for reading and
|
||||||
* writing. GLFW tries to acquire it a few times, which is almost always enough. If it
|
* writing. GLFW tries to acquire it a few times, which is almost always enough. If it
|
||||||
* cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns.
|
* cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns.
|
||||||
* It is safe to try this multiple times.
|
* It is safe to try this multiple times.
|
||||||
@@ -5940,7 +5966,7 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
* GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @win32 The clipboard on Windows has a single global lock for reading and
|
* @remark __Win32:__ The clipboard on Windows has a single global lock for reading and
|
||||||
* writing. GLFW tries to acquire it a few times, which is almost always enough. If it
|
* writing. GLFW tries to acquire it a few times, which is almost always enough. If it
|
||||||
* cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns.
|
* cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns.
|
||||||
* It is safe to try this multiple times.
|
* It is safe to try this multiple times.
|
||||||
@@ -6148,6 +6174,10 @@ GLFWAPI GLFWwindow* glfwGetCurrentContext(void);
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.
|
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
|
* @remark __Wayland:__ When the swap interval is greater than zero and the
|
||||||
|
* window is not in view, this function may take a few extra milliseconds to
|
||||||
|
* return.
|
||||||
|
*
|
||||||
* @remark __EGL:__ The context of the specified window must be current on the
|
* @remark __EGL:__ The context of the specified window must be current on the
|
||||||
* calling thread.
|
* calling thread.
|
||||||
*
|
*
|
||||||
@@ -6157,7 +6187,7 @@ GLFWAPI GLFWwindow* glfwGetCurrentContext(void);
|
|||||||
* @sa @ref glfwSwapInterval
|
* @sa @ref glfwSwapInterval
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* __GLFW 3:__ Added window handle parameter.
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
@@ -6424,7 +6454,7 @@ GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* p
|
|||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
* GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @macos This function currently always returns `GLFW_TRUE`, as the
|
* @remark __macOS:__ This function currently always returns `GLFW_TRUE`, as the
|
||||||
* `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide
|
* `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide
|
||||||
* a `vkGetPhysicalDevice*PresentationSupport` type function.
|
* a `vkGetPhysicalDevice*PresentationSupport` type function.
|
||||||
*
|
*
|
||||||
@@ -6482,15 +6512,15 @@ GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhys
|
|||||||
* @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should
|
* @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should
|
||||||
* eliminate almost all occurrences of these errors.
|
* eliminate almost all occurrences of these errors.
|
||||||
*
|
*
|
||||||
* @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the
|
* @remark __macOS:__ GLFW prefers the `VK_EXT_metal_surface` extension, with the
|
||||||
* `VK_MVK_macos_surface` extension as a fallback. The name of the selected
|
* `VK_MVK_macos_surface` extension as a fallback. The name of the selected
|
||||||
* extension, if any, is included in the array returned by @ref
|
* extension, if any, is included in the array returned by @ref
|
||||||
* glfwGetRequiredInstanceExtensions.
|
* glfwGetRequiredInstanceExtensions.
|
||||||
*
|
*
|
||||||
* @remark @macos This function creates and sets a `CAMetalLayer` instance for
|
* @remark __macOS:__ This function creates and sets a `CAMetalLayer` instance for
|
||||||
* the window content view, which is required for MoltenVK to function.
|
* the window content view, which is required for MoltenVK to function.
|
||||||
*
|
*
|
||||||
* @remark @x11 By default GLFW prefers the `VK_KHR_xcb_surface` extension,
|
* @remark __X11:__ By default GLFW prefers the `VK_KHR_xcb_surface` extension,
|
||||||
* with the `VK_KHR_xlib_surface` extension as a fallback. You can make
|
* with the `VK_KHR_xlib_surface` extension as a fallback. You can make
|
||||||
* `VK_KHR_xlib_surface` the preferred extension by setting the
|
* `VK_KHR_xlib_surface` the preferred extension by setting the
|
||||||
* [GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init
|
* [GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.4 - www.glfw.org
|
* GLFW 3.5 - 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
|
||||||
@@ -478,6 +478,29 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
|||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Retrieves the `GLXFBConfig` of the specified window's `GLXWindow`.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose `GLXWindow` to query.
|
||||||
|
* @param[out] config The `GLXFBConfig` of the window `GLXWindow`, if available.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
|
* @remark `GLXFBConfig` is an opaque type. Unlike other GLFW functions, the
|
||||||
|
* @p config out parameter is not cleared on error, as core GLX does not define
|
||||||
|
* any invalid value.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.5
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetGLXFBConfig(GLFWwindow* window, GLXFBConfig* config);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
@@ -586,6 +609,29 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
|||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Retrieves the `EGLConfig` of the specified window's `EGLSurface`.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose `EGLSurface` to query.
|
||||||
|
* @param[out] config The `EGLConfig` of the window `EGLSurface`, if available.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
|
* @remark `EGLConfig` is an opaque type. Unlike other GLFW functions, the @p
|
||||||
|
* config out parameter is not cleared on error, as core EGL does not define
|
||||||
|
* any invalid value.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.5.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetEGLConfig(GLFWwindow* window, EGLConfig* config);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
||||||
|
|||||||
+23
-45
@@ -10,7 +10,7 @@ add_library(glfw ${GLFW_LIBRARY_TYPE}
|
|||||||
# The time, thread and module code is shared between all backends on a given OS,
|
# 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
|
# 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
|
target_sources(glfw PRIVATE macos_time.h macos_time.c posix_thread.h
|
||||||
posix_module.c posix_thread.c)
|
posix_module.c posix_thread.c)
|
||||||
elseif (WIN32)
|
elseif (WIN32)
|
||||||
target_sources(glfw PRIVATE win32_time.h win32_thread.h win32_module.c
|
target_sources(glfw PRIVATE win32_time.h win32_thread.h win32_module.c
|
||||||
@@ -30,6 +30,7 @@ add_custom_target(update_mappings
|
|||||||
set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3")
|
set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3")
|
||||||
|
|
||||||
if (GLFW_BUILD_COCOA)
|
if (GLFW_BUILD_COCOA)
|
||||||
|
enable_language(OBJC)
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_COCOA)
|
target_compile_definitions(glfw PRIVATE _GLFW_COCOA)
|
||||||
target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h cocoa_init.m
|
target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h cocoa_init.m
|
||||||
cocoa_joystick.m cocoa_monitor.m cocoa_window.m
|
cocoa_joystick.m cocoa_monitor.m cocoa_window.m
|
||||||
@@ -45,15 +46,15 @@ endif()
|
|||||||
|
|
||||||
if (GLFW_BUILD_X11)
|
if (GLFW_BUILD_X11)
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_X11)
|
target_compile_definitions(glfw PRIVATE _GLFW_X11)
|
||||||
target_sources(glfw PRIVATE x11_platform.h xkb_unicode.h x11_init.c
|
target_sources(glfw PRIVATE x11_platform.h x11_init.c
|
||||||
x11_monitor.c x11_window.c xkb_unicode.c
|
x11_monitor.c x11_window.c xkb_unicode.c
|
||||||
glx_context.c)
|
glx_context.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
if (GLFW_BUILD_WAYLAND)
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_WAYLAND)
|
target_compile_definitions(glfw PRIVATE _GLFW_WAYLAND)
|
||||||
target_sources(glfw PRIVATE wl_platform.h xkb_unicode.h wl_init.c
|
target_sources(glfw PRIVATE wl_platform.h wl_init.c
|
||||||
wl_monitor.c wl_window.c xkb_unicode.c)
|
wl_monitor.c wl_window.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GLFW_BUILD_X11 OR GLFW_BUILD_WAYLAND)
|
if (GLFW_BUILD_X11 OR GLFW_BUILD_WAYLAND)
|
||||||
@@ -137,13 +138,6 @@ target_include_directories(glfw PRIVATE
|
|||||||
"${GLFW_BINARY_DIR}/src")
|
"${GLFW_BINARY_DIR}/src")
|
||||||
target_link_libraries(glfw PRIVATE Threads::Threads)
|
target_link_libraries(glfw PRIVATE Threads::Threads)
|
||||||
|
|
||||||
# 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)
|
if (GLFW_BUILD_WIN32)
|
||||||
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
||||||
endif()
|
endif()
|
||||||
@@ -151,10 +145,11 @@ endif()
|
|||||||
if (GLFW_BUILD_COCOA)
|
if (GLFW_BUILD_COCOA)
|
||||||
target_link_libraries(glfw PRIVATE "-framework Cocoa"
|
target_link_libraries(glfw PRIVATE "-framework Cocoa"
|
||||||
"-framework IOKit"
|
"-framework IOKit"
|
||||||
"-framework CoreFoundation")
|
"-framework QuartzCore")
|
||||||
|
|
||||||
set(glfw_PKG_DEPS "")
|
list(APPEND glfw_PKG_LIBS "-framework Cocoa"
|
||||||
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation")
|
"-framework IOKit"
|
||||||
|
"-framework QuartzCore")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GLFW_BUILD_WAYLAND)
|
if (GLFW_BUILD_WAYLAND)
|
||||||
@@ -239,6 +234,11 @@ if (UNIX AND NOT APPLE)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
target_link_libraries(glfw PRIVATE "-framework CoreFoundation")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-framework CoreFoundation")
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (GLFW_USE_HYBRID_HPG)
|
if (GLFW_USE_HYBRID_HPG)
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_USE_HYBRID_HPG)
|
target_compile_definitions(glfw PRIVATE _GLFW_USE_HYBRID_HPG)
|
||||||
@@ -260,24 +260,6 @@ if (GLFW_BUILD_WIN32)
|
|||||||
target_compile_definitions(glfw PRIVATE UNICODE _UNICODE)
|
target_compile_definitions(glfw PRIVATE UNICODE _UNICODE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# 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
|
|
||||||
# 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.
|
|
||||||
if (MINGW)
|
|
||||||
target_compile_definitions(glfw PRIVATE WINVER=0x0501)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for legacy MinGW not providing XInput and DirectInput
|
|
||||||
if (MINGW)
|
|
||||||
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)
|
|
||||||
target_include_directories(glfw PRIVATE "${GLFW_SOURCE_DIR}/deps/mingw")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for the MS CRT deprecating parts of the standard library
|
# Workaround for the MS CRT deprecating parts of the standard library
|
||||||
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
@@ -291,10 +273,6 @@ endif()
|
|||||||
if (GLFW_BUILD_SHARED_LIBRARY)
|
if (GLFW_BUILD_SHARED_LIBRARY)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
# Remove the dependency on the shared version of libgcc
|
|
||||||
# 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)
|
# Remove the lib prefix on the DLL (but not the import library)
|
||||||
set_target_properties(glfw PROPERTIES PREFIX "")
|
set_target_properties(glfw PROPERTIES PREFIX "")
|
||||||
|
|
||||||
@@ -312,30 +290,34 @@ if (GLFW_BUILD_SHARED_LIBRARY)
|
|||||||
if (MINGW)
|
if (MINGW)
|
||||||
# Enable link-time exploit mitigation features enabled by default on MSVC
|
# Enable link-time exploit mitigation features enabled by default on MSVC
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
|
||||||
# Compatibility with data execution prevention (DEP)
|
# Compatibility with data execution prevention (DEP)
|
||||||
|
cmake_push_check_state()
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
||||||
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
||||||
if (_GLFW_HAS_DEP)
|
if (_GLFW_HAS_DEP)
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--nxcompat")
|
target_link_libraries(glfw PRIVATE "-Wl,--nxcompat")
|
||||||
endif()
|
endif()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
# Compatibility with address space layout randomization (ASLR)
|
# Compatibility with address space layout randomization (ASLR)
|
||||||
|
cmake_push_check_state()
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
||||||
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
||||||
if (_GLFW_HAS_ASLR)
|
if (_GLFW_HAS_ASLR)
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--dynamicbase")
|
target_link_libraries(glfw PRIVATE "-Wl,--dynamicbase")
|
||||||
endif()
|
endif()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
# Compatibility with 64-bit address space layout randomization (ASLR)
|
# Compatibility with 64-bit address space layout randomization (ASLR)
|
||||||
|
cmake_push_check_state()
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
||||||
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
||||||
if (_GLFW_HAS_64ASLR)
|
if (_GLFW_HAS_64ASLR)
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--high-entropy-va")
|
target_link_libraries(glfw PRIVATE "-Wl,--high-entropy-va")
|
||||||
endif()
|
endif()
|
||||||
|
cmake_pop_check_state()
|
||||||
# Clear flags again to avoid breaking later tests
|
|
||||||
set(CMAKE_REQUIRED_FLAGS)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
@@ -344,12 +326,8 @@ if (GLFW_BUILD_SHARED_LIBRARY)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(arg ${glfw_PKG_DEPS})
|
list(JOIN glfw_PKG_DEPS " " deps)
|
||||||
string(APPEND deps " ${arg}")
|
list(JOIN glfw_PKG_LIBS " " libs)
|
||||||
endforeach()
|
|
||||||
foreach(arg ${glfw_PKG_LIBS})
|
|
||||||
string(APPEND libs " ${arg}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(GLFW_PKG_CONFIG_REQUIRES_PRIVATE "${deps}" CACHE INTERNAL
|
set(GLFW_PKG_CONFIG_REQUIRES_PRIVATE "${deps}" CACHE INTERNAL
|
||||||
"GLFW pkg-config Requires.private")
|
"GLFW pkg-config Requires.private")
|
||||||
|
|||||||
+3
-36
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -450,41 +450,6 @@ static GLFWbool initializeTIS(void)
|
|||||||
|
|
||||||
@end // GLFWApplicationDelegate
|
@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 //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@@ -688,6 +653,8 @@ void _glfwTerminateCocoa(void)
|
|||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateOSMesa();
|
||||||
|
|
||||||
|
memset(&_glfw.ns, 0, sizeof(_glfw.ns));
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.5 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.5 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>
|
// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>
|
||||||
|
|||||||
+8
-5
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 Cocoa - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
@@ -136,7 +137,7 @@ static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
|||||||
if (flags & kDisplayModeStretchedFlag)
|
if (flags & kDisplayModeStretchedFlag)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
#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))
|
||||||
@@ -163,7 +164,7 @@ static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
|||||||
if (result.refreshRate == 0)
|
if (result.refreshRate == 0)
|
||||||
result.refreshRate = (int) round(fallbackRefreshRate);
|
result.refreshRate = (int) round(fallbackRefreshRate);
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
#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)
|
||||||
{
|
{
|
||||||
@@ -179,7 +180,7 @@ static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
|||||||
result.blueBits = 8;
|
result.blueBits = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100
|
#if MAC_OS_X_VERSION_MAX_ALLOWED == 101100
|
||||||
CFRelease(format);
|
CFRelease(format);
|
||||||
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
|
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
|
||||||
return result;
|
return result;
|
||||||
@@ -627,7 +628,6 @@ void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
|||||||
|
|
||||||
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);
|
_GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
||||||
@@ -636,6 +636,9 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
|||||||
return kCGNullDirectDisplay;
|
return kCGNullDirectDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->ns.displayID;
|
return monitor->ns.displayID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -291,8 +291,6 @@ void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor);
|
|||||||
|
|
||||||
float _glfwTransformYCocoa(float y);
|
float _glfwTransformYCocoa(float y);
|
||||||
|
|
||||||
void* _glfwLoadLocalVulkanLoaderCocoa(void);
|
|
||||||
|
|
||||||
GLFWbool _glfwInitNSGL(void);
|
GLFWbool _glfwInitNSGL(void);
|
||||||
void _glfwTerminateNSGL(void);
|
void _glfwTerminateNSGL(void);
|
||||||
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
||||||
|
|||||||
+40
-21
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -28,8 +28,11 @@
|
|||||||
|
|
||||||
#if defined(_GLFW_COCOA)
|
#if defined(_GLFW_COCOA)
|
||||||
|
|
||||||
|
#import <QuartzCore/CAMetalLayer.h>
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
// HACK: This enum value is missing from framework headers on OS X 10.11 despite
|
// HACK: This enum value is missing from framework headers on OS X 10.11 despite
|
||||||
// having been (according to documentation) added in Mac OS X 10.7
|
// having been (according to documentation) added in Mac OS X 10.7
|
||||||
@@ -309,7 +312,6 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
|
|
||||||
- (void)windowDidChangeOcclusionState:(NSNotification* )notification
|
- (void)windowDidChangeOcclusionState:(NSNotification* )notification
|
||||||
{
|
{
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090
|
|
||||||
if ([window->ns.object respondsToSelector:@selector(occlusionState)])
|
if ([window->ns.object respondsToSelector:@selector(occlusionState)])
|
||||||
{
|
{
|
||||||
if ([window->ns.object occlusionState] & NSWindowOcclusionStateVisible)
|
if ([window->ns.object occlusionState] & NSWindowOcclusionStateVisible)
|
||||||
@@ -317,7 +319,6 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
else
|
else
|
||||||
window->ns.occluded = GLFW_TRUE;
|
window->ns.occluded = GLFW_TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -598,6 +599,34 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
_glfwInputKey(window, key, [event keyCode], GLFW_RELEASE, mods);
|
_glfwInputKey(window, key, [event keyCode], GLFW_RELEASE, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)performKeyEquivalent:(NSEvent *)event
|
||||||
|
{
|
||||||
|
// HACK: Some key combinations are consumed before reaching keyDown:
|
||||||
|
// so we claim those events and emit them here
|
||||||
|
const int key = translateKey([event keyCode]);
|
||||||
|
const int mods = translateFlags([event modifierFlags]);
|
||||||
|
|
||||||
|
if (mods & GLFW_MOD_CONTROL)
|
||||||
|
{
|
||||||
|
if (key == GLFW_KEY_TAB || key == GLFW_KEY_ESCAPE)
|
||||||
|
{
|
||||||
|
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mods & GLFW_MOD_SUPER)
|
||||||
|
{
|
||||||
|
if (key == GLFW_KEY_PERIOD)
|
||||||
|
{
|
||||||
|
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [super performKeyEquivalent:event];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)scrollWheel:(NSEvent *)event
|
- (void)scrollWheel:(NSEvent *)event
|
||||||
{
|
{
|
||||||
double deltaX = [event scrollingDeltaX];
|
double deltaX = [event scrollingDeltaX];
|
||||||
@@ -883,7 +912,7 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
|||||||
|
|
||||||
[window->ns.object setContentView:window->ns.view];
|
[window->ns.object setContentView:window->ns.view];
|
||||||
[window->ns.object makeFirstResponder:window->ns.view];
|
[window->ns.object makeFirstResponder:window->ns.view];
|
||||||
[window->ns.object setTitle:@(wndconfig->title)];
|
[window->ns.object setTitle:@(window->title)];
|
||||||
[window->ns.object setDelegate:window->ns.delegate];
|
[window->ns.object setDelegate:window->ns.delegate];
|
||||||
[window->ns.object setAcceptsMouseMovedEvents:YES];
|
[window->ns.object setAcceptsMouseMovedEvents:YES];
|
||||||
[window->ns.object setRestorable:NO];
|
[window->ns.object setRestorable:NO];
|
||||||
@@ -1949,19 +1978,8 @@ VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance,
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101100
|
|
||||||
// HACK: Dynamically load Core Animation to avoid adding an extra
|
|
||||||
// dependency for the majority who don't use MoltenVK
|
|
||||||
NSBundle* bundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/QuartzCore.framework"];
|
|
||||||
if (!bundle)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Cocoa: Failed to find QuartzCore.framework");
|
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: Create the layer here as makeBackingLayer should not return nil
|
// NOTE: Create the layer here as makeBackingLayer should not return nil
|
||||||
window->ns.layer = [[bundle classNamed:@"CAMetalLayer"] layer];
|
window->ns.layer = [CAMetalLayer layer];
|
||||||
if (!window->ns.layer)
|
if (!window->ns.layer)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
@@ -2026,9 +2044,6 @@ VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
#else
|
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
@@ -2040,7 +2055,6 @@ VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance,
|
|||||||
|
|
||||||
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle)
|
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
||||||
@@ -2050,12 +2064,14 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle)
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
return window->ns.object;
|
return window->ns.object;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI id glfwGetCocoaView(GLFWwindow* handle)
|
GLFWAPI id glfwGetCocoaView(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
||||||
@@ -2065,6 +2081,9 @@ GLFWAPI id glfwGetCocoaView(GLFWwindow* handle)
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
return window->ns.view;
|
return window->ns.view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-7
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - 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 Löwy <elmindreda@glfw.org>
|
||||||
@@ -195,7 +195,7 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
|||||||
{
|
{
|
||||||
current = alternatives + i;
|
current = alternatives + i;
|
||||||
|
|
||||||
if (desired->stereo > 0 && current->stereo == 0)
|
if (desired->stereo && !current->stereo)
|
||||||
{
|
{
|
||||||
// Stereo is a hard constraint
|
// Stereo is a hard constraint
|
||||||
continue;
|
continue;
|
||||||
@@ -368,7 +368,12 @@ GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
|||||||
window->context.getProcAddress("glGetIntegerv");
|
window->context.getProcAddress("glGetIntegerv");
|
||||||
window->context.GetString = (PFNGLGETSTRINGPROC)
|
window->context.GetString = (PFNGLGETSTRINGPROC)
|
||||||
window->context.getProcAddress("glGetString");
|
window->context.getProcAddress("glGetString");
|
||||||
if (!window->context.GetIntegerv || !window->context.GetString)
|
window->context.Flush = (PFNGLFLUSHPROC)
|
||||||
|
window->context.getProcAddress("glFlush");
|
||||||
|
|
||||||
|
if (!window->context.GetIntegerv ||
|
||||||
|
!window->context.GetString ||
|
||||||
|
!window->context.Flush)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken");
|
||||||
glfwMakeContextCurrent((GLFWwindow*) previous);
|
glfwMakeContextCurrent((GLFWwindow*) previous);
|
||||||
@@ -615,11 +620,11 @@ GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions
|
|||||||
|
|
||||||
GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
|
GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFWwindow* previous;
|
_GLFWwindow* previous;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
previous = _glfwPlatformGetTls(&_glfw.contextSlot);
|
previous = _glfwPlatformGetTls(&_glfw.contextSlot);
|
||||||
|
|
||||||
if (window && window->context.client == GLFW_NO_API)
|
if (window && window->context.client == GLFW_NO_API)
|
||||||
@@ -647,11 +652,11 @@ GLFWAPI GLFWwindow* glfwGetCurrentContext(void)
|
|||||||
|
|
||||||
GLFWAPI void glfwSwapBuffers(GLFWwindow* handle)
|
GLFWAPI void glfwSwapBuffers(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.client == GLFW_NO_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT,
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT,
|
||||||
|
|||||||
+121
-44
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 EGL - www.glfw.org
|
// GLFW 3.5 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -92,7 +92,7 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
|||||||
EGLConfig* nativeConfigs;
|
EGLConfig* nativeConfigs;
|
||||||
_GLFWfbconfig* usableConfigs;
|
_GLFWfbconfig* usableConfigs;
|
||||||
const _GLFWfbconfig* closest;
|
const _GLFWfbconfig* closest;
|
||||||
int i, nativeCount, usableCount, apiBit;
|
int i, nativeCount, usableCount, apiBit, surfaceTypeBit;
|
||||||
GLFWbool wrongApiAvailable = GLFW_FALSE;
|
GLFWbool wrongApiAvailable = GLFW_FALSE;
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
if (ctxconfig->client == GLFW_OPENGL_ES_API)
|
||||||
@@ -105,6 +105,11 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
|||||||
else
|
else
|
||||||
apiBit = EGL_OPENGL_BIT;
|
apiBit = EGL_OPENGL_BIT;
|
||||||
|
|
||||||
|
if (_glfw.egl.platform == EGL_PLATFORM_SURFACELESS_MESA)
|
||||||
|
surfaceTypeBit = EGL_PBUFFER_BIT;
|
||||||
|
else
|
||||||
|
surfaceTypeBit = EGL_WINDOW_BIT;
|
||||||
|
|
||||||
if (fbconfig->stereo)
|
if (fbconfig->stereo)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FORMAT_UNAVAILABLE, "EGL: Stereo rendering not supported");
|
_glfwInputError(GLFW_FORMAT_UNAVAILABLE, "EGL: Stereo rendering not supported");
|
||||||
@@ -133,8 +138,7 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
|||||||
if (getEGLConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) != EGL_RGB_BUFFER)
|
if (getEGLConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) != EGL_RGB_BUFFER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Only consider window EGLConfigs
|
if (!(getEGLConfigAttrib(n, EGL_SURFACE_TYPE) & surfaceTypeBit))
|
||||||
if (!(getEGLConfigAttrib(n, EGL_SURFACE_TYPE) & EGL_WINDOW_BIT))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#if defined(_GLFW_X11)
|
#if defined(_GLFW_X11)
|
||||||
@@ -250,6 +254,12 @@ static void makeContextCurrentEGL(_GLFWwindow* window)
|
|||||||
getEGLErrorString(eglGetError()));
|
getEGLErrorString(eglGetError()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_GLFW_WAYLAND)
|
||||||
|
// NOTE: Disable EGL vsync so we can substitute our own that includes a timeout
|
||||||
|
if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND)
|
||||||
|
eglSwapInterval(_glfw.egl.display, 0);
|
||||||
|
#endif // _GLFW_WAYLAND
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -283,6 +293,15 @@ static void swapBuffersEGL(_GLFWwindow* window)
|
|||||||
// NOTE: Swapping buffers on a hidden window on Wayland makes it visible
|
// NOTE: Swapping buffers on a hidden window on Wayland makes it visible
|
||||||
if (!window->wl.visible)
|
if (!window->wl.visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// NOTE: We wait for a frame manually so we can add a timeout,
|
||||||
|
// as the EGL implementation will wait indefinitely
|
||||||
|
if (window->wl.egl.interval > 0)
|
||||||
|
{
|
||||||
|
window->context.Flush();
|
||||||
|
if (!_glfwWaitForEGLFrameWayland(window))
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -291,6 +310,16 @@ static void swapBuffersEGL(_GLFWwindow* window)
|
|||||||
|
|
||||||
static void swapIntervalEGL(int interval)
|
static void swapIntervalEGL(int interval)
|
||||||
{
|
{
|
||||||
|
#if defined(_GLFW_WAYLAND)
|
||||||
|
if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
||||||
|
assert(window != NULL);
|
||||||
|
window->wl.egl.interval = interval;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
eglSwapInterval(_glfw.egl.display, interval);
|
eglSwapInterval(_glfw.egl.display, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,18 +337,19 @@ static int extensionSupportedEGL(const char* extension)
|
|||||||
|
|
||||||
static GLFWglproc getProcAddressEGL(const char* procname)
|
static GLFWglproc getProcAddressEGL(const char* procname)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
const GLFWglproc proc = (GLFWglproc) eglGetProcAddress(procname);
|
||||||
assert(window != NULL);
|
if (proc)
|
||||||
|
return proc;
|
||||||
|
|
||||||
if (window->context.egl.client)
|
if (!_glfw.egl.KHR_get_all_proc_addresses)
|
||||||
{
|
{
|
||||||
GLFWglproc proc = (GLFWglproc)
|
_GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);
|
||||||
_glfwPlatformGetModuleSymbol(window->context.egl.client, procname);
|
assert(window != NULL);
|
||||||
if (proc)
|
|
||||||
return proc;
|
return _glfwPlatformGetModuleSymbol(window->context.egl.client, procname);
|
||||||
}
|
}
|
||||||
|
|
||||||
return eglGetProcAddress(procname);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyContextEGL(_GLFWwindow* window)
|
static void destroyContextEGL(_GLFWwindow* window)
|
||||||
@@ -329,11 +359,8 @@ static void destroyContextEGL(_GLFWwindow* window)
|
|||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11 ||
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11 ||
|
||||||
window->context.client != GLFW_OPENGL_API)
|
window->context.client != GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
if (window->context.egl.client)
|
_glfwPlatformFreeModule(window->context.egl.client);
|
||||||
{
|
window->context.egl.client = NULL;
|
||||||
_glfwPlatformFreeModule(window->context.egl.client);
|
|
||||||
window->context.egl.client = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->context.egl.surface)
|
if (window->context.egl.surface)
|
||||||
@@ -354,8 +381,6 @@ static void destroyContextEGL(_GLFWwindow* window)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Initialize EGL
|
|
||||||
//
|
|
||||||
GLFWbool _glfwInitEGL(void)
|
GLFWbool _glfwInitEGL(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -365,10 +390,10 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
{
|
{
|
||||||
#if defined(_GLFW_EGL_LIBRARY)
|
#if defined(_GLFW_EGL_LIBRARY)
|
||||||
_GLFW_EGL_LIBRARY,
|
_GLFW_EGL_LIBRARY,
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_WIN32)
|
||||||
"libEGL.dll",
|
"libEGL.dll",
|
||||||
"EGL.dll",
|
"EGL.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(__APPLE__)
|
||||||
"libEGL.dylib",
|
"libEGL.dylib",
|
||||||
#elif defined(__CYGWIN__)
|
#elif defined(__CYGWIN__)
|
||||||
"libEGL-1.so",
|
"libEGL-1.so",
|
||||||
@@ -420,6 +445,8 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroyContext");
|
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroyContext");
|
||||||
_glfw.egl.CreateWindowSurface = (PFN_eglCreateWindowSurface)
|
_glfw.egl.CreateWindowSurface = (PFN_eglCreateWindowSurface)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateWindowSurface");
|
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateWindowSurface");
|
||||||
|
_glfw.egl.CreatePbufferSurface = (PFN_eglCreatePbufferSurface)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreatePbufferSurface");
|
||||||
_glfw.egl.MakeCurrent = (PFN_eglMakeCurrent)
|
_glfw.egl.MakeCurrent = (PFN_eglMakeCurrent)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglMakeCurrent");
|
_glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglMakeCurrent");
|
||||||
_glfw.egl.SwapBuffers = (PFN_eglSwapBuffers)
|
_glfw.egl.SwapBuffers = (PFN_eglSwapBuffers)
|
||||||
@@ -442,6 +469,7 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
!_glfw.egl.DestroySurface ||
|
!_glfw.egl.DestroySurface ||
|
||||||
!_glfw.egl.DestroyContext ||
|
!_glfw.egl.DestroyContext ||
|
||||||
!_glfw.egl.CreateWindowSurface ||
|
!_glfw.egl.CreateWindowSurface ||
|
||||||
|
!_glfw.egl.CreatePbufferSurface ||
|
||||||
!_glfw.egl.MakeCurrent ||
|
!_glfw.egl.MakeCurrent ||
|
||||||
!_glfw.egl.SwapBuffers ||
|
!_glfw.egl.SwapBuffers ||
|
||||||
!_glfw.egl.SwapInterval ||
|
!_glfw.egl.SwapInterval ||
|
||||||
@@ -477,6 +505,8 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_vulkan", extensions);
|
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_vulkan", extensions);
|
||||||
_glfw.egl.ANGLE_platform_angle_metal =
|
_glfw.egl.ANGLE_platform_angle_metal =
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_metal", extensions);
|
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_metal", extensions);
|
||||||
|
_glfw.egl.MESA_platform_surfaceless =
|
||||||
|
_glfwStringInExtensionString("EGL_MESA_platform_surfaceless", extensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.egl.EXT_platform_base)
|
if (_glfw.egl.EXT_platform_base)
|
||||||
@@ -536,8 +566,6 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terminate EGL
|
|
||||||
//
|
|
||||||
void _glfwTerminateEGL(void)
|
void _glfwTerminateEGL(void)
|
||||||
{
|
{
|
||||||
if (_glfw.egl.display)
|
if (_glfw.egl.display)
|
||||||
@@ -546,7 +574,8 @@ void _glfwTerminateEGL(void)
|
|||||||
_glfw.egl.display = EGL_NO_DISPLAY;
|
_glfw.egl.display = EGL_NO_DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.egl.handle)
|
// Free modules only after all wayland termination functions are called
|
||||||
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND)
|
||||||
{
|
{
|
||||||
_glfwPlatformFreeModule(_glfw.egl.handle);
|
_glfwPlatformFreeModule(_glfw.egl.handle);
|
||||||
_glfw.egl.handle = NULL;
|
_glfw.egl.handle = NULL;
|
||||||
@@ -560,8 +589,6 @@ void _glfwTerminateEGL(void)
|
|||||||
attribs[index++] = v; \
|
attribs[index++] = v; \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the OpenGL or OpenGL ES context
|
|
||||||
//
|
|
||||||
GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig)
|
const _GLFWfbconfig* fbconfig)
|
||||||
@@ -648,7 +675,7 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
if (ctxconfig->noerror)
|
if (ctxconfig->noerror)
|
||||||
{
|
{
|
||||||
if (_glfw.egl.KHR_create_context_no_error)
|
if (_glfw.egl.KHR_create_context_no_error)
|
||||||
SET_ATTRIB(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, GLFW_TRUE);
|
SET_ATTRIB(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask)
|
if (mask)
|
||||||
@@ -708,20 +735,36 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
SET_ATTRIB(EGL_PRESENT_OPAQUE_EXT, !fbconfig->transparent);
|
SET_ATTRIB(EGL_PRESENT_OPAQUE_EXT, !fbconfig->transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_glfw.egl.platform == EGL_PLATFORM_SURFACELESS_MESA)
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
_glfw.platform.getFramebufferSize(window, &width, &height);
|
||||||
|
|
||||||
|
SET_ATTRIB(EGL_WIDTH, width);
|
||||||
|
SET_ATTRIB(EGL_HEIGHT, height);
|
||||||
|
}
|
||||||
|
|
||||||
SET_ATTRIB(EGL_NONE, EGL_NONE);
|
SET_ATTRIB(EGL_NONE, EGL_NONE);
|
||||||
|
|
||||||
native = _glfw.platform.getEGLNativeWindow(window);
|
native = _glfw.platform.getEGLNativeWindow(window);
|
||||||
// HACK: ANGLE does not implement eglCreatePlatformWindowSurfaceEXT
|
if (!_glfw.egl.platform || _glfw.egl.platform == EGL_PLATFORM_ANGLE_ANGLE)
|
||||||
// despite reporting EGL_EXT_platform_base
|
|
||||||
if (_glfw.egl.platform && _glfw.egl.platform != EGL_PLATFORM_ANGLE_ANGLE)
|
|
||||||
{
|
{
|
||||||
|
// HACK: Also use non-platform function for ANGLE, as it does not
|
||||||
|
// implement eglCreatePlatformWindowSurfaceEXT despite reporting
|
||||||
|
// support for EGL_EXT_platform_base
|
||||||
window->context.egl.surface =
|
window->context.egl.surface =
|
||||||
eglCreatePlatformWindowSurfaceEXT(_glfw.egl.display, config, native, attribs);
|
eglCreateWindowSurface(_glfw.egl.display, config, native, attribs);
|
||||||
|
}
|
||||||
|
else if (_glfw.egl.platform == EGL_PLATFORM_SURFACELESS_MESA)
|
||||||
|
{
|
||||||
|
// HACK: Use a pbuffer surface as the default framebuffer
|
||||||
|
window->context.egl.surface =
|
||||||
|
eglCreatePbufferSurface(_glfw.egl.display, config, attribs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
window->context.egl.surface =
|
window->context.egl.surface =
|
||||||
eglCreateWindowSurface(_glfw.egl.display, config, native, attribs);
|
eglCreatePlatformWindowSurfaceEXT(_glfw.egl.display, config, native, attribs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->context.egl.surface == EGL_NO_SURFACE)
|
if (window->context.egl.surface == EGL_NO_SURFACE)
|
||||||
@@ -743,10 +786,10 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
#if defined(_GLFW_GLESV1_LIBRARY)
|
#if defined(_GLFW_GLESV1_LIBRARY)
|
||||||
_GLFW_GLESV1_LIBRARY,
|
_GLFW_GLESV1_LIBRARY,
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_WIN32)
|
||||||
"GLESv1_CM.dll",
|
"GLESv1_CM.dll",
|
||||||
"libGLES_CM.dll",
|
"libGLES_CM.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(__APPLE__)
|
||||||
"libGLESv1_CM.dylib",
|
"libGLESv1_CM.dylib",
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
"libGLESv1_CM.so",
|
"libGLESv1_CM.so",
|
||||||
@@ -760,10 +803,10 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
#if defined(_GLFW_GLESV2_LIBRARY)
|
#if defined(_GLFW_GLESV2_LIBRARY)
|
||||||
_GLFW_GLESV2_LIBRARY,
|
_GLFW_GLESV2_LIBRARY,
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_WIN32)
|
||||||
"GLESv2.dll",
|
"GLESv2.dll",
|
||||||
"libGLESv2.dll",
|
"libGLESv2.dll",
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(__APPLE__)
|
||||||
"libGLESv2.dylib",
|
"libGLESv2.dylib",
|
||||||
#elif defined(__CYGWIN__)
|
#elif defined(__CYGWIN__)
|
||||||
"libGLESv2-2.so",
|
"libGLESv2-2.so",
|
||||||
@@ -778,8 +821,8 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
#if defined(_GLFW_OPENGL_LIBRARY)
|
#if defined(_GLFW_OPENGL_LIBRARY)
|
||||||
_GLFW_OPENGL_LIBRARY,
|
_GLFW_OPENGL_LIBRARY,
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_WIN32)
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(__APPLE__)
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
"libGL.so",
|
"libGL.so",
|
||||||
#else
|
#else
|
||||||
@@ -883,13 +926,19 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void)
|
|||||||
|
|
||||||
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)
|
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND ||
|
||||||
return EGL_NO_CONTEXT;
|
window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return window->context.egl.handle;
|
return window->context.egl.handle;
|
||||||
@@ -897,15 +946,43 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* handle)
|
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND ||
|
||||||
return EGL_NO_SURFACE;
|
window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return window->context.egl.surface;
|
return window->context.egl.surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetEGLConfig(GLFWwindow* handle, EGLConfig* config)
|
||||||
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
assert(config != NULL);
|
||||||
|
|
||||||
|
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
||||||
|
{
|
||||||
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND ||
|
||||||
|
window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*config = window->context.egl.config;
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+48
-29
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 GLX - www.glfw.org
|
// GLFW 3.5 GLX - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -119,9 +119,7 @@ static GLFWbool chooseGLXFBConfig(const _GLFWfbconfig* desired,
|
|||||||
u->accumAlphaBits = getGLXFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE);
|
u->accumAlphaBits = getGLXFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE);
|
||||||
|
|
||||||
u->auxBuffers = getGLXFBConfigAttrib(n, GLX_AUX_BUFFERS);
|
u->auxBuffers = getGLXFBConfigAttrib(n, GLX_AUX_BUFFERS);
|
||||||
|
u->stereo = getGLXFBConfigAttrib(n, GLX_STEREO);
|
||||||
if (getGLXFBConfigAttrib(n, GLX_STEREO))
|
|
||||||
u->stereo = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.glx.ARB_multisample)
|
if (_glfw.glx.ARB_multisample)
|
||||||
u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES);
|
u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES);
|
||||||
@@ -253,8 +251,6 @@ static void destroyContextGLX(_GLFWwindow* window)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Initialize GLX
|
|
||||||
//
|
|
||||||
GLFWbool _glfwInitGLX(void)
|
GLFWbool _glfwInitGLX(void)
|
||||||
{
|
{
|
||||||
const char* sonames[] =
|
const char* sonames[] =
|
||||||
@@ -369,7 +365,7 @@ GLFWbool _glfwInitGLX(void)
|
|||||||
getProcAddressGLX("glXSwapIntervalEXT");
|
getProcAddressGLX("glXSwapIntervalEXT");
|
||||||
|
|
||||||
if (_glfw.glx.SwapIntervalEXT)
|
if (_glfw.glx.SwapIntervalEXT)
|
||||||
_glfw.glx.EXT_swap_control = GLFW_TRUE;
|
_glfw.glx.EXT_swap_control = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_SGI_swap_control"))
|
if (extensionSupportedGLX("GLX_SGI_swap_control"))
|
||||||
@@ -378,7 +374,7 @@ GLFWbool _glfwInitGLX(void)
|
|||||||
getProcAddressGLX("glXSwapIntervalSGI");
|
getProcAddressGLX("glXSwapIntervalSGI");
|
||||||
|
|
||||||
if (_glfw.glx.SwapIntervalSGI)
|
if (_glfw.glx.SwapIntervalSGI)
|
||||||
_glfw.glx.SGI_swap_control = GLFW_TRUE;
|
_glfw.glx.SGI_swap_control = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_MESA_swap_control"))
|
if (extensionSupportedGLX("GLX_MESA_swap_control"))
|
||||||
@@ -387,17 +383,17 @@ GLFWbool _glfwInitGLX(void)
|
|||||||
getProcAddressGLX("glXSwapIntervalMESA");
|
getProcAddressGLX("glXSwapIntervalMESA");
|
||||||
|
|
||||||
if (_glfw.glx.SwapIntervalMESA)
|
if (_glfw.glx.SwapIntervalMESA)
|
||||||
_glfw.glx.MESA_swap_control = GLFW_TRUE;
|
_glfw.glx.MESA_swap_control = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_multisample"))
|
if (extensionSupportedGLX("GLX_ARB_multisample"))
|
||||||
_glfw.glx.ARB_multisample = GLFW_TRUE;
|
_glfw.glx.ARB_multisample = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_framebuffer_sRGB"))
|
if (extensionSupportedGLX("GLX_ARB_framebuffer_sRGB"))
|
||||||
_glfw.glx.ARB_framebuffer_sRGB = GLFW_TRUE;
|
_glfw.glx.ARB_framebuffer_sRGB = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_EXT_framebuffer_sRGB"))
|
if (extensionSupportedGLX("GLX_EXT_framebuffer_sRGB"))
|
||||||
_glfw.glx.EXT_framebuffer_sRGB = GLFW_TRUE;
|
_glfw.glx.EXT_framebuffer_sRGB = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_create_context"))
|
if (extensionSupportedGLX("GLX_ARB_create_context"))
|
||||||
{
|
{
|
||||||
@@ -405,39 +401,34 @@ GLFWbool _glfwInitGLX(void)
|
|||||||
getProcAddressGLX("glXCreateContextAttribsARB");
|
getProcAddressGLX("glXCreateContextAttribsARB");
|
||||||
|
|
||||||
if (_glfw.glx.CreateContextAttribsARB)
|
if (_glfw.glx.CreateContextAttribsARB)
|
||||||
_glfw.glx.ARB_create_context = GLFW_TRUE;
|
_glfw.glx.ARB_create_context = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_create_context_robustness"))
|
if (extensionSupportedGLX("GLX_ARB_create_context_robustness"))
|
||||||
_glfw.glx.ARB_create_context_robustness = GLFW_TRUE;
|
_glfw.glx.ARB_create_context_robustness = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_create_context_profile"))
|
if (extensionSupportedGLX("GLX_ARB_create_context_profile"))
|
||||||
_glfw.glx.ARB_create_context_profile = GLFW_TRUE;
|
_glfw.glx.ARB_create_context_profile = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_EXT_create_context_es2_profile"))
|
if (extensionSupportedGLX("GLX_EXT_create_context_es2_profile"))
|
||||||
_glfw.glx.EXT_create_context_es2_profile = GLFW_TRUE;
|
_glfw.glx.EXT_create_context_es2_profile = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_create_context_no_error"))
|
if (extensionSupportedGLX("GLX_ARB_create_context_no_error"))
|
||||||
_glfw.glx.ARB_create_context_no_error = GLFW_TRUE;
|
_glfw.glx.ARB_create_context_no_error = true;
|
||||||
|
|
||||||
if (extensionSupportedGLX("GLX_ARB_context_flush_control"))
|
if (extensionSupportedGLX("GLX_ARB_context_flush_control"))
|
||||||
_glfw.glx.ARB_context_flush_control = GLFW_TRUE;
|
_glfw.glx.ARB_context_flush_control = true;
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terminate GLX
|
|
||||||
//
|
|
||||||
void _glfwTerminateGLX(void)
|
void _glfwTerminateGLX(void)
|
||||||
{
|
{
|
||||||
// NOTE: This function must not call any X11 functions, as it is called
|
// NOTE: This function must not call any X11 functions, as it is called
|
||||||
// after XCloseDisplay (see _glfwTerminateX11 for details)
|
// after XCloseDisplay (see _glfwTerminateX11 for details)
|
||||||
|
|
||||||
if (_glfw.glx.handle)
|
_glfwPlatformFreeModule(_glfw.glx.handle);
|
||||||
{
|
_glfw.glx.handle = NULL;
|
||||||
_glfwPlatformFreeModule(_glfw.glx.handle);
|
|
||||||
_glfw.glx.handle = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ATTRIB(a, v) \
|
#define SET_ATTRIB(a, v) \
|
||||||
@@ -447,8 +438,6 @@ void _glfwTerminateGLX(void)
|
|||||||
attribs[index++] = v; \
|
attribs[index++] = v; \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the OpenGL or OpenGL ES context
|
|
||||||
//
|
|
||||||
GLFWbool _glfwCreateContextGLX(_GLFWwindow* window,
|
GLFWbool _glfwCreateContextGLX(_GLFWwindow* window,
|
||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig)
|
const _GLFWfbconfig* fbconfig)
|
||||||
@@ -626,6 +615,8 @@ GLFWbool _glfwCreateContextGLX(_GLFWwindow* window,
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window->context.glx.fbconfig = native;
|
||||||
|
|
||||||
window->context.makeCurrent = makeContextCurrentGLX;
|
window->context.makeCurrent = makeContextCurrentGLX;
|
||||||
window->context.swapBuffers = swapBuffersGLX;
|
window->context.swapBuffers = swapBuffersGLX;
|
||||||
window->context.swapInterval = swapIntervalGLX;
|
window->context.swapInterval = swapIntervalGLX;
|
||||||
@@ -677,7 +668,6 @@ GLFWbool _glfwChooseVisualGLX(const _GLFWwndconfig* wndconfig,
|
|||||||
|
|
||||||
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)
|
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
@@ -686,6 +676,9 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
@@ -697,7 +690,6 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)
|
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
@@ -706,6 +698,9 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
@@ -715,5 +710,29 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)
|
|||||||
return window->context.glx.window;
|
return window->context.glx.window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetGLXFBConfig(GLFWwindow* handle, GLXFBConfig* config)
|
||||||
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "GLX: Platform not initialized");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
assert(config != NULL);
|
||||||
|
|
||||||
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*config = window->context.glx.fbconfig;
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // _GLFW_X11
|
#endif // _GLFW_X11
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// 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-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -49,18 +49,18 @@ static GLFWerrorfun _glfwErrorCallback;
|
|||||||
static GLFWallocator _glfwInitAllocator;
|
static GLFWallocator _glfwInitAllocator;
|
||||||
static _GLFWinitconfig _glfwInitHints =
|
static _GLFWinitconfig _glfwInitHints =
|
||||||
{
|
{
|
||||||
.hatButtons = GLFW_TRUE,
|
.hatButtons = true,
|
||||||
.angleType = GLFW_ANGLE_PLATFORM_TYPE_NONE,
|
.angleType = GLFW_ANGLE_PLATFORM_TYPE_NONE,
|
||||||
.platformID = GLFW_ANY_PLATFORM,
|
.platformID = GLFW_ANY_PLATFORM,
|
||||||
.vulkanLoader = NULL,
|
.vulkanLoader = NULL,
|
||||||
.ns =
|
.ns =
|
||||||
{
|
{
|
||||||
.menubar = GLFW_TRUE,
|
.menubar = true,
|
||||||
.chdir = GLFW_TRUE
|
.chdir = true
|
||||||
},
|
},
|
||||||
.x11 =
|
.x11 =
|
||||||
{
|
{
|
||||||
.xcbVulkanSurface = GLFW_TRUE,
|
.xcbVulkanSurface = true,
|
||||||
},
|
},
|
||||||
.wl =
|
.wl =
|
||||||
{
|
{
|
||||||
|
|||||||
+57
-43
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -333,10 +333,8 @@ void _glfwInputChar(_GLFWwindow* window, uint32_t codepoint, int mods, GLFWbool
|
|||||||
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
|
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
|
||||||
{
|
{
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
assert(xoffset > -FLT_MAX);
|
assert(isfinite(xoffset));
|
||||||
assert(xoffset < FLT_MAX);
|
assert(isfinite(yoffset));
|
||||||
assert(yoffset > -FLT_MAX);
|
|
||||||
assert(yoffset < FLT_MAX);
|
|
||||||
|
|
||||||
if (window->callbacks.scroll)
|
if (window->callbacks.scroll)
|
||||||
window->callbacks.scroll((GLFWwindow*) window, xoffset, yoffset);
|
window->callbacks.scroll((GLFWwindow*) window, xoffset, yoffset);
|
||||||
@@ -348,20 +346,22 @@ void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods)
|
|||||||
{
|
{
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
assert(button >= 0);
|
assert(button >= 0);
|
||||||
assert(button <= GLFW_MOUSE_BUTTON_LAST);
|
|
||||||
assert(action == GLFW_PRESS || action == GLFW_RELEASE);
|
assert(action == GLFW_PRESS || action == GLFW_RELEASE);
|
||||||
assert(mods == (mods & GLFW_MOD_MASK));
|
assert(mods == (mods & GLFW_MOD_MASK));
|
||||||
|
|
||||||
if (button < 0 || button > GLFW_MOUSE_BUTTON_LAST)
|
if (button < 0 || (!window->disableMouseButtonLimit && button > GLFW_MOUSE_BUTTON_LAST))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!window->lockKeyMods)
|
if (!window->lockKeyMods)
|
||||||
mods &= ~(GLFW_MOD_CAPS_LOCK | GLFW_MOD_NUM_LOCK);
|
mods &= ~(GLFW_MOD_CAPS_LOCK | GLFW_MOD_NUM_LOCK);
|
||||||
|
|
||||||
if (action == GLFW_RELEASE && window->stickyMouseButtons)
|
if (button <= GLFW_MOUSE_BUTTON_LAST)
|
||||||
window->mouseButtons[button] = _GLFW_STICK;
|
{
|
||||||
else
|
if (action == GLFW_RELEASE && window->stickyMouseButtons)
|
||||||
window->mouseButtons[button] = (char) action;
|
window->mouseButtons[button] = _GLFW_STICK;
|
||||||
|
else
|
||||||
|
window->mouseButtons[button] = (char) action;
|
||||||
|
}
|
||||||
|
|
||||||
if (window->callbacks.mouseButton)
|
if (window->callbacks.mouseButton)
|
||||||
window->callbacks.mouseButton((GLFWwindow*) window, button, action, mods);
|
window->callbacks.mouseButton((GLFWwindow*) window, button, action, mods);
|
||||||
@@ -373,10 +373,8 @@ void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods)
|
|||||||
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos)
|
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos)
|
||||||
{
|
{
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
assert(xpos > -FLT_MAX);
|
assert(isfinite(xpos));
|
||||||
assert(xpos < FLT_MAX);
|
assert(isfinite(ypos));
|
||||||
assert(ypos > -FLT_MAX);
|
|
||||||
assert(ypos < FLT_MAX);
|
|
||||||
|
|
||||||
if (window->virtualCursorPosX == xpos && window->virtualCursorPosY == ypos)
|
if (window->virtualCursorPosX == xpos && window->virtualCursorPosY == ypos)
|
||||||
return;
|
return;
|
||||||
@@ -434,6 +432,7 @@ void _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value)
|
|||||||
assert(js != NULL);
|
assert(js != NULL);
|
||||||
assert(axis >= 0);
|
assert(axis >= 0);
|
||||||
assert(axis < js->axisCount);
|
assert(axis < js->axisCount);
|
||||||
|
assert(isfinite(value));
|
||||||
|
|
||||||
js->axes[axis] = value;
|
js->axes[axis] = value;
|
||||||
}
|
}
|
||||||
@@ -559,11 +558,11 @@ void _glfwCenterCursorInContentArea(_GLFWwindow* window)
|
|||||||
|
|
||||||
GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case GLFW_CURSOR:
|
case GLFW_CURSOR:
|
||||||
@@ -576,6 +575,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
|||||||
return window->lockKeyMods;
|
return window->lockKeyMods;
|
||||||
case GLFW_RAW_MOUSE_MOTION:
|
case GLFW_RAW_MOUSE_MOTION:
|
||||||
return window->rawMouseMotion;
|
return window->rawMouseMotion;
|
||||||
|
case GLFW_UNLIMITED_MOUSE_BUTTONS:
|
||||||
|
return window->disableMouseButtonLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode 0x%08X", mode);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode 0x%08X", mode);
|
||||||
@@ -584,11 +585,11 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
|||||||
|
|
||||||
GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case GLFW_CURSOR:
|
case GLFW_CURSOR:
|
||||||
@@ -683,6 +684,12 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
|||||||
_glfw.platform.setRawMouseMotion(window, value);
|
_glfw.platform.setRawMouseMotion(window, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case GLFW_UNLIMITED_MOUSE_BUTTONS:
|
||||||
|
{
|
||||||
|
window->disableMouseButtonLimit = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode 0x%08X", mode);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode 0x%08X", mode);
|
||||||
@@ -734,11 +741,11 @@ GLFWAPI int glfwGetKeyScancode(int key)
|
|||||||
|
|
||||||
GLFWAPI int glfwGetKey(GLFWwindow* handle, int key)
|
GLFWAPI int glfwGetKey(GLFWwindow* handle, int key)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);
|
|
||||||
|
|
||||||
if (key < GLFW_KEY_SPACE || key > GLFW_KEY_LAST)
|
if (key < GLFW_KEY_SPACE || key > GLFW_KEY_LAST)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid key %i", key);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid key %i", key);
|
||||||
@@ -757,11 +764,11 @@ GLFWAPI int glfwGetKey(GLFWwindow* handle, int key)
|
|||||||
|
|
||||||
GLFWAPI int glfwGetMouseButton(GLFWwindow* handle, int button)
|
GLFWAPI int glfwGetMouseButton(GLFWwindow* handle, int button)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);
|
|
||||||
|
|
||||||
if (button < GLFW_MOUSE_BUTTON_1 || button > GLFW_MOUSE_BUTTON_LAST)
|
if (button < GLFW_MOUSE_BUTTON_1 || button > GLFW_MOUSE_BUTTON_LAST)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid mouse button %i", button);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid mouse button %i", button);
|
||||||
@@ -780,9 +787,6 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* handle, int button)
|
|||||||
|
|
||||||
GLFWAPI void glfwGetCursorPos(GLFWwindow* handle, double* xpos, double* ypos)
|
GLFWAPI void glfwGetCursorPos(GLFWwindow* handle, double* xpos, double* ypos)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (xpos)
|
if (xpos)
|
||||||
*xpos = 0;
|
*xpos = 0;
|
||||||
if (ypos)
|
if (ypos)
|
||||||
@@ -790,6 +794,9 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* handle, double* xpos, double* ypos)
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
||||||
{
|
{
|
||||||
if (xpos)
|
if (xpos)
|
||||||
@@ -803,13 +810,12 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* handle, double* xpos, double* ypos)
|
|||||||
|
|
||||||
GLFWAPI void glfwSetCursorPos(GLFWwindow* handle, double xpos, double ypos)
|
GLFWAPI void glfwSetCursorPos(GLFWwindow* handle, double xpos, double ypos)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
if (!isfinite(xpos) || !isfinite(ypos))
|
||||||
|
|
||||||
if (xpos != xpos || xpos < -DBL_MAX || xpos > DBL_MAX ||
|
|
||||||
ypos != ypos || ypos < -DBL_MAX || ypos > DBL_MAX)
|
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE,
|
_glfwInputError(GLFW_INVALID_VALUE,
|
||||||
"Invalid cursor position %f %f",
|
"Invalid cursor position %f %f",
|
||||||
@@ -897,10 +903,10 @@ GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape)
|
|||||||
|
|
||||||
GLFWAPI void glfwDestroyCursor(GLFWcursor* handle)
|
GLFWAPI void glfwDestroyCursor(GLFWcursor* handle)
|
||||||
{
|
{
|
||||||
_GLFWcursor* cursor = (_GLFWcursor*) handle;
|
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWcursor* cursor = (_GLFWcursor*) handle;
|
||||||
|
|
||||||
if (cursor == NULL)
|
if (cursor == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -932,12 +938,12 @@ GLFWAPI void glfwDestroyCursor(GLFWcursor* handle)
|
|||||||
|
|
||||||
GLFWAPI void glfwSetCursor(GLFWwindow* windowHandle, GLFWcursor* cursorHandle)
|
GLFWAPI void glfwSetCursor(GLFWwindow* windowHandle, GLFWcursor* cursorHandle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) windowHandle;
|
_GLFWwindow* window = (_GLFWwindow*) windowHandle;
|
||||||
_GLFWcursor* cursor = (_GLFWcursor*) cursorHandle;
|
_GLFWcursor* cursor = (_GLFWcursor*) cursorHandle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
window->cursor = cursor;
|
window->cursor = cursor;
|
||||||
|
|
||||||
_glfw.platform.setCursor(window, cursor);
|
_glfw.platform.setCursor(window, cursor);
|
||||||
@@ -945,30 +951,33 @@ GLFWAPI void glfwSetCursor(GLFWwindow* windowHandle, GLFWcursor* cursorHandle)
|
|||||||
|
|
||||||
GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)
|
GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWkeyfun, window->callbacks.key, cbfun);
|
_GLFW_SWAP(GLFWkeyfun, window->callbacks.key, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun)
|
GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWcharfun, window->callbacks.character, cbfun);
|
_GLFW_SWAP(GLFWcharfun, window->callbacks.character, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* handle, GLFWcharmodsfun cbfun)
|
GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* handle, GLFWcharmodsfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWcharmodsfun, window->callbacks.charmods, cbfun);
|
_GLFW_SWAP(GLFWcharmodsfun, window->callbacks.charmods, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -976,10 +985,11 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* handle, GLFWcharmods
|
|||||||
GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
|
GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
|
||||||
GLFWmousebuttonfun cbfun)
|
GLFWmousebuttonfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWmousebuttonfun, window->callbacks.mouseButton, cbfun);
|
_GLFW_SWAP(GLFWmousebuttonfun, window->callbacks.mouseButton, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -987,10 +997,11 @@ GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle,
|
GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle,
|
||||||
GLFWcursorposfun cbfun)
|
GLFWcursorposfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWcursorposfun, window->callbacks.cursorPos, cbfun);
|
_GLFW_SWAP(GLFWcursorposfun, window->callbacks.cursorPos, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -998,10 +1009,11 @@ GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle,
|
GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle,
|
||||||
GLFWcursorenterfun cbfun)
|
GLFWcursorenterfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWcursorenterfun, window->callbacks.cursorEnter, cbfun);
|
_GLFW_SWAP(GLFWcursorenterfun, window->callbacks.cursorEnter, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1009,20 +1021,22 @@ GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* handle,
|
GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* handle,
|
||||||
GLFWscrollfun cbfun)
|
GLFWscrollfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWscrollfun, window->callbacks.scroll, cbfun);
|
_GLFW_SWAP(GLFWscrollfun, window->callbacks.scroll, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* handle, GLFWdropfun cbfun)
|
GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* handle, GLFWdropfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWdropfun, window->callbacks.drop, cbfun);
|
_GLFW_SWAP(GLFWdropfun, window->callbacks.drop, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1481,7 +1495,7 @@ GLFWAPI void glfwSetTime(double time)
|
|||||||
{
|
{
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
if (time != time || time < 0.0 || time > 18446744073.0)
|
if (!isfinite(time) || time < 0.0 || time > 18446744073.0)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid time %f", time);
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid time %f", time);
|
||||||
return;
|
return;
|
||||||
|
|||||||
+64
-50
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -48,6 +48,8 @@
|
|||||||
#define GLFW_INCLUDE_NONE
|
#define GLFW_INCLUDE_NONE
|
||||||
#include "../include/GLFW/glfw3.h"
|
#include "../include/GLFW/glfw3.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define _GLFW_INSERT_FIRST 0
|
#define _GLFW_INSERT_FIRST 0
|
||||||
#define _GLFW_INSERT_LAST 1
|
#define _GLFW_INSERT_LAST 1
|
||||||
|
|
||||||
@@ -107,6 +109,7 @@ typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
|
|||||||
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
|
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
|
||||||
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
|
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
|
||||||
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
||||||
|
typedef void (APIENTRY * PFNGLFLUSHPROC)(void);
|
||||||
|
|
||||||
#define EGL_SUCCESS 0x3000
|
#define EGL_SUCCESS 0x3000
|
||||||
#define EGL_NOT_INITIALIZED 0x3001
|
#define EGL_NOT_INITIALIZED 0x3001
|
||||||
@@ -150,6 +153,9 @@ typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
|||||||
#define EGL_NO_DISPLAY ((EGLDisplay) 0)
|
#define EGL_NO_DISPLAY ((EGLDisplay) 0)
|
||||||
#define EGL_NO_CONTEXT ((EGLContext) 0)
|
#define EGL_NO_CONTEXT ((EGLContext) 0)
|
||||||
#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0)
|
#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0)
|
||||||
|
#define EGL_PBUFFER_BIT 0x0001
|
||||||
|
#define EGL_WIDTH 0x3057
|
||||||
|
#define EGL_HEIGHT 0x3056
|
||||||
|
|
||||||
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
|
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
|
||||||
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
|
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
|
||||||
@@ -181,6 +187,7 @@ typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
|||||||
#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
|
#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489
|
#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489
|
||||||
#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348f
|
#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348f
|
||||||
|
#define EGL_PLATFORM_SURFACELESS_MESA 0x31dd
|
||||||
|
|
||||||
typedef int EGLint;
|
typedef int EGLint;
|
||||||
typedef unsigned int EGLBoolean;
|
typedef unsigned int EGLBoolean;
|
||||||
@@ -205,6 +212,7 @@ typedef EGLContext (APIENTRY * PFN_eglCreateContext)(EGLDisplay,EGLConfig,EGLCon
|
|||||||
typedef EGLBoolean (APIENTRY * PFN_eglDestroySurface)(EGLDisplay,EGLSurface);
|
typedef EGLBoolean (APIENTRY * PFN_eglDestroySurface)(EGLDisplay,EGLSurface);
|
||||||
typedef EGLBoolean (APIENTRY * PFN_eglDestroyContext)(EGLDisplay,EGLContext);
|
typedef EGLBoolean (APIENTRY * PFN_eglDestroyContext)(EGLDisplay,EGLContext);
|
||||||
typedef EGLSurface (APIENTRY * PFN_eglCreateWindowSurface)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*);
|
typedef EGLSurface (APIENTRY * PFN_eglCreateWindowSurface)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*);
|
||||||
|
typedef EGLSurface (APIENTRY * PFN_eglCreatePbufferSurface)(EGLDisplay,EGLContext,const EGLint*);
|
||||||
typedef EGLBoolean (APIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLSurface,EGLContext);
|
typedef EGLBoolean (APIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLSurface,EGLContext);
|
||||||
typedef EGLBoolean (APIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface);
|
typedef EGLBoolean (APIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface);
|
||||||
typedef EGLBoolean (APIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint);
|
typedef EGLBoolean (APIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint);
|
||||||
@@ -221,6 +229,7 @@ typedef GLFWglproc (APIENTRY * PFN_eglGetProcAddress)(const char*);
|
|||||||
#define eglDestroySurface _glfw.egl.DestroySurface
|
#define eglDestroySurface _glfw.egl.DestroySurface
|
||||||
#define eglDestroyContext _glfw.egl.DestroyContext
|
#define eglDestroyContext _glfw.egl.DestroyContext
|
||||||
#define eglCreateWindowSurface _glfw.egl.CreateWindowSurface
|
#define eglCreateWindowSurface _glfw.egl.CreateWindowSurface
|
||||||
|
#define eglCreatePbufferSurface _glfw.egl.CreatePbufferSurface
|
||||||
#define eglMakeCurrent _glfw.egl.MakeCurrent
|
#define eglMakeCurrent _glfw.egl.MakeCurrent
|
||||||
#define eglSwapBuffers _glfw.egl.SwapBuffers
|
#define eglSwapBuffers _glfw.egl.SwapBuffers
|
||||||
#define eglSwapInterval _glfw.egl.SwapInterval
|
#define eglSwapInterval _glfw.egl.SwapInterval
|
||||||
@@ -277,6 +286,7 @@ typedef enum VkStructureType
|
|||||||
VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
|
VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
|
||||||
VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
|
VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
|
||||||
VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,
|
VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,
|
||||||
|
VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
|
||||||
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
|
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
|
||||||
} VkStructureType;
|
} VkStructureType;
|
||||||
|
|
||||||
@@ -365,16 +375,16 @@ struct _GLFWerror
|
|||||||
//
|
//
|
||||||
struct _GLFWinitconfig
|
struct _GLFWinitconfig
|
||||||
{
|
{
|
||||||
GLFWbool hatButtons;
|
bool hatButtons;
|
||||||
int angleType;
|
int angleType;
|
||||||
int platformID;
|
int platformID;
|
||||||
PFN_vkGetInstanceProcAddr vulkanLoader;
|
PFN_vkGetInstanceProcAddr vulkanLoader;
|
||||||
struct {
|
struct {
|
||||||
GLFWbool menubar;
|
bool menubar;
|
||||||
GLFWbool chdir;
|
bool chdir;
|
||||||
} ns;
|
} ns;
|
||||||
struct {
|
struct {
|
||||||
GLFWbool xcbVulkanSurface;
|
bool xcbVulkanSurface;
|
||||||
} x11;
|
} x11;
|
||||||
struct {
|
struct {
|
||||||
int libdecorMode;
|
int libdecorMode;
|
||||||
@@ -393,19 +403,18 @@ struct _GLFWwndconfig
|
|||||||
int ypos;
|
int ypos;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
const char* title;
|
bool resizable;
|
||||||
GLFWbool resizable;
|
bool visible;
|
||||||
GLFWbool visible;
|
bool decorated;
|
||||||
GLFWbool decorated;
|
bool focused;
|
||||||
GLFWbool focused;
|
bool autoIconify;
|
||||||
GLFWbool autoIconify;
|
bool floating;
|
||||||
GLFWbool floating;
|
bool maximized;
|
||||||
GLFWbool maximized;
|
bool centerCursor;
|
||||||
GLFWbool centerCursor;
|
bool focusOnShow;
|
||||||
GLFWbool focusOnShow;
|
bool mousePassthrough;
|
||||||
GLFWbool mousePassthrough;
|
bool scaleToMonitor;
|
||||||
GLFWbool scaleToMonitor;
|
bool scaleFramebuffer;
|
||||||
GLFWbool scaleFramebuffer;
|
|
||||||
struct {
|
struct {
|
||||||
char frameName[256];
|
char frameName[256];
|
||||||
} ns;
|
} ns;
|
||||||
@@ -414,8 +423,8 @@ struct _GLFWwndconfig
|
|||||||
char instanceName[256];
|
char instanceName[256];
|
||||||
} x11;
|
} x11;
|
||||||
struct {
|
struct {
|
||||||
GLFWbool keymenu;
|
bool keymenu;
|
||||||
GLFWbool showDefault;
|
bool showDefault;
|
||||||
} win32;
|
} win32;
|
||||||
struct {
|
struct {
|
||||||
char appId[256];
|
char appId[256];
|
||||||
@@ -434,15 +443,15 @@ struct _GLFWctxconfig
|
|||||||
int source;
|
int source;
|
||||||
int major;
|
int major;
|
||||||
int minor;
|
int minor;
|
||||||
GLFWbool forward;
|
bool forward;
|
||||||
GLFWbool debug;
|
bool debug;
|
||||||
GLFWbool noerror;
|
bool noerror;
|
||||||
int profile;
|
int profile;
|
||||||
int robustness;
|
int robustness;
|
||||||
int release;
|
int release;
|
||||||
_GLFWwindow* share;
|
_GLFWwindow* share;
|
||||||
struct {
|
struct {
|
||||||
GLFWbool offline;
|
bool offline;
|
||||||
} nsgl;
|
} nsgl;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -467,11 +476,11 @@ struct _GLFWfbconfig
|
|||||||
int accumBlueBits;
|
int accumBlueBits;
|
||||||
int accumAlphaBits;
|
int accumAlphaBits;
|
||||||
int auxBuffers;
|
int auxBuffers;
|
||||||
GLFWbool stereo;
|
bool stereo;
|
||||||
int samples;
|
int samples;
|
||||||
GLFWbool sRGB;
|
bool sRGB;
|
||||||
GLFWbool doublebuffer;
|
bool doublebuffer;
|
||||||
GLFWbool transparent;
|
bool transparent;
|
||||||
uintptr_t handle;
|
uintptr_t handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -490,6 +499,7 @@ struct _GLFWcontext
|
|||||||
PFNGLGETSTRINGIPROC GetStringi;
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
PFNGLGETINTEGERVPROC GetIntegerv;
|
PFNGLGETINTEGERVPROC GetIntegerv;
|
||||||
PFNGLGETSTRINGPROC GetString;
|
PFNGLGETSTRINGPROC GetString;
|
||||||
|
PFNGLFLUSHPROC Flush;
|
||||||
|
|
||||||
void (*makeCurrent)(_GLFWwindow*);
|
void (*makeCurrent)(_GLFWwindow*);
|
||||||
void (*swapBuffers)(_GLFWwindow*);
|
void (*swapBuffers)(_GLFWwindow*);
|
||||||
@@ -544,6 +554,7 @@ struct _GLFWwindow
|
|||||||
GLFWbool stickyKeys;
|
GLFWbool stickyKeys;
|
||||||
GLFWbool stickyMouseButtons;
|
GLFWbool stickyMouseButtons;
|
||||||
GLFWbool lockKeyMods;
|
GLFWbool lockKeyMods;
|
||||||
|
GLFWbool disableMouseButtonLimit;
|
||||||
int cursorMode;
|
int cursorMode;
|
||||||
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
||||||
char keys[GLFW_KEY_LAST + 1];
|
char keys[GLFW_KEY_LAST + 1];
|
||||||
@@ -796,21 +807,22 @@ struct _GLFWlibrary
|
|||||||
EGLint major, minor;
|
EGLint major, minor;
|
||||||
GLFWbool prefix;
|
GLFWbool prefix;
|
||||||
|
|
||||||
GLFWbool KHR_create_context;
|
bool KHR_create_context;
|
||||||
GLFWbool KHR_create_context_no_error;
|
bool KHR_create_context_no_error;
|
||||||
GLFWbool KHR_gl_colorspace;
|
bool KHR_gl_colorspace;
|
||||||
GLFWbool KHR_get_all_proc_addresses;
|
bool KHR_get_all_proc_addresses;
|
||||||
GLFWbool KHR_context_flush_control;
|
bool KHR_context_flush_control;
|
||||||
GLFWbool EXT_client_extensions;
|
bool EXT_client_extensions;
|
||||||
GLFWbool EXT_platform_base;
|
bool EXT_platform_base;
|
||||||
GLFWbool EXT_platform_x11;
|
bool EXT_platform_x11;
|
||||||
GLFWbool EXT_platform_wayland;
|
bool EXT_platform_wayland;
|
||||||
GLFWbool EXT_present_opaque;
|
bool EXT_present_opaque;
|
||||||
GLFWbool ANGLE_platform_angle;
|
bool ANGLE_platform_angle;
|
||||||
GLFWbool ANGLE_platform_angle_opengl;
|
bool ANGLE_platform_angle_opengl;
|
||||||
GLFWbool ANGLE_platform_angle_d3d;
|
bool ANGLE_platform_angle_d3d;
|
||||||
GLFWbool ANGLE_platform_angle_vulkan;
|
bool ANGLE_platform_angle_vulkan;
|
||||||
GLFWbool ANGLE_platform_angle_metal;
|
bool ANGLE_platform_angle_metal;
|
||||||
|
bool MESA_platform_surfaceless;
|
||||||
|
|
||||||
void* handle;
|
void* handle;
|
||||||
|
|
||||||
@@ -825,6 +837,7 @@ struct _GLFWlibrary
|
|||||||
PFN_eglDestroySurface DestroySurface;
|
PFN_eglDestroySurface DestroySurface;
|
||||||
PFN_eglDestroyContext DestroyContext;
|
PFN_eglDestroyContext DestroyContext;
|
||||||
PFN_eglCreateWindowSurface CreateWindowSurface;
|
PFN_eglCreateWindowSurface CreateWindowSurface;
|
||||||
|
PFN_eglCreatePbufferSurface CreatePbufferSurface;
|
||||||
PFN_eglMakeCurrent MakeCurrent;
|
PFN_eglMakeCurrent MakeCurrent;
|
||||||
PFN_eglSwapBuffers SwapBuffers;
|
PFN_eglSwapBuffers SwapBuffers;
|
||||||
PFN_eglSwapInterval SwapInterval;
|
PFN_eglSwapInterval SwapInterval;
|
||||||
@@ -853,13 +866,14 @@ struct _GLFWlibrary
|
|||||||
void* handle;
|
void* handle;
|
||||||
char* extensions[2];
|
char* extensions[2];
|
||||||
PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
|
PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
|
||||||
GLFWbool KHR_surface;
|
bool KHR_surface;
|
||||||
GLFWbool KHR_win32_surface;
|
bool KHR_win32_surface;
|
||||||
GLFWbool MVK_macos_surface;
|
bool MVK_macos_surface;
|
||||||
GLFWbool EXT_metal_surface;
|
bool EXT_metal_surface;
|
||||||
GLFWbool KHR_xlib_surface;
|
bool KHR_xlib_surface;
|
||||||
GLFWbool KHR_xcb_surface;
|
bool KHR_xcb_surface;
|
||||||
GLFWbool KHR_wayland_surface;
|
bool KHR_wayland_surface;
|
||||||
|
bool EXT_headless_surface;
|
||||||
} vk;
|
} vk;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
// GLFW 3.5 Linux - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
// GLFW 3.5 Linux - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(GLFW_BUILD_COCOA_TIMER)
|
#if defined(GLFW_BUILD_MACOS_TIMER)
|
||||||
|
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ void _glfwPlatformInitTimer(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.timer.macos.frequency = (info.denom * 1e9) / info.numer;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerValue(void)
|
uint64_t _glfwPlatformGetTimerValue(void)
|
||||||
@@ -50,8 +50,8 @@ uint64_t _glfwPlatformGetTimerValue(void)
|
|||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerFrequency(void)
|
uint64_t _glfwPlatformGetTimerFrequency(void)
|
||||||
{
|
{
|
||||||
return _glfw.timer.ns.frequency;
|
return _glfw.timer.macos.frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // GLFW_BUILD_COCOA_TIMER
|
#endif // GLFW_BUILD_MACOS_TIMER
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2021 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2021 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -24,12 +24,12 @@
|
|||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#define GLFW_COCOA_LIBRARY_TIMER_STATE _GLFWtimerNS ns;
|
#define GLFW_MACOS_LIBRARY_TIMER_STATE _GLFWtimerMacOS macos;
|
||||||
|
|
||||||
// Cocoa-specific global timer data
|
// macOS-specific global timer data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWtimerNS
|
typedef struct _GLFWtimerMacOS
|
||||||
{
|
{
|
||||||
uint64_t frequency;
|
uint64_t frequency;
|
||||||
} _GLFWtimerNS;
|
} _GLFWtimerMacOS;
|
||||||
|
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+35
-27
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -325,9 +325,6 @@ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void)
|
|||||||
|
|
||||||
GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos)
|
GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
|
|
||||||
if (xpos)
|
if (xpos)
|
||||||
*xpos = 0;
|
*xpos = 0;
|
||||||
if (ypos)
|
if (ypos)
|
||||||
@@ -335,6 +332,9 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos)
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_glfw.platform.getMonitorPos(monitor, xpos, ypos);
|
_glfw.platform.getMonitorPos(monitor, xpos, ypos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,9 +342,6 @@ GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* handle,
|
|||||||
int* xpos, int* ypos,
|
int* xpos, int* ypos,
|
||||||
int* width, int* height)
|
int* width, int* height)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
|
|
||||||
if (xpos)
|
if (xpos)
|
||||||
*xpos = 0;
|
*xpos = 0;
|
||||||
if (ypos)
|
if (ypos)
|
||||||
@@ -356,14 +353,14 @@ GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* handle,
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_glfw.platform.getMonitorWorkarea(monitor, xpos, ypos, width, height);
|
_glfw.platform.getMonitorWorkarea(monitor, xpos, ypos, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int* heightMM)
|
GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int* heightMM)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
|
|
||||||
if (widthMM)
|
if (widthMM)
|
||||||
*widthMM = 0;
|
*widthMM = 0;
|
||||||
if (heightMM)
|
if (heightMM)
|
||||||
@@ -371,6 +368,9 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int*
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
if (widthMM)
|
if (widthMM)
|
||||||
*widthMM = monitor->widthMM;
|
*widthMM = monitor->widthMM;
|
||||||
if (heightMM)
|
if (heightMM)
|
||||||
@@ -380,42 +380,46 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int*
|
|||||||
GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* handle,
|
GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* handle,
|
||||||
float* xscale, float* yscale)
|
float* xscale, float* yscale)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
|
|
||||||
if (xscale)
|
if (xscale)
|
||||||
*xscale = 0.f;
|
*xscale = 0.f;
|
||||||
if (yscale)
|
if (yscale)
|
||||||
*yscale = 0.f;
|
*yscale = 0.f;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_glfw.platform.getMonitorContentScale(monitor, xscale, yscale);
|
_glfw.platform.getMonitorContentScale(monitor, xscale, yscale);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)
|
GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
assert(monitor != NULL);
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
return monitor->name;
|
return monitor->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* handle, void* pointer)
|
GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* handle, void* pointer)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
assert(monitor != NULL);
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
monitor->userPointer = pointer;
|
monitor->userPointer = pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* handle)
|
GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
assert(monitor != NULL);
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
return monitor->userPointer;
|
return monitor->userPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,14 +432,15 @@ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun)
|
|||||||
|
|
||||||
GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)
|
GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
assert(count != NULL);
|
assert(count != NULL);
|
||||||
|
|
||||||
*count = 0;
|
*count = 0;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
if (!refreshVideoModes(monitor))
|
if (!refreshVideoModes(monitor))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -445,11 +450,11 @@ GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)
|
|||||||
|
|
||||||
GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle)
|
GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
assert(monitor != NULL);
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
|
|
||||||
if (!_glfw.platform.getVideoMode(monitor, &monitor->currentMode))
|
if (!_glfw.platform.getVideoMode(monitor, &monitor->currentMode))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -462,13 +467,15 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)
|
|||||||
unsigned short* values;
|
unsigned short* values;
|
||||||
GLFWgammaramp ramp;
|
GLFWgammaramp ramp;
|
||||||
const GLFWgammaramp* original;
|
const GLFWgammaramp* original;
|
||||||
assert(handle != NULL);
|
|
||||||
assert(gamma > 0.f);
|
assert(gamma > 0.f);
|
||||||
assert(gamma <= FLT_MAX);
|
assert(isfinite(gamma));
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
if (gamma != gamma || gamma <= 0.f || gamma > FLT_MAX)
|
assert(handle != NULL);
|
||||||
|
|
||||||
|
if (!isfinite(gamma) || gamma <= 0.f)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid gamma value %f", gamma);
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid gamma value %f", gamma);
|
||||||
return;
|
return;
|
||||||
@@ -505,11 +512,11 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)
|
|||||||
|
|
||||||
GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
|
GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
assert(monitor != NULL);
|
assert(monitor != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
|
|
||||||
_glfwFreeGammaArrays(&monitor->currentRamp);
|
_glfwFreeGammaArrays(&monitor->currentRamp);
|
||||||
if (!_glfw.platform.getGammaRamp(monitor, &monitor->currentRamp))
|
if (!_glfw.platform.getGammaRamp(monitor, &monitor->currentRamp))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -519,8 +526,6 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
|
|||||||
|
|
||||||
GLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)
|
GLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
assert(monitor != NULL);
|
|
||||||
assert(ramp != NULL);
|
assert(ramp != NULL);
|
||||||
assert(ramp->size > 0);
|
assert(ramp->size > 0);
|
||||||
assert(ramp->red != NULL);
|
assert(ramp->red != NULL);
|
||||||
@@ -529,6 +534,9 @@ GLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
if (ramp->size <= 0)
|
if (ramp->size <= 0)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE,
|
_glfwInputError(GLFW_INVALID_VALUE,
|
||||||
|
|||||||
+10
-16
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.5 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
static void makeContextCurrentNSGL(_GLFWwindow* window)
|
static void makeContextCurrentNSGL(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
@@ -127,8 +128,6 @@ static void destroyContextNSGL(_GLFWwindow* window)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Initialize OpenGL support
|
|
||||||
//
|
|
||||||
GLFWbool _glfwInitNSGL(void)
|
GLFWbool _glfwInitNSGL(void)
|
||||||
{
|
{
|
||||||
if (_glfw.nsgl.framework)
|
if (_glfw.nsgl.framework)
|
||||||
@@ -146,14 +145,10 @@ GLFWbool _glfwInitNSGL(void)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terminate OpenGL support
|
|
||||||
//
|
|
||||||
void _glfwTerminateNSGL(void)
|
void _glfwTerminateNSGL(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the OpenGL context
|
|
||||||
//
|
|
||||||
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig)
|
const _GLFWfbconfig* fbconfig)
|
||||||
@@ -182,16 +177,16 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Context robustness modes (GL_KHR_robustness) are not yet supported by
|
// Context robustness modes (GL_KHR_robustness) are not supported by
|
||||||
// macOS but are not a hard constraint, so ignore and continue
|
// macOS but are not a hard constraint, so ignore and continue
|
||||||
|
|
||||||
// Context release behaviors (GL_KHR_context_flush_control) are not yet
|
// Context release behaviors (GL_KHR_context_flush_control) are not
|
||||||
// supported by macOS but are not a hard constraint, so ignore and continue
|
// supported by macOS but are not a hard constraint, so ignore and continue
|
||||||
|
|
||||||
// Debug contexts (GL_KHR_debug) are not yet supported by macOS but are not
|
// Debug contexts (GL_KHR_debug) are not supported by macOS but are not
|
||||||
// a hard constraint, so ignore and continue
|
// a hard constraint, so ignore and continue
|
||||||
|
|
||||||
// No-error contexts (GL_KHR_no_error) are not yet supported by macOS but
|
// No-error contexts (GL_KHR_no_error) are not supported by macOS but
|
||||||
// are not a hard constraint, so ignore and continue
|
// are not a hard constraint, so ignore and continue
|
||||||
|
|
||||||
#define ADD_ATTRIB(a) \
|
#define ADD_ATTRIB(a) \
|
||||||
@@ -217,14 +212,11 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
ADD_ATTRIB(kCGLPFASupportsAutomaticGraphicsSwitching);
|
ADD_ATTRIB(kCGLPFASupportsAutomaticGraphicsSwitching);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101000
|
|
||||||
if (ctxconfig->major >= 4)
|
if (ctxconfig->major >= 4)
|
||||||
{
|
{
|
||||||
SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core);
|
SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core);
|
||||||
}
|
}
|
||||||
else
|
else if (ctxconfig->major >= 3)
|
||||||
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
|
|
||||||
if (ctxconfig->major >= 3)
|
|
||||||
{
|
{
|
||||||
SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core);
|
SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core);
|
||||||
}
|
}
|
||||||
@@ -361,7 +353,6 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
|
|
||||||
GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)
|
GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA)
|
||||||
@@ -371,6 +362,9 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016 Google Inc.
|
// Copyright (c) 2016 Google Inc.
|
||||||
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -260,5 +260,6 @@ void _glfwTerminateNull(void)
|
|||||||
free(_glfw.null.clipboardString);
|
free(_glfw.null.clipboardString);
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateOSMesa();
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
|
memset(&_glfw.null, 0, sizeof(_glfw.null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016 Google Inc.
|
// Copyright (c) 2016 Google Inc.
|
||||||
// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+12
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016 Google Inc.
|
// Copyright (c) 2016 Google Inc.
|
||||||
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -156,6 +156,17 @@
|
|||||||
#define GLFW_NULL_SC_MENU 120
|
#define GLFW_NULL_SC_MENU 120
|
||||||
#define GLFW_NULL_SC_LAST GLFW_NULL_SC_MENU
|
#define GLFW_NULL_SC_LAST GLFW_NULL_SC_MENU
|
||||||
|
|
||||||
|
typedef VkFlags VkHeadlessSurfaceCreateFlagsEXT;
|
||||||
|
|
||||||
|
typedef struct VkHeadlessSurfaceCreateInfoEXT
|
||||||
|
{
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkHeadlessSurfaceCreateFlagsEXT flags;
|
||||||
|
} VkHeadlessSurfaceCreateInfoEXT;
|
||||||
|
|
||||||
|
typedef VkResult (APIENTRY *PFN_vkCreateHeadlessSurfaceEXT)(VkInstance,const VkHeadlessSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
||||||
|
|
||||||
// Null-specific per-window data
|
// Null-specific per-window data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWwindowNull
|
typedef struct _GLFWwindowNull
|
||||||
|
|||||||
+36
-6
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016 Google Inc.
|
// Copyright (c) 2016 Google Inc.
|
||||||
// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
static void applySizeLimits(_GLFWwindow* window, int* width, int* height)
|
static void applySizeLimits(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
@@ -552,12 +553,15 @@ const char* _glfwGetClipboardStringNull(void)
|
|||||||
|
|
||||||
EGLenum _glfwGetEGLPlatformNull(EGLint** attribs)
|
EGLenum _glfwGetEGLPlatformNull(EGLint** attribs)
|
||||||
{
|
{
|
||||||
return 0;
|
if (_glfw.egl.EXT_platform_base && _glfw.egl.MESA_platform_surfaceless)
|
||||||
|
return EGL_PLATFORM_SURFACELESS_MESA;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLNativeDisplayType _glfwGetEGLNativeDisplayNull(void)
|
EGLNativeDisplayType _glfwGetEGLNativeDisplayNull(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return EGL_DEFAULT_DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLNativeWindowType _glfwGetEGLNativeWindowNull(_GLFWwindow* window)
|
EGLNativeWindowType _glfwGetEGLNativeWindowNull(_GLFWwindow* window)
|
||||||
@@ -699,13 +703,18 @@ int _glfwGetKeyScancodeNull(int key)
|
|||||||
|
|
||||||
void _glfwGetRequiredInstanceExtensionsNull(char** extensions)
|
void _glfwGetRequiredInstanceExtensionsNull(char** extensions)
|
||||||
{
|
{
|
||||||
|
if (!_glfw.vk.KHR_surface || !_glfw.vk.EXT_headless_surface)
|
||||||
|
return;
|
||||||
|
|
||||||
|
extensions[0] = "VK_KHR_surface";
|
||||||
|
extensions[1] = "VK_EXT_headless_surface";
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWbool _glfwGetPhysicalDevicePresentationSupportNull(VkInstance instance,
|
GLFWbool _glfwGetPhysicalDevicePresentationSupportNull(VkInstance instance,
|
||||||
VkPhysicalDevice device,
|
VkPhysicalDevice device,
|
||||||
uint32_t queuefamily)
|
uint32_t queuefamily)
|
||||||
{
|
{
|
||||||
return GLFW_FALSE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult _glfwCreateWindowSurfaceNull(VkInstance instance,
|
VkResult _glfwCreateWindowSurfaceNull(VkInstance instance,
|
||||||
@@ -713,7 +722,28 @@ VkResult _glfwCreateWindowSurfaceNull(VkInstance instance,
|
|||||||
const VkAllocationCallbacks* allocator,
|
const VkAllocationCallbacks* allocator,
|
||||||
VkSurfaceKHR* surface)
|
VkSurfaceKHR* surface)
|
||||||
{
|
{
|
||||||
// This seems like the most appropriate error to return here
|
PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT =
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
(PFN_vkCreateHeadlessSurfaceEXT)
|
||||||
|
vkGetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT");
|
||||||
|
if (!vkCreateHeadlessSurfaceEXT)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
|
"Null: Vulkan instance missing VK_EXT_headless_surface extension");
|
||||||
|
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkHeadlessSurfaceCreateInfoEXT sci;
|
||||||
|
memset(&sci, 0, sizeof(sci));
|
||||||
|
sci.sType = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT;
|
||||||
|
|
||||||
|
const VkResult err = vkCreateHeadlessSurfaceEXT(instance, &sci, allocator, surface);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Null: Failed to create Vulkan surface: %s",
|
||||||
|
_glfwGetVulkanResultString(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-11
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 OSMesa - www.glfw.org
|
// GLFW 3.5 OSMesa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016 Google Inc.
|
// Copyright (c) 2016 Google Inc.
|
||||||
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -180,11 +180,8 @@ GLFWbool _glfwInitOSMesa(void)
|
|||||||
|
|
||||||
void _glfwTerminateOSMesa(void)
|
void _glfwTerminateOSMesa(void)
|
||||||
{
|
{
|
||||||
if (_glfw.osmesa.handle)
|
_glfwPlatformFreeModule(_glfw.osmesa.handle);
|
||||||
{
|
_glfw.osmesa.handle = NULL;
|
||||||
_glfwPlatformFreeModule(_glfw.osmesa.handle);
|
|
||||||
_glfw.osmesa.handle = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ATTRIB(a, v) \
|
#define SET_ATTRIB(a, v) \
|
||||||
@@ -296,11 +293,12 @@ GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* handle, int* width,
|
|||||||
{
|
{
|
||||||
void* mesaBuffer;
|
void* mesaBuffer;
|
||||||
GLint mesaWidth, mesaHeight, mesaFormat;
|
GLint mesaWidth, mesaHeight, mesaFormat;
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
@@ -335,11 +333,12 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* handle,
|
|||||||
{
|
{
|
||||||
void* mesaBuffer;
|
void* mesaBuffer;
|
||||||
GLint mesaWidth, mesaHeight, mesaBytes;
|
GLint mesaWidth, mesaHeight, mesaBytes;
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
@@ -369,9 +368,11 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* handle,
|
|||||||
|
|
||||||
GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* handle)
|
GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
|||||||
+1
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// 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-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -187,8 +187,6 @@ GLFWAPI const char* glfwGetVersionString(void)
|
|||||||
" OSMesa"
|
" OSMesa"
|
||||||
#if defined(__MINGW64_VERSION_MAJOR)
|
#if defined(__MINGW64_VERSION_MAJOR)
|
||||||
" MinGW-w64"
|
" MinGW-w64"
|
||||||
#elif defined(__MINGW32__)
|
|
||||||
" MinGW"
|
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
" VisualC"
|
" VisualC"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+7
-6
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// 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-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
#if defined(GLFW_BUILD_WIN32_TIMER) || \
|
#if defined(GLFW_BUILD_WIN32_TIMER) || \
|
||||||
defined(GLFW_BUILD_WIN32_MODULE) || \
|
defined(GLFW_BUILD_WIN32_MODULE) || \
|
||||||
defined(GLFW_BUILD_WIN32_THREAD) || \
|
defined(GLFW_BUILD_WIN32_THREAD) || \
|
||||||
defined(GLFW_BUILD_COCOA_TIMER) || \
|
defined(GLFW_BUILD_MACOS_TIMER) || \
|
||||||
defined(GLFW_BUILD_POSIX_TIMER) || \
|
defined(GLFW_BUILD_POSIX_TIMER) || \
|
||||||
defined(GLFW_BUILD_POSIX_MODULE) || \
|
defined(GLFW_BUILD_POSIX_MODULE) || \
|
||||||
defined(GLFW_BUILD_POSIX_THREAD) || \
|
defined(GLFW_BUILD_POSIX_THREAD) || \
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define GLFW_BUILD_WIN32_TIMER
|
#define GLFW_BUILD_WIN32_TIMER
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
#define GLFW_BUILD_COCOA_TIMER
|
#define GLFW_BUILD_MACOS_TIMER
|
||||||
#else
|
#else
|
||||||
#define GLFW_BUILD_POSIX_TIMER
|
#define GLFW_BUILD_POSIX_TIMER
|
||||||
#endif
|
#endif
|
||||||
@@ -192,9 +192,9 @@
|
|||||||
#if defined(GLFW_BUILD_WIN32_TIMER)
|
#if defined(GLFW_BUILD_WIN32_TIMER)
|
||||||
#include "win32_time.h"
|
#include "win32_time.h"
|
||||||
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_WIN32_LIBRARY_TIMER_STATE
|
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_WIN32_LIBRARY_TIMER_STATE
|
||||||
#elif defined(GLFW_BUILD_COCOA_TIMER)
|
#elif defined(GLFW_BUILD_MACOS_TIMER)
|
||||||
#include "cocoa_time.h"
|
#include "macos_time.h"
|
||||||
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_COCOA_LIBRARY_TIMER_STATE
|
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_MACOS_LIBRARY_TIMER_STATE
|
||||||
#elif defined(GLFW_BUILD_POSIX_TIMER)
|
#elif defined(GLFW_BUILD_POSIX_TIMER)
|
||||||
#include "posix_time.h"
|
#include "posix_time.h"
|
||||||
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_POSIX_LIBRARY_TIMER_STATE
|
#define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_POSIX_LIBRARY_TIMER_STATE
|
||||||
@@ -207,6 +207,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_GLFW_WAYLAND) || defined(_GLFW_X11)
|
#if defined(_GLFW_WAYLAND) || defined(_GLFW_X11)
|
||||||
|
#include "posix_poll.h"
|
||||||
#define GLFW_BUILD_POSIX_POLL
|
#define GLFW_BUILD_POSIX_POLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -41,7 +41,8 @@ void* _glfwPlatformLoadModule(const char* path)
|
|||||||
|
|
||||||
void _glfwPlatformFreeModule(void* module)
|
void _glfwPlatformFreeModule(void* module)
|
||||||
{
|
{
|
||||||
dlclose(module);
|
if (module)
|
||||||
|
dlclose(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name)
|
GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name)
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.5 POSIX - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+55
-18
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// 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-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -34,6 +34,40 @@
|
|||||||
#define _GLFW_FIND_LOADER 1
|
#define _GLFW_FIND_LOADER 1
|
||||||
#define _GLFW_REQUIRE_LOADER 2
|
#define _GLFW_REQUIRE_LOADER 2
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
|
||||||
|
static void* loadLocalVulkanLoaderMacOS(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __APPLE__
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
@@ -55,12 +89,12 @@ GLFWbool _glfwInitVulkan(int mode)
|
|||||||
{
|
{
|
||||||
#if defined(_GLFW_VULKAN_LIBRARY)
|
#if defined(_GLFW_VULKAN_LIBRARY)
|
||||||
_glfw.vk.handle = _glfwPlatformLoadModule(_GLFW_VULKAN_LIBRARY);
|
_glfw.vk.handle = _glfwPlatformLoadModule(_GLFW_VULKAN_LIBRARY);
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_WIN32)
|
||||||
_glfw.vk.handle = _glfwPlatformLoadModule("vulkan-1.dll");
|
_glfw.vk.handle = _glfwPlatformLoadModule("vulkan-1.dll");
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(__APPLE__)
|
||||||
_glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.1.dylib");
|
_glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.1.dylib");
|
||||||
if (!_glfw.vk.handle)
|
if (!_glfw.vk.handle)
|
||||||
_glfw.vk.handle = _glfwLoadLocalVulkanLoaderCocoa();
|
_glfw.vk.handle = loadLocalVulkanLoaderMacOS();
|
||||||
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
_glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.so");
|
_glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.so");
|
||||||
#else
|
#else
|
||||||
@@ -129,19 +163,21 @@ GLFWbool _glfwInitVulkan(int mode)
|
|||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
if (strcmp(ep[i].extensionName, "VK_KHR_surface") == 0)
|
if (strcmp(ep[i].extensionName, "VK_KHR_surface") == 0)
|
||||||
_glfw.vk.KHR_surface = GLFW_TRUE;
|
_glfw.vk.KHR_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_win32_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_win32_surface") == 0)
|
||||||
_glfw.vk.KHR_win32_surface = GLFW_TRUE;
|
_glfw.vk.KHR_win32_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_MVK_macos_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_MVK_macos_surface") == 0)
|
||||||
_glfw.vk.MVK_macos_surface = GLFW_TRUE;
|
_glfw.vk.MVK_macos_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_EXT_metal_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_EXT_metal_surface") == 0)
|
||||||
_glfw.vk.EXT_metal_surface = GLFW_TRUE;
|
_glfw.vk.EXT_metal_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_xlib_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_xlib_surface") == 0)
|
||||||
_glfw.vk.KHR_xlib_surface = GLFW_TRUE;
|
_glfw.vk.KHR_xlib_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_xcb_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_xcb_surface") == 0)
|
||||||
_glfw.vk.KHR_xcb_surface = GLFW_TRUE;
|
_glfw.vk.KHR_xcb_surface = true;
|
||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_wayland_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_wayland_surface") == 0)
|
||||||
_glfw.vk.KHR_wayland_surface = GLFW_TRUE;
|
_glfw.vk.KHR_wayland_surface = true;
|
||||||
|
else if (strcmp(ep[i].extensionName, "VK_EXT_headless_surface") == 0)
|
||||||
|
_glfw.vk.EXT_headless_surface = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfw_free(ep);
|
_glfw_free(ep);
|
||||||
@@ -155,8 +191,8 @@ GLFWbool _glfwInitVulkan(int mode)
|
|||||||
|
|
||||||
void _glfwTerminateVulkan(void)
|
void _glfwTerminateVulkan(void)
|
||||||
{
|
{
|
||||||
if (_glfw.vk.handle)
|
_glfwPlatformFreeModule(_glfw.vk.handle);
|
||||||
_glfwPlatformFreeModule(_glfw.vk.handle);
|
_glfw.vk.handle = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* _glfwGetVulkanResultString(VkResult result)
|
const char* _glfwGetVulkanResultString(VkResult result)
|
||||||
@@ -272,11 +308,11 @@ GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance,
|
|||||||
VkPhysicalDevice device,
|
VkPhysicalDevice device,
|
||||||
uint32_t queuefamily)
|
uint32_t queuefamily)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
assert(instance != VK_NULL_HANDLE);
|
assert(instance != VK_NULL_HANDLE);
|
||||||
assert(device != VK_NULL_HANDLE);
|
assert(device != VK_NULL_HANDLE);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
|
||||||
|
|
||||||
if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))
|
if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
@@ -297,15 +333,16 @@ GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance,
|
|||||||
const VkAllocationCallbacks* allocator,
|
const VkAllocationCallbacks* allocator,
|
||||||
VkSurfaceKHR* surface)
|
VkSurfaceKHR* surface)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(instance != VK_NULL_HANDLE);
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(surface != NULL);
|
assert(surface != NULL);
|
||||||
|
|
||||||
*surface = VK_NULL_HANDLE;
|
*surface = VK_NULL_HANDLE;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(VK_ERROR_INITIALIZATION_FAILED);
|
_GLFW_REQUIRE_INIT_OR_RETURN(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
assert(instance != VK_NULL_HANDLE);
|
||||||
|
|
||||||
if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))
|
if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))
|
||||||
return VK_ERROR_INITIALIZATION_FAILED;
|
return VK_ERROR_INITIALIZATION_FAILED;
|
||||||
|
|
||||||
|
|||||||
+17
-29
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 WGL - www.glfw.org
|
// GLFW 3.5 WGL - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -186,28 +186,22 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
|
|||||||
u->accumAlphaBits = FIND_ATTRIB_VALUE(WGL_ACCUM_ALPHA_BITS_ARB);
|
u->accumAlphaBits = FIND_ATTRIB_VALUE(WGL_ACCUM_ALPHA_BITS_ARB);
|
||||||
|
|
||||||
u->auxBuffers = FIND_ATTRIB_VALUE(WGL_AUX_BUFFERS_ARB);
|
u->auxBuffers = FIND_ATTRIB_VALUE(WGL_AUX_BUFFERS_ARB);
|
||||||
|
u->stereo = FIND_ATTRIB_VALUE(WGL_STEREO_ARB);
|
||||||
if (FIND_ATTRIB_VALUE(WGL_STEREO_ARB))
|
|
||||||
u->stereo = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.wgl.ARB_multisample)
|
if (_glfw.wgl.ARB_multisample)
|
||||||
u->samples = FIND_ATTRIB_VALUE(WGL_SAMPLES_ARB);
|
u->samples = FIND_ATTRIB_VALUE(WGL_SAMPLES_ARB);
|
||||||
|
|
||||||
if (ctxconfig->client == GLFW_OPENGL_API)
|
if (ctxconfig->client == GLFW_OPENGL_API)
|
||||||
{
|
{
|
||||||
if (_glfw.wgl.ARB_framebuffer_sRGB ||
|
if (_glfw.wgl.ARB_framebuffer_sRGB || _glfw.wgl.EXT_framebuffer_sRGB)
|
||||||
_glfw.wgl.EXT_framebuffer_sRGB)
|
u->sRGB = FIND_ATTRIB_VALUE(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB);
|
||||||
{
|
|
||||||
if (FIND_ATTRIB_VALUE(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB))
|
|
||||||
u->sRGB = GLFW_TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_glfw.wgl.EXT_colorspace)
|
if (_glfw.wgl.EXT_colorspace)
|
||||||
{
|
{
|
||||||
if (FIND_ATTRIB_VALUE(WGL_COLORSPACE_EXT) == WGL_COLORSPACE_SRGB_EXT)
|
if (FIND_ATTRIB_VALUE(WGL_COLORSPACE_EXT) == WGL_COLORSPACE_SRGB_EXT)
|
||||||
u->sRGB = GLFW_TRUE;
|
u->sRGB = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,9 +255,7 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
|
|||||||
u->accumAlphaBits = pfd.cAccumAlphaBits;
|
u->accumAlphaBits = pfd.cAccumAlphaBits;
|
||||||
|
|
||||||
u->auxBuffers = pfd.cAuxBuffers;
|
u->auxBuffers = pfd.cAuxBuffers;
|
||||||
|
u->stereo = (pfd.dwFlags & PFD_STEREO);
|
||||||
if (pfd.dwFlags & PFD_STEREO)
|
|
||||||
u->stereo = GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u->handle = pixelFormat;
|
u->handle = pixelFormat;
|
||||||
@@ -327,8 +319,8 @@ static void swapBuffersWGL(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
if (!window->monitor)
|
if (!window->monitor)
|
||||||
{
|
{
|
||||||
// HACK: Use DwmFlush when desktop composition is enabled on Windows Vista and 7
|
// HACK: Use DwmFlush when desktop composition is enabled on Windows 7
|
||||||
if (!IsWindows8OrGreater() && IsWindowsVistaOrGreater())
|
if (!IsWindows8OrGreater())
|
||||||
{
|
{
|
||||||
BOOL enabled = FALSE;
|
BOOL enabled = FALSE;
|
||||||
|
|
||||||
@@ -353,9 +345,9 @@ static void swapIntervalWGL(int interval)
|
|||||||
|
|
||||||
if (!window->monitor)
|
if (!window->monitor)
|
||||||
{
|
{
|
||||||
// HACK: Disable WGL swap interval when desktop composition is enabled on Windows
|
// HACK: Disable WGL swap interval when desktop composition is enabled on
|
||||||
// Vista and 7 to avoid interfering with DWM vsync
|
// Windows 7 to avoid interfering with DWM vsync
|
||||||
if (!IsWindows8OrGreater() && IsWindowsVistaOrGreater())
|
if (!IsWindows8OrGreater())
|
||||||
{
|
{
|
||||||
BOOL enabled = FALSE;
|
BOOL enabled = FALSE;
|
||||||
|
|
||||||
@@ -401,8 +393,6 @@ static void destroyContextWGL(_GLFWwindow* window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize WGL
|
|
||||||
//
|
|
||||||
GLFWbool _glfwInitWGL(void)
|
GLFWbool _glfwInitWGL(void)
|
||||||
{
|
{
|
||||||
PIXELFORMATDESCRIPTOR pfd;
|
PIXELFORMATDESCRIPTOR pfd;
|
||||||
@@ -521,12 +511,10 @@ GLFWbool _glfwInitWGL(void)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terminate WGL
|
|
||||||
//
|
|
||||||
void _glfwTerminateWGL(void)
|
void _glfwTerminateWGL(void)
|
||||||
{
|
{
|
||||||
if (_glfw.wgl.instance)
|
_glfwPlatformFreeModule(_glfw.wgl.instance);
|
||||||
_glfwPlatformFreeModule(_glfw.wgl.instance);
|
_glfw.wgl.instance = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ATTRIB(a, v) \
|
#define SET_ATTRIB(a, v) \
|
||||||
@@ -536,8 +524,6 @@ void _glfwTerminateWGL(void)
|
|||||||
attribs[index++] = v; \
|
attribs[index++] = v; \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the OpenGL or OpenGL ES context
|
|
||||||
//
|
|
||||||
GLFWbool _glfwCreateContextWGL(_GLFWwindow* window,
|
GLFWbool _glfwCreateContextWGL(_GLFWwindow* window,
|
||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig)
|
const _GLFWfbconfig* fbconfig)
|
||||||
@@ -670,7 +656,7 @@ GLFWbool _glfwCreateContextWGL(_GLFWwindow* window,
|
|||||||
if (ctxconfig->noerror)
|
if (ctxconfig->noerror)
|
||||||
{
|
{
|
||||||
if (_glfw.wgl.ARB_create_context_no_error)
|
if (_glfw.wgl.ARB_create_context_no_error)
|
||||||
SET_ATTRIB(WGL_CONTEXT_OPENGL_NO_ERROR_ARB, GLFW_TRUE);
|
SET_ATTRIB(WGL_CONTEXT_OPENGL_NO_ERROR_ARB, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Only request an explicitly versioned context when necessary, as
|
// NOTE: Only request an explicitly versioned context when necessary, as
|
||||||
@@ -775,7 +761,6 @@ GLFWbool _glfwCreateContextWGL(_GLFWwindow* window,
|
|||||||
|
|
||||||
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* handle)
|
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
||||||
@@ -785,6 +770,9 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
|||||||
+12
-31
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -89,10 +89,6 @@ static GLFWbool loadLibraries(void)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfw.win32.user32.SetProcessDPIAware_ = (PFN_SetProcessDPIAware)
|
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "SetProcessDPIAware");
|
|
||||||
_glfw.win32.user32.ChangeWindowMessageFilterEx_ = (PFN_ChangeWindowMessageFilterEx)
|
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "ChangeWindowMessageFilterEx");
|
|
||||||
_glfw.win32.user32.EnableNonClientDpiScaling_ = (PFN_EnableNonClientDpiScaling)
|
_glfw.win32.user32.EnableNonClientDpiScaling_ = (PFN_EnableNonClientDpiScaling)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "EnableNonClientDpiScaling");
|
_glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "EnableNonClientDpiScaling");
|
||||||
_glfw.win32.user32.SetProcessDpiAwarenessContext_ = (PFN_SetProcessDpiAwarenessContext)
|
_glfw.win32.user32.SetProcessDpiAwarenessContext_ = (PFN_SetProcessDpiAwarenessContext)
|
||||||
@@ -170,29 +166,6 @@ static GLFWbool loadLibraries(void)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unload used libraries (DLLs)
|
|
||||||
//
|
|
||||||
static void freeLibraries(void)
|
|
||||||
{
|
|
||||||
if (_glfw.win32.xinput.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.xinput.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.dinput8.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.dinput8.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.user32.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.user32.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.dwmapi.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.dwmapi.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.shcore.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.shcore.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.ntdll.instance)
|
|
||||||
_glfwPlatformFreeModule(_glfw.win32.ntdll.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create key code translation tables
|
// Create key code translation tables
|
||||||
//
|
//
|
||||||
static void createKeyTables(void)
|
static void createKeyTables(void)
|
||||||
@@ -532,7 +505,8 @@ void _glfwUpdateKeyNamesWin32(void)
|
|||||||
|
|
||||||
if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD)
|
if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD)
|
||||||
{
|
{
|
||||||
const UINT vks[] = {
|
const UINT vks[] =
|
||||||
|
{
|
||||||
VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,
|
VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,
|
||||||
VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
|
VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
|
||||||
VK_NUMPAD8, VK_NUMPAD9, VK_DECIMAL, VK_DIVIDE,
|
VK_NUMPAD8, VK_NUMPAD9, VK_DECIMAL, VK_DIVIDE,
|
||||||
@@ -692,7 +666,7 @@ int _glfwInitWin32(void)
|
|||||||
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||||
else if (IsWindows8Point1OrGreater())
|
else if (IsWindows8Point1OrGreater())
|
||||||
SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
|
SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
|
||||||
else if (IsWindowsVistaOrGreater())
|
else
|
||||||
SetProcessDPIAware();
|
SetProcessDPIAware();
|
||||||
|
|
||||||
if (!createHelperWindow())
|
if (!createHelperWindow())
|
||||||
@@ -724,7 +698,14 @@ void _glfwTerminateWin32(void)
|
|||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateOSMesa();
|
||||||
|
|
||||||
freeLibraries();
|
_glfwPlatformFreeModule(_glfw.win32.xinput.instance);
|
||||||
|
_glfwPlatformFreeModule(_glfw.win32.dinput8.instance);
|
||||||
|
_glfwPlatformFreeModule(_glfw.win32.user32.instance);
|
||||||
|
_glfwPlatformFreeModule(_glfw.win32.dwmapi.instance);
|
||||||
|
_glfwPlatformFreeModule(_glfw.win32.shcore.instance);
|
||||||
|
_glfwPlatformFreeModule(_glfw.win32.ntdll.instance);
|
||||||
|
|
||||||
|
memset(&_glfw.win32, 0, sizeof(_glfw.win32));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_WIN32
|
#endif // _GLFW_WIN32
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -39,7 +39,8 @@ void* _glfwPlatformLoadModule(const char* path)
|
|||||||
|
|
||||||
void _glfwPlatformFreeModule(void* module)
|
void _glfwPlatformFreeModule(void* module)
|
||||||
{
|
{
|
||||||
FreeLibrary((HMODULE) module);
|
if (module)
|
||||||
|
FreeLibrary((HMODULE) module);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name)
|
GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name)
|
||||||
|
|||||||
+8
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
// Callback for EnumDisplayMonitors in createMonitor
|
// Callback for EnumDisplayMonitors in createMonitor
|
||||||
@@ -539,7 +540,6 @@ void _glfwSetGammaRampWin32(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
|||||||
|
|
||||||
GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* handle)
|
GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
||||||
@@ -548,12 +548,14 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->win32.publicAdapterName;
|
return monitor->win32.publicAdapterName;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* handle)
|
GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
||||||
@@ -562,6 +564,9 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->win32.publicDisplayName;
|
return monitor->win32.publicDisplayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-79
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -48,14 +48,14 @@
|
|||||||
#define UNICODE
|
#define UNICODE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// GLFW requires Windows XP or later
|
// GLFW requires Windows 7 or later
|
||||||
#if WINVER < 0x0501
|
#if WINVER < 0x0601
|
||||||
#undef WINVER
|
#undef WINVER
|
||||||
#define WINVER 0x0501
|
#define WINVER 0x0601
|
||||||
#endif
|
#endif
|
||||||
#if _WIN32_WINNT < 0x0501
|
#if _WIN32_WINNT < 0x0601
|
||||||
#undef _WIN32_WINNT
|
#undef _WIN32_WINNT
|
||||||
#define _WIN32_WINNT 0x0501
|
#define _WIN32_WINNT 0x0601
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// GLFW uses DirectInput8 interfaces
|
// GLFW uses DirectInput8 interfaces
|
||||||
@@ -66,41 +66,21 @@
|
|||||||
|
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <dwmapi.h>
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
#include <xinput.h>
|
#include <xinput.h>
|
||||||
#include <dbt.h>
|
#include <dbt.h>
|
||||||
|
|
||||||
// HACK: Define macros that some windows.h variants don't
|
// HACK: Define macros that some windows.h variants don't
|
||||||
#ifndef WM_MOUSEHWHEEL
|
|
||||||
#define WM_MOUSEHWHEEL 0x020E
|
|
||||||
#endif
|
|
||||||
#ifndef WM_DWMCOMPOSITIONCHANGED
|
|
||||||
#define WM_DWMCOMPOSITIONCHANGED 0x031E
|
|
||||||
#endif
|
|
||||||
#ifndef WM_DWMCOLORIZATIONCOLORCHANGED
|
|
||||||
#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320
|
|
||||||
#endif
|
|
||||||
#ifndef WM_COPYGLOBALDATA
|
#ifndef WM_COPYGLOBALDATA
|
||||||
#define WM_COPYGLOBALDATA 0x0049
|
#define WM_COPYGLOBALDATA 0x0049
|
||||||
#endif
|
#endif
|
||||||
#ifndef WM_UNICHAR
|
|
||||||
#define WM_UNICHAR 0x0109
|
|
||||||
#endif
|
|
||||||
#ifndef UNICODE_NOCHAR
|
|
||||||
#define UNICODE_NOCHAR 0xFFFF
|
|
||||||
#endif
|
|
||||||
#ifndef WM_DPICHANGED
|
#ifndef WM_DPICHANGED
|
||||||
#define WM_DPICHANGED 0x02E0
|
#define WM_DPICHANGED 0x02E0
|
||||||
#endif
|
#endif
|
||||||
#ifndef GET_XBUTTON_WPARAM
|
|
||||||
#define GET_XBUTTON_WPARAM(w) (HIWORD(w))
|
|
||||||
#endif
|
|
||||||
#ifndef EDS_ROTATEDMODE
|
#ifndef EDS_ROTATEDMODE
|
||||||
#define EDS_ROTATEDMODE 0x00000004
|
#define EDS_ROTATEDMODE 0x00000004
|
||||||
#endif
|
#endif
|
||||||
#ifndef DISPLAY_DEVICE_ACTIVE
|
|
||||||
#define DISPLAY_DEVICE_ACTIVE 0x00000001
|
|
||||||
#endif
|
|
||||||
#ifndef _WIN32_WINNT_WINBLUE
|
#ifndef _WIN32_WINNT_WINBLUE
|
||||||
#define _WIN32_WINNT_WINBLUE 0x0603
|
#define _WIN32_WINNT_WINBLUE 0x0603
|
||||||
#endif
|
#endif
|
||||||
@@ -113,34 +93,6 @@
|
|||||||
#ifndef USER_DEFAULT_SCREEN_DPI
|
#ifndef USER_DEFAULT_SCREEN_DPI
|
||||||
#define USER_DEFAULT_SCREEN_DPI 96
|
#define USER_DEFAULT_SCREEN_DPI 96
|
||||||
#endif
|
#endif
|
||||||
#ifndef OCR_HAND
|
|
||||||
#define OCR_HAND 32649
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WINVER < 0x0601
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD cbSize;
|
|
||||||
DWORD ExtStatus;
|
|
||||||
} CHANGEFILTERSTRUCT;
|
|
||||||
#ifndef MSGFLT_ALLOW
|
|
||||||
#define MSGFLT_ALLOW 1
|
|
||||||
#endif
|
|
||||||
#endif /*Windows 7*/
|
|
||||||
|
|
||||||
#if WINVER < 0x0600
|
|
||||||
#define DWM_BB_ENABLE 0x00000001
|
|
||||||
#define DWM_BB_BLURREGION 0x00000002
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD dwFlags;
|
|
||||||
BOOL fEnable;
|
|
||||||
HRGN hRgnBlur;
|
|
||||||
BOOL fTransitionOnMaximized;
|
|
||||||
} DWM_BLURBEHIND;
|
|
||||||
#else
|
|
||||||
#include <dwmapi.h>
|
|
||||||
#endif /*Windows Vista*/
|
|
||||||
|
|
||||||
#ifndef DPI_ENUMS_DECLARED
|
#ifndef DPI_ENUMS_DECLARED
|
||||||
typedef enum
|
typedef enum
|
||||||
@@ -165,12 +117,6 @@ typedef enum
|
|||||||
// Replacement for versionhelpers.h macros, as we cannot rely on the
|
// Replacement for versionhelpers.h macros, as we cannot rely on the
|
||||||
// application having a correct embedded manifest
|
// application having a correct embedded manifest
|
||||||
//
|
//
|
||||||
#define IsWindowsVistaOrGreater() \
|
|
||||||
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA), \
|
|
||||||
LOBYTE(_WIN32_WINNT_VISTA), 0)
|
|
||||||
#define IsWindows7OrGreater() \
|
|
||||||
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN7), \
|
|
||||||
LOBYTE(_WIN32_WINNT_WIN7), 0)
|
|
||||||
#define IsWindows8OrGreater() \
|
#define IsWindows8OrGreater() \
|
||||||
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8), \
|
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8), \
|
||||||
LOBYTE(_WIN32_WINNT_WIN8), 0)
|
LOBYTE(_WIN32_WINNT_WIN8), 0)
|
||||||
@@ -281,15 +227,11 @@ typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*
|
|||||||
#define DirectInput8Create _glfw.win32.dinput8.Create
|
#define DirectInput8Create _glfw.win32.dinput8.Create
|
||||||
|
|
||||||
// user32.dll function pointer typedefs
|
// user32.dll function pointer typedefs
|
||||||
typedef BOOL (WINAPI * PFN_SetProcessDPIAware)(void);
|
|
||||||
typedef BOOL (WINAPI * PFN_ChangeWindowMessageFilterEx)(HWND,UINT,DWORD,CHANGEFILTERSTRUCT*);
|
|
||||||
typedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND);
|
typedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND);
|
||||||
typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE);
|
typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE);
|
||||||
typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND);
|
typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND);
|
||||||
typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
|
typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
|
||||||
typedef int (WINAPI * PFN_GetSystemMetricsForDpi)(int,UINT);
|
typedef int (WINAPI * PFN_GetSystemMetricsForDpi)(int,UINT);
|
||||||
#define SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware_
|
|
||||||
#define ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx_
|
|
||||||
#define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_
|
#define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_
|
||||||
#define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_
|
#define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_
|
||||||
#define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_
|
#define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_
|
||||||
@@ -394,18 +336,18 @@ typedef struct _GLFWlibraryWGL
|
|||||||
PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT;
|
PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT;
|
||||||
PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB;
|
PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB;
|
||||||
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||||
GLFWbool EXT_swap_control;
|
bool EXT_swap_control;
|
||||||
GLFWbool EXT_colorspace;
|
bool EXT_colorspace;
|
||||||
GLFWbool ARB_multisample;
|
bool ARB_multisample;
|
||||||
GLFWbool ARB_framebuffer_sRGB;
|
bool ARB_framebuffer_sRGB;
|
||||||
GLFWbool EXT_framebuffer_sRGB;
|
bool EXT_framebuffer_sRGB;
|
||||||
GLFWbool ARB_pixel_format;
|
bool ARB_pixel_format;
|
||||||
GLFWbool ARB_create_context;
|
bool ARB_create_context;
|
||||||
GLFWbool ARB_create_context_profile;
|
bool ARB_create_context_profile;
|
||||||
GLFWbool EXT_create_context_es2_profile;
|
bool EXT_create_context_es2_profile;
|
||||||
GLFWbool ARB_create_context_robustness;
|
bool ARB_create_context_robustness;
|
||||||
GLFWbool ARB_create_context_no_error;
|
bool ARB_create_context_no_error;
|
||||||
GLFWbool ARB_context_flush_control;
|
bool ARB_context_flush_control;
|
||||||
} _GLFWlibraryWGL;
|
} _GLFWlibraryWGL;
|
||||||
|
|
||||||
// Win32-specific per-window data
|
// Win32-specific per-window data
|
||||||
@@ -475,8 +417,6 @@ typedef struct _GLFWlibraryWin32
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
PFN_SetProcessDPIAware SetProcessDPIAware_;
|
|
||||||
PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;
|
|
||||||
PFN_EnableNonClientDpiScaling EnableNonClientDpiScaling_;
|
PFN_EnableNonClientDpiScaling EnableNonClientDpiScaling_;
|
||||||
PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
|
PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
|
||||||
PFN_GetDpiForWindow GetDpiForWindow_;
|
PFN_GetDpiForWindow GetDpiForWindow_;
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|||||||
+14
-23
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.5 Win32 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
|
||||||
@@ -373,9 +374,6 @@ static void updateFramebufferTransparency(const _GLFWwindow* window)
|
|||||||
BOOL composition, opaque;
|
BOOL composition, opaque;
|
||||||
DWORD color;
|
DWORD color;
|
||||||
|
|
||||||
if (!IsWindowsVistaOrGreater())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition)
|
if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -713,11 +711,12 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
|
|||||||
const int mods = getKeyMods();
|
const int mods = getKeyMods();
|
||||||
|
|
||||||
scancode = (HIWORD(lParam) & (KF_EXTENDED | 0xff));
|
scancode = (HIWORD(lParam) & (KF_EXTENDED | 0xff));
|
||||||
if (!scancode)
|
if (!(scancode & 0xff))
|
||||||
{
|
{
|
||||||
// NOTE: Some synthetic key messages have a scancode of zero
|
// NOTE: Both media keys and the synthetic key messages from Windows
|
||||||
// HACK: Map the virtual key back to a usable scancode
|
// Clipboard History are reported with a scancode of zero
|
||||||
scancode = MapVirtualKeyW((UINT) wParam, MAPVK_VK_TO_VSC);
|
// HACK: Map the virtual key to a scancode but preserve extended bit
|
||||||
|
scancode |= MapVirtualKeyW((UINT) wParam, MAPVK_VK_TO_VSC);
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: Alt+PrtSc has a different scancode than just PrtSc
|
// HACK: Alt+PrtSc has a different scancode than just PrtSc
|
||||||
@@ -982,7 +981,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
|
|||||||
|
|
||||||
case WM_MOUSEHWHEEL:
|
case WM_MOUSEHWHEEL:
|
||||||
{
|
{
|
||||||
// This message is only sent on Windows Vista and later
|
|
||||||
// NOTE: The X-axis is inverted for consistency with macOS and X11
|
// NOTE: The X-axis is inverted for consistency with macOS and X11
|
||||||
_glfwInputScroll(window, -((SHORT) HIWORD(wParam) / (double) WHEEL_DELTA), 0.0);
|
_glfwInputScroll(window, -((SHORT) HIWORD(wParam) / (double) WHEEL_DELTA), 0.0);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1380,7 +1378,7 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
frameHeight = rect.bottom - rect.top;
|
frameHeight = rect.bottom - rect.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
wideTitle = _glfwCreateWideStringFromUTF8Win32(wndconfig->title);
|
wideTitle = _glfwCreateWideStringFromUTF8Win32(window->title);
|
||||||
if (!wideTitle)
|
if (!wideTitle)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
@@ -1406,15 +1404,9 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
|
|
||||||
SetPropW(window->win32.handle, L"GLFW", window);
|
SetPropW(window->win32.handle, L"GLFW", window);
|
||||||
|
|
||||||
if (IsWindows7OrGreater())
|
ChangeWindowMessageFilterEx(window->win32.handle, WM_DROPFILES, MSGFLT_ALLOW, NULL);
|
||||||
{
|
ChangeWindowMessageFilterEx(window->win32.handle, WM_COPYDATA, MSGFLT_ALLOW, NULL);
|
||||||
ChangeWindowMessageFilterEx(window->win32.handle,
|
ChangeWindowMessageFilterEx(window->win32.handle, WM_COPYGLOBALDATA, MSGFLT_ALLOW, NULL);
|
||||||
WM_DROPFILES, MSGFLT_ALLOW, NULL);
|
|
||||||
ChangeWindowMessageFilterEx(window->win32.handle,
|
|
||||||
WM_COPYDATA, MSGFLT_ALLOW, NULL);
|
|
||||||
ChangeWindowMessageFilterEx(window->win32.handle,
|
|
||||||
WM_COPYGLOBALDATA, MSGFLT_ALLOW, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
window->win32.scaleToMonitor = wndconfig->scaleToMonitor;
|
window->win32.scaleToMonitor = wndconfig->scaleToMonitor;
|
||||||
window->win32.keymenu = wndconfig->win32.keymenu;
|
window->win32.keymenu = wndconfig->win32.keymenu;
|
||||||
@@ -1980,9 +1972,6 @@ GLFWbool _glfwFramebufferTransparentWin32(_GLFWwindow* window)
|
|||||||
if (!window->win32.transparent)
|
if (!window->win32.transparent)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
if (!IsWindowsVistaOrGreater())
|
|
||||||
return GLFW_FALSE;
|
|
||||||
|
|
||||||
if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition)
|
if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
@@ -2576,7 +2565,6 @@ VkResult _glfwCreateWindowSurfaceWin32(VkInstance instance,
|
|||||||
|
|
||||||
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* handle)
|
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WIN32)
|
||||||
@@ -2586,6 +2574,9 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
return window->win32.handle;
|
return window->win32.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+134
-108
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.5 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW event API //////
|
////// GLFW event API //////
|
||||||
@@ -135,9 +135,9 @@ void _glfwInputWindowContentScale(_GLFWwindow* window, float xscale, float yscal
|
|||||||
{
|
{
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
assert(xscale > 0.f);
|
assert(xscale > 0.f);
|
||||||
assert(xscale < FLT_MAX);
|
assert(isfinite(xscale));
|
||||||
assert(yscale > 0.f);
|
assert(yscale > 0.f);
|
||||||
assert(yscale < FLT_MAX);
|
assert(isfinite(yscale));
|
||||||
|
|
||||||
if (window->callbacks.scale)
|
if (window->callbacks.scale)
|
||||||
window->callbacks.scale((GLFWwindow*) window, xscale, yscale);
|
window->callbacks.scale((GLFWwindow*) window, xscale, yscale);
|
||||||
@@ -208,7 +208,6 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
|
|
||||||
wndconfig.width = width;
|
wndconfig.width = width;
|
||||||
wndconfig.height = height;
|
wndconfig.height = height;
|
||||||
wndconfig.title = title;
|
|
||||||
ctxconfig.share = (_GLFWwindow*) share;
|
ctxconfig.share = (_GLFWwindow*) share;
|
||||||
|
|
||||||
if (!_glfwIsValidContextConfig(&ctxconfig))
|
if (!_glfwIsValidContextConfig(&ctxconfig))
|
||||||
@@ -266,16 +265,16 @@ void glfwDefaultWindowHints(void)
|
|||||||
|
|
||||||
// The default is a focused, visible, resizable window with decorations
|
// The default is a focused, visible, resizable window with decorations
|
||||||
memset(&_glfw.hints.window, 0, sizeof(_glfw.hints.window));
|
memset(&_glfw.hints.window, 0, sizeof(_glfw.hints.window));
|
||||||
_glfw.hints.window.resizable = GLFW_TRUE;
|
_glfw.hints.window.resizable = true;
|
||||||
_glfw.hints.window.visible = GLFW_TRUE;
|
_glfw.hints.window.visible = true;
|
||||||
_glfw.hints.window.decorated = GLFW_TRUE;
|
_glfw.hints.window.decorated = true;
|
||||||
_glfw.hints.window.focused = GLFW_TRUE;
|
_glfw.hints.window.focused = true;
|
||||||
_glfw.hints.window.autoIconify = GLFW_TRUE;
|
_glfw.hints.window.autoIconify = true;
|
||||||
_glfw.hints.window.centerCursor = GLFW_TRUE;
|
_glfw.hints.window.centerCursor = true;
|
||||||
_glfw.hints.window.focusOnShow = GLFW_TRUE;
|
_glfw.hints.window.focusOnShow = true;
|
||||||
_glfw.hints.window.xpos = GLFW_ANY_POSITION;
|
_glfw.hints.window.xpos = GLFW_ANY_POSITION;
|
||||||
_glfw.hints.window.ypos = GLFW_ANY_POSITION;
|
_glfw.hints.window.ypos = GLFW_ANY_POSITION;
|
||||||
_glfw.hints.window.scaleFramebuffer = GLFW_TRUE;
|
_glfw.hints.window.scaleFramebuffer = true;
|
||||||
|
|
||||||
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,
|
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,
|
||||||
// double buffered
|
// double buffered
|
||||||
@@ -286,7 +285,7 @@ void glfwDefaultWindowHints(void)
|
|||||||
_glfw.hints.framebuffer.alphaBits = 8;
|
_glfw.hints.framebuffer.alphaBits = 8;
|
||||||
_glfw.hints.framebuffer.depthBits = 24;
|
_glfw.hints.framebuffer.depthBits = 24;
|
||||||
_glfw.hints.framebuffer.stencilBits = 8;
|
_glfw.hints.framebuffer.stencilBits = 8;
|
||||||
_glfw.hints.framebuffer.doublebuffer = GLFW_TRUE;
|
_glfw.hints.framebuffer.doublebuffer = true;
|
||||||
|
|
||||||
// The default is to select the highest available refresh rate
|
// The default is to select the highest available refresh rate
|
||||||
_glfw.hints.refreshRate = GLFW_DONT_CARE;
|
_glfw.hints.refreshRate = GLFW_DONT_CARE;
|
||||||
@@ -332,40 +331,40 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
_glfw.hints.framebuffer.auxBuffers = value;
|
_glfw.hints.framebuffer.auxBuffers = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_STEREO:
|
case GLFW_STEREO:
|
||||||
_glfw.hints.framebuffer.stereo = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.framebuffer.stereo = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_DOUBLEBUFFER:
|
case GLFW_DOUBLEBUFFER:
|
||||||
_glfw.hints.framebuffer.doublebuffer = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.framebuffer.doublebuffer = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_TRANSPARENT_FRAMEBUFFER:
|
case GLFW_TRANSPARENT_FRAMEBUFFER:
|
||||||
_glfw.hints.framebuffer.transparent = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.framebuffer.transparent = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_SAMPLES:
|
case GLFW_SAMPLES:
|
||||||
_glfw.hints.framebuffer.samples = value;
|
_glfw.hints.framebuffer.samples = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_SRGB_CAPABLE:
|
case GLFW_SRGB_CAPABLE:
|
||||||
_glfw.hints.framebuffer.sRGB = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.framebuffer.sRGB = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_RESIZABLE:
|
case GLFW_RESIZABLE:
|
||||||
_glfw.hints.window.resizable = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.resizable = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_DECORATED:
|
case GLFW_DECORATED:
|
||||||
_glfw.hints.window.decorated = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.decorated = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_FOCUSED:
|
case GLFW_FOCUSED:
|
||||||
_glfw.hints.window.focused = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.focused = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_AUTO_ICONIFY:
|
case GLFW_AUTO_ICONIFY:
|
||||||
_glfw.hints.window.autoIconify = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.autoIconify = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_FLOATING:
|
case GLFW_FLOATING:
|
||||||
_glfw.hints.window.floating = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.floating = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_MAXIMIZED:
|
case GLFW_MAXIMIZED:
|
||||||
_glfw.hints.window.maximized = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.maximized = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_VISIBLE:
|
case GLFW_VISIBLE:
|
||||||
_glfw.hints.window.visible = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.visible = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_POSITION_X:
|
case GLFW_POSITION_X:
|
||||||
_glfw.hints.window.xpos = value;
|
_glfw.hints.window.xpos = value;
|
||||||
@@ -374,29 +373,29 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
_glfw.hints.window.ypos = value;
|
_glfw.hints.window.ypos = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_WIN32_KEYBOARD_MENU:
|
case GLFW_WIN32_KEYBOARD_MENU:
|
||||||
_glfw.hints.window.win32.keymenu = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.win32.keymenu = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_WIN32_SHOWDEFAULT:
|
case GLFW_WIN32_SHOWDEFAULT:
|
||||||
_glfw.hints.window.win32.showDefault = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.win32.showDefault = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_COCOA_GRAPHICS_SWITCHING:
|
case GLFW_COCOA_GRAPHICS_SWITCHING:
|
||||||
_glfw.hints.context.nsgl.offline = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.nsgl.offline = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_SCALE_TO_MONITOR:
|
case GLFW_SCALE_TO_MONITOR:
|
||||||
_glfw.hints.window.scaleToMonitor = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.scaleToMonitor = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_SCALE_FRAMEBUFFER:
|
case GLFW_SCALE_FRAMEBUFFER:
|
||||||
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
||||||
_glfw.hints.window.scaleFramebuffer = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.scaleFramebuffer = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_CENTER_CURSOR:
|
case GLFW_CENTER_CURSOR:
|
||||||
_glfw.hints.window.centerCursor = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.centerCursor = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_FOCUS_ON_SHOW:
|
case GLFW_FOCUS_ON_SHOW:
|
||||||
_glfw.hints.window.focusOnShow = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.focusOnShow = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_MOUSE_PASSTHROUGH:
|
case GLFW_MOUSE_PASSTHROUGH:
|
||||||
_glfw.hints.window.mousePassthrough = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.mousePassthrough = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_CLIENT_API:
|
case GLFW_CLIENT_API:
|
||||||
_glfw.hints.context.client = value;
|
_glfw.hints.context.client = value;
|
||||||
@@ -414,13 +413,13 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
_glfw.hints.context.robustness = value;
|
_glfw.hints.context.robustness = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_OPENGL_FORWARD_COMPAT:
|
case GLFW_OPENGL_FORWARD_COMPAT:
|
||||||
_glfw.hints.context.forward = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.forward = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_CONTEXT_DEBUG:
|
case GLFW_CONTEXT_DEBUG:
|
||||||
_glfw.hints.context.debug = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.debug = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_CONTEXT_NO_ERROR:
|
case GLFW_CONTEXT_NO_ERROR:
|
||||||
_glfw.hints.context.noerror = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.noerror = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_OPENGL_PROFILE:
|
case GLFW_OPENGL_PROFILE:
|
||||||
_glfw.hints.context.profile = value;
|
_glfw.hints.context.profile = value;
|
||||||
@@ -467,10 +466,10 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value)
|
|||||||
|
|
||||||
GLFWAPI void glfwDestroyWindow(GLFWwindow* handle)
|
GLFWAPI void glfwDestroyWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
// Allow closing of NULL (to match the behavior of free)
|
// Allow closing of NULL (to match the behavior of free)
|
||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -501,40 +500,43 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI int glfwWindowShouldClose(GLFWwindow* handle)
|
GLFWAPI int glfwWindowShouldClose(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
|
||||||
return window->shouldClose;
|
return window->shouldClose;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* handle, int value)
|
GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* handle, int value)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
window->shouldClose = value;
|
window->shouldClose = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* handle)
|
GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
|
|
||||||
return window->title;
|
return window->title;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowTitle(GLFWwindow* handle, const char* title)
|
GLFWAPI void glfwSetWindowTitle(GLFWwindow* handle, const char* title)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(title != NULL);
|
assert(title != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
char* prev = window->title;
|
char* prev = window->title;
|
||||||
window->title = _glfw_strdup(title);
|
window->title = _glfw_strdup(title);
|
||||||
|
|
||||||
@@ -546,14 +548,15 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* handle,
|
|||||||
int count, const GLFWimage* images)
|
int count, const GLFWimage* images)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(count >= 0);
|
assert(count >= 0);
|
||||||
assert(count == 0 || images != NULL);
|
assert(count == 0 || images != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid image count for window icon");
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid image count for window icon");
|
||||||
@@ -577,25 +580,26 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* handle,
|
|||||||
|
|
||||||
GLFWAPI void glfwGetWindowPos(GLFWwindow* handle, int* xpos, int* ypos)
|
GLFWAPI void glfwGetWindowPos(GLFWwindow* handle, int* xpos, int* ypos)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (xpos)
|
if (xpos)
|
||||||
*xpos = 0;
|
*xpos = 0;
|
||||||
if (ypos)
|
if (ypos)
|
||||||
*ypos = 0;
|
*ypos = 0;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
_glfw.platform.getWindowPos(window, xpos, ypos);
|
_glfw.platform.getWindowPos(window, xpos, ypos);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)
|
GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -604,27 +608,29 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)
|
|||||||
|
|
||||||
GLFWAPI void glfwGetWindowSize(GLFWwindow* handle, int* width, int* height)
|
GLFWAPI void glfwGetWindowSize(GLFWwindow* handle, int* width, int* height)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (width)
|
if (width)
|
||||||
*width = 0;
|
*width = 0;
|
||||||
if (height)
|
if (height)
|
||||||
*height = 0;
|
*height = 0;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
_glfw.platform.getWindowSize(window, width, height);
|
_glfw.platform.getWindowSize(window, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)
|
GLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(width >= 0);
|
assert(width >= 0);
|
||||||
assert(height >= 0);
|
assert(height >= 0);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
window->videoMode.width = width;
|
window->videoMode.width = width;
|
||||||
window->videoMode.height = height;
|
window->videoMode.height = height;
|
||||||
|
|
||||||
@@ -635,11 +641,11 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* handle,
|
|||||||
int minwidth, int minheight,
|
int minwidth, int minheight,
|
||||||
int maxwidth, int maxheight)
|
int maxwidth, int maxheight)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (minwidth != GLFW_DONT_CARE && minheight != GLFW_DONT_CARE)
|
if (minwidth != GLFW_DONT_CARE && minheight != GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
if (minwidth < 0 || minheight < 0)
|
if (minwidth < 0 || minheight < 0)
|
||||||
@@ -678,13 +684,14 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* handle,
|
|||||||
|
|
||||||
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)
|
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(numer != 0);
|
assert(numer != 0);
|
||||||
assert(denom != 0);
|
assert(denom != 0);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (numer != GLFW_DONT_CARE && denom != GLFW_DONT_CARE)
|
if (numer != GLFW_DONT_CARE && denom != GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
if (numer <= 0 || denom <= 0)
|
if (numer <= 0 || denom <= 0)
|
||||||
@@ -707,15 +714,16 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)
|
|||||||
|
|
||||||
GLFWAPI void glfwGetFramebufferSize(GLFWwindow* handle, int* width, int* height)
|
GLFWAPI void glfwGetFramebufferSize(GLFWwindow* handle, int* width, int* height)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (width)
|
if (width)
|
||||||
*width = 0;
|
*width = 0;
|
||||||
if (height)
|
if (height)
|
||||||
*height = 0;
|
*height = 0;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
_glfw.platform.getFramebufferSize(window, width, height);
|
_glfw.platform.getFramebufferSize(window, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,9 +731,6 @@ GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* handle,
|
|||||||
int* left, int* top,
|
int* left, int* top,
|
||||||
int* right, int* bottom)
|
int* right, int* bottom)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (left)
|
if (left)
|
||||||
*left = 0;
|
*left = 0;
|
||||||
if (top)
|
if (top)
|
||||||
@@ -736,44 +741,51 @@ GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* handle,
|
|||||||
*bottom = 0;
|
*bottom = 0;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
_glfw.platform.getWindowFrameSize(window, left, top, right, bottom);
|
_glfw.platform.getWindowFrameSize(window, left, top, right, bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwGetWindowContentScale(GLFWwindow* handle,
|
GLFWAPI void glfwGetWindowContentScale(GLFWwindow* handle,
|
||||||
float* xscale, float* yscale)
|
float* xscale, float* yscale)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
assert(window != NULL);
|
|
||||||
|
|
||||||
if (xscale)
|
if (xscale)
|
||||||
*xscale = 0.f;
|
*xscale = 0.f;
|
||||||
if (yscale)
|
if (yscale)
|
||||||
*yscale = 0.f;
|
*yscale = 0.f;
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
_glfw.platform.getWindowContentScale(window, xscale, yscale);
|
_glfw.platform.getWindowContentScale(window, xscale, yscale);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI float glfwGetWindowOpacity(GLFWwindow* handle)
|
GLFWAPI float glfwGetWindowOpacity(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(0.f);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(0.f);
|
|
||||||
return _glfw.platform.getWindowOpacity(window);
|
return _glfw.platform.getWindowOpacity(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowOpacity(GLFWwindow* handle, float opacity)
|
GLFWAPI void glfwSetWindowOpacity(GLFWwindow* handle, float opacity)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
assert(isfinite(opacity));
|
||||||
assert(window != NULL);
|
|
||||||
assert(opacity == opacity);
|
|
||||||
assert(opacity >= 0.f);
|
assert(opacity >= 0.f);
|
||||||
assert(opacity <= 1.f);
|
assert(opacity <= 1.f);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
if (opacity != opacity || opacity < 0.f || opacity > 1.f)
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
|
if (!isfinite(opacity) || opacity < 0.f || opacity > 1.f)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid window opacity %f", opacity);
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid window opacity %f", opacity);
|
||||||
return;
|
return;
|
||||||
@@ -784,29 +796,31 @@ GLFWAPI void glfwSetWindowOpacity(GLFWwindow* handle, float opacity)
|
|||||||
|
|
||||||
GLFWAPI void glfwIconifyWindow(GLFWwindow* handle)
|
GLFWAPI void glfwIconifyWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
_glfw.platform.iconifyWindow(window);
|
_glfw.platform.iconifyWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwRestoreWindow(GLFWwindow* handle)
|
GLFWAPI void glfwRestoreWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
_glfw.platform.restoreWindow(window);
|
_glfw.platform.restoreWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwMaximizeWindow(GLFWwindow* handle)
|
GLFWAPI void glfwMaximizeWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -815,11 +829,11 @@ GLFWAPI void glfwMaximizeWindow(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI void glfwShowWindow(GLFWwindow* handle)
|
GLFWAPI void glfwShowWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -831,21 +845,21 @@ GLFWAPI void glfwShowWindow(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI void glfwRequestWindowAttention(GLFWwindow* handle)
|
GLFWAPI void glfwRequestWindowAttention(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
_glfw.platform.requestWindowAttention(window);
|
_glfw.platform.requestWindowAttention(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwHideWindow(GLFWwindow* handle)
|
GLFWAPI void glfwHideWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -854,21 +868,21 @@ GLFWAPI void glfwHideWindow(GLFWwindow* handle)
|
|||||||
|
|
||||||
GLFWAPI void glfwFocusWindow(GLFWwindow* handle)
|
GLFWAPI void glfwFocusWindow(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
_glfw.platform.focusWindow(window);
|
_glfw.platform.focusWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
|
GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
|
||||||
|
|
||||||
switch (attrib)
|
switch (attrib)
|
||||||
{
|
{
|
||||||
case GLFW_FOCUSED:
|
case GLFW_FOCUSED:
|
||||||
@@ -927,11 +941,11 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
|
|||||||
|
|
||||||
GLFWAPI void glfwSetWindowAttrib(GLFWwindow* handle, int attrib, int value)
|
GLFWAPI void glfwSetWindowAttrib(GLFWwindow* handle, int attrib, int value)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
|
|
||||||
value = value ? GLFW_TRUE : GLFW_FALSE;
|
value = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
|
|
||||||
switch (attrib)
|
switch (attrib)
|
||||||
@@ -973,10 +987,11 @@ GLFWAPI void glfwSetWindowAttrib(GLFWwindow* handle, int attrib, int value)
|
|||||||
|
|
||||||
GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* handle)
|
GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
return (GLFWmonitor*) window->monitor;
|
return (GLFWmonitor*) window->monitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -986,14 +1001,15 @@ GLFWAPI void glfwSetWindowMonitor(GLFWwindow* wh,
|
|||||||
int width, int height,
|
int width, int height,
|
||||||
int refreshRate)
|
int refreshRate)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) wh;
|
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) mh;
|
|
||||||
assert(window != NULL);
|
|
||||||
assert(width >= 0);
|
assert(width >= 0);
|
||||||
assert(height >= 0);
|
assert(height >= 0);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) wh;
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) mh;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
if (width <= 0 || height <= 0)
|
if (width <= 0 || height <= 0)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE,
|
_glfwInputError(GLFW_INVALID_VALUE,
|
||||||
@@ -1021,29 +1037,32 @@ GLFWAPI void glfwSetWindowMonitor(GLFWwindow* wh,
|
|||||||
|
|
||||||
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* handle, void* pointer)
|
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* handle, void* pointer)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
|
||||||
window->userPointer = pointer;
|
window->userPointer = pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* handle)
|
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
return window->userPointer;
|
return window->userPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle,
|
||||||
GLFWwindowposfun cbfun)
|
GLFWwindowposfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowposfun, window->callbacks.pos, cbfun);
|
_GLFW_SWAP(GLFWwindowposfun, window->callbacks.pos, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1051,10 +1070,11 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle,
|
||||||
GLFWwindowsizefun cbfun)
|
GLFWwindowsizefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowsizefun, window->callbacks.size, cbfun);
|
_GLFW_SWAP(GLFWwindowsizefun, window->callbacks.size, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1062,10 +1082,11 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle,
|
||||||
GLFWwindowclosefun cbfun)
|
GLFWwindowclosefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowclosefun, window->callbacks.close, cbfun);
|
_GLFW_SWAP(GLFWwindowclosefun, window->callbacks.close, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1073,10 +1094,11 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle,
|
||||||
GLFWwindowrefreshfun cbfun)
|
GLFWwindowrefreshfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowrefreshfun, window->callbacks.refresh, cbfun);
|
_GLFW_SWAP(GLFWwindowrefreshfun, window->callbacks.refresh, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1084,10 +1106,11 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,
|
||||||
GLFWwindowfocusfun cbfun)
|
GLFWwindowfocusfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowfocusfun, window->callbacks.focus, cbfun);
|
_GLFW_SWAP(GLFWwindowfocusfun, window->callbacks.focus, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1095,10 +1118,11 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
|
||||||
GLFWwindowiconifyfun cbfun)
|
GLFWwindowiconifyfun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowiconifyfun, window->callbacks.iconify, cbfun);
|
_GLFW_SWAP(GLFWwindowiconifyfun, window->callbacks.iconify, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1106,10 +1130,11 @@ GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* handle,
|
||||||
GLFWwindowmaximizefun cbfun)
|
GLFWwindowmaximizefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowmaximizefun, window->callbacks.maximize, cbfun);
|
_GLFW_SWAP(GLFWwindowmaximizefun, window->callbacks.maximize, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1117,10 +1142,11 @@ GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* handle,
|
|||||||
GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle,
|
GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle,
|
||||||
GLFWframebuffersizefun cbfun)
|
GLFWframebuffersizefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWframebuffersizefun, window->callbacks.fbsize, cbfun);
|
_GLFW_SWAP(GLFWframebuffersizefun, window->callbacks.fbsize, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1128,10 +1154,11 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle
|
|||||||
GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* handle,
|
||||||
GLFWwindowcontentscalefun cbfun)
|
GLFWwindowcontentscalefun cbfun)
|
||||||
{
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
assert(window != NULL);
|
assert(window != NULL);
|
||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
_GLFW_SWAP(GLFWwindowcontentscalefun, window->callbacks.scale, cbfun);
|
_GLFW_SWAP(GLFWwindowcontentscalefun, window->callbacks.scale, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1151,11 +1178,10 @@ GLFWAPI void glfwWaitEvents(void)
|
|||||||
GLFWAPI void glfwWaitEventsTimeout(double timeout)
|
GLFWAPI void glfwWaitEventsTimeout(double timeout)
|
||||||
{
|
{
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
assert(timeout == timeout);
|
assert(isfinite(timeout));
|
||||||
assert(timeout >= 0.0);
|
assert(timeout >= 0.0);
|
||||||
assert(timeout <= DBL_MAX);
|
|
||||||
|
|
||||||
if (timeout != timeout || timeout < 0.0 || timeout > DBL_MAX)
|
if (!isfinite(timeout) || timeout < 0.0)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid time %f", timeout);
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid time %f", timeout);
|
||||||
return;
|
return;
|
||||||
|
|||||||
+56
-40
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.5 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -135,7 +135,7 @@ static void registryHandleGlobal(void* userData,
|
|||||||
{
|
{
|
||||||
_glfw.wl.seat =
|
_glfw.wl.seat =
|
||||||
wl_registry_bind(registry, name, &wl_seat_interface,
|
wl_registry_bind(registry, name, &wl_seat_interface,
|
||||||
_glfw_min(4, version));
|
_glfw_min(8, version));
|
||||||
_glfwAddSeatListenerWayland(_glfw.wl.seat);
|
_glfwAddSeatListenerWayland(_glfw.wl.seat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,10 +244,7 @@ static void libdecorReadyCallback(void* userData,
|
|||||||
uint32_t time)
|
uint32_t time)
|
||||||
{
|
{
|
||||||
_glfw.wl.libdecor.ready = GLFW_TRUE;
|
_glfw.wl.libdecor.ready = GLFW_TRUE;
|
||||||
|
wl_callback_destroy(callback);
|
||||||
assert(_glfw.wl.libdecor.callback == callback);
|
|
||||||
wl_callback_destroy(_glfw.wl.libdecor.callback);
|
|
||||||
_glfw.wl.libdecor.callback = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_callback_listener libdecorReadyListener =
|
static const struct wl_callback_listener libdecorReadyListener =
|
||||||
@@ -578,6 +575,14 @@ int _glfwInitWayland(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_get_fd");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_get_fd");
|
||||||
_glfw.wl.client.display_prepare_read = (PFN_wl_display_prepare_read)
|
_glfw.wl.client.display_prepare_read = (PFN_wl_display_prepare_read)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_prepare_read");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_prepare_read");
|
||||||
|
_glfw.wl.client.display_create_queue = (PFN_wl_display_create_queue)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_create_queue");
|
||||||
|
_glfw.wl.client.display_prepare_read_queue = (PFN_wl_display_prepare_read_queue)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_prepare_read_queue");
|
||||||
|
_glfw.wl.client.display_dispatch_queue_pending = (PFN_wl_display_dispatch_queue_pending)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_display_dispatch_queue_pending");
|
||||||
|
_glfw.wl.client.event_queue_destroy = (PFN_wl_event_queue_destroy)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_event_queue_destroy");
|
||||||
_glfw.wl.client.proxy_marshal = (PFN_wl_proxy_marshal)
|
_glfw.wl.client.proxy_marshal = (PFN_wl_proxy_marshal)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_marshal");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_marshal");
|
||||||
_glfw.wl.client.proxy_add_listener = (PFN_wl_proxy_add_listener)
|
_glfw.wl.client.proxy_add_listener = (PFN_wl_proxy_add_listener)
|
||||||
@@ -600,6 +605,12 @@ int _glfwInitWayland(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_get_version");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_get_version");
|
||||||
_glfw.wl.client.proxy_marshal_flags = (PFN_wl_proxy_marshal_flags)
|
_glfw.wl.client.proxy_marshal_flags = (PFN_wl_proxy_marshal_flags)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_marshal_flags");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_marshal_flags");
|
||||||
|
_glfw.wl.client.proxy_create_wrapper = (PFN_wl_proxy_create_wrapper)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_create_wrapper");
|
||||||
|
_glfw.wl.client.proxy_wrapper_destroy = (PFN_wl_proxy_wrapper_destroy)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_wrapper_destroy");
|
||||||
|
_glfw.wl.client.proxy_set_queue = (PFN_wl_proxy_set_queue)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.client.handle, "wl_proxy_set_queue");
|
||||||
|
|
||||||
if (!_glfw.wl.client.display_flush ||
|
if (!_glfw.wl.client.display_flush ||
|
||||||
!_glfw.wl.client.display_cancel_read ||
|
!_glfw.wl.client.display_cancel_read ||
|
||||||
@@ -609,6 +620,10 @@ int _glfwInitWayland(void)
|
|||||||
!_glfw.wl.client.display_roundtrip ||
|
!_glfw.wl.client.display_roundtrip ||
|
||||||
!_glfw.wl.client.display_get_fd ||
|
!_glfw.wl.client.display_get_fd ||
|
||||||
!_glfw.wl.client.display_prepare_read ||
|
!_glfw.wl.client.display_prepare_read ||
|
||||||
|
!_glfw.wl.client.display_create_queue ||
|
||||||
|
!_glfw.wl.client.display_prepare_read_queue ||
|
||||||
|
!_glfw.wl.client.display_dispatch_queue_pending ||
|
||||||
|
!_glfw.wl.client.event_queue_destroy ||
|
||||||
!_glfw.wl.client.proxy_marshal ||
|
!_glfw.wl.client.proxy_marshal ||
|
||||||
!_glfw.wl.client.proxy_add_listener ||
|
!_glfw.wl.client.proxy_add_listener ||
|
||||||
!_glfw.wl.client.proxy_destroy ||
|
!_glfw.wl.client.proxy_destroy ||
|
||||||
@@ -617,7 +632,10 @@ int _glfwInitWayland(void)
|
|||||||
!_glfw.wl.client.proxy_get_user_data ||
|
!_glfw.wl.client.proxy_get_user_data ||
|
||||||
!_glfw.wl.client.proxy_set_user_data ||
|
!_glfw.wl.client.proxy_set_user_data ||
|
||||||
!_glfw.wl.client.proxy_get_tag ||
|
!_glfw.wl.client.proxy_get_tag ||
|
||||||
!_glfw.wl.client.proxy_set_tag)
|
!_glfw.wl.client.proxy_set_tag ||
|
||||||
|
!_glfw.wl.client.proxy_create_wrapper ||
|
||||||
|
!_glfw.wl.client.proxy_wrapper_destroy ||
|
||||||
|
!_glfw.wl.client.proxy_set_queue)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Failed to load libwayland-client entry point");
|
"Wayland: Failed to load libwayland-client entry point");
|
||||||
@@ -704,6 +722,10 @@ int _glfwInitWayland(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_compose_state_get_status");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_compose_state_get_status");
|
||||||
_glfw.wl.xkb.compose_state_get_one_sym = (PFN_xkb_compose_state_get_one_sym)
|
_glfw.wl.xkb.compose_state_get_one_sym = (PFN_xkb_compose_state_get_one_sym)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_compose_state_get_one_sym");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_compose_state_get_one_sym");
|
||||||
|
_glfw.wl.xkb.keysym_to_utf32 = (PFN_xkb_keysym_to_utf32)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_keysym_to_utf32");
|
||||||
|
_glfw.wl.xkb.keysym_to_utf8 = (PFN_xkb_keysym_to_utf8)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.xkb.handle, "xkb_keysym_to_utf8");
|
||||||
|
|
||||||
if (!_glfw.wl.xkb.context_new ||
|
if (!_glfw.wl.xkb.context_new ||
|
||||||
!_glfw.wl.xkb.context_unref ||
|
!_glfw.wl.xkb.context_unref ||
|
||||||
@@ -776,6 +798,8 @@ int _glfwInitWayland(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_unset_capabilities");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_unset_capabilities");
|
||||||
_glfw.wl.libdecor.libdecor_frame_set_visibility_ = (PFN_libdecor_frame_set_visibility)
|
_glfw.wl.libdecor.libdecor_frame_set_visibility_ = (PFN_libdecor_frame_set_visibility)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_set_visibility");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_set_visibility");
|
||||||
|
_glfw.wl.libdecor.libdecor_frame_is_visible_ = (PFN_libdecor_frame_is_visible)
|
||||||
|
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_is_visible");
|
||||||
_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ = (PFN_libdecor_frame_get_xdg_toplevel)
|
_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ = (PFN_libdecor_frame_get_xdg_toplevel)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_get_xdg_toplevel");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_get_xdg_toplevel");
|
||||||
_glfw.wl.libdecor.libdecor_configuration_get_content_size_ = (PFN_libdecor_configuration_get_content_size)
|
_glfw.wl.libdecor.libdecor_configuration_get_content_size_ = (PFN_libdecor_configuration_get_content_size)
|
||||||
@@ -807,6 +831,7 @@ int _glfwInitWayland(void)
|
|||||||
!_glfw.wl.libdecor.libdecor_frame_set_capabilities_ ||
|
!_glfw.wl.libdecor.libdecor_frame_set_capabilities_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_frame_unset_capabilities_ ||
|
!_glfw.wl.libdecor.libdecor_frame_unset_capabilities_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_frame_set_visibility_ ||
|
!_glfw.wl.libdecor.libdecor_frame_set_visibility_ ||
|
||||||
|
!_glfw.wl.libdecor.libdecor_frame_is_visible_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ ||
|
!_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_configuration_get_content_size_ ||
|
!_glfw.wl.libdecor.libdecor_configuration_get_content_size_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_configuration_get_window_state_ ||
|
!_glfw.wl.libdecor.libdecor_configuration_get_window_state_ ||
|
||||||
@@ -823,7 +848,17 @@ int _glfwInitWayland(void)
|
|||||||
|
|
||||||
createKeyTables();
|
createKeyTables();
|
||||||
|
|
||||||
_glfw.wl.xkb.context = xkb_context_new(0);
|
_glfw.wl.keyRepeatTimerfd =
|
||||||
|
timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
|
||||||
|
if (_glfw.wl.keyRepeatTimerfd == -1)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Wayland: Failed to create timerfd: %s",
|
||||||
|
strerror(errno));
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfw.wl.xkb.context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
if (!_glfw.wl.xkb.context)
|
if (!_glfw.wl.xkb.context)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
@@ -846,19 +881,11 @@ int _glfwInitWayland(void)
|
|||||||
libdecor_dispatch(_glfw.wl.libdecor.context, 0);
|
libdecor_dispatch(_glfw.wl.libdecor.context, 0);
|
||||||
|
|
||||||
// Create sync point to "know" when libdecor is ready for use
|
// Create sync point to "know" when libdecor is ready for use
|
||||||
_glfw.wl.libdecor.callback = wl_display_sync(_glfw.wl.display);
|
struct wl_callback* callback = wl_display_sync(_glfw.wl.display);
|
||||||
wl_callback_add_listener(_glfw.wl.libdecor.callback,
|
wl_callback_add_listener(callback, &libdecorReadyListener, NULL);
|
||||||
&libdecorReadyListener,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wl_seat_get_version(_glfw.wl.seat) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
|
|
||||||
{
|
|
||||||
_glfw.wl.keyRepeatTimerfd =
|
|
||||||
timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_glfw.wl.wmBase)
|
if (!_glfw.wl.wmBase)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
@@ -902,18 +929,6 @@ void _glfwTerminateWayland(void)
|
|||||||
libdecor_unref(_glfw.wl.libdecor.context);
|
libdecor_unref(_glfw.wl.libdecor.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.wl.libdecor.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.libdecor.handle);
|
|
||||||
_glfw.wl.libdecor.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.egl.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.egl.handle);
|
|
||||||
_glfw.wl.egl.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.xkb.composeState)
|
if (_glfw.wl.xkb.composeState)
|
||||||
xkb_compose_state_unref(_glfw.wl.xkb.composeState);
|
xkb_compose_state_unref(_glfw.wl.xkb.composeState);
|
||||||
if (_glfw.wl.xkb.keymap)
|
if (_glfw.wl.xkb.keymap)
|
||||||
@@ -922,21 +937,11 @@ void _glfwTerminateWayland(void)
|
|||||||
xkb_state_unref(_glfw.wl.xkb.state);
|
xkb_state_unref(_glfw.wl.xkb.state);
|
||||||
if (_glfw.wl.xkb.context)
|
if (_glfw.wl.xkb.context)
|
||||||
xkb_context_unref(_glfw.wl.xkb.context);
|
xkb_context_unref(_glfw.wl.xkb.context);
|
||||||
if (_glfw.wl.xkb.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.xkb.handle);
|
|
||||||
_glfw.wl.xkb.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.cursorTheme)
|
if (_glfw.wl.cursorTheme)
|
||||||
wl_cursor_theme_destroy(_glfw.wl.cursorTheme);
|
wl_cursor_theme_destroy(_glfw.wl.cursorTheme);
|
||||||
if (_glfw.wl.cursorThemeHiDPI)
|
if (_glfw.wl.cursorThemeHiDPI)
|
||||||
wl_cursor_theme_destroy(_glfw.wl.cursorThemeHiDPI);
|
wl_cursor_theme_destroy(_glfw.wl.cursorThemeHiDPI);
|
||||||
if (_glfw.wl.cursor.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.cursor.handle);
|
|
||||||
_glfw.wl.cursor.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
||||||
wl_data_offer_destroy(_glfw.wl.offers[i].offer);
|
wl_data_offer_destroy(_glfw.wl.offers[i].offer);
|
||||||
@@ -996,7 +1001,18 @@ void _glfwTerminateWayland(void)
|
|||||||
if (_glfw.wl.cursorTimerfd >= 0)
|
if (_glfw.wl.cursorTimerfd >= 0)
|
||||||
close(_glfw.wl.cursorTimerfd);
|
close(_glfw.wl.cursorTimerfd);
|
||||||
|
|
||||||
|
// Free modules only after all Wayland termination functions are called
|
||||||
|
|
||||||
|
_glfwPlatformFreeModule(_glfw.egl.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.libdecor.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.egl.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.xkb.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.cursor.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.client.handle);
|
||||||
|
|
||||||
_glfw_free(_glfw.wl.clipboardString);
|
_glfw_free(_glfw.wl.clipboardString);
|
||||||
|
|
||||||
|
memset(&_glfw.wl, 0, sizeof(_glfw.wl));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_WAYLAND
|
#endif // _GLFW_WAYLAND
|
||||||
|
|||||||
+5
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.5 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "wayland-client-protocol.h"
|
#include "wayland-client-protocol.h"
|
||||||
|
|
||||||
@@ -258,7 +259,6 @@ void _glfwSetGammaRampWayland(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
|||||||
|
|
||||||
GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* handle)
|
GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND)
|
||||||
@@ -267,6 +267,9 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->wl.output;
|
return monitor->wl.output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+100
-55
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.5 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
#include <xkbcommon/xkbcommon.h>
|
#include <xkbcommon/xkbcommon.h>
|
||||||
#include <xkbcommon/xkbcommon-compose.h>
|
#include <xkbcommon/xkbcommon-compose.h>
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
|
typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
typedef struct VkWaylandSurfaceCreateInfoKHR
|
typedef struct VkWaylandSurfaceCreateInfoKHR
|
||||||
@@ -44,9 +42,6 @@ typedef struct VkWaylandSurfaceCreateInfoKHR
|
|||||||
typedef VkResult (APIENTRY *PFN_vkCreateWaylandSurfaceKHR)(VkInstance,const VkWaylandSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
typedef VkResult (APIENTRY *PFN_vkCreateWaylandSurfaceKHR)(VkInstance,const VkWaylandSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
||||||
typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice,uint32_t,struct wl_display*);
|
typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice,uint32_t,struct wl_display*);
|
||||||
|
|
||||||
#include "xkb_unicode.h"
|
|
||||||
#include "posix_poll.h"
|
|
||||||
|
|
||||||
typedef int (* PFN_wl_display_flush)(struct wl_display* display);
|
typedef int (* PFN_wl_display_flush)(struct wl_display* display);
|
||||||
typedef void (* PFN_wl_display_cancel_read)(struct wl_display* display);
|
typedef void (* PFN_wl_display_cancel_read)(struct wl_display* display);
|
||||||
typedef int (* PFN_wl_display_dispatch_pending)(struct wl_display* display);
|
typedef int (* PFN_wl_display_dispatch_pending)(struct wl_display* display);
|
||||||
@@ -56,6 +51,10 @@ typedef void (* PFN_wl_display_disconnect)(struct wl_display*);
|
|||||||
typedef int (* PFN_wl_display_roundtrip)(struct wl_display*);
|
typedef int (* PFN_wl_display_roundtrip)(struct wl_display*);
|
||||||
typedef int (* PFN_wl_display_get_fd)(struct wl_display*);
|
typedef int (* PFN_wl_display_get_fd)(struct wl_display*);
|
||||||
typedef int (* PFN_wl_display_prepare_read)(struct wl_display*);
|
typedef int (* PFN_wl_display_prepare_read)(struct wl_display*);
|
||||||
|
typedef struct wl_event_queue* (* PFN_wl_display_create_queue)(struct wl_display*);
|
||||||
|
typedef void (* PFN_wl_event_queue_destroy)(struct wl_event_queue*);
|
||||||
|
typedef int (* PFN_wl_display_prepare_read_queue)(struct wl_display*,struct wl_event_queue*);
|
||||||
|
typedef int (* PFN_wl_display_dispatch_queue_pending)(struct wl_display*,struct wl_event_queue*);
|
||||||
typedef void (* PFN_wl_proxy_marshal)(struct wl_proxy*,uint32_t,...);
|
typedef void (* PFN_wl_proxy_marshal)(struct wl_proxy*,uint32_t,...);
|
||||||
typedef int (* PFN_wl_proxy_add_listener)(struct wl_proxy*,void(**)(void),void*);
|
typedef int (* PFN_wl_proxy_add_listener)(struct wl_proxy*,void(**)(void),void*);
|
||||||
typedef void (* PFN_wl_proxy_destroy)(struct wl_proxy*);
|
typedef void (* PFN_wl_proxy_destroy)(struct wl_proxy*);
|
||||||
@@ -67,6 +66,9 @@ typedef void (* PFN_wl_proxy_set_tag)(struct wl_proxy*,const char*const*);
|
|||||||
typedef const char* const* (* PFN_wl_proxy_get_tag)(struct wl_proxy*);
|
typedef const char* const* (* PFN_wl_proxy_get_tag)(struct wl_proxy*);
|
||||||
typedef uint32_t (* PFN_wl_proxy_get_version)(struct wl_proxy*);
|
typedef uint32_t (* PFN_wl_proxy_get_version)(struct wl_proxy*);
|
||||||
typedef struct wl_proxy* (* PFN_wl_proxy_marshal_flags)(struct wl_proxy*,uint32_t,const struct wl_interface*,uint32_t,uint32_t,...);
|
typedef struct wl_proxy* (* PFN_wl_proxy_marshal_flags)(struct wl_proxy*,uint32_t,const struct wl_interface*,uint32_t,uint32_t,...);
|
||||||
|
typedef void* (* PFN_wl_proxy_create_wrapper)(void*);
|
||||||
|
typedef void (* PFN_wl_proxy_wrapper_destroy)(void*);
|
||||||
|
typedef void (* PFN_wl_proxy_set_queue)(struct wl_proxy*,struct wl_event_queue*);
|
||||||
#define wl_display_flush _glfw.wl.client.display_flush
|
#define wl_display_flush _glfw.wl.client.display_flush
|
||||||
#define wl_display_cancel_read _glfw.wl.client.display_cancel_read
|
#define wl_display_cancel_read _glfw.wl.client.display_cancel_read
|
||||||
#define wl_display_dispatch_pending _glfw.wl.client.display_dispatch_pending
|
#define wl_display_dispatch_pending _glfw.wl.client.display_dispatch_pending
|
||||||
@@ -75,6 +77,10 @@ typedef struct wl_proxy* (* PFN_wl_proxy_marshal_flags)(struct wl_proxy*,uint32_
|
|||||||
#define wl_display_roundtrip _glfw.wl.client.display_roundtrip
|
#define wl_display_roundtrip _glfw.wl.client.display_roundtrip
|
||||||
#define wl_display_get_fd _glfw.wl.client.display_get_fd
|
#define wl_display_get_fd _glfw.wl.client.display_get_fd
|
||||||
#define wl_display_prepare_read _glfw.wl.client.display_prepare_read
|
#define wl_display_prepare_read _glfw.wl.client.display_prepare_read
|
||||||
|
#define wl_display_create_queue _glfw.wl.client.display_create_queue
|
||||||
|
#define wl_display_prepare_read_queue _glfw.wl.client.display_prepare_read_queue
|
||||||
|
#define wl_display_dispatch_queue_pending _glfw.wl.client.display_dispatch_queue_pending
|
||||||
|
#define wl_event_queue_destroy _glfw.wl.client.event_queue_destroy
|
||||||
#define wl_proxy_marshal _glfw.wl.client.proxy_marshal
|
#define wl_proxy_marshal _glfw.wl.client.proxy_marshal
|
||||||
#define wl_proxy_add_listener _glfw.wl.client.proxy_add_listener
|
#define wl_proxy_add_listener _glfw.wl.client.proxy_add_listener
|
||||||
#define wl_proxy_destroy _glfw.wl.client.proxy_destroy
|
#define wl_proxy_destroy _glfw.wl.client.proxy_destroy
|
||||||
@@ -86,6 +92,9 @@ typedef struct wl_proxy* (* PFN_wl_proxy_marshal_flags)(struct wl_proxy*,uint32_
|
|||||||
#define wl_proxy_set_tag _glfw.wl.client.proxy_set_tag
|
#define wl_proxy_set_tag _glfw.wl.client.proxy_set_tag
|
||||||
#define wl_proxy_get_version _glfw.wl.client.proxy_get_version
|
#define wl_proxy_get_version _glfw.wl.client.proxy_get_version
|
||||||
#define wl_proxy_marshal_flags _glfw.wl.client.proxy_marshal_flags
|
#define wl_proxy_marshal_flags _glfw.wl.client.proxy_marshal_flags
|
||||||
|
#define wl_proxy_create_wrapper _glfw.wl.client.proxy_create_wrapper
|
||||||
|
#define wl_proxy_wrapper_destroy _glfw.wl.client.proxy_wrapper_destroy
|
||||||
|
#define wl_proxy_set_queue _glfw.wl.client.proxy_set_queue
|
||||||
|
|
||||||
struct wl_shm;
|
struct wl_shm;
|
||||||
struct wl_output;
|
struct wl_output;
|
||||||
@@ -139,18 +148,22 @@ struct wl_output;
|
|||||||
#define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl;
|
#define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl;
|
||||||
#define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl;
|
#define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl;
|
||||||
|
|
||||||
struct wl_cursor_image {
|
struct wl_cursor_image
|
||||||
|
{
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
uint32_t hotspot_x;
|
uint32_t hotspot_x;
|
||||||
uint32_t hotspot_y;
|
uint32_t hotspot_y;
|
||||||
uint32_t delay;
|
uint32_t delay;
|
||||||
};
|
};
|
||||||
struct wl_cursor {
|
|
||||||
|
struct wl_cursor
|
||||||
|
{
|
||||||
unsigned int image_count;
|
unsigned int image_count;
|
||||||
struct wl_cursor_image** images;
|
struct wl_cursor_image** images;
|
||||||
char* name;
|
char* name;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*);
|
typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*);
|
||||||
typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*);
|
typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*);
|
||||||
typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*);
|
typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*);
|
||||||
@@ -180,6 +193,8 @@ typedef int (* PFN_xkb_state_key_get_syms)(struct xkb_state*, xkb_keycode_t, con
|
|||||||
typedef enum xkb_state_component (* PFN_xkb_state_update_mask)(struct xkb_state*, xkb_mod_mask_t, xkb_mod_mask_t, xkb_mod_mask_t, xkb_layout_index_t, xkb_layout_index_t, xkb_layout_index_t);
|
typedef enum xkb_state_component (* PFN_xkb_state_update_mask)(struct xkb_state*, xkb_mod_mask_t, xkb_mod_mask_t, xkb_mod_mask_t, xkb_layout_index_t, xkb_layout_index_t, xkb_layout_index_t);
|
||||||
typedef xkb_layout_index_t (* PFN_xkb_state_key_get_layout)(struct xkb_state*,xkb_keycode_t);
|
typedef xkb_layout_index_t (* PFN_xkb_state_key_get_layout)(struct xkb_state*,xkb_keycode_t);
|
||||||
typedef int (* PFN_xkb_state_mod_index_is_active)(struct xkb_state*,xkb_mod_index_t,enum xkb_state_component);
|
typedef int (* PFN_xkb_state_mod_index_is_active)(struct xkb_state*,xkb_mod_index_t,enum xkb_state_component);
|
||||||
|
typedef uint32_t (* PFN_xkb_keysym_to_utf32)(xkb_keysym_t);
|
||||||
|
typedef int (* PFN_xkb_keysym_to_utf8)(xkb_keysym_t, char*, size_t);
|
||||||
#define xkb_context_new _glfw.wl.xkb.context_new
|
#define xkb_context_new _glfw.wl.xkb.context_new
|
||||||
#define xkb_context_unref _glfw.wl.xkb.context_unref
|
#define xkb_context_unref _glfw.wl.xkb.context_unref
|
||||||
#define xkb_keymap_new_from_string _glfw.wl.xkb.keymap_new_from_string
|
#define xkb_keymap_new_from_string _glfw.wl.xkb.keymap_new_from_string
|
||||||
@@ -193,6 +208,8 @@ typedef int (* PFN_xkb_state_mod_index_is_active)(struct xkb_state*,xkb_mod_inde
|
|||||||
#define xkb_state_update_mask _glfw.wl.xkb.state_update_mask
|
#define xkb_state_update_mask _glfw.wl.xkb.state_update_mask
|
||||||
#define xkb_state_key_get_layout _glfw.wl.xkb.state_key_get_layout
|
#define xkb_state_key_get_layout _glfw.wl.xkb.state_key_get_layout
|
||||||
#define xkb_state_mod_index_is_active _glfw.wl.xkb.state_mod_index_is_active
|
#define xkb_state_mod_index_is_active _glfw.wl.xkb.state_mod_index_is_active
|
||||||
|
#define xkb_keysym_to_utf32 _glfw.wl.xkb.keysym_to_utf32
|
||||||
|
#define xkb_keysym_to_utf8 _glfw.wl.xkb.keysym_to_utf8
|
||||||
|
|
||||||
typedef struct xkb_compose_table* (* PFN_xkb_compose_table_new_from_locale)(struct xkb_context*, const char*, enum xkb_compose_compile_flags);
|
typedef struct xkb_compose_table* (* PFN_xkb_compose_table_new_from_locale)(struct xkb_context*, const char*, enum xkb_compose_compile_flags);
|
||||||
typedef void (* PFN_xkb_compose_table_unref)(struct xkb_compose_table*);
|
typedef void (* PFN_xkb_compose_table_unref)(struct xkb_compose_table*);
|
||||||
@@ -216,62 +233,62 @@ struct libdecor_configuration;
|
|||||||
|
|
||||||
enum libdecor_error
|
enum libdecor_error
|
||||||
{
|
{
|
||||||
LIBDECOR_ERROR_COMPOSITOR_INCOMPATIBLE,
|
LIBDECOR_ERROR_COMPOSITOR_INCOMPATIBLE,
|
||||||
LIBDECOR_ERROR_INVALID_FRAME_CONFIGURATION,
|
LIBDECOR_ERROR_INVALID_FRAME_CONFIGURATION,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum libdecor_window_state
|
enum libdecor_window_state
|
||||||
{
|
{
|
||||||
LIBDECOR_WINDOW_STATE_NONE = 0,
|
LIBDECOR_WINDOW_STATE_NONE = 0,
|
||||||
LIBDECOR_WINDOW_STATE_ACTIVE = 1,
|
LIBDECOR_WINDOW_STATE_ACTIVE = 1,
|
||||||
LIBDECOR_WINDOW_STATE_MAXIMIZED = 2,
|
LIBDECOR_WINDOW_STATE_MAXIMIZED = 2,
|
||||||
LIBDECOR_WINDOW_STATE_FULLSCREEN = 4,
|
LIBDECOR_WINDOW_STATE_FULLSCREEN = 4,
|
||||||
LIBDECOR_WINDOW_STATE_TILED_LEFT = 8,
|
LIBDECOR_WINDOW_STATE_TILED_LEFT = 8,
|
||||||
LIBDECOR_WINDOW_STATE_TILED_RIGHT = 16,
|
LIBDECOR_WINDOW_STATE_TILED_RIGHT = 16,
|
||||||
LIBDECOR_WINDOW_STATE_TILED_TOP = 32,
|
LIBDECOR_WINDOW_STATE_TILED_TOP = 32,
|
||||||
LIBDECOR_WINDOW_STATE_TILED_BOTTOM = 64
|
LIBDECOR_WINDOW_STATE_TILED_BOTTOM = 64
|
||||||
};
|
};
|
||||||
|
|
||||||
enum libdecor_capabilities
|
enum libdecor_capabilities
|
||||||
{
|
{
|
||||||
LIBDECOR_ACTION_MOVE = 1,
|
LIBDECOR_ACTION_MOVE = 1,
|
||||||
LIBDECOR_ACTION_RESIZE = 2,
|
LIBDECOR_ACTION_RESIZE = 2,
|
||||||
LIBDECOR_ACTION_MINIMIZE = 4,
|
LIBDECOR_ACTION_MINIMIZE = 4,
|
||||||
LIBDECOR_ACTION_FULLSCREEN = 8,
|
LIBDECOR_ACTION_FULLSCREEN = 8,
|
||||||
LIBDECOR_ACTION_CLOSE = 16
|
LIBDECOR_ACTION_CLOSE = 16
|
||||||
};
|
};
|
||||||
|
|
||||||
struct libdecor_interface
|
struct libdecor_interface
|
||||||
{
|
{
|
||||||
void (* error)(struct libdecor*,enum libdecor_error,const char*);
|
void (* error)(struct libdecor*,enum libdecor_error,const char*);
|
||||||
void (* reserved0)(void);
|
void (* reserved0)(void);
|
||||||
void (* reserved1)(void);
|
void (* reserved1)(void);
|
||||||
void (* reserved2)(void);
|
void (* reserved2)(void);
|
||||||
void (* reserved3)(void);
|
void (* reserved3)(void);
|
||||||
void (* reserved4)(void);
|
void (* reserved4)(void);
|
||||||
void (* reserved5)(void);
|
void (* reserved5)(void);
|
||||||
void (* reserved6)(void);
|
void (* reserved6)(void);
|
||||||
void (* reserved7)(void);
|
void (* reserved7)(void);
|
||||||
void (* reserved8)(void);
|
void (* reserved8)(void);
|
||||||
void (* reserved9)(void);
|
void (* reserved9)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct libdecor_frame_interface
|
struct libdecor_frame_interface
|
||||||
{
|
{
|
||||||
void (* configure)(struct libdecor_frame*,struct libdecor_configuration*,void*);
|
void (* configure)(struct libdecor_frame*,struct libdecor_configuration*,void*);
|
||||||
void (* close)(struct libdecor_frame*,void*);
|
void (* close)(struct libdecor_frame*,void*);
|
||||||
void (* commit)(struct libdecor_frame*,void*);
|
void (* commit)(struct libdecor_frame*,void*);
|
||||||
void (* dismiss_popup)(struct libdecor_frame*,const char*,void*);
|
void (* dismiss_popup)(struct libdecor_frame*,const char*,void*);
|
||||||
void (* reserved0)(void);
|
void (* reserved0)(void);
|
||||||
void (* reserved1)(void);
|
void (* reserved1)(void);
|
||||||
void (* reserved2)(void);
|
void (* reserved2)(void);
|
||||||
void (* reserved3)(void);
|
void (* reserved3)(void);
|
||||||
void (* reserved4)(void);
|
void (* reserved4)(void);
|
||||||
void (* reserved5)(void);
|
void (* reserved5)(void);
|
||||||
void (* reserved6)(void);
|
void (* reserved6)(void);
|
||||||
void (* reserved7)(void);
|
void (* reserved7)(void);
|
||||||
void (* reserved8)(void);
|
void (* reserved8)(void);
|
||||||
void (* reserved9)(void);
|
void (* reserved9)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct libdecor* (* PFN_libdecor_new)(struct wl_display*,const struct libdecor_interface*);
|
typedef struct libdecor* (* PFN_libdecor_new)(struct wl_display*,const struct libdecor_interface*);
|
||||||
@@ -294,6 +311,7 @@ typedef void (* PFN_libdecor_frame_unset_maximized)(struct libdecor_frame*);
|
|||||||
typedef void (* PFN_libdecor_frame_set_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);
|
typedef void (* PFN_libdecor_frame_set_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||||
typedef void (* PFN_libdecor_frame_unset_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);
|
typedef void (* PFN_libdecor_frame_unset_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||||
typedef void (* PFN_libdecor_frame_set_visibility)(struct libdecor_frame*,bool visible);
|
typedef void (* PFN_libdecor_frame_set_visibility)(struct libdecor_frame*,bool visible);
|
||||||
|
typedef bool (* PFN_libdecor_frame_is_visible)(struct libdecor_frame*);
|
||||||
typedef struct xdg_toplevel* (* PFN_libdecor_frame_get_xdg_toplevel)(struct libdecor_frame*);
|
typedef struct xdg_toplevel* (* PFN_libdecor_frame_get_xdg_toplevel)(struct libdecor_frame*);
|
||||||
typedef bool (* PFN_libdecor_configuration_get_content_size)(struct libdecor_configuration*,struct libdecor_frame*,int*,int*);
|
typedef bool (* PFN_libdecor_configuration_get_content_size)(struct libdecor_configuration*,struct libdecor_frame*,int*,int*);
|
||||||
typedef bool (* PFN_libdecor_configuration_get_window_state)(struct libdecor_configuration*,enum libdecor_window_state*);
|
typedef bool (* PFN_libdecor_configuration_get_window_state)(struct libdecor_configuration*,enum libdecor_window_state*);
|
||||||
@@ -319,6 +337,7 @@ typedef void (* PFN_libdecor_state_free)(struct libdecor_state*);
|
|||||||
#define libdecor_frame_set_capabilities _glfw.wl.libdecor.libdecor_frame_set_capabilities_
|
#define libdecor_frame_set_capabilities _glfw.wl.libdecor.libdecor_frame_set_capabilities_
|
||||||
#define libdecor_frame_unset_capabilities _glfw.wl.libdecor.libdecor_frame_unset_capabilities_
|
#define libdecor_frame_unset_capabilities _glfw.wl.libdecor.libdecor_frame_unset_capabilities_
|
||||||
#define libdecor_frame_set_visibility _glfw.wl.libdecor.libdecor_frame_set_visibility_
|
#define libdecor_frame_set_visibility _glfw.wl.libdecor.libdecor_frame_set_visibility_
|
||||||
|
#define libdecor_frame_is_visible _glfw.wl.libdecor.libdecor_frame_is_visible_
|
||||||
#define libdecor_frame_get_xdg_toplevel _glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_
|
#define libdecor_frame_get_xdg_toplevel _glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_
|
||||||
#define libdecor_configuration_get_content_size _glfw.wl.libdecor.libdecor_configuration_get_content_size_
|
#define libdecor_configuration_get_content_size _glfw.wl.libdecor.libdecor_configuration_get_content_size_
|
||||||
#define libdecor_configuration_get_window_state _glfw.wl.libdecor.libdecor_configuration_get_window_state_
|
#define libdecor_configuration_get_window_state _glfw.wl.libdecor.libdecor_configuration_get_window_state_
|
||||||
@@ -355,14 +374,16 @@ typedef struct _GLFWwindowWayland
|
|||||||
GLFWbool maximized;
|
GLFWbool maximized;
|
||||||
GLFWbool activated;
|
GLFWbool activated;
|
||||||
GLFWbool fullscreen;
|
GLFWbool fullscreen;
|
||||||
GLFWbool hovered;
|
|
||||||
GLFWbool transparent;
|
GLFWbool transparent;
|
||||||
GLFWbool scaleFramebuffer;
|
GLFWbool scaleFramebuffer;
|
||||||
struct wl_surface* surface;
|
struct wl_surface* surface;
|
||||||
struct wl_callback* callback;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
struct wl_event_queue* queue;
|
||||||
struct wl_egl_window* window;
|
struct wl_egl_window* window;
|
||||||
|
struct wl_callback* callback;
|
||||||
|
struct wl_surface* wrapper;
|
||||||
|
int interval;
|
||||||
} egl;
|
} egl;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -384,7 +405,6 @@ typedef struct _GLFWwindowWayland
|
|||||||
struct libdecor_frame* frame;
|
struct libdecor_frame* frame;
|
||||||
} libdecor;
|
} libdecor;
|
||||||
|
|
||||||
_GLFWcursor* currentCursor;
|
|
||||||
double cursorPosX, cursorPosY;
|
double cursorPosX, cursorPosY;
|
||||||
|
|
||||||
char* appId;
|
char* appId;
|
||||||
@@ -411,7 +431,9 @@ typedef struct _GLFWwindowWayland
|
|||||||
GLFWbool decorations;
|
GLFWbool decorations;
|
||||||
struct wl_buffer* buffer;
|
struct wl_buffer* buffer;
|
||||||
_GLFWfallbackEdgeWayland top, left, right, bottom;
|
_GLFWfallbackEdgeWayland top, left, right, bottom;
|
||||||
struct wl_surface* focus;
|
double pointerX, pointerY;
|
||||||
|
uint32_t buttonPressSerial;
|
||||||
|
const char* cursorName;
|
||||||
} fallback;
|
} fallback;
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
@@ -450,10 +472,10 @@ typedef struct _GLFWlibraryWayland
|
|||||||
|
|
||||||
const char* tag;
|
const char* tag;
|
||||||
|
|
||||||
|
struct wl_surface* pointerSurface;
|
||||||
struct wl_cursor_theme* cursorTheme;
|
struct wl_cursor_theme* cursorTheme;
|
||||||
struct wl_cursor_theme* cursorThemeHiDPI;
|
struct wl_cursor_theme* cursorThemeHiDPI;
|
||||||
struct wl_surface* cursorSurface;
|
struct wl_surface* cursorSurface;
|
||||||
const char* cursorPreviousName;
|
|
||||||
int cursorTimerfd;
|
int cursorTimerfd;
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
uint32_t pointerEnterSerial;
|
uint32_t pointerEnterSerial;
|
||||||
@@ -468,6 +490,19 @@ typedef struct _GLFWlibraryWayland
|
|||||||
short int scancodes[GLFW_KEY_LAST + 1];
|
short int scancodes[GLFW_KEY_LAST + 1];
|
||||||
char keynames[GLFW_KEY_LAST + 1][5];
|
char keynames[GLFW_KEY_LAST + 1][5];
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct wl_surface* pointerSurface;
|
||||||
|
unsigned int events;
|
||||||
|
double pointerX;
|
||||||
|
double pointerY;
|
||||||
|
double scrollX;
|
||||||
|
double scrollY;
|
||||||
|
double discreteX;
|
||||||
|
double discreteY;
|
||||||
|
int button;
|
||||||
|
int action;
|
||||||
|
} pending;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
void* handle;
|
void* handle;
|
||||||
struct xkb_context* context;
|
struct xkb_context* context;
|
||||||
@@ -497,6 +532,8 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_xkb_state_update_mask state_update_mask;
|
PFN_xkb_state_update_mask state_update_mask;
|
||||||
PFN_xkb_state_key_get_layout state_key_get_layout;
|
PFN_xkb_state_key_get_layout state_key_get_layout;
|
||||||
PFN_xkb_state_mod_index_is_active state_mod_index_is_active;
|
PFN_xkb_state_mod_index_is_active state_mod_index_is_active;
|
||||||
|
PFN_xkb_keysym_to_utf32 keysym_to_utf32;
|
||||||
|
PFN_xkb_keysym_to_utf8 keysym_to_utf8;
|
||||||
|
|
||||||
PFN_xkb_compose_table_new_from_locale compose_table_new_from_locale;
|
PFN_xkb_compose_table_new_from_locale compose_table_new_from_locale;
|
||||||
PFN_xkb_compose_table_unref compose_table_unref;
|
PFN_xkb_compose_table_unref compose_table_unref;
|
||||||
@@ -507,7 +544,6 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_xkb_compose_state_get_one_sym compose_state_get_one_sym;
|
PFN_xkb_compose_state_get_one_sym compose_state_get_one_sym;
|
||||||
} xkb;
|
} xkb;
|
||||||
|
|
||||||
_GLFWwindow* pointerFocus;
|
|
||||||
_GLFWwindow* keyboardFocus;
|
_GLFWwindow* keyboardFocus;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -520,6 +556,10 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_wl_display_roundtrip display_roundtrip;
|
PFN_wl_display_roundtrip display_roundtrip;
|
||||||
PFN_wl_display_get_fd display_get_fd;
|
PFN_wl_display_get_fd display_get_fd;
|
||||||
PFN_wl_display_prepare_read display_prepare_read;
|
PFN_wl_display_prepare_read display_prepare_read;
|
||||||
|
PFN_wl_display_create_queue display_create_queue;
|
||||||
|
PFN_wl_display_prepare_read_queue display_prepare_read_queue;
|
||||||
|
PFN_wl_display_dispatch_queue_pending display_dispatch_queue_pending;
|
||||||
|
PFN_wl_event_queue_destroy event_queue_destroy;
|
||||||
PFN_wl_proxy_marshal proxy_marshal;
|
PFN_wl_proxy_marshal proxy_marshal;
|
||||||
PFN_wl_proxy_add_listener proxy_add_listener;
|
PFN_wl_proxy_add_listener proxy_add_listener;
|
||||||
PFN_wl_proxy_destroy proxy_destroy;
|
PFN_wl_proxy_destroy proxy_destroy;
|
||||||
@@ -531,6 +571,9 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_wl_proxy_set_tag proxy_set_tag;
|
PFN_wl_proxy_set_tag proxy_set_tag;
|
||||||
PFN_wl_proxy_get_version proxy_get_version;
|
PFN_wl_proxy_get_version proxy_get_version;
|
||||||
PFN_wl_proxy_marshal_flags proxy_marshal_flags;
|
PFN_wl_proxy_marshal_flags proxy_marshal_flags;
|
||||||
|
PFN_wl_proxy_create_wrapper proxy_create_wrapper;
|
||||||
|
PFN_wl_proxy_wrapper_destroy proxy_wrapper_destroy;
|
||||||
|
PFN_wl_proxy_set_queue proxy_set_queue;
|
||||||
} client;
|
} client;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -553,7 +596,6 @@ typedef struct _GLFWlibraryWayland
|
|||||||
struct {
|
struct {
|
||||||
void* handle;
|
void* handle;
|
||||||
struct libdecor* context;
|
struct libdecor* context;
|
||||||
struct wl_callback* callback;
|
|
||||||
GLFWbool ready;
|
GLFWbool ready;
|
||||||
PFN_libdecor_new libdecor_new_;
|
PFN_libdecor_new libdecor_new_;
|
||||||
PFN_libdecor_unref libdecor_unref_;
|
PFN_libdecor_unref libdecor_unref_;
|
||||||
@@ -575,6 +617,7 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_libdecor_frame_set_capabilities libdecor_frame_set_capabilities_;
|
PFN_libdecor_frame_set_capabilities libdecor_frame_set_capabilities_;
|
||||||
PFN_libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_;
|
PFN_libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_;
|
||||||
PFN_libdecor_frame_set_visibility libdecor_frame_set_visibility_;
|
PFN_libdecor_frame_set_visibility libdecor_frame_set_visibility_;
|
||||||
|
PFN_libdecor_frame_is_visible libdecor_frame_is_visible_;
|
||||||
PFN_libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_;
|
PFN_libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_;
|
||||||
PFN_libdecor_configuration_get_content_size libdecor_configuration_get_content_size_;
|
PFN_libdecor_configuration_get_content_size libdecor_configuration_get_content_size_;
|
||||||
PFN_libdecor_configuration_get_window_state libdecor_configuration_get_window_state_;
|
PFN_libdecor_configuration_get_window_state libdecor_configuration_get_window_state_;
|
||||||
@@ -689,3 +732,5 @@ void _glfwUpdateBufferScaleFromOutputsWayland(_GLFWwindow* window);
|
|||||||
void _glfwAddSeatListenerWayland(struct wl_seat* seat);
|
void _glfwAddSeatListenerWayland(struct wl_seat* seat);
|
||||||
void _glfwAddDataDeviceListenerWayland(struct wl_data_device* device);
|
void _glfwAddDataDeviceListenerWayland(struct wl_data_device* device);
|
||||||
|
|
||||||
|
GLFWbool _glfwWaitForEGLFrameWayland(_GLFWwindow* window);
|
||||||
|
|
||||||
|
|||||||
+600
-288
File diff suppressed because it is too large
Load Diff
+13
-48
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.5 X11 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -535,6 +535,7 @@ static void detectEWMH(void)
|
|||||||
XA_WINDOW,
|
XA_WINDOW,
|
||||||
(unsigned char**) &windowFromChild))
|
(unsigned char**) &windowFromChild))
|
||||||
{
|
{
|
||||||
|
_glfwReleaseErrorHandlerX11();
|
||||||
XFree(windowFromRoot);
|
XFree(windowFromRoot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1591,65 +1592,29 @@ void _glfwTerminateX11(void)
|
|||||||
_glfw.x11.display = NULL;
|
_glfw.x11.display = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.x11.x11xcb.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.x11xcb.handle);
|
|
||||||
_glfw.x11.x11xcb.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.xcursor.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.xcursor.handle);
|
|
||||||
_glfw.x11.xcursor.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.randr.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.randr.handle);
|
|
||||||
_glfw.x11.randr.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.xinerama.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.xinerama.handle);
|
|
||||||
_glfw.x11.xinerama.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.xrender.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.xrender.handle);
|
|
||||||
_glfw.x11.xrender.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.vidmode.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.vidmode.handle);
|
|
||||||
_glfw.x11.vidmode.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.xi.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.x11.xi.handle);
|
|
||||||
_glfw.x11.xi.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateOSMesa();
|
||||||
// NOTE: These need to be unloaded after XCloseDisplay, as they register
|
// NOTE: These need to be unloaded after XCloseDisplay, as they register
|
||||||
// cleanup callbacks that get called by that function
|
// cleanup callbacks that get called by that function
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
_glfwTerminateGLX();
|
_glfwTerminateGLX();
|
||||||
|
|
||||||
if (_glfw.x11.xlib.handle)
|
_glfwPlatformFreeModule(_glfw.x11.x11xcb.handle);
|
||||||
{
|
_glfwPlatformFreeModule(_glfw.x11.xcursor.handle);
|
||||||
_glfwPlatformFreeModule(_glfw.x11.xlib.handle);
|
_glfwPlatformFreeModule(_glfw.x11.randr.handle);
|
||||||
_glfw.x11.xlib.handle = NULL;
|
_glfwPlatformFreeModule(_glfw.x11.xinerama.handle);
|
||||||
}
|
_glfwPlatformFreeModule(_glfw.x11.xrender.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.x11.xshape.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.x11.vidmode.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.x11.xi.handle);
|
||||||
|
_glfwPlatformFreeModule(_glfw.x11.xlib.handle);
|
||||||
|
|
||||||
if (_glfw.x11.emptyEventPipe[0] || _glfw.x11.emptyEventPipe[1])
|
if (_glfw.x11.emptyEventPipe[0] || _glfw.x11.emptyEventPipe[1])
|
||||||
{
|
{
|
||||||
close(_glfw.x11.emptyEventPipe[0]);
|
close(_glfw.x11.emptyEventPipe[0]);
|
||||||
close(_glfw.x11.emptyEventPipe[1]);
|
close(_glfw.x11.emptyEventPipe[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(&_glfw.x11, 0, sizeof(_glfw.x11));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_X11
|
#endif // _GLFW_X11
|
||||||
|
|||||||
+14
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.5 X11 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
// Check whether the display mode should be included in enumeration
|
// Check whether the display mode should be included in enumeration
|
||||||
@@ -150,6 +151,12 @@ void _glfwPollMonitorsX11(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);
|
XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);
|
||||||
|
if (!ci)
|
||||||
|
{
|
||||||
|
XRRFreeOutputInfo(oi);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270)
|
if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270)
|
||||||
{
|
{
|
||||||
widthMM = oi->mm_height;
|
widthMM = oi->mm_height;
|
||||||
@@ -611,7 +618,6 @@ void _glfwSetGammaRampX11(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
|||||||
|
|
||||||
GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* handle)
|
GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
@@ -620,12 +626,14 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* handle)
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->x11.crtc;
|
return monitor->x11.crtc;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* handle)
|
GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* handle)
|
||||||
{
|
{
|
||||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
@@ -634,6 +642,9 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* handle)
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||||
|
assert(monitor != NULL);
|
||||||
|
|
||||||
return monitor->x11.output;
|
return monitor->x11.output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-16
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.5 X11 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -452,9 +452,6 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(V
|
|||||||
typedef VkResult (APIENTRY *PFN_vkCreateXcbSurfaceKHR)(VkInstance,const VkXcbSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
typedef VkResult (APIENTRY *PFN_vkCreateXcbSurfaceKHR)(VkInstance,const VkXcbSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
||||||
typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice,uint32_t,xcb_connection_t*,xcb_visualid_t);
|
typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice,uint32_t,xcb_connection_t*,xcb_visualid_t);
|
||||||
|
|
||||||
#include "xkb_unicode.h"
|
|
||||||
#include "posix_poll.h"
|
|
||||||
|
|
||||||
#define GLFW_X11_WINDOW_STATE _GLFWwindowX11 x11;
|
#define GLFW_X11_WINDOW_STATE _GLFWwindowX11 x11;
|
||||||
#define GLFW_X11_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11;
|
#define GLFW_X11_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11;
|
||||||
#define GLFW_X11_MONITOR_STATE _GLFWmonitorX11 x11;
|
#define GLFW_X11_MONITOR_STATE _GLFWmonitorX11 x11;
|
||||||
@@ -463,6 +460,7 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(Vk
|
|||||||
#define GLFW_GLX_CONTEXT_STATE _GLFWcontextGLX glx;
|
#define GLFW_GLX_CONTEXT_STATE _GLFWcontextGLX glx;
|
||||||
#define GLFW_GLX_LIBRARY_CONTEXT_STATE _GLFWlibraryGLX glx;
|
#define GLFW_GLX_LIBRARY_CONTEXT_STATE _GLFWlibraryGLX glx;
|
||||||
|
|
||||||
|
#define GLFW_INVALID_CODEPOINT 0xffffffffu
|
||||||
|
|
||||||
// GLX-specific per-context data
|
// GLX-specific per-context data
|
||||||
//
|
//
|
||||||
@@ -470,6 +468,7 @@ typedef struct _GLFWcontextGLX
|
|||||||
{
|
{
|
||||||
GLXContext handle;
|
GLXContext handle;
|
||||||
GLXWindow window;
|
GLXWindow window;
|
||||||
|
GLXFBConfig fbconfig;
|
||||||
} _GLFWcontextGLX;
|
} _GLFWcontextGLX;
|
||||||
|
|
||||||
// GLX-specific global data
|
// GLX-specific global data
|
||||||
@@ -504,18 +503,18 @@ typedef struct _GLFWlibraryGLX
|
|||||||
PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT;
|
PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT;
|
||||||
PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA;
|
PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA;
|
||||||
PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||||
GLFWbool SGI_swap_control;
|
bool SGI_swap_control;
|
||||||
GLFWbool EXT_swap_control;
|
bool EXT_swap_control;
|
||||||
GLFWbool MESA_swap_control;
|
bool MESA_swap_control;
|
||||||
GLFWbool ARB_multisample;
|
bool ARB_multisample;
|
||||||
GLFWbool ARB_framebuffer_sRGB;
|
bool ARB_framebuffer_sRGB;
|
||||||
GLFWbool EXT_framebuffer_sRGB;
|
bool EXT_framebuffer_sRGB;
|
||||||
GLFWbool ARB_create_context;
|
bool ARB_create_context;
|
||||||
GLFWbool ARB_create_context_profile;
|
bool ARB_create_context_profile;
|
||||||
GLFWbool ARB_create_context_robustness;
|
bool ARB_create_context_robustness;
|
||||||
GLFWbool EXT_create_context_es2_profile;
|
bool EXT_create_context_es2_profile;
|
||||||
GLFWbool ARB_create_context_no_error;
|
bool ARB_create_context_no_error;
|
||||||
GLFWbool ARB_context_flush_control;
|
bool ARB_context_flush_control;
|
||||||
} _GLFWlibraryGLX;
|
} _GLFWlibraryGLX;
|
||||||
|
|
||||||
// X11-specific per-window data
|
// X11-specific per-window data
|
||||||
@@ -984,6 +983,8 @@ unsigned long _glfwGetWindowPropertyX11(Window window,
|
|||||||
unsigned char** value);
|
unsigned char** value);
|
||||||
GLFWbool _glfwIsVisualTransparentX11(Visual* visual);
|
GLFWbool _glfwIsVisualTransparentX11(Visual* visual);
|
||||||
|
|
||||||
|
uint32_t _glfwKeySym2UnicodeX11(unsigned int keysym);
|
||||||
|
|
||||||
void _glfwGrabErrorHandlerX11(void);
|
void _glfwGrabErrorHandlerX11(void);
|
||||||
void _glfwReleaseErrorHandlerX11(void);
|
void _glfwReleaseErrorHandlerX11(void);
|
||||||
void _glfwInputErrorX11(int error, const char* message);
|
void _glfwInputErrorX11(int error, const char* message);
|
||||||
|
|||||||
+68
-38
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.5 X11 - 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-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -576,6 +576,10 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
|||||||
height *= _glfw.x11.contentScaleY;
|
height *= _glfw.x11.contentScaleY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The dimensions must be nonzero, or a BadValue error results.
|
||||||
|
width = _glfw_max(1, width);
|
||||||
|
height = _glfw_max(1, height);
|
||||||
|
|
||||||
int xpos = 0, ypos = 0;
|
int xpos = 0, ypos = 0;
|
||||||
|
|
||||||
if (wndconfig->xpos != GLFW_ANY_POSITION && wndconfig->ypos != GLFW_ANY_POSITION)
|
if (wndconfig->xpos != GLFW_ANY_POSITION && wndconfig->ypos != GLFW_ANY_POSITION)
|
||||||
@@ -754,13 +758,13 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
|||||||
const char* resourceName = getenv("RESOURCE_NAME");
|
const char* resourceName = getenv("RESOURCE_NAME");
|
||||||
if (resourceName && strlen(resourceName))
|
if (resourceName && strlen(resourceName))
|
||||||
hint->res_name = (char*) resourceName;
|
hint->res_name = (char*) resourceName;
|
||||||
else if (strlen(wndconfig->title))
|
else if (strlen(window->title))
|
||||||
hint->res_name = (char*) wndconfig->title;
|
hint->res_name = (char*) window->title;
|
||||||
else
|
else
|
||||||
hint->res_name = (char*) "glfw-application";
|
hint->res_name = (char*) "glfw-application";
|
||||||
|
|
||||||
if (strlen(wndconfig->title))
|
if (strlen(window->title))
|
||||||
hint->res_class = (char*) wndconfig->title;
|
hint->res_class = (char*) window->title;
|
||||||
else
|
else
|
||||||
hint->res_class = (char*) "GLFW-Application";
|
hint->res_class = (char*) "GLFW-Application";
|
||||||
}
|
}
|
||||||
@@ -780,7 +784,7 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
|||||||
if (_glfw.x11.im)
|
if (_glfw.x11.im)
|
||||||
_glfwCreateInputContextX11(window);
|
_glfwCreateInputContextX11(window);
|
||||||
|
|
||||||
_glfwSetWindowTitleX11(window, wndconfig->title);
|
_glfwSetWindowTitleX11(window, window->title);
|
||||||
_glfwGetWindowPosX11(window, &window->x11.xpos, &window->x11.ypos);
|
_glfwGetWindowPosX11(window, &window->x11.xpos, &window->x11.ypos);
|
||||||
_glfwGetWindowSizeX11(window, &window->x11.width, &window->x11.height);
|
_glfwGetWindowSizeX11(window, &window->x11.width, &window->x11.height);
|
||||||
|
|
||||||
@@ -1304,7 +1308,7 @@ static void processEvent(XEvent *event)
|
|||||||
|
|
||||||
_glfwInputKey(window, key, keycode, GLFW_PRESS, mods);
|
_glfwInputKey(window, key, keycode, GLFW_PRESS, mods);
|
||||||
|
|
||||||
const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
|
const uint32_t codepoint = _glfwKeySym2UnicodeX11(keysym);
|
||||||
if (codepoint != GLFW_INVALID_CODEPOINT)
|
if (codepoint != GLFW_INVALID_CODEPOINT)
|
||||||
_glfwInputChar(window, codepoint, mods, plain);
|
_glfwInputChar(window, codepoint, mods, plain);
|
||||||
}
|
}
|
||||||
@@ -2203,6 +2207,10 @@ void _glfwGetWindowSizeX11(_GLFWwindow* window, int* width, int* height)
|
|||||||
|
|
||||||
void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height)
|
void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
|
// The dimensions must be nonzero, or a BadValue error results
|
||||||
|
width = _glfw_max(1, width);
|
||||||
|
height = _glfw_max(1, height);
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
if (window->monitor->window == window)
|
if (window->monitor->window == window)
|
||||||
@@ -2430,6 +2438,38 @@ void _glfwShowWindowX11(_GLFWwindow* window)
|
|||||||
if (_glfwWindowVisibleX11(window))
|
if (_glfwWindowVisibleX11(window))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (window->floating && _glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE)
|
||||||
|
{
|
||||||
|
Atom* states = NULL;
|
||||||
|
const unsigned long count =
|
||||||
|
_glfwGetWindowPropertyX11(window->x11.handle,
|
||||||
|
_glfw.x11.NET_WM_STATE,
|
||||||
|
XA_ATOM, (unsigned char**) &states);
|
||||||
|
|
||||||
|
// NOTE: We don't check for failure as this property may not exist yet
|
||||||
|
// and that's fine (and we'll create it implicitly with append)
|
||||||
|
|
||||||
|
unsigned long i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == count)
|
||||||
|
{
|
||||||
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
|
PropModeAppend,
|
||||||
|
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
||||||
|
1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (states)
|
||||||
|
XFree(states);
|
||||||
|
}
|
||||||
|
|
||||||
XMapWindow(_glfw.x11.display, window->x11.handle);
|
XMapWindow(_glfw.x11.display, window->x11.handle);
|
||||||
waitForVisibilityNotify(window);
|
waitForVisibilityNotify(window);
|
||||||
}
|
}
|
||||||
@@ -2659,6 +2699,10 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// NOTE: _NET_WM_STATE_ABOVE is added when the window is shown
|
||||||
|
if (enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
Atom* states = NULL;
|
Atom* states = NULL;
|
||||||
const unsigned long count =
|
const unsigned long count =
|
||||||
_glfwGetWindowPropertyX11(window->x11.handle,
|
_glfwGetWindowPropertyX11(window->x11.handle,
|
||||||
@@ -2669,38 +2713,20 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
// NOTE: We don't check for failure as this property may not exist yet
|
// NOTE: We don't check for failure as this property may not exist yet
|
||||||
// and that's fine (and we'll create it implicitly with append)
|
// and that's fine (and we'll create it implicitly with append)
|
||||||
|
|
||||||
if (enabled)
|
unsigned long i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
||||||
|
break;
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == count)
|
|
||||||
{
|
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
|
||||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
|
||||||
PropModeAppend,
|
|
||||||
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
|
||||||
1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (states)
|
|
||||||
|
if (i < count)
|
||||||
{
|
{
|
||||||
for (unsigned long i = 0; i < count; i++)
|
states[i] = states[count - 1];
|
||||||
{
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
{
|
PropModeReplace, (unsigned char*) states, count - 1);
|
||||||
states[i] = states[count - 1];
|
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
|
||||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
|
||||||
PropModeReplace, (unsigned char*) states, count - 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (states)
|
if (states)
|
||||||
@@ -2918,7 +2944,7 @@ const char* _glfwGetScancodeNameX11(int scancode)
|
|||||||
if (keysym == NoSymbol)
|
if (keysym == NoSymbol)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
|
const uint32_t codepoint = _glfwKeySym2UnicodeX11(keysym);
|
||||||
if (codepoint == GLFW_INVALID_CODEPOINT)
|
if (codepoint == GLFW_INVALID_CODEPOINT)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -3302,7 +3328,6 @@ GLFWAPI Display* glfwGetX11Display(void)
|
|||||||
|
|
||||||
GLFWAPI Window glfwGetX11Window(GLFWwindow* handle)
|
GLFWAPI Window glfwGetX11Window(GLFWwindow* handle)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
||||||
|
|
||||||
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
if (_glfw.platform.platformID != GLFW_PLATFORM_X11)
|
||||||
@@ -3311,6 +3336,9 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* handle)
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
return window->x11.handle;
|
return window->x11.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3324,6 +3352,8 @@ GLFWAPI void glfwSetX11SelectionString(const char* string)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(string != NULL);
|
||||||
|
|
||||||
_glfw_free(_glfw.x11.primarySelectionString);
|
_glfw_free(_glfw.x11.primarySelectionString);
|
||||||
_glfw.x11.primarySelectionString = _glfw_strdup(string);
|
_glfw.x11.primarySelectionString = _glfw_strdup(string);
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.5 X11 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#if defined(_GLFW_X11) || defined(_GLFW_WAYLAND)
|
#if defined(_GLFW_X11)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Marcus: This code was originally written by Markus G. Kuhn.
|
* Marcus: This code was originally written by Markus G. Kuhn.
|
||||||
@@ -906,7 +906,7 @@ static const struct codepair {
|
|||||||
|
|
||||||
// Convert XKB KeySym to Unicode
|
// Convert XKB KeySym to Unicode
|
||||||
//
|
//
|
||||||
uint32_t _glfwKeySym2Unicode(unsigned int keysym)
|
uint32_t _glfwKeySym2UnicodeX11(unsigned int keysym)
|
||||||
{
|
{
|
||||||
int min = 0;
|
int min = 0;
|
||||||
int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
|
int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
|
||||||
@@ -939,5 +939,5 @@ uint32_t _glfwKeySym2Unicode(unsigned int keysym)
|
|||||||
return GLFW_INVALID_CODEPOINT;
|
return GLFW_INVALID_CODEPOINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _GLFW_WAYLAND or _GLFW_X11
|
#endif // _GLFW_X11
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
//========================================================================
|
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
//
|
|
||||||
// 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_INVALID_CODEPOINT 0xffffffffu
|
|
||||||
|
|
||||||
uint32_t _glfwKeySym2Unicode(unsigned int keysym);
|
|
||||||
|
|
||||||
+75
-30
@@ -23,7 +23,10 @@
|
|||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//
|
//
|
||||||
// This test is intended to verify that posting of empty events works
|
// This test is intended to verify that the posting of empty events works.
|
||||||
|
// Background colors are produced on a secondary thread, which then wakes
|
||||||
|
// the main thread with glfwPostEmptyEvent when a new one is available.
|
||||||
|
// This allows the main thread to wait for events unconditionally.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
@@ -37,25 +40,53 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
static volatile int running = GLFW_TRUE;
|
struct State
|
||||||
|
{
|
||||||
|
mtx_t lock;
|
||||||
|
bool running;
|
||||||
|
bool needs_update;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
float r, g, b;
|
||||||
|
};
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
static void error_callback(int error, const char* description)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error: %s\n", description);
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_color(struct State* state)
|
||||||
|
{
|
||||||
|
const float r = (float) rand() / (float) RAND_MAX;
|
||||||
|
const float g = (float) rand() / (float) RAND_MAX;
|
||||||
|
const float b = (float) rand() / (float) RAND_MAX;
|
||||||
|
const float l = sqrtf(r * r + g * g + b * b);
|
||||||
|
|
||||||
|
mtx_lock(&state->lock);
|
||||||
|
state->r = r / l;
|
||||||
|
state->g = g / l;
|
||||||
|
state->b = b / l;
|
||||||
|
state->needs_update = true;
|
||||||
|
mtx_unlock(&state->lock);
|
||||||
|
}
|
||||||
|
|
||||||
static int thread_main(void* data)
|
static int thread_main(void* data)
|
||||||
{
|
{
|
||||||
struct timespec time;
|
struct State* const state = data;
|
||||||
|
|
||||||
while (running)
|
srand((unsigned int) time(NULL));
|
||||||
|
|
||||||
|
while (state->running)
|
||||||
{
|
{
|
||||||
|
generate_color(state);
|
||||||
|
glfwPostEmptyEvent();
|
||||||
|
|
||||||
|
struct timespec time;
|
||||||
clock_gettime(CLOCK_REALTIME, &time);
|
clock_gettime(CLOCK_REALTIME, &time);
|
||||||
time.tv_sec += 1;
|
time.tv_sec += 1;
|
||||||
thrd_sleep(&time, NULL);
|
thrd_sleep(&time, NULL);
|
||||||
|
|
||||||
glfwPostEmptyEvent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -64,28 +95,38 @@ static int thread_main(void* data)
|
|||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
{
|
{
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glfwSetWindowShouldClose(window, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static float nrand(void)
|
static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
return (float) rand() / (float) RAND_MAX;
|
struct State* const state = glfwGetWindowUserPointer(window);
|
||||||
|
|
||||||
|
mtx_lock(&state->lock);
|
||||||
|
state->width = width;
|
||||||
|
state->height = height;
|
||||||
|
state->needs_update = true;
|
||||||
|
mtx_unlock(&state->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
int result;
|
struct State state = { .running = true };
|
||||||
thrd_t thread;
|
|
||||||
GLFWwindow* window;
|
|
||||||
|
|
||||||
srand((unsigned int) time(NULL));
|
if (mtx_init(&state.lock, mtx_plain) != thrd_success)
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_color(&state);
|
||||||
|
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
window = glfwCreateWindow(640, 480, "Empty Event Test", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "Empty Event Test", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
@@ -95,8 +136,13 @@ int main(void)
|
|||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetWindowUserPointer(window, &state);
|
||||||
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||||
|
glfwGetFramebufferSize(window, &state.width, &state.height);
|
||||||
|
|
||||||
if (thrd_create(&thread, thread_main, NULL) != thrd_success)
|
thrd_t color_thread;
|
||||||
|
|
||||||
|
if (thrd_create(&color_thread, thread_main, &state) != thrd_success)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to create secondary thread\n");
|
fprintf(stderr, "Failed to create secondary thread\n");
|
||||||
|
|
||||||
@@ -104,28 +150,27 @@ int main(void)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (running)
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
int width, height;
|
if (state.needs_update)
|
||||||
float r = nrand(), g = nrand(), b = nrand();
|
{
|
||||||
float l = (float) sqrt(r * r + g * g + b * b);
|
mtx_lock(&state.lock);
|
||||||
|
glViewport(0, 0, state.width, state.height);
|
||||||
|
glClearColor(state.r, state.g, state.b, 1.f);
|
||||||
|
state.needs_update = false;
|
||||||
|
mtx_unlock(&state.lock);
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glfwSwapBuffers(window);
|
||||||
glViewport(0, 0, width, height);
|
}
|
||||||
glClearColor(r / l, g / l, b / l, 1.f);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glfwSwapBuffers(window);
|
|
||||||
|
|
||||||
glfwWaitEvents();
|
glfwWaitEvents();
|
||||||
|
|
||||||
if (glfwWindowShouldClose(window))
|
|
||||||
running = GLFW_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwHideWindow(window);
|
glfwHideWindow(window);
|
||||||
thrd_join(thread, &result);
|
state.running = false;
|
||||||
glfwDestroyWindow(window);
|
thrd_join(color_thread, NULL);
|
||||||
|
mtx_destroy(&state.lock);
|
||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|||||||
@@ -630,6 +630,7 @@ int main(int argc, char** argv)
|
|||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
glfwSetInputMode(slots[i].window, GLFW_UNLIMITED_MOUSE_BUTTONS, GLFW_TRUE);
|
||||||
|
|
||||||
glfwSetWindowUserPointer(slots[i].window, slots + i);
|
glfwSetWindowUserPointer(slots[i].window, slots + i);
|
||||||
|
|
||||||
|
|||||||
@@ -146,6 +146,10 @@ int main(void)
|
|||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
thrd_join(threads[i].id, &result);
|
thrd_join(threads[i].id, &result);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
glfwDestroyWindow(threads[i].window);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+30
-1
@@ -36,6 +36,14 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
static bool needs_update;
|
||||||
|
|
||||||
|
static void window_close_callback(GLFWwindow* window)
|
||||||
|
{
|
||||||
|
needs_update = true;
|
||||||
|
}
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
static void error_callback(int error, const char* description)
|
||||||
{
|
{
|
||||||
@@ -45,7 +53,15 @@ static void error_callback(int error, const char* description)
|
|||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
{
|
{
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
|
{
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
needs_update = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
|
{
|
||||||
|
needs_update = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float nrand(void)
|
static float nrand(void)
|
||||||
@@ -72,8 +88,11 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
glfwSwapInterval(0);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
glfwSetWindowCloseCallback(window, window_close_callback);
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
@@ -87,8 +106,18 @@ int main(void)
|
|||||||
glClearColor(r / l, g / l, b / l, 1.f);
|
glClearColor(r / l, g / l, b / l, 1.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
|
needs_update = false;
|
||||||
|
|
||||||
glfwWaitEventsTimeout(1.0);
|
const double start = glfwGetTime();
|
||||||
|
|
||||||
|
while (!needs_update)
|
||||||
|
{
|
||||||
|
const double elapsed = glfwGetTime() - start;
|
||||||
|
if (elapsed >= 1.0)
|
||||||
|
needs_update = true;
|
||||||
|
else
|
||||||
|
glfwWaitEventsTimeout(1.0 - elapsed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ int main(int argc, char** argv)
|
|||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
glfwSetInputMode(window, GLFW_UNLIMITED_MOUSE_BUTTONS, GLFW_TRUE);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL(glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
|||||||
Reference in New Issue
Block a user