mirror of
https://github.com/glfw/glfw.git
synced 2026-09-24 01:28:58 +00:00
Compare commits
354 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d5a16ce71 | |||
| a69648e192 | |||
| e10def6de7 | |||
| 84c881c1a8 | |||
| 18d7c241f8 | |||
| 6281424988 | |||
| 81d762bf66 | |||
| 486724c433 | |||
| 55528e9178 | |||
| 689840f2eb | |||
| c59092619a | |||
| bfd9eaf092 | |||
| 6902435005 | |||
| 6eb24a49df | |||
| bec6e7565b | |||
| 19543afbfb | |||
| d3b73abba0 | |||
| fbdb08c43e | |||
| 71316f843c | |||
| 472d45c07b | |||
| 85f37ada6d | |||
| b77a9b1d0d | |||
| db85858062 | |||
| ca676357c0 | |||
| 4ea7485fbe | |||
| 73b6754a67 | |||
| 2d3ce6eaae | |||
| cec0b33ee1 | |||
| 9400bc9f35 | |||
| 1a7e4da343 | |||
| 95df61e5ed | |||
| c32fefc6a0 | |||
| 6bb5f5d59d | |||
| 33ff23dc07 | |||
| cf70b10692 | |||
| 0a3fb9940f | |||
| c113c59926 | |||
| ffe0795e64 | |||
| 1d7339f3fc | |||
| 50b09938e7 | |||
| 123643df2d | |||
| ab5f006cff | |||
| 74a8ba26c3 | |||
| 929286ca47 | |||
| d3317b4937 | |||
| b3b82cdd78 | |||
| 20a7962a9b | |||
| 44ad296813 | |||
| 1b0eac9c58 | |||
| 65c36563f6 | |||
| 1e98fc325d | |||
| 545b6c7970 | |||
| a7202e2341 | |||
| 9a5511b311 | |||
| a18f4e50b0 | |||
| 3bf580ad1d | |||
| 014ce9c74f | |||
| 8f0198e82e | |||
| bd346b64d6 | |||
| d61f7225d1 | |||
| 813edfa494 | |||
| b1a8bc5d69 | |||
| e04cd8283e | |||
| db34aea144 | |||
| 6518847f4d | |||
| 5ecf2cbdbf | |||
| 45d1f547cd | |||
| 4e1aeb899c | |||
| 8bf39cf1f4 | |||
| 45336c1104 | |||
| 163fa83fac | |||
| 6769ffcd0f | |||
| 07c29d1c1c | |||
| 508e24c01c | |||
| e756ae1d85 | |||
| 020ce99170 | |||
| a149810df9 | |||
| 2a5038e4e9 | |||
| 728aaccbbb | |||
| 52b2775c2e | |||
| 30b02dd709 | |||
| 9ef9b1361a | |||
| 5dd6716ee9 | |||
| 3cded29c2f | |||
| 583dcbcc19 | |||
| bcaf8daa72 | |||
| 658744e222 | |||
| 713711f5e9 | |||
| 814b7929c5 | |||
| b39c02b118 | |||
| 0f46d089e8 | |||
| b8202d9ca3 | |||
| 901d30b973 | |||
| 0c22ebac36 | |||
| 900dda7e89 | |||
| 56230ca173 | |||
| c6fa2c8cfb | |||
| 860d9deceb | |||
| 5a15d8a784 | |||
| 8270081334 | |||
| 15b0c43e2d | |||
| 903c0ebfd1 | |||
| 8746f68d61 | |||
| 14921d1e24 | |||
| eda12dd949 | |||
| 01c362ba37 | |||
| 078e8fcf55 | |||
| be56132c02 | |||
| 294b08dcc8 | |||
| cdd5ee8d36 | |||
| 0d7acffd47 | |||
| edb6f674cd | |||
| b31d7ddc8c | |||
| baf26a6ea7 | |||
| 395ab660d5 | |||
| 7dee4e05f9 | |||
| e0b3361683 | |||
| 0b56adb721 | |||
| db66a0f028 | |||
| 0a16464f5e | |||
| 5e807a029b | |||
| 41ad058ce3 | |||
| 214c76a3ad | |||
| c3250be690 | |||
| e341080489 | |||
| 77dffb341b | |||
| cb8aee8437 | |||
| bbc4caf04c | |||
| c0704e4a63 | |||
| 92f80daf4a | |||
| 111c8ecea6 | |||
| 7728a6a3aa | |||
| 0ab31db9c0 | |||
| 8363179eee | |||
| b8a6254a26 | |||
| 2a5ac9a6d6 | |||
| 114704262c | |||
| bd2fb9ebaf | |||
| 85a169ff50 | |||
| 539f4bdca2 | |||
| 606c0fc03e | |||
| d858e48860 | |||
| e6646c8508 | |||
| 9cae95faa3 | |||
| 26aaa007e0 | |||
| f921caf4a6 | |||
| 9aefb67358 | |||
| 1730184971 | |||
| 325b4186d3 | |||
| 92c6209530 | |||
| 307ce3aa1a | |||
| d7b67a2eb4 | |||
| 5dbca2e2c9 | |||
| 63af05c419 | |||
| e336288eeb | |||
| fb0c8d4662 | |||
| 78ad4e8f36 | |||
| 37a86f24f0 | |||
| 11e5102d83 | |||
| a8e5c530ee | |||
| 8b63ca53de | |||
| ca2cd2f796 | |||
| 0a7c24e48c | |||
| 48bc089e9e | |||
| 3df4ebeaac | |||
| dff64496d6 | |||
| 117f7694b2 | |||
| d0c0997528 | |||
| e145d89a96 | |||
| 10c01512f2 | |||
| 8216a148cf | |||
| 6e01359e36 | |||
| 404c28df3d | |||
| b0c79896a3 | |||
| 4aaf8ba1d2 | |||
| cf87e6549c | |||
| 27d7fc098d | |||
| ec5610deda | |||
| b25ee390c1 | |||
| a6d022c257 | |||
| 2d4c4b7949 | |||
| aee62d3c16 | |||
| c4b4476d78 | |||
| 0ac013381b | |||
| d99249337e | |||
| 750b1c5365 | |||
| 1d711057a1 | |||
| 3604cc72fc | |||
| 64c7aa50d0 | |||
| 0a49ef0a00 | |||
| b1d4b6a595 | |||
| ad12b97acd | |||
| 835dc3d327 | |||
| 6a9fd2e13f | |||
| e53538010a | |||
| ec28696994 | |||
| 0af3bf3b36 | |||
| 8552152f80 | |||
| 85172703db | |||
| d33084447d | |||
| 50f3979dfd | |||
| 977e2b51b0 | |||
| fbe8ae993c | |||
| 487e0419a7 | |||
| 0938462616 | |||
| ecda86fa4f | |||
| 359f0e103c | |||
| 821873974a | |||
| e8d4cc327d | |||
| 7f775302ae | |||
| cb49e1821b | |||
| 9fc5fd1375 | |||
| bb8ed627bf | |||
| ccb54c3e05 | |||
| 7c9d0081e3 | |||
| c3b8afc5d6 | |||
| 4df0a2b38e | |||
| 94bb2a138e | |||
| 85a27e9f74 | |||
| 5615c16439 | |||
| 8dd40f1c48 | |||
| 640e3205a9 | |||
| dd00c6dea1 | |||
| e8dab39625 | |||
| 9724f33038 | |||
| 8c3d2f769f | |||
| 2b1e2d2e49 | |||
| 39c5e90d94 | |||
| 365321a9af | |||
| d8648876da | |||
| bf9c5fcfc2 | |||
| f25202fbfa | |||
| b5bccd1425 | |||
| 03f2cde34e | |||
| cd70e1bbc4 | |||
| f318ab7467 | |||
| db2ff13d41 | |||
| 82bd22ec29 | |||
| bcd232e2ae | |||
| f650a898f2 | |||
| 8c1b59f885 | |||
| 5a1512aaa0 | |||
| b05d887968 | |||
| e135210cb3 | |||
| 2da4adce40 | |||
| 17d727cd35 | |||
| 58c1621481 | |||
| 9db0bd45e6 | |||
| df4bda44fc | |||
| 50218fbf7e | |||
| 3a2c0aaa27 | |||
| 2bac7ee8da | |||
| 4116db14fd | |||
| e3c83f684f | |||
| 0ecc84182c | |||
| b4cc6101ed | |||
| 7c33fb22fd | |||
| 52b77030e4 | |||
| e662492169 | |||
| b3c2023ebc | |||
| 129a5ccb19 | |||
| 25af31528c | |||
| 5ea34d62bf | |||
| 7a10e6439c | |||
| 8c46a3e9f9 | |||
| 82effcb7ba | |||
| 11db404fa1 | |||
| 5f7e5cb92b | |||
| c5a870ebd9 | |||
| 3484aa8187 | |||
| 399c082033 | |||
| 1bf892f603 | |||
| f9a9bb6747 | |||
| 91c6a542ff | |||
| 411d4dd51e | |||
| 161e9e1215 | |||
| 3a8d97cc3d | |||
| afcefcb5f7 | |||
| 8c69091c59 | |||
| 857951419a | |||
| 17f1cceb32 | |||
| 3f0390b827 | |||
| 4a62820646 | |||
| 3facbd2083 | |||
| e4e9581557 | |||
| 087110aa63 | |||
| e30718e927 | |||
| 613b169899 | |||
| 13a4e4e810 | |||
| a1b65e8542 | |||
| 649553cc78 | |||
| 934f0e9ff1 | |||
| b2919dca4b | |||
| 71cfafe2f9 | |||
| 79f4ec6822 | |||
| 2032a8f0dc | |||
| c0d1249ca2 | |||
| 2d3f388158 | |||
| 30e67357be | |||
| 116f4c831d | |||
| 1e8dc836a0 | |||
| adcd306fbd | |||
| b1309dd42a | |||
| d25e19b790 | |||
| 1daf9de40f | |||
| cfd93597ec | |||
| 8e923e592d | |||
| 9fc035a562 | |||
| ce7cd3e288 | |||
| 452a648abb | |||
| 75b415c5b8 | |||
| 248e827673 | |||
| 95e7ad7e5b | |||
| ff2c00091d | |||
| b3eb6dd38b | |||
| 84fa724456 | |||
| 633ba53f2c | |||
| 898b7f9c54 | |||
| eb466a0e0b | |||
| 8542f8dd84 | |||
| 1e12653348 | |||
| e276f6731e | |||
| 66e06b0609 | |||
| 71a4f2d8a2 | |||
| 7b18f79ea6 | |||
| f2208ab135 | |||
| b962ef1241 | |||
| 5416e347ad | |||
| 16186943b4 | |||
| b436d8e3e6 | |||
| ad3e7c7f39 | |||
| 15f078c6ad | |||
| e01128f32f | |||
| 051424f196 | |||
| 97393223ee | |||
| 04522580ad | |||
| d2634896d6 | |||
| 3afb2cc8ed | |||
| 9f5c6c6e89 | |||
| 4d99045e87 | |||
| b383e70021 | |||
| 645b8c3bba | |||
| 80935c6c27 | |||
| 73a3ef86db | |||
| d715917add | |||
| b596c79014 | |||
| bc8b567d7c | |||
| 37cc51b823 | |||
| 9cc83cf07f | |||
| e826f839a4 | |||
| 2e3b4cf898 | |||
| 6648b3d4bb | |||
| 76505355e1 | |||
| a9343d641c |
+3
-16
@@ -1,10 +1,10 @@
|
|||||||
image:
|
image:
|
||||||
- Visual Studio 2015
|
- Visual Studio 2015
|
||||||
- Visual Studio 2019
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- ci
|
- ci
|
||||||
- master
|
- master
|
||||||
|
- latest
|
||||||
- 3.3-stable
|
- 3.3-stable
|
||||||
skip_tags: true
|
skip_tags: true
|
||||||
environment:
|
environment:
|
||||||
@@ -21,26 +21,13 @@ environment:
|
|||||||
- GENERATOR: Visual Studio 10 2010
|
- GENERATOR: Visual Studio 10 2010
|
||||||
BUILD_SHARED_LIBS: OFF
|
BUILD_SHARED_LIBS: OFF
|
||||||
CFLAGS: /WX
|
CFLAGS: /WX
|
||||||
- GENERATOR: Visual Studio 16 2019
|
|
||||||
BUILD_SHARED_LIBS: ON
|
|
||||||
CFLAGS: /WX
|
|
||||||
- GENERATOR: Visual Studio 16 2019
|
|
||||||
BUILD_SHARED_LIBS: OFF
|
|
||||||
CFLAGS: /WX
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
exclude:
|
|
||||||
- image: Visual Studio 2015
|
|
||||||
GENERATOR: Visual Studio 16 2019
|
|
||||||
- image: Visual Studio 2019
|
|
||||||
GENERATOR: Visual Studio 10 2010
|
|
||||||
- image: Visual Studio 2019
|
|
||||||
GENERATOR: MinGW Makefiles
|
|
||||||
for:
|
for:
|
||||||
-
|
-
|
||||||
matrix:
|
matrix:
|
||||||
except:
|
only:
|
||||||
- GENERATOR: Visual Studio 10 2010
|
- GENERATOR: MinGW Makefiles
|
||||||
build_script:
|
build_script:
|
||||||
- set PATH=%PATH:C:\Program Files\Git\usr\bin=C:\MinGW\bin%
|
- set PATH=%PATH:C:\Program Files\Git\usr\bin=C:\MinGW\bin%
|
||||||
- cmake -S . -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
- cmake -S . -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
name: Build
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ ci, master, latest, 3.3-stable ]
|
||||||
|
permissions:
|
||||||
|
statuses: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-x11-clang:
|
||||||
|
name: X11 (Linux, Clang)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: -Werror
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev
|
||||||
|
|
||||||
|
- name: Configure static library
|
||||||
|
run: cmake -S . -B build-static
|
||||||
|
- name: Build static library
|
||||||
|
run: cmake --build build-static --parallel
|
||||||
|
|
||||||
|
- name: Configure shared library
|
||||||
|
run: cmake -S . -B build-shared -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build shared library
|
||||||
|
run: cmake --build build-shared --parallel
|
||||||
|
|
||||||
|
build-linux-wayland-clang:
|
||||||
|
name: Wayland (Linux, Clang)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: -Werror
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install wayland-protocols libwayland-dev libxkbcommon-dev extra-cmake-modules
|
||||||
|
|
||||||
|
- name: Configure static library
|
||||||
|
run: cmake -S . -B build-static -D GLFW_USE_WAYLAND=ON
|
||||||
|
- name: Build static library
|
||||||
|
run: cmake --build build-static --parallel
|
||||||
|
|
||||||
|
- name: Configure shared library
|
||||||
|
run: cmake -S . -B build-shared -D GLFW_USE_WAYLAND=ON -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build shared library
|
||||||
|
run: cmake --build build-shared --parallel
|
||||||
|
|
||||||
|
build-linux-null-clang:
|
||||||
|
name: Null (Linux, Clang)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: -Werror
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install libosmesa6-dev
|
||||||
|
|
||||||
|
- name: Configure static library
|
||||||
|
run: cmake -S . -B build-static -D GLFW_USE_OSMESA=ON
|
||||||
|
- name: Build static library
|
||||||
|
run: cmake --build build-static --parallel
|
||||||
|
|
||||||
|
- name: Configure shared library
|
||||||
|
run: cmake -S . -B build-shared -D GLFW_USE_OSMESA=ON -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build shared library
|
||||||
|
run: cmake --build build-shared --parallel
|
||||||
|
|
||||||
|
build-macos-cocoa-clang:
|
||||||
|
name: Cocoa (macOS, Clang)
|
||||||
|
runs-on: macos-latest
|
||||||
|
env:
|
||||||
|
CFLAGS: -Werror
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: 10.8
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure static library
|
||||||
|
run: cmake -S . -B build-static
|
||||||
|
- name: Build static library
|
||||||
|
run: cmake --build build-static --parallel
|
||||||
|
|
||||||
|
- name: Configure shared library
|
||||||
|
run: cmake -S . -B build-shared -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build shared library
|
||||||
|
run: cmake --build build-shared --parallel
|
||||||
|
|
||||||
|
build-windows-win32-vs2019:
|
||||||
|
name: Win32 (Windows, VS2019)
|
||||||
|
runs-on: windows-latest
|
||||||
|
env:
|
||||||
|
CFLAGS: /WX
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure static library
|
||||||
|
run: cmake -S . -B build-static -G "Visual Studio 16 2019"
|
||||||
|
- name: Build static library
|
||||||
|
run: cmake --build build-static --parallel
|
||||||
|
|
||||||
|
- name: Configure shared library
|
||||||
|
run: cmake -S . -B build-shared -G "Visual Studio 16 2019" -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build shared library
|
||||||
|
run: cmake --build build-shared --parallel
|
||||||
|
|
||||||
+7
-4
@@ -52,15 +52,19 @@ src/glfw_config.h
|
|||||||
src/glfw3.pc
|
src/glfw3.pc
|
||||||
src/glfw3Config.cmake
|
src/glfw3Config.cmake
|
||||||
src/glfw3ConfigVersion.cmake
|
src/glfw3ConfigVersion.cmake
|
||||||
|
src/wayland-pointer-constraints-unstable-v1-client-protocol.h
|
||||||
|
src/wayland-pointer-constraints-unstable-v1-protocol.c
|
||||||
|
src/wayland-relative-pointer-unstable-v1-client-protocol.h
|
||||||
|
src/wayland-relative-pointer-unstable-v1-protocol.c
|
||||||
|
|
||||||
# Compiled binaries
|
# Compiled binaries
|
||||||
src/libglfw.so
|
src/libglfw.so
|
||||||
src/libglfw.so.3
|
src/libglfw.so.3
|
||||||
src/libglfw.so.3.4
|
src/libglfw.so.3.3
|
||||||
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.3.dylib
|
||||||
src/libglfw3.a
|
src/libglfw3.a
|
||||||
src/glfw3.lib
|
src/glfw3.lib
|
||||||
src/glfw3.dll
|
src/glfw3.dll
|
||||||
@@ -75,7 +79,7 @@ examples/offscreen
|
|||||||
examples/particles
|
examples/particles
|
||||||
examples/splitview
|
examples/splitview
|
||||||
examples/sharing
|
examples/sharing
|
||||||
examples/triangle-opengl
|
examples/simple
|
||||||
examples/wave
|
examples/wave
|
||||||
tests/*.app
|
tests/*.app
|
||||||
tests/*.exe
|
tests/*.exe
|
||||||
@@ -96,6 +100,5 @@ tests/threads
|
|||||||
tests/timeout
|
tests/timeout
|
||||||
tests/title
|
tests/title
|
||||||
tests/triangle-vulkan
|
tests/triangle-vulkan
|
||||||
tests/window
|
|
||||||
tests/windows
|
tests/windows
|
||||||
|
|
||||||
|
|||||||
-114
@@ -1,114 +0,0 @@
|
|||||||
language: c
|
|
||||||
compiler: clang
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- ci
|
|
||||||
- master
|
|
||||||
- 3.3-stable
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
dist: xenial
|
|
||||||
name: "X11 shared library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libxrandr-dev
|
|
||||||
- libxinerama-dev
|
|
||||||
- libxcursor-dev
|
|
||||||
- libxi-dev
|
|
||||||
- libxext-dev
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=ON
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: linux
|
|
||||||
dist: xenial
|
|
||||||
name: "X11 static library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libxrandr-dev
|
|
||||||
- libxinerama-dev
|
|
||||||
- libxcursor-dev
|
|
||||||
- libxi-dev
|
|
||||||
- libxext-dev
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=OFF
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: linux
|
|
||||||
dist: focal
|
|
||||||
name: "Wayland shared library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- wayland-protocols
|
|
||||||
- libwayland-dev
|
|
||||||
- libxkbcommon-dev
|
|
||||||
- libegl1-mesa-dev
|
|
||||||
env:
|
|
||||||
- USE_WAYLAND=ON
|
|
||||||
- BUILD_SHARED_LIBS=ON
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: linux
|
|
||||||
dist: focal
|
|
||||||
name: "Wayland static library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- wayland-protocols
|
|
||||||
- libwayland-dev
|
|
||||||
- libxkbcommon-dev
|
|
||||||
- libegl1-mesa-dev
|
|
||||||
env:
|
|
||||||
- USE_WAYLAND=ON
|
|
||||||
- BUILD_SHARED_LIBS=OFF
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: linux
|
|
||||||
dist: bionic
|
|
||||||
name: "Null shared library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libosmesa6-dev
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=ON
|
|
||||||
- USE_OSMESA=ON
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: linux
|
|
||||||
dist: bionic
|
|
||||||
name: "Null static library"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libosmesa6-dev
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=OFF
|
|
||||||
- USE_OSMESA=ON
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- os: osx
|
|
||||||
name: "Cocoa shared library"
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=ON
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- MACOSX_DEPLOYMENT_TARGET=10.8
|
|
||||||
- os: osx
|
|
||||||
name: "Cocoa static library"
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=OFF
|
|
||||||
- CFLAGS=-Werror
|
|
||||||
- MACOSX_DEPLOYMENT_TARGET=10.8
|
|
||||||
script:
|
|
||||||
- if grep -Inr '\s$' src include docs tests examples CMake *.md .gitattributes .gitignore; then
|
|
||||||
echo Trailing whitespace found, aborting;
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} -DGLFW_USE_WAYLAND=${USE_WAYLAND} -DGLFW_USE_OSMESA=${USE_OSMESA} ..
|
|
||||||
- cmake --build .
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
recipients:
|
|
||||||
- ci@glfw.org
|
|
||||||
on_success: never
|
|
||||||
on_failure: always
|
|
||||||
@@ -23,8 +23,23 @@ endif()
|
|||||||
|
|
||||||
file(STRINGS "${source_path}" lines)
|
file(STRINGS "${source_path}" lines)
|
||||||
foreach(line ${lines})
|
foreach(line ${lines})
|
||||||
if ("${line}" MATCHES "^[0-9a-fA-F].*$")
|
if (line MATCHES "^[0-9a-fA-F]")
|
||||||
set(GLFW_GAMEPAD_MAPPINGS "${GLFW_GAMEPAD_MAPPINGS}\"${line}\",\n")
|
if (line MATCHES "platform:Windows")
|
||||||
|
if (GLFW_WIN32_MAPPINGS)
|
||||||
|
set(GLFW_WIN32_MAPPINGS "${GLFW_WIN32_MAPPINGS}\n")
|
||||||
|
endif()
|
||||||
|
set(GLFW_WIN32_MAPPINGS "${GLFW_WIN32_MAPPINGS}\"${line}\",")
|
||||||
|
elseif (line MATCHES "platform:Mac OS X")
|
||||||
|
if (GLFW_COCOA_MAPPINGS)
|
||||||
|
set(GLFW_COCOA_MAPPINGS "${GLFW_COCOA_MAPPINGS}\n")
|
||||||
|
endif()
|
||||||
|
set(GLFW_COCOA_MAPPINGS "${GLFW_COCOA_MAPPINGS}\"${line}\",")
|
||||||
|
elseif (line MATCHES "platform:Linux")
|
||||||
|
if (GLFW_LINUX_MAPPINGS)
|
||||||
|
set(GLFW_LINUX_MAPPINGS "${GLFW_LINUX_MAPPINGS}\n")
|
||||||
|
endif()
|
||||||
|
set(GLFW_LINUX_MAPPINGS "${GLFW_LINUX_MAPPINGS}\"${line}\",")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
include(CMakeFindDependencyMacro)
|
|
||||||
find_dependency(Threads)
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/glfw3Targets.cmake")
|
|
||||||
@@ -13,5 +13,5 @@ if (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
|||||||
endif (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
endif (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(EPOLLSHIM DEFAULT_MSG EPOLLSHIM_LIBRARIES EPOLLSHIM_INCLUDE_DIRS)
|
find_package_handle_standard_args(EpollShim DEFAULT_MSG EPOLLSHIM_LIBRARIES EPOLLSHIM_INCLUDE_DIRS)
|
||||||
mark_as_advanced(EPOLLSHIM_INCLUDE_DIRS EPOLLSHIM_LIBRARIES)
|
mark_as_advanced(EPOLLSHIM_INCLUDE_DIRS EPOLLSHIM_LIBRARIES)
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
find_package(PkgConfig)
|
||||||
|
|
||||||
|
pkg_check_modules(WaylandProtocols QUIET wayland-protocols>=${WaylandProtocols_FIND_VERSION})
|
||||||
|
|
||||||
|
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=pkgdatadir wayland-protocols
|
||||||
|
OUTPUT_VARIABLE WaylandProtocols_PKGDATADIR
|
||||||
|
RESULT_VARIABLE _pkgconfig_failed)
|
||||||
|
if (_pkgconfig_failed)
|
||||||
|
message(FATAL_ERROR "Missing wayland-protocols pkgdatadir")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX REPLACE "[\r\n]" "" WaylandProtocols_PKGDATADIR "${WaylandProtocols_PKGDATADIR}")
|
||||||
|
|
||||||
|
find_package_handle_standard_args(WaylandProtocols
|
||||||
|
FOUND_VAR
|
||||||
|
WaylandProtocols_FOUND
|
||||||
|
REQUIRED_VARS
|
||||||
|
WaylandProtocols_PKGDATADIR
|
||||||
|
VERSION_VAR
|
||||||
|
WaylandProtocols_VERSION
|
||||||
|
HANDLE_COMPONENTS
|
||||||
|
)
|
||||||
|
|
||||||
|
set(WAYLAND_PROTOCOLS_FOUND ${WaylandProtocols_FOUND})
|
||||||
|
set(WAYLAND_PROTOCOLS_PKGDATADIR ${WaylandProtocols_PKGDATADIR})
|
||||||
|
set(WAYLAND_PROTOCOLS_VERSION ${WaylandProtocols_VERSION})
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# - Try to find XKBCommon
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# XKBCOMMON_FOUND - System has XKBCommon
|
||||||
|
# XKBCOMMON_INCLUDE_DIRS - The XKBCommon include directories
|
||||||
|
# XKBCOMMON_LIBRARIES - The libraries needed to use XKBCommon
|
||||||
|
# XKBCOMMON_DEFINITIONS - Compiler switches required for using XKBCommon
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(PC_XKBCOMMON QUIET xkbcommon)
|
||||||
|
set(XKBCOMMON_DEFINITIONS ${PC_XKBCOMMON_CFLAGS_OTHER})
|
||||||
|
|
||||||
|
find_path(XKBCOMMON_INCLUDE_DIR
|
||||||
|
NAMES xkbcommon/xkbcommon.h
|
||||||
|
HINTS ${PC_XKBCOMMON_INCLUDE_DIR} ${PC_XKBCOMMON_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(XKBCOMMON_LIBRARY
|
||||||
|
NAMES xkbcommon
|
||||||
|
HINTS ${PC_XKBCOMMON_LIBRARY} ${PC_XKBCOMMON_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(XKBCOMMON_LIBRARIES ${XKBCOMMON_LIBRARY})
|
||||||
|
set(XKBCOMMON_LIBRARY_DIRS ${XKBCOMMON_LIBRARY_DIRS})
|
||||||
|
set(XKBCOMMON_INCLUDE_DIRS ${XKBCOMMON_INCLUDE_DIR})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(XKBCommon DEFAULT_MSG
|
||||||
|
XKBCOMMON_LIBRARY
|
||||||
|
XKBCOMMON_INCLUDE_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
mark_as_advanced(XKBCOMMON_LIBRARY XKBCOMMON_INCLUDE_DIR)
|
||||||
|
|
||||||
+97
-32
@@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.1...3.17 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.0...3.20 FATAL_ERROR)
|
||||||
|
|
||||||
project(GLFW VERSION 3.4.0 LANGUAGES C)
|
project(GLFW VERSION 3.3.6 LANGUAGES C)
|
||||||
|
|
||||||
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
||||||
|
|
||||||
@@ -18,13 +18,9 @@ endif()
|
|||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
set(GLFW_STANDALONE TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||||
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ${GLFW_STANDALONE})
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
|
||||||
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ${GLFW_STANDALONE})
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
|
||||||
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
||||||
option(GLFW_INSTALL "Generate installation target" ON)
|
option(GLFW_INSTALL "Generate installation target" ON)
|
||||||
option(GLFW_VULKAN_STATIC "Assume the Vulkan loader is linked with the application" OFF)
|
option(GLFW_VULKAN_STATIC "Assume the Vulkan loader is linked with the application" OFF)
|
||||||
@@ -41,6 +37,10 @@ cmake_dependent_option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF
|
|||||||
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
|
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
|
||||||
"MSVC" OFF)
|
"MSVC" OFF)
|
||||||
|
|
||||||
|
if (BUILD_SHARED_LIBS)
|
||||||
|
set(_GLFW_BUILD_DLL 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS AND UNIX)
|
if (BUILD_SHARED_LIBS AND UNIX)
|
||||||
# On Unix-like systems, shared libraries can use the soname system.
|
# On Unix-like systems, shared libraries can use the soname system.
|
||||||
set(GLFW_LIB_NAME glfw)
|
set(GLFW_LIB_NAME glfw)
|
||||||
@@ -67,27 +67,81 @@ if (GLFW_BUILD_DOCS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Set compiler specific flags
|
# Apply Microsoft C runtime library option
|
||||||
|
# This is here because it also applies to tests and examples
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
if (MSVC90)
|
||||||
|
# Workaround for VS 2008 not shipping with the DirectX 9 SDK
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
check_include_file(dinput.h DINPUT_H_FOUND)
|
||||||
|
if (NOT DINPUT_H_FOUND)
|
||||||
|
message(FATAL_ERROR "DirectX 9 headers not found; install DirectX 9 SDK")
|
||||||
|
endif()
|
||||||
|
# Workaround for VS 2008 not shipping with stdint.h
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/vs2008")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
||||||
|
if (CMAKE_VERSION VERSION_LESS 3.15)
|
||||||
foreach (flag CMAKE_C_FLAGS
|
foreach (flag CMAKE_C_FLAGS
|
||||||
CMAKE_C_FLAGS_DEBUG
|
CMAKE_C_FLAGS_DEBUG
|
||||||
CMAKE_C_FLAGS_RELEASE
|
CMAKE_C_FLAGS_RELEASE
|
||||||
CMAKE_C_FLAGS_MINSIZEREL
|
CMAKE_C_FLAGS_MINSIZEREL
|
||||||
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
|
||||||
if (${flag} MATCHES "/MD")
|
if (flag MATCHES "/MD")
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
||||||
endif()
|
endif()
|
||||||
if (${flag} MATCHES "/MDd")
|
if (flag MATCHES "/MDd")
|
||||||
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endforeach()
|
endforeach()
|
||||||
|
else()
|
||||||
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (MINGW)
|
||||||
|
# Workaround for legacy MinGW not providing XInput and DirectInput
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
|
||||||
|
check_include_file(dinput.h DINPUT_H_FOUND)
|
||||||
|
check_include_file(xinput.h XINPUT_H_FOUND)
|
||||||
|
if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/mingw")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Enable link-time exploit mitigation features enabled by default on MSVC
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
|
||||||
|
# Compatibility with data execution prevention (DEP)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
||||||
|
if (_GLFW_HAS_DEP)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Compatibility with address space layout randomization (ASLR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
||||||
|
if (_GLFW_HAS_ASLR)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Compatibility with 64-bit address space layout randomization (ASLR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
||||||
|
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
||||||
|
if (_GLFW_HAS_64ASLR)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Clear flags again to avoid breaking later tests
|
||||||
|
set(CMAKE_REQUIRED_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Detect and select backend APIs
|
# Detect and select backend APIs
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
@@ -153,8 +207,11 @@ if (_GLFW_X11)
|
|||||||
|
|
||||||
find_package(X11 REQUIRED)
|
find_package(X11 REQUIRED)
|
||||||
|
|
||||||
|
list(APPEND glfw_PKG_DEPS "x11")
|
||||||
|
|
||||||
# Set up library and include paths
|
# Set up library and include paths
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
|
list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
|
||||||
|
list(APPEND glfw_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
|
||||||
# Check for XRandR (modern resolution switching and gamma control)
|
# Check for XRandR (modern resolution switching and gamma control)
|
||||||
if (NOT X11_Xrandr_INCLUDE_PATH)
|
if (NOT X11_Xrandr_INCLUDE_PATH)
|
||||||
@@ -181,35 +238,38 @@ if (_GLFW_X11)
|
|||||||
message(FATAL_ERROR "XInput headers not found; install libxi development package")
|
message(FATAL_ERROR "XInput headers not found; install libxi development package")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for X Shape (custom window input shape)
|
list(APPEND glfw_INCLUDE_DIRS "${X11_Xrandr_INCLUDE_PATH}"
|
||||||
if (NOT X11_Xshape_INCLUDE_PATH)
|
"${X11_Xinerama_INCLUDE_PATH}"
|
||||||
message(FATAL_ERROR "X Shape headers not found; install libxext development package")
|
"${X11_Xkb_INCLUDE_PATH}"
|
||||||
endif()
|
"${X11_Xcursor_INCLUDE_PATH}"
|
||||||
|
"${X11_Xi_INCLUDE_PATH}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Use Wayland for window creation
|
# Use Wayland for window creation
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (_GLFW_WAYLAND)
|
if (_GLFW_WAYLAND)
|
||||||
|
find_package(ECM REQUIRED NO_MODULE)
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${ECM_MODULE_PATH}")
|
||||||
|
|
||||||
include(FindPkgConfig)
|
find_package(Wayland REQUIRED Client Cursor Egl)
|
||||||
pkg_check_modules(Wayland REQUIRED
|
find_package(WaylandScanner REQUIRED)
|
||||||
wayland-client>=0.2.7
|
find_package(WaylandProtocols 1.15 REQUIRED)
|
||||||
wayland-cursor>=0.2.7
|
|
||||||
wayland-egl>=0.2.7
|
|
||||||
xkbcommon)
|
|
||||||
|
|
||||||
list(APPEND glfw_PKG_DEPS "wayland-client")
|
list(APPEND glfw_PKG_DEPS "wayland-client")
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIRS}")
|
list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIRS}")
|
||||||
list(APPEND glfw_LIBRARIES "${Wayland_LINK_LIBRARIES}")
|
list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
|
||||||
|
find_package(XKBCommon REQUIRED)
|
||||||
|
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
||||||
|
|
||||||
include(CheckIncludeFiles)
|
include(CheckIncludeFiles)
|
||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
check_include_files(xkbcommon/xkbcommon-compose.h HAVE_XKBCOMMON_COMPOSE_H)
|
check_include_files(xkbcommon/xkbcommon-compose.h HAVE_XKBCOMMON_COMPOSE_H)
|
||||||
check_function_exists(memfd_create HAVE_MEMFD_CREATE)
|
check_function_exists(memfd_create HAVE_MEMFD_CREATE)
|
||||||
|
|
||||||
if (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux"))
|
if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
find_package(EpollShim)
|
find_package(EpollShim)
|
||||||
if (EPOLLSHIM_FOUND)
|
if (EPOLLSHIM_FOUND)
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${EPOLLSHIM_INCLUDE_DIRS}")
|
list(APPEND glfw_INCLUDE_DIRS "${EPOLLSHIM_INCLUDE_DIRS}")
|
||||||
@@ -218,6 +278,14 @@ if (_GLFW_WAYLAND)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Use OSMesa for offscreen context creation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
if (_GLFW_OSMESA)
|
||||||
|
find_package(OSMesa REQUIRED)
|
||||||
|
list(APPEND glfw_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Use Cocoa for window creation and NSOpenGL for context creation
|
# Use Cocoa for window creation and NSOpenGL for context creation
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
@@ -256,7 +324,7 @@ include(CMakePackageConfigHelpers)
|
|||||||
|
|
||||||
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
|
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
|
||||||
|
|
||||||
configure_package_config_file(CMake/glfw3Config.cmake.in
|
configure_package_config_file(src/glfw3Config.cmake.in
|
||||||
src/glfw3Config.cmake
|
src/glfw3Config.cmake
|
||||||
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
||||||
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
||||||
@@ -265,7 +333,9 @@ write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
|||||||
VERSION ${GLFW_VERSION}
|
VERSION ${GLFW_VERSION}
|
||||||
COMPATIBILITY SameMajorVersion)
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
|
||||||
configure_file(CMake/glfw3.pc.in src/glfw3.pc @ONLY)
|
configure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)
|
||||||
|
|
||||||
|
configure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Add subdirectories
|
# Add subdirectories
|
||||||
@@ -302,14 +372,9 @@ if (GLFW_INSTALL)
|
|||||||
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
|
|
||||||
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
|
|
||||||
install(DIRECTORY "${GLFW_BINARY_DIR}/docs/html"
|
|
||||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Only generate this target if no higher-level project already has
|
# Only generate this target if no higher-level project already has
|
||||||
if (NOT TARGET uninstall)
|
if (NOT TARGET uninstall)
|
||||||
configure_file(CMake/cmake_uninstall.cmake.in
|
configure_file(cmake_uninstall.cmake.in
|
||||||
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
||||||
|
|
||||||
add_custom_target(uninstall
|
add_custom_target(uninstall
|
||||||
|
|||||||
+226
@@ -0,0 +1,226 @@
|
|||||||
|
# Acknowledgements
|
||||||
|
|
||||||
|
GLFW exists because people around the world donated their time and lent their
|
||||||
|
skills. This list only includes contributions to the main repository and
|
||||||
|
excludes other invaluable contributions like language bindings and text and
|
||||||
|
video tutorials.
|
||||||
|
|
||||||
|
- Bobyshev Alexander
|
||||||
|
- Laurent Aphecetche
|
||||||
|
- Matt Arsenault
|
||||||
|
- ashishgamedev
|
||||||
|
- David Avedissian
|
||||||
|
- Keith Bauer
|
||||||
|
- John Bartholomew
|
||||||
|
- Coşku Baş
|
||||||
|
- Niklas Behrens
|
||||||
|
- Andrew Belt
|
||||||
|
- Nevyn Bengtsson
|
||||||
|
- Niklas Bergström
|
||||||
|
- Denis Bernard
|
||||||
|
- Doug Binks
|
||||||
|
- blanco
|
||||||
|
- Waris Boonyasiriwat
|
||||||
|
- Kyle Brenneman
|
||||||
|
- Rok Breulj
|
||||||
|
- Kai Burjack
|
||||||
|
- Martin Capitanio
|
||||||
|
- Nicolas Caramelli
|
||||||
|
- David Carlier
|
||||||
|
- Arturo Castro
|
||||||
|
- Chi-kwan Chan
|
||||||
|
- Joseph Chua
|
||||||
|
- Ian Clarkson
|
||||||
|
- Michał Cichoń
|
||||||
|
- Lambert Clara
|
||||||
|
- Anna Clarke
|
||||||
|
- Josh Codd
|
||||||
|
- Yaron Cohen-Tal
|
||||||
|
- Omar Cornut
|
||||||
|
- Andrew Corrigan
|
||||||
|
- Bailey Cosier
|
||||||
|
- Noel Cower
|
||||||
|
- CuriouserThing
|
||||||
|
- Jason Daly
|
||||||
|
- Jarrod Davis
|
||||||
|
- Olivier Delannoy
|
||||||
|
- Paul R. Deppe
|
||||||
|
- Michael Dickens
|
||||||
|
- Роман Донченко
|
||||||
|
- Mario Dorn
|
||||||
|
- Wolfgang Draxinger
|
||||||
|
- Jonathan Dummer
|
||||||
|
- Ralph Eastwood
|
||||||
|
- Fredrik Ehnbom
|
||||||
|
- Robin Eklind
|
||||||
|
- Jan Ekström
|
||||||
|
- Siavash Eliasi
|
||||||
|
- TheExileFox
|
||||||
|
- Felipe Ferreira
|
||||||
|
- Michael Fogleman
|
||||||
|
- Gerald Franz
|
||||||
|
- Mário Freitas
|
||||||
|
- GeO4d
|
||||||
|
- Marcus Geelnard
|
||||||
|
- ghuser404
|
||||||
|
- Charles Giessen
|
||||||
|
- Ryan C. Gordon
|
||||||
|
- Stephen Gowen
|
||||||
|
- Kovid Goyal
|
||||||
|
- Eloi Marín Gratacós
|
||||||
|
- Stefan Gustavson
|
||||||
|
- Andrew Gutekanst
|
||||||
|
- Stephen Gutekanst
|
||||||
|
- Jonathan Hale
|
||||||
|
- hdf89shfdfs
|
||||||
|
- Sylvain Hellegouarch
|
||||||
|
- Matthew Henry
|
||||||
|
- heromyth
|
||||||
|
- Lucas Hinderberger
|
||||||
|
- Paul Holden
|
||||||
|
- Warren Hu
|
||||||
|
- Charles Huber
|
||||||
|
- InKryption
|
||||||
|
- IntellectualKitty
|
||||||
|
- Aaron Jacobs
|
||||||
|
- Erik S. V. Jansson
|
||||||
|
- Toni Jovanoski
|
||||||
|
- Arseny Kapoulkine
|
||||||
|
- Cem Karan
|
||||||
|
- Osman Keskin
|
||||||
|
- Koray Kilinc
|
||||||
|
- Josh Kilmer
|
||||||
|
- Byunghoon Kim
|
||||||
|
- Cameron King
|
||||||
|
- Peter Knut
|
||||||
|
- Christoph Kubisch
|
||||||
|
- Yuri Kunde Schlesner
|
||||||
|
- Rokas Kupstys
|
||||||
|
- Konstantin Käfer
|
||||||
|
- Eric Larson
|
||||||
|
- Francis Lecavalier
|
||||||
|
- Jong Won Lee
|
||||||
|
- Robin Leffmann
|
||||||
|
- Glenn Lewis
|
||||||
|
- Shane Liesegang
|
||||||
|
- Anders Lindqvist
|
||||||
|
- Leon Linhart
|
||||||
|
- Marco Lizza
|
||||||
|
- Eyal Lotem
|
||||||
|
- Aaron Loucks
|
||||||
|
- Luflosi
|
||||||
|
- lukect
|
||||||
|
- Tristam MacDonald
|
||||||
|
- Hans Mackowiak
|
||||||
|
- Дмитри Малышев
|
||||||
|
- Zbigniew Mandziejewicz
|
||||||
|
- Adam Marcus
|
||||||
|
- Célestin Marot
|
||||||
|
- Kyle McDonald
|
||||||
|
- David V. McKay
|
||||||
|
- David Medlock
|
||||||
|
- Bryce Mehring
|
||||||
|
- Jonathan Mercier
|
||||||
|
- Marcel Metz
|
||||||
|
- Liam Middlebrook
|
||||||
|
- Ave Milia
|
||||||
|
- Jonathan Miller
|
||||||
|
- Kenneth Miller
|
||||||
|
- Bruce Mitchener
|
||||||
|
- Jack Moffitt
|
||||||
|
- Jeff Molofee
|
||||||
|
- Alexander Monakov
|
||||||
|
- Pierre Morel
|
||||||
|
- Jon Morton
|
||||||
|
- Pierre Moulon
|
||||||
|
- Martins Mozeiko
|
||||||
|
- Julian Møller
|
||||||
|
- ndogxj
|
||||||
|
- Kristian Nielsen
|
||||||
|
- Kamil Nowakowski
|
||||||
|
- onox
|
||||||
|
- Denis Ovod
|
||||||
|
- Ozzy
|
||||||
|
- Andri Pálsson
|
||||||
|
- Peoro
|
||||||
|
- Braden Pellett
|
||||||
|
- Christopher Pelloux
|
||||||
|
- Arturo J. Pérez
|
||||||
|
- Vladimir Perminov
|
||||||
|
- Anthony Pesch
|
||||||
|
- Orson Peters
|
||||||
|
- Emmanuel Gil Peyrot
|
||||||
|
- Cyril Pichard
|
||||||
|
- Keith Pitt
|
||||||
|
- Stanislav Podgorskiy
|
||||||
|
- Konstantin Podsvirov
|
||||||
|
- Nathan Poirier
|
||||||
|
- Alexandre Pretyman
|
||||||
|
- Pablo Prietz
|
||||||
|
- przemekmirek
|
||||||
|
- pthom
|
||||||
|
- Guillaume Racicot
|
||||||
|
- Philip Rideout
|
||||||
|
- Eddie Ringle
|
||||||
|
- Max Risuhin
|
||||||
|
- Jorge Rodriguez
|
||||||
|
- Luca Rood
|
||||||
|
- Ed Ropple
|
||||||
|
- Aleksey Rybalkin
|
||||||
|
- Mikko Rytkönen
|
||||||
|
- Riku Salminen
|
||||||
|
- Brandon Schaefer
|
||||||
|
- Sebastian Schuberth
|
||||||
|
- Christian Sdunek
|
||||||
|
- Matt Sealey
|
||||||
|
- Steve Sexton
|
||||||
|
- Arkady Shapkin
|
||||||
|
- Ali Sherief
|
||||||
|
- Yoshiki Shibukawa
|
||||||
|
- Dmitri Shuralyov
|
||||||
|
- Daniel Skorupski
|
||||||
|
- Bradley Smith
|
||||||
|
- Cliff Smolinsky
|
||||||
|
- Patrick Snape
|
||||||
|
- Erlend Sogge Heggen
|
||||||
|
- Julian Squires
|
||||||
|
- Johannes Stein
|
||||||
|
- Pontus Stenetorp
|
||||||
|
- Michael Stocker
|
||||||
|
- Justin Stoecker
|
||||||
|
- Elviss Strazdins
|
||||||
|
- Paul Sultana
|
||||||
|
- Nathan Sweet
|
||||||
|
- TTK-Bandit
|
||||||
|
- Sergey Tikhomirov
|
||||||
|
- Arthur Tombs
|
||||||
|
- Ioannis Tsakpinis
|
||||||
|
- Samuli Tuomola
|
||||||
|
- Matthew Turner
|
||||||
|
- urraka
|
||||||
|
- Elias Vanderstuyft
|
||||||
|
- Stef Velzel
|
||||||
|
- Jari Vetoniemi
|
||||||
|
- Ricardo Vieira
|
||||||
|
- Nicholas Vitovitch
|
||||||
|
- Simon Voordouw
|
||||||
|
- Corentin Wallez
|
||||||
|
- Torsten Walluhn
|
||||||
|
- Patrick Walton
|
||||||
|
- Xo Wang
|
||||||
|
- Jay Weisskopf
|
||||||
|
- Frank Wille
|
||||||
|
- Richard A. Wilkes
|
||||||
|
- Tatsuya Yatagawa
|
||||||
|
- Ryogo Yoshimura
|
||||||
|
- Rácz Zalán
|
||||||
|
- Lukas Zanner
|
||||||
|
- Andrey Zholos
|
||||||
|
- Aihui Zhu
|
||||||
|
- Santi Zupancic
|
||||||
|
- Jonas Ådahl
|
||||||
|
- Lasse Öörni
|
||||||
|
- Leonard König
|
||||||
|
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
||||||
|
reports, patches, feedback, testing and encouragement
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# GLFW
|
# GLFW
|
||||||
|
|
||||||
[](https://travis-ci.org/glfw/glfw)
|
[](https://github.com/glfw/glfw/actions)
|
||||||
[](https://ci.appveyor.com/project/elmindreda/glfw)
|
[](https://ci.appveyor.com/project/elmindreda/glfw)
|
||||||
[](https://scan.coverity.com/projects/glfw-glfw)
|
[](https://scan.coverity.com/projects/glfw-glfw)
|
||||||
|
|
||||||
@@ -14,18 +14,18 @@ GLFW natively supports Windows, macOS and Linux and other Unix-like systems. On
|
|||||||
Linux both X11 and Wayland are supported.
|
Linux both X11 and Wayland are supported.
|
||||||
|
|
||||||
GLFW is licensed under the [zlib/libpng
|
GLFW is licensed under the [zlib/libpng
|
||||||
license](http://www.glfw.org/license.html).
|
license](https://www.glfw.org/license.html).
|
||||||
|
|
||||||
You can [download](http://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, or fetch the `latest` branch from GitHub. Each
|
as source or Windows binaries, or fetch the `latest` branch from GitHub. Each
|
||||||
release starting with 3.0 also has a corresponding [annotated
|
release starting with 3.0 also has a corresponding [annotated
|
||||||
tag](https://github.com/glfw/glfw/releases) with source and binary archives.
|
tag](https://github.com/glfw/glfw/releases) with source and binary archives.
|
||||||
|
|
||||||
The [documentation](http://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
|
included in all source and binary archives. See the [release
|
||||||
notes](https://www.glfw.org/docs/latest/news.html) for new features, caveats and
|
notes](https://www.glfw.org/docs/latest/news.html) for new features, caveats and
|
||||||
deprecations in the latest release. For more details see the [version
|
deprecations in the latest release. For more details see the [version
|
||||||
history](http://www.glfw.org/changelog.html).
|
history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
The `master` branch is the stable integration branch and _should_ always compile
|
The `master` branch is the stable integration branch and _should_ always compile
|
||||||
and run on all supported platforms, although details of newly added features may
|
and run on all supported platforms, although details of newly added features may
|
||||||
@@ -34,11 +34,16 @@ fixes live in [other branches](https://github.com/glfw/glfw/branches/all) until
|
|||||||
they are stable enough to merge.
|
they are stable enough to merge.
|
||||||
|
|
||||||
If you are new to GLFW, you may find the
|
If you are new to GLFW, you may find the
|
||||||
[tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW 3 useful. If
|
[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
|
you have used GLFW 2 in the past, there is a [transition
|
||||||
guide](http://www.glfw.org/docs/latest/moving.html) for moving to the GLFW
|
guide](https://www.glfw.org/docs/latest/moving.html) for moving to the GLFW
|
||||||
3 API.
|
3 API.
|
||||||
|
|
||||||
|
GLFW exists because of the contributions of [many people](CONTRIBUTORS.md)
|
||||||
|
around the world, whether by reporting bugs, providing community support, adding
|
||||||
|
features, reviewing or testing code, debugging, proofreading docs, suggesting
|
||||||
|
features or fixing bugs.
|
||||||
|
|
||||||
|
|
||||||
## Compiling GLFW
|
## Compiling GLFW
|
||||||
|
|
||||||
@@ -52,16 +57,16 @@ 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
|
and Clang. It will likely compile in other environments as well, but this is
|
||||||
not regularly tested.
|
not regularly tested.
|
||||||
|
|
||||||
There are [pre-compiled Windows binaries](http://www.glfw.org/download.html)
|
There are [pre-compiled Windows binaries](https://www.glfw.org/download.html)
|
||||||
available for all supported compilers.
|
available for all supported compilers.
|
||||||
|
|
||||||
See the [compilation guide](http://www.glfw.org/docs/latest/compile.html) for
|
See the [compilation guide](https://www.glfw.org/docs/latest/compile.html) for
|
||||||
more information about how to compile GLFW yourself.
|
more information about how to compile GLFW yourself.
|
||||||
|
|
||||||
|
|
||||||
## Using GLFW
|
## Using GLFW
|
||||||
|
|
||||||
See the [documentation](http://www.glfw.org/docs/latest/) for tutorials, guides
|
See the [documentation](https://www.glfw.org/docs/latest/) for tutorials, guides
|
||||||
and the API reference.
|
and the API reference.
|
||||||
|
|
||||||
|
|
||||||
@@ -79,14 +84,16 @@ Unix-like systems running the X Window System are supported even without
|
|||||||
a desktop environment or modern extensions, although some features require
|
a desktop environment or modern extensions, although some features require
|
||||||
a running window or clipboard manager. The OSMesa backend requires Mesa 6.3.
|
a running window or clipboard manager. The OSMesa backend requires Mesa 6.3.
|
||||||
|
|
||||||
See the [compatibility guide](http://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.
|
in the documentation for more information.
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
GLFW itself needs only CMake 3.1 or later and the headers and libraries for your
|
GLFW itself depends only on the headers and libraries for your window system.
|
||||||
OS and window system.
|
|
||||||
|
The (experimental) Wayland backend also depends on the `extra-cmake-modules`
|
||||||
|
package, which is used to generate Wayland protocol headers.
|
||||||
|
|
||||||
The examples and test programs depend on a number of tiny libraries. These are
|
The examples and test programs depend on a number of tiny libraries. These are
|
||||||
located in the `deps/` directory.
|
located in the `deps/` directory.
|
||||||
@@ -99,10 +106,10 @@ located in the `deps/` directory.
|
|||||||
functions
|
functions
|
||||||
- [linmath.h](https://github.com/datenwolf/linmath.h) for linear algebra in
|
- [linmath.h](https://github.com/datenwolf/linmath.h) for linear algebra in
|
||||||
examples
|
examples
|
||||||
- [Nuklear](https://github.com/vurtun/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](http://doxygen.org/) if CMake can
|
The documentation is generated with [Doxygen](https://doxygen.org/) if CMake can
|
||||||
find that tool.
|
find that tool.
|
||||||
|
|
||||||
|
|
||||||
@@ -116,115 +123,24 @@ information on what to include when reporting a bug.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
- Added `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR`,
|
- Bugfix: Joysticks connected before init did not get gamepad mappings (#1996)
|
||||||
`GLFW_RESIZE_ALL_CURSOR` and `GLFW_NOT_ALLOWED_CURSOR` cursor shapes (#427)
|
- [Win32] Bugfix: Content scale queries could fail silently (#1615)
|
||||||
- Added `GLFW_RESIZE_EW_CURSOR` alias for `GLFW_HRESIZE_CURSOR` (#427)
|
- [Win32] Bugfix: Content scales could have garbage values if monitor was recently
|
||||||
- Added `GLFW_RESIZE_NS_CURSOR` alias for `GLFW_VRESIZE_CURSOR` (#427)
|
disconnected (#1615)
|
||||||
- Added `GLFW_POINTING_HAND_CURSOR` alias for `GLFW_HAND_CURSOR` (#427)
|
- [Cocoa] Bugfix: A dependency on an external constant caused crashes on macOS
|
||||||
- Added `GLFW_MOUSE_PASSTHROUGH` window hint for letting mouse input pass
|
11 and earlier (#1985,#1994)
|
||||||
through the window (#1236,#1568)
|
- [X11] Bugfix: Icon pixel format conversion worked only by accident, relying on
|
||||||
- Added `GLFW_FEATURE_UNAVAILABLE` error for platform limitations (#1692)
|
undefined behavior (#1986)
|
||||||
- Added `GLFW_FEATURE_UNIMPLEMENTED` error for incomplete backends (#1692)
|
|
||||||
- Added `GLFW_ANGLE_PLATFORM_TYPE` init hint and `GLFW_ANGLE_PLATFORM_TYPE_*`
|
|
||||||
values to select ANGLE backend (#1380)
|
|
||||||
- Made joystick subsystem initialize at first use (#1284,#1646)
|
|
||||||
- Updated the minimum required CMake version to 3.1
|
|
||||||
- Disabled tests and examples by default when built as a CMake subdirectory
|
|
||||||
- Bugfix: The CMake config-file package used an absolute path and was not
|
|
||||||
relocatable (#1470)
|
|
||||||
- Bugfix: Video modes with a duplicate screen area were discarded (#1555,#1556)
|
|
||||||
- Bugfix: Compiling with -Wextra-semi caused warnings (#1440)
|
|
||||||
- Bugfix: Built-in mappings failed because some OEMs re-used VID/PID (#1583)
|
|
||||||
- Bugfix: Some extension loader headers did not prevent default OpenGL header
|
|
||||||
inclusion (#1695)
|
|
||||||
- [Win32] Added the `GLFW_WIN32_KEYBOARD_MENU` window hint for enabling access
|
|
||||||
to the window menu
|
|
||||||
- [Win32] Added a version info resource to the GLFW DLL
|
|
||||||
- [Win32] Disabled framebuffer transparency on Windows 7 when DWM windows are
|
|
||||||
opaque (#1512)
|
|
||||||
- [Win32] Bugfix: `GLFW_INCLUDE_VULKAN` plus `VK_USE_PLATFORM_WIN32_KHR` caused
|
|
||||||
symbol redefinition (#1524)
|
|
||||||
- [Win32] Bugfix: The cursor position event was emitted before its cursor enter
|
|
||||||
event (#1490)
|
|
||||||
- [Win32] Bugfix: The window hint `GLFW_MAXIMIZED` did not move or resize the
|
|
||||||
window (#1499)
|
|
||||||
- [Win32] Bugfix: Disabled cursor mode interfered with some non-client actions
|
|
||||||
- [Win32] Bugfix: Super key was not released after Win+V hotkey (#1622)
|
|
||||||
- [Win32] Bugfix: `glfwGetKeyName` could access out of bounds and return an
|
|
||||||
invalid pointer
|
|
||||||
- [Win32] Bugfix: Some synthetic key events were reported as `GLFW_KEY_UNKNOWN`
|
|
||||||
(#1623)
|
|
||||||
- [Win32] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
|
|
||||||
- [Win32] Bugfix: Monitor functions could return invalid values after
|
|
||||||
configuration change (#1761)
|
|
||||||
- [Win32] Bugfix: Initialization would segfault on Windows 8 (not 8.1) (#1775)
|
|
||||||
- [Cocoa] Added support for `VK_EXT_metal_surface` (#1619)
|
|
||||||
- [Cocoa] Added locating the Vulkan loader at runtime in an application bundle
|
|
||||||
- [Cocoa] Moved main menu creation to GLFW initialization time (#1649)
|
|
||||||
- [Cocoa] Changed `EGLNativeWindowType` from `NSView` to `CALayer` (#1169)
|
|
||||||
- [Cocoa] Removed dependency on the CoreVideo framework
|
|
||||||
- [Cocoa] Bugfix: `glfwSetWindowSize` used a bottom-left anchor point (#1553)
|
|
||||||
- [Cocoa] Bugfix: Window remained on screen after destruction until event poll
|
|
||||||
(#1412)
|
|
||||||
- [Cocoa] Bugfix: Event processing before window creation would assert (#1543)
|
|
||||||
- [Cocoa] Bugfix: Undecorated windows could not be iconified on recent macOS
|
|
||||||
- [Cocoa] Bugfix: Touching event queue from secondary thread before main thread
|
|
||||||
would abort (#1649)
|
|
||||||
- [Cocoa] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
|
|
||||||
(#1635)
|
|
||||||
- [Cocoa] Bugfix: Failing to retrieve the refresh rate of built-in displays
|
|
||||||
could leak memory
|
|
||||||
- [X11] Bugfix: The CMake files did not check for the XInput headers (#1480)
|
|
||||||
- [X11] Bugfix: Key names were not updated when the keyboard layout changed
|
|
||||||
(#1462,#1528)
|
|
||||||
- [X11] Bugfix: Decorations could not be enabled after window creation (#1566)
|
|
||||||
- [X11] Bugfix: Content scale fallback value could be inconsistent (#1578)
|
|
||||||
- [X11] Bugfix: `glfwMaximizeWindow` had no effect on hidden windows
|
|
||||||
- [X11] Bugfix: Clearing `GLFW_FLOATING` on a hidden window caused invalid read
|
|
||||||
- [X11] Bugfix: Changing `GLFW_FLOATING` on a hidden window could silently fail
|
|
||||||
- [X11] Bugfix: Disabled cursor mode was interrupted by indicator windows
|
|
||||||
- [X11] Bugfix: Monitor physical dimensions could be reported as zero mm
|
|
||||||
- [X11] Bugfix: Window position events were not emitted during resizing (#1613)
|
|
||||||
- [X11] Bugfix: `glfwFocusWindow` could terminate on older WMs or without a WM
|
|
||||||
- [X11] Bugfix: Querying a disconnected monitor could segfault (#1602)
|
|
||||||
- [X11] Bugfix: IME input of CJK was broken for "C" locale (#1587,#1636)
|
|
||||||
- [X11] Bugfix: Termination would segfault if the IM had been destroyed
|
|
||||||
- [X11] Bugfix: Any IM started after initialization would not be detected
|
|
||||||
- [X11] Bugfix: Xlib errors caused by other parts of the application could be
|
|
||||||
reported as GLFW errors
|
|
||||||
- [X11] Bugfix: A handle race condition could cause a `BadWindow` error (#1633)
|
|
||||||
- [X11] Bugfix: XKB path used keysyms instead of physical locations for
|
|
||||||
non-printable keys (#1598)
|
|
||||||
- [X11] Bugfix: Function keys were mapped to `GLFW_KEY_UNKNOWN` for some layout
|
|
||||||
combinaitons (#1598)
|
|
||||||
- [X11] Bugfix: Keys pressed simultaneously with others were not always
|
|
||||||
reported (#1112,#1415,#1472,#1616)
|
|
||||||
- [Wayland] Removed support for `wl_shell` (#1443)
|
|
||||||
- [Wayland] Bugfix: The `GLFW_HAND_CURSOR` shape used the wrong image (#1432)
|
|
||||||
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
|
|
||||||
- [Wayland] Bugfix: Repeated keys could be reported with `NULL` window (#1704)
|
|
||||||
- [Wayland] Bugfix: Retrieving partial framebuffer size would segfault
|
|
||||||
- [Wayland] Bugfix: Scrolling offsets were inverted compared to other platforms
|
|
||||||
(#1463)
|
|
||||||
- [POSIX] Bugfix: `CLOCK_MONOTONIC` was not correctly tested for or enabled
|
|
||||||
- [NSGL] Removed enforcement of forward-compatible flag for core contexts
|
|
||||||
- [NSGL] Bugfix: `GLFW_COCOA_RETINA_FRAMEBUFFER` had no effect on newer
|
|
||||||
macOS versions (#1442)
|
|
||||||
- [NSGL] Bugfix: Workaround for swap interval on 10.14 broke on 10.12 (#1483)
|
|
||||||
- [EGL] Added platform selection via the `EGL_EXT_platform_base` extension
|
|
||||||
(#442)
|
|
||||||
- [EGL] Added ANGLE backend selection via `EGL_ANGLE_platform_angle` extension
|
|
||||||
(#1380)
|
|
||||||
|
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
On [glfw.org](http://www.glfw.org/) you can find the latest version of GLFW, as
|
On [glfw.org](https://www.glfw.org/) you can find the latest version of GLFW, as
|
||||||
well as news, documentation and other information about the project.
|
well as news, documentation and other information about the project.
|
||||||
|
|
||||||
If you have questions related to the use of GLFW, we have a
|
If you have questions related to the use of GLFW, we have a
|
||||||
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
||||||
[Freenode](http://freenode.net/).
|
[Libera.Chat](https://libera.chat/).
|
||||||
|
|
||||||
If you have a bug to report, a patch to submit or a feature you'd like to
|
If you have a bug to report, a patch to submit or a feature you'd like to
|
||||||
request, please file it in the
|
request, please file it in the
|
||||||
@@ -233,209 +149,3 @@ request, please file it in the
|
|||||||
Finally, if you're interested in helping out with the development of GLFW or
|
Finally, if you're interested in helping out with the development of GLFW or
|
||||||
porting it to your favorite platform, join us on the forum, GitHub or IRC.
|
porting it to your favorite platform, join us on the forum, GitHub or IRC.
|
||||||
|
|
||||||
|
|
||||||
## Acknowledgements
|
|
||||||
|
|
||||||
GLFW exists because people around the world donated their time and lent their
|
|
||||||
skills.
|
|
||||||
|
|
||||||
- Bobyshev Alexander
|
|
||||||
- Matt Arsenault
|
|
||||||
- David Avedissian
|
|
||||||
- Keith Bauer
|
|
||||||
- John Bartholomew
|
|
||||||
- Coşku Baş
|
|
||||||
- Niklas Behrens
|
|
||||||
- Andrew Belt
|
|
||||||
- Niklas Bergström
|
|
||||||
- Denis Bernard
|
|
||||||
- Doug Binks
|
|
||||||
- blanco
|
|
||||||
- Kyle Brenneman
|
|
||||||
- Rok Breulj
|
|
||||||
- Kai Burjack
|
|
||||||
- Martin Capitanio
|
|
||||||
- Nicolas Caramelli
|
|
||||||
- David Carlier
|
|
||||||
- Arturo Castro
|
|
||||||
- Chi-kwan Chan
|
|
||||||
- Ian Clarkson
|
|
||||||
- Michał Cichoń
|
|
||||||
- Lambert Clara
|
|
||||||
- Anna Clarke
|
|
||||||
- Yaron Cohen-Tal
|
|
||||||
- Omar Cornut
|
|
||||||
- Andrew Corrigan
|
|
||||||
- Bailey Cosier
|
|
||||||
- Noel Cower
|
|
||||||
- Jason Daly
|
|
||||||
- Jarrod Davis
|
|
||||||
- Olivier Delannoy
|
|
||||||
- Paul R. Deppe
|
|
||||||
- Michael Dickens
|
|
||||||
- Роман Донченко
|
|
||||||
- Mario Dorn
|
|
||||||
- Wolfgang Draxinger
|
|
||||||
- Jonathan Dummer
|
|
||||||
- Ralph Eastwood
|
|
||||||
- Fredrik Ehnbom
|
|
||||||
- Robin Eklind
|
|
||||||
- Siavash Eliasi
|
|
||||||
- Felipe Ferreira
|
|
||||||
- Michael Fogleman
|
|
||||||
- Gerald Franz
|
|
||||||
- Mário Freitas
|
|
||||||
- GeO4d
|
|
||||||
- Marcus Geelnard
|
|
||||||
- Charles Giessen
|
|
||||||
- Ryan C. Gordon
|
|
||||||
- Stephen Gowen
|
|
||||||
- Kovid Goyal
|
|
||||||
- Eloi Marín Gratacós
|
|
||||||
- Stefan Gustavson
|
|
||||||
- Jonathan Hale
|
|
||||||
- Sylvain Hellegouarch
|
|
||||||
- Matthew Henry
|
|
||||||
- heromyth
|
|
||||||
- Lucas Hinderberger
|
|
||||||
- Paul Holden
|
|
||||||
- Warren Hu
|
|
||||||
- Charles Huber
|
|
||||||
- IntellectualKitty
|
|
||||||
- Aaron Jacobs
|
|
||||||
- Erik S. V. Jansson
|
|
||||||
- Toni Jovanoski
|
|
||||||
- Arseny Kapoulkine
|
|
||||||
- Cem Karan
|
|
||||||
- Osman Keskin
|
|
||||||
- Josh Kilmer
|
|
||||||
- Byunghoon Kim
|
|
||||||
- Cameron King
|
|
||||||
- Peter Knut
|
|
||||||
- Christoph Kubisch
|
|
||||||
- Yuri Kunde Schlesner
|
|
||||||
- Rokas Kupstys
|
|
||||||
- Konstantin Käfer
|
|
||||||
- Eric Larson
|
|
||||||
- Francis Lecavalier
|
|
||||||
- Robin Leffmann
|
|
||||||
- Glenn Lewis
|
|
||||||
- Shane Liesegang
|
|
||||||
- Anders Lindqvist
|
|
||||||
- Leon Linhart
|
|
||||||
- Eyal Lotem
|
|
||||||
- Aaron Loucks
|
|
||||||
- Luflosi
|
|
||||||
- lukect
|
|
||||||
- Tristam MacDonald
|
|
||||||
- Hans Mackowiak
|
|
||||||
- Дмитри Малышев
|
|
||||||
- Zbigniew Mandziejewicz
|
|
||||||
- Adam Marcus
|
|
||||||
- Célestin Marot
|
|
||||||
- Kyle McDonald
|
|
||||||
- David Medlock
|
|
||||||
- Bryce Mehring
|
|
||||||
- Jonathan Mercier
|
|
||||||
- Marcel Metz
|
|
||||||
- Liam Middlebrook
|
|
||||||
- Ave Milia
|
|
||||||
- Jonathan Miller
|
|
||||||
- Kenneth Miller
|
|
||||||
- Bruce Mitchener
|
|
||||||
- Jack Moffitt
|
|
||||||
- Jeff Molofee
|
|
||||||
- Alexander Monakov
|
|
||||||
- Pierre Morel
|
|
||||||
- Jon Morton
|
|
||||||
- Pierre Moulon
|
|
||||||
- Martins Mozeiko
|
|
||||||
- Julian Møller
|
|
||||||
- ndogxj
|
|
||||||
- Kristian Nielsen
|
|
||||||
- Kamil Nowakowski
|
|
||||||
- onox
|
|
||||||
- Denis Ovod
|
|
||||||
- Ozzy
|
|
||||||
- Andri Pálsson
|
|
||||||
- Peoro
|
|
||||||
- Braden Pellett
|
|
||||||
- Christopher Pelloux
|
|
||||||
- Arturo J. Pérez
|
|
||||||
- Vladimir Perminov
|
|
||||||
- Anthony Pesch
|
|
||||||
- Orson Peters
|
|
||||||
- Emmanuel Gil Peyrot
|
|
||||||
- Cyril Pichard
|
|
||||||
- Keith Pitt
|
|
||||||
- Stanislav Podgorskiy
|
|
||||||
- Konstantin Podsvirov
|
|
||||||
- Nathan Poirier
|
|
||||||
- Alexandre Pretyman
|
|
||||||
- Pablo Prietz
|
|
||||||
- przemekmirek
|
|
||||||
- pthom
|
|
||||||
- Guillaume Racicot
|
|
||||||
- Philip Rideout
|
|
||||||
- Eddie Ringle
|
|
||||||
- Max Risuhin
|
|
||||||
- Jorge Rodriguez
|
|
||||||
- Luca Rood
|
|
||||||
- Ed Ropple
|
|
||||||
- Aleksey Rybalkin
|
|
||||||
- Mikko Rytkönen
|
|
||||||
- Riku Salminen
|
|
||||||
- Brandon Schaefer
|
|
||||||
- Sebastian Schuberth
|
|
||||||
- Christian Sdunek
|
|
||||||
- Matt Sealey
|
|
||||||
- Steve Sexton
|
|
||||||
- Arkady Shapkin
|
|
||||||
- Ali Sherief
|
|
||||||
- Yoshiki Shibukawa
|
|
||||||
- Dmitri Shuralyov
|
|
||||||
- Daniel Skorupski
|
|
||||||
- Bradley Smith
|
|
||||||
- Cliff Smolinsky
|
|
||||||
- Patrick Snape
|
|
||||||
- Erlend Sogge Heggen
|
|
||||||
- Julian Squires
|
|
||||||
- Johannes Stein
|
|
||||||
- Pontus Stenetorp
|
|
||||||
- Michael Stocker
|
|
||||||
- Justin Stoecker
|
|
||||||
- Elviss Strazdins
|
|
||||||
- Paul Sultana
|
|
||||||
- Nathan Sweet
|
|
||||||
- TTK-Bandit
|
|
||||||
- Jared Tiala
|
|
||||||
- Sergey Tikhomirov
|
|
||||||
- Arthur Tombs
|
|
||||||
- Ioannis Tsakpinis
|
|
||||||
- Samuli Tuomola
|
|
||||||
- Matthew Turner
|
|
||||||
- urraka
|
|
||||||
- Elias Vanderstuyft
|
|
||||||
- Stef Velzel
|
|
||||||
- Jari Vetoniemi
|
|
||||||
- Ricardo Vieira
|
|
||||||
- Nicholas Vitovitch
|
|
||||||
- Simon Voordouw
|
|
||||||
- Corentin Wallez
|
|
||||||
- Torsten Walluhn
|
|
||||||
- Patrick Walton
|
|
||||||
- Xo Wang
|
|
||||||
- Waris
|
|
||||||
- Jay Weisskopf
|
|
||||||
- Frank Wille
|
|
||||||
- Tatsuya Yatagawa
|
|
||||||
- Ryogo Yoshimura
|
|
||||||
- Lukas Zanner
|
|
||||||
- Andrey Zholos
|
|
||||||
- Aihui Zhu
|
|
||||||
- Santi Zupancic
|
|
||||||
- Jonas Ådahl
|
|
||||||
- Lasse Öörni
|
|
||||||
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
|
||||||
reports, patches, feedback, testing and encouragement
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
if (NOT EXISTS "@GLFW_BINARY_DIR@/install_manifest.txt")
|
if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
message(FATAL_ERROR "Cannot find install manifest: \"@GLFW_BINARY_DIR@/install_manifest.txt\"")
|
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(READ "@GLFW_BINARY_DIR@/install_manifest.txt" files)
|
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
string(REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
|
||||||
foreach (file ${files})
|
foreach (file ${files})
|
||||||
Vendored
+75
-122
@@ -3,40 +3,31 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
/* 2020-03-02 Camilla Löwy <elmindreda@elmindreda.org>
|
#ifdef _MSC_VER
|
||||||
* - Added inclusion of string.h for memcpy
|
#define inline __inline
|
||||||
* - Replaced tan and acos with tanf and acosf
|
|
||||||
* - Replaced double constants with float equivalents
|
|
||||||
*/
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef LINMATH_NO_INLINE
|
|
||||||
#define LINMATH_H_FUNC static
|
|
||||||
#else
|
|
||||||
#define LINMATH_H_FUNC static inline
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LINMATH_H_DEFINE_VEC(n) \
|
#define LINMATH_H_DEFINE_VEC(n) \
|
||||||
typedef float vec##n[n]; \
|
typedef float vec##n[n]; \
|
||||||
LINMATH_H_FUNC void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \
|
static inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = a[i] + b[i]; \
|
r[i] = a[i] + b[i]; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \
|
static inline void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = a[i] - b[i]; \
|
r[i] = a[i] - b[i]; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_scale(vec##n r, vec##n const v, float const s) \
|
static inline void vec##n##_scale(vec##n r, vec##n const v, float const s) \
|
||||||
{ \
|
{ \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
r[i] = v[i] * s; \
|
r[i] = v[i] * s; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
static inline float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
float p = 0.; \
|
float p = 0.; \
|
||||||
int i; \
|
int i; \
|
||||||
@@ -44,40 +35,28 @@ LINMATH_H_FUNC float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
|||||||
p += b[i]*a[i]; \
|
p += b[i]*a[i]; \
|
||||||
return p; \
|
return p; \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC float vec##n##_len(vec##n const v) \
|
static inline float vec##n##_len(vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
return sqrtf(vec##n##_mul_inner(v,v)); \
|
return (float) sqrt(vec##n##_mul_inner(v,v)); \
|
||||||
} \
|
} \
|
||||||
LINMATH_H_FUNC void vec##n##_norm(vec##n r, vec##n const v) \
|
static inline void vec##n##_norm(vec##n r, vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
float k = 1.f / vec##n##_len(v); \
|
float k = 1.f / vec##n##_len(v); \
|
||||||
vec##n##_scale(r, v, k); \
|
vec##n##_scale(r, v, k); \
|
||||||
} \
|
|
||||||
LINMATH_H_FUNC void vec##n##_min(vec##n r, vec##n const a, vec##n const b) \
|
|
||||||
{ \
|
|
||||||
int i; \
|
|
||||||
for(i=0; i<n; ++i) \
|
|
||||||
r[i] = a[i]<b[i] ? a[i] : b[i]; \
|
|
||||||
} \
|
|
||||||
LINMATH_H_FUNC void vec##n##_max(vec##n r, vec##n const a, vec##n const b) \
|
|
||||||
{ \
|
|
||||||
int i; \
|
|
||||||
for(i=0; i<n; ++i) \
|
|
||||||
r[i] = a[i]>b[i] ? a[i] : b[i]; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_DEFINE_VEC(2)
|
LINMATH_H_DEFINE_VEC(2)
|
||||||
LINMATH_H_DEFINE_VEC(3)
|
LINMATH_H_DEFINE_VEC(3)
|
||||||
LINMATH_H_DEFINE_VEC(4)
|
LINMATH_H_DEFINE_VEC(4)
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)
|
static inline void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)
|
||||||
{
|
{
|
||||||
r[0] = a[1]*b[2] - a[2]*b[1];
|
r[0] = a[1]*b[2] - a[2]*b[1];
|
||||||
r[1] = a[2]*b[0] - a[0]*b[2];
|
r[1] = a[2]*b[0] - a[0]*b[2];
|
||||||
r[2] = a[0]*b[1] - a[1]*b[0];
|
r[2] = a[0]*b[1] - a[1]*b[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
static inline void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
||||||
{
|
{
|
||||||
float p = 2.f*vec3_mul_inner(v, n);
|
float p = 2.f*vec3_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
@@ -85,7 +64,7 @@ LINMATH_H_FUNC void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
|||||||
r[i] = v[i] - p*n[i];
|
r[i] = v[i] - p*n[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
static inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
||||||
{
|
{
|
||||||
r[0] = a[1]*b[2] - a[2]*b[1];
|
r[0] = a[1]*b[2] - a[2]*b[1];
|
||||||
r[1] = a[2]*b[0] - a[0]*b[2];
|
r[1] = a[2]*b[0] - a[0]*b[2];
|
||||||
@@ -93,7 +72,7 @@ LINMATH_H_FUNC void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
|||||||
r[3] = 1.f;
|
r[3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
static inline void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
||||||
{
|
{
|
||||||
float p = 2.f*vec4_mul_inner(v, n);
|
float p = 2.f*vec4_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
@@ -102,58 +81,58 @@ LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef vec4 mat4x4[4];
|
typedef vec4 mat4x4[4];
|
||||||
LINMATH_H_FUNC void mat4x4_identity(mat4x4 M)
|
static inline void mat4x4_identity(mat4x4 M)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
M[i][j] = i==j ? 1.f : 0.f;
|
M[i][j] = i==j ? 1.f : 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_dup(mat4x4 M, mat4x4 N)
|
static inline void mat4x4_dup(mat4x4 M, mat4x4 N)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
M[i][j] = N[i][j];
|
M[i][j] = N[i][j];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_row(vec4 r, mat4x4 M, int i)
|
static inline void mat4x4_row(vec4 r, mat4x4 M, int i)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
for(k=0; k<4; ++k)
|
for(k=0; k<4; ++k)
|
||||||
r[k] = M[k][i];
|
r[k] = M[k][i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_col(vec4 r, mat4x4 M, int i)
|
static inline void mat4x4_col(vec4 r, mat4x4 M, int i)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
for(k=0; k<4; ++k)
|
for(k=0; k<4; ++k)
|
||||||
r[k] = M[i][k];
|
r[k] = M[i][k];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_transpose(mat4x4 M, mat4x4 N)
|
static inline void mat4x4_transpose(mat4x4 M, mat4x4 N)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
M[i][j] = N[j][i];
|
M[i][j] = N[j][i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)
|
static inline void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_add(M[i], a[i], b[i]);
|
vec4_add(M[i], a[i], b[i]);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)
|
static inline void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_sub(M[i], a[i], b[i]);
|
vec4_sub(M[i], a[i], b[i]);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_scale(mat4x4 M, mat4x4 a, float k)
|
static inline void mat4x4_scale(mat4x4 M, mat4x4 a, float k)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
vec4_scale(M[i], a[i], k);
|
vec4_scale(M[i], a[i], k);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)
|
static inline void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
vec4_scale(M[0], a[0], x);
|
vec4_scale(M[0], a[0], x);
|
||||||
@@ -163,7 +142,7 @@ LINMATH_H_FUNC void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, flo
|
|||||||
M[3][i] = a[3][i];
|
M[3][i] = a[3][i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
static inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
||||||
{
|
{
|
||||||
mat4x4 temp;
|
mat4x4 temp;
|
||||||
int k, r, c;
|
int k, r, c;
|
||||||
@@ -174,7 +153,7 @@ LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
|||||||
}
|
}
|
||||||
mat4x4_dup(M, temp);
|
mat4x4_dup(M, temp);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
static inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j) {
|
for(j=0; j<4; ++j) {
|
||||||
@@ -183,14 +162,14 @@ LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
|||||||
r[j] += M[i][j] * v[i];
|
r[j] += M[i][j] * v[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_translate(mat4x4 T, float x, float y, float z)
|
static inline void mat4x4_translate(mat4x4 T, float x, float y, float z)
|
||||||
{
|
{
|
||||||
mat4x4_identity(T);
|
mat4x4_identity(T);
|
||||||
T[3][0] = x;
|
T[3][0] = x;
|
||||||
T[3][1] = y;
|
T[3][1] = y;
|
||||||
T[3][2] = z;
|
T[3][2] = z;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)
|
static inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)
|
||||||
{
|
{
|
||||||
vec4 t = {x, y, z, 0};
|
vec4 t = {x, y, z, 0};
|
||||||
vec4 r;
|
vec4 r;
|
||||||
@@ -200,32 +179,33 @@ LINMATH_H_FUNC void mat4x4_translate_in_place(mat4x4 M, float x, float y, float
|
|||||||
M[3][i] += vec4_mul_inner(r, t);
|
M[3][i] += vec4_mul_inner(r, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)
|
static inline void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(i=0; i<4; ++i) for(j=0; j<4; ++j)
|
for(i=0; i<4; ++i) for(j=0; j<4; ++j)
|
||||||
M[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;
|
M[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)
|
static inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
vec3 u = {x, y, z};
|
vec3 u = {x, y, z};
|
||||||
|
|
||||||
if(vec3_len(u) > 1e-4) {
|
if(vec3_len(u) > 1e-4) {
|
||||||
|
mat4x4 T, C, S = {{0}};
|
||||||
|
|
||||||
vec3_norm(u, u);
|
vec3_norm(u, u);
|
||||||
mat4x4 T;
|
|
||||||
mat4x4_from_vec3_mul_outer(T, u, u);
|
mat4x4_from_vec3_mul_outer(T, u, u);
|
||||||
|
|
||||||
mat4x4 S = {
|
S[1][2] = u[0];
|
||||||
{ 0, u[2], -u[1], 0},
|
S[2][1] = -u[0];
|
||||||
{-u[2], 0, u[0], 0},
|
S[2][0] = u[1];
|
||||||
{ u[1], -u[0], 0, 0},
|
S[0][2] = -u[1];
|
||||||
{ 0, 0, 0, 0}
|
S[0][1] = u[2];
|
||||||
};
|
S[1][0] = -u[2];
|
||||||
|
|
||||||
mat4x4_scale(S, S, s);
|
mat4x4_scale(S, S, s);
|
||||||
|
|
||||||
mat4x4 C;
|
|
||||||
mat4x4_identity(C);
|
mat4x4_identity(C);
|
||||||
mat4x4_sub(C, C, T);
|
mat4x4_sub(C, C, T);
|
||||||
|
|
||||||
@@ -240,7 +220,7 @@ LINMATH_H_FUNC void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z,
|
|||||||
mat4x4_dup(R, M);
|
mat4x4_dup(R, M);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
static inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
@@ -252,7 +232,7 @@ LINMATH_H_FUNC void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
|||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)
|
static inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
@@ -264,7 +244,7 @@ LINMATH_H_FUNC void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)
|
|||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
static inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
@@ -276,8 +256,9 @@ LINMATH_H_FUNC void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
|||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 M)
|
static inline void mat4x4_invert(mat4x4 T, mat4x4 M)
|
||||||
{
|
{
|
||||||
|
float idet;
|
||||||
float s[6];
|
float s[6];
|
||||||
float c[6];
|
float c[6];
|
||||||
s[0] = M[0][0]*M[1][1] - M[1][0]*M[0][1];
|
s[0] = M[0][0]*M[1][1] - M[1][0]*M[0][1];
|
||||||
@@ -295,7 +276,7 @@ LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 M)
|
|||||||
c[5] = M[2][2]*M[3][3] - M[3][2]*M[2][3];
|
c[5] = M[2][2]*M[3][3] - M[3][2]*M[2][3];
|
||||||
|
|
||||||
/* Assumes it is invertible */
|
/* Assumes it is invertible */
|
||||||
float idet = 1.0f/( s[0]*c[5]-s[1]*c[4]+s[2]*c[3]+s[3]*c[2]-s[4]*c[1]+s[5]*c[0] );
|
idet = 1.0f/( s[0]*c[5]-s[1]*c[4]+s[2]*c[3]+s[3]*c[2]-s[4]*c[1]+s[5]*c[0] );
|
||||||
|
|
||||||
T[0][0] = ( M[1][1] * c[5] - M[1][2] * c[4] + M[1][3] * c[3]) * idet;
|
T[0][0] = ( M[1][1] * c[5] - M[1][2] * c[4] + M[1][3] * c[3]) * idet;
|
||||||
T[0][1] = (-M[0][1] * c[5] + M[0][2] * c[4] - M[0][3] * c[3]) * idet;
|
T[0][1] = (-M[0][1] * c[5] + M[0][2] * c[4] - M[0][3] * c[3]) * idet;
|
||||||
@@ -317,12 +298,17 @@ LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 M)
|
|||||||
T[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;
|
T[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;
|
||||||
T[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;
|
T[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)
|
static inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)
|
||||||
{
|
{
|
||||||
mat4x4_dup(R, M);
|
|
||||||
float s = 1.;
|
float s = 1.;
|
||||||
vec3 h;
|
vec3 h;
|
||||||
|
|
||||||
|
mat4x4_dup(R, M);
|
||||||
|
vec3_norm(R[2], R[2]);
|
||||||
|
|
||||||
|
s = vec3_mul_inner(R[1], R[2]);
|
||||||
|
vec3_scale(h, R[2], s);
|
||||||
|
vec3_sub(R[1], R[1], h);
|
||||||
vec3_norm(R[2], R[2]);
|
vec3_norm(R[2], R[2]);
|
||||||
|
|
||||||
s = vec3_mul_inner(R[1], R[2]);
|
s = vec3_mul_inner(R[1], R[2]);
|
||||||
@@ -330,17 +316,13 @@ LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)
|
|||||||
vec3_sub(R[1], R[1], h);
|
vec3_sub(R[1], R[1], h);
|
||||||
vec3_norm(R[1], R[1]);
|
vec3_norm(R[1], R[1]);
|
||||||
|
|
||||||
s = vec3_mul_inner(R[0], R[2]);
|
|
||||||
vec3_scale(h, R[2], s);
|
|
||||||
vec3_sub(R[0], R[0], h);
|
|
||||||
|
|
||||||
s = vec3_mul_inner(R[0], R[1]);
|
s = vec3_mul_inner(R[0], R[1]);
|
||||||
vec3_scale(h, R[1], s);
|
vec3_scale(h, R[1], s);
|
||||||
vec3_sub(R[0], R[0], h);
|
vec3_sub(R[0], R[0], h);
|
||||||
vec3_norm(R[0], R[0]);
|
vec3_norm(R[0], R[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
static inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
||||||
{
|
{
|
||||||
M[0][0] = 2.f*n/(r-l);
|
M[0][0] = 2.f*n/(r-l);
|
||||||
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
||||||
@@ -356,7 +338,7 @@ LINMATH_H_FUNC void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t,
|
|||||||
M[3][2] = -2.f*(f*n)/(f-n);
|
M[3][2] = -2.f*(f*n)/(f-n);
|
||||||
M[3][0] = M[3][1] = M[3][3] = 0.f;
|
M[3][0] = M[3][1] = M[3][3] = 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
static inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
||||||
{
|
{
|
||||||
M[0][0] = 2.f/(r-l);
|
M[0][0] = 2.f/(r-l);
|
||||||
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
M[0][1] = M[0][2] = M[0][3] = 0.f;
|
||||||
@@ -372,11 +354,11 @@ LINMATH_H_FUNC void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, f
|
|||||||
M[3][2] = -(f+n)/(f-n);
|
M[3][2] = -(f+n)/(f-n);
|
||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)
|
static inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)
|
||||||
{
|
{
|
||||||
/* NOTE: Degrees are an unhandy unit to work with.
|
/* NOTE: Degrees are an unhandy unit to work with.
|
||||||
* linmath.h uses radians for everything! */
|
* linmath.h uses radians for everything! */
|
||||||
float const a = 1.f / tanf(y_fov / 2.f);
|
float const a = 1.f / (float) tan(y_fov / 2.f);
|
||||||
|
|
||||||
m[0][0] = a / aspect;
|
m[0][0] = a / aspect;
|
||||||
m[0][1] = 0.f;
|
m[0][1] = 0.f;
|
||||||
@@ -398,7 +380,7 @@ LINMATH_H_FUNC void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, floa
|
|||||||
m[3][2] = -((2.f * f * n) / (f - n));
|
m[3][2] = -((2.f * f * n) / (f - n));
|
||||||
m[3][3] = 0.f;
|
m[3][3] = 0.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
static inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
||||||
{
|
{
|
||||||
/* Adapted from Android's OpenGL Matrix.java. */
|
/* Adapted from Android's OpenGL Matrix.java. */
|
||||||
/* See the OpenGL GLUT documentation for gluLookAt for a description */
|
/* See the OpenGL GLUT documentation for gluLookAt for a description */
|
||||||
@@ -407,14 +389,15 @@ LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
|||||||
/* TODO: The negation of of can be spared by swapping the order of
|
/* TODO: The negation of of can be spared by swapping the order of
|
||||||
* operands in the following cross products in the right way. */
|
* operands in the following cross products in the right way. */
|
||||||
vec3 f;
|
vec3 f;
|
||||||
|
vec3 s;
|
||||||
|
vec3 t;
|
||||||
|
|
||||||
vec3_sub(f, center, eye);
|
vec3_sub(f, center, eye);
|
||||||
vec3_norm(f, f);
|
vec3_norm(f, f);
|
||||||
|
|
||||||
vec3 s;
|
|
||||||
vec3_mul_cross(s, f, up);
|
vec3_mul_cross(s, f, up);
|
||||||
vec3_norm(s, s);
|
vec3_norm(s, s);
|
||||||
|
|
||||||
vec3 t;
|
|
||||||
vec3_mul_cross(t, s, f);
|
vec3_mul_cross(t, s, f);
|
||||||
|
|
||||||
m[0][0] = s[0];
|
m[0][0] = s[0];
|
||||||
@@ -441,24 +424,24 @@ LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef float quat[4];
|
typedef float quat[4];
|
||||||
LINMATH_H_FUNC void quat_identity(quat q)
|
static inline void quat_identity(quat q)
|
||||||
{
|
{
|
||||||
q[0] = q[1] = q[2] = 0.f;
|
q[0] = q[1] = q[2] = 0.f;
|
||||||
q[3] = 1.f;
|
q[3] = 1.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_add(quat r, quat a, quat b)
|
static inline void quat_add(quat r, quat a, quat b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
r[i] = a[i] + b[i];
|
r[i] = a[i] + b[i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_sub(quat r, quat a, quat b)
|
static inline void quat_sub(quat r, quat a, quat b)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
r[i] = a[i] - b[i];
|
r[i] = a[i] - b[i];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_mul(quat r, quat p, quat q)
|
static inline void quat_mul(quat r, quat p, quat q)
|
||||||
{
|
{
|
||||||
vec3 w;
|
vec3 w;
|
||||||
vec3_mul_cross(r, p, q);
|
vec3_mul_cross(r, p, q);
|
||||||
@@ -468,13 +451,13 @@ LINMATH_H_FUNC void quat_mul(quat r, quat p, quat q)
|
|||||||
vec3_add(r, r, w);
|
vec3_add(r, r, w);
|
||||||
r[3] = p[3]*q[3] - vec3_mul_inner(p, q);
|
r[3] = p[3]*q[3] - vec3_mul_inner(p, q);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_scale(quat r, quat v, float s)
|
static inline void quat_scale(quat r, quat v, float s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
r[i] = v[i] * s;
|
r[i] = v[i] * s;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC float quat_inner_product(quat a, quat b)
|
static inline float quat_inner_product(quat a, quat b)
|
||||||
{
|
{
|
||||||
float p = 0.f;
|
float p = 0.f;
|
||||||
int i;
|
int i;
|
||||||
@@ -482,43 +465,42 @@ LINMATH_H_FUNC float quat_inner_product(quat a, quat b)
|
|||||||
p += b[i]*a[i];
|
p += b[i]*a[i];
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_conj(quat r, quat q)
|
static inline void quat_conj(quat r, quat q)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<3; ++i)
|
for(i=0; i<3; ++i)
|
||||||
r[i] = -q[i];
|
r[i] = -q[i];
|
||||||
r[3] = q[3];
|
r[3] = q[3];
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_rotate(quat r, float angle, vec3 axis) {
|
static inline void quat_rotate(quat r, float angle, vec3 axis) {
|
||||||
|
int i;
|
||||||
vec3 v;
|
vec3 v;
|
||||||
vec3_scale(v, axis, sinf(angle / 2));
|
vec3_scale(v, axis, sinf(angle / 2));
|
||||||
int i;
|
|
||||||
for(i=0; i<3; ++i)
|
for(i=0; i<3; ++i)
|
||||||
r[i] = v[i];
|
r[i] = v[i];
|
||||||
r[3] = cosf(angle / 2);
|
r[3] = cosf(angle / 2);
|
||||||
}
|
}
|
||||||
#define quat_norm vec4_norm
|
#define quat_norm vec4_norm
|
||||||
LINMATH_H_FUNC void quat_mul_vec3(vec3 r, quat q, vec3 v)
|
static inline void quat_mul_vec3(vec3 r, quat q, vec3 v)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Method by Fabian 'ryg' Giessen (of Farbrausch)
|
* Method by Fabian 'ryg' Giessen (of Farbrausch)
|
||||||
t = 2 * cross(q.xyz, v)
|
t = 2 * cross(q.xyz, v)
|
||||||
v' = v + q.w * t + cross(q.xyz, t)
|
v' = v + q.w * t + cross(q.xyz, t)
|
||||||
*/
|
*/
|
||||||
vec3 t;
|
vec3 t = {q[0], q[1], q[2]};
|
||||||
vec3 q_xyz = {q[0], q[1], q[2]};
|
|
||||||
vec3 u = {q[0], q[1], q[2]};
|
vec3 u = {q[0], q[1], q[2]};
|
||||||
|
|
||||||
vec3_mul_cross(t, q_xyz, v);
|
vec3_mul_cross(t, t, v);
|
||||||
vec3_scale(t, t, 2);
|
vec3_scale(t, t, 2);
|
||||||
|
|
||||||
vec3_mul_cross(u, q_xyz, t);
|
vec3_mul_cross(u, u, t);
|
||||||
vec3_scale(t, t, q[3]);
|
vec3_scale(t, t, q[3]);
|
||||||
|
|
||||||
vec3_add(r, v, t);
|
vec3_add(r, v, t);
|
||||||
vec3_add(r, r, u);
|
vec3_add(r, r, u);
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void mat4x4_from_quat(mat4x4 M, quat q)
|
static inline void mat4x4_from_quat(mat4x4 M, quat q)
|
||||||
{
|
{
|
||||||
float a = q[3];
|
float a = q[3];
|
||||||
float b = q[0];
|
float b = q[0];
|
||||||
@@ -548,7 +530,7 @@ LINMATH_H_FUNC void mat4x4_from_quat(mat4x4 M, quat q)
|
|||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)
|
static inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)
|
||||||
{
|
{
|
||||||
/* XXX: The way this is written only works for othogonal matrices. */
|
/* XXX: The way this is written only works for othogonal matrices. */
|
||||||
/* TODO: Take care of non-orthogonal case. */
|
/* TODO: Take care of non-orthogonal case. */
|
||||||
@@ -559,7 +541,7 @@ LINMATH_H_FUNC void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)
|
|||||||
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
||||||
R[3][3] = 1.f;
|
R[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 M)
|
static inline void quat_from_mat4x4(quat q, mat4x4 M)
|
||||||
{
|
{
|
||||||
float r=0.f;
|
float r=0.f;
|
||||||
int i;
|
int i;
|
||||||
@@ -575,7 +557,7 @@ LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 M)
|
|||||||
p = &perm[i];
|
p = &perm[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sqrtf(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );
|
r = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );
|
||||||
|
|
||||||
if(r < 1e-6) {
|
if(r < 1e-6) {
|
||||||
q[0] = 1.f;
|
q[0] = 1.f;
|
||||||
@@ -589,33 +571,4 @@ LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 M)
|
|||||||
q[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);
|
q[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_FUNC void mat4x4_arcball(mat4x4 R, mat4x4 M, vec2 _a, vec2 _b, float s)
|
|
||||||
{
|
|
||||||
vec2 a; memcpy(a, _a, sizeof(a));
|
|
||||||
vec2 b; memcpy(b, _b, sizeof(b));
|
|
||||||
|
|
||||||
float z_a = 0.;
|
|
||||||
float z_b = 0.;
|
|
||||||
|
|
||||||
if(vec2_len(a) < 1.f) {
|
|
||||||
z_a = sqrtf(1.f - vec2_mul_inner(a, a));
|
|
||||||
} else {
|
|
||||||
vec2_norm(a, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vec2_len(b) < 1.f) {
|
|
||||||
z_b = sqrtf(1.f - vec2_mul_inner(b, b));
|
|
||||||
} else {
|
|
||||||
vec2_norm(b, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 a_ = {a[0], a[1], z_a};
|
|
||||||
vec3 b_ = {b[0], b[1], z_b};
|
|
||||||
|
|
||||||
vec3 c_;
|
|
||||||
vec3_mul_cross(c_, a_, b_);
|
|
||||||
|
|
||||||
float const angle = acosf(vec3_mul_inner(a_, b_)) * s;
|
|
||||||
mat4x4_rotate(R, M, c_[0], c_[1], c_[2], angle);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Vendored
+161
-400
@@ -105,8 +105,6 @@
|
|||||||
/// NK_INCLUDE_COMMAND_USERDATA | Defining this adds a userdata pointer into each command. Can be useful for example if you want to provide custom shaders depending on the used widget. Can be combined with the style structures.
|
/// NK_INCLUDE_COMMAND_USERDATA | Defining this adds a userdata pointer into each command. Can be useful for example if you want to provide custom shaders depending on the used widget. Can be combined with the style structures.
|
||||||
/// NK_BUTTON_TRIGGER_ON_RELEASE | Different platforms require button clicks occurring either on buttons being pressed (up to down) or released (down to up). By default this library will react on buttons being pressed, but if you define this it will only trigger if a button is released.
|
/// NK_BUTTON_TRIGGER_ON_RELEASE | Different platforms require button clicks occurring either on buttons being pressed (up to down) or released (down to up). By default this library will react on buttons being pressed, but if you define this it will only trigger if a button is released.
|
||||||
/// NK_ZERO_COMMAND_MEMORY | Defining this will zero out memory for each drawing command added to a drawing queue (inside nk_command_buffer_push). Zeroing command memory is very useful for fast checking (using memcmp) if command buffers are equal and avoid drawing frames when nothing on screen has changed since previous frame.
|
/// NK_ZERO_COMMAND_MEMORY | Defining this will zero out memory for each drawing command added to a drawing queue (inside nk_command_buffer_push). Zeroing command memory is very useful for fast checking (using memcmp) if command buffers are equal and avoid drawing frames when nothing on screen has changed since previous frame.
|
||||||
/// NK_UINT_DRAW_INDEX | Defining this will set the size of vertex index elements when using NK_VERTEX_BUFFER_OUTPUT to 32bit instead of the default of 16bit
|
|
||||||
/// NK_KEYSTATE_BASED_INPUT | Define this if your backend uses key state for each frame rather than key press/release events
|
|
||||||
///
|
///
|
||||||
/// !!! WARNING
|
/// !!! WARNING
|
||||||
/// The following flags will pull in the standard C library:
|
/// The following flags will pull in the standard C library:
|
||||||
@@ -124,7 +122,6 @@
|
|||||||
/// - NK_INCLUDE_DEFAULT_FONT
|
/// - NK_INCLUDE_DEFAULT_FONT
|
||||||
/// - NK_INCLUDE_STANDARD_VARARGS
|
/// - NK_INCLUDE_STANDARD_VARARGS
|
||||||
/// - NK_INCLUDE_COMMAND_USERDATA
|
/// - NK_INCLUDE_COMMAND_USERDATA
|
||||||
/// - NK_UINT_DRAW_INDEX
|
|
||||||
///
|
///
|
||||||
/// ### Constants
|
/// ### Constants
|
||||||
/// Define | Description
|
/// Define | Description
|
||||||
@@ -304,7 +301,6 @@ extern "C" {
|
|||||||
#define NK_CLAMP(i,v,x) (NK_MAX(NK_MIN(v,x), i))
|
#define NK_CLAMP(i,v,x) (NK_MAX(NK_MIN(v,x), i))
|
||||||
|
|
||||||
#ifdef NK_INCLUDE_STANDARD_VARARGS
|
#ifdef NK_INCLUDE_STANDARD_VARARGS
|
||||||
#include <stdarg.h> /* valist, va_start, va_end, ... */
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */
|
#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */
|
||||||
#include <sal.h>
|
#include <sal.h>
|
||||||
#define NK_PRINTF_FORMAT_STRING _Printf_format_string_
|
#define NK_PRINTF_FORMAT_STRING _Printf_format_string_
|
||||||
@@ -318,6 +314,7 @@ extern "C" {
|
|||||||
#define NK_PRINTF_VARARG_FUNC(fmtargnumber)
|
#define NK_PRINTF_VARARG_FUNC(fmtargnumber)
|
||||||
#define NK_PRINTF_VALIST_FUNC(fmtargnumber)
|
#define NK_PRINTF_VALIST_FUNC(fmtargnumber)
|
||||||
#endif
|
#endif
|
||||||
|
#include <stdarg.h> /* valist, va_start, va_end, ... */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -339,7 +336,7 @@ extern "C" {
|
|||||||
#define NK_POINTER_TYPE uintptr_t
|
#define NK_POINTER_TYPE uintptr_t
|
||||||
#else
|
#else
|
||||||
#ifndef NK_INT8
|
#ifndef NK_INT8
|
||||||
#define NK_INT8 signed char
|
#define NK_INT8 char
|
||||||
#endif
|
#endif
|
||||||
#ifndef NK_UINT8
|
#ifndef NK_UINT8
|
||||||
#define NK_UINT8 unsigned char
|
#define NK_UINT8 unsigned char
|
||||||
@@ -1087,12 +1084,6 @@ NK_API void nk_input_end(struct nk_context*);
|
|||||||
///
|
///
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
||||||
/// // fill configuration
|
/// // fill configuration
|
||||||
/// struct your_vertex
|
|
||||||
/// {
|
|
||||||
/// float pos[2]; // important to keep it to 2 floats
|
|
||||||
/// float uv[2];
|
|
||||||
/// unsigned char col[4];
|
|
||||||
/// };
|
|
||||||
/// struct nk_convert_config cfg = {};
|
/// struct nk_convert_config cfg = {};
|
||||||
/// static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
/// static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
||||||
/// {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, pos)},
|
/// {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, pos)},
|
||||||
@@ -1218,7 +1209,7 @@ NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_com
|
|||||||
///
|
///
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
||||||
/// nk_flags nk_convert(struct nk_context *ctx, struct nk_buffer *cmds,
|
/// nk_flags nk_convert(struct nk_context *ctx, struct nk_buffer *cmds,
|
||||||
/// struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*);
|
// struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*);
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
///
|
///
|
||||||
/// Parameter | Description
|
/// Parameter | Description
|
||||||
@@ -1403,7 +1394,6 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|||||||
/// nk_window_get_content_region_max | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window
|
/// nk_window_get_content_region_max | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window
|
||||||
/// nk_window_get_content_region_size | Returns the size of the currently visible and non-clipped space inside the currently processed window
|
/// nk_window_get_content_region_size | Returns the size of the currently visible and non-clipped space inside the currently processed window
|
||||||
/// nk_window_get_canvas | Returns the draw command buffer. Can be used to draw custom widgets
|
/// nk_window_get_canvas | Returns the draw command buffer. Can be used to draw custom widgets
|
||||||
/// nk_window_get_scroll | Gets the scroll offset of the current window
|
|
||||||
/// nk_window_has_focus | Returns if the currently processed window is currently active
|
/// nk_window_has_focus | Returns if the currently processed window is currently active
|
||||||
/// nk_window_is_collapsed | Returns if the window with given name is currently minimized/collapsed
|
/// nk_window_is_collapsed | Returns if the window with given name is currently minimized/collapsed
|
||||||
/// nk_window_is_closed | Returns if the currently processed window was closed
|
/// nk_window_is_closed | Returns if the currently processed window was closed
|
||||||
@@ -1417,7 +1407,6 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|||||||
/// nk_window_set_position | Updates position of the currently process window
|
/// nk_window_set_position | Updates position of the currently process window
|
||||||
/// nk_window_set_size | Updates the size of the currently processed window
|
/// nk_window_set_size | Updates the size of the currently processed window
|
||||||
/// nk_window_set_focus | Set the currently processed window as active window
|
/// nk_window_set_focus | Set the currently processed window as active window
|
||||||
/// nk_window_set_scroll | Sets the scroll offset of the current window
|
|
||||||
//
|
//
|
||||||
/// nk_window_close | Closes the window with given window name which deletes the window at the end of the frame
|
/// nk_window_close | Closes the window with given window name which deletes the window at the end of the frame
|
||||||
/// nk_window_collapse | Collapses the window with given window name
|
/// nk_window_collapse | Collapses the window with given window name
|
||||||
@@ -1438,7 +1427,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|||||||
/// NK_WINDOW_TITLE | Forces a header at the top at the window showing the title
|
/// NK_WINDOW_TITLE | Forces a header at the top at the window showing the title
|
||||||
/// NK_WINDOW_SCROLL_AUTO_HIDE | Automatically hides the window scrollbar if no user interaction: also requires delta time in `nk_context` to be set each frame
|
/// NK_WINDOW_SCROLL_AUTO_HIDE | Automatically hides the window scrollbar if no user interaction: also requires delta time in `nk_context` to be set each frame
|
||||||
/// NK_WINDOW_BACKGROUND | Always keep window in the background
|
/// NK_WINDOW_BACKGROUND | Always keep window in the background
|
||||||
/// NK_WINDOW_SCALE_LEFT | Puts window scaler in the left-bottom corner instead right-bottom
|
/// NK_WINDOW_SCALE_LEFT | Puts window scaler in the left-ottom corner instead right-bottom
|
||||||
/// NK_WINDOW_NO_INPUT | Prevents window of scaling, moving or getting focus
|
/// NK_WINDOW_NO_INPUT | Prevents window of scaling, moving or getting focus
|
||||||
///
|
///
|
||||||
/// #### nk_collapse_states
|
/// #### nk_collapse_states
|
||||||
@@ -1517,7 +1506,7 @@ NK_API void nk_end(struct nk_context *ctx);
|
|||||||
/// Finds and returns a window from passed name
|
/// Finds and returns a window from passed name
|
||||||
///
|
///
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
||||||
/// struct nk_window *nk_window_find(struct nk_context *ctx, const char *name);
|
/// void nk_end(struct nk_context *ctx);
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
///
|
///
|
||||||
/// Parameter | Description
|
/// Parameter | Description
|
||||||
@@ -1721,22 +1710,6 @@ NK_API struct nk_vec2 nk_window_get_content_region_size(struct nk_context*);
|
|||||||
/// drawing canvas. Can be used to do custom drawing.
|
/// drawing canvas. Can be used to do custom drawing.
|
||||||
*/
|
*/
|
||||||
NK_API struct nk_command_buffer* nk_window_get_canvas(struct nk_context*);
|
NK_API struct nk_command_buffer* nk_window_get_canvas(struct nk_context*);
|
||||||
/*/// #### nk_window_get_scroll
|
|
||||||
/// Gets the scroll offset for the current window
|
|
||||||
/// !!! WARNING
|
|
||||||
/// Only call this function between calls `nk_begin_xxx` and `nk_end`
|
|
||||||
///
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
|
||||||
/// void nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y);
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
///
|
|
||||||
/// Parameter | Description
|
|
||||||
/// -------------|-----------------------------------------------------------
|
|
||||||
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
|
||||||
/// __offset_x__ | A pointer to the x offset output (or NULL to ignore)
|
|
||||||
/// __offset_y__ | A pointer to the y offset output (or NULL to ignore)
|
|
||||||
*/
|
|
||||||
NK_API void nk_window_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y);
|
|
||||||
/*/// #### nk_window_has_focus
|
/*/// #### nk_window_has_focus
|
||||||
/// Returns if the currently processed window is currently active
|
/// Returns if the currently processed window is currently active
|
||||||
/// !!! WARNING
|
/// !!! WARNING
|
||||||
@@ -1903,22 +1876,6 @@ NK_API void nk_window_set_size(struct nk_context*, const char *name, struct nk_v
|
|||||||
/// __name__ | Identifier of the window to set focus on
|
/// __name__ | Identifier of the window to set focus on
|
||||||
*/
|
*/
|
||||||
NK_API void nk_window_set_focus(struct nk_context*, const char *name);
|
NK_API void nk_window_set_focus(struct nk_context*, const char *name);
|
||||||
/*/// #### nk_window_set_scroll
|
|
||||||
/// Sets the scroll offset for the current window
|
|
||||||
/// !!! WARNING
|
|
||||||
/// Only call this function between calls `nk_begin_xxx` and `nk_end`
|
|
||||||
///
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
|
||||||
/// void nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y);
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
///
|
|
||||||
/// Parameter | Description
|
|
||||||
/// -------------|-----------------------------------------------------------
|
|
||||||
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
|
||||||
/// __offset_x__ | The x offset to scroll to
|
|
||||||
/// __offset_y__ | The y offset to scroll to
|
|
||||||
*/
|
|
||||||
NK_API void nk_window_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y);
|
|
||||||
/*/// #### nk_window_close
|
/*/// #### nk_window_close
|
||||||
/// Closes a window and marks it for being freed at the end of the frame
|
/// Closes a window and marks it for being freed at the end of the frame
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
||||||
@@ -2631,7 +2588,7 @@ NK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct n
|
|||||||
/// case ...:
|
/// case ...:
|
||||||
/// // [...]
|
/// // [...]
|
||||||
/// }
|
/// }
|
||||||
/// nk_clear(&ctx);
|
// nk_clear(&ctx);
|
||||||
/// }
|
/// }
|
||||||
/// nk_free(&ctx);
|
/// nk_free(&ctx);
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -2644,8 +2601,6 @@ NK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct n
|
|||||||
/// nk_group_scrolled_offset_begin | Start a new group with manual separated handling of scrollbar x- and y-offset
|
/// nk_group_scrolled_offset_begin | Start a new group with manual separated handling of scrollbar x- and y-offset
|
||||||
/// nk_group_scrolled_begin | Start a new group with manual scrollbar handling
|
/// nk_group_scrolled_begin | Start a new group with manual scrollbar handling
|
||||||
/// nk_group_scrolled_end | Ends a group with manual scrollbar handling. Should only be called if nk_group_begin returned non-zero
|
/// nk_group_scrolled_end | Ends a group with manual scrollbar handling. Should only be called if nk_group_begin returned non-zero
|
||||||
/// nk_group_get_scroll | Gets the scroll offset for the given group
|
|
||||||
/// nk_group_set_scroll | Sets the scroll offset for the given group
|
|
||||||
*/
|
*/
|
||||||
/*/// #### nk_group_begin
|
/*/// #### nk_group_begin
|
||||||
/// Starts a new widget group. Requires a previous layouting function to specify a pos/size.
|
/// Starts a new widget group. Requires a previous layouting function to specify a pos/size.
|
||||||
@@ -2735,34 +2690,6 @@ NK_API int nk_group_scrolled_begin(struct nk_context*, struct nk_scroll *off, co
|
|||||||
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
||||||
*/
|
*/
|
||||||
NK_API void nk_group_scrolled_end(struct nk_context*);
|
NK_API void nk_group_scrolled_end(struct nk_context*);
|
||||||
/*/// #### nk_group_get_scroll
|
|
||||||
/// Gets the scroll position of the given group.
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
|
||||||
/// void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset);
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
///
|
|
||||||
/// Parameter | Description
|
|
||||||
/// -------------|-----------------------------------------------------------
|
|
||||||
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
|
||||||
/// __id__ | The id of the group to get the scroll position of
|
|
||||||
/// __x_offset__ | A pointer to the x offset output (or NULL to ignore)
|
|
||||||
/// __y_offset__ | A pointer to the y offset output (or NULL to ignore)
|
|
||||||
*/
|
|
||||||
NK_API void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset);
|
|
||||||
/*/// #### nk_group_set_scroll
|
|
||||||
/// Sets the scroll position of the given group.
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c
|
|
||||||
/// void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset);
|
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
///
|
|
||||||
/// Parameter | Description
|
|
||||||
/// -------------|-----------------------------------------------------------
|
|
||||||
/// __ctx__ | Must point to an previously initialized `nk_context` struct
|
|
||||||
/// __id__ | The id of the group to scroll
|
|
||||||
/// __x_offset__ | The x offset to scroll to
|
|
||||||
/// __y_offset__ | The y offset to scroll to
|
|
||||||
*/
|
|
||||||
NK_API void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset);
|
|
||||||
/* =============================================================================
|
/* =============================================================================
|
||||||
*
|
*
|
||||||
* TREE
|
* TREE
|
||||||
@@ -3260,7 +3187,7 @@ NK_API int nk_color_pick(struct nk_context*, struct nk_colorf*, enum nk_color_fo
|
|||||||
/// case ...:
|
/// case ...:
|
||||||
/// // [...]
|
/// // [...]
|
||||||
/// }
|
/// }
|
||||||
/// nk_clear(&ctx);
|
// nk_clear(&ctx);
|
||||||
/// }
|
/// }
|
||||||
/// nk_free(&ctx);
|
/// nk_free(&ctx);
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -3468,8 +3395,6 @@ NK_API void nk_plot_function(struct nk_context*, enum nk_chart_type, void *userd
|
|||||||
NK_API int nk_popup_begin(struct nk_context*, enum nk_popup_type, const char*, nk_flags, struct nk_rect bounds);
|
NK_API int nk_popup_begin(struct nk_context*, enum nk_popup_type, const char*, nk_flags, struct nk_rect bounds);
|
||||||
NK_API void nk_popup_close(struct nk_context*);
|
NK_API void nk_popup_close(struct nk_context*);
|
||||||
NK_API void nk_popup_end(struct nk_context*);
|
NK_API void nk_popup_end(struct nk_context*);
|
||||||
NK_API void nk_popup_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y);
|
|
||||||
NK_API void nk_popup_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y);
|
|
||||||
/* =============================================================================
|
/* =============================================================================
|
||||||
*
|
*
|
||||||
* COMBOBOX
|
* COMBOBOX
|
||||||
@@ -4663,11 +4588,7 @@ NK_API int nk_input_is_key_down(const struct nk_input*, enum nk_keys);
|
|||||||
In fact it is probably more powerful than needed but allows even more crazy
|
In fact it is probably more powerful than needed but allows even more crazy
|
||||||
things than this library provides by default.
|
things than this library provides by default.
|
||||||
*/
|
*/
|
||||||
#ifdef NK_UINT_DRAW_INDEX
|
|
||||||
typedef nk_uint nk_draw_index;
|
|
||||||
#else
|
|
||||||
typedef nk_ushort nk_draw_index;
|
typedef nk_ushort nk_draw_index;
|
||||||
#endif
|
|
||||||
enum nk_draw_list_stroke {
|
enum nk_draw_list_stroke {
|
||||||
NK_STROKE_OPEN = nk_false,
|
NK_STROKE_OPEN = nk_false,
|
||||||
/* build up path has no connection back to the beginning */
|
/* build up path has no connection back to the beginning */
|
||||||
@@ -5682,6 +5603,7 @@ template<typename T> struct nk_alignof{struct Big {T x; char c;}; enum {
|
|||||||
|
|
||||||
#endif /* NK_NUKLEAR_H_ */
|
#endif /* NK_NUKLEAR_H_ */
|
||||||
|
|
||||||
|
|
||||||
#ifdef NK_IMPLEMENTATION
|
#ifdef NK_IMPLEMENTATION
|
||||||
|
|
||||||
#ifndef NK_INTERNAL_H
|
#ifndef NK_INTERNAL_H
|
||||||
@@ -6085,18 +6007,15 @@ nk_sin(float x)
|
|||||||
NK_LIB float
|
NK_LIB float
|
||||||
nk_cos(float x)
|
nk_cos(float x)
|
||||||
{
|
{
|
||||||
/* New implementation. Also generated using lolremez. */
|
NK_STORAGE const float a0 = +1.00238601909309722f;
|
||||||
/* Old version significantly deviated from expected results. */
|
NK_STORAGE const float a1 = -3.81919947353040024e-2f;
|
||||||
NK_STORAGE const float a0 = 9.9995999154986614e-1f;
|
NK_STORAGE const float a2 = -3.94382342128062756e-1f;
|
||||||
NK_STORAGE const float a1 = 1.2548995793001028e-3f;
|
NK_STORAGE const float a3 = -1.18134036025221444e-1f;
|
||||||
NK_STORAGE const float a2 = -5.0648546280678015e-1f;
|
NK_STORAGE const float a4 = +1.07123798512170878e-1f;
|
||||||
NK_STORAGE const float a3 = 1.2942246466519995e-2f;
|
NK_STORAGE const float a5 = -1.86637164165180873e-2f;
|
||||||
NK_STORAGE const float a4 = 2.8668384702547972e-2f;
|
NK_STORAGE const float a6 = +9.90140908664079833e-4f;
|
||||||
NK_STORAGE const float a5 = 7.3726485210586547e-3f;
|
NK_STORAGE const float a7 = -5.23022132118824778e-14f;
|
||||||
NK_STORAGE const float a6 = -3.8510875386947414e-3f;
|
return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*a7))))));
|
||||||
NK_STORAGE const float a7 = 4.7196604604366623e-4f;
|
|
||||||
NK_STORAGE const float a8 = -1.8776444013090451e-5f;
|
|
||||||
return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*(a7 + x*a8)))))));
|
|
||||||
}
|
}
|
||||||
NK_LIB nk_uint
|
NK_LIB nk_uint
|
||||||
nk_round_up_pow2(nk_uint v)
|
nk_round_up_pow2(nk_uint v)
|
||||||
@@ -7232,29 +7151,23 @@ nk_murmur_hash(const void * key, int len, nk_hash seed)
|
|||||||
{
|
{
|
||||||
/* 32-Bit MurmurHash3: https://code.google.com/p/smhasher/wiki/MurmurHash3*/
|
/* 32-Bit MurmurHash3: https://code.google.com/p/smhasher/wiki/MurmurHash3*/
|
||||||
#define NK_ROTL(x,r) ((x) << (r) | ((x) >> (32 - r)))
|
#define NK_ROTL(x,r) ((x) << (r) | ((x) >> (32 - r)))
|
||||||
|
union {const nk_uint *i; const nk_byte *b;} conv = {0};
|
||||||
nk_uint h1 = seed;
|
|
||||||
nk_uint k1;
|
|
||||||
const nk_byte *data = (const nk_byte*)key;
|
const nk_byte *data = (const nk_byte*)key;
|
||||||
const nk_byte *keyptr = data;
|
|
||||||
nk_byte *k1ptr;
|
|
||||||
const int bsize = sizeof(k1);
|
|
||||||
const int nblocks = len/4;
|
const int nblocks = len/4;
|
||||||
|
nk_uint h1 = seed;
|
||||||
const nk_uint c1 = 0xcc9e2d51;
|
const nk_uint c1 = 0xcc9e2d51;
|
||||||
const nk_uint c2 = 0x1b873593;
|
const nk_uint c2 = 0x1b873593;
|
||||||
const nk_byte *tail;
|
const nk_byte *tail;
|
||||||
|
const nk_uint *blocks;
|
||||||
|
nk_uint k1;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* body */
|
/* body */
|
||||||
if (!key) return 0;
|
if (!key) return 0;
|
||||||
for (i = 0; i < nblocks; ++i, keyptr += bsize) {
|
conv.b = (data + nblocks*4);
|
||||||
k1ptr = (nk_byte*)&k1;
|
blocks = (const nk_uint*)conv.i;
|
||||||
k1ptr[0] = keyptr[0];
|
for (i = -nblocks; i; ++i) {
|
||||||
k1ptr[1] = keyptr[1];
|
k1 = blocks[i];
|
||||||
k1ptr[2] = keyptr[2];
|
|
||||||
k1ptr[3] = keyptr[3];
|
|
||||||
|
|
||||||
k1 *= c1;
|
k1 *= c1;
|
||||||
k1 = NK_ROTL(k1,15);
|
k1 = NK_ROTL(k1,15);
|
||||||
k1 *= c2;
|
k1 *= c2;
|
||||||
@@ -9443,7 +9356,7 @@ nk_draw_list_alloc_vertices(struct nk_draw_list *list, nk_size count)
|
|||||||
* backend (OpenGL, DirectX, ...). For example in OpenGL for `glDrawElements`
|
* backend (OpenGL, DirectX, ...). For example in OpenGL for `glDrawElements`
|
||||||
* instead of specifing `GL_UNSIGNED_SHORT` you have to define `GL_UNSIGNED_INT`.
|
* instead of specifing `GL_UNSIGNED_SHORT` you have to define `GL_UNSIGNED_INT`.
|
||||||
* Sorry for the inconvenience. */
|
* Sorry for the inconvenience. */
|
||||||
if(sizeof(nk_draw_index)==2) NK_ASSERT((list->vertex_count < NK_USHORT_MAX &&
|
NK_ASSERT((sizeof(nk_draw_index) == 2 && list->vertex_count < NK_USHORT_MAX &&
|
||||||
"To many verticies for 16-bit vertex indicies. Please read comment above on how to solve this problem"));
|
"To many verticies for 16-bit vertex indicies. Please read comment above on how to solve this problem"));
|
||||||
return vtx;
|
return vtx;
|
||||||
}
|
}
|
||||||
@@ -12896,9 +12809,6 @@ nk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int hei
|
|||||||
dst_font->ascent = ((float)unscaled_ascent * font_scale);
|
dst_font->ascent = ((float)unscaled_ascent * font_scale);
|
||||||
dst_font->descent = ((float)unscaled_descent * font_scale);
|
dst_font->descent = ((float)unscaled_descent * font_scale);
|
||||||
dst_font->glyph_offset = glyph_n;
|
dst_font->glyph_offset = glyph_n;
|
||||||
// Need to zero this, or it will carry over from a previous
|
|
||||||
// bake, and cause a segfault when accessing glyphs[].
|
|
||||||
dst_font->glyph_count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fill own baked font glyph array */
|
/* fill own baked font glyph array */
|
||||||
@@ -13993,12 +13903,8 @@ nk_input_key(struct nk_context *ctx, enum nk_keys key, int down)
|
|||||||
NK_ASSERT(ctx);
|
NK_ASSERT(ctx);
|
||||||
if (!ctx) return;
|
if (!ctx) return;
|
||||||
in = &ctx->input;
|
in = &ctx->input;
|
||||||
#ifdef NK_KEYSTATE_BASED_INPUT
|
|
||||||
if (in->keyboard.keys[key].down != down)
|
if (in->keyboard.keys[key].down != down)
|
||||||
in->keyboard.keys[key].clicked++;
|
in->keyboard.keys[key].clicked++;
|
||||||
#else
|
|
||||||
in->keyboard.keys[key].clicked++;
|
|
||||||
#endif
|
|
||||||
in->keyboard.keys[key].down = down;
|
in->keyboard.keys[key].down = down;
|
||||||
}
|
}
|
||||||
NK_API void
|
NK_API void
|
||||||
@@ -15882,7 +15788,7 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
nk_fill_rect(out, empty_space, 0, style->window.background);
|
nk_fill_rect(out, empty_space, 0, style->window.background);
|
||||||
|
|
||||||
/* fill right empty space */
|
/* fill right empty space */
|
||||||
empty_space.x = layout->bounds.x + layout->bounds.w;
|
empty_space.x = layout->bounds.x + layout->bounds.w - layout->border;
|
||||||
empty_space.y = layout->bounds.y;
|
empty_space.y = layout->bounds.y;
|
||||||
empty_space.w = panel_padding.x + layout->border;
|
empty_space.w = panel_padding.x + layout->border;
|
||||||
empty_space.h = layout->bounds.h;
|
empty_space.h = layout->bounds.h;
|
||||||
@@ -15891,11 +15797,11 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
nk_fill_rect(out, empty_space, 0, style->window.background);
|
nk_fill_rect(out, empty_space, 0, style->window.background);
|
||||||
|
|
||||||
/* fill bottom empty space */
|
/* fill bottom empty space */
|
||||||
if (layout->footer_height > 0) {
|
if (*layout->offset_x != 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) {
|
||||||
empty_space.x = window->bounds.x;
|
empty_space.x = window->bounds.x;
|
||||||
empty_space.y = layout->bounds.y + layout->bounds.h;
|
empty_space.y = layout->bounds.y + layout->bounds.h;
|
||||||
empty_space.w = window->bounds.w;
|
empty_space.w = window->bounds.w;
|
||||||
empty_space.h = layout->footer_height;
|
empty_space.h = scrollbar_size.y;
|
||||||
nk_fill_rect(out, empty_space, 0, style->window.background);
|
nk_fill_rect(out, empty_space, 0, style->window.background);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16269,8 +16175,8 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|||||||
{
|
{
|
||||||
struct nk_window *win;
|
struct nk_window *win;
|
||||||
struct nk_style *style;
|
struct nk_style *style;
|
||||||
nk_hash name_hash;
|
nk_hash title_hash;
|
||||||
int name_len;
|
int title_len;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
NK_ASSERT(ctx);
|
NK_ASSERT(ctx);
|
||||||
@@ -16283,12 +16189,12 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|||||||
|
|
||||||
/* find or create window */
|
/* find or create window */
|
||||||
style = &ctx->style;
|
style = &ctx->style;
|
||||||
name_len = (int)nk_strlen(name);
|
title_len = (int)nk_strlen(name);
|
||||||
name_hash = nk_murmur_hash(name, (int)name_len, NK_WINDOW_TITLE);
|
title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);
|
||||||
win = nk_find_window(ctx, name_hash, name);
|
win = nk_find_window(ctx, title_hash, name);
|
||||||
if (!win) {
|
if (!win) {
|
||||||
/* create new window */
|
/* create new window */
|
||||||
nk_size name_length = (nk_size)name_len;
|
nk_size name_length = (nk_size)nk_strlen(name);
|
||||||
win = (struct nk_window*)nk_create_window(ctx);
|
win = (struct nk_window*)nk_create_window(ctx);
|
||||||
NK_ASSERT(win);
|
NK_ASSERT(win);
|
||||||
if (!win) return 0;
|
if (!win) return 0;
|
||||||
@@ -16300,7 +16206,7 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|||||||
|
|
||||||
win->flags = flags;
|
win->flags = flags;
|
||||||
win->bounds = bounds;
|
win->bounds = bounds;
|
||||||
win->name = name_hash;
|
win->name = title_hash;
|
||||||
name_length = NK_MIN(name_length, NK_WINDOW_MAX_NAME-1);
|
name_length = NK_MIN(name_length, NK_WINDOW_MAX_NAME-1);
|
||||||
NK_MEMCPY(win->name_string, name, name_length);
|
NK_MEMCPY(win->name_string, name, name_length);
|
||||||
win->name_string[name_length] = 0;
|
win->name_string[name_length] = 0;
|
||||||
@@ -16528,20 +16434,6 @@ nk_window_get_panel(struct nk_context *ctx)
|
|||||||
if (!ctx || !ctx->current) return 0;
|
if (!ctx || !ctx->current) return 0;
|
||||||
return ctx->current->layout;
|
return ctx->current->layout;
|
||||||
}
|
}
|
||||||
NK_API void
|
|
||||||
nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y)
|
|
||||||
{
|
|
||||||
struct nk_window *win;
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
if (!ctx || !ctx->current)
|
|
||||||
return ;
|
|
||||||
win = ctx->current;
|
|
||||||
if (offset_x)
|
|
||||||
*offset_x = win->scrollbar.x;
|
|
||||||
if (offset_y)
|
|
||||||
*offset_y = win->scrollbar.y;
|
|
||||||
}
|
|
||||||
NK_API int
|
NK_API int
|
||||||
nk_window_has_focus(const struct nk_context *ctx)
|
nk_window_has_focus(const struct nk_context *ctx)
|
||||||
{
|
{
|
||||||
@@ -16708,18 +16600,6 @@ nk_window_set_size(struct nk_context *ctx,
|
|||||||
win->bounds.h = size.y;
|
win->bounds.h = size.y;
|
||||||
}
|
}
|
||||||
NK_API void
|
NK_API void
|
||||||
nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y)
|
|
||||||
{
|
|
||||||
struct nk_window *win;
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
if (!ctx || !ctx->current)
|
|
||||||
return;
|
|
||||||
win = ctx->current;
|
|
||||||
win->scrollbar.x = offset_x;
|
|
||||||
win->scrollbar.y = offset_y;
|
|
||||||
}
|
|
||||||
NK_API void
|
|
||||||
nk_window_collapse(struct nk_context *ctx, const char *name,
|
nk_window_collapse(struct nk_context *ctx, const char *name,
|
||||||
enum nk_collapse_states c)
|
enum nk_collapse_states c)
|
||||||
{
|
{
|
||||||
@@ -16793,6 +16673,7 @@ nk_window_set_focus(struct nk_context *ctx, const char *name)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ===============================================================
|
/* ===============================================================
|
||||||
*
|
*
|
||||||
* POPUP
|
* POPUP
|
||||||
@@ -16926,11 +16807,7 @@ nk_nonblock_begin(struct nk_context *ctx,
|
|||||||
} else {
|
} else {
|
||||||
/* close the popup if user pressed outside or in the header */
|
/* close the popup if user pressed outside or in the header */
|
||||||
int pressed, in_body, in_header;
|
int pressed, in_body, in_header;
|
||||||
#ifdef NK_BUTTON_TRIGGER_ON_RELEASE
|
|
||||||
pressed = nk_input_is_mouse_released(&ctx->input, NK_BUTTON_LEFT);
|
|
||||||
#else
|
|
||||||
pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT);
|
pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT);
|
||||||
#endif
|
|
||||||
in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body);
|
in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body);
|
||||||
in_header = nk_input_is_mouse_hovering_rect(&ctx->input, header);
|
in_header = nk_input_is_mouse_hovering_rect(&ctx->input, header);
|
||||||
if (pressed && (!in_body || in_header))
|
if (pressed && (!in_body || in_header))
|
||||||
@@ -17021,38 +16898,7 @@ nk_popup_end(struct nk_context *ctx)
|
|||||||
ctx->current = win;
|
ctx->current = win;
|
||||||
nk_push_scissor(&win->buffer, win->layout->clip);
|
nk_push_scissor(&win->buffer, win->layout->clip);
|
||||||
}
|
}
|
||||||
NK_API void
|
|
||||||
nk_popup_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y)
|
|
||||||
{
|
|
||||||
struct nk_window *popup;
|
|
||||||
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
NK_ASSERT(ctx->current->layout);
|
|
||||||
if (!ctx || !ctx->current || !ctx->current->layout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
popup = ctx->current;
|
|
||||||
if (offset_x)
|
|
||||||
*offset_x = popup->scrollbar.x;
|
|
||||||
if (offset_y)
|
|
||||||
*offset_y = popup->scrollbar.y;
|
|
||||||
}
|
|
||||||
NK_API void
|
|
||||||
nk_popup_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y)
|
|
||||||
{
|
|
||||||
struct nk_window *popup;
|
|
||||||
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
NK_ASSERT(ctx->current->layout);
|
|
||||||
if (!ctx || !ctx->current || !ctx->current->layout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
popup = ctx->current;
|
|
||||||
popup->scrollbar.x = offset_x;
|
|
||||||
popup->scrollbar.y = offset_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -18179,25 +18025,22 @@ nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx,
|
|||||||
panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,
|
panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,
|
||||||
layout->bounds.w, layout->row.columns);
|
layout->bounds.w, layout->row.columns);
|
||||||
|
|
||||||
#define NK_FRAC(x) (x - (int)x) /* will be used to remove fookin gaps */
|
|
||||||
/* calculate the width of one item inside the current layout space */
|
/* calculate the width of one item inside the current layout space */
|
||||||
switch (layout->row.type) {
|
switch (layout->row.type) {
|
||||||
case NK_LAYOUT_DYNAMIC_FIXED: {
|
case NK_LAYOUT_DYNAMIC_FIXED: {
|
||||||
/* scaling fixed size widgets item width */
|
/* scaling fixed size widgets item width */
|
||||||
float w = NK_MAX(1.0f,panel_space) / (float)layout->row.columns;
|
item_width = NK_MAX(1.0f,panel_space) / (float)layout->row.columns;
|
||||||
item_offset = (float)layout->row.index * w;
|
item_offset = (float)layout->row.index * item_width;
|
||||||
item_width = w + NK_FRAC(item_offset);
|
|
||||||
item_spacing = (float)layout->row.index * spacing.x;
|
item_spacing = (float)layout->row.index * spacing.x;
|
||||||
} break;
|
} break;
|
||||||
case NK_LAYOUT_DYNAMIC_ROW: {
|
case NK_LAYOUT_DYNAMIC_ROW: {
|
||||||
/* scaling single ratio widget width */
|
/* scaling single ratio widget width */
|
||||||
float w = layout->row.item_width * panel_space;
|
item_width = layout->row.item_width * panel_space;
|
||||||
item_offset = layout->row.item_offset;
|
item_offset = layout->row.item_offset;
|
||||||
item_width = w + NK_FRAC(item_offset);
|
|
||||||
item_spacing = 0;
|
item_spacing = 0;
|
||||||
|
|
||||||
if (modify) {
|
if (modify) {
|
||||||
layout->row.item_offset += w + spacing.x;
|
layout->row.item_offset += item_width + spacing.x;
|
||||||
layout->row.filled += layout->row.item_width;
|
layout->row.filled += layout->row.item_width;
|
||||||
layout->row.index = 0;
|
layout->row.index = 0;
|
||||||
}
|
}
|
||||||
@@ -18208,24 +18051,23 @@ nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx,
|
|||||||
bounds->x -= (float)*layout->offset_x;
|
bounds->x -= (float)*layout->offset_x;
|
||||||
bounds->y = layout->at_y + (layout->row.height * layout->row.item.y);
|
bounds->y = layout->at_y + (layout->row.height * layout->row.item.y);
|
||||||
bounds->y -= (float)*layout->offset_y;
|
bounds->y -= (float)*layout->offset_y;
|
||||||
bounds->w = layout->bounds.w * layout->row.item.w + NK_FRAC(bounds->x);
|
bounds->w = layout->bounds.w * layout->row.item.w;
|
||||||
bounds->h = layout->row.height * layout->row.item.h + NK_FRAC(bounds->y);
|
bounds->h = layout->row.height * layout->row.item.h;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case NK_LAYOUT_DYNAMIC: {
|
case NK_LAYOUT_DYNAMIC: {
|
||||||
/* scaling arrays of panel width ratios for every widget */
|
/* scaling arrays of panel width ratios for every widget */
|
||||||
float ratio, w;
|
float ratio;
|
||||||
NK_ASSERT(layout->row.ratio);
|
NK_ASSERT(layout->row.ratio);
|
||||||
ratio = (layout->row.ratio[layout->row.index] < 0) ?
|
ratio = (layout->row.ratio[layout->row.index] < 0) ?
|
||||||
layout->row.item_width : layout->row.ratio[layout->row.index];
|
layout->row.item_width : layout->row.ratio[layout->row.index];
|
||||||
|
|
||||||
w = (ratio * panel_space);
|
|
||||||
item_spacing = (float)layout->row.index * spacing.x;
|
item_spacing = (float)layout->row.index * spacing.x;
|
||||||
|
item_width = (ratio * panel_space);
|
||||||
item_offset = layout->row.item_offset;
|
item_offset = layout->row.item_offset;
|
||||||
item_width = w + NK_FRAC(item_offset);
|
|
||||||
|
|
||||||
if (modify) {
|
if (modify) {
|
||||||
layout->row.item_offset += w;
|
layout->row.item_offset += item_width;
|
||||||
layout->row.filled += ratio;
|
layout->row.filled += ratio;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -18263,16 +18105,13 @@ nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx,
|
|||||||
} break;
|
} break;
|
||||||
case NK_LAYOUT_TEMPLATE: {
|
case NK_LAYOUT_TEMPLATE: {
|
||||||
/* stretchy row layout with combined dynamic/static widget width*/
|
/* stretchy row layout with combined dynamic/static widget width*/
|
||||||
float w;
|
|
||||||
NK_ASSERT(layout->row.index < layout->row.columns);
|
NK_ASSERT(layout->row.index < layout->row.columns);
|
||||||
NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
|
NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
|
||||||
w = layout->row.templates[layout->row.index];
|
item_width = layout->row.templates[layout->row.index];
|
||||||
item_offset = layout->row.item_offset;
|
item_offset = layout->row.item_offset;
|
||||||
item_width = w + NK_FRAC(item_offset);
|
|
||||||
item_spacing = (float)layout->row.index * spacing.x;
|
item_spacing = (float)layout->row.index * spacing.x;
|
||||||
if (modify) layout->row.item_offset += w;
|
if (modify) layout->row.item_offset += item_width;
|
||||||
} break;
|
} break;
|
||||||
#undef NK_FRAC
|
|
||||||
default: NK_ASSERT(0); break;
|
default: NK_ASSERT(0); break;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -18848,74 +18687,7 @@ nk_group_end(struct nk_context *ctx)
|
|||||||
{
|
{
|
||||||
nk_group_scrolled_end(ctx);
|
nk_group_scrolled_end(ctx);
|
||||||
}
|
}
|
||||||
NK_API void
|
|
||||||
nk_group_get_scroll(struct nk_context *ctx, const char *id, nk_uint *x_offset, nk_uint *y_offset)
|
|
||||||
{
|
|
||||||
int id_len;
|
|
||||||
nk_hash id_hash;
|
|
||||||
struct nk_window *win;
|
|
||||||
nk_uint *x_offset_ptr;
|
|
||||||
nk_uint *y_offset_ptr;
|
|
||||||
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(id);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
NK_ASSERT(ctx->current->layout);
|
|
||||||
if (!ctx || !ctx->current || !ctx->current->layout || !id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* find persistent group scrollbar value */
|
|
||||||
win = ctx->current;
|
|
||||||
id_len = (int)nk_strlen(id);
|
|
||||||
id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP);
|
|
||||||
x_offset_ptr = nk_find_value(win, id_hash);
|
|
||||||
if (!x_offset_ptr) {
|
|
||||||
x_offset_ptr = nk_add_value(ctx, win, id_hash, 0);
|
|
||||||
y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0);
|
|
||||||
|
|
||||||
NK_ASSERT(x_offset_ptr);
|
|
||||||
NK_ASSERT(y_offset_ptr);
|
|
||||||
if (!x_offset_ptr || !y_offset_ptr) return;
|
|
||||||
*x_offset_ptr = *y_offset_ptr = 0;
|
|
||||||
} else y_offset_ptr = nk_find_value(win, id_hash+1);
|
|
||||||
if (x_offset)
|
|
||||||
*x_offset = *x_offset_ptr;
|
|
||||||
if (y_offset)
|
|
||||||
*y_offset = *y_offset_ptr;
|
|
||||||
}
|
|
||||||
NK_API void
|
|
||||||
nk_group_set_scroll(struct nk_context *ctx, const char *id, nk_uint x_offset, nk_uint y_offset)
|
|
||||||
{
|
|
||||||
int id_len;
|
|
||||||
nk_hash id_hash;
|
|
||||||
struct nk_window *win;
|
|
||||||
nk_uint *x_offset_ptr;
|
|
||||||
nk_uint *y_offset_ptr;
|
|
||||||
|
|
||||||
NK_ASSERT(ctx);
|
|
||||||
NK_ASSERT(id);
|
|
||||||
NK_ASSERT(ctx->current);
|
|
||||||
NK_ASSERT(ctx->current->layout);
|
|
||||||
if (!ctx || !ctx->current || !ctx->current->layout || !id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* find persistent group scrollbar value */
|
|
||||||
win = ctx->current;
|
|
||||||
id_len = (int)nk_strlen(id);
|
|
||||||
id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP);
|
|
||||||
x_offset_ptr = nk_find_value(win, id_hash);
|
|
||||||
if (!x_offset_ptr) {
|
|
||||||
x_offset_ptr = nk_add_value(ctx, win, id_hash, 0);
|
|
||||||
y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0);
|
|
||||||
|
|
||||||
NK_ASSERT(x_offset_ptr);
|
|
||||||
NK_ASSERT(y_offset_ptr);
|
|
||||||
if (!x_offset_ptr || !y_offset_ptr) return;
|
|
||||||
*x_offset_ptr = *y_offset_ptr = 0;
|
|
||||||
} else y_offset_ptr = nk_find_value(win, id_hash+1);
|
|
||||||
*x_offset_ptr = x_offset;
|
|
||||||
*y_offset_ptr = y_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -21407,7 +21179,6 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
|
|||||||
{
|
{
|
||||||
nk_flags ws = 0;
|
nk_flags ws = 0;
|
||||||
int left_mouse_down;
|
int left_mouse_down;
|
||||||
int left_mouse_clicked;
|
|
||||||
int left_mouse_click_in_cursor;
|
int left_mouse_click_in_cursor;
|
||||||
float scroll_delta;
|
float scroll_delta;
|
||||||
|
|
||||||
@@ -21415,14 +21186,13 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
|
|||||||
if (!in) return scroll_offset;
|
if (!in) return scroll_offset;
|
||||||
|
|
||||||
left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
|
left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
|
||||||
left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked;
|
|
||||||
left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
|
left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
|
||||||
NK_BUTTON_LEFT, *cursor, nk_true);
|
NK_BUTTON_LEFT, *cursor, nk_true);
|
||||||
if (nk_input_is_mouse_hovering_rect(in, *scroll))
|
if (nk_input_is_mouse_hovering_rect(in, *scroll))
|
||||||
*state = NK_WIDGET_STATE_HOVERED;
|
*state = NK_WIDGET_STATE_HOVERED;
|
||||||
|
|
||||||
scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
|
scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
|
||||||
if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) {
|
if (left_mouse_down && left_mouse_click_in_cursor) {
|
||||||
/* update cursor by mouse dragging */
|
/* update cursor by mouse dragging */
|
||||||
float pixel, delta;
|
float pixel, delta;
|
||||||
*state = NK_WIDGET_STATE_ACTIVE;
|
*state = NK_WIDGET_STATE_ACTIVE;
|
||||||
@@ -25473,105 +25243,95 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// - [yy]: Minor version with non-breaking API and library changes
|
/// - [yy]: Minor version with non-breaking API and library changes
|
||||||
/// - [zz]: Bug fix version with no direct changes to API
|
/// - [zz]: Bug fix version with no direct changes to API
|
||||||
///
|
///
|
||||||
/// - 2019/09/20 (4.01.3) - Fixed a bug wherein combobox cannot be closed by clicking the header
|
/// - 2018/04/01 (4.00.1) - Fixed calling `nk_convert` multiple time per single frame
|
||||||
/// when NK_BUTTON_TRIGGER_ON_RELEASE is defined.
|
|
||||||
/// - 2019/09/10 (4.01.2) - Fixed the nk_cos function, which deviated significantly.
|
|
||||||
/// - 2019/09/08 (4.01.1) - Fixed a bug wherein re-baking of fonts caused a segmentation
|
|
||||||
/// fault due to dst_font->glyph_count not being zeroed on subsequent
|
|
||||||
/// bakes of the same set of fonts.
|
|
||||||
/// - 2019/06/23 (4.01.0) - Added nk_***_get_scroll and nk_***_set_scroll for groups, windows, and popups.
|
|
||||||
/// - 2019/06/12 (4.00.3) - Fix panel background drawing bug.
|
|
||||||
/// - 2018/10/31 (4.00.2) - Added NK_KEYSTATE_BASED_INPUT to "fix" state based backends
|
|
||||||
/// like GLFW without breaking key repeat behavior on event based.
|
|
||||||
/// - 2018/04/01 (4.00.1) - Fixed calling `nk_convert` multiple time per single frame.
|
|
||||||
/// - 2018/04/01 (4.00.0) - BREAKING CHANGE: nk_draw_list_clear no longer tries to
|
/// - 2018/04/01 (4.00.0) - BREAKING CHANGE: nk_draw_list_clear no longer tries to
|
||||||
/// clear provided buffers. So make sure to either free
|
/// clear provided buffers. So make sure to either free
|
||||||
/// or clear each passed buffer after calling nk_convert.
|
/// or clear each passed buffer after calling nk_convert.
|
||||||
/// - 2018/02/23 (3.00.6) - Fixed slider dragging behavior.
|
/// - 2018/02/23 (3.00.6) - Fixed slider dragging behavior
|
||||||
/// - 2018/01/31 (3.00.5) - Fixed overcalculation of cursor data in font baking process.
|
/// - 2018/01/31 (3.00.5) - Fixed overcalculation of cursor data in font baking process
|
||||||
/// - 2018/01/31 (3.00.4) - Removed name collision with stb_truetype.
|
/// - 2018/01/31 (3.00.4) - Removed name collision with stb_truetype
|
||||||
/// - 2018/01/28 (3.00.3) - Fixed panel window border drawing bug.
|
/// - 2018/01/28 (3.00.3) - Fixed panel window border drawing bug
|
||||||
/// - 2018/01/12 (3.00.2) - Added `nk_group_begin_titled` for separed group identifier and title.
|
/// - 2018/01/12 (3.00.2) - Added `nk_group_begin_titled` for separed group identifier and title
|
||||||
/// - 2018/01/07 (3.00.1) - Started to change documentation style.
|
/// - 2018/01/07 (3.00.1) - Started to change documentation style
|
||||||
/// - 2018/01/05 (3.00.0) - BREAKING CHANGE: The previous color picker API was broken
|
/// - 2018/01/05 (3.00.0) - BREAKING CHANGE: The previous color picker API was broken
|
||||||
/// because of conversions between float and byte color representation.
|
/// because of conversions between float and byte color representation.
|
||||||
/// Color pickers now use floating point values to represent
|
/// Color pickers now use floating point values to represent
|
||||||
/// HSV values. To get back the old behavior I added some additional
|
/// HSV values. To get back the old behavior I added some additional
|
||||||
/// color conversion functions to cast between nk_color and
|
/// color conversion functions to cast between nk_color and
|
||||||
/// nk_colorf.
|
/// nk_colorf.
|
||||||
/// - 2017/12/23 (2.00.7) - Fixed small warning.
|
/// - 2017/12/23 (2.00.7) - Fixed small warning
|
||||||
/// - 2017/12/23 (2.00.7) - Fixed `nk_edit_buffer` behavior if activated to allow input.
|
/// - 2017/12/23 (2.00.7) - Fixed nk_edit_buffer behavior if activated to allow input
|
||||||
/// - 2017/12/23 (2.00.7) - Fixed modifyable progressbar dragging visuals and input behavior.
|
/// - 2017/12/23 (2.00.7) - Fixed modifyable progressbar dragging visuals and input behavior
|
||||||
/// - 2017/12/04 (2.00.6) - Added formated string tooltip widget.
|
/// - 2017/12/04 (2.00.6) - Added formated string tooltip widget
|
||||||
/// - 2017/11/18 (2.00.5) - Fixed window becoming hidden with flag `NK_WINDOW_NO_INPUT`.
|
/// - 2017/11/18 (2.00.5) - Fixed window becoming hidden with flag NK_WINDOW_NO_INPUT
|
||||||
/// - 2017/11/15 (2.00.4) - Fixed font merging.
|
/// - 2017/11/15 (2.00.4) - Fixed font merging
|
||||||
/// - 2017/11/07 (2.00.3) - Fixed window size and position modifier functions.
|
/// - 2017/11/07 (2.00.3) - Fixed window size and position modifier functions
|
||||||
/// - 2017/09/14 (2.00.2) - Fixed `nk_edit_buffer` and `nk_edit_focus` behavior.
|
/// - 2017/09/14 (2.00.2) - Fixed nk_edit_buffer and nk_edit_focus behavior
|
||||||
/// - 2017/09/14 (2.00.1) - Fixed window closing behavior.
|
/// - 2017/09/14 (2.00.1) - Fixed window closing behavior
|
||||||
/// - 2017/09/14 (2.00.0) - BREAKING CHANGE: Modifing window position and size funtions now
|
/// - 2017/09/14 (2.00.0) - BREAKING CHANGE: Modifing window position and size funtions now
|
||||||
/// require the name of the window and must happen outside the window
|
/// require the name of the window and must happen outside the window
|
||||||
/// building process (between function call nk_begin and nk_end).
|
/// building process (between function call nk_begin and nk_end).
|
||||||
/// - 2017/09/11 (1.40.9) - Fixed window background flag if background window is declared last.
|
/// - 2017/09/11 (1.40.9) - Fixed window background flag if background window is declared last
|
||||||
/// - 2017/08/27 (1.40.8) - Fixed `nk_item_is_any_active` for hidden windows.
|
/// - 2017/08/27 (1.40.8) - Fixed `nk_item_is_any_active` for hidden windows
|
||||||
/// - 2017/08/27 (1.40.7) - Fixed window background flag.
|
/// - 2017/08/27 (1.40.7) - Fixed window background flag
|
||||||
/// - 2017/07/07 (1.40.6) - Fixed missing clipping rect check for hovering/clicked
|
/// - 2017/07/07 (1.40.6) - Fixed missing clipping rect check for hovering/clicked
|
||||||
/// query for widgets.
|
/// query for widgets
|
||||||
/// - 2017/07/07 (1.40.5) - Fixed drawing bug for vertex output for lines and stroked
|
/// - 2017/07/07 (1.40.5) - Fixed drawing bug for vertex output for lines and stroked
|
||||||
/// and filled rectangles.
|
/// and filled rectangles
|
||||||
/// - 2017/07/07 (1.40.4) - Fixed bug in nk_convert trying to add windows that are in
|
/// - 2017/07/07 (1.40.4) - Fixed bug in nk_convert trying to add windows that are in
|
||||||
/// process of being destroyed.
|
/// process of being destroyed.
|
||||||
/// - 2017/07/07 (1.40.3) - Fixed table internal bug caused by storing table size in
|
/// - 2017/07/07 (1.40.3) - Fixed table internal bug caused by storing table size in
|
||||||
/// window instead of directly in table.
|
/// window instead of directly in table.
|
||||||
/// - 2017/06/30 (1.40.2) - Removed unneeded semicolon in C++ NK_ALIGNOF macro.
|
/// - 2017/06/30 (1.40.2) - Removed unneeded semicolon in C++ NK_ALIGNOF macro
|
||||||
/// - 2017/06/30 (1.40.1) - Fixed drawing lines smaller or equal zero.
|
/// - 2017/06/30 (1.40.1) - Fixed drawing lines smaller or equal zero
|
||||||
/// - 2017/06/08 (1.40.0) - Removed the breaking part of last commit. Auto layout now only
|
/// - 2017/06/08 (1.40.0) - Removed the breaking part of last commit. Auto layout now only
|
||||||
/// comes in effect if you pass in zero was row height argument.
|
/// comes in effect if you pass in zero was row height argument
|
||||||
/// - 2017/06/08 (1.40.0) - BREAKING CHANGE: while not directly API breaking it will change
|
/// - 2017/06/08 (1.40.0) - BREAKING CHANGE: while not directly API breaking it will change
|
||||||
/// how layouting works. From now there will be an internal minimum
|
/// how layouting works. From now there will be an internal minimum
|
||||||
/// row height derived from font height. If you need a row smaller than
|
/// row height derived from font height. If you need a row smaller than
|
||||||
/// that you can directly set it by `nk_layout_set_min_row_height` and
|
/// that you can directly set it by `nk_layout_set_min_row_height` and
|
||||||
/// reset the value back by calling `nk_layout_reset_min_row_height.
|
/// reset the value back by calling `nk_layout_reset_min_row_height.
|
||||||
/// - 2017/06/08 (1.39.1) - Fixed property text edit handling bug caused by past `nk_widget` fix.
|
/// - 2017/06/08 (1.39.1) - Fixed property text edit handling bug caused by past `nk_widget` fix
|
||||||
/// - 2017/06/08 (1.39.0) - Added function to retrieve window space without calling a `nk_layout_xxx` function.
|
/// - 2017/06/08 (1.39.0) - Added function to retrieve window space without calling a nk_layout_xxx function
|
||||||
/// - 2017/06/06 (1.38.5) - Fixed `nk_convert` return flag for command buffer.
|
/// - 2017/06/06 (1.38.5) - Fixed `nk_convert` return flag for command buffer
|
||||||
/// - 2017/05/23 (1.38.4) - Fixed activation behavior for widgets partially clipped.
|
/// - 2017/05/23 (1.38.4) - Fixed activation behavior for widgets partially clipped
|
||||||
/// - 2017/05/10 (1.38.3) - Fixed wrong min window size mouse scaling over boundries.
|
/// - 2017/05/10 (1.38.3) - Fixed wrong min window size mouse scaling over boundries
|
||||||
/// - 2017/05/09 (1.38.2) - Fixed vertical scrollbar drawing with not enough space.
|
/// - 2017/05/09 (1.38.2) - Fixed vertical scrollbar drawing with not enough space
|
||||||
/// - 2017/05/09 (1.38.1) - Fixed scaler dragging behavior if window size hits minimum size.
|
/// - 2017/05/09 (1.38.1) - Fixed scaler dragging behavior if window size hits minimum size
|
||||||
/// - 2017/05/06 (1.38.0) - Added platform double-click support.
|
/// - 2017/05/06 (1.38.0) - Added platform double-click support
|
||||||
/// - 2017/04/20 (1.37.1) - Fixed key repeat found inside glfw demo backends.
|
/// - 2017/04/20 (1.37.1) - Fixed key repeat found inside glfw demo backends
|
||||||
/// - 2017/04/20 (1.37.0) - Extended properties with selection and clipboard support.
|
/// - 2017/04/20 (1.37.0) - Extended properties with selection and clipbard support
|
||||||
/// - 2017/04/20 (1.36.2) - Fixed #405 overlapping rows with zero padding and spacing.
|
/// - 2017/04/20 (1.36.2) - Fixed #405 overlapping rows with zero padding and spacing
|
||||||
/// - 2017/04/09 (1.36.1) - Fixed #403 with another widget float error.
|
/// - 2017/04/09 (1.36.1) - Fixed #403 with another widget float error
|
||||||
/// - 2017/04/09 (1.36.0) - Added window `NK_WINDOW_NO_INPUT` and `NK_WINDOW_NOT_INTERACTIVE` flags.
|
/// - 2017/04/09 (1.36.0) - Added window `NK_WINDOW_NO_INPUT` and `NK_WINDOW_NOT_INTERACTIVE` flags
|
||||||
/// - 2017/04/09 (1.35.3) - Fixed buffer heap corruption.
|
/// - 2017/04/09 (1.35.3) - Fixed buffer heap corruption
|
||||||
/// - 2017/03/25 (1.35.2) - Fixed popup overlapping for `NK_WINDOW_BACKGROUND` windows.
|
/// - 2017/03/25 (1.35.2) - Fixed popup overlapping for `NK_WINDOW_BACKGROUND` windows
|
||||||
/// - 2017/03/25 (1.35.1) - Fixed windows closing behavior.
|
/// - 2017/03/25 (1.35.1) - Fixed windows closing behavior
|
||||||
/// - 2017/03/18 (1.35.0) - Added horizontal scroll requested in #377.
|
/// - 2017/03/18 (1.35.0) - Added horizontal scroll requested in #377
|
||||||
/// - 2017/03/18 (1.34.3) - Fixed long window header titles.
|
/// - 2017/03/18 (1.34.3) - Fixed long window header titles
|
||||||
/// - 2017/03/04 (1.34.2) - Fixed text edit filtering.
|
/// - 2017/03/04 (1.34.2) - Fixed text edit filtering
|
||||||
/// - 2017/03/04 (1.34.1) - Fixed group closable flag.
|
/// - 2017/03/04 (1.34.1) - Fixed group closable flag
|
||||||
/// - 2017/02/25 (1.34.0) - Added custom draw command for better language binding support.
|
/// - 2017/02/25 (1.34.0) - Added custom draw command for better language binding support
|
||||||
/// - 2017/01/24 (1.33.0) - Added programatic way of remove edit focus.
|
/// - 2017/01/24 (1.33.0) - Added programatic way of remove edit focus
|
||||||
/// - 2017/01/24 (1.32.3) - Fixed wrong define for basic type definitions for windows.
|
/// - 2017/01/24 (1.32.3) - Fixed wrong define for basic type definitions for windows
|
||||||
/// - 2017/01/21 (1.32.2) - Fixed input capture from hidden or closed windows.
|
/// - 2017/01/21 (1.32.2) - Fixed input capture from hidden or closed windows
|
||||||
/// - 2017/01/21 (1.32.1) - Fixed slider behavior and drawing.
|
/// - 2017/01/21 (1.32.1) - Fixed slider behavior and drawing
|
||||||
/// - 2017/01/13 (1.32.0) - Added flag to put scaler into the bottom left corner.
|
/// - 2017/01/13 (1.32.0) - Added flag to put scaler into the bottom left corner
|
||||||
/// - 2017/01/13 (1.31.0) - Added additional row layouting method to combine both
|
/// - 2017/01/13 (1.31.0) - Added additional row layouting method to combine both
|
||||||
/// dynamic and static widgets.
|
/// dynamic and static widgets.
|
||||||
/// - 2016/12/31 (1.30.0) - Extended scrollbar offset from 16-bit to 32-bit.
|
/// - 2016/12/31 (1.30.0) - Extended scrollbar offset from 16-bit to 32-bit
|
||||||
/// - 2016/12/31 (1.29.2) - Fixed closing window bug of minimized windows.
|
/// - 2016/12/31 (1.29.2)- Fixed closing window bug of minimized windows
|
||||||
/// - 2016/12/03 (1.29.1) - Fixed wrapped text with no seperator and C89 error.
|
/// - 2016/12/03 (1.29.1)- Fixed wrapped text with no seperator and C89 error
|
||||||
/// - 2016/12/03 (1.29.0) - Changed text wrapping to process words not characters.
|
/// - 2016/12/03 (1.29.0) - Changed text wrapping to process words not characters
|
||||||
/// - 2016/11/22 (1.28.6) - Fixed window minimized closing bug.
|
/// - 2016/11/22 (1.28.6)- Fixed window minimized closing bug
|
||||||
/// - 2016/11/19 (1.28.5) - Fixed abstract combo box closing behavior.
|
/// - 2016/11/19 (1.28.5)- Fixed abstract combo box closing behavior
|
||||||
/// - 2016/11/19 (1.28.4) - Fixed tooltip flickering.
|
/// - 2016/11/19 (1.28.4)- Fixed tooltip flickering
|
||||||
/// - 2016/11/19 (1.28.3) - Fixed memory leak caused by popup repeated closing.
|
/// - 2016/11/19 (1.28.3)- Fixed memory leak caused by popup repeated closing
|
||||||
/// - 2016/11/18 (1.28.2) - Fixed memory leak caused by popup panel allocation.
|
/// - 2016/11/18 (1.28.2)- Fixed memory leak caused by popup panel allocation
|
||||||
/// - 2016/11/10 (1.28.1) - Fixed some warnings and C++ error.
|
/// - 2016/11/10 (1.28.1)- Fixed some warnings and C++ error
|
||||||
/// - 2016/11/10 (1.28.0)- Added additional `nk_button` versions which allows to directly
|
/// - 2016/11/10 (1.28.0)- Added additional `nk_button` versions which allows to directly
|
||||||
/// pass in a style struct to change buttons visual.
|
/// pass in a style struct to change buttons visual.
|
||||||
/// - 2016/11/10 (1.27.0) - Added additional `nk_tree` versions to support external state
|
/// - 2016/11/10 (1.27.0)- Added additional 'nk_tree' versions to support external state
|
||||||
/// storage. Just like last the `nk_group` commit the main
|
/// storage. Just like last the `nk_group` commit the main
|
||||||
/// advantage is that you optionally can minimize nuklears runtime
|
/// advantage is that you optionally can minimize nuklears runtime
|
||||||
/// memory consumption or handle hash collisions.
|
/// memory consumption or handle hash collisions.
|
||||||
@@ -25582,25 +25342,25 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// want the name. In addition I added `nk_list_view` which allows
|
/// want the name. In addition I added `nk_list_view` which allows
|
||||||
/// to draw big lists inside a group without actually having to
|
/// to draw big lists inside a group without actually having to
|
||||||
/// commit the whole list to nuklear (issue #269).
|
/// commit the whole list to nuklear (issue #269).
|
||||||
/// - 2016/10/30 (1.25.1) - Fixed clipping rectangle bug inside `nk_draw_list`.
|
/// - 2016/10/30 (1.25.1)- Fixed clipping rectangle bug inside `nk_draw_list`
|
||||||
/// - 2016/10/29 (1.25.0)- Pulled `nk_panel` memory management into nuklear and out of
|
/// - 2016/10/29 (1.25.0)- Pulled `nk_panel` memory management into nuklear and out of
|
||||||
/// the hands of the user. From now on users don't have to care
|
/// the hands of the user. From now on users don't have to care
|
||||||
/// about panels unless they care about some information. If you
|
/// about panels unless they care about some information. If you
|
||||||
/// still need the panel just call `nk_window_get_panel`.
|
/// still need the panel just call `nk_window_get_panel`.
|
||||||
/// - 2016/10/21 (1.24.0)- Changed widget border drawing to stroked rectangle from filled
|
/// - 2016/10/21 (1.24.0)- Changed widget border drawing to stroked rectangle from filled
|
||||||
/// rectangle for less overdraw and widget background transparency.
|
/// rectangle for less overdraw and widget background transparency.
|
||||||
/// - 2016/10/18 (1.23.0) - Added `nk_edit_focus` for manually edit widget focus control.
|
/// - 2016/10/18 (1.23.0)- Added `nk_edit_focus` for manually edit widget focus control
|
||||||
/// - 2016/09/29 (1.22.7) - Fixed deduction of basic type in non `<stdint.h>` compilation.
|
/// - 2016/09/29 (1.22.7)- Fixed deduction of basic type in non `<stdint.h>` compilation
|
||||||
/// - 2016/09/29 (1.22.6) - Fixed edit widget UTF-8 text cursor drawing bug.
|
/// - 2016/09/29 (1.22.6)- Fixed edit widget UTF-8 text cursor drawing bug
|
||||||
/// - 2016/09/28 (1.22.5) - Fixed edit widget UTF-8 text appending/inserting/removing.
|
/// - 2016/09/28 (1.22.5)- Fixed edit widget UTF-8 text appending/inserting/removing
|
||||||
/// - 2016/09/28 (1.22.4)- Fixed drawing bug inside edit widgets which offset all text
|
/// - 2016/09/28 (1.22.4)- Fixed drawing bug inside edit widgets which offset all text
|
||||||
/// text in every edit widget if one of them is scrolled.
|
/// text in every edit widget if one of them is scrolled.
|
||||||
/// - 2016/09/28 (1.22.3)- Fixed small bug in edit widgets if not active. The wrong
|
/// - 2016/09/28 (1.22.3)- Fixed small bug in edit widgets if not active. The wrong
|
||||||
/// text length is passed. It should have been in bytes but
|
/// text length is passed. It should have been in bytes but
|
||||||
/// was passed as glyphes.
|
/// was passed as glyphes.
|
||||||
/// - 2016/09/20 (1.22.2) - Fixed color button size calculation.
|
/// - 2016/09/20 (1.22.2)- Fixed color button size calculation
|
||||||
/// - 2016/09/20 (1.22.1) - Fixed some `nk_vsnprintf` behavior bugs and removed `<stdio.h>`
|
/// - 2016/09/20 (1.22.1)- Fixed some `nk_vsnprintf` behavior bugs and removed
|
||||||
/// again from `NK_INCLUDE_STANDARD_VARARGS`.
|
/// `<stdio.h>` again from `NK_INCLUDE_STANDARD_VARARGS`.
|
||||||
/// - 2016/09/18 (1.22.0)- C89 does not support vsnprintf only C99 and newer as well
|
/// - 2016/09/18 (1.22.0)- C89 does not support vsnprintf only C99 and newer as well
|
||||||
/// as C++11 and newer. In addition to use vsnprintf you have
|
/// as C++11 and newer. In addition to use vsnprintf you have
|
||||||
/// to include <stdio.h>. So just defining `NK_INCLUDE_STD_VAR_ARGS`
|
/// to include <stdio.h>. So just defining `NK_INCLUDE_STD_VAR_ARGS`
|
||||||
@@ -25608,14 +25368,14 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// both varargs as well as stdio is selected I try to use
|
/// both varargs as well as stdio is selected I try to use
|
||||||
/// vsnprintf if not possible I will revert to vsprintf. If
|
/// vsnprintf if not possible I will revert to vsprintf. If
|
||||||
/// varargs but not stdio was defined I will use my own function.
|
/// varargs but not stdio was defined I will use my own function.
|
||||||
/// - 2016/09/15 (1.21.2) - Fixed panel `close` behavior for deeper panel levels.
|
/// - 2016/09/15 (1.21.2)- Fixed panel `close` behavior for deeper panel levels
|
||||||
/// - 2016/09/15 (1.21.1) - Fixed C++ errors and wrong argument to `nk_panel_get_xxxx`.
|
/// - 2016/09/15 (1.21.1)- Fixed C++ errors and wrong argument to `nk_panel_get_xxxx`
|
||||||
/// - 2016/09/13 (1.21.0) - !BREAKING! Fixed nonblocking popup behavior in menu, combo,
|
/// - 2016/09/13 (1.21.0) - !BREAKING! Fixed nonblocking popup behavior in menu, combo,
|
||||||
/// and contextual which prevented closing in y-direction if
|
/// and contextual which prevented closing in y-direction if
|
||||||
/// popup did not reach max height.
|
/// popup did not reach max height.
|
||||||
/// In addition the height parameter was changed into vec2
|
/// In addition the height parameter was changed into vec2
|
||||||
/// for width and height to have more control over the popup size.
|
/// for width and height to have more control over the popup size.
|
||||||
/// - 2016/09/13 (1.20.3) - Cleaned up and extended type selection.
|
/// - 2016/09/13 (1.20.3) - Cleaned up and extended type selection
|
||||||
/// - 2016/09/13 (1.20.2)- Fixed slider behavior hopefully for the last time. This time
|
/// - 2016/09/13 (1.20.2)- Fixed slider behavior hopefully for the last time. This time
|
||||||
/// all calculation are correct so no more hackery.
|
/// all calculation are correct so no more hackery.
|
||||||
/// - 2016/09/13 (1.20.1)- Internal change to divide window/panel flags into panel flags and types.
|
/// - 2016/09/13 (1.20.1)- Internal change to divide window/panel flags into panel flags and types.
|
||||||
@@ -25638,17 +25398,17 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// `NK_SYMBOL_CIRCLE_OUTLINE`.
|
/// `NK_SYMBOL_CIRCLE_OUTLINE`.
|
||||||
/// - 2016/09/08 (1.16.0)- Added additional checks to select correct types if `NK_INCLUDE_FIXED_TYPES`
|
/// - 2016/09/08 (1.16.0)- Added additional checks to select correct types if `NK_INCLUDE_FIXED_TYPES`
|
||||||
/// is not defined by supporting the biggest compiler GCC, clang and MSVC.
|
/// is not defined by supporting the biggest compiler GCC, clang and MSVC.
|
||||||
/// - 2016/09/07 (1.15.3) - Fixed `NK_INCLUDE_COMMAND_USERDATA` define to not cause an error.
|
/// - 2016/09/07 (1.15.3)- Fixed `NK_INCLUDE_COMMAND_USERDATA` define to not cause an error
|
||||||
/// - 2016/09/04 (1.15.2) - Fixed wrong combobox height calculation.
|
/// - 2016/09/04 (1.15.2)- Fixed wrong combobox height calculation
|
||||||
/// - 2016/09/03 (1.15.1) - Fixed gaps inside combo boxes in OpenGL.
|
/// - 2016/09/03 (1.15.1)- Fixed gaps inside combo boxes in OpenGL
|
||||||
/// - 2016/09/02 (1.15.0) - Changed nuklear to not have any default vertex layout and
|
/// - 2016/09/02 (1.15.0) - Changed nuklear to not have any default vertex layout and
|
||||||
/// instead made it user provided. The range of types to convert
|
/// instead made it user provided. The range of types to convert
|
||||||
/// to is quite limited at the moment, but I would be more than
|
/// to is quite limited at the moment, but I would be more than
|
||||||
/// happy to accept PRs to add additional.
|
/// happy to accept PRs to add additional.
|
||||||
/// - 2016/08/30 (1.14.2) - Removed unused variables.
|
/// - 2016/08/30 (1.14.2) - Removed unused variables
|
||||||
/// - 2016/08/30 (1.14.1) - Fixed C++ build errors.
|
/// - 2016/08/30 (1.14.1) - Fixed C++ build errors
|
||||||
/// - 2016/08/30 (1.14.0) - Removed mouse dragging from SDL demo since it does not work correctly.
|
/// - 2016/08/30 (1.14.0) - Removed mouse dragging from SDL demo since it does not work correctly
|
||||||
/// - 2016/08/30 (1.13.4) - Tweaked some default styling variables.
|
/// - 2016/08/30 (1.13.4) - Tweaked some default styling variables
|
||||||
/// - 2016/08/30 (1.13.3) - Hopefully fixed drawing bug in slider, in general I would
|
/// - 2016/08/30 (1.13.3) - Hopefully fixed drawing bug in slider, in general I would
|
||||||
/// refrain from using slider with a big number of steps.
|
/// refrain from using slider with a big number of steps.
|
||||||
/// - 2016/08/30 (1.13.2) - Fixed close and minimize button which would fire even if the
|
/// - 2016/08/30 (1.13.2) - Fixed close and minimize button which would fire even if the
|
||||||
@@ -25658,28 +25418,28 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// - 2016/08/30 (1.13.0) - Removed `NK_WINDOW_DYNAMIC` flag from public API since
|
/// - 2016/08/30 (1.13.0) - Removed `NK_WINDOW_DYNAMIC` flag from public API since
|
||||||
/// it is bugged and causes issues in window selection.
|
/// it is bugged and causes issues in window selection.
|
||||||
/// - 2016/08/30 (1.12.0) - Removed scaler size. The size of the scaler is now
|
/// - 2016/08/30 (1.12.0) - Removed scaler size. The size of the scaler is now
|
||||||
/// determined by the scrollbar size.
|
/// determined by the scrollbar size
|
||||||
/// - 2016/08/30 (1.11.2) - Fixed some drawing bugs caused by changes from 1.11.0.
|
/// - 2016/08/30 (1.11.2) - Fixed some drawing bugs caused by changes from 1.11
|
||||||
/// - 2016/08/30 (1.11.1) - Fixed overlapping minimized window selection.
|
/// - 2016/08/30 (1.11.1) - Fixed overlapping minimized window selection
|
||||||
/// - 2016/08/30 (1.11.0) - Removed some internal complexity and overly complex code
|
/// - 2016/08/30 (1.11.0) - Removed some internal complexity and overly complex code
|
||||||
/// handling panel padding and panel border.
|
/// handling panel padding and panel border.
|
||||||
/// - 2016/08/29 (1.10.0) - Added additional height parameter to `nk_combobox_xxx`.
|
/// - 2016/08/29 (1.10.0) - Added additional height parameter to `nk_combobox_xxx`
|
||||||
/// - 2016/08/29 (1.10.0) - Fixed drawing bug in dynamic popups.
|
/// - 2016/08/29 (1.10.0) - Fixed drawing bug in dynamic popups
|
||||||
/// - 2016/08/29 (1.10.0) - Added experimental mouse scrolling to popups, menus and comboboxes.
|
/// - 2016/08/29 (1.10.0) - Added experimental mouse scrolling to popups, menus and comboboxes
|
||||||
/// - 2016/08/26 (1.10.0) - Added window name string prepresentation to account for
|
/// - 2016/08/26 (1.10.0) - Added window name string prepresentation to account for
|
||||||
/// hash collisions. Currently limited to `NK_WINDOW_MAX_NAME`
|
/// hash collisions. Currently limited to NK_WINDOW_MAX_NAME
|
||||||
/// which in term can be redefined if not big enough.
|
/// which in term can be redefined if not big enough.
|
||||||
/// - 2016/08/26 (1.10.0) - Added stacks for temporary style/UI changes in code.
|
/// - 2016/08/26 (1.10.0) - Added stacks for temporary style/UI changes in code
|
||||||
/// - 2016/08/25 (1.10.0) - Changed `nk_input_is_key_pressed` and 'nk_input_is_key_released'
|
/// - 2016/08/25 (1.10.0) - Changed `nk_input_is_key_pressed` and 'nk_input_is_key_released'
|
||||||
/// to account for key press and release happening in one frame.
|
/// to account for key press and release happening in one frame.
|
||||||
/// - 2016/08/25 (1.10.0) - Added additional nk_edit flag to directly jump to the end on activate.
|
/// - 2016/08/25 (1.10.0) - Added additional nk_edit flag to directly jump to the end on activate
|
||||||
/// - 2016/08/17 (1.09.6) - Removed invalid check for value zero in `nk_propertyx`.
|
/// - 2016/08/17 (1.09.6)- Removed invalid check for value zero in nk_propertyx
|
||||||
/// - 2016/08/16 (1.09.5)- Fixed ROM mode for deeper levels of popup windows parents.
|
/// - 2016/08/16 (1.09.5)- Fixed ROM mode for deeper levels of popup windows parents.
|
||||||
/// - 2016/08/15 (1.09.4)- Editbox are now still active if enter was pressed with flag
|
/// - 2016/08/15 (1.09.4)- Editbox are now still active if enter was pressed with flag
|
||||||
/// `NK_EDIT_SIG_ENTER`. Main reasoning is to be able to keep
|
/// `NK_EDIT_SIG_ENTER`. Main reasoning is to be able to keep
|
||||||
/// typing after commiting.
|
/// typing after commiting.
|
||||||
/// - 2016/08/15 (1.09.4) - Removed redundant code.
|
/// - 2016/08/15 (1.09.4)- Removed redundant code
|
||||||
/// - 2016/08/15 (1.09.4) - Fixed negative numbers in `nk_strtoi` and remove unused variable.
|
/// - 2016/08/15 (1.09.4)- Fixed negative numbers in `nk_strtoi` and remove unused variable
|
||||||
/// - 2016/08/15 (1.09.3)- Fixed `NK_WINDOW_BACKGROUND` flag behavior to select a background
|
/// - 2016/08/15 (1.09.3)- Fixed `NK_WINDOW_BACKGROUND` flag behavior to select a background
|
||||||
/// window only as selected by hovering and not by clicking.
|
/// window only as selected by hovering and not by clicking.
|
||||||
/// - 2016/08/14 (1.09.2)- Fixed a bug in font atlas which caused wrong loading
|
/// - 2016/08/14 (1.09.2)- Fixed a bug in font atlas which caused wrong loading
|
||||||
@@ -25687,7 +25447,7 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// - 2016/08/12 (1.09.1)- Added additional function to check if window is currently
|
/// - 2016/08/12 (1.09.1)- Added additional function to check if window is currently
|
||||||
/// hidden and therefore not visible.
|
/// hidden and therefore not visible.
|
||||||
/// - 2016/08/12 (1.09.1)- nk_window_is_closed now queries the correct flag `NK_WINDOW_CLOSED`
|
/// - 2016/08/12 (1.09.1)- nk_window_is_closed now queries the correct flag `NK_WINDOW_CLOSED`
|
||||||
/// instead of the old flag `NK_WINDOW_HIDDEN`.
|
/// instead of the old flag `NK_WINDOW_HIDDEN`
|
||||||
/// - 2016/08/09 (1.09.0) - Added additional double version to nk_property and changed
|
/// - 2016/08/09 (1.09.0) - Added additional double version to nk_property and changed
|
||||||
/// the underlying implementation to not cast to float and instead
|
/// the underlying implementation to not cast to float and instead
|
||||||
/// work directly on the given values.
|
/// work directly on the given values.
|
||||||
@@ -25697,7 +25457,7 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal
|
/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal
|
||||||
/// string to floating point number conversion for additional
|
/// string to floating point number conversion for additional
|
||||||
/// precision.
|
/// precision.
|
||||||
/// - 2016/08/08 (1.07.2) - Fixed compiling error without define `NK_INCLUDE_FIXED_TYPE`.
|
/// - 2016/08/08 (1.07.2)- Fixed compiling error without define NK_INCLUDE_FIXED_TYPE
|
||||||
/// - 2016/08/08 (1.07.1)- Fixed possible floating point error inside `nk_widget` leading
|
/// - 2016/08/08 (1.07.1)- Fixed possible floating point error inside `nk_widget` leading
|
||||||
/// to wrong wiget width calculation which results in widgets falsly
|
/// to wrong wiget width calculation which results in widgets falsly
|
||||||
/// becomming tagged as not inside window and cannot be accessed.
|
/// becomming tagged as not inside window and cannot be accessed.
|
||||||
@@ -25709,31 +25469,31 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// remain.
|
/// remain.
|
||||||
/// - 2016/08/08 (1.06.0) - Added `nk_edit_string_zero_terminated` as a second option to
|
/// - 2016/08/08 (1.06.0) - Added `nk_edit_string_zero_terminated` as a second option to
|
||||||
/// `nk_edit_string` which takes, edits and outputs a '\0' terminated string.
|
/// `nk_edit_string` which takes, edits and outputs a '\0' terminated string.
|
||||||
/// - 2016/08/08 (1.05.4) - Fixed scrollbar auto hiding behavior.
|
/// - 2016/08/08 (1.05.4)- Fixed scrollbar auto hiding behavior
|
||||||
/// - 2016/08/08 (1.05.3) - Fixed wrong panel padding selection in `nk_layout_widget_space`.
|
/// - 2016/08/08 (1.05.3)- Fixed wrong panel padding selection in `nk_layout_widget_space`
|
||||||
/// - 2016/08/07 (1.05.2)- Fixed old bug in dynamic immediate mode layout API, calculating
|
/// - 2016/08/07 (1.05.2)- Fixed old bug in dynamic immediate mode layout API, calculating
|
||||||
/// wrong item spacing and panel width.
|
/// wrong item spacing and panel width.
|
||||||
/// - 2016/08/07 (1.05.1) - Hopefully finally fixed combobox popup drawing bug.
|
///- 2016/08/07 (1.05.1)- Hopefully finally fixed combobox popup drawing bug
|
||||||
/// - 2016/08/07 (1.05.0) - Split varargs away from `NK_INCLUDE_STANDARD_IO` into own
|
///- 2016/08/07 (1.05.0) - Split varargs away from NK_INCLUDE_STANDARD_IO into own
|
||||||
/// define `NK_INCLUDE_STANDARD_VARARGS` to allow more fine
|
/// define NK_INCLUDE_STANDARD_VARARGS to allow more fine
|
||||||
/// grained controlled over library includes.
|
/// grained controlled over library includes.
|
||||||
/// - 2016/08/06 (1.04.5) - Changed memset calls to `NK_MEMSET`.
|
/// - 2016/08/06 (1.04.5)- Changed memset calls to NK_MEMSET
|
||||||
/// - 2016/08/04 (1.04.4) - Fixed fast window scaling behavior.
|
/// - 2016/08/04 (1.04.4)- Fixed fast window scaling behavior
|
||||||
/// - 2016/08/04 (1.04.3)- Fixed window scaling, movement bug which appears if you
|
/// - 2016/08/04 (1.04.3)- Fixed window scaling, movement bug which appears if you
|
||||||
/// move/scale a window and another window is behind it.
|
/// move/scale a window and another window is behind it.
|
||||||
/// If you are fast enough then the window behind gets activated
|
/// If you are fast enough then the window behind gets activated
|
||||||
/// and the operation is blocked. I now require activating
|
/// and the operation is blocked. I now require activating
|
||||||
/// by hovering only if mouse is not pressed.
|
/// by hovering only if mouse is not pressed.
|
||||||
/// - 2016/08/04 (1.04.2) - Fixed changing fonts.
|
/// - 2016/08/04 (1.04.2)- Fixed changing fonts
|
||||||
/// - 2016/08/03 (1.04.1) - Fixed `NK_WINDOW_BACKGROUND` behavior.
|
/// - 2016/08/03 (1.04.1)- Fixed `NK_WINDOW_BACKGROUND` behavior
|
||||||
/// - 2016/08/03 (1.04.0) - Added color parameter to `nk_draw_image`.
|
/// - 2016/08/03 (1.04.0) - Added color parameter to `nk_draw_image`
|
||||||
/// - 2016/08/03 (1.04.0) - Added additional window padding style attributes for
|
/// - 2016/08/03 (1.04.0) - Added additional window padding style attributes for
|
||||||
/// sub windows (combo, menu, ...).
|
/// sub windows (combo, menu, ...)
|
||||||
/// - 2016/08/03 (1.04.0) - Added functions to show/hide software cursor.
|
/// - 2016/08/03 (1.04.0) - Added functions to show/hide software cursor
|
||||||
/// - 2016/08/03 (1.04.0) - Added `NK_WINDOW_BACKGROUND` flag to force a window
|
/// - 2016/08/03 (1.04.0) - Added `NK_WINDOW_BACKGROUND` flag to force a window
|
||||||
/// to be always in the background of the screen.
|
/// to be always in the background of the screen
|
||||||
/// - 2016/08/03 (1.03.2) - Removed invalid assert macro for NK_RGB color picker.
|
/// - 2016/08/03 (1.03.2)- Removed invalid assert macro for NK_RGB color picker
|
||||||
/// - 2016/08/01 (1.03.1) - Added helper macros into header include guard.
|
/// - 2016/08/01 (1.03.1)- Added helper macros into header include guard
|
||||||
/// - 2016/07/29 (1.03.0) - Moved the window/table pool into the header part to
|
/// - 2016/07/29 (1.03.0) - Moved the window/table pool into the header part to
|
||||||
/// simplify memory management by removing the need to
|
/// simplify memory management by removing the need to
|
||||||
/// allocate the pool.
|
/// allocate the pool.
|
||||||
@@ -25741,15 +25501,16 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
|
|||||||
/// will hide the window scrollbar after NK_SCROLLBAR_HIDING_TIMEOUT
|
/// will hide the window scrollbar after NK_SCROLLBAR_HIDING_TIMEOUT
|
||||||
/// seconds without window interaction. To make it work
|
/// seconds without window interaction. To make it work
|
||||||
/// you have to also set a delta time inside the `nk_context`.
|
/// you have to also set a delta time inside the `nk_context`.
|
||||||
/// - 2016/07/25 (1.01.1) - Fixed small panel and panel border drawing bugs.
|
/// - 2016/07/25 (1.01.1) - Fixed small panel and panel border drawing bugs
|
||||||
/// - 2016/07/15 (1.01.0) - Added software cursor to `nk_style` and `nk_context`.
|
/// - 2016/07/15 (1.01.0) - Added software cursor to `nk_style` and `nk_context`
|
||||||
/// - 2016/07/15 (1.01.0) - Added const correctness to `nk_buffer_push' data argument.
|
/// - 2016/07/15 (1.01.0) - Added const correctness to `nk_buffer_push' data argument
|
||||||
/// - 2016/07/15 (1.01.0) - Removed internal font baking API and simplified
|
/// - 2016/07/15 (1.01.0) - Removed internal font baking API and simplified
|
||||||
/// font atlas memory management by converting pointer
|
/// font atlas memory management by converting pointer
|
||||||
/// arrays for fonts and font configurations to lists.
|
/// arrays for fonts and font configurations to lists.
|
||||||
/// - 2016/07/15 (1.00.0) - Changed button API to use context dependend button
|
/// - 2016/07/15 (1.00.0) - Changed button API to use context dependend button
|
||||||
/// behavior instead of passing it for every function call.
|
/// behavior instead of passing it for every function call.
|
||||||
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
/// ## Gallery
|
/// ## Gallery
|
||||||
/// ![Figure [blue]: Feature overview with blue color styling](https://cloud.githubusercontent.com/assets/8057201/13538240/acd96876-e249-11e5-9547-5ac0b19667a0.png)
|
/// ![Figure [blue]: Feature overview with blue color styling](https://cloud.githubusercontent.com/assets/8057201/13538240/acd96876-e249-11e5-9547-5ac0b19667a0.png)
|
||||||
/// ![Figure [red]: Feature overview with red color styling](https://cloud.githubusercontent.com/assets/8057201/13538243/b04acd4c-e249-11e5-8fd2-ad7744a5b446.png)
|
/// ![Figure [red]: Feature overview with red color styling](https://cloud.githubusercontent.com/assets/8057201/13538243/b04acd4c-e249-11e5-8fd2-ad7744a5b446.png)
|
||||||
|
|||||||
Vendored
+4
-4
@@ -230,7 +230,7 @@ nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int m
|
|||||||
}
|
}
|
||||||
|
|
||||||
NK_INTERN void
|
NK_INTERN void
|
||||||
nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
nk_glfw3_clipbard_paste(nk_handle usr, struct nk_text_edit *edit)
|
||||||
{
|
{
|
||||||
const char *text = glfwGetClipboardString(glfw.win);
|
const char *text = glfwGetClipboardString(glfw.win);
|
||||||
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
||||||
@@ -238,7 +238,7 @@ nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NK_INTERN void
|
NK_INTERN void
|
||||||
nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len)
|
nk_glfw3_clipbard_copy(nk_handle usr, const char *text, int len)
|
||||||
{
|
{
|
||||||
char *str = 0;
|
char *str = 0;
|
||||||
(void)usr;
|
(void)usr;
|
||||||
@@ -261,8 +261,8 @@ nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)
|
|||||||
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
||||||
}
|
}
|
||||||
nk_init_default(&glfw.ctx, 0);
|
nk_init_default(&glfw.ctx, 0);
|
||||||
glfw.ctx.clip.copy = nk_glfw3_clipboard_copy;
|
glfw.ctx.clip.copy = nk_glfw3_clipbard_copy;
|
||||||
glfw.ctx.clip.paste = nk_glfw3_clipboard_paste;
|
glfw.ctx.clip.paste = nk_glfw3_clipbard_paste;
|
||||||
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
||||||
nk_buffer_init_default(&glfw.ogl.cmds);
|
nk_buffer_init_default(&glfw.ogl.cmds);
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ section](https://discourse.glfw.org/c/support) of the forum, under the [Stack
|
|||||||
Overflow tag](https://stackoverflow.com/questions/tagged/glfw) or [Game
|
Overflow tag](https://stackoverflow.com/questions/tagged/glfw) or [Game
|
||||||
Development tag](https://gamedev.stackexchange.com/questions/tagged/glfw) on
|
Development tag](https://gamedev.stackexchange.com/questions/tagged/glfw) on
|
||||||
Stack Exchange or in the IRC channel `#glfw` on
|
Stack Exchange or in the IRC channel `#glfw` on
|
||||||
[Freenode](http://freenode.net/).
|
[Libera.Chat](https://libera.chat/).
|
||||||
|
|
||||||
Questions about the design or implementation of GLFW or about future plans
|
Questions about the design or implementation of GLFW or about future plans
|
||||||
should be asked in the [dev section](https://discourse.glfw.org/c/dev) of the
|
should be asked in the [dev section](https://discourse.glfw.org/c/dev) of the
|
||||||
|
|||||||
+916
-1606
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -1,11 +1,11 @@
|
|||||||
# Support resources
|
# Support resources
|
||||||
|
|
||||||
See the [latest documentation](http://www.glfw.org/docs/latest/) for tutorials,
|
See the [latest documentation](https://www.glfw.org/docs/latest/) for tutorials,
|
||||||
guides and the API reference.
|
guides and the API reference.
|
||||||
|
|
||||||
If you have questions about using GLFW, we have a
|
If you have questions about using GLFW, we have a
|
||||||
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
[forum](https://discourse.glfw.org/), and the `#glfw` IRC channel on
|
||||||
[Freenode](http://freenode.net/).
|
[Libera.Chat](https://libera.chat/).
|
||||||
|
|
||||||
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
||||||
Please check the [contribution
|
Please check the [contribution
|
||||||
|
|||||||
+11
-1
@@ -185,6 +185,16 @@ build_link_cmake_package.
|
|||||||
With a few changes to your `CMakeLists.txt` you can have the GLFW source tree
|
With a few changes to your `CMakeLists.txt` you can have the GLFW source tree
|
||||||
built along with your application.
|
built along with your application.
|
||||||
|
|
||||||
|
When including GLFW as part of your build, you probably don't want to build the
|
||||||
|
GLFW tests, examples and documentation. To disable these, set the corresponding
|
||||||
|
cache variables before adding the GLFW source tree.
|
||||||
|
|
||||||
|
@code
|
||||||
|
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||||
|
@endcode
|
||||||
|
|
||||||
Add the root directory of the GLFW source tree to your project. This will add
|
Add the root directory of the GLFW source tree to your project. This will add
|
||||||
the `glfw` target to your project.
|
the `glfw` target to your project.
|
||||||
|
|
||||||
@@ -232,7 +242,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.
|
||||||
|
|
||||||
@code{.cmake}
|
@code{.cmake}
|
||||||
find_package(glfw3 3.4 REQUIRED)
|
find_package(glfw3 3.3 REQUIRED)
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
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.
|
||||||
|
|||||||
+17
-17
@@ -85,13 +85,6 @@ transparent window framebuffers. If the running X server does not support this
|
|||||||
extension or there is no running compositing manager, the
|
extension or there is no running compositing manager, the
|
||||||
`GLFW_TRANSPARENT_FRAMEBUFFER` framebuffer hint will have no effect.
|
`GLFW_TRANSPARENT_FRAMEBUFFER` framebuffer hint will have no effect.
|
||||||
|
|
||||||
GLFW uses both the Xcursor extension and the freedesktop cursor conventions to
|
|
||||||
provide an expanded set of standard cursor shapes. If the running X server does
|
|
||||||
not support this extension or the current cursor theme does not support the
|
|
||||||
conventions, the `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR` and
|
|
||||||
`GLFW_NOT_ALLOWED_CURSOR` shapes will not be available and other shapes may use
|
|
||||||
legacy images.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_wayland Wayland protocols and IPC standards
|
@section compat_wayland Wayland protocols and IPC standards
|
||||||
|
|
||||||
@@ -111,7 +104,11 @@ has been configured in the compositor.
|
|||||||
GLFW uses the [xdg-shell
|
GLFW uses the [xdg-shell
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/xdg-shell/xdg-shell.xml)
|
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/xdg-shell/xdg-shell.xml)
|
||||||
to provide better window management. This protocol is part of
|
to provide better window management. This protocol is part of
|
||||||
wayland-protocols 1.12, and is mandatory for GLFW to display a window.
|
wayland-protocols 1.12, and mandatory at build time. If the running compositor
|
||||||
|
does not support this protocol, the older [wl_shell
|
||||||
|
interface](https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml#n972)
|
||||||
|
will be used instead. This will result in a worse integration with the
|
||||||
|
desktop, especially on tiling compositors.
|
||||||
|
|
||||||
GLFW uses the [relative pointer
|
GLFW uses the [relative pointer
|
||||||
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/relative-pointer/relative-pointer-unstable-v1.xml)
|
protocol](https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/relative-pointer/relative-pointer-unstable-v1.xml)
|
||||||
@@ -163,9 +160,10 @@ multisampling anti-aliasing. Where this extension is unavailable, the
|
|||||||
GLFW uses the `GLX_ARB_create_context` extension when available, even when
|
GLFW uses the `GLX_ARB_create_context` extension when available, even when
|
||||||
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
||||||
no effect, and setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT`
|
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
||||||
hints to `GLFW_TRUE` will cause @ref glfwCreateWindow to fail.
|
`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref
|
||||||
|
glfwCreateWindow to fail.
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_create_context_profile` extension to provide support for
|
GLFW uses the `GLX_ARB_create_context_profile` extension to provide support for
|
||||||
context profiles. Where this extension is unavailable, setting the
|
context profiles. Where this extension is unavailable, setting the
|
||||||
@@ -205,9 +203,10 @@ unavailable, the `GLFW_SAMPLES` hint will have no effect.
|
|||||||
GLFW uses the `WGL_ARB_create_context` extension when available, even when
|
GLFW uses the `WGL_ARB_create_context` extension when available, even when
|
||||||
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
creating OpenGL contexts of version 2.1 and below. Where this extension is
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
||||||
no effect, and setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT`
|
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
||||||
hints to `GLFW_TRUE` will cause @ref glfwCreateWindow to fail.
|
`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref
|
||||||
|
glfwCreateWindow to fail.
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_create_context_profile` extension to provide support for
|
GLFW uses the `WGL_ARB_create_context_profile` extension to provide support for
|
||||||
context profiles. Where this extension is unavailable, setting the
|
context profiles. Where this extension is unavailable, setting the
|
||||||
@@ -235,15 +234,16 @@ at most OpenGL version 2.1.
|
|||||||
|
|
||||||
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
||||||
given version 3.0 or 3.1. The `GLFW_OPENGL_PROFILE` hint must be set to
|
given version 3.0 or 3.1. The `GLFW_OPENGL_FORWARD_COMPAT` hint must be set to
|
||||||
|
`GLFW_TRUE` and the `GLFW_OPENGL_PROFILE` hint must be set to
|
||||||
`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts. The
|
`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts. The
|
||||||
`GLFW_CONTEXT_DEBUG` and `GLFW_CONTEXT_NO_ERROR` hints are ignored.
|
`GLFW_OPENGL_DEBUG_CONTEXT` and `GLFW_CONTEXT_NO_ERROR` hints are ignored.
|
||||||
|
|
||||||
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
|
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
|
||||||
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
||||||
a non-default value will cause @ref glfwCreateWindow to fail and the
|
a non-default value will cause @ref glfwCreateWindow to fail and the
|
||||||
`GLFW_CONTEXT_DEBUG` hint is ignored.
|
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
|
||||||
|
|
||||||
|
|
||||||
@section compat_vulkan Vulkan loader and API
|
@section compat_vulkan Vulkan loader and API
|
||||||
|
|||||||
+208
-134
@@ -10,164 +10,171 @@ build applications that use GLFW, see @ref build_guide.
|
|||||||
|
|
||||||
@section compile_cmake Using CMake
|
@section compile_cmake Using CMake
|
||||||
|
|
||||||
|
@note GLFW behaves like most other libraries that use CMake so this guide mostly
|
||||||
|
describes the basic configure/generate/compile sequence. If you are already
|
||||||
|
familiar with this from other projects, you may want to focus on the @ref
|
||||||
|
compile_deps and @ref compile_options sections for GLFW-specific information.
|
||||||
|
|
||||||
GLFW uses [CMake](https://cmake.org/) to generate project files or makefiles
|
GLFW uses [CMake](https://cmake.org/) to generate project files or makefiles
|
||||||
for a particular development environment. If you are on a Unix-like system such
|
for your chosen development environment. To compile GLFW, first generate these
|
||||||
as Linux or FreeBSD or have a package system like Fink, MacPorts, Cygwin or
|
files with CMake and then use them to compile the GLFW library.
|
||||||
Homebrew, you can install its CMake package. If not, you can download
|
|
||||||
installers for Windows and macOS from the
|
|
||||||
[CMake website](https://cmake.org/).
|
|
||||||
|
|
||||||
@note CMake only generates project files or makefiles. It does not compile the
|
If you are on Windows and macOS you can
|
||||||
actual GLFW library. To compile GLFW, first generate these files for your
|
[download CMake](https://cmake.org/download/) from their site.
|
||||||
chosen development environment and then use them to compile the actual GLFW
|
|
||||||
library.
|
If you are on a Unix-like system such as Linux, FreeBSD or Cygwin or have
|
||||||
|
a package system like Fink, MacPorts or Homebrew, you can install its CMake
|
||||||
|
package.
|
||||||
|
|
||||||
|
CMake is a complex tool and this guide will only show a few of the possible ways
|
||||||
|
to set up and compile GLFW. The CMake project has their own much more detailed
|
||||||
|
[CMake user guide](https://cmake.org/cmake/help/latest/guide/user-interaction/)
|
||||||
|
that includes everything in this guide not specific to GLFW. It may be a useful
|
||||||
|
companion to this one.
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_deps Dependencies
|
@subsection compile_deps Installing dependencies
|
||||||
|
|
||||||
Once you have installed CMake, make sure that all other dependencies are
|
The C/C++ development environments in Visual Studio, Xcode and MinGW come with
|
||||||
available. On some platforms, GLFW needs a few additional packages to be
|
all necessary dependencies for compiling GLFW, but on Unix-like systems like
|
||||||
installed. See the section for your chosen platform and development environment
|
Linux and FreeBSD you will need a few extra packages.
|
||||||
below.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_msvc Dependencies for Visual C++ on Windows
|
@subsubsection compile_deps_x11 Dependencies for X11 on Unix-like systems
|
||||||
|
|
||||||
The Windows SDK bundled with Visual C++ already contains all the necessary
|
To compile GLFW for X11, you need to have the X11 development packages
|
||||||
headers, link libraries and tools except for CMake. Move on to @ref
|
installed. They are not needed to build or run programs that use GLFW.
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
On Debian and derivates like Ubuntu and Linux Mint the `xorg-dev` meta-package
|
||||||
@subsubsection compile_deps_mingw Dependencies for MinGW or MinGW-w64 on Windows
|
pulls in the development packages for all of X11.
|
||||||
|
|
||||||
Both the MinGW and the MinGW-w64 packages already contain all the necessary
|
|
||||||
headers, link libraries and tools except for CMake. Move on to @ref
|
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_mingw_cross Dependencies for MinGW or MinGW-w64 cross-compilation
|
|
||||||
|
|
||||||
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
|
||||||
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
|
||||||
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
|
||||||
like Ubuntu have the `mingw-w64` package for both.
|
|
||||||
|
|
||||||
GLFW has CMake toolchain files in the `CMake/` directory that set up
|
|
||||||
cross-compilation of Windows binaries. To use these files you add an option
|
|
||||||
when running `cmake` to generate the project files or makefiles:
|
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-file> .
|
sudo apt install xorg-dev
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
The exact toolchain file to use depends on the prefix used by the MinGW or
|
On Fedora and derivatives like Red Hat the X11 extension packages
|
||||||
MinGW-w64 binaries on your system. You can usually see this in the /usr
|
`libXcursor-devel`, `libXi-devel`, `libXinerama-devel` and `libXrandr-devel`
|
||||||
directory. For example, both the Debian/Ubuntu and Cygwin MinGW-w64 packages
|
required by GLFW pull in all its other dependencies.
|
||||||
have `/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct
|
|
||||||
invocation would be:
|
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .
|
sudo dnf install libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
For more details see the article
|
On FreeBSD the X11 headers are installed along the end-user X11 packages, so if
|
||||||
[CMake Cross Compiling](https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/CrossCompiling) on
|
you have an X server running you should have the headers as well. If not,
|
||||||
the CMake wiki.
|
install the `xorgproto` package.
|
||||||
|
|
||||||
Once you have this set up, move on to @ref compile_generate.
|
@code{.sh}
|
||||||
|
pkg install xorgproto
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
On Cygwin the `xorgproto` package in the Devel section of the GUI installer will
|
||||||
|
install the headers and other development related files for all of X11.
|
||||||
|
|
||||||
|
Once you have the required depdendencies, move on to @ref compile_generate.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_xcode Dependencies for Xcode on macOS
|
@subsubsection compile_deps_wayland Dependencies for Wayland on Unix-like systems
|
||||||
|
|
||||||
Xcode comes with all necessary tools except for CMake. The required headers
|
To compile GLFW for Wayland, you need to have the Wayland and xkbcommon
|
||||||
and libraries are included in the core macOS frameworks. Xcode can be
|
development packages installed. They are not needed to build or run programs
|
||||||
downloaded from the Mac App Store or from the ADC Member Center.
|
that use GLFW.
|
||||||
|
|
||||||
Once you have Xcode installed, move on to @ref compile_generate.
|
On Debian and derivates like Ubuntu and Linux Mint you will need the `libwayland-dev`,
|
||||||
|
`libxkbcommon-dev`, `wayland-protocols` and `extra-cmake-modules` packages.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols extra-cmake-modules
|
||||||
|
@endcode
|
||||||
|
|
||||||
@subsubsection compile_deps_x11 Dependencies for Linux and X11
|
On Fedora and derivatives like Red Hat you will need the `wayland-devel`,
|
||||||
|
`libxkbcommon-devel`, `wayland-protocols-devel` and `extra-cmake-modules` packages.
|
||||||
|
|
||||||
To compile GLFW for X11, you need to have the X11 packages installed, as well as
|
@code{.sh}
|
||||||
the basic development tools like GCC and make. For example, on Ubuntu and other
|
sudo dnf install wayland-devel libxkbcommon-devel wayland-protocols-devel extra-cmake-modules
|
||||||
distributions based on Debian GNU/Linux, you need to install the `xorg-dev`
|
@endcode
|
||||||
package, which pulls in all X.org header packages.
|
|
||||||
|
|
||||||
Once you have installed the necessary packages, move on to @ref
|
On FreeBSD you will need the `wayland`, `libxkbcommon`, `wayland-protocols` and
|
||||||
compile_generate.
|
`kf5-extra-cmake-modules` packages.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
pkg install wayland libxkbcommon wayland-protocols kf5-extra-cmake-modules
|
||||||
|
@endcode
|
||||||
|
|
||||||
@subsubsection compile_deps_wayland Dependencies for Linux and Wayland
|
Once you have the required depdendencies, move on to @ref compile_generate.
|
||||||
|
|
||||||
To compile GLFW for Wayland, you need to have the Wayland packages installed,
|
|
||||||
as well as the basic development tools like GCC and make. For example, on
|
|
||||||
Ubuntu and other distributions based on Debian GNU/Linux, you need to install
|
|
||||||
the `libwayland-dev` package, which contains all Wayland headers and pulls in
|
|
||||||
wayland-scanner, as well as the `wayland-protocols` package.
|
|
||||||
|
|
||||||
Once you have installed the necessary packages, move on to @ref
|
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_deps_osmesa Dependencies for Linux and OSMesa
|
|
||||||
|
|
||||||
To compile GLFW for OSMesa, you need to install the OSMesa library and header
|
|
||||||
packages. For example, on Ubuntu and other distributions based on Debian
|
|
||||||
GNU/Linux, you need to install the `libosmesa6-dev` package. The OSMesa library
|
|
||||||
is required at runtime for context creation and is loaded on demand.
|
|
||||||
|
|
||||||
Once you have installed the necessary packages, move on to @ref
|
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_generate Generating build files with CMake
|
@subsection compile_generate Generating build files with CMake
|
||||||
|
|
||||||
Once you have all necessary dependencies it is time to generate the project
|
Once you have all necessary dependencies it is time to generate the project
|
||||||
files or makefiles for your development environment. CMake needs to know two
|
files or makefiles for your development environment. CMake needs two paths for
|
||||||
paths for this: the path to the _root_ directory of the GLFW source tree (i.e.
|
this:
|
||||||
_not_ the `src` subdirectory) and the target path for the generated files and
|
|
||||||
compiled binaries. If these are the same, it is called an in-tree build,
|
|
||||||
otherwise it is called an out-of-tree build.
|
|
||||||
|
|
||||||
One of several advantages of out-of-tree builds is that you can generate files
|
- the path to the root directory of the GLFW source tree (not its `src`
|
||||||
and compile for different development environments using a single source tree.
|
subdirectory)
|
||||||
|
- the path to the directory where the generated build files and compiled
|
||||||
|
binaries will be placed
|
||||||
|
|
||||||
@note This section is about generating the project files or makefiles necessary
|
If these are the same, it is called an in-tree build, otherwise it is called an
|
||||||
to compile the GLFW library, not about compiling the actual library.
|
out-of-tree build.
|
||||||
|
|
||||||
|
Out-of-tree builds are recommended as they avoid cluttering up the source tree.
|
||||||
|
They also allow you to have several build directories for different
|
||||||
|
configurations all using the same source tree.
|
||||||
|
|
||||||
|
A common pattern when building a single configuration is to have a build
|
||||||
|
directory named `build` in the root of the source tree.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_cli Generating files with the CMake command-line tool
|
@subsubsection compile_generate_gui Generating files with the CMake GUI
|
||||||
|
|
||||||
To make an in-tree build, enter the _root_ directory of the GLFW source tree
|
Start the CMake GUI and set the paths to the source and build directories
|
||||||
(i.e. _not_ the `src` subdirectory) and run CMake. The current directory is
|
described above. Then press _Configure_ and _Generate_.
|
||||||
used as target path, while the path provided as an argument is used to find the
|
|
||||||
source tree.
|
|
||||||
|
|
||||||
@code{.sh}
|
If you wish change any CMake variables in the list, press _Configure_ and then
|
||||||
cd <glfw-root-dir>
|
_Generate_ to have the new values take effect. The variable list will be
|
||||||
cmake .
|
populated after the first configure step.
|
||||||
@endcode
|
|
||||||
|
|
||||||
To make an out-of-tree build, make a directory outside of the source tree, enter
|
By default GLFW will use X11 on Linux and other Unix-like systems other
|
||||||
it and run CMake with the (relative or absolute) path to the root of the source
|
than macOS. To use Wayland instead, set the `GLFW_USE_WAYLAND` option in the
|
||||||
tree as an argument.
|
GLFW section of the variable list, then apply the new value as described above.
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
mkdir glfw-build
|
|
||||||
cd glfw-build
|
|
||||||
cmake <glfw-root-dir>
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
Once you have generated the project files or makefiles for your chosen
|
||||||
development environment, move on to @ref compile_compile.
|
development environment, move on to @ref compile_compile.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_gui Generating files with the CMake GUI
|
@subsubsection compile_generate_cli Generating files with the CMake command-line tool
|
||||||
|
|
||||||
If you are using the GUI version, choose the root of the GLFW source tree as
|
To make a build directory, pass the source and build directories to the `cmake`
|
||||||
source location and the same directory or another, empty directory as the
|
command. These can be relative or absolute paths. The build directory is
|
||||||
destination for binaries. Choose _Configure_, change any options you wish to,
|
created if it doesn't already exist.
|
||||||
_Configure_ again to let the changes take effect and then _Generate_.
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake -S path/to/glfw -B path/to/build
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
It is common to name the build directory `build` and place it in the root of the
|
||||||
|
source tree when only planning to build a single configuration.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cd path/to/glfw
|
||||||
|
cmake -S . -B build
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Without other flags these will generate Visual Studio project files on Windows
|
||||||
|
and makefiles on other platforms. You can choose other targets using the `-G`
|
||||||
|
flag.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake -S path/to/glfw -B path/to/build -G Xcode
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
By default GLFW will use X11 on Linux and other Unix-like systems other
|
||||||
|
than macOS. To use Wayland instead, set the `GLFW_USE_WAYLAND` CMake option.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D GLFW_USE_WAYLAND=1
|
||||||
|
@endcode
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
Once you have generated the project files or makefiles for your chosen
|
||||||
development environment, move on to @ref compile_compile.
|
development environment, move on to @ref compile_compile.
|
||||||
@@ -177,13 +184,39 @@ development environment, move on to @ref compile_compile.
|
|||||||
|
|
||||||
You should now have all required dependencies and the project files or makefiles
|
You should now have all required dependencies and the project files or makefiles
|
||||||
necessary to compile GLFW. Go ahead and compile the actual GLFW library with
|
necessary to compile GLFW. Go ahead and compile the actual GLFW library with
|
||||||
these files, as you would with any other project.
|
these files as you would with any other project.
|
||||||
|
|
||||||
Once the GLFW library is compiled, you are ready to build your applications,
|
With Visual Studio open `GLFW.sln` and use the Build menu. With Xcode open
|
||||||
|
`GLFW.xcodeproj` and use the Project menu.
|
||||||
|
|
||||||
|
With Linux, macOS and other forms of Unix, run `make`.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cd path/to/build
|
||||||
|
make
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
With MinGW, it is `mingw32-make`.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cd path/to/build
|
||||||
|
mingw32-make
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Any CMake build directory can also be built with the `cmake` command and the
|
||||||
|
`--build` flag.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake --build path/to/build
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
This will run the platform specific build tool the directory was generated for.
|
||||||
|
|
||||||
|
Once the GLFW library is compiled you are ready to build your application,
|
||||||
linking it to the GLFW library. See @ref build_guide for more information.
|
linking it to the GLFW library. See @ref build_guide for more information.
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options CMake options
|
@section compile_options CMake options
|
||||||
|
|
||||||
The CMake files for GLFW provide a number of options, although not all are
|
The CMake files for GLFW provide a number of options, although not all are
|
||||||
available on all supported platforms. Some of these are de facto standards
|
available on all supported platforms. Some of these are de facto standards
|
||||||
@@ -199,55 +232,101 @@ Finally, if you don't want to use any GUI, you can set options from the `cmake`
|
|||||||
command-line with the `-D` flag.
|
command-line with the `-D` flag.
|
||||||
|
|
||||||
@code{.sh}
|
@code{.sh}
|
||||||
cmake -DBUILD_SHARED_LIBS=ON .
|
cmake -S path/to/glfw -B path/to/build -D BUILD_SHARED_LIBS=ON
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_options_shared Shared CMake options
|
@subsection compile_options_shared Shared CMake options
|
||||||
|
|
||||||
@anchor BUILD_SHARED_LIBS
|
@anchor BUILD_SHARED_LIBS
|
||||||
__BUILD_SHARED_LIBS__ determines whether GLFW is built as a static
|
__BUILD_SHARED_LIBS__ determines whether GLFW is built as a static
|
||||||
library or as a DLL / shared library / dynamic library.
|
library or as a DLL / shared library / dynamic library. This is disabled by
|
||||||
|
default, producing a static GLFW library.
|
||||||
|
|
||||||
@anchor GLFW_BUILD_EXAMPLES
|
@anchor GLFW_BUILD_EXAMPLES
|
||||||
__GLFW_BUILD_EXAMPLES__ determines whether the GLFW examples are built
|
__GLFW_BUILD_EXAMPLES__ determines whether the GLFW examples are built
|
||||||
along with the library. This is enabled by default unless GLFW is being built
|
along with the library.
|
||||||
as a sub-project.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_TESTS
|
@anchor GLFW_BUILD_TESTS
|
||||||
__GLFW_BUILD_TESTS__ determines whether the GLFW test programs are
|
__GLFW_BUILD_TESTS__ determines whether the GLFW test programs are
|
||||||
built along with the library. This is enabled by default unless GLFW is being
|
built along with the library.
|
||||||
built as a sub-project.
|
|
||||||
|
|
||||||
@anchor GLFW_BUILD_DOCS
|
@anchor GLFW_BUILD_DOCS
|
||||||
__GLFW_BUILD_DOCS__ determines whether the GLFW documentation is built along
|
__GLFW_BUILD_DOCS__ determines whether the GLFW documentation is built along
|
||||||
with the library.
|
with the library. This is enabled by default if
|
||||||
|
[Doxygen](https://www.doxygen.nl/) is found by CMake during configuration.
|
||||||
|
|
||||||
@anchor GLFW_VULKAN_STATIC
|
@anchor GLFW_VULKAN_STATIC
|
||||||
__GLFW_VULKAN_STATIC__ determines whether to use the Vulkan loader linked
|
__GLFW_VULKAN_STATIC__ determines whether to use the Vulkan loader linked
|
||||||
directly with the application.
|
directly with the application. This is disabled by default.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_options_win32 Windows specific CMake options
|
@subsection compile_options_win32 Windows specific CMake options
|
||||||
|
|
||||||
@anchor USE_MSVC_RUNTIME_LIBRARY_DLL
|
@anchor USE_MSVC_RUNTIME_LIBRARY_DLL
|
||||||
__USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or the
|
__USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or the
|
||||||
static library version of the Visual C++ runtime library. If set to `ON`, the
|
static library version of the Visual C++ runtime library. When enabled, the
|
||||||
DLL version of the Visual C++ library is used.
|
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](https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html)
|
||||||
|
variable instead of this GLFW-specific option.
|
||||||
|
|
||||||
@anchor GLFW_USE_HYBRID_HPG
|
@anchor GLFW_USE_HYBRID_HPG
|
||||||
__GLFW_USE_HYBRID_HPG__ determines whether to export the `NvOptimusEnablement` and
|
__GLFW_USE_HYBRID_HPG__ determines whether to export the `NvOptimusEnablement` and
|
||||||
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
||||||
high-performance GPU on Nvidia Optimus and AMD PowerXpress systems. These symbols
|
high-performance GPU on Nvidia Optimus and AMD PowerXpress systems. These symbols
|
||||||
need to be exported by the EXE to be detected by the driver, so the override
|
need to be exported by the EXE to be detected by the driver, so the override
|
||||||
will not work if GLFW is built as a DLL.
|
will not work if GLFW is built as a DLL. This is disabled by default, letting
|
||||||
|
the operating system and driver decide.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection compile_options_wayland Wayland specific CMake options
|
||||||
|
|
||||||
|
@anchor GLFW_USE_WAYLAND
|
||||||
|
__GLFW_USE_WAYLAND__ determines whether to compile the library for Wayland.
|
||||||
|
This option is only available on Linux and other Unix-like systems other than
|
||||||
|
macOS. This is disabled by default.
|
||||||
|
|
||||||
|
|
||||||
|
@section compile_mingw_cross Cross-compilation with CMake and MinGW
|
||||||
|
|
||||||
|
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
||||||
|
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
||||||
|
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
||||||
|
like Ubuntu have the `mingw-w64` package for both.
|
||||||
|
|
||||||
|
GLFW has CMake toolchain files in the `CMake` subdirectory that set up
|
||||||
|
cross-compilation of Windows binaries. To use these files you set the
|
||||||
|
`CMAKE_TOOLCHAIN_FILE` CMake variable with the `-D` flag add an option when
|
||||||
|
configuring and generating the build files.
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=path/to/file
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The exact toolchain file to use depends on the prefix used by the MinGW or
|
||||||
|
MinGW-w64 binaries on your system. You can usually see this in the /usr
|
||||||
|
directory. For example, both the Ubuntu and Cygwin MinGW-w64 packages have
|
||||||
|
`/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct invocation
|
||||||
|
would be:
|
||||||
|
|
||||||
|
@code{.sh}
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The path to the toolchain file is relative to the path to the GLFW source tree
|
||||||
|
passed to the `-S` flag, not to the current directory.
|
||||||
|
|
||||||
|
For more details see the
|
||||||
|
[CMake toolchain guide](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html).
|
||||||
|
|
||||||
|
|
||||||
@section compile_manual Compiling GLFW manually
|
@section compile_manual Compiling GLFW manually
|
||||||
|
|
||||||
If you wish to compile GLFW without its CMake build environment then you will
|
If you wish to compile GLFW without its CMake build environment then you will
|
||||||
have to do at least some of the platform detection yourself. GLFW needs
|
have to do at least some of the platform detection yourself. GLFW needs
|
||||||
a configuration macro to be defined in order to know what window system it's
|
a configuration macro to be defined in order to know what window system it is
|
||||||
being compiled for and also has optional, platform-specific ones for various
|
being compiled for and also has optional, platform-specific ones for various
|
||||||
features.
|
features.
|
||||||
|
|
||||||
@@ -279,11 +358,6 @@ of @b _GLFW_VULKAN_LIBRARY, @b _GLFW_EGL_LIBRARY, @b _GLFW_GLX_LIBRARY, @b
|
|||||||
_GLFW_OSMESA_LIBRARY, @b _GLFW_OPENGL_LIBRARY, @b _GLFW_GLESV1_LIBRARY and @b
|
_GLFW_OSMESA_LIBRARY, @b _GLFW_OPENGL_LIBRARY, @b _GLFW_GLESV1_LIBRARY and @b
|
||||||
_GLFW_GLESV2_LIBRARY. Otherwise, GLFW will use the built-in default names.
|
_GLFW_GLESV2_LIBRARY. Otherwise, GLFW will use the built-in default names.
|
||||||
|
|
||||||
For the EGL context creation API, the following options are available:
|
|
||||||
|
|
||||||
- @b _GLFW_USE_EGLPLATFORM_H to use an existing `EGL/eglplatform.h` header file
|
|
||||||
for native handle types (fallback)
|
|
||||||
|
|
||||||
@note None of the @ref build_macros may be defined during the compilation of
|
@note None of the @ref build_macros may be defined during the compilation of
|
||||||
GLFW. If you define any of these in your build files, make sure they are not
|
GLFW. If you define any of these in your build files, make sure they are not
|
||||||
applied to the GLFW sources.
|
applied to the GLFW sources.
|
||||||
|
|||||||
+22
-18
@@ -84,6 +84,10 @@ objects are recommended for rendering with such contexts.
|
|||||||
You should still [process events](@ref events) as long as you have at least one
|
You should still [process events](@ref events) as long as you have at least one
|
||||||
window, even if none of them are visible.
|
window, even if none of them are visible.
|
||||||
|
|
||||||
|
@macos The first time a window is created the menu bar is created. This is not
|
||||||
|
desirable for example when writing a command-line only application. Menu bar
|
||||||
|
creation can be disabled with the @ref GLFW_COCOA_MENUBAR init hint.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_less Windows without contexts
|
@subsection context_less Windows without contexts
|
||||||
|
|
||||||
@@ -138,9 +142,9 @@ as extensions until they become obsolete.
|
|||||||
|
|
||||||
An extension is defined by:
|
An extension is defined by:
|
||||||
|
|
||||||
- An extension name (e.g. `GL_ARB_debug_output`)
|
- An extension name (e.g. `GL_ARB_gl_spirv`)
|
||||||
- New OpenGL tokens (e.g. `GL_DEBUG_SEVERITY_HIGH_ARB`)
|
- New OpenGL tokens (e.g. `GL_SPIR_V_BINARY_ARB`)
|
||||||
- New OpenGL functions (e.g. `glGetDebugMessageLogARB`)
|
- New OpenGL functions (e.g. `glSpecializeShaderARB`)
|
||||||
|
|
||||||
Note the `ARB` affix, which stands for Architecture Review Board and is used
|
Note the `ARB` affix, which stands for Architecture Review Board and is used
|
||||||
for official extensions. The extension above was created by the ARB, but there
|
for official extensions. The extension above was created by the ARB, but there
|
||||||
@@ -225,9 +229,9 @@ To check whether a specific extension is supported, use the `GLAD_GL_xxx`
|
|||||||
booleans.
|
booleans.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
if (GLAD_GL_ARB_debug_output)
|
if (GLAD_GL_ARB_gl_spirv)
|
||||||
{
|
{
|
||||||
// Use GL_ARB_debug_output
|
// Use GL_ARB_gl_spirv
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
@@ -259,8 +263,8 @@ included in your development environment may be several years out of date and
|
|||||||
may not include the extensions you wish to use.
|
may not include the extensions you wish to use.
|
||||||
|
|
||||||
The header defines function pointer types for all functions of all extensions it
|
The header defines function pointer types for all functions of all extensions it
|
||||||
supports. These have names like `PFNGLGETDEBUGMESSAGELOGARBPROC` (for
|
supports. These have names like `PFNGLSPECIALIZESHADERARBPROC` (for
|
||||||
`glGetDebugMessageLogARB`), i.e. the name is made uppercase and `PFN` (pointer
|
`glSpecializeShaderARB`), i.e. the name is made uppercase and `PFN` (pointer
|
||||||
to function) and `PROC` (procedure) are added to the ends.
|
to function) and `PROC` (procedure) are added to the ends.
|
||||||
|
|
||||||
To include the extension header, define @ref GLFW_INCLUDE_GLEXT before including
|
To include the extension header, define @ref GLFW_INCLUDE_GLEXT before including
|
||||||
@@ -280,7 +284,7 @@ is necessary to check at run-time whether the context supports the extension.
|
|||||||
This is done with @ref glfwExtensionSupported.
|
This is done with @ref glfwExtensionSupported.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
if (glfwExtensionSupported("GL_ARB_debug_output"))
|
if (glfwExtensionSupported("GL_ARB_gl_spirv"))
|
||||||
{
|
{
|
||||||
// The extension is supported by the current context
|
// The extension is supported by the current context
|
||||||
}
|
}
|
||||||
@@ -299,7 +303,7 @@ your operating system, making it necessary to fetch them at run time. You can
|
|||||||
retrieve pointers to these functions with @ref glfwGetProcAddress.
|
retrieve pointers to these functions with @ref glfwGetProcAddress.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
PFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog = glfwGetProcAddress("glGetDebugMessageLogARB");
|
PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB = glfwGetProcAddress("glSpecializeShaderARB");
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
In general, you should avoid giving the function pointer variables the (exact)
|
In general, you should avoid giving the function pointer variables the (exact)
|
||||||
@@ -313,28 +317,28 @@ when used together.
|
|||||||
#define GLFW_INCLUDE_GLEXT
|
#define GLFW_INCLUDE_GLEXT
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#define glGetDebugMessageLogARB pfnGetDebugMessageLog
|
#define glSpecializeShaderARB pfnSpecializeShaderARB
|
||||||
PFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog;
|
PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB;
|
||||||
|
|
||||||
// Flag indicating whether the extension is supported
|
// Flag indicating whether the extension is supported
|
||||||
int has_ARB_debug_output = 0;
|
int has_ARB_gl_spirv = 0;
|
||||||
|
|
||||||
void load_extensions(void)
|
void load_extensions(void)
|
||||||
{
|
{
|
||||||
if (glfwExtensionSupported("GL_ARB_debug_output"))
|
if (glfwExtensionSupported("GL_ARB_gl_spirv"))
|
||||||
{
|
{
|
||||||
pfnGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGARBPROC)
|
pfnSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)
|
||||||
glfwGetProcAddress("glGetDebugMessageLogARB");
|
glfwGetProcAddress("glSpecializeShaderARB");
|
||||||
has_ARB_debug_output = 1;
|
has_ARB_gl_spirv = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void some_function(void)
|
void some_function(void)
|
||||||
{
|
{
|
||||||
if (has_ARB_debug_output)
|
if (has_ARB_gl_spirv)
|
||||||
{
|
{
|
||||||
// Now the extension function can be called as usual
|
// Now the extension function can be called as usual
|
||||||
glGetDebugMessageLogARB(...);
|
glSpecializeShaderARB(...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|||||||
+10
-8
@@ -373,15 +373,12 @@ A cursor with a [standard shape](@ref shapes) from the current system cursor
|
|||||||
theme can be can be created with @ref glfwCreateStandardCursor.
|
theme can be can be created with @ref glfwCreateStandardCursor.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
GLFWcursor* url_cursor = glfwCreateStandardCursor(GLFW_POINTING_HAND_CURSOR);
|
GLFWcursor* cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
These cursor objects behave in the exact same way as those created with @ref
|
These cursor objects behave in the exact same way as those created with @ref
|
||||||
glfwCreateCursor except that the system cursor theme provides the actual image.
|
glfwCreateCursor except that the system cursor theme provides the actual image.
|
||||||
|
|
||||||
A few of these shapes are not available everywhere. If a shape is unavailable,
|
|
||||||
`NULL` is returned. See @ref glfwCreateStandardCursor for details.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_destruction Cursor destruction
|
@subsubsection cursor_destruction Cursor destruction
|
||||||
|
|
||||||
@@ -550,10 +547,10 @@ int present = glfwJoystickPresent(GLFW_JOYSTICK_1);
|
|||||||
Each joystick has zero or more axes, zero or more buttons, zero or more hats,
|
Each joystick has zero or more axes, zero or more buttons, zero or more hats,
|
||||||
a human-readable name, a user pointer and an SDL compatible GUID.
|
a human-readable name, a user pointer and an SDL compatible GUID.
|
||||||
|
|
||||||
Detected joysticks are added to the beginning of the array. Once a joystick is
|
When GLFW is initialized, detected joysticks are added to the beginning of
|
||||||
detected, it keeps its assigned ID until it is disconnected or the library is
|
the array. Once a joystick is detected, it keeps its assigned ID until it is
|
||||||
terminated, so as joysticks are connected and disconnected, there may appear
|
disconnected or the library is terminated, so as joysticks are connected and
|
||||||
gaps in the IDs.
|
disconnected, there may appear gaps in the IDs.
|
||||||
|
|
||||||
Joystick axis, button and hat state is updated when polled and does not require
|
Joystick axis, button and hat state is updated when polled and does not require
|
||||||
a window to be created or events to be processed. However, if you want joystick
|
a window to be created or events to be processed. However, if you want joystick
|
||||||
@@ -797,6 +794,11 @@ glfwUpdateGamepadMappings(mappings);
|
|||||||
This function supports everything from single lines up to and including the
|
This function supports everything from single lines up to and including the
|
||||||
unmodified contents of the whole `gamecontrollerdb.txt` file.
|
unmodified contents of the whole `gamecontrollerdb.txt` file.
|
||||||
|
|
||||||
|
If you are compiling GLFW from source with CMake you can update the built-in mappings by
|
||||||
|
building the _update_mappings_ target. This runs the `GenerateMappings.cmake` CMake
|
||||||
|
script, which downloads `gamecontrollerdb.txt` and regenerates the `mappings.h` header
|
||||||
|
file.
|
||||||
|
|
||||||
Below is a description of the mapping format. Please keep in mind that __this
|
Below is a description of the mapping format. Please keep in mind that __this
|
||||||
description is not authoritative__. The format is defined by the SDL and
|
description is not authoritative__. The format is defined by the SDL and
|
||||||
SDL_GameControllerDB projects and their documentation and code takes precedence.
|
SDL_GameControllerDB projects and their documentation and code takes precedence.
|
||||||
|
|||||||
+7
-30
@@ -22,8 +22,8 @@ There are also guides for the other areas of GLFW.
|
|||||||
|
|
||||||
Before most GLFW functions may be called, the library must be initialized.
|
Before most GLFW functions may be called, the library must be initialized.
|
||||||
This initialization checks what features are available on the machine,
|
This initialization checks what features are available on the machine,
|
||||||
enumerates monitors, initializes the timer and performs any required
|
enumerates monitors and joysticks, initializes the timer and performs any
|
||||||
platform-specific initialization.
|
required platform-specific initialization.
|
||||||
|
|
||||||
Only the following functions may be called before the library has been
|
Only the following functions may be called before the library has been
|
||||||
successfully initialized, and only from the main thread.
|
successfully initialized, and only from the main thread.
|
||||||
@@ -62,11 +62,6 @@ 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.
|
|
||||||
These are not desirable for a command-line only program. The creation of the
|
|
||||||
main menu and dock icon can be disabled with the @ref GLFW_COCOA_MENUBAR init
|
|
||||||
hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection init_hints Initialization hints
|
@subsection init_hints Initialization hints
|
||||||
|
|
||||||
@@ -93,43 +88,25 @@ __GLFW_JOYSTICK_HAT_BUTTONS__ specifies whether to also expose joystick hats as
|
|||||||
buttons, for compatibility with earlier versions of GLFW that did not have @ref
|
buttons, for compatibility with earlier versions of GLFW that did not have @ref
|
||||||
glfwGetJoystickHats. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
glfwGetJoystickHats. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||||
|
|
||||||
@anchor GLFW_ANGLE_PLATFORM_TYPE_hint
|
|
||||||
__GLFW_ANGLE_PLATFORM_TYPE__ specifies the platform type (rendering backend) to
|
|
||||||
request when using OpenGL ES and EGL via
|
|
||||||
[ANGLE](https://chromium.googlesource.com/angle/angle/). If the requested
|
|
||||||
platform type is unavailable, ANGLE will use its default. Possible values are
|
|
||||||
one of `GLFW_ANGLE_PLATFORM_TYPE_NONE`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGL`,
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_OPENGLES`, `GLFW_ANGLE_PLATFORM_TYPE_D3D9`,
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_D3D11`, `GLFW_ANGLE_PLATFORM_TYPE_VULKAN` and
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_METAL`.
|
|
||||||
|
|
||||||
@par
|
|
||||||
The ANGLE platform type is specified via the `EGL_ANGLE_platform_angle`
|
|
||||||
extension. This extension is not used if this hint is
|
|
||||||
`GLFW_ANGLE_PLATFORM_TYPE_NONE`, which is the default value.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_osx macOS specific init hints
|
@subsubsection init_hints_osx macOS specific init hints
|
||||||
|
|
||||||
@anchor GLFW_COCOA_CHDIR_RESOURCES_hint
|
@anchor GLFW_COCOA_CHDIR_RESOURCES_hint
|
||||||
__GLFW_COCOA_CHDIR_RESOURCES__ specifies whether to set the current directory to
|
__GLFW_COCOA_CHDIR_RESOURCES__ specifies whether to set the current directory to
|
||||||
the application to the `Contents/Resources` subdirectory of the application's
|
the application to the `Contents/Resources` subdirectory of the application's
|
||||||
bundle, if present. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
bundle, if present. Set this with @ref glfwInitHint.
|
||||||
ignored on other platforms.
|
|
||||||
|
|
||||||
@anchor GLFW_COCOA_MENUBAR_hint
|
@anchor GLFW_COCOA_MENUBAR_hint
|
||||||
__GLFW_COCOA_MENUBAR__ specifies whether to create the menu bar and dock icon
|
__GLFW_COCOA_MENUBAR__ specifies whether to create a basic menu bar, either from
|
||||||
when GLFW is initialized. This applies whether the menu bar is created from
|
a nib or manually, when the first window is created, which is when AppKit is
|
||||||
a nib or manually by GLFW. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
initialized. Set this with @ref glfwInitHint.
|
||||||
This is ignored on other platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection init_hints_values Supported and default values
|
@subsubsection init_hints_values Supported and default values
|
||||||
|
|
||||||
Initialization hint | Default value | Supported values
|
Initialization hint | Default value | Supported values
|
||||||
------------------------------- | ------------------------------- | ----------------
|
------------------------------- | ------------- | ----------------
|
||||||
@ref GLFW_JOYSTICK_HAT_BUTTONS | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
@ref GLFW_JOYSTICK_HAT_BUTTONS | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
@ref GLFW_ANGLE_PLATFORM_TYPE | `GLFW_ANGLE_PLATFORM_TYPE_NONE` | `GLFW_ANGLE_PLATFORM_TYPE_NONE`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGL`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGLES`, `GLFW_ANGLE_PLATFORM_TYPE_D3D9`, `GLFW_ANGLE_PLATFORM_TYPE_D3D11`, `GLFW_ANGLE_PLATFORM_TYPE_VULKAN` or `GLFW_ANGLE_PLATFORM_TYPE_METAL`
|
|
||||||
@ref GLFW_COCOA_CHDIR_RESOURCES | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
@ref GLFW_COCOA_CHDIR_RESOURCES | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
@ref GLFW_COCOA_MENUBAR | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
@ref GLFW_COCOA_MENUBAR | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ GLFW is a free, Open Source, multi-platform library for OpenGL, OpenGL ES and
|
|||||||
Vulkan application development. It provides a simple, platform-independent API
|
Vulkan application development. It provides a simple, platform-independent API
|
||||||
for creating windows, contexts and surfaces, reading input, handling events, etc.
|
for creating windows, contexts and surfaces, reading input, handling events, etc.
|
||||||
|
|
||||||
@ref news_34 list new features, caveats and deprecations.
|
@ref news_33 list new features, caveats and deprecations.
|
||||||
|
|
||||||
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
||||||
write a small but complete program.
|
write a small but complete program.
|
||||||
|
|||||||
+811
-102
@@ -5,150 +5,859 @@
|
|||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
|
|
||||||
@section news_34 Release notes for version 3.4
|
@section news_33 Release notes for version 3.3
|
||||||
|
|
||||||
@subsection features_34 New features in version 3.4
|
These are the release notes for version 3.3. For a more detailed view including
|
||||||
|
all fixed bugs see the [version history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
@subsubsection standard_cursors_34 More standard cursors
|
Please review the caveats, deprecations and removals if your project was written
|
||||||
|
against an earlier version of GLFW 3.
|
||||||
GLFW now provides the standard cursor shapes @ref GLFW_RESIZE_NWSE_CURSOR and
|
|
||||||
@ref GLFW_RESIZE_NESW_CURSOR for diagonal resizing, @ref GLFW_RESIZE_ALL_CURSOR
|
|
||||||
for omni-directional 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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection mouse_passthrough_34 Mouse event passthrough
|
@subsection features_33 New features in version 3.3
|
||||||
|
|
||||||
GLFW now provides the [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_hint)
|
@subsubsection gamepad_33 Gamepad input via SDL_GameControllerDB
|
||||||
window hint for making a window transparent to mouse input, lettings events pass
|
|
||||||
to whatever window is behind it. This can also be changed after window
|
GLFW can now remap game controllers to a standard Xbox-like layout using
|
||||||
creation with the matching [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib).
|
a built-in copy of SDL_GameControllerDB. Call @ref glfwJoystickIsGamepad to
|
||||||
|
check if a joystick has a mapping, @ref glfwGetGamepadState to retrieve its
|
||||||
|
input state, @ref glfwUpdateGamepadMappings to add newer mappings and @ref
|
||||||
|
glfwGetGamepadName and @ref glfwGetJoystickGUID for mapping related information.
|
||||||
|
|
||||||
|
For more information see @ref gamepad.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection features_34_angle_backend Support for ANGLE rendering backend selection
|
@subsubsection moltenvk_33 Support for Vulkan on macOS via MoltenVK
|
||||||
|
|
||||||
GLFW now provides the
|
GLFW now supports [MoltenVK](https://moltengl.com/moltenvk/), a Vulkan
|
||||||
[GLFW_ANGLE_PLATFORM_TYPE](@ref GLFW_ANGLE_PLATFORM_TYPE_hint) init hint for
|
implementation on top of the Metal API, and its `VK_MVK_macos_surface` window
|
||||||
requesting a specific rendering backend when using
|
surface creation extension. MoltenVK is included in the [macOS Vulkan
|
||||||
[ANGLE](https://chromium.googlesource.com/angle/angle/) to create OpenGL ES
|
SDK](https://vulkan.lunarg.com/).
|
||||||
contexts.
|
|
||||||
|
For more information see @ref vulkan_guide.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection features_34_win32_keymenu Support for keyboard access to Windows window menu
|
@subsubsection content_scale_33 Content scale queries for DPI-aware rendering
|
||||||
|
|
||||||
GLFW now provides the
|
GLFW now provides content scales for windows and monitors, i.e. the ratio
|
||||||
[GLFW_WIN32_KEYBOARD_MENU](@ref GLFW_WIN32_KEYBOARD_MENU_hint) window hint for
|
between their current DPI and the platform's default DPI, with @ref
|
||||||
enabling keyboard access to the window menu via the Alt+Space and
|
glfwGetWindowContentScale and @ref glfwGetMonitorContentScale.
|
||||||
Alt-and-then-Space shortcuts. This may be useful for more GUI-oriented
|
|
||||||
applications.
|
Changes of the content scale of a window can be received with the window content
|
||||||
|
scale callback, set with @ref glfwSetWindowContentScaleCallback.
|
||||||
|
|
||||||
|
The @ref GLFW_SCALE_TO_MONITOR window hint enables automatic resizing of a
|
||||||
|
window by the content scale of the monitor it is placed, on platforms like
|
||||||
|
Windows where this is necessary. This takes effect both on creation and when
|
||||||
|
the window is moved between monitors. It is related to but different from
|
||||||
|
[GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint).
|
||||||
|
|
||||||
|
For more information see @ref window_scale.
|
||||||
|
|
||||||
|
|
||||||
@subsection caveats_34 Caveats for version 3.4
|
@subsubsection setwindowattrib_33 Support for updating window attributes
|
||||||
|
|
||||||
@subsubsection joysticks_34 Joystick support is initialized on demand
|
GLFW now supports changing the [GLFW_DECORATED](@ref GLFW_DECORATED_attrib),
|
||||||
|
[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib),
|
||||||
|
[GLFW_FLOATING](@ref GLFW_FLOATING_attrib),
|
||||||
|
[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and
|
||||||
|
[GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib) attributes for existing
|
||||||
|
windows with @ref glfwSetWindowAttrib.
|
||||||
|
|
||||||
The joystick part of GLFW is now initialized when first used, primarily to work
|
For more information see @ref window_attribs.
|
||||||
around faulty Windows drivers that cause DirectInput to take up to several
|
|
||||||
seconds to enumerate devices.
|
|
||||||
|
|
||||||
This change will usually not be 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).
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection standalone_34 Tests and examples are disabled when built as a sub-project
|
@subsubsection raw_motion_33 Support for raw mouse motion
|
||||||
|
|
||||||
GLFW now does not build the tests and examples when it is added as
|
GLFW now supports raw (unscaled and unaccelerated) mouse motion in disabled
|
||||||
a subdirectory of another CMake project. To enable these, set the @ref
|
cursor mode with the [GLFW_RAW_MOUSE_MOTION](@ref GLFW_RAW_MOUSE_MOTION) input
|
||||||
GLFW_BUILD_TESTS and @ref GLFW_BUILD_EXAMPLES cache variables before adding the
|
mode. Raw mouse motion input is not yet implemented on macOS. Call @ref
|
||||||
GLFW subdirectory.
|
glfwRawMouseMotionSupported to check if GLFW can provide raw mouse motion on the
|
||||||
|
current system.
|
||||||
|
|
||||||
@code{.cmake}
|
For more information see @ref raw_mouse_motion.
|
||||||
set(GLFW_BUILD_EXAMPLES ON CACHE BOOL "" FORCE)
|
|
||||||
set(GLFW_BUILD_TESTS ON CACHE BOOL "" FORCE)
|
|
||||||
add_subdirectory(path/to/glfw)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection initmenu_34 macOS main menu now created at initialization
|
@subsubsection joysticks_33 Joystick hats
|
||||||
|
|
||||||
GLFW now creates the main menu and completes the initialization of NSApplication
|
GLFW can now return the state of hats (i.e. POVs or D-pads) of a joystick with
|
||||||
during initialization. Programs that do not want a main menu can disable it
|
@ref glfwGetJoystickHats. For compatibility, hats are also exposed as buttons.
|
||||||
with the [GLFW_COCOA_MENUBAR](@ref GLFW_COCOA_MENUBAR_hint) init hint.
|
This can be disabled with the @ref GLFW_JOYSTICK_HAT_BUTTONS initialization
|
||||||
|
hint.
|
||||||
|
|
||||||
|
For more information see @ref joystick_hat.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection corevideo_34 CoreVideo dependency has been removed
|
@subsubsection geterror_33 Error query
|
||||||
|
|
||||||
GLFW no longer depends on the CoreVideo framework on macOS and it no longer
|
GLFW now supports querying the last error code for the calling thread and its
|
||||||
needs to be specified during compilation or linking.
|
human-readable description with @ref glfwGetError. This can be used instead of
|
||||||
|
or together with the error callback.
|
||||||
|
|
||||||
|
For more information see @ref error_handling.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection caveat_fbtransparency_34 Framebuffer transparency requires DWM transparency
|
@subsubsection init_hints_33 Support for initialization hints
|
||||||
|
|
||||||
|
GLFW now supports setting library initialization hints with @ref glfwInitHint.
|
||||||
|
These must be set before initialization to take effect. Some of these hints are
|
||||||
|
platform specific but are safe to set on any platform.
|
||||||
|
|
||||||
|
For more information see @ref init_hints.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection attention_33 User attention request
|
||||||
|
|
||||||
|
GLFW now supports requesting user attention with @ref
|
||||||
|
glfwRequestWindowAttention. Where possible this calls attention to the
|
||||||
|
specified window. On platforms like macOS it calls attention to the whole
|
||||||
|
application.
|
||||||
|
|
||||||
|
For more information see @ref window_attention.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection maximize_33 Window maximization callback
|
||||||
|
|
||||||
|
GLFW now supports notifying the application that the window has been maximized
|
||||||
|
@ref glfwSetWindowMaximizeCallback. This is called both when the window was
|
||||||
|
maximized by the user and when it was done with @ref glfwMaximizeWindow.
|
||||||
|
|
||||||
|
For more information see @ref window_maximize.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection workarea_33 Query for the monitor work area
|
||||||
|
|
||||||
|
GLFW now supports querying the work area of a monitor, i.e. the area not
|
||||||
|
occupied by task bars or global menu bars, with @ref glfwGetMonitorWorkarea. On
|
||||||
|
platforms that lack this concept, the whole area of the monitor is returned.
|
||||||
|
|
||||||
|
For more information see @ref monitor_workarea.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection transparency_33 Transparent windows and framebuffers
|
||||||
|
|
||||||
|
GLFW now supports the creation of windows with transparent framebuffers on
|
||||||
|
systems with desktop compositing enabled with the @ref
|
||||||
|
GLFW_TRANSPARENT_FRAMEBUFFER window hint and attribute. This hint must be set
|
||||||
|
before window creation and leaves any window decorations opaque.
|
||||||
|
|
||||||
|
GLFW now also supports whole window transparency with @ref glfwGetWindowOpacity
|
||||||
|
and @ref glfwSetWindowOpacity. This value controls the opacity of the whole
|
||||||
|
window including decorations and unlike framebuffer transparency can be changed
|
||||||
|
at any time after window creation.
|
||||||
|
|
||||||
|
For more information see @ref window_transparency.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection key_scancode_33 Query for the scancode of a key
|
||||||
|
|
||||||
|
GLFW now supports querying the platform dependent scancode of any physical key
|
||||||
|
with @ref glfwGetKeyScancode.
|
||||||
|
|
||||||
|
For more information see @ref input_key.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection center_cursor_33 Cursor centering window hint
|
||||||
|
|
||||||
|
GLFW now supports controlling whether the cursor is centered over newly created
|
||||||
|
full screen windows with the [GLFW_CENTER_CURSOR](@ref GLFW_CENTER_CURSOR_hint)
|
||||||
|
window hint. It is enabled by default.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection cursor_hover_33 Mouse cursor hover window attribute
|
||||||
|
|
||||||
|
GLFW now supports polling whether the cursor is hovering over the window content
|
||||||
|
area with the [GLFW_HOVERED](@ref GLFW_HOVERED_attrib) window attribute. This
|
||||||
|
attribute corresponds to the [cursor enter/leave](@ref cursor_enter) event.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection focusonshow_33 Window hint and attribute for input focus on show
|
||||||
|
|
||||||
|
GLFW now has the [GLFW_FOCUS_ON_SHOW](@ref GLFW_DECORATED_hint) window hint and
|
||||||
|
attribute for controlling whether a window gets input focus when shown. It is
|
||||||
|
enabled by default. It applies both when creating an visible window with @ref
|
||||||
|
glfwCreateWindow and when showing it with @ref glfwShowWindow.
|
||||||
|
|
||||||
|
This is a workaround for GLFW 3.0 lacking @ref glfwFocusWindow and will be
|
||||||
|
corrected in the next major version.
|
||||||
|
|
||||||
|
For more information see @ref window_hide.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection device_userptr_33 Monitor and joystick user pointers
|
||||||
|
|
||||||
|
GLFW now supports setting and querying user pointers for connected monitors and
|
||||||
|
joysticks with @ref glfwSetMonitorUserPointer, @ref glfwGetMonitorUserPointer,
|
||||||
|
@ref glfwSetJoystickUserPointer and @ref glfwGetJoystickUserPointer.
|
||||||
|
|
||||||
|
For more information see @ref monitor_userptr and @ref joystick_userptr.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection macos_nib_33 macOS menu bar from nib file
|
||||||
|
|
||||||
|
GLFW will now load a `MainMenu.nib` file if found in the `Contents/Resources`
|
||||||
|
directory of the application bundle, as a way to replace the GLFW menu bar
|
||||||
|
without recompiling GLFW. This behavior can be disabled with the
|
||||||
|
[GLFW_COCOA_MENUBAR](@ref GLFW_COCOA_MENUBAR_hint) initialization hint.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection glext_33 Support for more context creation extensions
|
||||||
|
|
||||||
|
The context hint @ref GLFW_SRGB_CAPABLE now supports OpenGL ES via
|
||||||
|
`WGL_EXT_colorspace`, the context hint @ref GLFW_CONTEXT_NO_ERROR now supports
|
||||||
|
`WGL_ARB_create_context_no_error` and `GLX_ARB_create_context_no_error`, the
|
||||||
|
context hint @ref GLFW_CONTEXT_RELEASE_BEHAVIOR now supports
|
||||||
|
`EGL_KHR_context_flush_control` and @ref glfwGetProcAddress now supports
|
||||||
|
`EGL_KHR_get_all_proc_addresses`.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection osmesa_33 OSMesa off-screen context creation support
|
||||||
|
|
||||||
|
GLFW now supports creating off-screen OpenGL contexts using
|
||||||
|
[OSMesa](https://www.mesa3d.org/osmesa.html) by setting
|
||||||
|
[GLFW_CONTEXT_CREATION_API](@ref GLFW_CONTEXT_CREATION_API_hint) to
|
||||||
|
`GLFW_OSMESA_CONTEXT_API`. Native access function have been added to retrieve
|
||||||
|
the OSMesa color and depth buffers.
|
||||||
|
|
||||||
|
There is also a new null backend that uses OSMesa as its native context
|
||||||
|
creation API, intended for automated testing. This backend does not provide
|
||||||
|
input.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection caveats_33 Caveats for version 3.3
|
||||||
|
|
||||||
|
@subsubsection joystick_layout_33 Layout of joysticks have changed
|
||||||
|
|
||||||
|
The way joystick elements are arranged have changed to match SDL2 in order to
|
||||||
|
support SDL_GameControllerDB mappings. The layout of joysticks may
|
||||||
|
change again if required for compatibility with SDL2. If you need a known and
|
||||||
|
stable layout for game controllers, see if you can switch to @ref gamepad.
|
||||||
|
|
||||||
|
Existing code that depends on a specific joystick layout will likely have to be
|
||||||
|
updated.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection wait_events_33 No window required to wait for events
|
||||||
|
|
||||||
|
The @ref glfwWaitEvents and @ref glfwWaitEventsTimeout functions no longer need
|
||||||
|
a window to be created to wait for events. Before version 3.3 these functions
|
||||||
|
would return immediately if there were no user-created windows. On platforms
|
||||||
|
where only windows can receive events, an internal helper window is used.
|
||||||
|
|
||||||
|
Existing code that depends on the earlier behavior will likely have to be
|
||||||
|
updated.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection gamma_ramp_size_33 Gamma ramp size of 256 may be rejected
|
||||||
|
|
||||||
|
The documentation for versions before 3.3 stated that a gamma ramp size of 256
|
||||||
|
would always be accepted. This was never the case on X11 and could lead to
|
||||||
|
artifacts on macOS. The @ref glfwSetGamma function has been updated to always
|
||||||
|
generate a ramp of the correct size.
|
||||||
|
|
||||||
|
Existing code that hardcodes a size of 256 should be updated to use the size of
|
||||||
|
the current ramp of a monitor when setting a new ramp for that monitor.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection xinput_deadzone_33 Windows XInput deadzone removed
|
||||||
|
|
||||||
|
GLFW no longer applies any deadzone to the input state received from the XInput
|
||||||
|
API. This was never done for any other platform joystick API so this change
|
||||||
|
makes the behavior more consistent but you will need to apply your own deadzone
|
||||||
|
if desired.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection x11_clipboard_33 X11 clipboard transfer limits
|
||||||
|
|
||||||
|
GLFW now supports reading clipboard text via the `INCR` method, which removes
|
||||||
|
the limit on how much text can be read with @ref glfwGetClipboardString.
|
||||||
|
However, writing via this method is not yet supported, so you may not be able to
|
||||||
|
write a very large string with @ref glfwSetClipboardString even if you read it
|
||||||
|
from the clipboard earlier.
|
||||||
|
|
||||||
|
The exact size limit for writing to the clipboard is negotiated with each
|
||||||
|
receiving application but is at least several tens of kilobytes. Note that only
|
||||||
|
the read limit has changed. Any string that could be written before still can
|
||||||
|
be.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection x11_linking_33 X11 extension libraries are loaded dynamically
|
||||||
|
|
||||||
|
GLFW now loads all X11 extension libraries at initialization. The only X11
|
||||||
|
library you need to link against is `libX11`. The header files for the
|
||||||
|
extension libraries are still required for compilation.
|
||||||
|
|
||||||
|
Existing projects and makefiles that link GLFW directly against the extension
|
||||||
|
libraries should still build correctly but will add these libraries as load-time
|
||||||
|
dependencies.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection cmake_version_33 CMake 3.0 or later is required
|
||||||
|
|
||||||
|
The minimum CMake version has been raised from 2.8.12 to 3.0. This is only
|
||||||
|
a requirement of the GLFW CMake files. The GLFW source files do not depend on
|
||||||
|
CMake.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection caveat_fbtransparency_33 Framebuffer transparency requires DWM transparency
|
||||||
|
|
||||||
GLFW no longer supports framebuffer transparency enabled via @ref
|
GLFW no longer supports framebuffer transparency enabled via @ref
|
||||||
GLFW_TRANSPARENT_FRAMEBUFFER on Windows 7 if DWM transparency is off
|
GLFW_TRANSPARENT_FRAMEBUFFER on Windows 7 if DWM transparency is off
|
||||||
(the Transparency setting under Personalization > Window Color).
|
(the Transparency setting under Personalization > Window Color).
|
||||||
|
|
||||||
|
|
||||||
@subsection deprecations_34 Deprecations in version 3.4
|
@subsection deprecations_33 Deprecations in version 3.3
|
||||||
|
|
||||||
@subsection removals_34 Removals in 3.4
|
@subsubsection charmods_callback_33 Character with modifiers callback
|
||||||
|
|
||||||
@subsubsection wl_shell_34 Support for the wl_shell protocol has been removed
|
The character with modifiers callback set with @ref glfwSetCharModsCallback has
|
||||||
|
been deprecated and should if possible not be used.
|
||||||
|
|
||||||
Support for the wl_shell protocol has been removed and GLFW now only supports
|
Existing code should still work but further bug fixes will likely not be made.
|
||||||
the XDG-Shell protocol. If your Wayland compositor does not support XDG-Shell
|
The callback will be removed in the next major version.
|
||||||
then GLFW will fail to initialize.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection symbols_34 New symbols in version 3.4
|
@subsubsection clipboard_window_33 Window parameter to clipboard functions
|
||||||
|
|
||||||
@subsubsection functions_34 New functions in version 3.4
|
The window parameter of the clipboard functions @ref glfwGetClipboardString and
|
||||||
@subsubsection types_34 New types in version 3.4
|
@ref glfwSetClipboardString has been deprecated and is no longer used on any
|
||||||
@subsubsection constants_34 New constants in version 3.4
|
platform. On platforms where the clipboard must be owned by a specific window,
|
||||||
|
an internal helper window is used.
|
||||||
|
|
||||||
- @ref GLFW_POINTING_HAND_CURSOR
|
Existing code should still work unless it depends on a specific window owning
|
||||||
- @ref GLFW_RESIZE_EW_CURSOR
|
the clipboard. New code may pass `NULL` as the window argument. The parameter
|
||||||
- @ref GLFW_RESIZE_NS_CURSOR
|
will be removed in a future release.
|
||||||
- @ref GLFW_RESIZE_NWSE_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_NESW_CURSOR
|
|
||||||
- @ref GLFW_RESIZE_ALL_CURSOR
|
|
||||||
- @ref GLFW_MOUSE_PASSTHROUGH
|
|
||||||
- @ref GLFW_NOT_ALLOWED_CURSOR
|
|
||||||
- @ref GLFW_CURSOR_UNAVAILABLE
|
|
||||||
- @ref GLFW_WIN32_KEYBOARD_MENU
|
|
||||||
- @ref GLFW_CONTEXT_DEBUG
|
|
||||||
- @ref GLFW_FEATURE_UNAVAILABLE
|
|
||||||
- @ref GLFW_FEATURE_UNIMPLEMENTED
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_NONE
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_OPENGL
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_OPENGLES
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_D3D9
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_D3D11
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_VULKAN
|
|
||||||
- @ref GLFW_ANGLE_PLATFORM_TYPE_METAL
|
|
||||||
|
|
||||||
|
|
||||||
@section news_archive Release notes for earlier versions
|
@subsection removals_33 Removals in 3.3
|
||||||
|
|
||||||
- [Release notes for 3.3](https://www.glfw.org/docs/3.3/news.html)
|
@subsubsection macos_options_33 macOS specific CMake options and macros
|
||||||
- [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)
|
The `GLFW_USE_RETINA`, `GLFW_USE_CHDIR` and `GLFW_USE_MENUBAR` CMake options and
|
||||||
- [Release notes for 3.0](https://www.glfw.org/docs/3.0/news.html)
|
the `_GLFW_USE_RETINA`, `_GLFW_USE_CHDIR` and `_GLFW_USE_MENUBAR` compile-time
|
||||||
|
macros have been removed.
|
||||||
|
|
||||||
|
These options and macros are replaced by the window hint
|
||||||
|
[GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint)
|
||||||
|
and the init hints
|
||||||
|
[GLFW_COCOA_CHDIR_RESOURCES](@ref GLFW_COCOA_CHDIR_RESOURCES_hint) and
|
||||||
|
[GLFW_COCOA_MENUBAR](@ref GLFW_COCOA_MENUBAR_hint).
|
||||||
|
|
||||||
|
Existing projects and makefiles that set these options or define these macros
|
||||||
|
during compilation of GLFW will still build but it will have no effect and the
|
||||||
|
default behaviors will be used.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection vulkan_sdk_33 LunarG Vulkan SDK dependency
|
||||||
|
|
||||||
|
The GLFW test programs that previously depended on the LunarG Vulkan SDK now
|
||||||
|
instead uses a Vulkan loader generated by
|
||||||
|
[glad2](https://github.com/Dav1dde/glad). This means the GLFW CMake files no
|
||||||
|
longer look for the Vulkan SDK.
|
||||||
|
|
||||||
|
Existing CMake projects that depended on the Vulkan SDK cache variables from
|
||||||
|
GLFW will need to call `find_package(Vulkan)` themselves. CMake 3.7 and later
|
||||||
|
already comes with a
|
||||||
|
[Vulkan find module](https://cmake.org/cmake/help/latest/module/FindVulkan.html)
|
||||||
|
similar to the one GLFW previously included.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection lib_suffix_33 CMake option LIB_SUFFIX
|
||||||
|
|
||||||
|
The `LIB_SUFFIX` CMake option has been removed. GLFW now uses the
|
||||||
|
GNUInstallDirs CMake package to handle platform specific details like the
|
||||||
|
library directory suffix and the `LIB_SUFFIX` CMake option has been removed.
|
||||||
|
|
||||||
|
Existing projects and makefiles that set the `LIB_SUFFIX` option will use the
|
||||||
|
suffix chosen by the GNUInstallDirs package and the option will be ignored.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection mir_removed_33 Mir support
|
||||||
|
|
||||||
|
The experimental Mir support has been completely removed as the Mir project has
|
||||||
|
implemented support for the Wayland protocol and is recommending that
|
||||||
|
applications use that instead.
|
||||||
|
|
||||||
|
Existing projects and makefiles that select Mir when compiling GLFW will fail.
|
||||||
|
Use Wayland or X11 instead.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection symbols_33 New symbols in version 3.3
|
||||||
|
|
||||||
|
@subsubsection functions_33 New functions in version 3.3
|
||||||
|
|
||||||
|
- @ref glfwInitHint
|
||||||
|
- @ref glfwGetError
|
||||||
|
- @ref glfwGetMonitorWorkarea
|
||||||
|
- @ref glfwGetMonitorContentScale
|
||||||
|
- @ref glfwGetMonitorUserPointer
|
||||||
|
- @ref glfwSetMonitorUserPointer
|
||||||
|
- @ref glfwWindowHintString
|
||||||
|
- @ref glfwGetWindowContentScale
|
||||||
|
- @ref glfwGetWindowOpacity
|
||||||
|
- @ref glfwSetWindowOpacity
|
||||||
|
- @ref glfwRequestWindowAttention
|
||||||
|
- @ref glfwSetWindowAttrib
|
||||||
|
- @ref glfwSetWindowMaximizeCallback
|
||||||
|
- @ref glfwSetWindowContentScaleCallback
|
||||||
|
- @ref glfwRawMouseMotionSupported
|
||||||
|
- @ref glfwGetKeyScancode
|
||||||
|
- @ref glfwGetJoystickHats
|
||||||
|
- @ref glfwGetJoystickGUID
|
||||||
|
- @ref glfwGetJoystickUserPointer
|
||||||
|
- @ref glfwSetJoystickUserPointer
|
||||||
|
- @ref glfwJoystickIsGamepad
|
||||||
|
- @ref glfwUpdateGamepadMappings
|
||||||
|
- @ref glfwGetGamepadName
|
||||||
|
- @ref glfwGetGamepadState
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection types_33 New types in version 3.3
|
||||||
|
|
||||||
|
- @ref GLFWwindowmaximizefun
|
||||||
|
- @ref GLFWwindowcontentscalefun
|
||||||
|
- @ref GLFWgamepadstate
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection constants_33 New constants in version 3.3
|
||||||
|
|
||||||
|
- @ref GLFW_NO_ERROR
|
||||||
|
- @ref GLFW_JOYSTICK_HAT_BUTTONS
|
||||||
|
- @ref GLFW_COCOA_CHDIR_RESOURCES
|
||||||
|
- @ref GLFW_COCOA_MENUBAR
|
||||||
|
- @ref GLFW_CENTER_CURSOR
|
||||||
|
- @ref GLFW_TRANSPARENT_FRAMEBUFFER
|
||||||
|
- @ref GLFW_HOVERED
|
||||||
|
- @ref GLFW_FOCUS_ON_SHOW
|
||||||
|
- @ref GLFW_SCALE_TO_MONITOR
|
||||||
|
- @ref GLFW_COCOA_RETINA_FRAMEBUFFER
|
||||||
|
- @ref GLFW_COCOA_FRAME_NAME
|
||||||
|
- @ref GLFW_COCOA_GRAPHICS_SWITCHING
|
||||||
|
- @ref GLFW_X11_CLASS_NAME
|
||||||
|
- @ref GLFW_X11_INSTANCE_NAME
|
||||||
|
- @ref GLFW_OSMESA_CONTEXT_API
|
||||||
|
- @ref GLFW_HAT_CENTERED
|
||||||
|
- @ref GLFW_HAT_UP
|
||||||
|
- @ref GLFW_HAT_RIGHT
|
||||||
|
- @ref GLFW_HAT_DOWN
|
||||||
|
- @ref GLFW_HAT_LEFT
|
||||||
|
- @ref GLFW_HAT_RIGHT_UP
|
||||||
|
- @ref GLFW_HAT_RIGHT_DOWN
|
||||||
|
- @ref GLFW_HAT_LEFT_UP
|
||||||
|
- @ref GLFW_HAT_LEFT_DOWN
|
||||||
|
- @ref GLFW_MOD_CAPS_LOCK
|
||||||
|
- @ref GLFW_MOD_NUM_LOCK
|
||||||
|
- @ref GLFW_LOCK_KEY_MODS
|
||||||
|
- @ref GLFW_RAW_MOUSE_MOTION
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_A
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_B
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_X
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_Y
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_LEFT_BUMPER
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_BACK
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_START
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_GUIDE
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_LEFT_THUMB
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_RIGHT_THUMB
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_DPAD_UP
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_DPAD_RIGHT
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_DPAD_DOWN
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_DPAD_LEFT
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_LAST
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_CROSS
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_CIRCLE
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_SQUARE
|
||||||
|
- @ref GLFW_GAMEPAD_BUTTON_TRIANGLE
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_LEFT_X
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_LEFT_Y
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_RIGHT_X
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_RIGHT_Y
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_LEFT_TRIGGER
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER
|
||||||
|
- @ref GLFW_GAMEPAD_AXIS_LAST
|
||||||
|
|
||||||
|
|
||||||
|
@section news_32 Release notes for 3.2
|
||||||
|
|
||||||
|
These are the release notes for version 3.2. For a more detailed view including
|
||||||
|
all fixed bugs see the [version history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection features_32 New features in version 3.2
|
||||||
|
|
||||||
|
@subsubsection news_32_vulkan Support for Vulkan
|
||||||
|
|
||||||
|
GLFW now supports basic integration with Vulkan with @ref glfwVulkanSupported,
|
||||||
|
@ref glfwGetRequiredInstanceExtensions, @ref glfwGetInstanceProcAddress, @ref
|
||||||
|
glfwGetPhysicalDevicePresentationSupport and @ref glfwCreateWindowSurface.
|
||||||
|
Vulkan header inclusion can be selected with
|
||||||
|
@ref GLFW_INCLUDE_VULKAN.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_setwindowmonitor Window mode switching
|
||||||
|
|
||||||
|
GLFW now supports switching between windowed and full screen modes and updating
|
||||||
|
the monitor and desired resolution and refresh rate of full screen windows with
|
||||||
|
@ref glfwSetWindowMonitor.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_maximize Window maxmimization support
|
||||||
|
|
||||||
|
GLFW now supports window maximization with @ref glfwMaximizeWindow and the
|
||||||
|
@ref GLFW_MAXIMIZED window hint and attribute.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_focus Window input focus control
|
||||||
|
|
||||||
|
GLFW now supports giving windows input focus with @ref glfwFocusWindow.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_sizelimits Window size limit support
|
||||||
|
|
||||||
|
GLFW now supports setting both absolute and relative window size limits with
|
||||||
|
@ref glfwSetWindowSizeLimits and @ref glfwSetWindowAspectRatio.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_keyname Localized key names
|
||||||
|
|
||||||
|
GLFW now supports querying the localized name of printable keys with @ref
|
||||||
|
glfwGetKeyName, either by key token or by scancode.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_waittimeout Wait for events with timeout
|
||||||
|
|
||||||
|
GLFW now supports waiting for events for a set amount of time with @ref
|
||||||
|
glfwWaitEventsTimeout.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_icon Window icon support
|
||||||
|
|
||||||
|
GLFW now supports setting the icon of windows with @ref glfwSetWindowIcon.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_timer Raw timer access
|
||||||
|
|
||||||
|
GLFW now supports raw timer values with @ref glfwGetTimerValue and @ref
|
||||||
|
glfwGetTimerFrequency.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_joystick Joystick connection callback
|
||||||
|
|
||||||
|
GLFW now supports notifying when a joystick has been connected or disconnected
|
||||||
|
with @ref glfwSetJoystickCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_noapi Context-less windows
|
||||||
|
|
||||||
|
GLFW now supports creating windows without a OpenGL or OpenGL ES context by
|
||||||
|
setting the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_NO_API`.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_contextapi Run-time context creation API selection
|
||||||
|
|
||||||
|
GLFW now supports selecting and querying the context creation API at run-time
|
||||||
|
with the @ref GLFW_CONTEXT_CREATION_API hint and attribute.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_noerror Error-free context creation
|
||||||
|
|
||||||
|
GLFW now supports creating and querying OpenGL and OpenGL ES contexts that do
|
||||||
|
not emit errors with the @ref GLFW_CONTEXT_NO_ERROR hint, provided the machine
|
||||||
|
supports the `GL_KHR_no_error` extension.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_32_cmake CMake config-file package support
|
||||||
|
|
||||||
|
GLFW now supports being used as a
|
||||||
|
[config-file package](@ref build_link_cmake_package) from other projects for
|
||||||
|
easy linking with the library and its dependencies.
|
||||||
|
|
||||||
|
|
||||||
|
@section news_31 Release notes for 3.1
|
||||||
|
|
||||||
|
These are the release notes for version 3.1. For a more detailed view including
|
||||||
|
all fixed bugs see the [version history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection features_31 New features in version 3.1
|
||||||
|
|
||||||
|
@subsubsection news_31_cursor Custom mouse cursor images
|
||||||
|
|
||||||
|
GLFW now supports creating and setting both custom cursor images and standard
|
||||||
|
cursor shapes. They are created with @ref glfwCreateCursor or @ref
|
||||||
|
glfwCreateStandardCursor, set with @ref glfwSetCursor and destroyed with @ref
|
||||||
|
glfwDestroyCursor.
|
||||||
|
|
||||||
|
@see @ref cursor_object
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_drop Path drop event
|
||||||
|
|
||||||
|
GLFW now provides a callback for receiving the paths of files and directories
|
||||||
|
dropped onto GLFW windows. The callback is set with @ref glfwSetDropCallback.
|
||||||
|
|
||||||
|
@see @ref path_drop
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_emptyevent Main thread wake-up
|
||||||
|
|
||||||
|
GLFW now provides the @ref glfwPostEmptyEvent function for posting an empty
|
||||||
|
event from another thread to the main thread event queue, causing @ref
|
||||||
|
glfwWaitEvents to return.
|
||||||
|
|
||||||
|
@see @ref events
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_framesize Window frame size query
|
||||||
|
|
||||||
|
GLFW now supports querying the size, on each side, of the frame around the
|
||||||
|
content area of a window, with @ref glfwGetWindowFrameSize.
|
||||||
|
|
||||||
|
@see [Window size](@ref window_size)
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_autoiconify Simultaneous multi-monitor rendering
|
||||||
|
|
||||||
|
GLFW now supports disabling auto-iconification of full screen windows with
|
||||||
|
the [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint. This is
|
||||||
|
intended for people building multi-monitor installations, where you need windows
|
||||||
|
to stay in full screen despite losing input focus.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_floating Floating windows
|
||||||
|
|
||||||
|
GLFW now supports floating windows, also called topmost or always on top, for
|
||||||
|
easier debugging with the @ref GLFW_FLOATING window hint and attribute.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_focused Initially unfocused windows
|
||||||
|
|
||||||
|
GLFW now supports preventing a windowed mode window from gaining input focus on
|
||||||
|
creation, with the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) window hint.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_direct Direct access for window attributes and cursor position
|
||||||
|
|
||||||
|
GLFW now queries the window input focus, visibility and iconification attributes
|
||||||
|
and the cursor position directly instead of returning cached data.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_charmods Character with modifiers callback
|
||||||
|
|
||||||
|
GLFW now provides a callback for character events with modifier key bits. The
|
||||||
|
callback is set with @ref glfwSetCharModsCallback. Unlike the regular character
|
||||||
|
callback, this will report character events that will not result in a character
|
||||||
|
being input, for example if the Control key is held down.
|
||||||
|
|
||||||
|
@see @ref input_char
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_single Single buffered framebuffers
|
||||||
|
|
||||||
|
GLFW now supports the creation of single buffered windows, with the @ref
|
||||||
|
GLFW_DOUBLEBUFFER hint.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_glext Macro for including extension header
|
||||||
|
|
||||||
|
GLFW now includes the extension header appropriate for the chosen OpenGL or
|
||||||
|
OpenGL ES header when @ref GLFW_INCLUDE_GLEXT is defined. GLFW does not provide
|
||||||
|
these headers. They must be provided by your development environment or your
|
||||||
|
OpenGL or OpenGL ES SDK.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_release Context release behaviors
|
||||||
|
|
||||||
|
GLFW now supports controlling and querying whether the pipeline is flushed when
|
||||||
|
a context is made non-current, with the @ref GLFW_CONTEXT_RELEASE_BEHAVIOR hint
|
||||||
|
and attribute, provided the machine supports the `GL_KHR_context_flush_control`
|
||||||
|
extension.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_wayland (Experimental) Wayland support
|
||||||
|
|
||||||
|
GLFW now has an _experimental_ Wayland display protocol backend that can be
|
||||||
|
selected on Linux with a CMake option.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_31_mir (Experimental) Mir support
|
||||||
|
|
||||||
|
GLFW now has an _experimental_ Mir display server backend that can be selected
|
||||||
|
on Linux with a CMake option.
|
||||||
|
|
||||||
|
|
||||||
|
@section news_30 Release notes for 3.0
|
||||||
|
|
||||||
|
These are the release notes for version 3.0. For a more detailed view including
|
||||||
|
all fixed bugs see the [version history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection features_30 New features in version 3.0
|
||||||
|
|
||||||
|
@subsubsection news_30_cmake CMake build system
|
||||||
|
|
||||||
|
GLFW now uses the CMake build system instead of the various makefiles and
|
||||||
|
project files used by earlier versions. CMake is available for all platforms
|
||||||
|
supported by GLFW, is present in most package systems and can generate
|
||||||
|
makefiles and/or project files for most popular development environments.
|
||||||
|
|
||||||
|
For more information on how to use CMake, see the
|
||||||
|
[CMake manual](https://cmake.org/cmake/help/documentation.html).
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_multiwnd Multi-window support
|
||||||
|
|
||||||
|
GLFW now supports the creation of multiple windows, each with their own OpenGL
|
||||||
|
or OpenGL ES context, and all window functions now take a window handle. Event
|
||||||
|
callbacks are now per-window and are provided with the handle of the window that
|
||||||
|
received the event. The @ref glfwMakeContextCurrent function has been added to
|
||||||
|
select which context is current on a given thread.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_multimon Multi-monitor support
|
||||||
|
|
||||||
|
GLFW now explicitly supports multiple monitors. They can be enumerated with
|
||||||
|
@ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref
|
||||||
|
glfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize,
|
||||||
|
and specified at window creation to make the newly created window full screen on
|
||||||
|
that specific monitor.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_unicode Unicode support
|
||||||
|
|
||||||
|
All string arguments to GLFW functions and all strings returned by GLFW now use
|
||||||
|
the UTF-8 encoding. This includes the window title, error string, clipboard
|
||||||
|
text, monitor and joystick names as well as the extension function arguments (as
|
||||||
|
ASCII is a subset of UTF-8).
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_clipboard Clipboard text I/O
|
||||||
|
|
||||||
|
GLFW now supports reading and writing plain text to and from the system
|
||||||
|
clipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString
|
||||||
|
functions.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_gamma Gamma ramp support
|
||||||
|
|
||||||
|
GLFW now supports setting and reading back the gamma ramp of monitors, with the
|
||||||
|
@ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions. There is also @ref
|
||||||
|
glfwSetGamma, which generates a ramp from a gamma value and then sets it.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_gles OpenGL ES support
|
||||||
|
|
||||||
|
GLFW now supports the creation of OpenGL ES contexts, by setting the
|
||||||
|
[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_OPENGL_ES_API`, where
|
||||||
|
creation of such contexts are supported. Note that GLFW _does not implement_
|
||||||
|
OpenGL ES, so your driver must provide support in a way usable by GLFW. Modern
|
||||||
|
Nvidia and Intel drivers support creation of OpenGL ES context using the GLX and
|
||||||
|
WGL APIs, while AMD provides an EGL implementation instead.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_egl (Experimental) EGL support
|
||||||
|
|
||||||
|
GLFW now has an experimental EGL context creation back end that can be selected
|
||||||
|
through CMake options.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_hidpi High-DPI support
|
||||||
|
|
||||||
|
GLFW now supports high-DPI monitors on both Windows and macOS, giving windows
|
||||||
|
full resolution framebuffers where other UI elements are scaled up. To achieve
|
||||||
|
this, @ref glfwGetFramebufferSize and @ref glfwSetFramebufferSizeCallback have
|
||||||
|
been added. These work with pixels, while the rest of the GLFW API works with
|
||||||
|
screen coordinates. This is important as OpenGL uses pixels, not screen
|
||||||
|
coordinates.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_error Error callback
|
||||||
|
|
||||||
|
GLFW now has an error callback, which can provide your application with much
|
||||||
|
more detailed diagnostics than was previously possible. The callback is passed
|
||||||
|
an error code and a description string.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_wndptr Per-window user pointer
|
||||||
|
|
||||||
|
Each window now has a user-defined pointer, retrieved with @ref
|
||||||
|
glfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it
|
||||||
|
easier to integrate GLFW into C++ code.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_iconifyfun Window iconification callback
|
||||||
|
|
||||||
|
Each window now has a callback for iconification and restoration events,
|
||||||
|
which is set with @ref glfwSetWindowIconifyCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_wndposfun Window position callback
|
||||||
|
|
||||||
|
Each window now has a callback for position events, which is set with @ref
|
||||||
|
glfwSetWindowPosCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_wndpos Window position query
|
||||||
|
|
||||||
|
The position of a window can now be retrieved using @ref glfwGetWindowPos.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_focusfun Window focus callback
|
||||||
|
|
||||||
|
Each windows now has a callback for focus events, which is set with @ref
|
||||||
|
glfwSetWindowFocusCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_enterleave Cursor enter/leave callback
|
||||||
|
|
||||||
|
Each window now has a callback for when the mouse cursor enters or leaves its
|
||||||
|
content area, which is set with @ref glfwSetCursorEnterCallback.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_wndtitle Initial window title
|
||||||
|
|
||||||
|
The title of a window is now specified at creation time, as one of the arguments
|
||||||
|
to @ref glfwCreateWindow.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_hidden Hidden windows
|
||||||
|
|
||||||
|
Windows can now be hidden with @ref glfwHideWindow, shown using @ref
|
||||||
|
glfwShowWindow and created initially hidden with the @ref GLFW_VISIBLE window
|
||||||
|
hint and attribute. This allows for off-screen rendering in a way compatible
|
||||||
|
with most drivers, as well as moving a window to a specific position before
|
||||||
|
showing it.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_undecorated Undecorated windows
|
||||||
|
|
||||||
|
Windowed mode windows can now be created without decorations, e.g. things like
|
||||||
|
a frame, a title bar, with the @ref GLFW_DECORATED window hint and attribute.
|
||||||
|
This allows for the creation of things like splash screens.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_keymods Modifier key bit masks
|
||||||
|
|
||||||
|
[Modifier key bit mask](@ref mods) parameters have been added to the
|
||||||
|
[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_scancode Platform-specific scancodes
|
||||||
|
|
||||||
|
A scancode parameter has been added to the [key callback](@ref GLFWkeyfun). Keys
|
||||||
|
that don't have a [key token](@ref keys) still get passed on with the key
|
||||||
|
parameter set to `GLFW_KEY_UNKNOWN`. These scancodes will vary between machines
|
||||||
|
and are intended to be used for key bindings.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_jsname Joystick names
|
||||||
|
|
||||||
|
The name of a joystick can now be retrieved using @ref glfwGetJoystickName.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection news_30_doxygen Doxygen documentation
|
||||||
|
|
||||||
|
You are reading it.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
+9
-15
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
@tableofcontents
|
@tableofcontents
|
||||||
|
|
||||||
This guide takes you through writing a small application using GLFW 3. The
|
This guide takes you through writing a simple application using GLFW 3. The
|
||||||
application will create a window and OpenGL context, render a rotating triangle
|
application will create a window and OpenGL context, render a rotating triangle
|
||||||
and exit when the user closes the window or presses _Escape_. This guide will
|
and exit when the user closes the window or presses _Escape_. This guide will
|
||||||
introduce a few of the most commonly used functions, but there are many more.
|
introduce a few of the most commonly used functions, but there are many more.
|
||||||
@@ -134,14 +134,9 @@ require a minimum OpenGL version by setting the `GLFW_CONTEXT_VERSION_MAJOR` and
|
|||||||
`GLFW_CONTEXT_VERSION_MINOR` hints _before_ creation. If the required minimum
|
`GLFW_CONTEXT_VERSION_MINOR` hints _before_ creation. If the required minimum
|
||||||
version is not supported on the machine, context (and window) creation fails.
|
version is not supported on the machine, context (and window) creation fails.
|
||||||
|
|
||||||
You can select the OpenGL profile by setting the `GLFW_OPENGL_PROFILE` hint.
|
|
||||||
This program uses the core profile as that is the only profile macOS supports
|
|
||||||
for OpenGL 3.x and 4.x.
|
|
||||||
|
|
||||||
@code
|
@code
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
@@ -334,20 +329,19 @@ for example, many kinds of editing tools.
|
|||||||
@section quick_example Putting it together
|
@section quick_example Putting it together
|
||||||
|
|
||||||
Now that you know how to initialize GLFW, create a window and poll for
|
Now that you know how to initialize GLFW, create a window and poll for
|
||||||
keyboard input, it's possible to create a small program.
|
keyboard input, it's possible to create a simple program.
|
||||||
|
|
||||||
This program creates a 640 by 480 windowed mode window and starts a loop that
|
This program creates a 640 by 480 windowed mode window and starts a loop that
|
||||||
clears the screen, renders a triangle and processes events until the user either
|
clears the screen, renders a triangle and processes events until the user either
|
||||||
presses _Escape_ or closes the window.
|
presses _Escape_ or closes the window.
|
||||||
|
|
||||||
@snippet triangle-opengl.c code
|
@snippet simple.c code
|
||||||
|
|
||||||
The program above can be found in the
|
The program above can be found in the
|
||||||
[source package](https://www.glfw.org/download.html) as
|
[source package](https://www.glfw.org/download.html) as `examples/simple.c`
|
||||||
`examples/triangle-opengl.c` and is compiled along with all other examples when
|
and is compiled along with all other examples when you build GLFW. If you
|
||||||
you build GLFW. If you built GLFW from the source package then you already have
|
built GLFW from the source package then you already have this as `simple.exe` on
|
||||||
this as `triangle-opengl.exe` on Windows, `triangle-opengl` on Linux or
|
Windows, `simple` on Linux or `simple.app` on macOS.
|
||||||
`triangle-opengl.app` on macOS.
|
|
||||||
|
|
||||||
This tutorial used only a few of the many functions GLFW provides. There are
|
This tutorial used only a few of the many functions GLFW provides. There are
|
||||||
guides for each of the areas covered by GLFW. Each guide will introduce all the
|
guides for each of the areas covered by GLFW. Each guide will introduce all the
|
||||||
|
|||||||
+1
-1
@@ -93,7 +93,7 @@ if (glfwVulkanSupported())
|
|||||||
This function returns `GLFW_TRUE` if the Vulkan loader and any minimally
|
This function returns `GLFW_TRUE` if the Vulkan loader and any minimally
|
||||||
functional ICD was found.
|
functional ICD was found.
|
||||||
|
|
||||||
If if one or both were not found, calling any other Vulkan related GLFW function
|
If one or both were not found, calling any other Vulkan related GLFW function
|
||||||
will generate a @ref GLFW_API_UNAVAILABLE error.
|
will generate a @ref GLFW_API_UNAVAILABLE error.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+45
-102
@@ -236,7 +236,8 @@ does not affect window decorations. Possible values are `GLFW_TRUE` and
|
|||||||
|
|
||||||
@anchor GLFW_FOCUS_ON_SHOW_hint
|
@anchor GLFW_FOCUS_ON_SHOW_hint
|
||||||
__GLFW_FOCUS_ON_SHOW__ specifies whether the window will be given input
|
__GLFW_FOCUS_ON_SHOW__ specifies whether the window will be given input
|
||||||
focus when @ref glfwShowWindow is called. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
focus when @ref glfwShowWindow is called. Possible values are `GLFW_TRUE` and
|
||||||
|
`GLFW_FALSE`.
|
||||||
|
|
||||||
@anchor GLFW_SCALE_TO_MONITOR
|
@anchor GLFW_SCALE_TO_MONITOR
|
||||||
__GLFW_SCALE_TO_MONITOR__ specified whether the window content area should be
|
__GLFW_SCALE_TO_MONITOR__ specified whether the window content area should be
|
||||||
@@ -248,13 +249,6 @@ This hint only has an effect on platforms where screen coordinates and pixels
|
|||||||
always map 1:1 such as Windows and X11. On platforms like macOS the resolution
|
always map 1:1 such as Windows and X11. On platforms like macOS the resolution
|
||||||
of the framebuffer is changed independently of the window size.
|
of the framebuffer is changed independently of the window size.
|
||||||
|
|
||||||
@anchor GLFW_MOUSE_PASSTHROUGH_hint
|
|
||||||
__GLFW_MOUSE_PASSTHROUGH__ specifies whether the window is transparent to mouse
|
|
||||||
input, letting any mouse events pass through to whatever window is behind it.
|
|
||||||
This is only supported for undecorated windows. Decorated windows with this
|
|
||||||
enabled will behave differently between platforms. Possible values are
|
|
||||||
`GLFW_TRUE` and `GLFW_FALSE`.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection window_hints_fb Framebuffer related hints
|
@subsubsection window_hints_fb Framebuffer related hints
|
||||||
|
|
||||||
@@ -278,7 +272,6 @@ __GLFW_ACCUM_ALPHA_BITS__ specify the desired bit depths of the various
|
|||||||
components of the accumulation buffer. A value of `GLFW_DONT_CARE` means the
|
components of the accumulation buffer. A value of `GLFW_DONT_CARE` means the
|
||||||
application has no preference.
|
application has no preference.
|
||||||
|
|
||||||
@par
|
|
||||||
Accumulation buffers are a legacy OpenGL feature and should not be used in new
|
Accumulation buffers are a legacy OpenGL feature and should not be used in new
|
||||||
code.
|
code.
|
||||||
|
|
||||||
@@ -286,7 +279,6 @@ code.
|
|||||||
__GLFW_AUX_BUFFERS__ specifies the desired number of auxiliary buffers. A value
|
__GLFW_AUX_BUFFERS__ specifies the desired number of auxiliary buffers. A value
|
||||||
of `GLFW_DONT_CARE` means the application has no preference.
|
of `GLFW_DONT_CARE` means the application has no preference.
|
||||||
|
|
||||||
@par
|
|
||||||
Auxiliary buffers are a legacy OpenGL feature and should not be used in new
|
Auxiliary buffers are a legacy OpenGL feature and should not be used in new
|
||||||
code.
|
code.
|
||||||
|
|
||||||
@@ -303,14 +295,12 @@ the application has no preference.
|
|||||||
__GLFW_SRGB_CAPABLE__ specifies whether the framebuffer should be sRGB capable.
|
__GLFW_SRGB_CAPABLE__ specifies whether the framebuffer should be sRGB capable.
|
||||||
Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||||
|
|
||||||
@par
|
@note __OpenGL:__ If enabled and supported by the system, the
|
||||||
__OpenGL:__ If enabled and supported by the system, the `GL_FRAMEBUFFER_SRGB`
|
`GL_FRAMEBUFFER_SRGB` enable will control sRGB rendering. By default, sRGB
|
||||||
enable will control sRGB rendering. By default, sRGB rendering will be
|
rendering will be disabled.
|
||||||
disabled.
|
|
||||||
|
|
||||||
@par
|
@note __OpenGL ES:__ If enabled and supported by the system, the context will
|
||||||
__OpenGL ES:__ If enabled and supported by the system, the context will always
|
always have sRGB rendering enabled.
|
||||||
have sRGB rendering enabled.
|
|
||||||
|
|
||||||
@anchor GLFW_DOUBLEBUFFER
|
@anchor GLFW_DOUBLEBUFFER
|
||||||
__GLFW_DOUBLEBUFFER__ specifies whether the framebuffer should be double
|
__GLFW_DOUBLEBUFFER__ specifies whether the framebuffer should be double
|
||||||
@@ -339,28 +329,22 @@ create the context. Possible values are `GLFW_NATIVE_CONTEXT_API`,
|
|||||||
`GLFW_EGL_CONTEXT_API` and `GLFW_OSMESA_CONTEXT_API`. This is a hard
|
`GLFW_EGL_CONTEXT_API` and `GLFW_OSMESA_CONTEXT_API`. This is a hard
|
||||||
constraint. If no client API is requested, this hint is ignored.
|
constraint. If no client API is requested, this hint is ignored.
|
||||||
|
|
||||||
@par
|
An [extension loader library](@ref context_glext_auto) that assumes it knows
|
||||||
@macos The EGL API is not available on this platform and requests to use it
|
which API was used to create the current context may fail if you change this
|
||||||
will fail.
|
hint. This can be resolved by having it load functions via @ref
|
||||||
|
glfwGetProcAddress.
|
||||||
|
|
||||||
@par
|
@note @wayland The EGL API _is_ the native context creation API, so this hint
|
||||||
__Wayland:__ The EGL API _is_ the native context creation API, so this hint
|
|
||||||
will have no effect.
|
will have no effect.
|
||||||
|
|
||||||
@par
|
@note @x11 On some Linux systems, creating contexts via both the native and EGL
|
||||||
__OSMesa:__ As its name implies, an OpenGL context created with OSMesa does not
|
APIs in a single process will cause the application to segfault. Stick to one
|
||||||
update the window contents when its buffers are swapped. Use OpenGL functions
|
API or the other on Linux for now.
|
||||||
or the OSMesa native access functions @ref glfwGetOSMesaColorBuffer and @ref
|
|
||||||
glfwGetOSMesaDepthBuffer to retrieve the framebuffer contents.
|
|
||||||
|
|
||||||
@note An OpenGL extension loader library that assumes it knows which context
|
@note __OSMesa:__ As its name implies, an OpenGL context created with OSMesa
|
||||||
creation API is used on a given platform may fail if you change this hint. This
|
does not update the window contents when its buffers are swapped. Use OpenGL
|
||||||
can be resolved by having it load via @ref glfwGetProcAddress, which always uses
|
functions or the OSMesa native access functions @ref glfwGetOSMesaColorBuffer
|
||||||
the selected API.
|
and @ref glfwGetOSMesaDepthBuffer to retrieve the framebuffer contents.
|
||||||
|
|
||||||
@bug 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 API or
|
|
||||||
the other on Linux for now.
|
|
||||||
|
|
||||||
@anchor GLFW_CONTEXT_VERSION_MAJOR_hint
|
@anchor GLFW_CONTEXT_VERSION_MAJOR_hint
|
||||||
@anchor GLFW_CONTEXT_VERSION_MINOR_hint
|
@anchor GLFW_CONTEXT_VERSION_MINOR_hint
|
||||||
@@ -368,32 +352,31 @@ __GLFW_CONTEXT_VERSION_MAJOR__ and __GLFW_CONTEXT_VERSION_MINOR__ specify the
|
|||||||
client API version that the created context must be compatible with. The exact
|
client API version that the created context must be compatible with. The exact
|
||||||
behavior of these hints depend on the requested client API.
|
behavior of these hints depend on the requested client API.
|
||||||
|
|
||||||
@note Do not confuse these hints with `GLFW_VERSION_MAJOR` and
|
|
||||||
`GLFW_VERSION_MINOR`, which provide the API version of the GLFW header.
|
|
||||||
|
|
||||||
@par
|
|
||||||
__OpenGL:__ These hints are not hard constraints, but creation will fail if the
|
|
||||||
OpenGL version of the created context is less than the one requested. It is
|
|
||||||
therefore perfectly safe to use the default of version 1.0 for legacy code and
|
|
||||||
you will still get backwards-compatible contexts of version 3.0 and above when
|
|
||||||
available.
|
|
||||||
|
|
||||||
@par
|
|
||||||
While there is no way to ask the driver for a context of the highest supported
|
While there is no way to ask the driver for a context of the highest supported
|
||||||
version, GLFW will attempt to provide this when you ask for a version 1.0
|
version, GLFW will attempt to provide this when you ask for a version 1.0
|
||||||
context, which is the default for these hints.
|
context, which is the default for these hints.
|
||||||
|
|
||||||
@par
|
Do not confuse these hints with @ref GLFW_VERSION_MAJOR and @ref
|
||||||
__OpenGL ES:__ These hints are not hard constraints, but creation will fail if
|
GLFW_VERSION_MINOR, which provide the API version of the GLFW header.
|
||||||
the OpenGL ES version of the created context is less than the one 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 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 __OpenGL:__ These hints are not hard constraints, but creation will fail
|
||||||
and later. Before creating an OpenGL context of version 3.2 or later you must
|
if the OpenGL version of the created context is less than the one requested. It
|
||||||
set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hint accordingly.
|
is therefore perfectly safe to use the default of version 1.0 for legacy code
|
||||||
OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
|
and you will still get backwards-compatible contexts of version 3.0 and above
|
||||||
|
when available.
|
||||||
|
|
||||||
|
@note __OpenGL ES:__ These hints are not hard constraints, but creation will
|
||||||
|
fail if the OpenGL ES version of the created context is less than the one
|
||||||
|
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
|
||||||
|
with 2.0, but OpenGL ES 2.0 is not backward compatible with 1.x.
|
||||||
|
|
||||||
|
@note @macos The OS only supports forward-compatible core profile contexts for
|
||||||
|
OpenGL versions 3.2 and later. Before creating an OpenGL context of version
|
||||||
|
3.2 or later you must set the
|
||||||
|
[GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and
|
||||||
|
[GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. OpenGL
|
||||||
|
3.0 and 3.1 contexts are not supported at all on macOS.
|
||||||
|
|
||||||
@anchor GLFW_OPENGL_FORWARD_COMPAT_hint
|
@anchor GLFW_OPENGL_FORWARD_COMPAT_hint
|
||||||
__GLFW_OPENGL_FORWARD_COMPAT__ specifies whether the OpenGL context should be
|
__GLFW_OPENGL_FORWARD_COMPAT__ specifies whether the OpenGL context should be
|
||||||
@@ -401,25 +384,18 @@ forward-compatible, i.e. one where all functionality deprecated in the requested
|
|||||||
version of OpenGL is removed. This must only be used if the requested OpenGL
|
version of OpenGL is removed. This must only be used if the requested OpenGL
|
||||||
version is 3.0 or above. If OpenGL ES is requested, this hint is ignored.
|
version is 3.0 or above. If OpenGL ES is requested, this hint is ignored.
|
||||||
|
|
||||||
@par
|
|
||||||
Forward-compatibility is described in detail in the
|
Forward-compatibility is described in detail in the
|
||||||
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
||||||
|
|
||||||
@anchor GLFW_CONTEXT_DEBUG_hint
|
|
||||||
@anchor GLFW_OPENGL_DEBUG_CONTEXT_hint
|
@anchor GLFW_OPENGL_DEBUG_CONTEXT_hint
|
||||||
__GLFW_CONTEXT_DEBUG__ specifies whether the context should be created in debug
|
__GLFW_OPENGL_DEBUG_CONTEXT__ specifies whether the context should be created
|
||||||
mode, which may provide additional error and diagnostic reporting functionality.
|
in debug mode, which may provide additional error and diagnostic reporting
|
||||||
Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
functionality. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||||
|
|
||||||
@par
|
|
||||||
Debug contexts for OpenGL and OpenGL ES are described in detail by the
|
Debug contexts for OpenGL and OpenGL ES are described in detail by the
|
||||||
[GL_KHR_debug](https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt)
|
[GL_KHR_debug](https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt)
|
||||||
extension.
|
extension.
|
||||||
|
|
||||||
@par
|
|
||||||
This is the new name, introduced in GLFW 3.4. The older
|
|
||||||
`GLFW_OPENGL_DEBUG_CONTEXT` name is also available for compatibility.
|
|
||||||
|
|
||||||
@anchor GLFW_OPENGL_PROFILE_hint
|
@anchor GLFW_OPENGL_PROFILE_hint
|
||||||
__GLFW_OPENGL_PROFILE__ specifies which OpenGL profile to create the context
|
__GLFW_OPENGL_PROFILE__ specifies which OpenGL profile to create the context
|
||||||
for. Possible values are one of `GLFW_OPENGL_CORE_PROFILE` or
|
for. Possible values are one of `GLFW_OPENGL_CORE_PROFILE` or
|
||||||
@@ -428,7 +404,6 @@ a specific profile. If requesting an OpenGL version below 3.2,
|
|||||||
`GLFW_OPENGL_ANY_PROFILE` must be used. If OpenGL ES is requested, this hint
|
`GLFW_OPENGL_ANY_PROFILE` must be used. If OpenGL ES is requested, this hint
|
||||||
is ignored.
|
is ignored.
|
||||||
|
|
||||||
@par
|
|
||||||
OpenGL profiles are described in detail in the
|
OpenGL profiles are described in detail in the
|
||||||
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
[OpenGL Reference Manual](https://www.opengl.org/registry/).
|
||||||
|
|
||||||
@@ -448,7 +423,6 @@ the pipeline will be flushed whenever the context is released from being the
|
|||||||
current one. If the behavior is `GLFW_RELEASE_BEHAVIOR_NONE`, the pipeline will
|
current one. If the behavior is `GLFW_RELEASE_BEHAVIOR_NONE`, the pipeline will
|
||||||
not be flushed on release.
|
not be flushed on release.
|
||||||
|
|
||||||
@par
|
|
||||||
Context release behaviors are described in detail by the
|
Context release behaviors are described in detail by the
|
||||||
[GL_KHR_context_flush_control](https://www.opengl.org/registry/specs/KHR/context_flush_control.txt)
|
[GL_KHR_context_flush_control](https://www.opengl.org/registry/specs/KHR/context_flush_control.txt)
|
||||||
extension.
|
extension.
|
||||||
@@ -458,20 +432,11 @@ __GLFW_CONTEXT_NO_ERROR__ specifies whether errors should be generated by the
|
|||||||
context. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. If enabled,
|
context. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. If enabled,
|
||||||
situations that would have generated errors instead cause undefined behavior.
|
situations that would have generated errors instead cause undefined behavior.
|
||||||
|
|
||||||
@par
|
|
||||||
The no error mode for OpenGL and OpenGL ES is described in detail by the
|
The no error mode for OpenGL and OpenGL ES is described in detail by the
|
||||||
[GL_KHR_no_error](https://www.opengl.org/registry/specs/KHR/no_error.txt)
|
[GL_KHR_no_error](https://www.opengl.org/registry/specs/KHR/no_error.txt)
|
||||||
extension.
|
extension.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection window_hints_win32 Windows specific window hints
|
|
||||||
|
|
||||||
@anchor GLFW_WIN32_KEYBOARD_MENU_hint
|
|
||||||
__GLFW_WIN32_KEYBOARD_MENU__ specifies whether to allow access to the window
|
|
||||||
menu via the Alt+Space and Alt-and-then-Space keyboard shortcuts. This is
|
|
||||||
ignored on other platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection window_hints_osx macOS specific window hints
|
@subsubsection window_hints_osx macOS specific window hints
|
||||||
|
|
||||||
@anchor GLFW_COCOA_RETINA_FRAMEBUFFER_hint
|
@anchor GLFW_COCOA_RETINA_FRAMEBUFFER_hint
|
||||||
@@ -492,12 +457,10 @@ run on the discrete GPU. This only affects systems with both integrated and
|
|||||||
discrete GPUs. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
discrete GPUs. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
||||||
ignored on other platforms.
|
ignored on other platforms.
|
||||||
|
|
||||||
@par
|
|
||||||
Simpler programs and tools may want to enable this to save power, while games
|
Simpler programs and tools may want to enable this to save power, while games
|
||||||
and other applications performing advanced rendering will want to leave it
|
and other applications performing advanced rendering will want to leave it
|
||||||
disabled.
|
disabled.
|
||||||
|
|
||||||
@par
|
|
||||||
A bundled application that wishes to participate in Automatic Graphics Switching
|
A bundled application that wishes to participate in Automatic Graphics Switching
|
||||||
should also declare this in its `Info.plist` by setting the
|
should also declare this in its `Info.plist` by setting the
|
||||||
`NSSupportsAutomaticGraphicsSwitching` key to `true`.
|
`NSSupportsAutomaticGraphicsSwitching` key to `true`.
|
||||||
@@ -527,7 +490,6 @@ GLFW_CENTER_CURSOR | `GLFW_TRUE` | `GLFW_TRUE` or `GL
|
|||||||
GLFW_TRANSPARENT_FRAMEBUFFER | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_TRANSPARENT_FRAMEBUFFER | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_FOCUS_ON_SHOW | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_FOCUS_ON_SHOW | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_SCALE_TO_MONITOR | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_SCALE_TO_MONITOR | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_MOUSE_PASSTHROUGH | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
GLFW_RED_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
GLFW_RED_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
||||||
GLFW_GREEN_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
GLFW_GREEN_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
||||||
GLFW_BLUE_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
GLFW_BLUE_BITS | 8 | 0 to `INT_MAX` or `GLFW_DONT_CARE`
|
||||||
@@ -551,9 +513,8 @@ GLFW_CONTEXT_VERSION_MINOR | 0 | Any valid minor ve
|
|||||||
GLFW_CONTEXT_ROBUSTNESS | `GLFW_NO_ROBUSTNESS` | `GLFW_NO_ROBUSTNESS`, `GLFW_NO_RESET_NOTIFICATION` or `GLFW_LOSE_CONTEXT_ON_RESET`
|
GLFW_CONTEXT_ROBUSTNESS | `GLFW_NO_ROBUSTNESS` | `GLFW_NO_ROBUSTNESS`, `GLFW_NO_RESET_NOTIFICATION` or `GLFW_LOSE_CONTEXT_ON_RESET`
|
||||||
GLFW_CONTEXT_RELEASE_BEHAVIOR | `GLFW_ANY_RELEASE_BEHAVIOR` | `GLFW_ANY_RELEASE_BEHAVIOR`, `GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`
|
GLFW_CONTEXT_RELEASE_BEHAVIOR | `GLFW_ANY_RELEASE_BEHAVIOR` | `GLFW_ANY_RELEASE_BEHAVIOR`, `GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`
|
||||||
GLFW_OPENGL_FORWARD_COMPAT | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_OPENGL_FORWARD_COMPAT | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_CONTEXT_DEBUG | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_OPENGL_DEBUG_CONTEXT | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_OPENGL_PROFILE | `GLFW_OPENGL_ANY_PROFILE` | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`
|
GLFW_OPENGL_PROFILE | `GLFW_OPENGL_ANY_PROFILE` | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`
|
||||||
GLFW_WIN32_KEYBOARD_MENU | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
|
||||||
GLFW_COCOA_RETINA_FRAMEBUFFER | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_COCOA_RETINA_FRAMEBUFFER | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
GLFW_COCOA_FRAME_NAME | `""` | A UTF-8 encoded frame autosave name
|
GLFW_COCOA_FRAME_NAME | `""` | A UTF-8 encoded frame autosave name
|
||||||
GLFW_COCOA_GRAPHICS_SWITCHING | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
GLFW_COCOA_GRAPHICS_SWITCHING | `GLFW_FALSE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
@@ -1228,11 +1189,7 @@ If the system does not support whole window transparency, this function always
|
|||||||
returns one.
|
returns one.
|
||||||
|
|
||||||
GLFW comes with a test program that lets you control whole window transparency
|
GLFW comes with a test program that lets you control whole window transparency
|
||||||
at run-time called `window`.
|
at run-time called `opacity`.
|
||||||
|
|
||||||
If you want to use either of these transparency methods to display a temporary
|
|
||||||
overlay like for example a notification, the @ref GLFW_FLOATING and @ref
|
|
||||||
GLFW_MOUSE_PASSTHROUGH window hints and attributes may be useful.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection window_attribs Window attributes
|
@subsection window_attribs Window attributes
|
||||||
@@ -1322,15 +1279,6 @@ focus when @ref glfwShowWindow is called. This can be set before creation
|
|||||||
with the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint or
|
with the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint or
|
||||||
after with @ref glfwSetWindowAttrib.
|
after with @ref glfwSetWindowAttrib.
|
||||||
|
|
||||||
@anchor GLFW_MOUSE_PASSTHROUGH_attrib
|
|
||||||
__GLFW_MOUSE_PASSTHROUGH__ specifies whether the window is transparent to mouse
|
|
||||||
input, letting any mouse events pass through to whatever window is behind it.
|
|
||||||
This can be set before creation with the
|
|
||||||
[GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_hint) window hint or after
|
|
||||||
with @ref glfwSetWindowAttrib. This is only supported for undecorated windows.
|
|
||||||
Decorated windows with this enabled will behave differently between platforms.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection window_attribs_ctx Context related attributes
|
@subsubsection window_attribs_ctx Context related attributes
|
||||||
|
|
||||||
@anchor GLFW_CLIENT_API_attrib
|
@anchor GLFW_CLIENT_API_attrib
|
||||||
@@ -1357,15 +1305,10 @@ of the GLFW header.
|
|||||||
__GLFW_OPENGL_FORWARD_COMPAT__ is `GLFW_TRUE` if the window's context is an
|
__GLFW_OPENGL_FORWARD_COMPAT__ is `GLFW_TRUE` if the window's context is an
|
||||||
OpenGL forward-compatible one, or `GLFW_FALSE` otherwise.
|
OpenGL forward-compatible one, or `GLFW_FALSE` otherwise.
|
||||||
|
|
||||||
@anchor GLFW_CONTEXT_DEBUG_attrib
|
|
||||||
@anchor GLFW_OPENGL_DEBUG_CONTEXT_attrib
|
@anchor GLFW_OPENGL_DEBUG_CONTEXT_attrib
|
||||||
__GLFW_CONTEXT_DEBUG__ is `GLFW_TRUE` if the window's context is in debug
|
__GLFW_OPENGL_DEBUG_CONTEXT__ is `GLFW_TRUE` if the window's context is in debug
|
||||||
mode, or `GLFW_FALSE` otherwise.
|
mode, or `GLFW_FALSE` otherwise.
|
||||||
|
|
||||||
@par
|
|
||||||
This is the new name, introduced in GLFW 3.4. The older
|
|
||||||
`GLFW_OPENGL_DEBUG_CONTEXT` name is also available for compatibility.
|
|
||||||
|
|
||||||
@anchor GLFW_OPENGL_PROFILE_attrib
|
@anchor GLFW_OPENGL_PROFILE_attrib
|
||||||
__GLFW_OPENGL_PROFILE__ indicates the OpenGL profile used by the context. This
|
__GLFW_OPENGL_PROFILE__ indicates the OpenGL profile used by the context. This
|
||||||
is `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE` if the context
|
is `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE` if the context
|
||||||
|
|||||||
+24
-12
@@ -7,7 +7,8 @@ if (MATH_LIBRARY)
|
|||||||
link_libraries("${MATH_LIBRARY}")
|
link_libraries("${MATH_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
# Workaround for the MS CRT deprecating parts of the standard library
|
||||||
|
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -17,6 +18,17 @@ elseif (APPLE)
|
|||||||
set(ICON glfw.icns)
|
set(ICON glfw.icns)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (${CMAKE_VERSION} VERSION_EQUAL "3.1.0" OR
|
||||||
|
${CMAKE_VERSION} VERSION_GREATER "3.1.0")
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
else()
|
||||||
|
# Remove this fallback when removing support for CMake version less than 3.1
|
||||||
|
add_compile_options("$<$<C_COMPILER_ID:AppleClang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:Clang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:GNU>:-std=c99>")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h"
|
set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/glad_gl.c")
|
"${GLFW_SOURCE_DIR}/deps/glad_gl.c")
|
||||||
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
||||||
@@ -30,33 +42,34 @@ add_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD_GL})
|
|||||||
add_executable(offscreen offscreen.c ${ICON} ${GLAD_GL})
|
add_executable(offscreen offscreen.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD_GL})
|
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD_GL})
|
||||||
add_executable(sharing WIN32 MACOSX_BUNDLE sharing.c ${ICON} ${GLAD_GL})
|
add_executable(sharing WIN32 MACOSX_BUNDLE sharing.c ${ICON} ${GLAD_GL})
|
||||||
|
add_executable(simple WIN32 MACOSX_BUNDLE simple.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD_GL})
|
add_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(triangle-opengl WIN32 MACOSX_BUNDLE triangle-opengl.c ${ICON} ${GLAD_GL})
|
|
||||||
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD_GL})
|
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(windows WIN32 MACOSX_BUNDLE windows.c ${ICON} ${GLAD_GL})
|
|
||||||
|
|
||||||
target_link_libraries(particles Threads::Threads)
|
target_link_libraries(particles "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
if (RT_LIBRARY)
|
if (RT_LIBRARY)
|
||||||
target_link_libraries(particles "${RT_LIBRARY}")
|
target_link_libraries(particles "${RT_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(GUI_ONLY_BINARIES boing gears heightmap particles sharing splitview
|
set(GUI_ONLY_BINARIES boing gears heightmap particles sharing simple splitview
|
||||||
triangle-opengl wave windows)
|
wave)
|
||||||
set(CONSOLE_BINARIES offscreen)
|
set(CONSOLE_BINARIES offscreen)
|
||||||
|
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
||||||
C_STANDARD 99
|
|
||||||
FOLDER "GLFW3/Examples")
|
FOLDER "GLFW3/Examples")
|
||||||
|
|
||||||
if (GLFW_USE_OSMESA)
|
if (GLFW_USE_OSMESA)
|
||||||
find_package(OSMesa REQUIRED)
|
|
||||||
target_compile_definitions(offscreen PRIVATE USE_NATIVE_OSMESA)
|
target_compile_definitions(offscreen PRIVATE USE_NATIVE_OSMESA)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
# Tell MSVC to use main instead of WinMain for Windows subsystem executables
|
# Tell MSVC to use main instead of WinMain
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
||||||
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
||||||
|
elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
|
# Tell Clang using MS CRT to use main instead of WinMain
|
||||||
|
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
||||||
|
LINK_FLAGS "-Wl,/entry:mainCRTStartup")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
@@ -65,10 +78,9 @@ if (APPLE)
|
|||||||
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
||||||
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
||||||
set_target_properties(sharing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Sharing")
|
set_target_properties(sharing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Sharing")
|
||||||
set_target_properties(triangle-opengl PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "OpenGL Triangle")
|
set_target_properties(simple PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Simple")
|
||||||
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
||||||
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
||||||
set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows")
|
|
||||||
|
|
||||||
set_source_files_properties(glfw.icns PROPERTIES
|
set_source_files_properties(glfw.icns PROPERTIES
|
||||||
MACOSX_PACKAGE_LOCATION "Resources")
|
MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
@@ -76,6 +88,6 @@ if (APPLE)
|
|||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
|
||||||
MACOSX_BUNDLE_ICON_FILE glfw.icns
|
MACOSX_BUNDLE_ICON_FILE glfw.icns
|
||||||
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/Info.plist.in")
|
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/MacOSXBundleInfo.plist.in")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -292,12 +292,12 @@ static void generate_heightmap__circle(float* center_x, float* center_y,
|
|||||||
{
|
{
|
||||||
float sign;
|
float sign;
|
||||||
/* random value for element in between [0-1.0] */
|
/* random value for element in between [0-1.0] */
|
||||||
*center_x = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);
|
*center_x = (MAP_SIZE * rand()) / (float) RAND_MAX;
|
||||||
*center_y = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);
|
*center_y = (MAP_SIZE * rand()) / (float) RAND_MAX;
|
||||||
*size = (MAX_CIRCLE_SIZE * rand()) / (1.0f * RAND_MAX);
|
*size = (MAX_CIRCLE_SIZE * rand()) / (float) RAND_MAX;
|
||||||
sign = (1.0f * rand()) / (1.0f * RAND_MAX);
|
sign = (1.0f * rand()) / (float) RAND_MAX;
|
||||||
sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f;
|
sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f;
|
||||||
*displacement = (sign * (MAX_DISPLACEMENT * rand())) / (1.0f * RAND_MAX);
|
*displacement = (sign * (MAX_DISPLACEMENT * rand())) / (float) RAND_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run the specified number of iterations of the generation process for the
|
/* Run the specified number of iterations of the generation process for the
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// OpenGL triangle example
|
// Simple GLFW example
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
// This software is provided 'as-is', without any express or implied
|
// This software is provided 'as-is', without any express or implied
|
||||||
@@ -31,28 +31,25 @@
|
|||||||
#include "linmath.h"
|
#include "linmath.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
typedef struct Vertex
|
static const struct
|
||||||
{
|
{
|
||||||
vec2 pos;
|
float x, y;
|
||||||
vec3 col;
|
float r, g, b;
|
||||||
} Vertex;
|
} vertices[3] =
|
||||||
|
|
||||||
static const Vertex vertices[3] =
|
|
||||||
{
|
{
|
||||||
{ { -0.6f, -0.4f }, { 1.f, 0.f, 0.f } },
|
{ -0.6f, -0.4f, 1.f, 0.f, 0.f },
|
||||||
{ { 0.6f, -0.4f }, { 0.f, 1.f, 0.f } },
|
{ 0.6f, -0.4f, 0.f, 1.f, 0.f },
|
||||||
{ { 0.f, 0.6f }, { 0.f, 0.f, 1.f } }
|
{ 0.f, 0.6f, 0.f, 0.f, 1.f }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
static const char* vertex_shader_text =
|
||||||
"#version 330\n"
|
"#version 110\n"
|
||||||
"uniform mat4 MVP;\n"
|
"uniform mat4 MVP;\n"
|
||||||
"in vec3 vCol;\n"
|
"attribute vec3 vCol;\n"
|
||||||
"in vec2 vPos;\n"
|
"attribute vec2 vPos;\n"
|
||||||
"out vec3 color;\n"
|
"varying vec3 color;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
||||||
@@ -60,12 +57,11 @@ static const char* vertex_shader_text =
|
|||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
static const char* fragment_shader_text =
|
||||||
"#version 330\n"
|
"#version 110\n"
|
||||||
"in vec3 color;\n"
|
"varying vec3 color;\n"
|
||||||
"out vec4 fragment;\n"
|
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" fragment = vec4(color, 1.0);\n"
|
" gl_FragColor = vec4(color, 1.0);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
static void error_callback(int error, const char* description)
|
static void error_callback(int error, const char* description)
|
||||||
@@ -81,16 +77,19 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
GLFWwindow* window;
|
||||||
|
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
|
||||||
|
GLint mvp_location, vpos_location, vcol_location;
|
||||||
|
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
|
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL Triangle", NULL, NULL);
|
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
@@ -105,56 +104,53 @@ int main(void)
|
|||||||
|
|
||||||
// NOTE: OpenGL error checks have been omitted for brevity
|
// NOTE: OpenGL error checks have been omitted for brevity
|
||||||
|
|
||||||
GLuint vertex_buffer;
|
|
||||||
glGenBuffers(1, &vertex_buffer);
|
glGenBuffers(1, &vertex_buffer);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
||||||
glCompileShader(vertex_shader);
|
glCompileShader(vertex_shader);
|
||||||
|
|
||||||
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
||||||
glCompileShader(fragment_shader);
|
glCompileShader(fragment_shader);
|
||||||
|
|
||||||
const GLuint program = glCreateProgram();
|
program = glCreateProgram();
|
||||||
glAttachShader(program, vertex_shader);
|
glAttachShader(program, vertex_shader);
|
||||||
glAttachShader(program, fragment_shader);
|
glAttachShader(program, fragment_shader);
|
||||||
glLinkProgram(program);
|
glLinkProgram(program);
|
||||||
|
|
||||||
const GLint mvp_location = glGetUniformLocation(program, "MVP");
|
mvp_location = glGetUniformLocation(program, "MVP");
|
||||||
const GLint vpos_location = glGetAttribLocation(program, "vPos");
|
vpos_location = glGetAttribLocation(program, "vPos");
|
||||||
const GLint vcol_location = glGetAttribLocation(program, "vCol");
|
vcol_location = glGetAttribLocation(program, "vCol");
|
||||||
|
|
||||||
GLuint vertex_array;
|
|
||||||
glGenVertexArrays(1, &vertex_array);
|
|
||||||
glBindVertexArray(vertex_array);
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
glEnableVertexAttribArray(vpos_location);
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, pos));
|
sizeof(vertices[0]), (void*) 0);
|
||||||
glEnableVertexAttribArray(vcol_location);
|
glEnableVertexAttribArray(vcol_location);
|
||||||
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
||||||
sizeof(Vertex), (void*) offsetof(Vertex, col));
|
sizeof(vertices[0]), (void*) (sizeof(float) * 2));
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
|
float ratio;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
mat4x4 m, p, mvp;
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
const float ratio = width / (float) height;
|
ratio = width / (float) height;
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
mat4x4 m, p, mvp;
|
|
||||||
mat4x4_identity(m);
|
mat4x4_identity(m);
|
||||||
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
||||||
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
mat4x4_mul(mvp, p, m);
|
mat4x4_mul(mvp, p, m);
|
||||||
|
|
||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) &mvp);
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
||||||
glBindVertexArray(vertex_array);
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
// This is an example program for the GLFW library
|
// This is an example program for the GLFW library
|
||||||
//
|
//
|
||||||
// The program uses a "split window" view, rendering four views of the
|
// The program uses a "split window" view, rendering four views of the
|
||||||
// same scene in one window (e.g. uesful for 3D modelling software). This
|
// same scene in one window (e.g. useful for 3D modelling software). This
|
||||||
// demo uses scissors to separate the four different rendering areas from
|
// demo uses scissors to separate the four different rendering areas from
|
||||||
// each other.
|
// each other.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,109 +0,0 @@
|
|||||||
//========================================================================
|
|
||||||
// Simple multi-window example
|
|
||||||
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would
|
|
||||||
// be appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
// be misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source
|
|
||||||
// distribution.
|
|
||||||
//
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
#include <glad/gl.h>
|
|
||||||
#define GLFW_INCLUDE_NONE
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
int xpos, ypos, height;
|
|
||||||
const char* description;
|
|
||||||
GLFWwindow* windows[4];
|
|
||||||
|
|
||||||
if (!glfwInit())
|
|
||||||
{
|
|
||||||
glfwGetError(&description);
|
|
||||||
printf("Error: %s\n", description);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
|
||||||
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
||||||
|
|
||||||
glfwGetMonitorWorkarea(glfwGetPrimaryMonitor(), &xpos, &ypos, NULL, &height);
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
const int size = height / 5;
|
|
||||||
const struct
|
|
||||||
{
|
|
||||||
float r, g, b;
|
|
||||||
} colors[] =
|
|
||||||
{
|
|
||||||
{ 0.95f, 0.32f, 0.11f },
|
|
||||||
{ 0.50f, 0.80f, 0.16f },
|
|
||||||
{ 0.f, 0.68f, 0.94f },
|
|
||||||
{ 0.98f, 0.74f, 0.04f }
|
|
||||||
};
|
|
||||||
|
|
||||||
if (i > 0)
|
|
||||||
glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE);
|
|
||||||
|
|
||||||
windows[i] = glfwCreateWindow(size, size, "Multi-Window Example", NULL, NULL);
|
|
||||||
if (!windows[i])
|
|
||||||
{
|
|
||||||
glfwGetError(&description);
|
|
||||||
printf("Error: %s\n", description);
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSetWindowPos(windows[i],
|
|
||||||
xpos + size * (1 + (i & 1)),
|
|
||||||
ypos + size * (1 + (i >> 1)));
|
|
||||||
glfwSetInputMode(windows[i], GLFW_STICKY_KEYS, GLFW_TRUE);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(windows[i]);
|
|
||||||
gladLoadGL(glfwGetProcAddress);
|
|
||||||
glClearColor(colors[i].r, colors[i].g, colors[i].b, 1.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
glfwShowWindow(windows[i]);
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
glfwMakeContextCurrent(windows[i]);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glfwSwapBuffers(windows[i]);
|
|
||||||
|
|
||||||
if (glfwWindowShouldClose(windows[i]) ||
|
|
||||||
glfwGetKey(windows[i], GLFW_KEY_ESCAPE))
|
|
||||||
{
|
|
||||||
glfwTerminate();
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwWaitEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+113
-266
@@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.4 - www.glfw.org
|
* GLFW 3.3 - 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
|
||||||
@@ -190,6 +190,9 @@ extern "C" {
|
|||||||
#else /*__APPLE__*/
|
#else /*__APPLE__*/
|
||||||
|
|
||||||
#include <GL/glcorearb.h>
|
#include <GL/glcorearb.h>
|
||||||
|
#if defined(GLFW_INCLUDE_GLEXT)
|
||||||
|
#include <GL/glext.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /*__APPLE__*/
|
#endif /*__APPLE__*/
|
||||||
|
|
||||||
@@ -276,26 +279,27 @@ extern "C" {
|
|||||||
|
|
||||||
/*! @name GLFW version macros
|
/*! @name GLFW version macros
|
||||||
* @{ */
|
* @{ */
|
||||||
/*! @brief The major version number of the GLFW library.
|
/*! @brief The major version number of the GLFW header.
|
||||||
*
|
*
|
||||||
* This is incremented when the API is changed in non-compatible ways.
|
* The major version number of the GLFW header. This is incremented when the
|
||||||
|
* API is changed in non-compatible ways.
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
#define GLFW_VERSION_MAJOR 3
|
#define GLFW_VERSION_MAJOR 3
|
||||||
/*! @brief The minor version number of the GLFW library.
|
/*! @brief The minor version number of the GLFW header.
|
||||||
*
|
*
|
||||||
* This is incremented when features are added to the API but it remains
|
* The minor version number of the GLFW header. This is incremented when
|
||||||
* 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 3
|
||||||
/*! @brief The revision number of the GLFW library.
|
/*! @brief The revision number of the GLFW header.
|
||||||
*
|
*
|
||||||
* This is incremented when a bug fix release is made that does not contain any
|
* The revision number of the GLFW header. This is incremented when a bug fix
|
||||||
* 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 6
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
/*! @brief One.
|
/*! @brief One.
|
||||||
@@ -782,44 +786,6 @@ extern "C" {
|
|||||||
* @analysis Application programmer error. Fix the offending call.
|
* @analysis Application programmer error. Fix the offending call.
|
||||||
*/
|
*/
|
||||||
#define GLFW_NO_WINDOW_CONTEXT 0x0001000A
|
#define GLFW_NO_WINDOW_CONTEXT 0x0001000A
|
||||||
/*! @brief The specified cursor shape is not available.
|
|
||||||
*
|
|
||||||
* The specified standard cursor shape is not available, either because the
|
|
||||||
* current system cursor theme does not provide it or because it is not
|
|
||||||
* available on the platform.
|
|
||||||
*
|
|
||||||
* @analysis Platform or system settings limitation. Pick another
|
|
||||||
* [standard cursor shape](@ref shapes) or create a
|
|
||||||
* [custom cursor](@ref cursor_custom).
|
|
||||||
*/
|
|
||||||
#define GLFW_CURSOR_UNAVAILABLE 0x0001000B
|
|
||||||
/*! @brief The requested feature is not provided by the platform.
|
|
||||||
*
|
|
||||||
* The requested feature is not provided by the platform, so GLFW is unable to
|
|
||||||
* implement it. The documentation for each function notes if it could emit
|
|
||||||
* this error.
|
|
||||||
*
|
|
||||||
* @analysis Platform or platform version limitation. The error can be ignored
|
|
||||||
* unless the feature is critical to the application.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* A function call that emits this error has no effect other than the error and
|
|
||||||
* updating any existing out parameters.
|
|
||||||
*/
|
|
||||||
#define GLFW_FEATURE_UNAVAILABLE 0x0001000C
|
|
||||||
/*! @brief The requested feature is not implemented for the platform.
|
|
||||||
*
|
|
||||||
* The requested feature has not yet been implemented in GLFW for this platform.
|
|
||||||
*
|
|
||||||
* @analysis An incomplete implementation of GLFW for this platform, hopefully
|
|
||||||
* fixed in a future release. The error can be ignored unless the feature is
|
|
||||||
* critical to the application.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* A function call that emits this error has no effect other than the error and
|
|
||||||
* updating any existing out parameters.
|
|
||||||
*/
|
|
||||||
#define GLFW_FEATURE_UNIMPLEMENTED 0x0001000D
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
/*! @addtogroup window
|
/*! @addtogroup window
|
||||||
@@ -895,13 +861,6 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define GLFW_FOCUS_ON_SHOW 0x0002000C
|
#define GLFW_FOCUS_ON_SHOW 0x0002000C
|
||||||
|
|
||||||
/*! @brief Mouse input transparency window hint and attribute
|
|
||||||
*
|
|
||||||
* Mouse input transparency [window hint](@ref GLFW_MOUSE_PASSTHROUGH_hint) or
|
|
||||||
* [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib).
|
|
||||||
*/
|
|
||||||
#define GLFW_MOUSE_PASSTHROUGH 0x0002000D
|
|
||||||
|
|
||||||
/*! @brief Framebuffer bit depth hint.
|
/*! @brief Framebuffer bit depth hint.
|
||||||
*
|
*
|
||||||
* Framebuffer bit depth [hint](@ref GLFW_RED_BITS).
|
* Framebuffer bit depth [hint](@ref GLFW_RED_BITS).
|
||||||
@@ -1001,7 +960,7 @@ extern "C" {
|
|||||||
* and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib).
|
* and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib).
|
||||||
*/
|
*/
|
||||||
#define GLFW_CONTEXT_VERSION_MINOR 0x00022003
|
#define GLFW_CONTEXT_VERSION_MINOR 0x00022003
|
||||||
/*! @brief Context client API revision number hint and attribute.
|
/*! @brief Context client API revision number attribute.
|
||||||
*
|
*
|
||||||
* Context client API revision number
|
* Context client API revision number
|
||||||
* [attribute](@ref GLFW_CONTEXT_REVISION_attrib).
|
* [attribute](@ref GLFW_CONTEXT_REVISION_attrib).
|
||||||
@@ -1021,15 +980,10 @@ extern "C" {
|
|||||||
#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006
|
#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006
|
||||||
/*! @brief Debug mode context hint and attribute.
|
/*! @brief Debug mode context hint and attribute.
|
||||||
*
|
*
|
||||||
* Debug mode context [hint](@ref GLFW_CONTEXT_DEBUG_hint) and
|
* Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and
|
||||||
* [attribute](@ref GLFW_CONTEXT_DEBUG_attrib).
|
* [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib).
|
||||||
*/
|
*/
|
||||||
#define GLFW_CONTEXT_DEBUG 0x00022007
|
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007
|
||||||
/*! @brief Legacy name for compatibility.
|
|
||||||
*
|
|
||||||
* This is an alias for compatibility with earlier versions.
|
|
||||||
*/
|
|
||||||
#define GLFW_OPENGL_DEBUG_CONTEXT GLFW_CONTEXT_DEBUG
|
|
||||||
/*! @brief OpenGL profile hint and attribute.
|
/*! @brief OpenGL profile hint and attribute.
|
||||||
*
|
*
|
||||||
* OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and
|
* OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and
|
||||||
@@ -1078,7 +1032,6 @@ extern "C" {
|
|||||||
* [window hint](@ref GLFW_X11_CLASS_NAME_hint).
|
* [window hint](@ref GLFW_X11_CLASS_NAME_hint).
|
||||||
*/
|
*/
|
||||||
#define GLFW_X11_INSTANCE_NAME 0x00024002
|
#define GLFW_X11_INSTANCE_NAME 0x00024002
|
||||||
#define GLFW_WIN32_KEYBOARD_MENU 0x00025001
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
#define GLFW_NO_API 0
|
#define GLFW_NO_API 0
|
||||||
@@ -1111,26 +1064,17 @@ extern "C" {
|
|||||||
#define GLFW_EGL_CONTEXT_API 0x00036002
|
#define GLFW_EGL_CONTEXT_API 0x00036002
|
||||||
#define GLFW_OSMESA_CONTEXT_API 0x00036003
|
#define GLFW_OSMESA_CONTEXT_API 0x00036003
|
||||||
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_NONE 0x00037001
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_OPENGL 0x00037002
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_OPENGLES 0x00037003
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_D3D9 0x00037004
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_D3D11 0x00037005
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_VULKAN 0x00037007
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE_METAL 0x00037008
|
|
||||||
|
|
||||||
/*! @defgroup shapes Standard cursor shapes
|
/*! @defgroup shapes Standard cursor shapes
|
||||||
* @brief Standard system cursor shapes.
|
* @brief Standard system cursor shapes.
|
||||||
*
|
*
|
||||||
* These are the [standard cursor shapes](@ref cursor_standard) that can be
|
* See [standard cursor creation](@ref cursor_standard) for how these are used.
|
||||||
* requested from the window system.
|
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
* @{ */
|
* @{ */
|
||||||
|
|
||||||
/*! @brief The regular arrow cursor shape.
|
/*! @brief The regular arrow cursor shape.
|
||||||
*
|
*
|
||||||
* The regular arrow cursor shape.
|
* The regular arrow cursor.
|
||||||
*/
|
*/
|
||||||
#define GLFW_ARROW_CURSOR 0x00036001
|
#define GLFW_ARROW_CURSOR 0x00036001
|
||||||
/*! @brief The text input I-beam cursor shape.
|
/*! @brief The text input I-beam cursor shape.
|
||||||
@@ -1138,91 +1082,26 @@ extern "C" {
|
|||||||
* The text input I-beam cursor shape.
|
* The text input I-beam cursor shape.
|
||||||
*/
|
*/
|
||||||
#define GLFW_IBEAM_CURSOR 0x00036002
|
#define GLFW_IBEAM_CURSOR 0x00036002
|
||||||
/*! @brief The crosshair cursor shape.
|
/*! @brief The crosshair shape.
|
||||||
*
|
*
|
||||||
* The crosshair cursor shape.
|
* The crosshair shape.
|
||||||
*/
|
*/
|
||||||
#define GLFW_CROSSHAIR_CURSOR 0x00036003
|
#define GLFW_CROSSHAIR_CURSOR 0x00036003
|
||||||
/*! @brief The pointing hand cursor shape.
|
/*! @brief The hand shape.
|
||||||
*
|
*
|
||||||
* The pointing hand cursor shape.
|
* The hand shape.
|
||||||
*/
|
*/
|
||||||
#define GLFW_POINTING_HAND_CURSOR 0x00036004
|
#define GLFW_HAND_CURSOR 0x00036004
|
||||||
/*! @brief The horizontal resize/move arrow shape.
|
/*! @brief The horizontal resize arrow shape.
|
||||||
*
|
*
|
||||||
* The horizontal resize/move arrow shape. This is usually a horizontal
|
* The horizontal resize arrow shape.
|
||||||
* double-headed arrow.
|
|
||||||
*/
|
*/
|
||||||
#define GLFW_RESIZE_EW_CURSOR 0x00036005
|
#define GLFW_HRESIZE_CURSOR 0x00036005
|
||||||
/*! @brief The vertical resize/move arrow shape.
|
/*! @brief The vertical resize arrow shape.
|
||||||
*
|
*
|
||||||
* The vertical resize/move shape. This is usually a vertical double-headed
|
* The vertical resize arrow shape.
|
||||||
* arrow.
|
|
||||||
*/
|
*/
|
||||||
#define GLFW_RESIZE_NS_CURSOR 0x00036006
|
#define GLFW_VRESIZE_CURSOR 0x00036006
|
||||||
/*! @brief The top-left to bottom-right diagonal resize/move arrow shape.
|
|
||||||
*
|
|
||||||
* The top-left to bottom-right diagonal resize/move shape. This is usually
|
|
||||||
* a diagonal double-headed arrow.
|
|
||||||
*
|
|
||||||
* @note @macos This shape is provided by a private system API and may fail
|
|
||||||
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
|
||||||
*
|
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
|
||||||
* cursor themes.
|
|
||||||
*
|
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
|
||||||
* all cursor themes.
|
|
||||||
*/
|
|
||||||
#define GLFW_RESIZE_NWSE_CURSOR 0x00036007
|
|
||||||
/*! @brief The top-right to bottom-left diagonal resize/move arrow shape.
|
|
||||||
*
|
|
||||||
* The top-right to bottom-left diagonal resize/move shape. This is usually
|
|
||||||
* a diagonal double-headed arrow.
|
|
||||||
*
|
|
||||||
* @note @macos This shape is provided by a private system API and may fail
|
|
||||||
* with @ref GLFW_CURSOR_UNAVAILABLE in the future.
|
|
||||||
*
|
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
|
||||||
* cursor themes.
|
|
||||||
*
|
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
|
||||||
* all cursor themes.
|
|
||||||
*/
|
|
||||||
#define GLFW_RESIZE_NESW_CURSOR 0x00036008
|
|
||||||
/*! @brief The omni-directional resize/move cursor shape.
|
|
||||||
*
|
|
||||||
* The omni-directional resize cursor/move shape. This is usually either
|
|
||||||
* a combined horizontal and vertical double-headed arrow or a grabbing hand.
|
|
||||||
*/
|
|
||||||
#define GLFW_RESIZE_ALL_CURSOR 0x00036009
|
|
||||||
/*! @brief The operation-not-allowed shape.
|
|
||||||
*
|
|
||||||
* The operation-not-allowed shape. This is usually a circle with a diagonal
|
|
||||||
* line through it.
|
|
||||||
*
|
|
||||||
* @note @x11 This shape is provided by a newer standard not supported by all
|
|
||||||
* cursor themes.
|
|
||||||
*
|
|
||||||
* @note @wayland This shape is provided by a newer standard not supported by
|
|
||||||
* all cursor themes.
|
|
||||||
*/
|
|
||||||
#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A
|
|
||||||
/*! @brief Legacy name for compatibility.
|
|
||||||
*
|
|
||||||
* This is an alias for compatibility with earlier versions.
|
|
||||||
*/
|
|
||||||
#define GLFW_HRESIZE_CURSOR GLFW_RESIZE_EW_CURSOR
|
|
||||||
/*! @brief Legacy name for compatibility.
|
|
||||||
*
|
|
||||||
* This is an alias for compatibility with earlier versions.
|
|
||||||
*/
|
|
||||||
#define GLFW_VRESIZE_CURSOR GLFW_RESIZE_NS_CURSOR
|
|
||||||
/*! @brief Legacy name for compatibility.
|
|
||||||
*
|
|
||||||
* This is an alias for compatibility with earlier versions.
|
|
||||||
*/
|
|
||||||
#define GLFW_HAND_CURSOR GLFW_POINTING_HAND_CURSOR
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
#define GLFW_CONNECTED 0x00040001
|
#define GLFW_CONNECTED 0x00040001
|
||||||
@@ -1235,11 +1114,6 @@ extern "C" {
|
|||||||
* Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS).
|
* Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS).
|
||||||
*/
|
*/
|
||||||
#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001
|
#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001
|
||||||
/*! @brief ANGLE rendering backend init hint.
|
|
||||||
*
|
|
||||||
* ANGLE rendering backend [init hint](@ref GLFW_ANGLE_PLATFORM_TYPE_hint).
|
|
||||||
*/
|
|
||||||
#define GLFW_ANGLE_PLATFORM_TYPE 0x00050002
|
|
||||||
/*! @brief macOS specific init hint.
|
/*! @brief macOS specific init hint.
|
||||||
*
|
*
|
||||||
* macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint).
|
* macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint).
|
||||||
@@ -1345,7 +1219,7 @@ typedef struct GLFWcursor GLFWcursor;
|
|||||||
*
|
*
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWerrorfun)(int,const char*);
|
typedef void (* GLFWerrorfun)(int error_code, const char* description);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window position callbacks.
|
/*! @brief The function pointer type for window position callbacks.
|
||||||
*
|
*
|
||||||
@@ -1368,7 +1242,7 @@ typedef void (* GLFWerrorfun)(int,const char*);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);
|
typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window size callbacks.
|
/*! @brief The function pointer type for window size callbacks.
|
||||||
*
|
*
|
||||||
@@ -1390,7 +1264,7 @@ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);
|
typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window close callbacks.
|
/*! @brief The function pointer type for window close callbacks.
|
||||||
*
|
*
|
||||||
@@ -1410,7 +1284,7 @@ typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowclosefun)(GLFWwindow*);
|
typedef void (* GLFWwindowclosefun)(GLFWwindow* window);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window content refresh callbacks.
|
/*! @brief The function pointer type for window content refresh callbacks.
|
||||||
*
|
*
|
||||||
@@ -1430,7 +1304,7 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
|
typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window focus callbacks.
|
/*! @brief The function pointer type for window focus callbacks.
|
||||||
*
|
*
|
||||||
@@ -1451,7 +1325,7 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
|
typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window iconify callbacks.
|
/*! @brief The function pointer type for window iconify callbacks.
|
||||||
*
|
*
|
||||||
@@ -1472,7 +1346,7 @@ typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);
|
typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window maximize callbacks.
|
/*! @brief The function pointer type for window maximize callbacks.
|
||||||
*
|
*
|
||||||
@@ -1493,7 +1367,7 @@ typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int);
|
typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized);
|
||||||
|
|
||||||
/*! @brief The function pointer type for framebuffer size callbacks.
|
/*! @brief The function pointer type for framebuffer size callbacks.
|
||||||
*
|
*
|
||||||
@@ -1514,7 +1388,7 @@ typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);
|
typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height);
|
||||||
|
|
||||||
/*! @brief The function pointer type for window content scale callbacks.
|
/*! @brief The function pointer type for window content scale callbacks.
|
||||||
*
|
*
|
||||||
@@ -1535,7 +1409,7 @@ typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float);
|
typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale);
|
||||||
|
|
||||||
/*! @brief The function pointer type for mouse button callbacks.
|
/*! @brief The function pointer type for mouse button callbacks.
|
||||||
*
|
*
|
||||||
@@ -1561,7 +1435,7 @@ typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
|
typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods);
|
||||||
|
|
||||||
/*! @brief The function pointer type for cursor position callbacks.
|
/*! @brief The function pointer type for cursor position callbacks.
|
||||||
*
|
*
|
||||||
@@ -1584,7 +1458,7 @@ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
|
typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos);
|
||||||
|
|
||||||
/*! @brief The function pointer type for cursor enter/leave callbacks.
|
/*! @brief The function pointer type for cursor enter/leave callbacks.
|
||||||
*
|
*
|
||||||
@@ -1605,7 +1479,7 @@ typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
|
typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered);
|
||||||
|
|
||||||
/*! @brief The function pointer type for scroll callbacks.
|
/*! @brief The function pointer type for scroll callbacks.
|
||||||
*
|
*
|
||||||
@@ -1626,7 +1500,7 @@ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
|
typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset);
|
||||||
|
|
||||||
/*! @brief The function pointer type for keyboard key callbacks.
|
/*! @brief The function pointer type for keyboard key callbacks.
|
||||||
*
|
*
|
||||||
@@ -1652,7 +1526,7 @@ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
|
typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods);
|
||||||
|
|
||||||
/*! @brief The function pointer type for Unicode character callbacks.
|
/*! @brief The function pointer type for Unicode character callbacks.
|
||||||
*
|
*
|
||||||
@@ -1673,7 +1547,7 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
|
typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint);
|
||||||
|
|
||||||
/*! @brief The function pointer type for Unicode character with modifiers
|
/*! @brief The function pointer type for Unicode character with modifiers
|
||||||
* callbacks.
|
* callbacks.
|
||||||
@@ -1700,7 +1574,7 @@ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
|
typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods);
|
||||||
|
|
||||||
/*! @brief The function pointer type for path drop callbacks.
|
/*! @brief The function pointer type for path drop callbacks.
|
||||||
*
|
*
|
||||||
@@ -1724,7 +1598,7 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWdropfun)(GLFWwindow*,int,const char*[]);
|
typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]);
|
||||||
|
|
||||||
/*! @brief The function pointer type for monitor configuration callbacks.
|
/*! @brief The function pointer type for monitor configuration callbacks.
|
||||||
*
|
*
|
||||||
@@ -1745,7 +1619,7 @@ typedef void (* GLFWdropfun)(GLFWwindow*,int,const char*[]);
|
|||||||
*
|
*
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
|
typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event);
|
||||||
|
|
||||||
/*! @brief The function pointer type for joystick configuration callbacks.
|
/*! @brief The function pointer type for joystick configuration callbacks.
|
||||||
*
|
*
|
||||||
@@ -1766,7 +1640,7 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
|
|||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWjoystickfun)(int,int);
|
typedef void (* GLFWjoystickfun)(int jid, int event);
|
||||||
|
|
||||||
/*! @brief Video mode type.
|
/*! @brief Video mode type.
|
||||||
*
|
*
|
||||||
@@ -1908,14 +1782,6 @@ typedef struct GLFWgamepadstate
|
|||||||
* 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
|
|
||||||
* 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
|
|
||||||
* common commands like Hide, Quit and About. The About entry opens a minimal
|
|
||||||
* about dialog with information from the application's bundle. The menu bar
|
|
||||||
* and dock icon can be disabled entirely with the @ref GLFW_COCOA_MENUBAR init
|
|
||||||
* hint.
|
|
||||||
*
|
|
||||||
* @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.
|
||||||
@@ -2262,8 +2128,8 @@ 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 calculates the returned physical size from the
|
* @remark @win32 On Windows 8 and earlier the physical size is calculated from
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
@@ -2417,8 +2283,9 @@ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback);
|
|||||||
*
|
*
|
||||||
* This function returns an array of all video modes supported by the specified
|
* This function returns an array of all video modes supported by the specified
|
||||||
* monitor. The returned array is sorted in ascending order, first by color
|
* monitor. The returned array is sorted in ascending order, first by color
|
||||||
* bit depth (the sum of all channel depths) and then by resolution area (the
|
* bit depth (the sum of all channel depths), then by resolution area (the
|
||||||
* product of width and height).
|
* product of width and height), then resolution width and finally by refresh
|
||||||
|
* rate.
|
||||||
*
|
*
|
||||||
* @param[in] monitor The monitor to query.
|
* @param[in] monitor The monitor to query.
|
||||||
* @param[out] count Where to store the number of video modes in the returned
|
* @param[out] count Where to store the number of video modes in the returned
|
||||||
@@ -2749,11 +2616,12 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
* @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 forward-compatible core profile contexts
|
||||||
* versions 3.2 and later. Before creating an OpenGL context of version 3.2 or
|
* for OpenGL versions 3.2 and later. Before creating an OpenGL context of
|
||||||
* later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint)
|
* version 3.2 or later you must set the
|
||||||
* hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all
|
* [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and
|
||||||
* on macOS.
|
* [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly.
|
||||||
|
* OpenGL 3.0 and 3.1 contexts are not supported at all 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.
|
||||||
@@ -2761,6 +2629,13 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
* [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)
|
* [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)
|
||||||
* in the Mac Developer Library.
|
* in the Mac Developer Library.
|
||||||
*
|
*
|
||||||
|
* @remark @macos The first time a window is created the menu bar is created.
|
||||||
|
* 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 common commands
|
||||||
|
* like Hide, Quit and About. The About entry opens a minimal about dialog
|
||||||
|
* with information from the application's bundle. Menu bar creation can be
|
||||||
|
* disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint.
|
||||||
|
*
|
||||||
* @remark @macos On OS X 10.10 and later the window frame will not be rendered
|
* @remark @macos On OS X 10.10 and later the window frame will not be rendered
|
||||||
* at full resolution on Retina displays unless the
|
* at full resolution on Retina displays unless the
|
||||||
* [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint)
|
* [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint)
|
||||||
@@ -2769,7 +2644,7 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
|
|||||||
* [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)
|
* [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)
|
||||||
* in the Mac Developer Library. The GLFW test and example programs use
|
* in the Mac Developer Library. The GLFW test and example programs use
|
||||||
* a custom `Info.plist` template for this, which can be found as
|
* a custom `Info.plist` template for this, which can be found as
|
||||||
* `CMake/Info.plist.in` in the source tree.
|
* `CMake/MacOSXBundleInfo.plist.in` in the source tree.
|
||||||
*
|
*
|
||||||
* @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
|
||||||
@@ -2933,21 +2808,21 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);
|
|||||||
* @param[in] images The images to create the icon from. This is ignored if
|
* @param[in] images The images to create the icon from. This is ignored if
|
||||||
* count is zero.
|
* count is zero.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @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 The GLFW window has no icon, as it is not a document
|
||||||
* will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as
|
* window, so this function does nothing. 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](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)
|
* [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)
|
||||||
* in the Mac Developer Library.
|
* in the Mac Developer Library.
|
||||||
*
|
*
|
||||||
* @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 always emits @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -2973,12 +2848,12 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* i
|
|||||||
* @param[out] ypos Where to store the y-coordinate of the upper-left corner of
|
* @param[out] ypos Where to store the y-coordinate of the upper-left corner of
|
||||||
* the content area, or `NULL`.
|
* the content area, or `NULL`.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no way for an application to retrieve the global
|
* @remark @wayland There is no way for an application to retrieve the global
|
||||||
* position of its windows. This function will emit @ref
|
* position of its windows, this function will always emit @ref
|
||||||
* GLFW_FEATURE_UNAVAILABLE.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -3007,12 +2882,12 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
|
|||||||
* @param[in] xpos The x-coordinate of the upper-left corner of the content area.
|
* @param[in] xpos The x-coordinate of the upper-left corner of the content area.
|
||||||
* @param[in] ypos The y-coordinate of the upper-left corner of the content area.
|
* @param[in] ypos The y-coordinate of the upper-left corner of the content area.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland There is no way for an application to set the global
|
* @remark @wayland There is no way for an application to set the global
|
||||||
* position of its windows. This function will emit @ref
|
* position of its windows, this function will always emit @ref
|
||||||
* GLFW_FEATURE_UNAVAILABLE.
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -3324,11 +3199,8 @@ GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window);
|
|||||||
* @param[in] window The window to set the opacity for.
|
* @param[in] window The window to set the opacity for.
|
||||||
* @param[in] opacity The desired opacity of the specified window.
|
* @param[in] opacity The desired opacity of the specified window.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
|
||||||
* @remark @wayland There is no way to set an opacity factor for a window.
|
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
@@ -3355,8 +3227,8 @@ 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
|
* @remark @wayland There is no concept of iconification in wl_shell, this
|
||||||
* be able to restore it. This is a design decision of the xdg-shell
|
* function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated
|
||||||
* protocol.
|
* 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.
|
||||||
@@ -3495,11 +3367,11 @@ GLFWAPI void glfwHideWindow(GLFWwindow* window);
|
|||||||
*
|
*
|
||||||
* @param[in] window The window to give input focus.
|
* @param[in] window The window to give input focus.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks).
|
* GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @remark @wayland It is not possible for an application to set the input
|
* @remark @wayland It is not possible for an application to bring its windows
|
||||||
* focus. This function will emit @ref GLFW_FEATURE_UNAVAILABLE.
|
* to front, this function will always emit @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -3663,7 +3535,6 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib);
|
|||||||
* [GLFW_FLOATING](@ref GLFW_FLOATING_attrib),
|
* [GLFW_FLOATING](@ref GLFW_FLOATING_attrib),
|
||||||
* [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and
|
* [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and
|
||||||
* [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib).
|
* [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib).
|
||||||
* [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_attrib)
|
|
||||||
*
|
*
|
||||||
* Some of these attributes are ignored for full screen windows. The new
|
* Some of these attributes are ignored for full screen windows. The new
|
||||||
* value will take effect if the window is later made windowed.
|
* value will take effect if the window is later made windowed.
|
||||||
@@ -3934,6 +3805,9 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi
|
|||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
*
|
*
|
||||||
|
* @remark @wayland The wl_shell protocol has no concept of iconification,
|
||||||
|
* this callback will never be called when using this deprecated protocol.
|
||||||
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
* @sa @ref window_iconify
|
* @sa @ref window_iconify
|
||||||
@@ -4252,7 +4126,7 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
* If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE`
|
* If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE`
|
||||||
* to enable raw (unscaled and unaccelerated) mouse motion when the cursor is
|
* to enable raw (unscaled and unaccelerated) mouse motion when the cursor is
|
||||||
* disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported,
|
* disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported,
|
||||||
* attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref
|
* attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref
|
||||||
* glfwRawMouseMotionSupported to check for support.
|
* glfwRawMouseMotionSupported to check for support.
|
||||||
*
|
*
|
||||||
* @param[in] window The window whose input mode to set.
|
* @param[in] window The window whose input mode to set.
|
||||||
@@ -4262,8 +4136,7 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
* @param[in] value The new value of the specified input mode.
|
* @param[in] value The new value of the specified input mode.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_INVALID_ENUM, @ref GLFW_PLATFORM_ERROR and @ref
|
* GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.
|
||||||
* GLFW_FEATURE_UNAVAILABLE (see above).
|
|
||||||
*
|
*
|
||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
@@ -4583,44 +4456,19 @@ GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot)
|
|||||||
|
|
||||||
/*! @brief Creates a cursor with a standard shape.
|
/*! @brief Creates a cursor with a standard shape.
|
||||||
*
|
*
|
||||||
* Returns a cursor with a standard shape, that can be set for a window with
|
* Returns a cursor with a [standard shape](@ref shapes), that can be set for
|
||||||
* @ref glfwSetCursor. The images for these cursors come from the system
|
* a window with @ref glfwSetCursor.
|
||||||
* cursor theme and their exact appearance will vary between platforms.
|
|
||||||
*
|
|
||||||
* Most of these shapes are guaranteed to exist on every supported platform but
|
|
||||||
* a few may not be present. See the table below for details.
|
|
||||||
*
|
|
||||||
* Cursor shape | Windows | macOS | X11 | Wayland
|
|
||||||
* ------------------------------ | ------- | ----- | ------ | -------
|
|
||||||
* @ref GLFW_ARROW_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_IBEAM_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_CROSSHAIR_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_POINTING_HAND_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_RESIZE_EW_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_RESIZE_NS_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_RESIZE_NWSE_CURSOR | Yes | Yes<sup>1</sup> | Maybe<sup>2</sup> | Maybe<sup>2</sup>
|
|
||||||
* @ref GLFW_RESIZE_NESW_CURSOR | Yes | Yes<sup>1</sup> | Maybe<sup>2</sup> | Maybe<sup>2</sup>
|
|
||||||
* @ref GLFW_RESIZE_ALL_CURSOR | Yes | Yes | Yes | Yes
|
|
||||||
* @ref GLFW_NOT_ALLOWED_CURSOR | Yes | Yes | Maybe<sup>2</sup> | Maybe<sup>2</sup>
|
|
||||||
*
|
|
||||||
* 1) This uses a private system API and may fail in the future.
|
|
||||||
*
|
|
||||||
* 2) This uses a newer standard that not all cursor themes support.
|
|
||||||
*
|
|
||||||
* If the requested shape is not available, this function emits a @ref
|
|
||||||
* GLFW_CURSOR_UNAVAILABLE error and returns `NULL`.
|
|
||||||
*
|
*
|
||||||
* @param[in] shape One of the [standard shapes](@ref shapes).
|
* @param[in] shape One of the [standard shapes](@ref shapes).
|
||||||
* @return A new cursor ready to use or `NULL` if an
|
* @return A new cursor ready to use or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_INVALID_ENUM, @ref GLFW_CURSOR_UNAVAILABLE and @ref
|
* GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.
|
||||||
* GLFW_PLATFORM_ERROR.
|
|
||||||
*
|
*
|
||||||
* @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 cursor_standard
|
* @sa @ref cursor_object
|
||||||
* @sa @ref glfwCreateCursor
|
* @sa @ref glfwCreateCursor
|
||||||
*
|
*
|
||||||
* @since Added in version 3.1.
|
* @since Added in version 3.1.
|
||||||
@@ -5379,6 +5227,8 @@ GLFWAPI int glfwUpdateGamepadMappings(const char* string);
|
|||||||
* joystick is not present, does not have a mapping or an
|
* joystick is not present, does not have a mapping or an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM.
|
||||||
|
*
|
||||||
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
||||||
* should not free it yourself. It is valid until the specified joystick is
|
* should not free it yourself. It is valid until the specified joystick is
|
||||||
* disconnected, the gamepad mappings are updated or the library is terminated.
|
* disconnected, the gamepad mappings are updated or the library is terminated.
|
||||||
@@ -5468,8 +5318,8 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);
|
|||||||
* @return The contents of the clipboard as a UTF-8 encoded string, or `NULL`
|
* @return The contents of the clipboard as a UTF-8 encoded string, or `NULL`
|
||||||
* if an [error](@ref error_handling) occurred.
|
* if an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
||||||
*
|
*
|
||||||
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
||||||
* should not free it yourself. It is valid until the next call to @ref
|
* should not free it yourself. It is valid until the next call to @ref
|
||||||
@@ -5813,13 +5663,11 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);
|
|||||||
* This function returns whether the Vulkan loader and any minimally functional
|
* This function returns whether the Vulkan loader and any minimally functional
|
||||||
* ICD have been found.
|
* ICD have been found.
|
||||||
*
|
*
|
||||||
* The availability of a Vulkan loader and even an ICD does not by itself
|
* The availability of a Vulkan loader and even an ICD does not by itself guarantee that
|
||||||
* guarantee that surface creation or even instance creation is possible.
|
* surface creation or even instance creation is possible. Call @ref
|
||||||
* For example, on Fermi systems Nvidia will install an ICD that provides no
|
* glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan
|
||||||
* actual Vulkan support. Call @ref glfwGetRequiredInstanceExtensions to check
|
* surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to
|
||||||
* whether the extensions necessary for Vulkan surface creation are available
|
* check whether a queue family of a physical device supports image presentation.
|
||||||
* and @ref glfwGetPhysicalDevicePresentationSupport to check whether a queue
|
|
||||||
* family of a physical device supports image presentation.
|
|
||||||
*
|
*
|
||||||
* @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE`
|
* @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE`
|
||||||
* otherwise.
|
* otherwise.
|
||||||
@@ -5865,9 +5713,8 @@ GLFWAPI int glfwVulkanSupported(void);
|
|||||||
* returned array, as it is an error to specify an extension more than once in
|
* returned array, as it is an error to specify an extension more than once in
|
||||||
* the `VkInstanceCreateInfo` struct.
|
* the `VkInstanceCreateInfo` struct.
|
||||||
*
|
*
|
||||||
* @remark @macos This function currently supports either the
|
* @remark @macos GLFW currently supports both the `VK_MVK_macos_surface` and
|
||||||
* `VK_MVK_macos_surface` extension from MoltenVK or `VK_EXT_metal_surface`
|
* the newer `VK_EXT_metal_surface` extensions.
|
||||||
* extension.
|
|
||||||
*
|
*
|
||||||
* @pointer_lifetime The returned array is allocated and freed by GLFW. You
|
* @pointer_lifetime The returned array is allocated and freed by GLFW. You
|
||||||
* should not free it yourself. It is guaranteed to be valid only until the
|
* should not free it yourself. It is guaranteed to be valid only until the
|
||||||
@@ -5950,7 +5797,7 @@ GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* p
|
|||||||
* 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` extension does 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.
|
||||||
*
|
*
|
||||||
* @thread_safety This function may be called from any thread. For
|
* @thread_safety This function may be called from any thread. For
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.4 - www.glfw.org
|
* GLFW 3.3 - 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
|
||||||
@@ -83,8 +83,8 @@ extern "C" {
|
|||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
|
#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||||
// example to allow applications to correctly declare a GL_ARB_debug_output
|
// example to allow applications to correctly declare a GL_KHR_debug callback)
|
||||||
// callback) but windows.h assumes no one will define APIENTRY before it does
|
// but windows.h assumes no one will define APIENTRY before it does
|
||||||
#if defined(GLFW_APIENTRY_DEFINED)
|
#if defined(GLFW_APIENTRY_DEFINED)
|
||||||
#undef APIENTRY
|
#undef APIENTRY
|
||||||
#undef GLFW_APIENTRY_DEFINED
|
#undef GLFW_APIENTRY_DEFINED
|
||||||
@@ -132,6 +132,8 @@ extern "C" {
|
|||||||
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
||||||
* occurred.
|
* occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -147,6 +149,8 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
|
|||||||
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -161,6 +165,16 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
|
|||||||
* @return The `HWND` of the specified window, or `NULL` if an
|
* @return The `HWND` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark The `HDC` associated with the window can be queried with the
|
||||||
|
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
||||||
|
* function.
|
||||||
|
* @code
|
||||||
|
* HDC dc = GetDC(glfwGetWin32Window(window));
|
||||||
|
* @endcode
|
||||||
|
* This DC is private and does not need to be released.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -177,6 +191,17 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
|||||||
* @return The `HGLRC` of the specified window, or `NULL` if an
|
* @return The `HGLRC` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark The `HDC` associated with the window can be queried with the
|
||||||
|
* [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
|
||||||
|
* function.
|
||||||
|
* @code
|
||||||
|
* HDC dc = GetDC(glfwGetWin32Window(window));
|
||||||
|
* @endcode
|
||||||
|
* This DC is private and does not need to be released.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -193,6 +218,8 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
|
|||||||
* @return The `CGDirectDisplayID` of the specified monitor, or
|
* @return The `CGDirectDisplayID` of the specified monitor, or
|
||||||
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -207,6 +234,8 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
|||||||
* @return The `NSWindow` of the specified window, or `nil` if an
|
* @return The `NSWindow` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -223,6 +252,9 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
|||||||
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -239,6 +271,8 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
|
|||||||
* @return The `Display` used by GLFW, or `NULL` if an
|
* @return The `Display` used by GLFW, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -253,6 +287,8 @@ GLFWAPI Display* glfwGetX11Display(void);
|
|||||||
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -267,6 +303,8 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
|
|||||||
* @return The `RROutput` of the specified monitor, or `None` if an
|
* @return The `RROutput` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -281,6 +319,8 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
|||||||
* @return The `Window` of the specified window, or `None` if an
|
* @return The `Window` of the specified window, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -347,6 +387,9 @@ GLFWAPI const char* glfwGetX11SelectionString(void);
|
|||||||
* @return The `GLXContext` of the specified window, or `NULL` if an
|
* @return The `GLXContext` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -361,6 +404,9 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
|||||||
* @return The `GLXWindow` of the specified window, or `None` if an
|
* @return The `GLXWindow` of the specified window, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -377,6 +423,8 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
|||||||
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -391,6 +439,8 @@ GLFWAPI struct wl_display* glfwGetWaylandDisplay(void);
|
|||||||
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -405,6 +455,8 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
|||||||
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
||||||
* an [error](@ref error_handling) occurred.
|
* an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -421,6 +473,8 @@ GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
|||||||
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -435,6 +489,9 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
|
|||||||
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -449,6 +506,9 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
|||||||
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -472,6 +532,9 @@ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
|||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -493,6 +556,9 @@ GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height
|
|||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@@ -507,6 +573,9 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height
|
|||||||
* @return The `OSMesaContext` of the specified window, or `NULL` if an
|
* @return The `OSMesaContext` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
|
||||||
|
* GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
|
|||||||
+110
-165
@@ -1,113 +1,114 @@
|
|||||||
|
|
||||||
add_library(glfw "${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
set(common_HEADERS internal.h mappings.h
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h"
|
"${GLFW_BINARY_DIR}/src/glfw_config.h"
|
||||||
internal.h mappings.h context.c init.c input.c monitor.c
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
||||||
vulkan.c window.c)
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h")
|
||||||
|
set(common_SOURCES context.c init.c input.c monitor.c vulkan.c window.c)
|
||||||
|
|
||||||
|
add_custom_target(update_mappings
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -P "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake" mappings.h.in mappings.h
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
COMMENT "Updating gamepad mappings from upstream repository"
|
||||||
|
SOURCES mappings.h.in "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3")
|
||||||
|
|
||||||
if (_GLFW_COCOA)
|
if (_GLFW_COCOA)
|
||||||
target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h posix_thread.h
|
set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h cocoa_joystick.h
|
||||||
nsgl_context.h egl_context.h osmesa_context.h
|
posix_thread.h nsgl_context.h egl_context.h osmesa_context.h)
|
||||||
cocoa_init.m cocoa_joystick.m cocoa_monitor.m
|
set(glfw_SOURCES ${common_SOURCES} cocoa_init.m cocoa_joystick.m
|
||||||
cocoa_window.m cocoa_time.c posix_thread.c
|
cocoa_monitor.m cocoa_window.m cocoa_time.c posix_thread.c
|
||||||
nsgl_context.m egl_context.c osmesa_context.c)
|
nsgl_context.m egl_context.c osmesa_context.c)
|
||||||
elseif (_GLFW_WIN32)
|
elseif (_GLFW_WIN32)
|
||||||
target_sources(glfw PRIVATE win32_platform.h win32_joystick.h wgl_context.h
|
set(glfw_HEADERS ${common_HEADERS} win32_platform.h win32_joystick.h
|
||||||
egl_context.h osmesa_context.h win32_init.c
|
wgl_context.h egl_context.h osmesa_context.h)
|
||||||
win32_joystick.c win32_monitor.c win32_time.c
|
set(glfw_SOURCES ${common_SOURCES} win32_init.c win32_joystick.c
|
||||||
win32_thread.c win32_window.c wgl_context.c
|
win32_monitor.c win32_time.c win32_thread.c win32_window.c
|
||||||
egl_context.c osmesa_context.c)
|
wgl_context.c egl_context.c osmesa_context.c)
|
||||||
elseif (_GLFW_X11)
|
elseif (_GLFW_X11)
|
||||||
target_sources(glfw PRIVATE x11_platform.h xkb_unicode.h posix_time.h
|
set(glfw_HEADERS ${common_HEADERS} x11_platform.h xkb_unicode.h posix_time.h
|
||||||
posix_thread.h glx_context.h egl_context.h
|
posix_thread.h glx_context.h egl_context.h osmesa_context.h)
|
||||||
osmesa_context.h x11_init.c x11_monitor.c
|
set(glfw_SOURCES ${common_SOURCES} x11_init.c x11_monitor.c x11_window.c
|
||||||
x11_window.c xkb_unicode.c posix_time.c
|
xkb_unicode.c posix_time.c posix_thread.c glx_context.c
|
||||||
posix_thread.c glx_context.c egl_context.c
|
egl_context.c osmesa_context.c)
|
||||||
osmesa_context.c)
|
|
||||||
elseif (_GLFW_WAYLAND)
|
elseif (_GLFW_WAYLAND)
|
||||||
target_sources(glfw PRIVATE wl_platform.h posix_time.h posix_thread.h
|
set(glfw_HEADERS ${common_HEADERS} wl_platform.h
|
||||||
xkb_unicode.h egl_context.h osmesa_context.h
|
posix_time.h posix_thread.h xkb_unicode.h egl_context.h
|
||||||
wl_init.c wl_monitor.c wl_window.c posix_time.c
|
osmesa_context.h)
|
||||||
posix_thread.c xkb_unicode.c egl_context.c
|
set(glfw_SOURCES ${common_SOURCES} wl_init.c wl_monitor.c wl_window.c
|
||||||
osmesa_context.c)
|
posix_time.c posix_thread.c xkb_unicode.c
|
||||||
|
egl_context.c osmesa_context.c)
|
||||||
|
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/stable/xdg-shell/xdg-shell.xml"
|
||||||
|
BASENAME xdg-shell)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml"
|
||||||
|
BASENAME xdg-decoration)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/stable/viewporter/viewporter.xml"
|
||||||
|
BASENAME viewporter)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml"
|
||||||
|
BASENAME relative-pointer-unstable-v1)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml"
|
||||||
|
BASENAME pointer-constraints-unstable-v1)
|
||||||
|
ecm_add_wayland_client_protocol(glfw_SOURCES
|
||||||
|
PROTOCOL
|
||||||
|
"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml"
|
||||||
|
BASENAME idle-inhibit-unstable-v1)
|
||||||
elseif (_GLFW_OSMESA)
|
elseif (_GLFW_OSMESA)
|
||||||
target_sources(glfw PRIVATE null_platform.h null_joystick.h posix_time.h
|
set(glfw_HEADERS ${common_HEADERS} null_platform.h null_joystick.h
|
||||||
posix_thread.h osmesa_context.h null_init.c
|
posix_time.h posix_thread.h osmesa_context.h)
|
||||||
null_monitor.c null_window.c null_joystick.c
|
set(glfw_SOURCES ${common_SOURCES} null_init.c null_monitor.c null_window.c
|
||||||
posix_time.c posix_thread.c osmesa_context.c)
|
null_joystick.c posix_time.c posix_thread.c osmesa_context.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (_GLFW_X11 OR _GLFW_WAYLAND)
|
if (_GLFW_X11 OR _GLFW_WAYLAND)
|
||||||
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
target_sources(glfw PRIVATE linux_joystick.h linux_joystick.c)
|
set(glfw_HEADERS ${glfw_HEADERS} linux_joystick.h)
|
||||||
|
set(glfw_SOURCES ${glfw_SOURCES} linux_joystick.c)
|
||||||
else()
|
else()
|
||||||
target_sources(glfw PRIVATE null_joystick.h null_joystick.c)
|
set(glfw_HEADERS ${glfw_HEADERS} null_joystick.h)
|
||||||
|
set(glfw_SOURCES ${glfw_SOURCES} null_joystick.c)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (_GLFW_WAYLAND)
|
# Workaround for CMake not knowing about .m files before version 3.16
|
||||||
find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
|
if (CMAKE_VERSION VERSION_LESS "3.16" AND APPLE)
|
||||||
pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.15)
|
set_source_files_properties(cocoa_init.m cocoa_joystick.m cocoa_monitor.m
|
||||||
pkg_get_variable(WAYLAND_PROTOCOLS_BASE wayland-protocols pkgdatadir)
|
cocoa_window.m nsgl_context.m PROPERTIES
|
||||||
|
LANGUAGE C)
|
||||||
macro(wayland_generate protocol_file output_file)
|
|
||||||
add_custom_command(OUTPUT ${output_file}.h
|
|
||||||
COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header
|
|
||||||
< ${protocol_file} > ${output_file}.h
|
|
||||||
DEPENDS ${protocol_file})
|
|
||||||
list(APPEND GLFW_WAYLAND_PROTOCOL_SOURCES ${output_file}.h)
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${output_file}.c
|
|
||||||
COMMAND ${WAYLAND_SCANNER_EXECUTABLE} private-code
|
|
||||||
< ${protocol_file} > ${output_file}.c
|
|
||||||
DEPENDS ${protocol_file})
|
|
||||||
list(APPEND GLFW_WAYLAND_PROTOCOL_SOURCES ${output_file}.c)
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
set(GLFW_WAYLAND_PROTOCOL_SOURCES)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/stable/xdg-shell/xdg-shell.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-xdg-shell-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-xdg-decoration-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/stable/viewporter/viewporter.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-viewporter-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/unstable/relative-pointer/relative-pointer-unstable-v1.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-relative-pointer-unstable-v1-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-pointer-constraints-unstable-v1-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/unstable/tablet/tablet-unstable-v2.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-tablet-unstable-v2-client-protocol)
|
|
||||||
wayland_generate(
|
|
||||||
${WAYLAND_PROTOCOLS_BASE}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml
|
|
||||||
${CMAKE_BINARY_DIR}/src/wayland-idle-inhibit-unstable-v1-client-protocol)
|
|
||||||
|
|
||||||
target_sources(glfw PRIVATE ${GLFW_WAYLAND_PROTOCOL_SOURCES})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32 AND BUILD_SHARED_LIBS)
|
add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS})
|
||||||
configure_file(glfw.rc.in glfw.rc @ONLY)
|
|
||||||
target_sources(glfw PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/glfw.rc")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
configure_file(glfw_config.h.in glfw_config.h @ONLY)
|
|
||||||
target_compile_definitions(glfw PRIVATE _GLFW_USE_CONFIG_H)
|
|
||||||
target_sources(glfw PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/glfw_config.h")
|
|
||||||
|
|
||||||
set_target_properties(glfw PROPERTIES
|
set_target_properties(glfw PROPERTIES
|
||||||
OUTPUT_NAME ${GLFW_LIB_NAME}
|
OUTPUT_NAME ${GLFW_LIB_NAME}
|
||||||
VERSION ${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}
|
VERSION ${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}
|
||||||
SOVERSION ${GLFW_VERSION_MAJOR}
|
SOVERSION ${GLFW_VERSION_MAJOR}
|
||||||
POSITION_INDEPENDENT_CODE ON
|
POSITION_INDEPENDENT_CODE ON
|
||||||
C_STANDARD 99
|
|
||||||
C_EXTENSIONS OFF
|
|
||||||
DEFINE_SYMBOL _GLFW_BUILD_DLL
|
|
||||||
FOLDER "GLFW3")
|
FOLDER "GLFW3")
|
||||||
|
|
||||||
|
if (CMAKE_VERSION VERSION_EQUAL "3.1.0" OR
|
||||||
|
CMAKE_VERSION VERSION_GREATER "3.1.0")
|
||||||
|
|
||||||
|
set_target_properties(glfw PROPERTIES C_STANDARD 99)
|
||||||
|
else()
|
||||||
|
# Remove this fallback when removing support for CMake version less than 3.1
|
||||||
|
target_compile_options(glfw PRIVATE
|
||||||
|
"$<$<C_COMPILER_ID:AppleClang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:Clang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:GNU>:-std=c99>")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_USE_CONFIG_H)
|
||||||
target_include_directories(glfw PUBLIC
|
target_include_directories(glfw PUBLIC
|
||||||
"$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>"
|
"$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>"
|
||||||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
@@ -115,34 +116,32 @@ target_include_directories(glfw PRIVATE
|
|||||||
"${GLFW_SOURCE_DIR}/src"
|
"${GLFW_SOURCE_DIR}/src"
|
||||||
"${GLFW_BINARY_DIR}/src"
|
"${GLFW_BINARY_DIR}/src"
|
||||||
${glfw_INCLUDE_DIRS})
|
${glfw_INCLUDE_DIRS})
|
||||||
target_link_libraries(glfw PRIVATE Threads::Threads ${glfw_LIBRARIES})
|
target_link_libraries(glfw PRIVATE ${glfw_LIBRARIES})
|
||||||
|
|
||||||
# Workaround for CMake not knowing about .m files before version 3.16
|
# Make GCC warn about declarations that VS 2010 and 2012 won't accept for all
|
||||||
if (APPLE)
|
# source files that VS will build (Clang ignores this because we set -std=c99)
|
||||||
set_source_files_properties(cocoa_init.m cocoa_joystick.m cocoa_monitor.m
|
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
cocoa_window.m nsgl_context.m PROPERTIES
|
|
||||||
LANGUAGE C)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR
|
|
||||||
"${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR
|
|
||||||
"${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang")
|
|
||||||
|
|
||||||
# Make GCC and Clang warn about declarations that VS 2010 and 2012 won't
|
|
||||||
# accept for all source files that VS will build
|
|
||||||
set_source_files_properties(context.c init.c input.c monitor.c vulkan.c
|
set_source_files_properties(context.c init.c input.c monitor.c vulkan.c
|
||||||
window.c win32_init.c win32_joystick.c
|
window.c win32_init.c win32_joystick.c
|
||||||
win32_monitor.c win32_time.c win32_thread.c
|
win32_monitor.c win32_time.c win32_thread.c
|
||||||
win32_window.c wgl_context.c egl_context.c
|
win32_window.c wgl_context.c egl_context.c
|
||||||
osmesa_context.c PROPERTIES
|
osmesa_context.c PROPERTIES
|
||||||
COMPILE_FLAGS -Wdeclaration-after-statement)
|
COMPILE_FLAGS -Wdeclaration-after-statement)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Enable a reasonable set of warnings
|
||||||
|
# NOTE: The order matters here, Clang-CL matches both MSVC and Clang
|
||||||
|
if (MSVC)
|
||||||
|
target_compile_options(glfw PRIVATE "/W3")
|
||||||
|
elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR
|
||||||
|
CMAKE_C_COMPILER_ID STREQUAL "Clang" OR
|
||||||
|
CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
|
||||||
|
|
||||||
# Enable a reasonable set of warnings (no, -Wextra is not reasonable)
|
|
||||||
target_compile_options(glfw PRIVATE "-Wall")
|
target_compile_options(glfw PRIVATE "-Wall")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (_GLFW_WIN32)
|
||||||
target_compile_definitions(glfw PRIVATE _UNICODE)
|
target_compile_definitions(glfw PRIVATE UNICODE _UNICODE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
||||||
@@ -150,36 +149,7 @@ endif()
|
|||||||
# win32_platform.h. We define them here until a saner solution can be found
|
# win32_platform.h. We define them here until a saner solution can be found
|
||||||
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
target_compile_definitions(glfw PRIVATE UNICODE WINVER=0x0501)
|
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 VS deprecating parts of the standard library
|
|
||||||
if (MSVC)
|
|
||||||
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Workaround for VS 2008 not shipping with stdint.h
|
|
||||||
if (MSVC90)
|
|
||||||
target_include_directories(glfw PUBLIC "${GLFW_SOURCE_DIR}/deps/vs2008")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for the DirectX 9 SDK as it is not included with VS 2008
|
|
||||||
if (MSVC90)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
check_include_file(dinput.h DINPUT_H_FOUND)
|
|
||||||
if (NOT DINPUT_H_FOUND)
|
|
||||||
message(FATAL_ERROR "DirectX 9 headers not found; install DirectX 9 SDK")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS)
|
if (BUILD_SHARED_LIBS)
|
||||||
@@ -201,37 +171,8 @@ if (BUILD_SHARED_LIBS)
|
|||||||
|
|
||||||
target_compile_definitions(glfw INTERFACE GLFW_DLL)
|
target_compile_definitions(glfw INTERFACE GLFW_DLL)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set_target_properties(glfw PROPERTIES
|
# Add -fno-common to work around a bug in Apple's GCC
|
||||||
INSTALL_NAME_DIR "${CMAKE_INSTALL_LIBDIR}")
|
target_compile_options(glfw PRIVATE "-fno-common")
|
||||||
endif()
|
|
||||||
|
|
||||||
if (MINGW)
|
|
||||||
# Enable link-time exploit mitigation features enabled by default on MSVC
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
|
|
||||||
# Compatibility with data execution prevention (DEP)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
|
||||||
if (_GLFW_HAS_DEP)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--nxcompat")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
|
||||||
if (_GLFW_HAS_ASLR)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--dynamicbase")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with 64-bit address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
|
||||||
if (_GLFW_HAS_64ASLR)
|
|
||||||
target_link_libraries(glfw PRIVATE "-Wl,--high-entropy-va")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Clear flags again to avoid breaking later tests
|
|
||||||
set(CMAKE_REQUIRED_FLAGS)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
@@ -240,10 +181,14 @@ if (BUILD_SHARED_LIBS)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
|
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
install(TARGETS glfw
|
install(TARGETS glfw
|
||||||
EXPORT glfwTargets
|
EXPORT glfwTargets
|
||||||
RUNTIME DESTINATION "bin"
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
+12
-8
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -428,9 +428,6 @@ static GLFWbool initializeTIS(void)
|
|||||||
{
|
{
|
||||||
if (_glfw.hints.init.ns.menubar)
|
if (_glfw.hints.init.ns.menubar)
|
||||||
{
|
{
|
||||||
// In case we are unbundled, make us a proper UI application
|
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
|
||||||
|
|
||||||
// Menu bar setup must go between sharedApplication and finishLaunching
|
// Menu bar setup must go between sharedApplication and finishLaunching
|
||||||
// in order to properly emulate the behavior of NSApplicationMain
|
// in order to properly emulate the behavior of NSApplicationMain
|
||||||
|
|
||||||
@@ -447,7 +444,13 @@ static GLFWbool initializeTIS(void)
|
|||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
|
_glfw.ns.finishedLaunching = GLFW_TRUE;
|
||||||
_glfwPlatformPostEmptyEvent();
|
_glfwPlatformPostEmptyEvent();
|
||||||
|
|
||||||
|
// In case we are unbundled, make us a proper UI application
|
||||||
|
if (_glfw.hints.init.ns.menubar)
|
||||||
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||||
|
|
||||||
[NSApp stop:nil];
|
[NSApp stop:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -502,6 +505,9 @@ int _glfwPlatformInit(void)
|
|||||||
toTarget:_glfw.ns.helper
|
toTarget:_glfw.ns.helper
|
||||||
withObject:nil];
|
withObject:nil];
|
||||||
|
|
||||||
|
if (NSApp)
|
||||||
|
_glfw.ns.finishedLaunching = GLFW_TRUE;
|
||||||
|
|
||||||
[NSApplication sharedApplication];
|
[NSApplication sharedApplication];
|
||||||
|
|
||||||
_glfw.ns.delegate = [[GLFWApplicationDelegate alloc] init];
|
_glfw.ns.delegate = [[GLFWApplicationDelegate alloc] init];
|
||||||
@@ -551,12 +557,9 @@ int _glfwPlatformInit(void)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
_glfwInitTimerNS();
|
_glfwInitTimerNS();
|
||||||
|
_glfwInitJoysticksNS();
|
||||||
|
|
||||||
_glfwPollMonitorsNS();
|
_glfwPollMonitorsNS();
|
||||||
|
|
||||||
if (![[NSRunningApplication currentApplication] isFinishedLaunching])
|
|
||||||
[NSApp run];
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
@@ -604,6 +607,7 @@ void _glfwPlatformTerminate(void)
|
|||||||
free(_glfw.ns.clipboardString);
|
free(_glfw.ns.clipboardString);
|
||||||
|
|
||||||
_glfwTerminateNSGL();
|
_glfwTerminateNSGL();
|
||||||
|
_glfwTerminateJoysticksNS();
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.3 Cocoa - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE struct { int dummyJoystick; }
|
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE struct { int dummyJoystick; }
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_MAPPING_NAME "Mac OS X"
|
#define _GLFW_PLATFORM_MAPPING_NAME "Mac OS X"
|
||||||
|
#define GLFW_BUILD_COCOA_MAPPINGS
|
||||||
|
|
||||||
// Cocoa-specific per-joystick data
|
// Cocoa-specific per-joystick data
|
||||||
//
|
//
|
||||||
@@ -44,3 +45,7 @@ typedef struct _GLFWjoystickNS
|
|||||||
CFMutableArrayRef hats;
|
CFMutableArrayRef hats;
|
||||||
} _GLFWjoystickNS;
|
} _GLFWjoystickNS;
|
||||||
|
|
||||||
|
|
||||||
|
void _glfwInitJoysticksNS(void);
|
||||||
|
void _glfwTerminateJoysticksNS(void);
|
||||||
|
|
||||||
|
|||||||
+13
-9
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Cocoa - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -304,10 +304,12 @@ static void removeCallback(void* context,
|
|||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
GLFWbool _glfwPlatformInitJoysticks(void)
|
// Initialize joystick interface
|
||||||
|
//
|
||||||
|
void _glfwInitJoysticksNS(void)
|
||||||
{
|
{
|
||||||
CFMutableArrayRef matching;
|
CFMutableArrayRef matching;
|
||||||
const long usages[] =
|
const long usages[] =
|
||||||
@@ -326,7 +328,7 @@ GLFWbool _glfwPlatformInitJoysticks(void)
|
|||||||
if (!matching)
|
if (!matching)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to create array");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to create array");
|
||||||
return GLFW_FALSE;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(usages) / sizeof(long); i++)
|
for (size_t i = 0; i < sizeof(usages) / sizeof(long); i++)
|
||||||
@@ -381,24 +383,26 @@ GLFWbool _glfwPlatformInitJoysticks(void)
|
|||||||
// Execute the run loop once in order to register any initially-attached
|
// Execute the run loop once in order to register any initially-attached
|
||||||
// joysticks
|
// joysticks
|
||||||
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);
|
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformTerminateJoysticks(void)
|
// Close all opened joystick handles
|
||||||
|
//
|
||||||
|
void _glfwTerminateJoysticksNS(void)
|
||||||
{
|
{
|
||||||
int jid;
|
int jid;
|
||||||
|
|
||||||
for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
||||||
closeJoystick(_glfw.joysticks + jid);
|
closeJoystick(_glfw.joysticks + jid);
|
||||||
|
|
||||||
if (_glfw.ns.hidManager)
|
|
||||||
{
|
|
||||||
CFRelease(_glfw.ns.hidManager);
|
CFRelease(_glfw.ns.hidManager);
|
||||||
_glfw.ns.hidManager = NULL;
|
_glfw.ns.hidManager = NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
////// GLFW platform API //////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
||||||
{
|
{
|
||||||
if (mode & _GLFW_POLL_AXES)
|
if (mode & _GLFW_POLL_AXES)
|
||||||
|
|||||||
+54
-41
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - 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>
|
||||||
@@ -39,18 +39,31 @@
|
|||||||
|
|
||||||
// Get the name of the specified display, or NULL
|
// Get the name of the specified display, or NULL
|
||||||
//
|
//
|
||||||
static char* getDisplayName(CGDirectDisplayID displayID)
|
static char* getMonitorName(CGDirectDisplayID displayID, NSScreen* screen)
|
||||||
{
|
{
|
||||||
|
// IOKit doesn't work on Apple Silicon anymore
|
||||||
|
// Luckily, 10.15 introduced -[NSScreen localizedName].
|
||||||
|
// Use it if available, and fall back to IOKit otherwise.
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
if ([screen respondsToSelector:@selector(localizedName)])
|
||||||
|
{
|
||||||
|
NSString* name = [screen valueForKey:@"localizedName"];
|
||||||
|
if (name)
|
||||||
|
return _glfw_strdup([name UTF8String]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
io_iterator_t it;
|
io_iterator_t it;
|
||||||
io_service_t service;
|
io_service_t service;
|
||||||
CFDictionaryRef info;
|
CFDictionaryRef info;
|
||||||
|
|
||||||
if (IOServiceGetMatchingServices(kIOMasterPortDefault,
|
if (IOServiceGetMatchingServices(MACH_PORT_NULL,
|
||||||
IOServiceMatching("IODisplayConnect"),
|
IOServiceMatching("IODisplayConnect"),
|
||||||
&it) != 0)
|
&it) != 0)
|
||||||
{
|
{
|
||||||
// This may happen if a desktop Mac is running headless
|
// This may happen if a desktop Mac is running headless
|
||||||
return NULL;
|
return _glfw_strdup("Display");
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((service = IOIteratorNext(it)) != 0)
|
while ((service = IOIteratorNext(it)) != 0)
|
||||||
@@ -88,7 +101,7 @@ static char* getDisplayName(CGDirectDisplayID displayID)
|
|||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Cocoa: Failed to find service port for display");
|
"Cocoa: Failed to find service port for display");
|
||||||
return NULL;
|
return _glfw_strdup("Display");
|
||||||
}
|
}
|
||||||
|
|
||||||
CFDictionaryRef names =
|
CFDictionaryRef names =
|
||||||
@@ -101,7 +114,7 @@ static char* getDisplayName(CGDirectDisplayID displayID)
|
|||||||
{
|
{
|
||||||
// This may happen if a desktop Mac is running headless
|
// This may happen if a desktop Mac is running headless
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
return NULL;
|
return _glfw_strdup("Display");
|
||||||
}
|
}
|
||||||
|
|
||||||
const CFIndex size =
|
const CFIndex size =
|
||||||
@@ -209,31 +222,6 @@ static void endFadeReservation(CGDisplayFadeReservationToken token)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finds and caches the NSScreen corresponding to the specified monitor
|
|
||||||
//
|
|
||||||
static GLFWbool refreshMonitorScreen(_GLFWmonitor* monitor)
|
|
||||||
{
|
|
||||||
if (monitor->ns.screen)
|
|
||||||
return GLFW_TRUE;
|
|
||||||
|
|
||||||
for (NSScreen* screen in [NSScreen screens])
|
|
||||||
{
|
|
||||||
NSNumber* displayID = [screen deviceDescription][@"NSScreenNumber"];
|
|
||||||
|
|
||||||
// HACK: Compare unit numbers instead of display IDs to work around
|
|
||||||
// display replacement on machines with automatic graphics
|
|
||||||
// switching
|
|
||||||
if (monitor->ns.unitNumber == CGDisplayUnitNumber([displayID unsignedIntValue]))
|
|
||||||
{
|
|
||||||
monitor->ns.screen = screen;
|
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to find a screen for monitor");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the display refresh rate queried from the I/O registry
|
// Returns the display refresh rate queried from the I/O registry
|
||||||
//
|
//
|
||||||
static double getFallbackRefreshRate(CGDirectDisplayID displayID)
|
static double getFallbackRefreshRate(CGDirectDisplayID displayID)
|
||||||
@@ -243,7 +231,7 @@ static double getFallbackRefreshRate(CGDirectDisplayID displayID)
|
|||||||
io_iterator_t it;
|
io_iterator_t it;
|
||||||
io_service_t service;
|
io_service_t service;
|
||||||
|
|
||||||
if (IOServiceGetMatchingServices(kIOMasterPortDefault,
|
if (IOServiceGetMatchingServices(MACH_PORT_NULL,
|
||||||
IOServiceMatching("IOFramebuffer"),
|
IOServiceMatching("IOFramebuffer"),
|
||||||
&it) != 0)
|
&it) != 0)
|
||||||
{
|
{
|
||||||
@@ -334,27 +322,46 @@ void _glfwPollMonitorsNS(void)
|
|||||||
if (CGDisplayIsAsleep(displays[i]))
|
if (CGDisplayIsAsleep(displays[i]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
const uint32_t unitNumber = CGDisplayUnitNumber(displays[i]);
|
||||||
|
NSScreen* screen = nil;
|
||||||
|
|
||||||
|
for (screen in [NSScreen screens])
|
||||||
|
{
|
||||||
|
NSNumber* screenNumber = [screen deviceDescription][@"NSScreenNumber"];
|
||||||
|
|
||||||
// HACK: Compare unit numbers instead of display IDs to work around
|
// HACK: Compare unit numbers instead of display IDs to work around
|
||||||
// display replacement on machines with automatic graphics
|
// display replacement on machines with automatic graphics
|
||||||
// switching
|
// switching
|
||||||
const uint32_t unitNumber = CGDisplayUnitNumber(displays[i]);
|
if (CGDisplayUnitNumber([screenNumber unsignedIntValue]) == unitNumber)
|
||||||
for (uint32_t j = 0; j < disconnectedCount; j++)
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HACK: Compare unit numbers instead of display IDs to work around
|
||||||
|
// display replacement on machines with automatic graphics
|
||||||
|
// switching
|
||||||
|
uint32_t j;
|
||||||
|
for (j = 0; j < disconnectedCount; j++)
|
||||||
{
|
{
|
||||||
if (disconnected[j] && disconnected[j]->ns.unitNumber == unitNumber)
|
if (disconnected[j] && disconnected[j]->ns.unitNumber == unitNumber)
|
||||||
{
|
{
|
||||||
|
disconnected[j]->ns.screen = screen;
|
||||||
disconnected[j] = NULL;
|
disconnected[j] = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (j < disconnectedCount)
|
||||||
|
continue;
|
||||||
|
|
||||||
const CGSize size = CGDisplayScreenSize(displays[i]);
|
const CGSize size = CGDisplayScreenSize(displays[i]);
|
||||||
char* name = getDisplayName(displays[i]);
|
char* name = getMonitorName(displays[i], screen);
|
||||||
if (!name)
|
if (!name)
|
||||||
name = _glfw_strdup("Unknown");
|
continue;
|
||||||
|
|
||||||
_GLFWmonitor* monitor = _glfwAllocMonitor(name, size.width, size.height);
|
_GLFWmonitor* monitor = _glfwAllocMonitor(name, size.width, size.height);
|
||||||
monitor->ns.displayID = displays[i];
|
monitor->ns.displayID = displays[i];
|
||||||
monitor->ns.unitNumber = unitNumber;
|
monitor->ns.unitNumber = unitNumber;
|
||||||
|
monitor->ns.screen = screen;
|
||||||
|
|
||||||
free(name);
|
free(name);
|
||||||
|
|
||||||
@@ -463,8 +470,11 @@ void _glfwPlatformGetMonitorContentScale(_GLFWmonitor* monitor,
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
if (!refreshMonitorScreen(monitor))
|
if (!monitor->ns.screen)
|
||||||
return;
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Cocoa: Cannot query content scale without screen");
|
||||||
|
}
|
||||||
|
|
||||||
const NSRect points = [monitor->ns.screen frame];
|
const NSRect points = [monitor->ns.screen frame];
|
||||||
const NSRect pixels = [monitor->ns.screen convertRectToBacking:points];
|
const NSRect pixels = [monitor->ns.screen convertRectToBacking:points];
|
||||||
@@ -483,8 +493,11 @@ void _glfwPlatformGetMonitorWorkarea(_GLFWmonitor* monitor,
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
if (!refreshMonitorScreen(monitor))
|
if (!monitor->ns.screen)
|
||||||
return;
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Cocoa: Cannot query workarea without screen");
|
||||||
|
}
|
||||||
|
|
||||||
const NSRect frameRect = [monitor->ns.screen visibleFrame];
|
const NSRect frameRect = [monitor->ns.screen visibleFrame];
|
||||||
|
|
||||||
@@ -527,7 +540,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Skip duplicate modes
|
// Skip duplicate modes
|
||||||
if (i < *count)
|
if (j < *count)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
(*count)++;
|
(*count)++;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -31,7 +31,9 @@
|
|||||||
|
|
||||||
// NOTE: All of NSGL was deprecated in the 10.14 SDK
|
// NOTE: All of NSGL was deprecated in the 10.14 SDK
|
||||||
// This disables the pointless warnings for every symbol we use
|
// This disables the pointless warnings for every symbol we use
|
||||||
|
#ifndef GL_SILENCE_DEPRECATION
|
||||||
#define GL_SILENCE_DEPRECATION
|
#define GL_SILENCE_DEPRECATION
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__OBJC__)
|
#if defined(__OBJC__)
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
@@ -85,11 +87,16 @@ typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMeta
|
|||||||
#include "posix_thread.h"
|
#include "posix_thread.h"
|
||||||
#include "cocoa_joystick.h"
|
#include "cocoa_joystick.h"
|
||||||
#include "nsgl_context.h"
|
#include "nsgl_context.h"
|
||||||
|
#include "egl_context.h"
|
||||||
|
#include "osmesa_context.h"
|
||||||
|
|
||||||
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
||||||
#define _glfw_dlclose(handle) dlclose(handle)
|
#define _glfw_dlclose(handle) dlclose(handle)
|
||||||
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
||||||
|
|
||||||
|
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->ns.layer)
|
||||||
|
#define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS ns
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS ns
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns
|
||||||
#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerNS ns
|
#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerNS ns
|
||||||
@@ -128,7 +135,6 @@ typedef struct _GLFWwindowNS
|
|||||||
// since the last cursor motion event was processed
|
// since the last cursor motion event was processed
|
||||||
// This is kept to counteract Cocoa doing the same internally
|
// This is kept to counteract Cocoa doing the same internally
|
||||||
double cursorWarpDeltaX, cursorWarpDeltaY;
|
double cursorWarpDeltaX, cursorWarpDeltaY;
|
||||||
|
|
||||||
} _GLFWwindowNS;
|
} _GLFWwindowNS;
|
||||||
|
|
||||||
// Cocoa-specific global data
|
// Cocoa-specific global data
|
||||||
@@ -137,6 +143,7 @@ typedef struct _GLFWlibraryNS
|
|||||||
{
|
{
|
||||||
CGEventSourceRef eventSource;
|
CGEventSourceRef eventSource;
|
||||||
id delegate;
|
id delegate;
|
||||||
|
GLFWbool finishedLaunching;
|
||||||
GLFWbool cursorHidden;
|
GLFWbool cursorHidden;
|
||||||
TISInputSourceRef inputSource;
|
TISInputSourceRef inputSource;
|
||||||
IOHIDManagerRef hidManager;
|
IOHIDManagerRef hidManager;
|
||||||
@@ -162,7 +169,6 @@ typedef struct _GLFWlibraryNS
|
|||||||
PFN_LMGetKbdType GetKbdType;
|
PFN_LMGetKbdType GetKbdType;
|
||||||
CFStringRef kPropertyUnicodeKeyLayoutData;
|
CFStringRef kPropertyUnicodeKeyLayoutData;
|
||||||
} tis;
|
} tis;
|
||||||
|
|
||||||
} _GLFWlibraryNS;
|
} _GLFWlibraryNS;
|
||||||
|
|
||||||
// Cocoa-specific per-monitor data
|
// Cocoa-specific per-monitor data
|
||||||
@@ -174,7 +180,6 @@ typedef struct _GLFWmonitorNS
|
|||||||
uint32_t unitNumber;
|
uint32_t unitNumber;
|
||||||
id screen;
|
id screen;
|
||||||
double fallbackRefreshRate;
|
double fallbackRefreshRate;
|
||||||
|
|
||||||
} _GLFWmonitorNS;
|
} _GLFWmonitorNS;
|
||||||
|
|
||||||
// Cocoa-specific per-cursor data
|
// Cocoa-specific per-cursor data
|
||||||
@@ -182,7 +187,6 @@ typedef struct _GLFWmonitorNS
|
|||||||
typedef struct _GLFWcursorNS
|
typedef struct _GLFWcursorNS
|
||||||
{
|
{
|
||||||
id object;
|
id object;
|
||||||
|
|
||||||
} _GLFWcursorNS;
|
} _GLFWcursorNS;
|
||||||
|
|
||||||
// Cocoa-specific global timer data
|
// Cocoa-specific global timer data
|
||||||
@@ -190,7 +194,6 @@ typedef struct _GLFWcursorNS
|
|||||||
typedef struct _GLFWtimerNS
|
typedef struct _GLFWtimerNS
|
||||||
{
|
{
|
||||||
uint64_t frequency;
|
uint64_t frequency;
|
||||||
|
|
||||||
} _GLFWtimerNS;
|
} _GLFWtimerNS;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+45
-102
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -114,10 +114,11 @@ static void updateCursorMode(_GLFWwindow* window)
|
|||||||
else if (_glfw.ns.disabledCursorWindow == window)
|
else if (_glfw.ns.disabledCursorWindow == window)
|
||||||
{
|
{
|
||||||
_glfw.ns.disabledCursorWindow = NULL;
|
_glfw.ns.disabledCursorWindow = NULL;
|
||||||
CGAssociateMouseAndMouseCursorPosition(true);
|
|
||||||
_glfwPlatformSetCursorPos(window,
|
_glfwPlatformSetCursorPos(window,
|
||||||
_glfw.ns.restoreCursorPosX,
|
_glfw.ns.restoreCursorPosX,
|
||||||
_glfw.ns.restoreCursorPosY);
|
_glfw.ns.restoreCursorPosY);
|
||||||
|
// NOTE: The matching CGAssociateMouseAndMouseCursorPosition call is
|
||||||
|
// made in _glfwPlatformSetCursorPos as part of a workaround
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursorInContentArea(window))
|
if (cursorInContentArea(window))
|
||||||
@@ -243,7 +244,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
|
|
||||||
- (void)windowDidResize:(NSNotification *)notification
|
- (void)windowDidResize:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
if (window->context.client != GLFW_NO_API)
|
if (window->context.source == GLFW_NATIVE_CONTEXT_API)
|
||||||
[window->context.nsgl.object update];
|
[window->context.nsgl.object update];
|
||||||
|
|
||||||
if (_glfw.ns.disabledCursorWindow == window)
|
if (_glfw.ns.disabledCursorWindow == window)
|
||||||
@@ -278,7 +279,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
|
|
||||||
- (void)windowDidMove:(NSNotification *)notification
|
- (void)windowDidMove:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
if (window->context.client != GLFW_NO_API)
|
if (window->context.source == GLFW_NATIVE_CONTEXT_API)
|
||||||
[window->context.nsgl.object update];
|
[window->context.nsgl.object update];
|
||||||
|
|
||||||
if (_glfw.ns.disabledCursorWindow == window)
|
if (_glfw.ns.disabledCursorWindow == window)
|
||||||
@@ -397,7 +398,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
|
|
||||||
- (void)updateLayer
|
- (void)updateLayer
|
||||||
{
|
{
|
||||||
if (window->context.client != GLFW_NO_API)
|
if (window->context.source == GLFW_NATIVE_CONTEXT_API)
|
||||||
[window->context.nsgl.object update];
|
[window->context.nsgl.object update];
|
||||||
|
|
||||||
_glfwInputWindowDamage(window);
|
_glfwInputWindowDamage(window);
|
||||||
@@ -520,6 +521,18 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
{
|
{
|
||||||
const NSRect contentRect = [window->ns.view frame];
|
const NSRect contentRect = [window->ns.view frame];
|
||||||
const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect];
|
const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect];
|
||||||
|
const float xscale = fbRect.size.width / contentRect.size.width;
|
||||||
|
const float yscale = fbRect.size.height / contentRect.size.height;
|
||||||
|
|
||||||
|
if (xscale != window->ns.xscale || yscale != window->ns.yscale)
|
||||||
|
{
|
||||||
|
if (window->ns.retina && window->ns.layer)
|
||||||
|
[window->ns.layer setContentsScale:[window->ns.object backingScaleFactor]];
|
||||||
|
|
||||||
|
window->ns.xscale = xscale;
|
||||||
|
window->ns.yscale = yscale;
|
||||||
|
_glfwInputWindowContentScale(window, xscale, yscale);
|
||||||
|
}
|
||||||
|
|
||||||
if (fbRect.size.width != window->ns.fbWidth ||
|
if (fbRect.size.width != window->ns.fbWidth ||
|
||||||
fbRect.size.height != window->ns.fbHeight)
|
fbRect.size.height != window->ns.fbHeight)
|
||||||
@@ -528,19 +541,6 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
window->ns.fbHeight = fbRect.size.height;
|
window->ns.fbHeight = fbRect.size.height;
|
||||||
_glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);
|
_glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float xscale = fbRect.size.width / contentRect.size.width;
|
|
||||||
const float yscale = fbRect.size.height / contentRect.size.height;
|
|
||||||
|
|
||||||
if (xscale != window->ns.xscale || yscale != window->ns.yscale)
|
|
||||||
{
|
|
||||||
window->ns.xscale = xscale;
|
|
||||||
window->ns.yscale = yscale;
|
|
||||||
_glfwInputWindowContentScale(window, xscale, yscale);
|
|
||||||
|
|
||||||
if (window->ns.retina && window->ns.layer)
|
|
||||||
[window->ns.layer setContentsScale:[window->ns.object backingScaleFactor]];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)drawRect:(NSRect)rect
|
- (void)drawRect:(NSRect)rect
|
||||||
@@ -902,6 +902,9 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
|
if (!_glfw.ns.finishedLaunching)
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
if (!createNativeWindow(window, wndconfig, fbconfig))
|
if (!createNativeWindow(window, wndconfig, fbconfig))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
@@ -992,8 +995,7 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
|
|||||||
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
||||||
int count, const GLFWimage* images)
|
int count, const GLFWimage* images)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
// Regular windows do not have icons
|
||||||
"Cocoa: Regular windows do not have icons on macOS");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
||||||
@@ -1371,13 +1373,6 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled)
|
|
||||||
{
|
|
||||||
@autoreleasepool {
|
|
||||||
[window->ns.object setIgnoresMouseEvents:enabled];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
@@ -1394,8 +1389,6 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
|||||||
|
|
||||||
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
|
||||||
"Cocoa: Raw mouse motion not yet implemented");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWbool _glfwPlatformRawMouseMotionSupported(void)
|
GLFWbool _glfwPlatformRawMouseMotionSupported(void)
|
||||||
@@ -1407,6 +1400,9 @@ void _glfwPlatformPollEvents(void)
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
|
if (!_glfw.ns.finishedLaunching)
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny
|
NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny
|
||||||
@@ -1426,6 +1422,9 @@ void _glfwPlatformWaitEvents(void)
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
|
if (!_glfw.ns.finishedLaunching)
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
// I wanted to pass NO to dequeue:, and rely on PollEvents to
|
// I wanted to pass NO to dequeue:, and rely on PollEvents to
|
||||||
// dequeue and send. For reasons not at all clear to me, passing
|
// dequeue and send. For reasons not at all clear to me, passing
|
||||||
// NO to dequeue: causes this method never to return.
|
// NO to dequeue: causes this method never to return.
|
||||||
@@ -1444,6 +1443,9 @@ void _glfwPlatformWaitEventsTimeout(double timeout)
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
|
if (!_glfw.ns.finishedLaunching)
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:timeout];
|
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:timeout];
|
||||||
NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny
|
NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny
|
||||||
untilDate:date
|
untilDate:date
|
||||||
@@ -1461,6 +1463,9 @@ void _glfwPlatformPostEmptyEvent(void)
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
|
if (!_glfw.ns.finishedLaunching)
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
NSEvent* event = [NSEvent otherEventWithType:NSEventTypeApplicationDefined
|
NSEvent* event = [NSEvent otherEventWithType:NSEventTypeApplicationDefined
|
||||||
location:NSMakePoint(0, 0)
|
location:NSMakePoint(0, 0)
|
||||||
modifierFlags:0
|
modifierFlags:0
|
||||||
@@ -1519,6 +1524,11 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
|
|||||||
_glfwTransformYNS(globalPoint.y)));
|
_glfwTransformYNS(globalPoint.y)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HACK: Calling this right after setting the cursor position prevents macOS
|
||||||
|
// from freezing the cursor for a fraction of a second afterwards
|
||||||
|
if (window->cursorMode != GLFW_CURSOR_DISABLED)
|
||||||
|
CGAssociateMouseAndMouseCursorPosition(true);
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1537,7 +1547,7 @@ const char* _glfwPlatformGetScancodeName(int scancode)
|
|||||||
if (scancode < 0 || scancode > 0xff ||
|
if (scancode < 0 || scancode > 0xff ||
|
||||||
_glfw.ns.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
_glfw.ns.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode");
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode %i", scancode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1632,49 +1642,23 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
|||||||
{
|
{
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
|
||||||
SEL cursorSelector = NULL;
|
|
||||||
|
|
||||||
// HACK: Try to use a private message
|
|
||||||
if (shape == GLFW_RESIZE_EW_CURSOR)
|
|
||||||
cursorSelector = NSSelectorFromString(@"_windowResizeEastWestCursor");
|
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
|
||||||
cursorSelector = NSSelectorFromString(@"_windowResizeNorthSouthCursor");
|
|
||||||
else if (shape == GLFW_RESIZE_NWSE_CURSOR)
|
|
||||||
cursorSelector = NSSelectorFromString(@"_windowResizeNorthWestSouthEastCursor");
|
|
||||||
else if (shape == GLFW_RESIZE_NESW_CURSOR)
|
|
||||||
cursorSelector = NSSelectorFromString(@"_windowResizeNorthEastSouthWestCursor");
|
|
||||||
|
|
||||||
if (cursorSelector && [NSCursor respondsToSelector:cursorSelector])
|
|
||||||
{
|
|
||||||
id object = [NSCursor performSelector:cursorSelector];
|
|
||||||
if ([object isKindOfClass:[NSCursor class]])
|
|
||||||
cursor->ns.object = object;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cursor->ns.object)
|
|
||||||
{
|
|
||||||
if (shape == GLFW_ARROW_CURSOR)
|
if (shape == GLFW_ARROW_CURSOR)
|
||||||
cursor->ns.object = [NSCursor arrowCursor];
|
cursor->ns.object = [NSCursor arrowCursor];
|
||||||
else if (shape == GLFW_IBEAM_CURSOR)
|
else if (shape == GLFW_IBEAM_CURSOR)
|
||||||
cursor->ns.object = [NSCursor IBeamCursor];
|
cursor->ns.object = [NSCursor IBeamCursor];
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
||||||
cursor->ns.object = [NSCursor crosshairCursor];
|
cursor->ns.object = [NSCursor crosshairCursor];
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
else if (shape == GLFW_HAND_CURSOR)
|
||||||
cursor->ns.object = [NSCursor pointingHandCursor];
|
cursor->ns.object = [NSCursor pointingHandCursor];
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
else if (shape == GLFW_HRESIZE_CURSOR)
|
||||||
cursor->ns.object = [NSCursor resizeLeftRightCursor];
|
cursor->ns.object = [NSCursor resizeLeftRightCursor];
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
else if (shape == GLFW_VRESIZE_CURSOR)
|
||||||
cursor->ns.object = [NSCursor resizeUpDownCursor];
|
cursor->ns.object = [NSCursor resizeUpDownCursor];
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
cursor->ns.object = [NSCursor closedHandCursor];
|
|
||||||
else if (shape == GLFW_NOT_ALLOWED_CURSOR)
|
|
||||||
cursor->ns.object = [NSCursor operationNotAllowedCursor];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cursor->ns.object)
|
if (!cursor->ns.object)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_CURSOR_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Cocoa: Standard cursor shape unavailable");
|
"Cocoa: Failed to retrieve standard cursor");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1738,47 +1722,6 @@ const char* _glfwPlatformGetClipboardString(void)
|
|||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum _glfwPlatformGetEGLPlatform(EGLint** attribs)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle)
|
|
||||||
{
|
|
||||||
int type = 0;
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_opengl)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_OPENGL)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_metal)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_METAL)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type)
|
|
||||||
{
|
|
||||||
*attribs = calloc(3, sizeof(EGLint));
|
|
||||||
(*attribs)[0] = EGL_PLATFORM_ANGLE_TYPE_ANGLE;
|
|
||||||
(*attribs)[1] = type;
|
|
||||||
(*attribs)[2] = EGL_NONE;
|
|
||||||
return EGL_PLATFORM_ANGLE_ANGLE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeDisplayType _glfwPlatformGetEGLNativeDisplay(void)
|
|
||||||
{
|
|
||||||
return EGL_DEFAULT_DISPLAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeWindowType _glfwPlatformGetEGLNativeWindow(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
return window->ns.layer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
{
|
{
|
||||||
if (_glfw.vk.KHR_surface && _glfw.vk.EXT_metal_surface)
|
if (_glfw.vk.KHR_surface && _glfw.vk.EXT_metal_surface)
|
||||||
|
|||||||
+3
-7
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -196,12 +196,6 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desired->doublebuffer != current->doublebuffer)
|
|
||||||
{
|
|
||||||
// Double buffering is a hard constraint
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count number of missing buffers
|
// Count number of missing buffers
|
||||||
{
|
{
|
||||||
missing = 0;
|
missing = 0;
|
||||||
@@ -570,6 +564,8 @@ GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
|
|||||||
PFNGLCLEARPROC glClear = (PFNGLCLEARPROC)
|
PFNGLCLEARPROC glClear = (PFNGLCLEARPROC)
|
||||||
window->context.getProcAddress("glClear");
|
window->context.getProcAddress("glClear");
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
if (window->doublebuffer)
|
||||||
window->context.swapBuffers(window);
|
window->context.swapBuffers(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-65
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 EGL - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -173,7 +173,7 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
|||||||
u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);
|
u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);
|
||||||
|
|
||||||
u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);
|
u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);
|
||||||
u->doublebuffer = GLFW_TRUE;
|
u->doublebuffer = desired->doublebuffer;
|
||||||
|
|
||||||
u->handle = (uintptr_t) n;
|
u->handle = (uintptr_t) n;
|
||||||
usableCount++;
|
usableCount++;
|
||||||
@@ -303,8 +303,6 @@ static void destroyContextEGL(_GLFWwindow* window)
|
|||||||
GLFWbool _glfwInitEGL(void)
|
GLFWbool _glfwInitEGL(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
EGLint* attribs = NULL;
|
|
||||||
const char* extensions;
|
|
||||||
const char* sonames[] =
|
const char* sonames[] =
|
||||||
{
|
{
|
||||||
#if defined(_GLFW_EGL_LIBRARY)
|
#if defined(_GLFW_EGL_LIBRARY)
|
||||||
@@ -397,51 +395,7 @@ GLFWbool _glfwInitEGL(void)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
_glfw.egl.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY);
|
||||||
if (extensions && eglGetError() == EGL_SUCCESS)
|
|
||||||
_glfw.egl.EXT_client_extensions = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.egl.EXT_client_extensions)
|
|
||||||
{
|
|
||||||
_glfw.egl.EXT_platform_base =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_base", extensions);
|
|
||||||
_glfw.egl.EXT_platform_x11 =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_x11", extensions);
|
|
||||||
_glfw.egl.EXT_platform_wayland =
|
|
||||||
_glfwStringInExtensionString("EGL_EXT_platform_wayland", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_opengl =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_opengl", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_d3d =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_d3d", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_vulkan =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_vulkan", extensions);
|
|
||||||
_glfw.egl.ANGLE_platform_angle_metal =
|
|
||||||
_glfwStringInExtensionString("EGL_ANGLE_platform_angle_metal", extensions);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.EXT_platform_base)
|
|
||||||
{
|
|
||||||
_glfw.egl.GetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
|
|
||||||
eglGetProcAddress("eglGetPlatformDisplayEXT");
|
|
||||||
_glfw.egl.CreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
|
|
||||||
eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.egl.platform = _glfwPlatformGetEGLPlatform(&attribs);
|
|
||||||
if (_glfw.egl.platform)
|
|
||||||
{
|
|
||||||
_glfw.egl.display =
|
|
||||||
eglGetPlatformDisplayEXT(_glfw.egl.platform,
|
|
||||||
_glfwPlatformGetEGLNativeDisplay(),
|
|
||||||
attribs);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_glfw.egl.display = eglGetDisplay(_glfwPlatformGetEGLNativeDisplay());
|
|
||||||
|
|
||||||
free(attribs);
|
|
||||||
|
|
||||||
if (_glfw.egl.display == EGL_NO_DISPLAY)
|
if (_glfw.egl.display == EGL_NO_DISPLAY)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
@@ -509,7 +463,6 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
EGLint attribs[40];
|
EGLint attribs[40];
|
||||||
EGLConfig config;
|
EGLConfig config;
|
||||||
EGLContext share = NULL;
|
EGLContext share = NULL;
|
||||||
EGLNativeWindowType native;
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
if (!_glfw.egl.display)
|
if (!_glfw.egl.display)
|
||||||
@@ -643,22 +596,16 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
|
|||||||
setAttrib(EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR);
|
setAttrib(EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!fbconfig->doublebuffer)
|
||||||
|
setAttrib(EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER);
|
||||||
|
|
||||||
setAttrib(EGL_NONE, EGL_NONE);
|
setAttrib(EGL_NONE, EGL_NONE);
|
||||||
|
|
||||||
native = _glfwPlatformGetEGLNativeWindow(window);
|
|
||||||
// HACK: ANGLE does not implement eglCreatePlatformWindowSurfaceEXT
|
|
||||||
// despite reporting EGL_EXT_platform_base
|
|
||||||
if (_glfw.egl.platform && _glfw.egl.platform != EGL_PLATFORM_ANGLE_ANGLE)
|
|
||||||
{
|
|
||||||
window->context.egl.surface =
|
window->context.egl.surface =
|
||||||
eglCreatePlatformWindowSurfaceEXT(_glfw.egl.display, config, native, attribs);
|
eglCreateWindowSurface(_glfw.egl.display,
|
||||||
}
|
config,
|
||||||
else
|
_GLFW_EGL_NATIVE_WINDOW,
|
||||||
{
|
attribs);
|
||||||
window->context.egl.surface =
|
|
||||||
eglCreateWindowSurface(_glfw.egl.display, config, native, attribs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->context.egl.surface == EGL_NO_SURFACE)
|
if (window->context.egl.surface == EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
@@ -818,7 +765,7 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return EGL_NO_CONTEXT;
|
return EGL_NO_CONTEXT;
|
||||||
@@ -832,7 +779,7 @@ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_EGL_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return EGL_NO_SURFACE;
|
return EGL_NO_SURFACE;
|
||||||
|
|||||||
+24
-36
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 EGL - www.glfw.org
|
// GLFW 3.3 EGL - 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>
|
||||||
@@ -25,10 +25,26 @@
|
|||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#if defined(_GLFW_WIN32)
|
#if defined(_GLFW_USE_EGLPLATFORM_H)
|
||||||
|
#include <EGL/eglplatform.h>
|
||||||
|
#elif defined(_GLFW_WIN32)
|
||||||
#define EGLAPIENTRY __stdcall
|
#define EGLAPIENTRY __stdcall
|
||||||
#else
|
typedef HDC EGLNativeDisplayType;
|
||||||
|
typedef HWND EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_COCOA)
|
||||||
#define EGLAPIENTRY
|
#define EGLAPIENTRY
|
||||||
|
typedef void* EGLNativeDisplayType;
|
||||||
|
typedef id EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_X11)
|
||||||
|
#define EGLAPIENTRY
|
||||||
|
typedef Display* EGLNativeDisplayType;
|
||||||
|
typedef Window EGLNativeWindowType;
|
||||||
|
#elif defined(_GLFW_WAYLAND)
|
||||||
|
#define EGLAPIENTRY
|
||||||
|
typedef struct wl_display* EGLNativeDisplayType;
|
||||||
|
typedef struct wl_egl_window* EGLNativeWindowType;
|
||||||
|
#else
|
||||||
|
#error "No supported EGL platform selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EGL_SUCCESS 0x3000
|
#define EGL_SUCCESS 0x3000
|
||||||
@@ -64,6 +80,8 @@
|
|||||||
#define EGL_OPENGL_ES_API 0x30a0
|
#define EGL_OPENGL_ES_API 0x30a0
|
||||||
#define EGL_OPENGL_API 0x30a2
|
#define EGL_OPENGL_API 0x30a2
|
||||||
#define EGL_NONE 0x3038
|
#define EGL_NONE 0x3038
|
||||||
|
#define EGL_RENDER_BUFFER 0x3086
|
||||||
|
#define EGL_SINGLE_BUFFER 0x3085
|
||||||
#define EGL_EXTENSIONS 0x3055
|
#define EGL_EXTENSIONS 0x3055
|
||||||
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
||||||
#define EGL_NATIVE_VISUAL_ID 0x302e
|
#define EGL_NATIVE_VISUAL_ID 0x302e
|
||||||
@@ -90,17 +108,6 @@
|
|||||||
#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097
|
#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097
|
||||||
#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0
|
#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0
|
||||||
#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098
|
#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098
|
||||||
#define EGL_PLATFORM_X11_EXT 0x31d5
|
|
||||||
#define EGL_PLATFORM_WAYLAND_EXT 0x31d8
|
|
||||||
#define EGL_PLATFORM_ANGLE_ANGLE 0x3202
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320d
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320e
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
|
|
||||||
#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489
|
|
||||||
#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348f
|
|
||||||
|
|
||||||
typedef int EGLint;
|
typedef int EGLint;
|
||||||
typedef unsigned int EGLBoolean;
|
typedef unsigned int EGLBoolean;
|
||||||
@@ -110,9 +117,6 @@ typedef void* EGLContext;
|
|||||||
typedef void* EGLDisplay;
|
typedef void* EGLDisplay;
|
||||||
typedef void* EGLSurface;
|
typedef void* EGLSurface;
|
||||||
|
|
||||||
typedef void* EGLNativeDisplayType;
|
|
||||||
typedef void* EGLNativeWindowType;
|
|
||||||
|
|
||||||
// EGL function pointer typedefs
|
// EGL function pointer typedefs
|
||||||
typedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigAttrib)(EGLDisplay,EGLConfig,EGLint,EGLint*);
|
typedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigAttrib)(EGLDisplay,EGLConfig,EGLint,EGLint*);
|
||||||
typedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigs)(EGLDisplay,EGLConfig*,EGLint,EGLint*);
|
typedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigs)(EGLDisplay,EGLConfig*,EGLint,EGLint*);
|
||||||
@@ -147,10 +151,9 @@ typedef GLFWglproc (EGLAPIENTRY * PFN_eglGetProcAddress)(const char*);
|
|||||||
#define eglQueryString _glfw.egl.QueryString
|
#define eglQueryString _glfw.egl.QueryString
|
||||||
#define eglGetProcAddress _glfw.egl.GetProcAddress
|
#define eglGetProcAddress _glfw.egl.GetProcAddress
|
||||||
|
|
||||||
typedef EGLDisplay (EGLAPIENTRY * PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum,void*,const EGLint*);
|
#define _GLFW_EGL_CONTEXT_STATE _GLFWcontextEGL egl
|
||||||
typedef EGLSurface (EGLAPIENTRY * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay,EGLConfig,void*,const EGLint*);
|
#define _GLFW_EGL_LIBRARY_CONTEXT_STATE _GLFWlibraryEGL egl
|
||||||
#define eglGetPlatformDisplayEXT _glfw.egl.GetPlatformDisplayEXT
|
|
||||||
#define eglCreatePlatformWindowSurfaceEXT _glfw.egl.CreatePlatformWindowSurfaceEXT
|
|
||||||
|
|
||||||
// EGL-specific per-context data
|
// EGL-specific per-context data
|
||||||
//
|
//
|
||||||
@@ -161,14 +164,12 @@ typedef struct _GLFWcontextEGL
|
|||||||
EGLSurface surface;
|
EGLSurface surface;
|
||||||
|
|
||||||
void* client;
|
void* client;
|
||||||
|
|
||||||
} _GLFWcontextEGL;
|
} _GLFWcontextEGL;
|
||||||
|
|
||||||
// EGL-specific global data
|
// EGL-specific global data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWlibraryEGL
|
typedef struct _GLFWlibraryEGL
|
||||||
{
|
{
|
||||||
EGLenum platform;
|
|
||||||
EGLDisplay display;
|
EGLDisplay display;
|
||||||
EGLint major, minor;
|
EGLint major, minor;
|
||||||
GLFWbool prefix;
|
GLFWbool prefix;
|
||||||
@@ -178,15 +179,6 @@ typedef struct _GLFWlibraryEGL
|
|||||||
GLFWbool KHR_gl_colorspace;
|
GLFWbool KHR_gl_colorspace;
|
||||||
GLFWbool KHR_get_all_proc_addresses;
|
GLFWbool KHR_get_all_proc_addresses;
|
||||||
GLFWbool KHR_context_flush_control;
|
GLFWbool KHR_context_flush_control;
|
||||||
GLFWbool EXT_client_extensions;
|
|
||||||
GLFWbool EXT_platform_base;
|
|
||||||
GLFWbool EXT_platform_x11;
|
|
||||||
GLFWbool EXT_platform_wayland;
|
|
||||||
GLFWbool ANGLE_platform_angle;
|
|
||||||
GLFWbool ANGLE_platform_angle_opengl;
|
|
||||||
GLFWbool ANGLE_platform_angle_d3d;
|
|
||||||
GLFWbool ANGLE_platform_angle_vulkan;
|
|
||||||
GLFWbool ANGLE_platform_angle_metal;
|
|
||||||
|
|
||||||
void* handle;
|
void* handle;
|
||||||
|
|
||||||
@@ -206,10 +198,6 @@ typedef struct _GLFWlibraryEGL
|
|||||||
PFN_eglSwapInterval SwapInterval;
|
PFN_eglSwapInterval SwapInterval;
|
||||||
PFN_eglQueryString QueryString;
|
PFN_eglQueryString QueryString;
|
||||||
PFN_eglGetProcAddress GetProcAddress;
|
PFN_eglGetProcAddress GetProcAddress;
|
||||||
|
|
||||||
PFNEGLGETPLATFORMDISPLAYEXTPROC GetPlatformDisplayEXT;
|
|
||||||
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC CreatePlatformWindowSurfaceEXT;
|
|
||||||
|
|
||||||
} _GLFWlibraryEGL;
|
} _GLFWlibraryEGL;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
#include <winver.h>
|
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
|
||||||
FILEVERSION @GLFW_VERSION_MAJOR@,@GLFW_VERSION_MINOR@,@GLFW_VERSION_PATCH@,0
|
|
||||||
PRODUCTVERSION @GLFW_VERSION_MAJOR@,@GLFW_VERSION_MINOR@,@GLFW_VERSION_PATCH@,0
|
|
||||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
|
||||||
FILEFLAGS 0
|
|
||||||
FILEOS VOS_NT_WINDOWS32
|
|
||||||
FILETYPE VFT_DLL
|
|
||||||
FILESUBTYPE 0
|
|
||||||
{
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
{
|
|
||||||
BLOCK "040904B0"
|
|
||||||
{
|
|
||||||
VALUE "CompanyName", "GLFW"
|
|
||||||
VALUE "FileDescription", "GLFW @GLFW_VERSION@ DLL"
|
|
||||||
VALUE "FileVersion", "@GLFW_VERSION@"
|
|
||||||
VALUE "OriginalFilename", "glfw3.dll"
|
|
||||||
VALUE "ProductName", "GLFW"
|
|
||||||
VALUE "ProductVersion", "@GLFW_VERSION@"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
{
|
|
||||||
VALUE "Translation", 0x409, 1200
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/glfw3Targets.cmake")
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2010-2016 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2010-2016 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -45,6 +45,8 @@
|
|||||||
// Define this to 1 if building GLFW for OSMesa
|
// Define this to 1 if building GLFW for OSMesa
|
||||||
#cmakedefine _GLFW_OSMESA
|
#cmakedefine _GLFW_OSMESA
|
||||||
|
|
||||||
|
// Define this to 1 if building as a shared library / dynamic library / DLL
|
||||||
|
#cmakedefine _GLFW_BUILD_DLL
|
||||||
// Define this to 1 to use Vulkan loader linked statically into application
|
// Define this to 1 to use Vulkan loader linked statically into application
|
||||||
#cmakedefine _GLFW_VULKAN_STATIC
|
#cmakedefine _GLFW_VULKAN_STATIC
|
||||||
|
|
||||||
|
|||||||
+6
-5
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 GLX - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -92,6 +92,9 @@ static GLFWbool chooseGLXFBConfig(const _GLFWfbconfig* desired,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getGLXFBConfigAttrib(n, GLX_DOUBLEBUFFER) != desired->doublebuffer)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (desired->transparent)
|
if (desired->transparent)
|
||||||
{
|
{
|
||||||
XVisualInfo* vi = glXGetVisualFromFBConfig(_glfw.x11.display, n);
|
XVisualInfo* vi = glXGetVisualFromFBConfig(_glfw.x11.display, n);
|
||||||
@@ -119,8 +122,6 @@ static GLFWbool chooseGLXFBConfig(const _GLFWfbconfig* desired,
|
|||||||
|
|
||||||
if (getGLXFBConfigAttrib(n, GLX_STEREO))
|
if (getGLXFBConfigAttrib(n, GLX_STEREO))
|
||||||
u->stereo = GLFW_TRUE;
|
u->stereo = GLFW_TRUE;
|
||||||
if (getGLXFBConfigAttrib(n, GLX_DOUBLEBUFFER))
|
|
||||||
u->doublebuffer = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.glx.ARB_multisample)
|
if (_glfw.glx.ARB_multisample)
|
||||||
u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES);
|
u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES);
|
||||||
@@ -673,7 +674,7 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -687,7 +688,7 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
_GLFW_REQUIRE_INIT_OR_RETURN(None);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return None;
|
return None;
|
||||||
|
|||||||
+1
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 GLX - www.glfw.org
|
// GLFW 3.3 GLX - 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>
|
||||||
@@ -117,7 +117,6 @@ typedef struct _GLFWcontextGLX
|
|||||||
{
|
{
|
||||||
GLXContext handle;
|
GLXContext handle;
|
||||||
GLXWindow window;
|
GLXWindow window;
|
||||||
|
|
||||||
} _GLFWcontextGLX;
|
} _GLFWcontextGLX;
|
||||||
|
|
||||||
// GLX-specific global data
|
// GLX-specific global data
|
||||||
@@ -165,7 +164,6 @@ typedef struct _GLFWlibraryGLX
|
|||||||
GLFWbool EXT_create_context_es2_profile;
|
GLFWbool EXT_create_context_es2_profile;
|
||||||
GLFWbool ARB_create_context_no_error;
|
GLFWbool ARB_create_context_no_error;
|
||||||
GLFWbool ARB_context_flush_control;
|
GLFWbool ARB_context_flush_control;
|
||||||
|
|
||||||
} _GLFWlibraryGLX;
|
} _GLFWlibraryGLX;
|
||||||
|
|
||||||
GLFWbool _glfwInitGLX(void);
|
GLFWbool _glfwInitGLX(void);
|
||||||
|
|||||||
+7
-32
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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,6 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "mappings.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -37,23 +36,21 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
// The global variables below comprise all mutable global data in GLFW
|
// NOTE: The global variables below comprise all mutable global data in GLFW
|
||||||
//
|
// Any other mutable global variable is a bug
|
||||||
// Any other global variable is a bug
|
|
||||||
|
|
||||||
// Global state shared between compilation units of GLFW
|
// This contains all mutable state shared between compilation units of GLFW
|
||||||
//
|
//
|
||||||
_GLFWlibrary _glfw = { GLFW_FALSE };
|
_GLFWlibrary _glfw = { GLFW_FALSE };
|
||||||
|
|
||||||
// These are outside of _glfw so they can be used before initialization and
|
// These are outside of _glfw so they can be used before initialization and
|
||||||
// after termination
|
// after termination without special handling when _glfw is cleared to zero
|
||||||
//
|
//
|
||||||
static _GLFWerror _glfwMainThreadError;
|
static _GLFWerror _glfwMainThreadError;
|
||||||
static GLFWerrorfun _glfwErrorCallback;
|
static GLFWerrorfun _glfwErrorCallback;
|
||||||
static _GLFWinitconfig _glfwInitHints =
|
static _GLFWinitconfig _glfwInitHints =
|
||||||
{
|
{
|
||||||
GLFW_TRUE, // hat buttons
|
GLFW_TRUE, // hat buttons
|
||||||
GLFW_ANGLE_PLATFORM_TYPE_NONE, // ANGLE backend
|
|
||||||
{
|
{
|
||||||
GLFW_TRUE, // macOS menu bar
|
GLFW_TRUE, // macOS menu bar
|
||||||
GLFW_TRUE // macOS bundle chdir
|
GLFW_TRUE // macOS bundle chdir
|
||||||
@@ -91,7 +88,6 @@ static void terminate(void)
|
|||||||
_glfw.mappingCount = 0;
|
_glfw.mappingCount = 0;
|
||||||
|
|
||||||
_glfwTerminateVulkan();
|
_glfwTerminateVulkan();
|
||||||
_glfwPlatformTerminateJoysticks();
|
|
||||||
_glfwPlatformTerminate();
|
_glfwPlatformTerminate();
|
||||||
|
|
||||||
_glfw.initialized = GLFW_FALSE;
|
_glfw.initialized = GLFW_FALSE;
|
||||||
@@ -191,12 +187,6 @@ void _glfwInputError(int code, const char* format, ...)
|
|||||||
strcpy(description, "The requested format is unavailable");
|
strcpy(description, "The requested format is unavailable");
|
||||||
else if (code == GLFW_NO_WINDOW_CONTEXT)
|
else if (code == GLFW_NO_WINDOW_CONTEXT)
|
||||||
strcpy(description, "The specified window has no context");
|
strcpy(description, "The specified window has no context");
|
||||||
else if (code == GLFW_CURSOR_UNAVAILABLE)
|
|
||||||
strcpy(description, "The specified cursor shape is unavailable");
|
|
||||||
else if (code == GLFW_FEATURE_UNAVAILABLE)
|
|
||||||
strcpy(description, "The requested feature cannot be implemented for this platform");
|
|
||||||
else if (code == GLFW_FEATURE_UNIMPLEMENTED)
|
|
||||||
strcpy(description, "The requested feature has not yet been implemented for this platform");
|
|
||||||
else
|
else
|
||||||
strcpy(description, "ERROR: UNKNOWN GLFW ERROR");
|
strcpy(description, "ERROR: UNKNOWN GLFW ERROR");
|
||||||
}
|
}
|
||||||
@@ -253,24 +243,12 @@ GLFWAPI int glfwInit(void)
|
|||||||
|
|
||||||
_glfwPlatformSetTls(&_glfw.errorSlot, &_glfwMainThreadError);
|
_glfwPlatformSetTls(&_glfw.errorSlot, &_glfwMainThreadError);
|
||||||
|
|
||||||
|
_glfwInitGamepadMappings();
|
||||||
|
|
||||||
_glfw.initialized = GLFW_TRUE;
|
_glfw.initialized = GLFW_TRUE;
|
||||||
_glfw.timer.offset = _glfwPlatformGetTimerValue();
|
_glfw.timer.offset = _glfwPlatformGetTimerValue();
|
||||||
|
|
||||||
glfwDefaultWindowHints();
|
glfwDefaultWindowHints();
|
||||||
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; _glfwDefaultMappings[i]; i++)
|
|
||||||
{
|
|
||||||
if (!glfwUpdateGamepadMappings(_glfwDefaultMappings[i]))
|
|
||||||
{
|
|
||||||
terminate();
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,9 +267,6 @@ GLFWAPI void glfwInitHint(int hint, int value)
|
|||||||
case GLFW_JOYSTICK_HAT_BUTTONS:
|
case GLFW_JOYSTICK_HAT_BUTTONS:
|
||||||
_glfwInitHints.hatButtons = value;
|
_glfwInitHints.hatButtons = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_ANGLE_PLATFORM_TYPE:
|
|
||||||
_glfwInitHints.angleType = value;
|
|
||||||
return;
|
|
||||||
case GLFW_COCOA_CHDIR_RESOURCES:
|
case GLFW_COCOA_CHDIR_RESOURCES:
|
||||||
_glfwInitHints.ns.chdir = value;
|
_glfwInitHints.ns.chdir = value;
|
||||||
return;
|
return;
|
||||||
|
|||||||
+29
-69
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
#include "mappings.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
@@ -43,22 +44,6 @@
|
|||||||
#define _GLFW_JOYSTICK_BUTTON 2
|
#define _GLFW_JOYSTICK_BUTTON 2
|
||||||
#define _GLFW_JOYSTICK_HATBIT 3
|
#define _GLFW_JOYSTICK_HATBIT 3
|
||||||
|
|
||||||
// Initializes the platform joystick API if it has not been already
|
|
||||||
//
|
|
||||||
static GLFWbool initJoysticks(void)
|
|
||||||
{
|
|
||||||
if (!_glfw.joysticksInitialized)
|
|
||||||
{
|
|
||||||
if (!_glfwPlatformInitJoysticks())
|
|
||||||
{
|
|
||||||
_glfwPlatformTerminateJoysticks();
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return _glfw.joysticksInitialized = GLFW_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finds a mapping based on joystick GUID
|
// Finds a mapping based on joystick GUID
|
||||||
//
|
//
|
||||||
static _GLFWmapping* findMapping(const char* guid)
|
static _GLFWmapping* findMapping(const char* guid)
|
||||||
@@ -101,27 +86,15 @@ static _GLFWmapping* findValidMapping(const _GLFWjoystick* js)
|
|||||||
for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++)
|
for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++)
|
||||||
{
|
{
|
||||||
if (!isValidElementForJoystick(mapping->buttons + i, js))
|
if (!isValidElementForJoystick(mapping->buttons + i, js))
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_INVALID_VALUE,
|
|
||||||
"Invalid button in gamepad mapping %s (%s)",
|
|
||||||
mapping->guid,
|
|
||||||
mapping->name);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++)
|
for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++)
|
||||||
{
|
{
|
||||||
if (!isValidElementForJoystick(mapping->axes + i, js))
|
if (!isValidElementForJoystick(mapping->axes + i, js))
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_INVALID_VALUE,
|
|
||||||
"Invalid axis in gamepad mapping %s (%s)",
|
|
||||||
mapping->guid,
|
|
||||||
mapping->name);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return mapping;
|
return mapping;
|
||||||
}
|
}
|
||||||
@@ -424,6 +397,29 @@ void _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Adds the built-in set of gamepad mappings
|
||||||
|
//
|
||||||
|
void _glfwInitGamepadMappings(void)
|
||||||
|
{
|
||||||
|
int jid;
|
||||||
|
size_t i;
|
||||||
|
const size_t count = sizeof(_glfwDefaultMappings) / sizeof(char*);
|
||||||
|
_glfw.mappings = calloc(count, sizeof(_GLFWmapping));
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (parseMapping(&_glfw.mappings[_glfw.mappingCount], _glfwDefaultMappings[i]))
|
||||||
|
_glfw.mappingCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
||||||
|
{
|
||||||
|
_GLFWjoystick* js = _glfw.joysticks + jid;
|
||||||
|
if (js->present)
|
||||||
|
js->mapping = findValidMapping(js);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Returns an available joystick object with arrays and name allocated
|
// Returns an available joystick object with arrays and name allocated
|
||||||
//
|
//
|
||||||
_GLFWjoystick* _glfwAllocJoystick(const char* name,
|
_GLFWjoystick* _glfwAllocJoystick(const char* name,
|
||||||
@@ -446,7 +442,6 @@ _GLFWjoystick* _glfwAllocJoystick(const char* name,
|
|||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
js->present = GLFW_TRUE;
|
js->present = GLFW_TRUE;
|
||||||
js->name = _glfw_strdup(name);
|
|
||||||
js->axes = calloc(axisCount, sizeof(float));
|
js->axes = calloc(axisCount, sizeof(float));
|
||||||
js->buttons = calloc(buttonCount + (size_t) hatCount * 4, 1);
|
js->buttons = calloc(buttonCount + (size_t) hatCount * 4, 1);
|
||||||
js->hats = calloc(hatCount, 1);
|
js->hats = calloc(hatCount, 1);
|
||||||
@@ -454,6 +449,7 @@ _GLFWjoystick* _glfwAllocJoystick(const char* name,
|
|||||||
js->buttonCount = buttonCount;
|
js->buttonCount = buttonCount;
|
||||||
js->hatCount = hatCount;
|
js->hatCount = hatCount;
|
||||||
|
|
||||||
|
strncpy(js->name, name, sizeof(js->name) - 1);
|
||||||
strncpy(js->guid, guid, sizeof(js->guid) - 1);
|
strncpy(js->guid, guid, sizeof(js->guid) - 1);
|
||||||
js->mapping = findValidMapping(js);
|
js->mapping = findValidMapping(js);
|
||||||
|
|
||||||
@@ -464,7 +460,6 @@ _GLFWjoystick* _glfwAllocJoystick(const char* name,
|
|||||||
//
|
//
|
||||||
void _glfwFreeJoystick(_GLFWjoystick* js)
|
void _glfwFreeJoystick(_GLFWjoystick* js)
|
||||||
{
|
{
|
||||||
free(js->name);
|
|
||||||
free(js->axes);
|
free(js->axes);
|
||||||
free(js->buttons);
|
free(js->buttons);
|
||||||
free(js->hats);
|
free(js->hats);
|
||||||
@@ -773,13 +768,9 @@ GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape)
|
|||||||
if (shape != GLFW_ARROW_CURSOR &&
|
if (shape != GLFW_ARROW_CURSOR &&
|
||||||
shape != GLFW_IBEAM_CURSOR &&
|
shape != GLFW_IBEAM_CURSOR &&
|
||||||
shape != GLFW_CROSSHAIR_CURSOR &&
|
shape != GLFW_CROSSHAIR_CURSOR &&
|
||||||
shape != GLFW_POINTING_HAND_CURSOR &&
|
shape != GLFW_HAND_CURSOR &&
|
||||||
shape != GLFW_RESIZE_EW_CURSOR &&
|
shape != GLFW_HRESIZE_CURSOR &&
|
||||||
shape != GLFW_RESIZE_NS_CURSOR &&
|
shape != GLFW_VRESIZE_CURSOR)
|
||||||
shape != GLFW_RESIZE_NWSE_CURSOR &&
|
|
||||||
shape != GLFW_RESIZE_NESW_CURSOR &&
|
|
||||||
shape != GLFW_RESIZE_ALL_CURSOR &&
|
|
||||||
shape != GLFW_NOT_ALLOWED_CURSOR)
|
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid standard cursor 0x%08X", shape);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid standard cursor 0x%08X", shape);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -945,9 +936,6 @@ GLFWAPI int glfwJoystickPresent(int jid)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return GLFW_FALSE;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
@@ -973,9 +961,6 @@ GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1005,9 +990,6 @@ GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1041,9 +1023,6 @@ GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1070,9 +1049,6 @@ GLFWAPI const char* glfwGetJoystickName(int jid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1098,9 +1074,6 @@ GLFWAPI const char* glfwGetJoystickGUID(int jid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1146,10 +1119,6 @@ GLFWAPI void* glfwGetJoystickUserPointer(int jid)
|
|||||||
GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun)
|
GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun)
|
||||||
{
|
{
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
_GLFW_SWAP_POINTERS(_glfw.callbacks.joystick, cbfun);
|
_GLFW_SWAP_POINTERS(_glfw.callbacks.joystick, cbfun);
|
||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
@@ -1229,9 +1198,6 @@ GLFWAPI int glfwJoystickIsGamepad(int jid)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return GLFW_FALSE;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
@@ -1257,9 +1223,6 @@ GLFWAPI const char* glfwGetGamepadName(int jid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1292,9 +1255,6 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initJoysticks())
|
|
||||||
return GLFW_FALSE;
|
|
||||||
|
|
||||||
js = _glfw.joysticks + jid;
|
js = _glfw.joysticks + jid;
|
||||||
if (!js->present)
|
if (!js->present)
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|||||||
+9
-24
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -194,9 +194,6 @@ typedef void (APIENTRY * PFN_vkVoidFunction)(void);
|
|||||||
#error "No supported window creation API selected"
|
#error "No supported window creation API selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "egl_context.h"
|
|
||||||
#include "osmesa_context.h"
|
|
||||||
|
|
||||||
// Constructs a version number string from the public header macros
|
// Constructs a version number string from the public header macros
|
||||||
#define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r
|
#define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r
|
||||||
#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)
|
#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)
|
||||||
@@ -243,7 +240,6 @@ struct _GLFWerror
|
|||||||
struct _GLFWinitconfig
|
struct _GLFWinitconfig
|
||||||
{
|
{
|
||||||
GLFWbool hatButtons;
|
GLFWbool hatButtons;
|
||||||
int angleType;
|
|
||||||
struct {
|
struct {
|
||||||
GLFWbool menubar;
|
GLFWbool menubar;
|
||||||
GLFWbool chdir;
|
GLFWbool chdir;
|
||||||
@@ -270,7 +266,6 @@ struct _GLFWwndconfig
|
|||||||
GLFWbool maximized;
|
GLFWbool maximized;
|
||||||
GLFWbool centerCursor;
|
GLFWbool centerCursor;
|
||||||
GLFWbool focusOnShow;
|
GLFWbool focusOnShow;
|
||||||
GLFWbool mousePassthrough;
|
|
||||||
GLFWbool scaleToMonitor;
|
GLFWbool scaleToMonitor;
|
||||||
struct {
|
struct {
|
||||||
GLFWbool retina;
|
GLFWbool retina;
|
||||||
@@ -280,9 +275,6 @@ struct _GLFWwndconfig
|
|||||||
char className[256];
|
char className[256];
|
||||||
char instanceName[256];
|
char instanceName[256];
|
||||||
} x11;
|
} x11;
|
||||||
struct {
|
|
||||||
GLFWbool keymenu;
|
|
||||||
} win32;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Context configuration
|
// Context configuration
|
||||||
@@ -364,9 +356,9 @@ struct _GLFWcontext
|
|||||||
// This is defined in the context API's context.h
|
// This is defined in the context API's context.h
|
||||||
_GLFW_PLATFORM_CONTEXT_STATE;
|
_GLFW_PLATFORM_CONTEXT_STATE;
|
||||||
// This is defined in egl_context.h
|
// This is defined in egl_context.h
|
||||||
_GLFWcontextEGL egl;
|
_GLFW_EGL_CONTEXT_STATE;
|
||||||
// This is defined in osmesa_context.h
|
// This is defined in osmesa_context.h
|
||||||
_GLFWcontextOSMesa osmesa;
|
_GLFW_OSMESA_CONTEXT_STATE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Window and context structure
|
// Window and context structure
|
||||||
@@ -381,9 +373,9 @@ struct _GLFWwindow
|
|||||||
GLFWbool autoIconify;
|
GLFWbool autoIconify;
|
||||||
GLFWbool floating;
|
GLFWbool floating;
|
||||||
GLFWbool focusOnShow;
|
GLFWbool focusOnShow;
|
||||||
GLFWbool mousePassthrough;
|
|
||||||
GLFWbool shouldClose;
|
GLFWbool shouldClose;
|
||||||
void* userPointer;
|
void* userPointer;
|
||||||
|
GLFWbool doublebuffer;
|
||||||
GLFWvidmode videoMode;
|
GLFWvidmode videoMode;
|
||||||
_GLFWmonitor* monitor;
|
_GLFWmonitor* monitor;
|
||||||
_GLFWcursor* cursor;
|
_GLFWcursor* cursor;
|
||||||
@@ -432,7 +424,7 @@ struct _GLFWwindow
|
|||||||
//
|
//
|
||||||
struct _GLFWmonitor
|
struct _GLFWmonitor
|
||||||
{
|
{
|
||||||
char* name;
|
char name[128];
|
||||||
void* userPointer;
|
void* userPointer;
|
||||||
|
|
||||||
// Physical dimensions in millimeters.
|
// Physical dimensions in millimeters.
|
||||||
@@ -493,7 +485,7 @@ struct _GLFWjoystick
|
|||||||
int buttonCount;
|
int buttonCount;
|
||||||
unsigned char* hats;
|
unsigned char* hats;
|
||||||
int hatCount;
|
int hatCount;
|
||||||
char* name;
|
char name[128];
|
||||||
void* userPointer;
|
void* userPointer;
|
||||||
char guid[33];
|
char guid[33];
|
||||||
_GLFWmapping* mapping;
|
_GLFWmapping* mapping;
|
||||||
@@ -539,7 +531,6 @@ struct _GLFWlibrary
|
|||||||
_GLFWmonitor** monitors;
|
_GLFWmonitor** monitors;
|
||||||
int monitorCount;
|
int monitorCount;
|
||||||
|
|
||||||
GLFWbool joysticksInitialized;
|
|
||||||
_GLFWjoystick joysticks[GLFW_JOYSTICK_LAST + 1];
|
_GLFWjoystick joysticks[GLFW_JOYSTICK_LAST + 1];
|
||||||
_GLFWmapping* mappings;
|
_GLFWmapping* mappings;
|
||||||
int mappingCount;
|
int mappingCount;
|
||||||
@@ -588,9 +579,9 @@ struct _GLFWlibrary
|
|||||||
// This is defined in the platform's joystick.h
|
// This is defined in the platform's joystick.h
|
||||||
_GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;
|
_GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;
|
||||||
// This is defined in egl_context.h
|
// This is defined in egl_context.h
|
||||||
_GLFWlibraryEGL egl;
|
_GLFW_EGL_LIBRARY_CONTEXT_STATE;
|
||||||
// This is defined in osmesa_context.h
|
// This is defined in osmesa_context.h
|
||||||
_GLFWlibraryOSMesa osmesa;
|
_GLFW_OSMESA_LIBRARY_CONTEXT_STATE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Global state shared between compilation units of GLFW
|
// Global state shared between compilation units of GLFW
|
||||||
@@ -633,8 +624,6 @@ void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
|||||||
void _glfwPlatformSetClipboardString(const char* string);
|
void _glfwPlatformSetClipboardString(const char* string);
|
||||||
const char* _glfwPlatformGetClipboardString(void);
|
const char* _glfwPlatformGetClipboardString(void);
|
||||||
|
|
||||||
GLFWbool _glfwPlatformInitJoysticks(void);
|
|
||||||
void _glfwPlatformTerminateJoysticks(void);
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);
|
||||||
void _glfwPlatformUpdateGamepadGUID(char* guid);
|
void _glfwPlatformUpdateGamepadGUID(char* guid);
|
||||||
|
|
||||||
@@ -683,7 +672,6 @@ float _glfwPlatformGetWindowOpacity(_GLFWwindow* window);
|
|||||||
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled);
|
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled);
|
||||||
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled);
|
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled);
|
||||||
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled);
|
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled);
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled);
|
|
||||||
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity);
|
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity);
|
||||||
|
|
||||||
void _glfwPlatformPollEvents(void);
|
void _glfwPlatformPollEvents(void);
|
||||||
@@ -691,10 +679,6 @@ void _glfwPlatformWaitEvents(void);
|
|||||||
void _glfwPlatformWaitEventsTimeout(double timeout);
|
void _glfwPlatformWaitEventsTimeout(double timeout);
|
||||||
void _glfwPlatformPostEmptyEvent(void);
|
void _glfwPlatformPostEmptyEvent(void);
|
||||||
|
|
||||||
EGLenum _glfwPlatformGetEGLPlatform(EGLint** attribs);
|
|
||||||
EGLNativeDisplayType _glfwPlatformGetEGLNativeDisplay(void);
|
|
||||||
EGLNativeWindowType _glfwPlatformGetEGLNativeWindow(_GLFWwindow* window);
|
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions);
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions);
|
||||||
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,
|
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,
|
||||||
VkPhysicalDevice device,
|
VkPhysicalDevice device,
|
||||||
@@ -777,6 +761,7 @@ void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);
|
|||||||
void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
|
void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
|
||||||
void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
|
void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
|
||||||
|
|
||||||
|
void _glfwInitGamepadMappings(void);
|
||||||
_GLFWjoystick* _glfwAllocJoystick(const char* name,
|
_GLFWjoystick* _glfwAllocJoystick(const char* name,
|
||||||
const char* guid,
|
const char* guid,
|
||||||
int axisCount,
|
int axisCount,
|
||||||
|
|||||||
+52
-47
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -264,50 +264,9 @@ static int compareJoysticks(const void* fp, const void* sp)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void _glfwDetectJoystickConnectionLinux(void)
|
// Initialize joystick interface
|
||||||
{
|
//
|
||||||
if (_glfw.linjs.inotify <= 0)
|
GLFWbool _glfwInitJoysticksLinux(void)
|
||||||
return;
|
|
||||||
|
|
||||||
ssize_t offset = 0;
|
|
||||||
char buffer[16384];
|
|
||||||
const ssize_t size = read(_glfw.linjs.inotify, buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
while (size > offset)
|
|
||||||
{
|
|
||||||
regmatch_t match;
|
|
||||||
const struct inotify_event* e = (struct inotify_event*) (buffer + offset);
|
|
||||||
|
|
||||||
offset += sizeof(struct inotify_event) + e->len;
|
|
||||||
|
|
||||||
if (regexec(&_glfw.linjs.regex, e->name, 1, &match, 0) != 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
char path[PATH_MAX];
|
|
||||||
snprintf(path, sizeof(path), "/dev/input/%s", e->name);
|
|
||||||
|
|
||||||
if (e->mask & (IN_CREATE | IN_ATTRIB))
|
|
||||||
openJoystickDevice(path);
|
|
||||||
else if (e->mask & IN_DELETE)
|
|
||||||
{
|
|
||||||
for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
|
||||||
{
|
|
||||||
if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0)
|
|
||||||
{
|
|
||||||
closeJoystick(_glfw.joysticks + jid);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
////// GLFW platform API //////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
GLFWbool _glfwPlatformInitJoysticks(void)
|
|
||||||
{
|
{
|
||||||
const char* dirname = "/dev/input";
|
const char* dirname = "/dev/input";
|
||||||
|
|
||||||
@@ -361,7 +320,9 @@ GLFWbool _glfwPlatformInitJoysticks(void)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformTerminateJoysticks(void)
|
// Close all opened joystick handles
|
||||||
|
//
|
||||||
|
void _glfwTerminateJoysticksLinux(void)
|
||||||
{
|
{
|
||||||
int jid;
|
int jid;
|
||||||
|
|
||||||
@@ -372,16 +333,60 @@ void _glfwPlatformTerminateJoysticks(void)
|
|||||||
closeJoystick(js);
|
closeJoystick(js);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regfree(&_glfw.linjs.regex);
|
||||||
|
|
||||||
if (_glfw.linjs.inotify > 0)
|
if (_glfw.linjs.inotify > 0)
|
||||||
{
|
{
|
||||||
if (_glfw.linjs.watch > 0)
|
if (_glfw.linjs.watch > 0)
|
||||||
inotify_rm_watch(_glfw.linjs.inotify, _glfw.linjs.watch);
|
inotify_rm_watch(_glfw.linjs.inotify, _glfw.linjs.watch);
|
||||||
|
|
||||||
close(_glfw.linjs.inotify);
|
close(_glfw.linjs.inotify);
|
||||||
regfree(&_glfw.linjs.regex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwDetectJoystickConnectionLinux(void)
|
||||||
|
{
|
||||||
|
if (_glfw.linjs.inotify <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ssize_t offset = 0;
|
||||||
|
char buffer[16384];
|
||||||
|
const ssize_t size = read(_glfw.linjs.inotify, buffer, sizeof(buffer));
|
||||||
|
|
||||||
|
while (size > offset)
|
||||||
|
{
|
||||||
|
regmatch_t match;
|
||||||
|
const struct inotify_event* e = (struct inotify_event*) (buffer + offset);
|
||||||
|
|
||||||
|
offset += sizeof(struct inotify_event) + e->len;
|
||||||
|
|
||||||
|
if (regexec(&_glfw.linjs.regex, e->name, 1, &match, 0) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char path[PATH_MAX];
|
||||||
|
snprintf(path, sizeof(path), "/dev/input/%s", e->name);
|
||||||
|
|
||||||
|
if (e->mask & (IN_CREATE | IN_ATTRIB))
|
||||||
|
openJoystickDevice(path);
|
||||||
|
else if (e->mask & IN_DELETE)
|
||||||
|
{
|
||||||
|
for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++)
|
||||||
|
{
|
||||||
|
if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0)
|
||||||
|
{
|
||||||
|
closeJoystick(_glfw.joysticks + jid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
////// GLFW platform API //////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
||||||
{
|
{
|
||||||
// Read all queued events (non-blocking)
|
// Read all queued events (non-blocking)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
// GLFW 3.3 Linux - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE _GLFWlibraryLinux linjs
|
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE _GLFWlibraryLinux linjs
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_MAPPING_NAME "Linux"
|
#define _GLFW_PLATFORM_MAPPING_NAME "Linux"
|
||||||
|
#define GLFW_BUILD_LINUX_MAPPINGS
|
||||||
|
|
||||||
// Linux-specific joystick data
|
// Linux-specific joystick data
|
||||||
//
|
//
|
||||||
@@ -55,5 +56,8 @@ typedef struct _GLFWlibraryLinux
|
|||||||
GLFWbool dropped;
|
GLFWbool dropped;
|
||||||
} _GLFWlibraryLinux;
|
} _GLFWlibraryLinux;
|
||||||
|
|
||||||
|
|
||||||
|
GLFWbool _glfwInitJoysticksLinux(void);
|
||||||
|
void _glfwTerminateJoysticksLinux(void);
|
||||||
void _glfwDetectJoystickConnectionLinux(void);
|
void _glfwDetectJoystickConnectionLinux(void);
|
||||||
|
|
||||||
|
|||||||
+822
-297
File diff suppressed because it is too large
Load Diff
+13
-4
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
// all available in SDL_GameControllerDB. Do not edit this file. Any gamepad
|
// all available in SDL_GameControllerDB. Do not edit this file. Any gamepad
|
||||||
// mappings not specific to GLFW should be submitted to SDL_GameControllerDB.
|
// mappings not specific to GLFW should be submitted to SDL_GameControllerDB.
|
||||||
// This file can be re-generated from mappings.h.in and the upstream
|
// This file can be re-generated from mappings.h.in and the upstream
|
||||||
// gamecontrollerdb.txt with the GenerateMappings.cmake script.
|
// gamecontrollerdb.txt with the 'update_mappings' CMake target.
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
// All gamepad mappings not labeled GLFW are copied from the
|
// All gamepad mappings not labeled GLFW are copied from the
|
||||||
@@ -60,7 +60,8 @@
|
|||||||
|
|
||||||
const char* _glfwDefaultMappings[] =
|
const char* _glfwDefaultMappings[] =
|
||||||
{
|
{
|
||||||
@GLFW_GAMEPAD_MAPPINGS@
|
#if defined(GLFW_BUILD_WIN32_MAPPINGS)
|
||||||
|
@GLFW_WIN32_MAPPINGS@
|
||||||
"78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
"78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
"78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
@@ -68,6 +69,14 @@ const char* _glfwDefaultMappings[] =
|
|||||||
"78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
"78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
"78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
"78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
|
||||||
NULL
|
#endif // GLFW_BUILD_WIN32_MAPPINGS
|
||||||
|
|
||||||
|
#if defined(GLFW_BUILD_COCOA_MAPPINGS)
|
||||||
|
@GLFW_COCOA_MAPPINGS@
|
||||||
|
#endif // GLFW_BUILD_COCOA_MAPPINGS
|
||||||
|
|
||||||
|
#if defined(GLFW_BUILD_LINUX_MAPPINGS)
|
||||||
|
@GLFW_LINUX_MAPPINGS@
|
||||||
|
#endif // GLFW_BUILD_LINUX_MAPPINGS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -170,8 +170,7 @@ _GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM)
|
|||||||
monitor->widthMM = widthMM;
|
monitor->widthMM = widthMM;
|
||||||
monitor->heightMM = heightMM;
|
monitor->heightMM = heightMM;
|
||||||
|
|
||||||
if (name)
|
strncpy(monitor->name, name, sizeof(monitor->name) - 1);
|
||||||
monitor->name = _glfw_strdup(name);
|
|
||||||
|
|
||||||
return monitor;
|
return monitor;
|
||||||
}
|
}
|
||||||
@@ -189,7 +188,6 @@ void _glfwFreeMonitor(_GLFWmonitor* monitor)
|
|||||||
_glfwFreeGammaArrays(&monitor->currentRamp);
|
_glfwFreeGammaArrays(&monitor->currentRamp);
|
||||||
|
|
||||||
free(monitor->modes);
|
free(monitor->modes);
|
||||||
free(monitor->name);
|
|
||||||
free(monitor);
|
free(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -44,7 +44,6 @@ typedef struct _GLFWcontextNSGL
|
|||||||
{
|
{
|
||||||
id pixelFormat;
|
id pixelFormat;
|
||||||
id object;
|
id object;
|
||||||
|
|
||||||
} _GLFWcontextNSGL;
|
} _GLFWcontextNSGL;
|
||||||
|
|
||||||
// NSGL-specific global data
|
// NSGL-specific global data
|
||||||
@@ -53,7 +52,6 @@ typedef struct _GLFWlibraryNSGL
|
|||||||
{
|
{
|
||||||
// dlopen handle for OpenGL.framework (for glfwGetProcAddress)
|
// dlopen handle for OpenGL.framework (for glfwGetProcAddress)
|
||||||
CFBundleRef framework;
|
CFBundleRef framework;
|
||||||
|
|
||||||
} _GLFWlibraryNSGL;
|
} _GLFWlibraryNSGL;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 macOS - www.glfw.org
|
// GLFW 3.3 macOS - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -174,6 +174,13 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
"NSGL: The targeted version of macOS does not support OpenGL 3.0 or 3.1 but may support 3.2 and above");
|
"NSGL: The targeted version of macOS does not support OpenGL 3.0 or 3.1 but may support 3.2 and above");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ctxconfig->forward || ctxconfig->profile != GLFW_OPENGL_CORE_PROFILE)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
||||||
|
"NSGL: The targeted version of macOS only supports forward-compatible core profile contexts for OpenGL 3.2 and above");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Context robustness modes (GL_KHR_robustness) are not yet supported by
|
// Context robustness modes (GL_KHR_robustness) are not yet supported by
|
||||||
@@ -358,7 +365,7 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
_GLFW_REQUIRE_INIT_OR_RETURN(nil);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return nil;
|
return nil;
|
||||||
|
|||||||
+1
-6
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -29,8 +29,6 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
@@ -39,14 +37,11 @@
|
|||||||
int _glfwPlatformInit(void)
|
int _glfwPlatformInit(void)
|
||||||
{
|
{
|
||||||
_glfwInitTimerPOSIX();
|
_glfwInitTimerPOSIX();
|
||||||
_glfwPollMonitorsNull();
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformTerminate(void)
|
void _glfwPlatformTerminate(void)
|
||||||
{
|
{
|
||||||
free(_glfw.null.clipboardString);
|
|
||||||
_glfwTerminateOSMesa();
|
_glfwTerminateOSMesa();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-10
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -33,15 +33,6 @@
|
|||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
GLFWbool _glfwPlatformInitJoysticks(void)
|
|
||||||
{
|
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformTerminateJoysticks(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
||||||
{
|
{
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
|
|||||||
+3
-85
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -29,37 +29,6 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
// The the sole (fake) video mode of our (sole) fake monitor
|
|
||||||
//
|
|
||||||
static GLFWvidmode getVideoMode(void)
|
|
||||||
{
|
|
||||||
GLFWvidmode mode;
|
|
||||||
mode.width = 1920;
|
|
||||||
mode.height = 1080;
|
|
||||||
mode.redBits = 8;
|
|
||||||
mode.greenBits = 8;
|
|
||||||
mode.blueBits = 8;
|
|
||||||
mode.refreshRate = 60;
|
|
||||||
return mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
////// GLFW internal API //////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void _glfwPollMonitorsNull(void)
|
|
||||||
{
|
|
||||||
const float dpi = 141.f;
|
|
||||||
const GLFWvidmode mode = getVideoMode();
|
|
||||||
_GLFWmonitor* monitor = _glfwAllocMonitor("Null SuperNoop 0",
|
|
||||||
(int) (mode.width * 25.4f / dpi),
|
|
||||||
(int) (mode.height * 25.4f / dpi));
|
|
||||||
_glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_FIRST);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
@@ -67,15 +36,10 @@ void _glfwPollMonitorsNull(void)
|
|||||||
|
|
||||||
void _glfwPlatformFreeMonitor(_GLFWmonitor* monitor)
|
void _glfwPlatformFreeMonitor(_GLFWmonitor* monitor)
|
||||||
{
|
{
|
||||||
_glfwFreeGammaArrays(&monitor->null.ramp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
||||||
{
|
{
|
||||||
if (xpos)
|
|
||||||
*xpos = 0;
|
|
||||||
if (ypos)
|
|
||||||
*ypos = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetMonitorContentScale(_GLFWmonitor* monitor,
|
void _glfwPlatformGetMonitorContentScale(_GLFWmonitor* monitor,
|
||||||
@@ -91,69 +55,23 @@ void _glfwPlatformGetMonitorWorkarea(_GLFWmonitor* monitor,
|
|||||||
int* xpos, int* ypos,
|
int* xpos, int* ypos,
|
||||||
int* width, int* height)
|
int* width, int* height)
|
||||||
{
|
{
|
||||||
const GLFWvidmode mode = getVideoMode();
|
|
||||||
|
|
||||||
if (xpos)
|
|
||||||
*xpos = 0;
|
|
||||||
if (ypos)
|
|
||||||
*ypos = 10;
|
|
||||||
if (width)
|
|
||||||
*width = mode.width;
|
|
||||||
if (height)
|
|
||||||
*height = mode.height - 10;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
|
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
|
||||||
{
|
{
|
||||||
GLFWvidmode* mode = calloc(1, sizeof(GLFWvidmode));
|
return NULL;
|
||||||
*mode = getVideoMode();
|
|
||||||
*found = 1;
|
|
||||||
return mode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)
|
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)
|
||||||
{
|
{
|
||||||
*mode = getVideoMode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
if (!monitor->null.ramp.size)
|
return GLFW_FALSE;
|
||||||
{
|
|
||||||
_glfwAllocGammaArrays(&monitor->null.ramp, 256);
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < monitor->null.ramp.size; i++)
|
|
||||||
{
|
|
||||||
const float gamma = 2.2f;
|
|
||||||
float value;
|
|
||||||
value = i / (float) (monitor->null.ramp.size - 1);
|
|
||||||
value = powf(value, 1.f / gamma) * 65535.f + 0.5f;
|
|
||||||
value = _glfw_fminf(value, 65535.f);
|
|
||||||
|
|
||||||
monitor->null.ramp.red[i] = (unsigned short) value;
|
|
||||||
monitor->null.ramp.green[i] = (unsigned short) value;
|
|
||||||
monitor->null.ramp.blue[i] = (unsigned short) value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwAllocGammaArrays(ramp, monitor->null.ramp.size);
|
|
||||||
memcpy(ramp->red, monitor->null.ramp.red, sizeof(short) * ramp->size);
|
|
||||||
memcpy(ramp->green, monitor->null.ramp.green, sizeof(short) * ramp->size);
|
|
||||||
memcpy(ramp->blue, monitor->null.ramp.blue, sizeof(short) * ramp->size);
|
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
if (monitor->null.ramp.size != ramp->size)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Null: Gamma ramp size must match current ramp size");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(monitor->null.ramp.red, ramp->red, sizeof(short) * ramp->size);
|
|
||||||
memcpy(monitor->null.ramp.green, ramp->green, sizeof(short) * ramp->size);
|
|
||||||
memcpy(monitor->null.ramp.blue, ramp->blue, sizeof(short) * ramp->size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-33
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -28,13 +28,16 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNull null
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNull null
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNull null
|
|
||||||
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNull null
|
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_CONTEXT_STATE struct { int dummyContext; }
|
#define _GLFW_PLATFORM_CONTEXT_STATE struct { int dummyContext; }
|
||||||
|
#define _GLFW_PLATFORM_MONITOR_STATE struct { int dummyMonitor; }
|
||||||
#define _GLFW_PLATFORM_CURSOR_STATE struct { int dummyCursor; }
|
#define _GLFW_PLATFORM_CURSOR_STATE struct { int dummyCursor; }
|
||||||
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE struct { int dummyLibraryWindow; }
|
||||||
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE struct { int dummyLibraryContext; }
|
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE struct { int dummyLibraryContext; }
|
||||||
|
#define _GLFW_EGL_CONTEXT_STATE struct { int dummyEGLContext; }
|
||||||
|
#define _GLFW_EGL_LIBRARY_CONTEXT_STATE struct { int dummyEGLLibraryContext; }
|
||||||
|
|
||||||
|
#include "osmesa_context.h"
|
||||||
#include "posix_time.h"
|
#include "posix_time.h"
|
||||||
#include "posix_thread.h"
|
#include "posix_thread.h"
|
||||||
#include "null_joystick.h"
|
#include "null_joystick.h"
|
||||||
@@ -53,37 +56,7 @@
|
|||||||
//
|
//
|
||||||
typedef struct _GLFWwindowNull
|
typedef struct _GLFWwindowNull
|
||||||
{
|
{
|
||||||
int xpos;
|
|
||||||
int ypos;
|
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
char* title;
|
|
||||||
GLFWbool visible;
|
|
||||||
GLFWbool iconified;
|
|
||||||
GLFWbool maximized;
|
|
||||||
GLFWbool resizable;
|
|
||||||
GLFWbool decorated;
|
|
||||||
GLFWbool floating;
|
|
||||||
GLFWbool transparent;
|
|
||||||
float opacity;
|
|
||||||
} _GLFWwindowNull;
|
} _GLFWwindowNull;
|
||||||
|
|
||||||
// Null-specific per-monitor data
|
|
||||||
//
|
|
||||||
typedef struct _GLFWmonitorNull
|
|
||||||
{
|
|
||||||
GLFWgammaramp ramp;
|
|
||||||
} _GLFWmonitorNull;
|
|
||||||
|
|
||||||
// Null-specific global data
|
|
||||||
//
|
|
||||||
typedef struct _GLFWlibraryNull
|
|
||||||
{
|
|
||||||
int xcursor;
|
|
||||||
int ycursor;
|
|
||||||
char* clipboardString;
|
|
||||||
_GLFWwindow* focusedWindow;
|
|
||||||
} _GLFWlibraryNull;
|
|
||||||
|
|
||||||
void _glfwPollMonitorsNull(void);
|
|
||||||
|
|
||||||
|
|||||||
+19
-357
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -29,71 +29,12 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
static void applySizeLimits(_GLFWwindow* window, int* width, int* height)
|
|
||||||
{
|
|
||||||
if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)
|
|
||||||
{
|
|
||||||
const float ratio = (float) window->numer / (float) window->denom;
|
|
||||||
*height = (int) (*width / ratio);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->minwidth != GLFW_DONT_CARE && *width < window->minwidth)
|
|
||||||
*width = window->minwidth;
|
|
||||||
else if (window->maxwidth != GLFW_DONT_CARE && *width > window->maxwidth)
|
|
||||||
*width = window->maxwidth;
|
|
||||||
|
|
||||||
if (window->minheight != GLFW_DONT_CARE && *height < window->minheight)
|
|
||||||
*height = window->minheight;
|
|
||||||
else if (window->maxheight != GLFW_DONT_CARE && *height > window->maxheight)
|
|
||||||
*height = window->maxheight;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fitToMonitor(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
GLFWvidmode mode;
|
|
||||||
_glfwPlatformGetVideoMode(window->monitor, &mode);
|
|
||||||
_glfwPlatformGetMonitorPos(window->monitor,
|
|
||||||
&window->null.xpos,
|
|
||||||
&window->null.ypos);
|
|
||||||
window->null.width = mode.width;
|
|
||||||
window->null.height = mode.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void acquireMonitor(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
_glfwInputMonitorWindow(window->monitor, window);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void releaseMonitor(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
if (window->monitor->window != window)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_glfwInputMonitorWindow(window->monitor, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int createNativeWindow(_GLFWwindow* window,
|
static int createNativeWindow(_GLFWwindow* window,
|
||||||
const _GLFWwndconfig* wndconfig,
|
const _GLFWwndconfig* wndconfig)
|
||||||
const _GLFWfbconfig* fbconfig)
|
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
|
||||||
fitToMonitor(window);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
window->null.xpos = 17;
|
|
||||||
window->null.ypos = 17;
|
|
||||||
window->null.width = wndconfig->width;
|
window->null.width = wndconfig->width;
|
||||||
window->null.height = wndconfig->height;
|
window->null.height = wndconfig->height;
|
||||||
}
|
|
||||||
|
|
||||||
window->null.visible = wndconfig->visible;
|
|
||||||
window->null.decorated = wndconfig->decorated;
|
|
||||||
window->null.maximized = wndconfig->maximized;
|
|
||||||
window->null.floating = wndconfig->floating;
|
|
||||||
window->null.transparent = fbconfig->transparent;
|
|
||||||
window->null.opacity = 1.f;
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
@@ -108,7 +49,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig)
|
const _GLFWfbconfig* fbconfig)
|
||||||
{
|
{
|
||||||
if (!createNativeWindow(window, wndconfig, fbconfig))
|
if (!createNativeWindow(window, wndconfig))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
if (ctxconfig->client != GLFW_NO_API)
|
if (ctxconfig->client != GLFW_NO_API)
|
||||||
@@ -128,24 +69,11 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
{
|
|
||||||
_glfwPlatformShowWindow(window);
|
|
||||||
_glfwPlatformFocusWindow(window);
|
|
||||||
acquireMonitor(window);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
|
||||||
releaseMonitor(window);
|
|
||||||
|
|
||||||
if (_glfw.null.focusedWindow == window)
|
|
||||||
_glfw.null.focusedWindow = NULL;
|
|
||||||
|
|
||||||
if (window->context.destroy)
|
if (window->context.destroy)
|
||||||
window->context.destroy(window);
|
window->context.destroy(window);
|
||||||
}
|
}
|
||||||
@@ -165,54 +93,14 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
|||||||
int width, int height,
|
int width, int height,
|
||||||
int refreshRate)
|
int refreshRate)
|
||||||
{
|
{
|
||||||
if (window->monitor == monitor)
|
|
||||||
{
|
|
||||||
if (!monitor)
|
|
||||||
{
|
|
||||||
_glfwPlatformSetWindowPos(window, xpos, ypos);
|
|
||||||
_glfwPlatformSetWindowSize(window, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
releaseMonitor(window);
|
|
||||||
|
|
||||||
_glfwInputWindowMonitor(window, monitor);
|
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
{
|
|
||||||
window->null.visible = GLFW_TRUE;
|
|
||||||
acquireMonitor(window);
|
|
||||||
fitToMonitor(window);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwPlatformSetWindowPos(window, xpos, ypos);
|
|
||||||
_glfwPlatformSetWindowSize(window, width, height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
||||||
{
|
{
|
||||||
if (xpos)
|
|
||||||
*xpos = window->null.xpos;
|
|
||||||
if (ypos)
|
|
||||||
*ypos = window->null.ypos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (window->null.xpos != xpos || window->null.ypos != ypos)
|
|
||||||
{
|
|
||||||
window->null.xpos = xpos;
|
|
||||||
window->null.ypos = ypos;
|
|
||||||
_glfwInputWindowPos(window, xpos, ypos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
||||||
@@ -224,35 +112,19 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
{
|
|
||||||
if (window->monitor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (window->null.width != width || window->null.height != height)
|
|
||||||
{
|
{
|
||||||
window->null.width = width;
|
window->null.width = width;
|
||||||
window->null.height = height;
|
window->null.height = height;
|
||||||
_glfwInputWindowSize(window, width, height);
|
|
||||||
_glfwInputFramebufferSize(window, width, height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
int minwidth, int minheight,
|
int minwidth, int minheight,
|
||||||
int maxwidth, int maxheight)
|
int maxwidth, int maxheight)
|
||||||
{
|
{
|
||||||
int width = window->null.width;
|
|
||||||
int height = window->null.height;
|
|
||||||
applySizeLimits(window, &width, &height);
|
|
||||||
_glfwPlatformSetWindowSize(window, width, height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d)
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d)
|
||||||
{
|
{
|
||||||
int width = window->null.width;
|
|
||||||
int height = window->null.height;
|
|
||||||
applySizeLimits(window, &width, &height);
|
|
||||||
_glfwPlatformSetWindowSize(window, width, height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
@@ -267,28 +139,6 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
|
|||||||
int* left, int* top,
|
int* left, int* top,
|
||||||
int* right, int* bottom)
|
int* right, int* bottom)
|
||||||
{
|
{
|
||||||
if (window->null.decorated && !window->monitor)
|
|
||||||
{
|
|
||||||
if (left)
|
|
||||||
*left = 1;
|
|
||||||
if (top)
|
|
||||||
*top = 10;
|
|
||||||
if (right)
|
|
||||||
*right = 1;
|
|
||||||
if (bottom)
|
|
||||||
*bottom = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (left)
|
|
||||||
*left = 0;
|
|
||||||
if (top)
|
|
||||||
*top = 0;
|
|
||||||
if (right)
|
|
||||||
*right = 0;
|
|
||||||
if (bottom)
|
|
||||||
*bottom = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
||||||
@@ -302,93 +152,50 @@ void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
|||||||
|
|
||||||
void _glfwPlatformIconifyWindow(_GLFWwindow* window)
|
void _glfwPlatformIconifyWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfw.null.focusedWindow == window)
|
|
||||||
{
|
|
||||||
_glfw.null.focusedWindow = NULL;
|
|
||||||
_glfwInputWindowFocus(window, GLFW_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!window->null.iconified)
|
|
||||||
{
|
|
||||||
window->null.iconified = GLFW_TRUE;
|
|
||||||
_glfwInputWindowIconify(window, GLFW_TRUE);
|
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
releaseMonitor(window);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (window->null.iconified)
|
|
||||||
{
|
|
||||||
window->null.iconified = GLFW_FALSE;
|
|
||||||
_glfwInputWindowIconify(window, GLFW_FALSE);
|
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
acquireMonitor(window);
|
|
||||||
}
|
|
||||||
else if (window->null.maximized)
|
|
||||||
{
|
|
||||||
window->null.maximized = GLFW_FALSE;
|
|
||||||
_glfwInputWindowMaximize(window, GLFW_FALSE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
|
void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (!window->null.maximized)
|
|
||||||
{
|
|
||||||
window->null.maximized = GLFW_TRUE;
|
|
||||||
_glfwInputWindowMaximize(window, GLFW_TRUE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowMaximized(_GLFWwindow* window)
|
int _glfwPlatformWindowMaximized(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->null.maximized;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowHovered(_GLFWwindow* window)
|
int _glfwPlatformWindowHovered(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return _glfw.null.xcursor >= window->null.xpos &&
|
return GLFW_FALSE;
|
||||||
_glfw.null.ycursor >= window->null.ypos &&
|
|
||||||
_glfw.null.xcursor <= window->null.xpos + window->null.width - 1 &&
|
|
||||||
_glfw.null.ycursor <= window->null.ypos + window->null.height - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformFramebufferTransparent(_GLFWwindow* window)
|
int _glfwPlatformFramebufferTransparent(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->null.transparent;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
|
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
|
||||||
{
|
{
|
||||||
window->null.resizable = enabled;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)
|
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)
|
||||||
{
|
{
|
||||||
window->null.decorated = enabled;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
||||||
{
|
|
||||||
window->null.floating = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->null.opacity;
|
return 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
||||||
{
|
{
|
||||||
window->null.opacity = opacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
||||||
@@ -397,63 +204,43 @@ void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
|||||||
|
|
||||||
GLFWbool _glfwPlatformRawMouseMotionSupported(void)
|
GLFWbool _glfwPlatformRawMouseMotionSupported(void)
|
||||||
{
|
{
|
||||||
return GLFW_TRUE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
window->null.visible = GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window)
|
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
void _glfwPlatformUnhideWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfw.null.focusedWindow == window)
|
|
||||||
{
|
|
||||||
_glfw.null.focusedWindow = NULL;
|
|
||||||
_glfwInputWindowFocus(window, GLFW_FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window->null.visible = GLFW_FALSE;
|
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfw.null.focusedWindow == window)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!window->null.visible)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_GLFWwindow* previous = _glfw.null.focusedWindow;
|
|
||||||
_glfw.null.focusedWindow = window;
|
|
||||||
|
|
||||||
if (previous)
|
|
||||||
{
|
|
||||||
_glfwInputWindowFocus(previous, GLFW_FALSE);
|
|
||||||
if (previous->monitor && previous->autoIconify)
|
|
||||||
_glfwPlatformIconifyWindow(previous);
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwInputWindowFocus(window, GLFW_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return _glfw.null.focusedWindow == window;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowIconified(_GLFWwindow* window)
|
int _glfwPlatformWindowIconified(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->null.iconified;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowVisible(_GLFWwindow* window)
|
int _glfwPlatformWindowVisible(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->null.visible;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformPollEvents(void)
|
void _glfwPlatformPollEvents(void)
|
||||||
@@ -474,16 +261,10 @@ void _glfwPlatformPostEmptyEvent(void)
|
|||||||
|
|
||||||
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
||||||
{
|
{
|
||||||
if (xpos)
|
|
||||||
*xpos = _glfw.null.xcursor - window->null.xpos;
|
|
||||||
if (ypos)
|
|
||||||
*ypos = _glfw.null.ycursor - window->null.ypos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
|
||||||
{
|
{
|
||||||
_glfw.null.xcursor = window->null.xpos + (int) x;
|
|
||||||
_glfw.null.ycursor = window->null.ypos + (int) y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
|
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
|
||||||
@@ -512,140 +293,21 @@ void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)
|
|||||||
|
|
||||||
void _glfwPlatformSetClipboardString(const char* string)
|
void _glfwPlatformSetClipboardString(const char* string)
|
||||||
{
|
{
|
||||||
char* copy = _glfw_strdup(string);
|
|
||||||
free(_glfw.null.clipboardString);
|
|
||||||
_glfw.null.clipboardString = copy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* _glfwPlatformGetClipboardString(void)
|
const char* _glfwPlatformGetClipboardString(void)
|
||||||
{
|
{
|
||||||
return _glfw.null.clipboardString;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* _glfwPlatformGetScancodeName(int scancode)
|
const char* _glfwPlatformGetScancodeName(int scancode)
|
||||||
{
|
{
|
||||||
switch (scancode)
|
return "";
|
||||||
{
|
|
||||||
case GLFW_KEY_APOSTROPHE:
|
|
||||||
return "'";
|
|
||||||
case GLFW_KEY_COMMA:
|
|
||||||
return ",";
|
|
||||||
case GLFW_KEY_MINUS:
|
|
||||||
case GLFW_KEY_KP_SUBTRACT:
|
|
||||||
return "-";
|
|
||||||
case GLFW_KEY_PERIOD:
|
|
||||||
case GLFW_KEY_KP_DECIMAL:
|
|
||||||
return ".";
|
|
||||||
case GLFW_KEY_SLASH:
|
|
||||||
case GLFW_KEY_KP_DIVIDE:
|
|
||||||
return "/";
|
|
||||||
case GLFW_KEY_SEMICOLON:
|
|
||||||
return ";";
|
|
||||||
case GLFW_KEY_EQUAL:
|
|
||||||
case GLFW_KEY_KP_EQUAL:
|
|
||||||
return "=";
|
|
||||||
case GLFW_KEY_LEFT_BRACKET:
|
|
||||||
return "[";
|
|
||||||
case GLFW_KEY_RIGHT_BRACKET:
|
|
||||||
return "]";
|
|
||||||
case GLFW_KEY_KP_MULTIPLY:
|
|
||||||
return "*";
|
|
||||||
case GLFW_KEY_KP_ADD:
|
|
||||||
return "+";
|
|
||||||
case GLFW_KEY_BACKSLASH:
|
|
||||||
case GLFW_KEY_WORLD_1:
|
|
||||||
case GLFW_KEY_WORLD_2:
|
|
||||||
return "\\";
|
|
||||||
case GLFW_KEY_0:
|
|
||||||
case GLFW_KEY_KP_0:
|
|
||||||
return "0";
|
|
||||||
case GLFW_KEY_1:
|
|
||||||
case GLFW_KEY_KP_1:
|
|
||||||
return "1";
|
|
||||||
case GLFW_KEY_2:
|
|
||||||
case GLFW_KEY_KP_2:
|
|
||||||
return "2";
|
|
||||||
case GLFW_KEY_3:
|
|
||||||
case GLFW_KEY_KP_3:
|
|
||||||
return "3";
|
|
||||||
case GLFW_KEY_4:
|
|
||||||
case GLFW_KEY_KP_4:
|
|
||||||
return "4";
|
|
||||||
case GLFW_KEY_5:
|
|
||||||
case GLFW_KEY_KP_5:
|
|
||||||
return "5";
|
|
||||||
case GLFW_KEY_6:
|
|
||||||
case GLFW_KEY_KP_6:
|
|
||||||
return "6";
|
|
||||||
case GLFW_KEY_7:
|
|
||||||
case GLFW_KEY_KP_7:
|
|
||||||
return "7";
|
|
||||||
case GLFW_KEY_8:
|
|
||||||
case GLFW_KEY_KP_8:
|
|
||||||
return "8";
|
|
||||||
case GLFW_KEY_9:
|
|
||||||
case GLFW_KEY_KP_9:
|
|
||||||
return "9";
|
|
||||||
case GLFW_KEY_A:
|
|
||||||
return "a";
|
|
||||||
case GLFW_KEY_B:
|
|
||||||
return "b";
|
|
||||||
case GLFW_KEY_C:
|
|
||||||
return "c";
|
|
||||||
case GLFW_KEY_D:
|
|
||||||
return "d";
|
|
||||||
case GLFW_KEY_E:
|
|
||||||
return "e";
|
|
||||||
case GLFW_KEY_F:
|
|
||||||
return "f";
|
|
||||||
case GLFW_KEY_G:
|
|
||||||
return "g";
|
|
||||||
case GLFW_KEY_H:
|
|
||||||
return "h";
|
|
||||||
case GLFW_KEY_I:
|
|
||||||
return "i";
|
|
||||||
case GLFW_KEY_J:
|
|
||||||
return "j";
|
|
||||||
case GLFW_KEY_K:
|
|
||||||
return "k";
|
|
||||||
case GLFW_KEY_L:
|
|
||||||
return "l";
|
|
||||||
case GLFW_KEY_M:
|
|
||||||
return "m";
|
|
||||||
case GLFW_KEY_N:
|
|
||||||
return "n";
|
|
||||||
case GLFW_KEY_O:
|
|
||||||
return "o";
|
|
||||||
case GLFW_KEY_P:
|
|
||||||
return "p";
|
|
||||||
case GLFW_KEY_Q:
|
|
||||||
return "q";
|
|
||||||
case GLFW_KEY_R:
|
|
||||||
return "r";
|
|
||||||
case GLFW_KEY_S:
|
|
||||||
return "s";
|
|
||||||
case GLFW_KEY_T:
|
|
||||||
return "t";
|
|
||||||
case GLFW_KEY_U:
|
|
||||||
return "u";
|
|
||||||
case GLFW_KEY_V:
|
|
||||||
return "v";
|
|
||||||
case GLFW_KEY_W:
|
|
||||||
return "w";
|
|
||||||
case GLFW_KEY_X:
|
|
||||||
return "x";
|
|
||||||
case GLFW_KEY_Y:
|
|
||||||
return "y";
|
|
||||||
case GLFW_KEY_Z:
|
|
||||||
return "z";
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformGetKeyScancode(int key)
|
int _glfwPlatformGetKeyScancode(int key)
|
||||||
{
|
{
|
||||||
return key;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
@@ -665,6 +327,6 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
|
|||||||
VkSurfaceKHR* surface)
|
VkSurfaceKHR* surface)
|
||||||
{
|
{
|
||||||
// This seems like the most appropriate error to return here
|
// This seems like the most appropriate error to return here
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
return VK_ERROR_INITIALIZATION_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 OSMesa - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -302,6 +302,12 @@ GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* handle, int* width,
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!OSMesaGetColorBuffer(window->context.osmesa.handle,
|
if (!OSMesaGetColorBuffer(window->context.osmesa.handle,
|
||||||
&mesaWidth, &mesaHeight,
|
&mesaWidth, &mesaHeight,
|
||||||
&mesaFormat, &mesaBuffer))
|
&mesaFormat, &mesaBuffer))
|
||||||
@@ -335,6 +341,12 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* handle,
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!OSMesaGetDepthBuffer(window->context.osmesa.handle,
|
if (!OSMesaGetDepthBuffer(window->context.osmesa.handle,
|
||||||
&mesaWidth, &mesaHeight,
|
&mesaWidth, &mesaHeight,
|
||||||
&mesaBytes, &mesaBuffer))
|
&mesaBytes, &mesaBuffer))
|
||||||
@@ -361,7 +373,7 @@ GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_OSMESA_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 OSMesa - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -54,6 +54,10 @@ typedef GLFWglproc (GLAPIENTRY * PFN_OSMesaGetProcAddress)(const char*);
|
|||||||
#define OSMesaGetDepthBuffer _glfw.osmesa.GetDepthBuffer
|
#define OSMesaGetDepthBuffer _glfw.osmesa.GetDepthBuffer
|
||||||
#define OSMesaGetProcAddress _glfw.osmesa.GetProcAddress
|
#define OSMesaGetProcAddress _glfw.osmesa.GetProcAddress
|
||||||
|
|
||||||
|
#define _GLFW_OSMESA_CONTEXT_STATE _GLFWcontextOSMesa osmesa
|
||||||
|
#define _GLFW_OSMESA_LIBRARY_CONTEXT_STATE _GLFWlibraryOSMesa osmesa
|
||||||
|
|
||||||
|
|
||||||
// OSMesa-specific per-context data
|
// OSMesa-specific per-context data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWcontextOSMesa
|
typedef struct _GLFWcontextOSMesa
|
||||||
@@ -62,7 +66,6 @@ typedef struct _GLFWcontextOSMesa
|
|||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
void* buffer;
|
void* buffer;
|
||||||
|
|
||||||
} _GLFWcontextOSMesa;
|
} _GLFWcontextOSMesa;
|
||||||
|
|
||||||
// OSMesa-specific global data
|
// OSMesa-specific global data
|
||||||
@@ -78,7 +81,6 @@ typedef struct _GLFWlibraryOSMesa
|
|||||||
PFN_OSMesaGetColorBuffer GetColorBuffer;
|
PFN_OSMesaGetColorBuffer GetColorBuffer;
|
||||||
PFN_OSMesaGetDepthBuffer GetDepthBuffer;
|
PFN_OSMesaGetDepthBuffer GetDepthBuffer;
|
||||||
PFN_OSMesaGetProcAddress GetProcAddress;
|
PFN_OSMesaGetProcAddress GetProcAddress;
|
||||||
|
|
||||||
} _GLFWlibraryOSMesa;
|
} _GLFWlibraryOSMesa;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.3 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
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -37,7 +37,6 @@ typedef struct _GLFWtlsPOSIX
|
|||||||
{
|
{
|
||||||
GLFWbool allocated;
|
GLFWbool allocated;
|
||||||
pthread_key_t key;
|
pthread_key_t key;
|
||||||
|
|
||||||
} _GLFWtlsPOSIX;
|
} _GLFWtlsPOSIX;
|
||||||
|
|
||||||
// POSIX-specific mutex data
|
// POSIX-specific mutex data
|
||||||
@@ -46,6 +45,5 @@ typedef struct _GLFWmutexPOSIX
|
|||||||
{
|
{
|
||||||
GLFWbool allocated;
|
GLFWbool allocated;
|
||||||
pthread_mutex_t handle;
|
pthread_mutex_t handle;
|
||||||
|
|
||||||
} _GLFWmutexPOSIX;
|
} _GLFWmutexPOSIX;
|
||||||
|
|
||||||
|
|||||||
+3
-6
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -27,11 +27,8 @@
|
|||||||
// It is fine to use C99 in this file because it will not be built with VS
|
// It is fine to use C99 in this file because it will not be built with VS
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#define _POSIX_C_SOURCE 199309L
|
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@@ -44,7 +41,7 @@
|
|||||||
//
|
//
|
||||||
void _glfwInitTimerPOSIX(void)
|
void _glfwInitTimerPOSIX(void)
|
||||||
{
|
{
|
||||||
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
|
#if defined(CLOCK_MONOTONIC)
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
|
||||||
@@ -67,7 +64,7 @@ void _glfwInitTimerPOSIX(void)
|
|||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerValue(void)
|
uint64_t _glfwPlatformGetTimerValue(void)
|
||||||
{
|
{
|
||||||
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
|
#if defined(CLOCK_MONOTONIC)
|
||||||
if (_glfw.timer.posix.monotonic)
|
if (_glfw.timer.posix.monotonic)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
|||||||
+1
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 POSIX - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -36,7 +36,6 @@ typedef struct _GLFWtimerPOSIX
|
|||||||
{
|
{
|
||||||
GLFWbool monotonic;
|
GLFWbool monotonic;
|
||||||
uint64_t frequency;
|
uint64_t frequency;
|
||||||
|
|
||||||
} _GLFWtimerPOSIX;
|
} _GLFWtimerPOSIX;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
|
|||||||
+8
-6
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 WGL - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -165,6 +165,9 @@ static int choosePixelFormat(_GLFWwindow* window,
|
|||||||
if (findAttribValue(WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB)
|
if (findAttribValue(WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (findAttribValue(WGL_DOUBLE_BUFFER_ARB) != fbconfig->doublebuffer)
|
||||||
|
continue;
|
||||||
|
|
||||||
u->redBits = findAttribValue(WGL_RED_BITS_ARB);
|
u->redBits = findAttribValue(WGL_RED_BITS_ARB);
|
||||||
u->greenBits = findAttribValue(WGL_GREEN_BITS_ARB);
|
u->greenBits = findAttribValue(WGL_GREEN_BITS_ARB);
|
||||||
u->blueBits = findAttribValue(WGL_BLUE_BITS_ARB);
|
u->blueBits = findAttribValue(WGL_BLUE_BITS_ARB);
|
||||||
@@ -182,8 +185,6 @@ static int choosePixelFormat(_GLFWwindow* window,
|
|||||||
|
|
||||||
if (findAttribValue(WGL_STEREO_ARB))
|
if (findAttribValue(WGL_STEREO_ARB))
|
||||||
u->stereo = GLFW_TRUE;
|
u->stereo = GLFW_TRUE;
|
||||||
if (findAttribValue(WGL_DOUBLE_BUFFER_ARB))
|
|
||||||
u->doublebuffer = GLFW_TRUE;
|
|
||||||
|
|
||||||
if (_glfw.wgl.ARB_multisample)
|
if (_glfw.wgl.ARB_multisample)
|
||||||
u->samples = findAttribValue(WGL_SAMPLES_ARB);
|
u->samples = findAttribValue(WGL_SAMPLES_ARB);
|
||||||
@@ -239,6 +240,9 @@ static int choosePixelFormat(_GLFWwindow* window,
|
|||||||
if (pfd.iPixelType != PFD_TYPE_RGBA)
|
if (pfd.iPixelType != PFD_TYPE_RGBA)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!!(pfd.dwFlags & PFD_DOUBLEBUFFER) != fbconfig->doublebuffer)
|
||||||
|
continue;
|
||||||
|
|
||||||
u->redBits = pfd.cRedBits;
|
u->redBits = pfd.cRedBits;
|
||||||
u->greenBits = pfd.cGreenBits;
|
u->greenBits = pfd.cGreenBits;
|
||||||
u->blueBits = pfd.cBlueBits;
|
u->blueBits = pfd.cBlueBits;
|
||||||
@@ -256,8 +260,6 @@ static int choosePixelFormat(_GLFWwindow* window,
|
|||||||
|
|
||||||
if (pfd.dwFlags & PFD_STEREO)
|
if (pfd.dwFlags & PFD_STEREO)
|
||||||
u->stereo = GLFW_TRUE;
|
u->stereo = GLFW_TRUE;
|
||||||
if (pfd.dwFlags & PFD_DOUBLEBUFFER)
|
|
||||||
u->doublebuffer = GLFW_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u->handle = pixelFormat;
|
u->handle = pixelFormat;
|
||||||
@@ -785,7 +787,7 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* handle)
|
|||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
if (window->context.client == GLFW_NO_API)
|
if (window->context.source != GLFW_NATIVE_CONTEXT_API)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
+1
-3
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 WGL - www.glfw.org
|
// GLFW 3.3 WGL - 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>
|
||||||
@@ -115,7 +115,6 @@ typedef struct _GLFWcontextWGL
|
|||||||
HDC dc;
|
HDC dc;
|
||||||
HGLRC handle;
|
HGLRC handle;
|
||||||
int interval;
|
int interval;
|
||||||
|
|
||||||
} _GLFWcontextWGL;
|
} _GLFWcontextWGL;
|
||||||
|
|
||||||
// WGL-specific global data
|
// WGL-specific global data
|
||||||
@@ -148,7 +147,6 @@ typedef struct _GLFWlibraryWGL
|
|||||||
GLFWbool ARB_create_context_robustness;
|
GLFWbool ARB_create_context_robustness;
|
||||||
GLFWbool ARB_create_context_no_error;
|
GLFWbool ARB_create_context_no_error;
|
||||||
GLFWbool ARB_context_flush_control;
|
GLFWbool ARB_context_flush_control;
|
||||||
|
|
||||||
} _GLFWlibraryWGL;
|
} _GLFWlibraryWGL;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+8
-15
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -39,6 +39,10 @@ static const GUID _glfw_GUID_DEVINTERFACE_HID =
|
|||||||
|
|
||||||
#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG)
|
#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG)
|
||||||
|
|
||||||
|
#if defined(_GLFW_BUILD_DLL)
|
||||||
|
#pragma message("These symbols must be exported by the executable and have no effect in a DLL")
|
||||||
|
#endif
|
||||||
|
|
||||||
// Executables (but not DLLs) exporting this symbol with this value will be
|
// Executables (but not DLLs) exporting this symbol with this value will be
|
||||||
// automatically directed to the high-performance GPU on Nvidia Optimus systems
|
// automatically directed to the high-performance GPU on Nvidia Optimus systems
|
||||||
// with up-to-date drivers
|
// with up-to-date drivers
|
||||||
@@ -68,17 +72,6 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
|||||||
//
|
//
|
||||||
static GLFWbool loadLibraries(void)
|
static GLFWbool loadLibraries(void)
|
||||||
{
|
{
|
||||||
_glfw.win32.winmm.instance = LoadLibraryA("winmm.dll");
|
|
||||||
if (!_glfw.win32.winmm.instance)
|
|
||||||
{
|
|
||||||
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR,
|
|
||||||
"Win32: Failed to load winmm.dll");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.win32.winmm.GetTime = (PFN_timeGetTime)
|
|
||||||
GetProcAddress(_glfw.win32.winmm.instance, "timeGetTime");
|
|
||||||
|
|
||||||
_glfw.win32.user32.instance = LoadLibraryA("user32.dll");
|
_glfw.win32.user32.instance = LoadLibraryA("user32.dll");
|
||||||
if (!_glfw.win32.user32.instance)
|
if (!_glfw.win32.user32.instance)
|
||||||
{
|
{
|
||||||
@@ -176,9 +169,6 @@ static void freeLibraries(void)
|
|||||||
if (_glfw.win32.dinput8.instance)
|
if (_glfw.win32.dinput8.instance)
|
||||||
FreeLibrary(_glfw.win32.dinput8.instance);
|
FreeLibrary(_glfw.win32.dinput8.instance);
|
||||||
|
|
||||||
if (_glfw.win32.winmm.instance)
|
|
||||||
FreeLibrary(_glfw.win32.winmm.instance);
|
|
||||||
|
|
||||||
if (_glfw.win32.user32.instance)
|
if (_glfw.win32.user32.instance)
|
||||||
FreeLibrary(_glfw.win32.user32.instance);
|
FreeLibrary(_glfw.win32.user32.instance);
|
||||||
|
|
||||||
@@ -582,6 +572,7 @@ int _glfwPlatformInit(void)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
_glfwInitTimerWin32();
|
_glfwInitTimerWin32();
|
||||||
|
_glfwInitJoysticksWin32();
|
||||||
|
|
||||||
_glfwPollMonitorsWin32();
|
_glfwPollMonitorsWin32();
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
@@ -608,6 +599,8 @@ void _glfwPlatformTerminate(void)
|
|||||||
_glfwTerminateWGL();
|
_glfwTerminateWGL();
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
|
|
||||||
|
_glfwTerminateJoysticksWin32();
|
||||||
|
|
||||||
freeLibraries();
|
freeLibraries();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+34
-32
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -491,6 +491,39 @@ static BOOL CALLBACK deviceCallback(const DIDEVICEINSTANCE* di, void* user)
|
|||||||
////// GLFW internal API //////
|
////// GLFW internal API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Initialize joystick interface
|
||||||
|
//
|
||||||
|
void _glfwInitJoysticksWin32(void)
|
||||||
|
{
|
||||||
|
if (_glfw.win32.dinput8.instance)
|
||||||
|
{
|
||||||
|
if (FAILED(DirectInput8Create(GetModuleHandle(NULL),
|
||||||
|
DIRECTINPUT_VERSION,
|
||||||
|
&IID_IDirectInput8W,
|
||||||
|
(void**) &_glfw.win32.dinput8.api,
|
||||||
|
NULL)))
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Win32: Failed to create interface");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwDetectJoystickConnectionWin32();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close all opened joystick handles
|
||||||
|
//
|
||||||
|
void _glfwTerminateJoysticksWin32(void)
|
||||||
|
{
|
||||||
|
int jid;
|
||||||
|
|
||||||
|
for (jid = GLFW_JOYSTICK_1; jid <= GLFW_JOYSTICK_LAST; jid++)
|
||||||
|
closeJoystick(_glfw.joysticks + jid);
|
||||||
|
|
||||||
|
if (_glfw.win32.dinput8.api)
|
||||||
|
IDirectInput8_Release(_glfw.win32.dinput8.api);
|
||||||
|
}
|
||||||
|
|
||||||
// Checks for new joysticks after DBT_DEVICEARRIVAL
|
// Checks for new joysticks after DBT_DEVICEARRIVAL
|
||||||
//
|
//
|
||||||
void _glfwDetectJoystickConnectionWin32(void)
|
void _glfwDetectJoystickConnectionWin32(void)
|
||||||
@@ -570,37 +603,6 @@ void _glfwDetectJoystickDisconnectionWin32(void)
|
|||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
GLFWbool _glfwPlatformInitJoysticks(void)
|
|
||||||
{
|
|
||||||
if (_glfw.win32.dinput8.instance)
|
|
||||||
{
|
|
||||||
if (FAILED(DirectInput8Create(GetModuleHandle(NULL),
|
|
||||||
DIRECTINPUT_VERSION,
|
|
||||||
&IID_IDirectInput8W,
|
|
||||||
(void**) &_glfw.win32.dinput8.api,
|
|
||||||
NULL)))
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Win32: Failed to create interface");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwDetectJoystickConnectionWin32();
|
|
||||||
return GLFW_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformTerminateJoysticks(void)
|
|
||||||
{
|
|
||||||
int jid;
|
|
||||||
|
|
||||||
for (jid = GLFW_JOYSTICK_1; jid <= GLFW_JOYSTICK_LAST; jid++)
|
|
||||||
closeJoystick(_glfw.joysticks + jid);
|
|
||||||
|
|
||||||
if (_glfw.win32.dinput8.api)
|
|
||||||
IDirectInput8_Release(_glfw.win32.dinput8.api);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)
|
||||||
{
|
{
|
||||||
if (js->win32.device)
|
if (js->win32.device)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
|
||||||
//
|
//
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE struct { int dummyLibraryJoystick; }
|
#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE struct { int dummyLibraryJoystick; }
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_MAPPING_NAME "Windows"
|
#define _GLFW_PLATFORM_MAPPING_NAME "Windows"
|
||||||
|
#define GLFW_BUILD_WIN32_MAPPINGS
|
||||||
|
|
||||||
// Joystick element (axis, button or slider)
|
// Joystick element (axis, button or slider)
|
||||||
//
|
//
|
||||||
@@ -48,6 +49,9 @@ typedef struct _GLFWjoystickWin32
|
|||||||
GUID guid;
|
GUID guid;
|
||||||
} _GLFWjoystickWin32;
|
} _GLFWjoystickWin32;
|
||||||
|
|
||||||
|
|
||||||
|
void _glfwInitJoysticksWin32(void);
|
||||||
|
void _glfwTerminateJoysticksWin32(void);
|
||||||
void _glfwDetectJoystickConnectionWin32(void);
|
void _glfwDetectJoystickConnectionWin32(void);
|
||||||
void _glfwDetectJoystickDisconnectionWin32(void);
|
void _glfwDetectJoystickDisconnectionWin32(void);
|
||||||
|
|
||||||
|
|||||||
+13
-2
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -318,8 +318,19 @@ void _glfwGetMonitorContentScaleWin32(HMONITOR handle, float* xscale, float* ysc
|
|||||||
{
|
{
|
||||||
UINT xdpi, ydpi;
|
UINT xdpi, ydpi;
|
||||||
|
|
||||||
|
if (xscale)
|
||||||
|
*xscale = 0.f;
|
||||||
|
if (yscale)
|
||||||
|
*yscale = 0.f;
|
||||||
|
|
||||||
if (IsWindows8Point1OrGreater())
|
if (IsWindows8Point1OrGreater())
|
||||||
GetDpiForMonitor(handle, MDT_EFFECTIVE_DPI, &xdpi, &ydpi);
|
{
|
||||||
|
if (GetDpiForMonitor(handle, MDT_EFFECTIVE_DPI, &xdpi, &ydpi) != S_OK)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to query monitor DPI");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const HDC dc = GetDC(NULL);
|
const HDC dc = GetDC(NULL);
|
||||||
|
|||||||
+14
-21
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -39,8 +39,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||||
// example to allow applications to correctly declare a GL_ARB_debug_output
|
// example to allow applications to correctly declare a GL_KHR_debug callback)
|
||||||
// callback) but windows.h assumes no one will define APIENTRY before it does
|
// but windows.h assumes no one will define APIENTRY before it does
|
||||||
#undef APIENTRY
|
#undef APIENTRY
|
||||||
|
|
||||||
// GLFW on Windows is Unicode only and does not work in MBCS mode
|
// GLFW on Windows is Unicode only and does not work in MBCS mode
|
||||||
@@ -163,6 +163,9 @@ typedef enum
|
|||||||
#endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/
|
#endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/
|
||||||
|
|
||||||
// HACK: Define versionhelpers.h functions manually as MinGW lacks the header
|
// HACK: Define versionhelpers.h functions manually as MinGW lacks the header
|
||||||
|
#define IsWindowsXPOrGreater() \
|
||||||
|
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINXP), \
|
||||||
|
LOBYTE(_WIN32_WINNT_WINXP), 0)
|
||||||
#define IsWindowsVistaOrGreater() \
|
#define IsWindowsVistaOrGreater() \
|
||||||
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA), \
|
_glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA), \
|
||||||
LOBYTE(_WIN32_WINNT_VISTA), 0)
|
LOBYTE(_WIN32_WINNT_VISTA), 0)
|
||||||
@@ -215,10 +218,6 @@ typedef enum
|
|||||||
#define DIDFT_OPTIONAL 0x80000000
|
#define DIDFT_OPTIONAL 0x80000000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// winmm.dll function pointer typedefs
|
|
||||||
typedef DWORD (WINAPI * PFN_timeGetTime)(void);
|
|
||||||
#define timeGetTime _glfw.win32.winmm.GetTime
|
|
||||||
|
|
||||||
// xinput.dll function pointer typedefs
|
// xinput.dll function pointer typedefs
|
||||||
typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
|
typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
|
||||||
typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
|
typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
|
||||||
@@ -279,6 +278,8 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(
|
|||||||
|
|
||||||
#include "win32_joystick.h"
|
#include "win32_joystick.h"
|
||||||
#include "wgl_context.h"
|
#include "wgl_context.h"
|
||||||
|
#include "egl_context.h"
|
||||||
|
#include "osmesa_context.h"
|
||||||
|
|
||||||
#if !defined(_GLFW_WNDCLASSNAME)
|
#if !defined(_GLFW_WNDCLASSNAME)
|
||||||
#define _GLFW_WNDCLASSNAME L"GLFW30"
|
#define _GLFW_WNDCLASSNAME L"GLFW30"
|
||||||
@@ -288,6 +289,9 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(
|
|||||||
#define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle)
|
#define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle)
|
||||||
#define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name)
|
#define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name)
|
||||||
|
|
||||||
|
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->win32.handle)
|
||||||
|
#define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 win32
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 win32
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32
|
||||||
#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerWin32 win32
|
#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerWin32 win32
|
||||||
@@ -312,13 +316,14 @@ typedef struct _GLFWwindowWin32
|
|||||||
// Whether to enable framebuffer transparency on DWM
|
// Whether to enable framebuffer transparency on DWM
|
||||||
GLFWbool transparent;
|
GLFWbool transparent;
|
||||||
GLFWbool scaleToMonitor;
|
GLFWbool scaleToMonitor;
|
||||||
GLFWbool keymenu;
|
|
||||||
|
// Cached size used to filter out duplicate events
|
||||||
|
int width, height;
|
||||||
|
|
||||||
// The last received cursor position, regardless of source
|
// The last received cursor position, regardless of source
|
||||||
int lastCursorPosX, lastCursorPosY;
|
int lastCursorPosX, lastCursorPosY;
|
||||||
// The last recevied high surrogate when decoding pairs of UTF-16 messages
|
// The last recevied high surrogate when decoding pairs of UTF-16 messages
|
||||||
WCHAR highSurrogate;
|
WCHAR highSurrogate;
|
||||||
|
|
||||||
} _GLFWwindowWin32;
|
} _GLFWwindowWin32;
|
||||||
|
|
||||||
// Win32-specific global data
|
// Win32-specific global data
|
||||||
@@ -341,11 +346,6 @@ typedef struct _GLFWlibraryWin32
|
|||||||
int rawInputSize;
|
int rawInputSize;
|
||||||
UINT mouseTrailSize;
|
UINT mouseTrailSize;
|
||||||
|
|
||||||
struct {
|
|
||||||
HINSTANCE instance;
|
|
||||||
PFN_timeGetTime GetTime;
|
|
||||||
} winmm;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
PFN_DirectInput8Create Create;
|
PFN_DirectInput8Create Create;
|
||||||
@@ -386,7 +386,6 @@ typedef struct _GLFWlibraryWin32
|
|||||||
HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_;
|
PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_;
|
||||||
} ntdll;
|
} ntdll;
|
||||||
|
|
||||||
} _GLFWlibraryWin32;
|
} _GLFWlibraryWin32;
|
||||||
|
|
||||||
// Win32-specific per-monitor data
|
// Win32-specific per-monitor data
|
||||||
@@ -401,7 +400,6 @@ typedef struct _GLFWmonitorWin32
|
|||||||
char publicDisplayName[32];
|
char publicDisplayName[32];
|
||||||
GLFWbool modesPruned;
|
GLFWbool modesPruned;
|
||||||
GLFWbool modeChanged;
|
GLFWbool modeChanged;
|
||||||
|
|
||||||
} _GLFWmonitorWin32;
|
} _GLFWmonitorWin32;
|
||||||
|
|
||||||
// Win32-specific per-cursor data
|
// Win32-specific per-cursor data
|
||||||
@@ -409,16 +407,13 @@ typedef struct _GLFWmonitorWin32
|
|||||||
typedef struct _GLFWcursorWin32
|
typedef struct _GLFWcursorWin32
|
||||||
{
|
{
|
||||||
HCURSOR handle;
|
HCURSOR handle;
|
||||||
|
|
||||||
} _GLFWcursorWin32;
|
} _GLFWcursorWin32;
|
||||||
|
|
||||||
// Win32-specific global timer data
|
// Win32-specific global timer data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWtimerWin32
|
typedef struct _GLFWtimerWin32
|
||||||
{
|
{
|
||||||
GLFWbool hasPC;
|
|
||||||
uint64_t frequency;
|
uint64_t frequency;
|
||||||
|
|
||||||
} _GLFWtimerWin32;
|
} _GLFWtimerWin32;
|
||||||
|
|
||||||
// Win32-specific thread local storage data
|
// Win32-specific thread local storage data
|
||||||
@@ -427,7 +422,6 @@ typedef struct _GLFWtlsWin32
|
|||||||
{
|
{
|
||||||
GLFWbool allocated;
|
GLFWbool allocated;
|
||||||
DWORD index;
|
DWORD index;
|
||||||
|
|
||||||
} _GLFWtlsWin32;
|
} _GLFWtlsWin32;
|
||||||
|
|
||||||
// Win32-specific mutex data
|
// Win32-specific mutex data
|
||||||
@@ -436,7 +430,6 @@ typedef struct _GLFWmutexWin32
|
|||||||
{
|
{
|
||||||
GLFWbool allocated;
|
GLFWbool allocated;
|
||||||
CRITICAL_SECTION section;
|
CRITICAL_SECTION section;
|
||||||
|
|
||||||
} _GLFWmutexWin32;
|
} _GLFWmutexWin32;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
|
|||||||
+2
-18
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -38,18 +38,7 @@
|
|||||||
//
|
//
|
||||||
void _glfwInitTimerWin32(void)
|
void _glfwInitTimerWin32(void)
|
||||||
{
|
{
|
||||||
uint64_t frequency;
|
QueryPerformanceFrequency((LARGE_INTEGER*) &_glfw.timer.win32.frequency);
|
||||||
|
|
||||||
if (QueryPerformanceFrequency((LARGE_INTEGER*) &frequency))
|
|
||||||
{
|
|
||||||
_glfw.timer.win32.hasPC = GLFW_TRUE;
|
|
||||||
_glfw.timer.win32.frequency = frequency;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfw.timer.win32.hasPC = GLFW_FALSE;
|
|
||||||
_glfw.timer.win32.frequency = 1000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -58,16 +47,11 @@ void _glfwInitTimerWin32(void)
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerValue(void)
|
uint64_t _glfwPlatformGetTimerValue(void)
|
||||||
{
|
|
||||||
if (_glfw.timer.win32.hasPC)
|
|
||||||
{
|
{
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
QueryPerformanceCounter((LARGE_INTEGER*) &value);
|
QueryPerformanceCounter((LARGE_INTEGER*) &value);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return (uint64_t) timeGetTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerFrequency(void)
|
uint64_t _glfwPlatformGetTimerFrequency(void)
|
||||||
{
|
{
|
||||||
|
|||||||
+48
-125
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Win32 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -454,9 +454,12 @@ static void acquireMonitor(_GLFWwindow* window)
|
|||||||
|
|
||||||
// HACK: When mouse trails are enabled the cursor becomes invisible when
|
// HACK: When mouse trails are enabled the cursor becomes invisible when
|
||||||
// the OpenGL ICD switches to page flipping
|
// the OpenGL ICD switches to page flipping
|
||||||
|
if (IsWindowsXPOrGreater())
|
||||||
|
{
|
||||||
SystemParametersInfo(SPI_GETMOUSETRAILS, 0, &_glfw.win32.mouseTrailSize, 0);
|
SystemParametersInfo(SPI_GETMOUSETRAILS, 0, &_glfw.win32.mouseTrailSize, 0);
|
||||||
SystemParametersInfo(SPI_SETMOUSETRAILS, 0, 0, 0);
|
SystemParametersInfo(SPI_SETMOUSETRAILS, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!window->monitor->window)
|
if (!window->monitor->window)
|
||||||
_glfw.win32.acquiredMonitorCount++;
|
_glfw.win32.acquiredMonitorCount++;
|
||||||
@@ -478,6 +481,7 @@ static void releaseMonitor(_GLFWwindow* window)
|
|||||||
SetThreadExecutionState(ES_CONTINUOUS);
|
SetThreadExecutionState(ES_CONTINUOUS);
|
||||||
|
|
||||||
// HACK: Restore mouse trail length saved in acquireMonitor
|
// HACK: Restore mouse trail length saved in acquireMonitor
|
||||||
|
if (IsWindowsXPOrGreater())
|
||||||
SystemParametersInfo(SPI_SETMOUSETRAILS, _glfw.win32.mouseTrailSize, 0, 0);
|
SystemParametersInfo(SPI_SETMOUSETRAILS, _glfw.win32.mouseTrailSize, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,7 +505,17 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
case WM_NCCREATE:
|
case WM_NCCREATE:
|
||||||
{
|
{
|
||||||
if (_glfwIsWindows10AnniversaryUpdateOrGreaterWin32())
|
if (_glfwIsWindows10AnniversaryUpdateOrGreaterWin32())
|
||||||
|
{
|
||||||
|
const CREATESTRUCTW* cs = (const CREATESTRUCTW*) lParam;
|
||||||
|
const _GLFWwndconfig* wndconfig = cs->lpCreateParams;
|
||||||
|
|
||||||
|
// On per-monitor DPI aware V1 systems, only enable
|
||||||
|
// non-client scaling for windows that scale the client area
|
||||||
|
// We need WM_GETDPISCALEDSIZE from V2 to keep the client
|
||||||
|
// area static when the non-client area is scaled
|
||||||
|
if (wndconfig && wndconfig->scaleToMonitor)
|
||||||
EnableNonClientDpiScaling(hWnd);
|
EnableNonClientDpiScaling(hWnd);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -512,9 +526,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
case WM_DEVICECHANGE:
|
case WM_DEVICECHANGE:
|
||||||
{
|
{
|
||||||
if (!_glfw.joysticksInitialized)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (wParam == DBT_DEVICEARRIVAL)
|
if (wParam == DBT_DEVICEARRIVAL)
|
||||||
{
|
{
|
||||||
DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam;
|
DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam;
|
||||||
@@ -611,12 +622,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
// User trying to access application menu using ALT?
|
// User trying to access application menu using ALT?
|
||||||
case SC_KEYMENU:
|
case SC_KEYMENU:
|
||||||
{
|
|
||||||
if (!window->win32.keymenu)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -658,9 +664,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
_glfwInputChar(window, codepoint, getKeyMods(), uMsg != WM_SYSCHAR);
|
_glfwInputChar(window, codepoint, getKeyMods(), uMsg != WM_SYSCHAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uMsg == WM_SYSCHAR && window->win32.keymenu)
|
|
||||||
break;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -961,6 +964,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
{
|
{
|
||||||
|
const int width = LOWORD(lParam);
|
||||||
|
const int height = HIWORD(lParam);
|
||||||
const GLFWbool iconified = wParam == SIZE_MINIMIZED;
|
const GLFWbool iconified = wParam == SIZE_MINIMIZED;
|
||||||
const GLFWbool maximized = wParam == SIZE_MAXIMIZED ||
|
const GLFWbool maximized = wParam == SIZE_MAXIMIZED ||
|
||||||
(window->win32.maximized &&
|
(window->win32.maximized &&
|
||||||
@@ -975,8 +980,14 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
if (window->win32.maximized != maximized)
|
if (window->win32.maximized != maximized)
|
||||||
_glfwInputWindowMaximize(window, maximized);
|
_glfwInputWindowMaximize(window, maximized);
|
||||||
|
|
||||||
_glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam));
|
if (width != window->win32.width || height != window->win32.height)
|
||||||
_glfwInputWindowSize(window, LOWORD(lParam), HIWORD(lParam));
|
{
|
||||||
|
window->win32.width = width;
|
||||||
|
window->win32.height = height;
|
||||||
|
|
||||||
|
_glfwInputFramebufferSize(window, width, height);
|
||||||
|
_glfwInputWindowSize(window, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
if (window->monitor && window->win32.iconified != iconified)
|
if (window->monitor && window->win32.iconified != iconified)
|
||||||
{
|
{
|
||||||
@@ -1130,9 +1141,11 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
const float xscale = HIWORD(wParam) / (float) USER_DEFAULT_SCREEN_DPI;
|
const float xscale = HIWORD(wParam) / (float) USER_DEFAULT_SCREEN_DPI;
|
||||||
const float yscale = LOWORD(wParam) / (float) USER_DEFAULT_SCREEN_DPI;
|
const float yscale = LOWORD(wParam) / (float) USER_DEFAULT_SCREEN_DPI;
|
||||||
|
|
||||||
// Only apply the suggested size if the OS is new enough to have
|
// Resize windowed mode windows that either permit rescaling or that
|
||||||
// sent a WM_GETDPISCALEDSIZE before this
|
// need it to compensate for non-client area scaling
|
||||||
if (_glfwIsWindows10CreatorsUpdateOrGreaterWin32())
|
if (!window->monitor &&
|
||||||
|
(window->win32.scaleToMonitor ||
|
||||||
|
_glfwIsWindows10CreatorsUpdateOrGreaterWin32()))
|
||||||
{
|
{
|
||||||
RECT* suggested = (RECT*) lParam;
|
RECT* suggested = (RECT*) lParam;
|
||||||
SetWindowPos(window->win32.handle, HWND_TOP,
|
SetWindowPos(window->win32.handle, HWND_TOP,
|
||||||
@@ -1247,7 +1260,7 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
NULL, // No parent window
|
NULL, // No parent window
|
||||||
NULL, // No window menu
|
NULL, // No window menu
|
||||||
GetModuleHandleW(NULL),
|
GetModuleHandleW(NULL),
|
||||||
NULL);
|
(LPVOID) wndconfig);
|
||||||
|
|
||||||
free(wideTitle);
|
free(wideTitle);
|
||||||
|
|
||||||
@@ -1271,7 +1284,6 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
window->win32.scaleToMonitor = wndconfig->scaleToMonitor;
|
window->win32.scaleToMonitor = wndconfig->scaleToMonitor;
|
||||||
window->win32.keymenu = wndconfig->win32.keymenu;
|
|
||||||
|
|
||||||
// Adjust window rect to account for DPI scaling of the window frame and
|
// Adjust window rect to account for DPI scaling of the window frame and
|
||||||
// (if enabled) DPI scaling of the content area
|
// (if enabled) DPI scaling of the content area
|
||||||
@@ -1285,9 +1297,13 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
float xscale, yscale;
|
float xscale, yscale;
|
||||||
_glfwPlatformGetWindowContentScale(window, &xscale, &yscale);
|
_glfwPlatformGetWindowContentScale(window, &xscale, &yscale);
|
||||||
|
|
||||||
|
if (xscale > 0.f && yscale > 0.f)
|
||||||
|
{
|
||||||
rect.right = (int) (rect.right * xscale);
|
rect.right = (int) (rect.right * xscale);
|
||||||
rect.bottom = (int) (rect.bottom * yscale);
|
rect.bottom = (int) (rect.bottom * yscale);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ClientToScreen(window->win32.handle, (POINT*) &rect.left);
|
ClientToScreen(window->win32.handle, (POINT*) &rect.left);
|
||||||
ClientToScreen(window->win32.handle, (POINT*) &rect.right);
|
ClientToScreen(window->win32.handle, (POINT*) &rect.right);
|
||||||
@@ -1315,6 +1331,8 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
window->win32.transparent = GLFW_TRUE;
|
window->win32.transparent = GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_glfwPlatformGetWindowSize(window, &window->win32.width, &window->win32.height);
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1858,36 +1876,6 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled)
|
|
||||||
{
|
|
||||||
COLORREF key = 0;
|
|
||||||
BYTE alpha = 0;
|
|
||||||
DWORD flags = 0;
|
|
||||||
DWORD exStyle = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);
|
|
||||||
|
|
||||||
if (exStyle & WS_EX_LAYERED)
|
|
||||||
GetLayeredWindowAttributes(window->win32.handle, &key, &alpha, &flags);
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
exStyle |= (WS_EX_TRANSPARENT | WS_EX_LAYERED);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
exStyle &= ~WS_EX_TRANSPARENT;
|
|
||||||
// NOTE: Window opacity also needs the layered window style so do not
|
|
||||||
// remove it if the window is alpha blended
|
|
||||||
if (exStyle & WS_EX_LAYERED)
|
|
||||||
{
|
|
||||||
if (!(flags & LWA_ALPHA))
|
|
||||||
exStyle &= ~WS_EX_LAYERED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetWindowLongW(window->win32.handle, GWL_EXSTYLE, exStyle);
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
SetLayeredWindowAttributes(window->win32.handle, key, alpha, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
BYTE alpha;
|
BYTE alpha;
|
||||||
@@ -1905,22 +1893,19 @@ float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
|||||||
|
|
||||||
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
||||||
{
|
{
|
||||||
LONG exStyle = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);
|
if (opacity < 1.f)
|
||||||
if (opacity < 1.f || (exStyle & WS_EX_TRANSPARENT))
|
|
||||||
{
|
{
|
||||||
const BYTE alpha = (BYTE) (255 * opacity);
|
const BYTE alpha = (BYTE) (255 * opacity);
|
||||||
exStyle |= WS_EX_LAYERED;
|
DWORD style = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);
|
||||||
SetWindowLongW(window->win32.handle, GWL_EXSTYLE, exStyle);
|
style |= WS_EX_LAYERED;
|
||||||
|
SetWindowLongW(window->win32.handle, GWL_EXSTYLE, style);
|
||||||
SetLayeredWindowAttributes(window->win32.handle, 0, alpha, LWA_ALPHA);
|
SetLayeredWindowAttributes(window->win32.handle, 0, alpha, LWA_ALPHA);
|
||||||
}
|
}
|
||||||
else if (exStyle & WS_EX_TRANSPARENT)
|
|
||||||
{
|
|
||||||
SetLayeredWindowAttributes(window->win32.handle, 0, 0, 0);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
exStyle &= ~WS_EX_LAYERED;
|
DWORD style = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);
|
||||||
SetWindowLongW(window->win32.handle, GWL_EXSTYLE, exStyle);
|
style &= ~WS_EX_LAYERED;
|
||||||
|
SetWindowLongW(window->win32.handle, GWL_EXSTYLE, style);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2086,7 +2071,7 @@ const char* _glfwPlatformGetScancodeName(int scancode)
|
|||||||
if (scancode < 0 || scancode > (KF_EXTENDED | 0xff) ||
|
if (scancode < 0 || scancode > (KF_EXTENDED | 0xff) ||
|
||||||
_glfw.win32.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
_glfw.win32.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode");
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode %i", scancode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2119,25 +2104,14 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
|||||||
id = OCR_IBEAM;
|
id = OCR_IBEAM;
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
||||||
id = OCR_CROSS;
|
id = OCR_CROSS;
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
else if (shape == GLFW_HAND_CURSOR)
|
||||||
id = OCR_HAND;
|
id = OCR_HAND;
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
else if (shape == GLFW_HRESIZE_CURSOR)
|
||||||
id = OCR_SIZEWE;
|
id = OCR_SIZEWE;
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
else if (shape == GLFW_VRESIZE_CURSOR)
|
||||||
id = OCR_SIZENS;
|
id = OCR_SIZENS;
|
||||||
else if (shape == GLFW_RESIZE_NWSE_CURSOR)
|
|
||||||
id = OCR_SIZENWSE;
|
|
||||||
else if (shape == GLFW_RESIZE_NESW_CURSOR)
|
|
||||||
id = OCR_SIZENESW;
|
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
id = OCR_SIZEALL;
|
|
||||||
else if (shape == GLFW_NOT_ALLOWED_CURSOR)
|
|
||||||
id = OCR_NO;
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Unknown standard cursor");
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
cursor->win32.handle = LoadImageW(NULL,
|
cursor->win32.handle = LoadImageW(NULL,
|
||||||
MAKEINTRESOURCEW(id), IMAGE_CURSOR, 0, 0,
|
MAKEINTRESOURCEW(id), IMAGE_CURSOR, 0, 0,
|
||||||
@@ -2246,57 +2220,6 @@ const char* _glfwPlatformGetClipboardString(void)
|
|||||||
return _glfw.win32.clipboardString;
|
return _glfw.win32.clipboardString;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum _glfwPlatformGetEGLPlatform(EGLint** attribs)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle)
|
|
||||||
{
|
|
||||||
int type = 0;
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_opengl)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_OPENGL)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE;
|
|
||||||
else if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_OPENGLES)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_d3d)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_D3D9)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
|
|
||||||
else if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_D3D11)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_vulkan)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_VULKAN)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type)
|
|
||||||
{
|
|
||||||
*attribs = calloc(3, sizeof(EGLint));
|
|
||||||
(*attribs)[0] = EGL_PLATFORM_ANGLE_TYPE_ANGLE;
|
|
||||||
(*attribs)[1] = type;
|
|
||||||
(*attribs)[2] = EGL_NONE;
|
|
||||||
return EGL_PLATFORM_ANGLE_ANGLE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeDisplayType _glfwPlatformGetEGLNativeDisplay(void)
|
|
||||||
{
|
|
||||||
return GetDC(_glfw.win32.helperWindowHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeWindowType _glfwPlatformGetEGLNativeWindow(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
return window->win32.handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
{
|
{
|
||||||
if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_win32_surface)
|
if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_win32_surface)
|
||||||
|
|||||||
+5
-23
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 - www.glfw.org
|
// GLFW 3.3 - 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>
|
||||||
@@ -203,9 +203,10 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
window->autoIconify = wndconfig.autoIconify;
|
window->autoIconify = wndconfig.autoIconify;
|
||||||
window->floating = wndconfig.floating;
|
window->floating = wndconfig.floating;
|
||||||
window->focusOnShow = wndconfig.focusOnShow;
|
window->focusOnShow = wndconfig.focusOnShow;
|
||||||
window->mousePassthrough = wndconfig.mousePassthrough;
|
|
||||||
window->cursorMode = GLFW_CURSOR_NORMAL;
|
window->cursorMode = GLFW_CURSOR_NORMAL;
|
||||||
|
|
||||||
|
window->doublebuffer = fbconfig.doublebuffer;
|
||||||
|
|
||||||
window->minwidth = GLFW_DONT_CARE;
|
window->minwidth = GLFW_DONT_CARE;
|
||||||
window->minheight = GLFW_DONT_CARE;
|
window->minheight = GLFW_DONT_CARE;
|
||||||
window->maxwidth = GLFW_DONT_CARE;
|
window->maxwidth = GLFW_DONT_CARE;
|
||||||
@@ -229,9 +230,6 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig.mousePassthrough)
|
|
||||||
_glfwPlatformSetWindowMousePassthrough(window, GLFW_TRUE);
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
if (wndconfig.centerCursor)
|
if (wndconfig.centerCursor)
|
||||||
@@ -367,9 +365,6 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
||||||
_glfw.hints.window.ns.retina = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.ns.retina = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
return;
|
return;
|
||||||
case GLFW_WIN32_KEYBOARD_MENU:
|
|
||||||
_glfw.hints.window.win32.keymenu = value ? GLFW_TRUE : GLFW_FALSE;
|
|
||||||
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 ? GLFW_TRUE : GLFW_FALSE;
|
||||||
return;
|
return;
|
||||||
@@ -382,9 +377,6 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
case GLFW_FOCUS_ON_SHOW:
|
case GLFW_FOCUS_ON_SHOW:
|
||||||
_glfw.hints.window.focusOnShow = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.focusOnShow = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
return;
|
return;
|
||||||
case GLFW_MOUSE_PASSTHROUGH:
|
|
||||||
_glfw.hints.window.mousePassthrough = value ? GLFW_TRUE : GLFW_FALSE;
|
|
||||||
return;
|
|
||||||
case GLFW_CLIENT_API:
|
case GLFW_CLIENT_API:
|
||||||
_glfw.hints.context.client = value;
|
_glfw.hints.context.client = value;
|
||||||
return;
|
return;
|
||||||
@@ -403,7 +395,7 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
case GLFW_OPENGL_FORWARD_COMPAT:
|
case GLFW_OPENGL_FORWARD_COMPAT:
|
||||||
_glfw.hints.context.forward = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.forward = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
return;
|
return;
|
||||||
case GLFW_CONTEXT_DEBUG:
|
case GLFW_OPENGL_DEBUG_CONTEXT:
|
||||||
_glfw.hints.context.debug = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.context.debug = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
return;
|
return;
|
||||||
case GLFW_CONTEXT_NO_ERROR:
|
case GLFW_CONTEXT_NO_ERROR:
|
||||||
@@ -829,8 +821,6 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
|
|||||||
return _glfwPlatformWindowHovered(window);
|
return _glfwPlatformWindowHovered(window);
|
||||||
case GLFW_FOCUS_ON_SHOW:
|
case GLFW_FOCUS_ON_SHOW:
|
||||||
return window->focusOnShow;
|
return window->focusOnShow;
|
||||||
case GLFW_MOUSE_PASSTHROUGH:
|
|
||||||
return window->mousePassthrough;
|
|
||||||
case GLFW_TRANSPARENT_FRAMEBUFFER:
|
case GLFW_TRANSPARENT_FRAMEBUFFER:
|
||||||
return _glfwPlatformFramebufferTransparent(window);
|
return _glfwPlatformFramebufferTransparent(window);
|
||||||
case GLFW_RESIZABLE:
|
case GLFW_RESIZABLE:
|
||||||
@@ -855,7 +845,7 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
|
|||||||
return window->context.robustness;
|
return window->context.robustness;
|
||||||
case GLFW_OPENGL_FORWARD_COMPAT:
|
case GLFW_OPENGL_FORWARD_COMPAT:
|
||||||
return window->context.forward;
|
return window->context.forward;
|
||||||
case GLFW_CONTEXT_DEBUG:
|
case GLFW_OPENGL_DEBUG_CONTEXT:
|
||||||
return window->context.debug;
|
return window->context.debug;
|
||||||
case GLFW_OPENGL_PROFILE:
|
case GLFW_OPENGL_PROFILE:
|
||||||
return window->context.profile;
|
return window->context.profile;
|
||||||
@@ -909,14 +899,6 @@ GLFWAPI void glfwSetWindowAttrib(GLFWwindow* handle, int attrib, int value)
|
|||||||
}
|
}
|
||||||
else if (attrib == GLFW_FOCUS_ON_SHOW)
|
else if (attrib == GLFW_FOCUS_ON_SHOW)
|
||||||
window->focusOnShow = value;
|
window->focusOnShow = value;
|
||||||
else if (attrib == GLFW_MOUSE_PASSTHROUGH)
|
|
||||||
{
|
|
||||||
if (window->mousePassthrough == value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
window->mousePassthrough = value;
|
|
||||||
_glfwPlatformSetWindowMousePassthrough(window, value);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid window attribute 0x%08X", attrib);
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid window attribute 0x%08X", attrib);
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-425
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.3 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
// It is fine to use C99 in this file because it will not be built with VS
|
// It is fine to use C99 in this file because it will not be built with VS
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#define _POSIX_C_SOURCE 199309L
|
#define _POSIX_C_SOURCE 200809L
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
@@ -40,7 +40,6 @@
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/timerfd.h>
|
#include <sys/timerfd.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <time.h>
|
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -105,6 +104,7 @@ static void pointerHandleEnter(void* data,
|
|||||||
|
|
||||||
window->wl.decorations.focus = focus;
|
window->wl.decorations.focus = focus;
|
||||||
_glfw.wl.serial = serial;
|
_glfw.wl.serial = serial;
|
||||||
|
_glfw.wl.pointerEnterSerial = serial;
|
||||||
_glfw.wl.pointerFocus = window;
|
_glfw.wl.pointerFocus = window;
|
||||||
|
|
||||||
window->wl.hovered = GLFW_TRUE;
|
window->wl.hovered = GLFW_TRUE;
|
||||||
@@ -164,7 +164,7 @@ static void setCursor(_GLFWwindow* window, const char* name)
|
|||||||
buffer = wl_cursor_image_get_buffer(image);
|
buffer = wl_cursor_image_get_buffer(image);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return;
|
return;
|
||||||
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.serial,
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
|
||||||
surface,
|
surface,
|
||||||
image->hotspot_x / scale,
|
image->hotspot_x / scale,
|
||||||
image->hotspot_y / scale);
|
image->hotspot_y / scale);
|
||||||
@@ -244,7 +244,9 @@ static void pointerHandleButton(void* data,
|
|||||||
{
|
{
|
||||||
_GLFWwindow* window = _glfw.wl.pointerFocus;
|
_GLFWwindow* window = _glfw.wl.pointerFocus;
|
||||||
int glfwButton;
|
int glfwButton;
|
||||||
uint32_t edges = XDG_TOPLEVEL_RESIZE_EDGE_NONE;
|
|
||||||
|
// Both xdg-shell and wl_shell use the same values.
|
||||||
|
uint32_t edges = WL_SHELL_SURFACE_RESIZE_NONE;
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
@@ -256,39 +258,46 @@ static void pointerHandleButton(void* data,
|
|||||||
break;
|
break;
|
||||||
case topDecoration:
|
case topDecoration:
|
||||||
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP;
|
edges = WL_SHELL_SURFACE_RESIZE_TOP;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial);
|
xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial);
|
||||||
|
else
|
||||||
|
wl_shell_surface_move(window->wl.shellSurface, _glfw.wl.seat, serial);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case leftDecoration:
|
case leftDecoration:
|
||||||
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT;
|
edges = WL_SHELL_SURFACE_RESIZE_TOP_LEFT;
|
||||||
else
|
else
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_LEFT;
|
edges = WL_SHELL_SURFACE_RESIZE_LEFT;
|
||||||
break;
|
break;
|
||||||
case rightDecoration:
|
case rightDecoration:
|
||||||
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT;
|
edges = WL_SHELL_SURFACE_RESIZE_TOP_RIGHT;
|
||||||
else
|
else
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_RIGHT;
|
edges = WL_SHELL_SURFACE_RESIZE_RIGHT;
|
||||||
break;
|
break;
|
||||||
case bottomDecoration:
|
case bottomDecoration:
|
||||||
if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH)
|
if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT;
|
||||||
else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH)
|
else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT;
|
||||||
else
|
else
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
if (edges != XDG_TOPLEVEL_RESIZE_EDGE_NONE)
|
if (edges != WL_SHELL_SURFACE_RESIZE_NONE)
|
||||||
{
|
{
|
||||||
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
|
xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
|
||||||
serial, edges);
|
serial, edges);
|
||||||
|
else
|
||||||
|
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
|
||||||
|
serial, edges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (button == BTN_RIGHT)
|
else if (button == BTN_RIGHT)
|
||||||
@@ -552,7 +561,7 @@ static GLFWbool inputChar(_GLFWwindow* window, uint32_t key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return xkb_keymap_key_repeats(_glfw.wl.xkb.keymap, syms[0]);
|
return xkb_keymap_key_repeats(_glfw.wl.xkb.keymap, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboardHandleKey(void* data,
|
static void keyboardHandleKey(void* data,
|
||||||
@@ -769,390 +778,6 @@ static const struct wl_data_device_listener dataDeviceListener = {
|
|||||||
dataDeviceHandleSelection,
|
dataDeviceHandleSelection,
|
||||||
};
|
};
|
||||||
|
|
||||||
void tabletName(void *data,
|
|
||||||
struct zwp_tablet_v2 *zwp_tablet_v2,
|
|
||||||
const char *name)
|
|
||||||
{
|
|
||||||
printf("Tablet name: %s\n", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletId(void *data,
|
|
||||||
struct zwp_tablet_v2 *zwp_tablet_v2,
|
|
||||||
uint32_t vid,
|
|
||||||
uint32_t pid)
|
|
||||||
{
|
|
||||||
printf("Tablet id: %04u:%04u\n", vid, pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPath(void *data,
|
|
||||||
struct zwp_tablet_v2 *zwp_tablet_v2,
|
|
||||||
const char *path)
|
|
||||||
{
|
|
||||||
printf("Tablet path: %s\n", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletDone(void *data,
|
|
||||||
struct zwp_tablet_v2 *zwp_tablet_v2)
|
|
||||||
{
|
|
||||||
printf("Tablet done\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletRemoved(void *data,
|
|
||||||
struct zwp_tablet_v2 *zwp_tablet_v2)
|
|
||||||
{
|
|
||||||
printf("Tablet removed\n");
|
|
||||||
_glfw.wl.tablet = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zwp_tablet_v2_listener tabletListener = {
|
|
||||||
tabletName,
|
|
||||||
tabletId,
|
|
||||||
tabletPath,
|
|
||||||
tabletDone,
|
|
||||||
tabletRemoved,
|
|
||||||
};
|
|
||||||
|
|
||||||
void tabletToolType(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t toolType)
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
switch (toolType)
|
|
||||||
{
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_PEN:
|
|
||||||
name = "pen";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_ERASER:
|
|
||||||
name = "eraser";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_BRUSH:
|
|
||||||
name = "brush";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_PENCIL:
|
|
||||||
name = "pencil";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_AIRBRUSH:
|
|
||||||
name = "airbrush";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_FINGER:
|
|
||||||
name = "finger";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_MOUSE:
|
|
||||||
name = "mouse";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_TYPE_LENS:
|
|
||||||
name = "lens";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
name = "unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("Tablet tool type: %s\n", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolHardwareSerial(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t hardwareSerialHi,
|
|
||||||
uint32_t hardwareSerialLo)
|
|
||||||
{
|
|
||||||
uint64_t hardwareSerial = (uint64_t)hardwareSerialHi << 32 | (uint64_t)hardwareSerialLo;
|
|
||||||
printf("Tablet tool hardware serial: %"PRId64"\n", hardwareSerial);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolHardwareIdWacom(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t hardwareIdHi,
|
|
||||||
uint32_t hardwareIdLo)
|
|
||||||
{
|
|
||||||
uint64_t hardwareId = (uint64_t)hardwareIdHi << 32 | (uint64_t)hardwareIdLo;
|
|
||||||
printf("Tablet tool hardware id Wacom: %"PRId64"\n", hardwareId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolCapability(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t capability)
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
switch (capability)
|
|
||||||
{
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_TILT:
|
|
||||||
name = "tilt";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_PRESSURE:
|
|
||||||
name = "pressure";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_DISTANCE:
|
|
||||||
name = "distance";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_ROTATION:
|
|
||||||
name = "rotation";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_SLIDER:
|
|
||||||
name = "slider";
|
|
||||||
break;
|
|
||||||
case ZWP_TABLET_TOOL_V2_CAPABILITY_WHEEL:
|
|
||||||
name = "wheel";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
name = "unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("Tablet tool capability: %s\n", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolDone(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool)
|
|
||||||
{
|
|
||||||
printf("Tablet tool done\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolRemoved(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool)
|
|
||||||
{
|
|
||||||
printf("Tablet tool removed (unimplemented)\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolProximityIn(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t serial,
|
|
||||||
struct zwp_tablet_v2 *tablet,
|
|
||||||
struct wl_surface *surface)
|
|
||||||
{
|
|
||||||
printf("Tablet tool proximity in: %p %p\n", tablet, surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolProximityOut(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool)
|
|
||||||
{
|
|
||||||
printf("Tablet tool proximity out\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolDown(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t serial)
|
|
||||||
{
|
|
||||||
printf("Tablet tool down\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolUp(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool)
|
|
||||||
{
|
|
||||||
printf("Tablet tool up\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolMotion(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
wl_fixed_t x,
|
|
||||||
wl_fixed_t y)
|
|
||||||
{
|
|
||||||
printf("Tablet tool motion: %f %f\n", wl_fixed_to_double(x), wl_fixed_to_double(y));
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolPressure(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t pressure)
|
|
||||||
{
|
|
||||||
printf("Tablet tool pressure: %u\n", pressure);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolDistance(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t distance)
|
|
||||||
{
|
|
||||||
printf("Tablet tool distance: %u\n", distance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolTilt(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
wl_fixed_t tiltX,
|
|
||||||
wl_fixed_t tiltY)
|
|
||||||
{
|
|
||||||
printf("Tablet tool tilt: %f %f\n", wl_fixed_to_double(tiltX), wl_fixed_to_double(tiltY));
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolRotation(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
wl_fixed_t degrees)
|
|
||||||
{
|
|
||||||
printf("Tablet tool rotation: %f°\n", wl_fixed_to_double(degrees));
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolSlider(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
int32_t position)
|
|
||||||
{
|
|
||||||
printf("Tablet tool slider: %d\n", position);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolWheel(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
wl_fixed_t degrees,
|
|
||||||
int32_t clicks)
|
|
||||||
{
|
|
||||||
printf("Tablet tool wheel: %f° %d\n", wl_fixed_to_double(degrees), clicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolButton(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t serial,
|
|
||||||
uint32_t button,
|
|
||||||
uint32_t state)
|
|
||||||
{
|
|
||||||
printf("Tablet tool button: %u %u\n", button, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletToolFrame(void *data,
|
|
||||||
struct zwp_tablet_tool_v2 *tool,
|
|
||||||
uint32_t time)
|
|
||||||
{
|
|
||||||
printf("Tablet tool frame: %u\n", time);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct zwp_tablet_tool_v2_listener tabletToolListener = {
|
|
||||||
tabletToolType,
|
|
||||||
tabletToolHardwareSerial,
|
|
||||||
tabletToolHardwareIdWacom,
|
|
||||||
tabletToolCapability,
|
|
||||||
tabletToolDone,
|
|
||||||
tabletToolRemoved,
|
|
||||||
tabletToolProximityIn,
|
|
||||||
tabletToolProximityOut,
|
|
||||||
tabletToolDown,
|
|
||||||
tabletToolUp,
|
|
||||||
tabletToolMotion,
|
|
||||||
tabletToolPressure,
|
|
||||||
tabletToolDistance,
|
|
||||||
tabletToolTilt,
|
|
||||||
tabletToolRotation,
|
|
||||||
tabletToolSlider,
|
|
||||||
tabletToolWheel,
|
|
||||||
tabletToolButton,
|
|
||||||
tabletToolFrame,
|
|
||||||
};
|
|
||||||
|
|
||||||
void tabletPadGroup(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
struct zwp_tablet_pad_group_v2 *padGroup)
|
|
||||||
{
|
|
||||||
printf("New pad group: %p\n", padGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadPath(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
const char *path)
|
|
||||||
{
|
|
||||||
printf("Tablet pad path: %s\n", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadButtons(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
uint32_t buttons)
|
|
||||||
{
|
|
||||||
printf("Tablet pad buttons: %u\n", buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadDone(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad)
|
|
||||||
{
|
|
||||||
printf("Tablet pad done\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadButton(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
uint32_t time,
|
|
||||||
uint32_t button,
|
|
||||||
uint32_t state)
|
|
||||||
{
|
|
||||||
printf("Tablet pad button: %u %u %u\n", time, button, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadEnter(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
uint32_t serial,
|
|
||||||
struct zwp_tablet_v2 *tablet,
|
|
||||||
struct wl_surface *surface)
|
|
||||||
{
|
|
||||||
printf("Tablet pad enter: %p %p\n", tablet, surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadLeave(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad,
|
|
||||||
uint32_t serial,
|
|
||||||
struct wl_surface *surface)
|
|
||||||
{
|
|
||||||
printf("Tablet pad leave: %p\n", surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletPadRemoved(void *data,
|
|
||||||
struct zwp_tablet_pad_v2 *pad)
|
|
||||||
{
|
|
||||||
printf("Tablet pad removed (unimplemented)\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
struct zwp_tablet_pad_v2_listener tabletPadListener = {
|
|
||||||
tabletPadGroup,
|
|
||||||
tabletPadPath,
|
|
||||||
tabletPadButtons,
|
|
||||||
tabletPadDone,
|
|
||||||
tabletPadButton,
|
|
||||||
tabletPadEnter,
|
|
||||||
tabletPadLeave,
|
|
||||||
tabletPadRemoved,
|
|
||||||
};
|
|
||||||
|
|
||||||
void tabletSeatTabletAdded(void *data,
|
|
||||||
struct zwp_tablet_seat_v2 *seat,
|
|
||||||
struct zwp_tablet_v2 *tablet)
|
|
||||||
{
|
|
||||||
printf("New tablet %p!\n", tablet);
|
|
||||||
if (_glfw.wl.tablet) {
|
|
||||||
printf("Already there, skipping…\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.wl.tablet = tablet;
|
|
||||||
zwp_tablet_v2_add_listener(_glfw.wl.tablet, &tabletListener, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletSeatToolAdded(void *data,
|
|
||||||
struct zwp_tablet_seat_v2 *seat,
|
|
||||||
struct zwp_tablet_tool_v2 *tool)
|
|
||||||
{
|
|
||||||
printf("New tool %p!\n", tool);
|
|
||||||
|
|
||||||
if (_glfw.wl.tabletToolsCount + 1 > _glfw.wl.tabletToolsSize)
|
|
||||||
{
|
|
||||||
++_glfw.wl.tabletToolsSize;
|
|
||||||
_glfw.wl.tabletTools =
|
|
||||||
realloc(_glfw.wl.tabletTools,
|
|
||||||
_glfw.wl.tabletToolsSize * sizeof(struct zwp_tablet_tool_v2 *));
|
|
||||||
}
|
|
||||||
|
|
||||||
zwp_tablet_tool_v2_add_listener(tool, &tabletToolListener, NULL);
|
|
||||||
_glfw.wl.tabletTools[_glfw.wl.tabletToolsCount++] = tool;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tabletSeatPadAdded(void *data,
|
|
||||||
struct zwp_tablet_seat_v2 *seat,
|
|
||||||
struct zwp_tablet_pad_v2 *pad)
|
|
||||||
{
|
|
||||||
// TODO: Do we really want to implement that now?
|
|
||||||
printf("New pad %p\n", pad);
|
|
||||||
if (_glfw.wl.tabletPad) {
|
|
||||||
printf("Already there, skipping…\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.wl.tabletPad = pad;
|
|
||||||
zwp_tablet_pad_v2_add_listener(_glfw.wl.tabletPad, &tabletPadListener, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zwp_tablet_seat_v2_listener tabletSeatListener = {
|
|
||||||
tabletSeatTabletAdded,
|
|
||||||
tabletSeatToolAdded,
|
|
||||||
tabletSeatPadAdded,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void wmBaseHandlePing(void* data,
|
static void wmBaseHandlePing(void* data,
|
||||||
struct xdg_wm_base* wmBase,
|
struct xdg_wm_base* wmBase,
|
||||||
uint32_t serial)
|
uint32_t serial)
|
||||||
@@ -1187,6 +812,11 @@ static void registryHandleGlobal(void* data,
|
|||||||
_glfw.wl.shm =
|
_glfw.wl.shm =
|
||||||
wl_registry_bind(registry, name, &wl_shm_interface, 1);
|
wl_registry_bind(registry, name, &wl_shm_interface, 1);
|
||||||
}
|
}
|
||||||
|
else if (strcmp(interface, "wl_shell") == 0)
|
||||||
|
{
|
||||||
|
_glfw.wl.shell =
|
||||||
|
wl_registry_bind(registry, name, &wl_shell_interface, 1);
|
||||||
|
}
|
||||||
else if (strcmp(interface, "wl_output") == 0)
|
else if (strcmp(interface, "wl_output") == 0)
|
||||||
{
|
{
|
||||||
_glfwAddOutputWayland(name, version);
|
_glfwAddOutputWayland(name, version);
|
||||||
@@ -1243,13 +873,6 @@ static void registryHandleGlobal(void* data,
|
|||||||
&zwp_pointer_constraints_v1_interface,
|
&zwp_pointer_constraints_v1_interface,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
else if (strcmp(interface, "zwp_tablet_manager_v2") == 0)
|
|
||||||
{
|
|
||||||
_glfw.wl.tabletManager =
|
|
||||||
wl_registry_bind(registry, name,
|
|
||||||
&zwp_tablet_manager_v2_interface,
|
|
||||||
1);
|
|
||||||
}
|
|
||||||
else if (strcmp(interface, "zwp_idle_inhibit_manager_v1") == 0)
|
else if (strcmp(interface, "zwp_idle_inhibit_manager_v1") == 0)
|
||||||
{
|
{
|
||||||
_glfw.wl.idleInhibitManager =
|
_glfw.wl.idleInhibitManager =
|
||||||
@@ -1537,19 +1160,17 @@ int _glfwPlatformInit(void)
|
|||||||
// Sync so we got all initial output events
|
// Sync so we got all initial output events
|
||||||
wl_display_roundtrip(_glfw.wl.display);
|
wl_display_roundtrip(_glfw.wl.display);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
if (!_glfwInitJoysticksLinux())
|
||||||
|
return GLFW_FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
_glfwInitTimerPOSIX();
|
_glfwInitTimerPOSIX();
|
||||||
|
|
||||||
_glfw.wl.timerfd = -1;
|
_glfw.wl.timerfd = -1;
|
||||||
if (_glfw.wl.seatVersion >= 4)
|
if (_glfw.wl.seatVersion >= 4)
|
||||||
_glfw.wl.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
|
_glfw.wl.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
|
||||||
|
|
||||||
if (!_glfw.wl.wmBase)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
|
||||||
"Wayland: Failed to find xdg-shell in your compositor");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.pointer && _glfw.wl.shm)
|
if (_glfw.wl.pointer && _glfw.wl.shm)
|
||||||
{
|
{
|
||||||
cursorTheme = getenv("XCURSOR_THEME");
|
cursorTheme = getenv("XCURSOR_THEME");
|
||||||
@@ -1594,19 +1215,14 @@ int _glfwPlatformInit(void)
|
|||||||
_glfw.wl.clipboardSize = 4096;
|
_glfw.wl.clipboardSize = 4096;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.wl.seat && _glfw.wl.tabletManager)
|
|
||||||
{
|
|
||||||
_glfw.wl.tabletSeat =
|
|
||||||
zwp_tablet_manager_v2_get_tablet_seat(_glfw.wl.tabletManager,
|
|
||||||
_glfw.wl.seat);
|
|
||||||
zwp_tablet_seat_v2_add_listener(_glfw.wl.tabletSeat, &tabletSeatListener, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformTerminate(void)
|
void _glfwPlatformTerminate(void)
|
||||||
{
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
_glfwTerminateJoysticksLinux();
|
||||||
|
#endif
|
||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
if (_glfw.wl.egl.handle)
|
if (_glfw.wl.egl.handle)
|
||||||
{
|
{
|
||||||
@@ -1648,6 +1264,8 @@ void _glfwPlatformTerminate(void)
|
|||||||
wl_compositor_destroy(_glfw.wl.compositor);
|
wl_compositor_destroy(_glfw.wl.compositor);
|
||||||
if (_glfw.wl.shm)
|
if (_glfw.wl.shm)
|
||||||
wl_shm_destroy(_glfw.wl.shm);
|
wl_shm_destroy(_glfw.wl.shm);
|
||||||
|
if (_glfw.wl.shell)
|
||||||
|
wl_shell_destroy(_glfw.wl.shell);
|
||||||
if (_glfw.wl.viewporter)
|
if (_glfw.wl.viewporter)
|
||||||
wp_viewporter_destroy(_glfw.wl.viewporter);
|
wp_viewporter_destroy(_glfw.wl.viewporter);
|
||||||
if (_glfw.wl.decorationManager)
|
if (_glfw.wl.decorationManager)
|
||||||
@@ -1672,10 +1290,6 @@ void _glfwPlatformTerminate(void)
|
|||||||
zwp_relative_pointer_manager_v1_destroy(_glfw.wl.relativePointerManager);
|
zwp_relative_pointer_manager_v1_destroy(_glfw.wl.relativePointerManager);
|
||||||
if (_glfw.wl.pointerConstraints)
|
if (_glfw.wl.pointerConstraints)
|
||||||
zwp_pointer_constraints_v1_destroy(_glfw.wl.pointerConstraints);
|
zwp_pointer_constraints_v1_destroy(_glfw.wl.pointerConstraints);
|
||||||
if (_glfw.wl.tabletSeat)
|
|
||||||
zwp_tablet_seat_v2_destroy(_glfw.wl.tabletSeat);
|
|
||||||
if (_glfw.wl.tabletManager)
|
|
||||||
zwp_tablet_manager_v2_destroy(_glfw.wl.tabletManager);
|
|
||||||
if (_glfw.wl.idleInhibitManager)
|
if (_glfw.wl.idleInhibitManager)
|
||||||
zwp_idle_inhibit_manager_v1_destroy(_glfw.wl.idleInhibitManager);
|
zwp_idle_inhibit_manager_v1_destroy(_glfw.wl.idleInhibitManager);
|
||||||
if (_glfw.wl.registry)
|
if (_glfw.wl.registry)
|
||||||
|
|||||||
+13
-7
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.3 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -47,15 +47,13 @@ static void outputHandleGeometry(void* data,
|
|||||||
int32_t transform)
|
int32_t transform)
|
||||||
{
|
{
|
||||||
struct _GLFWmonitor *monitor = data;
|
struct _GLFWmonitor *monitor = data;
|
||||||
char name[1024];
|
|
||||||
|
|
||||||
monitor->wl.x = x;
|
monitor->wl.x = x;
|
||||||
monitor->wl.y = y;
|
monitor->wl.y = y;
|
||||||
monitor->widthMM = physicalWidth;
|
monitor->widthMM = physicalWidth;
|
||||||
monitor->heightMM = physicalHeight;
|
monitor->heightMM = physicalHeight;
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "%s %s", make, model);
|
snprintf(monitor->name, sizeof(monitor->name), "%s %s", make, model);
|
||||||
monitor->name = _glfw_strdup(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void outputHandleMode(void* data,
|
static void outputHandleMode(void* data,
|
||||||
@@ -88,6 +86,14 @@ static void outputHandleDone(void* data, struct wl_output* output)
|
|||||||
{
|
{
|
||||||
struct _GLFWmonitor *monitor = data;
|
struct _GLFWmonitor *monitor = data;
|
||||||
|
|
||||||
|
if (monitor->widthMM <= 0 || monitor->heightMM <= 0)
|
||||||
|
{
|
||||||
|
// If Wayland does not provide a physical size, assume the default 96 DPI
|
||||||
|
const GLFWvidmode* mode = &monitor->modes[monitor->wl.currentMode];
|
||||||
|
monitor->widthMM = (int) (mode->width * 25.4f / 96.f);
|
||||||
|
monitor->heightMM = (int) (mode->height * 25.4f / 96.f);
|
||||||
|
}
|
||||||
|
|
||||||
_glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);
|
_glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +131,7 @@ void _glfwAddOutputWayland(uint32_t name, uint32_t version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The actual name of this output will be set in the geometry handler.
|
// The actual name of this output will be set in the geometry handler.
|
||||||
monitor = _glfwAllocMonitor(NULL, 0, 0);
|
monitor = _glfwAllocMonitor("", 0, 0);
|
||||||
|
|
||||||
output = wl_registry_bind(_glfw.wl.registry,
|
output = wl_registry_bind(_glfw.wl.registry,
|
||||||
name,
|
name,
|
||||||
@@ -199,7 +205,7 @@ void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)
|
|||||||
|
|
||||||
GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Gamma ramp access is not available");
|
"Wayland: Gamma ramp access is not available");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
@@ -207,7 +213,7 @@ GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
|||||||
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor,
|
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor,
|
||||||
const GLFWgammaramp* ramp)
|
const GLFWgammaramp* ramp)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Gamma ramp access is not available");
|
"Wayland: Gamma ramp access is not available");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-14
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.3 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -53,19 +53,23 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
|
|||||||
#include "null_joystick.h"
|
#include "null_joystick.h"
|
||||||
#endif
|
#endif
|
||||||
#include "xkb_unicode.h"
|
#include "xkb_unicode.h"
|
||||||
|
#include "egl_context.h"
|
||||||
|
#include "osmesa_context.h"
|
||||||
|
|
||||||
#include "wayland-xdg-shell-client-protocol.h"
|
#include "wayland-xdg-shell-client-protocol.h"
|
||||||
#include "wayland-xdg-decoration-client-protocol.h"
|
#include "wayland-xdg-decoration-client-protocol.h"
|
||||||
#include "wayland-viewporter-client-protocol.h"
|
#include "wayland-viewporter-client-protocol.h"
|
||||||
#include "wayland-relative-pointer-unstable-v1-client-protocol.h"
|
#include "wayland-relative-pointer-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-pointer-constraints-unstable-v1-client-protocol.h"
|
#include "wayland-pointer-constraints-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-tablet-unstable-v2-client-protocol.h"
|
|
||||||
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
||||||
#define _glfw_dlclose(handle) dlclose(handle)
|
#define _glfw_dlclose(handle) dlclose(handle)
|
||||||
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
||||||
|
|
||||||
|
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->wl.native)
|
||||||
|
#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.wl.display)
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWayland wl
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWayland wl
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWayland wl
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWayland wl
|
||||||
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWayland wl
|
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWayland wl
|
||||||
@@ -154,7 +158,6 @@ typedef enum _GLFWdecorationSideWayland
|
|||||||
leftDecoration,
|
leftDecoration,
|
||||||
rightDecoration,
|
rightDecoration,
|
||||||
bottomDecoration,
|
bottomDecoration,
|
||||||
|
|
||||||
} _GLFWdecorationSideWayland;
|
} _GLFWdecorationSideWayland;
|
||||||
|
|
||||||
typedef struct _GLFWdecorationWayland
|
typedef struct _GLFWdecorationWayland
|
||||||
@@ -162,7 +165,6 @@ typedef struct _GLFWdecorationWayland
|
|||||||
struct wl_surface* surface;
|
struct wl_surface* surface;
|
||||||
struct wl_subsurface* subsurface;
|
struct wl_subsurface* subsurface;
|
||||||
struct wp_viewport* viewport;
|
struct wp_viewport* viewport;
|
||||||
|
|
||||||
} _GLFWdecorationWayland;
|
} _GLFWdecorationWayland;
|
||||||
|
|
||||||
// Wayland-specific per-window data
|
// Wayland-specific per-window data
|
||||||
@@ -176,6 +178,7 @@ typedef struct _GLFWwindowWayland
|
|||||||
GLFWbool transparent;
|
GLFWbool transparent;
|
||||||
struct wl_surface* surface;
|
struct wl_surface* surface;
|
||||||
struct wl_egl_window* native;
|
struct wl_egl_window* native;
|
||||||
|
struct wl_shell_surface* shellSurface;
|
||||||
struct wl_callback* callback;
|
struct wl_callback* callback;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -211,7 +214,6 @@ typedef struct _GLFWwindowWayland
|
|||||||
_GLFWdecorationWayland top, left, right, bottom;
|
_GLFWdecorationWayland top, left, right, bottom;
|
||||||
int focus;
|
int focus;
|
||||||
} decorations;
|
} decorations;
|
||||||
|
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
// Wayland-specific global data
|
// Wayland-specific global data
|
||||||
@@ -222,6 +224,7 @@ typedef struct _GLFWlibraryWayland
|
|||||||
struct wl_registry* registry;
|
struct wl_registry* registry;
|
||||||
struct wl_compositor* compositor;
|
struct wl_compositor* compositor;
|
||||||
struct wl_subcompositor* subcompositor;
|
struct wl_subcompositor* subcompositor;
|
||||||
|
struct wl_shell* shell;
|
||||||
struct wl_shm* shm;
|
struct wl_shm* shm;
|
||||||
struct wl_seat* seat;
|
struct wl_seat* seat;
|
||||||
struct wl_pointer* pointer;
|
struct wl_pointer* pointer;
|
||||||
@@ -235,13 +238,6 @@ typedef struct _GLFWlibraryWayland
|
|||||||
struct wp_viewporter* viewporter;
|
struct wp_viewporter* viewporter;
|
||||||
struct zwp_relative_pointer_manager_v1* relativePointerManager;
|
struct zwp_relative_pointer_manager_v1* relativePointerManager;
|
||||||
struct zwp_pointer_constraints_v1* pointerConstraints;
|
struct zwp_pointer_constraints_v1* pointerConstraints;
|
||||||
struct zwp_tablet_manager_v2* tabletManager;
|
|
||||||
struct zwp_tablet_seat_v2* tabletSeat;
|
|
||||||
struct zwp_tablet_v2* tablet;
|
|
||||||
struct zwp_tablet_tool_v2** tabletTools;
|
|
||||||
int tabletToolsCount;
|
|
||||||
int tabletToolsSize;
|
|
||||||
struct zwp_tablet_pad_v2* tabletPad;
|
|
||||||
struct zwp_idle_inhibit_manager_v1* idleInhibitManager;
|
struct zwp_idle_inhibit_manager_v1* idleInhibitManager;
|
||||||
|
|
||||||
int compositorVersion;
|
int compositorVersion;
|
||||||
@@ -253,6 +249,7 @@ typedef struct _GLFWlibraryWayland
|
|||||||
const char* cursorPreviousName;
|
const char* cursorPreviousName;
|
||||||
int cursorTimerfd;
|
int cursorTimerfd;
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
|
uint32_t pointerEnterSerial;
|
||||||
|
|
||||||
int32_t keyboardRepeatRate;
|
int32_t keyboardRepeatRate;
|
||||||
int32_t keyboardRepeatDelay;
|
int32_t keyboardRepeatDelay;
|
||||||
@@ -326,7 +323,6 @@ typedef struct _GLFWlibraryWayland
|
|||||||
PFN_wl_egl_window_destroy window_destroy;
|
PFN_wl_egl_window_destroy window_destroy;
|
||||||
PFN_wl_egl_window_resize window_resize;
|
PFN_wl_egl_window_resize window_resize;
|
||||||
} egl;
|
} egl;
|
||||||
|
|
||||||
} _GLFWlibraryWayland;
|
} _GLFWlibraryWayland;
|
||||||
|
|
||||||
// Wayland-specific per-monitor data
|
// Wayland-specific per-monitor data
|
||||||
@@ -340,7 +336,6 @@ typedef struct _GLFWmonitorWayland
|
|||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
int scale;
|
int scale;
|
||||||
|
|
||||||
} _GLFWmonitorWayland;
|
} _GLFWmonitorWayland;
|
||||||
|
|
||||||
// Wayland-specific per-cursor data
|
// Wayland-specific per-cursor data
|
||||||
|
|||||||
+226
-123
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Wayland - www.glfw.org
|
// GLFW 3.3 Wayland - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
@@ -41,6 +41,72 @@
|
|||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
|
||||||
|
|
||||||
|
static void shellSurfaceHandlePing(void* data,
|
||||||
|
struct wl_shell_surface* shellSurface,
|
||||||
|
uint32_t serial)
|
||||||
|
{
|
||||||
|
wl_shell_surface_pong(shellSurface, serial);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void shellSurfaceHandleConfigure(void* data,
|
||||||
|
struct wl_shell_surface* shellSurface,
|
||||||
|
uint32_t edges,
|
||||||
|
int32_t width,
|
||||||
|
int32_t height)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = data;
|
||||||
|
float aspectRatio;
|
||||||
|
float targetRatio;
|
||||||
|
|
||||||
|
if (!window->monitor)
|
||||||
|
{
|
||||||
|
if (_glfw.wl.viewporter && window->decorated)
|
||||||
|
{
|
||||||
|
width -= _GLFW_DECORATION_HORIZONTAL;
|
||||||
|
height -= _GLFW_DECORATION_VERTICAL;
|
||||||
|
}
|
||||||
|
if (width < 1)
|
||||||
|
width = 1;
|
||||||
|
if (height < 1)
|
||||||
|
height = 1;
|
||||||
|
|
||||||
|
if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
aspectRatio = (float)width / (float)height;
|
||||||
|
targetRatio = (float)window->numer / (float)window->denom;
|
||||||
|
if (aspectRatio < targetRatio)
|
||||||
|
height = width / targetRatio;
|
||||||
|
else if (aspectRatio > targetRatio)
|
||||||
|
width = height * targetRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->minwidth != GLFW_DONT_CARE && width < window->minwidth)
|
||||||
|
width = window->minwidth;
|
||||||
|
else if (window->maxwidth != GLFW_DONT_CARE && width > window->maxwidth)
|
||||||
|
width = window->maxwidth;
|
||||||
|
|
||||||
|
if (window->minheight != GLFW_DONT_CARE && height < window->minheight)
|
||||||
|
height = window->minheight;
|
||||||
|
else if (window->maxheight != GLFW_DONT_CARE && height > window->maxheight)
|
||||||
|
height = window->maxheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwInputWindowSize(window, width, height);
|
||||||
|
_glfwPlatformSetWindowSize(window, width, height);
|
||||||
|
_glfwInputWindowDamage(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void shellSurfaceHandlePopupDone(void* data,
|
||||||
|
struct wl_shell_surface* shellSurface)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_shell_surface_listener shellSurfaceListener = {
|
||||||
|
shellSurfaceHandlePing,
|
||||||
|
shellSurfaceHandleConfigure,
|
||||||
|
shellSurfaceHandlePopupDone
|
||||||
|
};
|
||||||
|
|
||||||
static int createTmpfileCloexec(char* tmpname)
|
static int createTmpfileCloexec(char* tmpname)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
@@ -246,10 +312,10 @@ static void createDecorations(_GLFWwindow* window)
|
|||||||
|
|
||||||
static void destroyDecoration(_GLFWdecorationWayland* decoration)
|
static void destroyDecoration(_GLFWdecorationWayland* decoration)
|
||||||
{
|
{
|
||||||
if (decoration->surface)
|
|
||||||
wl_surface_destroy(decoration->surface);
|
|
||||||
if (decoration->subsurface)
|
if (decoration->subsurface)
|
||||||
wl_subsurface_destroy(decoration->subsurface);
|
wl_subsurface_destroy(decoration->subsurface);
|
||||||
|
if (decoration->surface)
|
||||||
|
wl_surface_destroy(decoration->surface);
|
||||||
if (decoration->viewport)
|
if (decoration->viewport)
|
||||||
wp_viewport_destroy(decoration->viewport);
|
wp_viewport_destroy(decoration->viewport);
|
||||||
decoration->surface = NULL;
|
decoration->surface = NULL;
|
||||||
@@ -465,11 +531,66 @@ static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor,
|
|||||||
window->wl.xdg.toplevel,
|
window->wl.xdg.toplevel,
|
||||||
monitor->wl.output);
|
monitor->wl.output);
|
||||||
}
|
}
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
{
|
||||||
|
wl_shell_surface_set_fullscreen(
|
||||||
|
window->wl.shellSurface,
|
||||||
|
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
|
||||||
|
refreshRate * 1000, // Convert Hz to mHz.
|
||||||
|
monitor->wl.output);
|
||||||
|
}
|
||||||
setIdleInhibitor(window, GLFW_TRUE);
|
setIdleInhibitor(window, GLFW_TRUE);
|
||||||
if (!window->wl.decorations.serverSide)
|
if (!window->wl.decorations.serverSide)
|
||||||
destroyDecorations(window);
|
destroyDecorations(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GLFWbool createShellSurface(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
if (!_glfw.wl.shell)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Wayland: wl_shell protocol not available");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
window->wl.shellSurface = wl_shell_get_shell_surface(_glfw.wl.shell,
|
||||||
|
window->wl.surface);
|
||||||
|
if (!window->wl.shellSurface)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Wayland: Shell surface creation failed");
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_shell_surface_add_listener(window->wl.shellSurface,
|
||||||
|
&shellSurfaceListener,
|
||||||
|
window);
|
||||||
|
|
||||||
|
if (window->wl.title)
|
||||||
|
wl_shell_surface_set_title(window->wl.shellSurface, window->wl.title);
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
setFullscreen(window, window->monitor, 0);
|
||||||
|
}
|
||||||
|
else if (window->wl.maximized)
|
||||||
|
{
|
||||||
|
wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);
|
||||||
|
setIdleInhibitor(window, GLFW_FALSE);
|
||||||
|
createDecorations(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
||||||
|
setIdleInhibitor(window, GLFW_FALSE);
|
||||||
|
createDecorations(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_surface_commit(window->wl.surface);
|
||||||
|
|
||||||
|
return GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void xdgToplevelHandleConfigure(void* data,
|
static void xdgToplevelHandleConfigure(void* data,
|
||||||
struct xdg_toplevel* toplevel,
|
struct xdg_toplevel* toplevel,
|
||||||
int32_t width,
|
int32_t width,
|
||||||
@@ -675,7 +796,7 @@ static void setCursorImage(_GLFWwindow* window,
|
|||||||
cursorWayland->yhot = image->hotspot_y;
|
cursorWayland->yhot = image->hotspot_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.serial,
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
|
||||||
surface,
|
surface,
|
||||||
cursorWayland->xhot / scale,
|
cursorWayland->xhot / scale,
|
||||||
cursorWayland->yhot / scale);
|
cursorWayland->yhot / scale);
|
||||||
@@ -777,6 +898,28 @@ static void handleEvents(int timeout)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Translates a GLFW standard cursor to a theme cursor name
|
||||||
|
//
|
||||||
|
static char *translateCursorShape(int shape)
|
||||||
|
{
|
||||||
|
switch (shape)
|
||||||
|
{
|
||||||
|
case GLFW_ARROW_CURSOR:
|
||||||
|
return "left_ptr";
|
||||||
|
case GLFW_IBEAM_CURSOR:
|
||||||
|
return "xterm";
|
||||||
|
case GLFW_CROSSHAIR_CURSOR:
|
||||||
|
return "crosshair";
|
||||||
|
case GLFW_HAND_CURSOR:
|
||||||
|
return "hand2";
|
||||||
|
case GLFW_HRESIZE_CURSOR:
|
||||||
|
return "sb_h_double_arrow";
|
||||||
|
case GLFW_VRESIZE_CURSOR:
|
||||||
|
return "sb_v_double_arrow";
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@@ -814,9 +957,17 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
window->wl.title = _glfw_strdup(wndconfig->title);
|
window->wl.title = _glfw_strdup(wndconfig->title);
|
||||||
|
|
||||||
if (wndconfig->visible)
|
if (wndconfig->visible)
|
||||||
|
{
|
||||||
|
if (_glfw.wl.wmBase)
|
||||||
{
|
{
|
||||||
if (!createXdgSurface(window))
|
if (!createXdgSurface(window))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!createShellSurface(window))
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
window->wl.visible = GLFW_TRUE;
|
window->wl.visible = GLFW_TRUE;
|
||||||
}
|
}
|
||||||
@@ -824,6 +975,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
window->wl.xdg.surface = NULL;
|
window->wl.xdg.surface = NULL;
|
||||||
window->wl.xdg.toplevel = NULL;
|
window->wl.xdg.toplevel = NULL;
|
||||||
|
window->wl.shellSurface = NULL;
|
||||||
window->wl.visible = GLFW_FALSE;
|
window->wl.visible = GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -865,6 +1017,9 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
|||||||
if (window->wl.native)
|
if (window->wl.native)
|
||||||
wl_egl_window_destroy(window->wl.native);
|
wl_egl_window_destroy(window->wl.native);
|
||||||
|
|
||||||
|
if (window->wl.shellSurface)
|
||||||
|
wl_shell_surface_destroy(window->wl.shellSurface);
|
||||||
|
|
||||||
if (window->wl.xdg.toplevel)
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_destroy(window->wl.xdg.toplevel);
|
xdg_toplevel_destroy(window->wl.xdg.toplevel);
|
||||||
|
|
||||||
@@ -885,13 +1040,15 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
|
|||||||
window->wl.title = _glfw_strdup(title);
|
window->wl.title = _glfw_strdup(title);
|
||||||
if (window->wl.xdg.toplevel)
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_set_title(window->wl.xdg.toplevel, title);
|
xdg_toplevel_set_title(window->wl.xdg.toplevel, title);
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
wl_shell_surface_set_title(window->wl.shellSurface, title);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
||||||
int count, const GLFWimage* images)
|
int count, const GLFWimage* images)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: The platform does not support setting the window icon");
|
"Wayland: Setting window icon not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
||||||
@@ -899,16 +1056,16 @@ void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
|
|||||||
// A Wayland client is not aware of its position, so just warn and leave it
|
// A Wayland client is not aware of its position, so just warn and leave it
|
||||||
// as (0, 0)
|
// as (0, 0)
|
||||||
|
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: The platform does not provide the window position");
|
"Wayland: Window position retrieval not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
||||||
{
|
{
|
||||||
// A Wayland client can not set its position, so just warn
|
// A Wayland client can not set its position, so just warn
|
||||||
|
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: The platform does not support setting the window position");
|
"Wayland: Window position setting not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
||||||
@@ -929,6 +1086,8 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
int minwidth, int minheight,
|
int minwidth, int minheight,
|
||||||
int maxwidth, int maxheight)
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
if (_glfw.wl.wmBase)
|
||||||
{
|
{
|
||||||
if (window->wl.xdg.toplevel)
|
if (window->wl.xdg.toplevel)
|
||||||
{
|
{
|
||||||
@@ -941,14 +1100,18 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
|||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: find out how to trigger a resize.
|
||||||
|
// The actual limits are checked in the wl_shell_surface::configure handler.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window,
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window,
|
||||||
int numer, int denom)
|
int numer, int denom)
|
||||||
{
|
{
|
||||||
// TODO: find out how to trigger a resize.
|
// TODO: find out how to trigger a resize.
|
||||||
// The actual limits are checked in the xdg_toplevel::configure handler.
|
// The actual limits are checked in the wl_shell_surface::configure handler.
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
|
||||||
"Wayland: Window aspect ratio not yet implemented");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window,
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window,
|
||||||
@@ -988,10 +1151,18 @@ void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformIconifyWindow(_GLFWwindow* window)
|
void _glfwPlatformIconifyWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
if (_glfw.wl.wmBase)
|
||||||
{
|
{
|
||||||
if (window->wl.xdg.toplevel)
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
|
xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Wayland: Iconify window not supported on wl_shell");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
@@ -1002,7 +1173,12 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|||||||
if (window->wl.maximized)
|
if (window->wl.maximized)
|
||||||
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
||||||
// There is no way to unset minimized, or even to know if we are
|
// There is no way to unset minimized, or even to know if we are
|
||||||
// minimized, so there is nothing to do in this case.
|
// minimized, so there is nothing to do here.
|
||||||
|
}
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
{
|
||||||
|
if (window->monitor || window->wl.maximized)
|
||||||
|
wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
||||||
}
|
}
|
||||||
_glfwInputWindowMonitor(window, NULL);
|
_glfwInputWindowMonitor(window, NULL);
|
||||||
window->wl.maximized = GLFW_FALSE;
|
window->wl.maximized = GLFW_FALSE;
|
||||||
@@ -1014,6 +1190,11 @@ void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
|
xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
|
||||||
}
|
}
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
{
|
||||||
|
// Let the compositor select the best output.
|
||||||
|
wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);
|
||||||
|
}
|
||||||
window->wl.maximized = GLFW_TRUE;
|
window->wl.maximized = GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,7 +1202,10 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
if (!window->wl.visible)
|
if (!window->wl.visible)
|
||||||
{
|
{
|
||||||
|
if (_glfw.wl.wmBase)
|
||||||
createXdgSurface(window);
|
createXdgSurface(window);
|
||||||
|
else if (!window->wl.shellSurface)
|
||||||
|
createShellSurface(window);
|
||||||
window->wl.visible = GLFW_TRUE;
|
window->wl.visible = GLFW_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1035,20 +1219,25 @@ void _glfwPlatformHideWindow(_GLFWwindow* window)
|
|||||||
window->wl.xdg.toplevel = NULL;
|
window->wl.xdg.toplevel = NULL;
|
||||||
window->wl.xdg.surface = NULL;
|
window->wl.xdg.surface = NULL;
|
||||||
}
|
}
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
{
|
||||||
|
wl_shell_surface_destroy(window->wl.shellSurface);
|
||||||
|
window->wl.shellSurface = NULL;
|
||||||
|
}
|
||||||
window->wl.visible = GLFW_FALSE;
|
window->wl.visible = GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window)
|
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Window attention request not implemented yet");
|
"Wayland: Window attention request not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: The platform does not support setting the input focus");
|
"Wayland: Focusing a window requires user interaction");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
@@ -1065,6 +1254,8 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
if (window->wl.xdg.toplevel)
|
if (window->wl.xdg.toplevel)
|
||||||
xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
|
xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
|
||||||
|
else if (window->wl.shellSurface)
|
||||||
|
wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
||||||
setIdleInhibitor(window, GLFW_FALSE);
|
setIdleInhibitor(window, GLFW_FALSE);
|
||||||
if (!_glfw.wl.decorationManager)
|
if (!_glfw.wl.decorationManager)
|
||||||
createDecorations(window);
|
createDecorations(window);
|
||||||
@@ -1079,8 +1270,8 @@ int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
|||||||
|
|
||||||
int _glfwPlatformWindowIconified(_GLFWwindow* window)
|
int _glfwPlatformWindowIconified(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
// xdg-shell doesn’t give any way to request whether a surface is
|
// wl_shell doesn't have any iconified concept, and xdg-shell doesn’t give
|
||||||
// iconified.
|
// any way to request whether a surface is iconified.
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1107,7 +1298,7 @@ int _glfwPlatformFramebufferTransparent(_GLFWwindow* window)
|
|||||||
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
|
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Window attribute setting not implemented yet");
|
"Wayland: Window attribute setting not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1125,23 +1316,10 @@ void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Window attribute setting not implemented yet");
|
"Wayland: Window attribute setting not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled)
|
|
||||||
{
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
struct wl_region* region = wl_compositor_create_region(_glfw.wl.compositor);
|
|
||||||
wl_surface_set_input_region(window->wl.surface, region);
|
|
||||||
wl_region_destroy(region);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
wl_surface_set_input_region(window->wl.surface, 0);
|
|
||||||
wl_surface_commit(window->wl.surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return 1.f;
|
return 1.f;
|
||||||
@@ -1149,8 +1327,6 @@ float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
|||||||
|
|
||||||
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
|
||||||
"Wayland: The platform does not support setting the window opacity");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled)
|
||||||
@@ -1212,8 +1388,6 @@ void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
|
|||||||
const char* _glfwPlatformGetScancodeName(int scancode)
|
const char* _glfwPlatformGetScancodeName(int scancode)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
_glfwInputError(GLFW_FEATURE_UNIMPLEMENTED,
|
|
||||||
"Wayland: Key names not yet implemented");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1239,79 +1413,26 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
|||||||
|
|
||||||
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
||||||
{
|
{
|
||||||
const char* name = NULL;
|
struct wl_cursor* standardCursor;
|
||||||
|
|
||||||
// Try the XDG names first
|
standardCursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme,
|
||||||
if (shape == GLFW_ARROW_CURSOR)
|
translateCursorShape(shape));
|
||||||
name = "default";
|
if (!standardCursor)
|
||||||
else if (shape == GLFW_IBEAM_CURSOR)
|
|
||||||
name = "text";
|
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
|
||||||
name = "crosshair";
|
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
|
||||||
name = "pointer";
|
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
|
||||||
name = "ew-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
|
||||||
name = "ns-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NWSE_CURSOR)
|
|
||||||
name = "nwse-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NESW_CURSOR)
|
|
||||||
name = "nesw-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
name = "all-scroll";
|
|
||||||
else if (shape == GLFW_NOT_ALLOWED_CURSOR)
|
|
||||||
name = "not-allowed";
|
|
||||||
|
|
||||||
cursor->wl.cursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme, name);
|
|
||||||
|
|
||||||
if (_glfw.wl.cursorThemeHiDPI)
|
|
||||||
{
|
|
||||||
cursor->wl.cursorHiDPI =
|
|
||||||
wl_cursor_theme_get_cursor(_glfw.wl.cursorThemeHiDPI, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cursor->wl.cursor)
|
|
||||||
{
|
|
||||||
// Fall back to the core X11 names
|
|
||||||
if (shape == GLFW_ARROW_CURSOR)
|
|
||||||
name = "left_ptr";
|
|
||||||
else if (shape == GLFW_IBEAM_CURSOR)
|
|
||||||
name = "xterm";
|
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
|
||||||
name = "crosshair";
|
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
|
||||||
name = "hand2";
|
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
|
||||||
name = "sb_h_double_arrow";
|
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
|
||||||
name = "sb_v_double_arrow";
|
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
name = "fleur";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_CURSOR_UNAVAILABLE,
|
|
||||||
"Wayland: Standard cursor shape unavailable");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor->wl.cursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme, name);
|
|
||||||
if (!cursor->wl.cursor)
|
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Wayland: Failed to create standard cursor \"%s\"",
|
"Wayland: Standard cursor \"%s\" not found",
|
||||||
name);
|
translateCursorShape(shape));
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cursor->wl.cursor = standardCursor;
|
||||||
|
cursor->wl.currentImage = 0;
|
||||||
|
|
||||||
if (_glfw.wl.cursorThemeHiDPI)
|
if (_glfw.wl.cursorThemeHiDPI)
|
||||||
{
|
{
|
||||||
if (!cursor->wl.cursorHiDPI)
|
standardCursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorThemeHiDPI,
|
||||||
{
|
translateCursorShape(shape));
|
||||||
cursor->wl.cursorHiDPI =
|
cursor->wl.cursorHiDPI = standardCursor;
|
||||||
wl_cursor_theme_get_cursor(_glfw.wl.cursorThemeHiDPI, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
@@ -1426,7 +1547,7 @@ static void lockPointer(_GLFWwindow* window)
|
|||||||
window->wl.pointerLock.relativePointer = relativePointer;
|
window->wl.pointerLock.relativePointer = relativePointer;
|
||||||
window->wl.pointerLock.lockedPointer = lockedPointer;
|
window->wl.pointerLock.lockedPointer = lockedPointer;
|
||||||
|
|
||||||
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.serial,
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial,
|
||||||
NULL, 0, 0);
|
NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1490,7 +1611,7 @@ void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)
|
|||||||
}
|
}
|
||||||
else if (window->cursorMode == GLFW_CURSOR_HIDDEN)
|
else if (window->cursorMode == GLFW_CURSOR_HIDDEN)
|
||||||
{
|
{
|
||||||
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.serial, NULL, 0, 0);
|
wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1699,24 +1820,6 @@ const char* _glfwPlatformGetClipboardString(void)
|
|||||||
return _glfw.wl.clipboardString;
|
return _glfw.wl.clipboardString;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum _glfwPlatformGetEGLPlatform(EGLint** attribs)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.EXT_platform_base && _glfw.egl.EXT_platform_wayland)
|
|
||||||
return EGL_PLATFORM_WAYLAND_EXT;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeDisplayType _glfwPlatformGetEGLNativeDisplay(void)
|
|
||||||
{
|
|
||||||
return _glfw.wl.display;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeWindowType _glfwPlatformGetEGLNativeWindow(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
return window->wl.native;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
{
|
{
|
||||||
if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_wayland_surface)
|
if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_wayland_surface)
|
||||||
|
|||||||
+22
-307
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -29,12 +29,13 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
#include <X11/Xresource.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
|
|
||||||
// Translate the X11 KeySyms for a key to a GLFW key code
|
// Translate the X11 KeySyms for a key to a GLFW key code
|
||||||
@@ -455,41 +456,7 @@ static GLFWbool hasUsableInputMethodStyle(void)
|
|||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void inputMethodDestroyCallback(XIM im, XPointer clientData, XPointer callData)
|
// Check whether the specified atom is supported
|
||||||
{
|
|
||||||
_glfw.x11.im = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void inputMethodInstantiateCallback(Display* display,
|
|
||||||
XPointer clientData,
|
|
||||||
XPointer callData)
|
|
||||||
{
|
|
||||||
if (_glfw.x11.im)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_glfw.x11.im = XOpenIM(_glfw.x11.display, 0, NULL, NULL);
|
|
||||||
if (_glfw.x11.im)
|
|
||||||
{
|
|
||||||
if (!hasUsableInputMethodStyle())
|
|
||||||
{
|
|
||||||
XCloseIM(_glfw.x11.im);
|
|
||||||
_glfw.x11.im = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.x11.im)
|
|
||||||
{
|
|
||||||
XIMCallback callback;
|
|
||||||
callback.callback = (XIMProc) inputMethodDestroyCallback;
|
|
||||||
callback.client_data = NULL;
|
|
||||||
XSetIMValues(_glfw.x11.im, XNDestroyCallback, &callback, NULL);
|
|
||||||
|
|
||||||
for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next)
|
|
||||||
_glfwCreateInputContextX11(window);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the atom ID only if it is listed in the specified array
|
|
||||||
//
|
//
|
||||||
static Atom getAtomIfSupported(Atom* supportedAtoms,
|
static Atom getAtomIfSupported(Atom* supportedAtoms,
|
||||||
unsigned long atomCount,
|
unsigned long atomCount,
|
||||||
@@ -754,12 +721,6 @@ static GLFWbool initExtensions(void)
|
|||||||
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorImageDestroy");
|
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorImageDestroy");
|
||||||
_glfw.x11.xcursor.ImageLoadCursor = (PFN_XcursorImageLoadCursor)
|
_glfw.x11.xcursor.ImageLoadCursor = (PFN_XcursorImageLoadCursor)
|
||||||
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorImageLoadCursor");
|
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorImageLoadCursor");
|
||||||
_glfw.x11.xcursor.GetTheme = (PFN_XcursorGetTheme)
|
|
||||||
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorGetTheme");
|
|
||||||
_glfw.x11.xcursor.GetDefaultSize = (PFN_XcursorGetDefaultSize)
|
|
||||||
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorGetDefaultSize");
|
|
||||||
_glfw.x11.xcursor.LibraryLoadImage = (PFN_XcursorLibraryLoadImage)
|
|
||||||
_glfw_dlsym(_glfw.x11.xcursor.handle, "XcursorLibraryLoadImage");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
#if defined(__CYGWIN__)
|
||||||
@@ -851,35 +812,6 @@ static GLFWbool initExtensions(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
|
||||||
_glfw.x11.xshape.handle = _glfw_dlopen("libXext-6.so");
|
|
||||||
#else
|
|
||||||
_glfw.x11.xshape.handle = _glfw_dlopen("libXext.so.6");
|
|
||||||
#endif
|
|
||||||
if (_glfw.x11.xshape.handle)
|
|
||||||
{
|
|
||||||
_glfw.x11.xshape.QueryExtension = (PFN_XShapeQueryExtension)
|
|
||||||
_glfw_dlsym(_glfw.x11.xshape.handle, "XShapeQueryExtension");
|
|
||||||
_glfw.x11.xshape.ShapeCombineRegion = (PFN_XShapeCombineRegion)
|
|
||||||
_glfw_dlsym(_glfw.x11.xshape.handle, "XShapeCombineRegion");
|
|
||||||
_glfw.x11.xshape.QueryVersion = (PFN_XShapeQueryVersion)
|
|
||||||
_glfw_dlsym(_glfw.x11.xshape.handle, "XShapeQueryVersion");
|
|
||||||
_glfw.x11.xshape.ShapeCombineMask = (PFN_XShapeCombineMask)
|
|
||||||
_glfw_dlsym(_glfw.x11.xshape.handle, "XShapeCombineMask");
|
|
||||||
|
|
||||||
if (XShapeQueryExtension(_glfw.x11.display,
|
|
||||||
&_glfw.x11.xshape.errorBase,
|
|
||||||
&_glfw.x11.xshape.eventBase))
|
|
||||||
{
|
|
||||||
if (XShapeQueryVersion(_glfw.x11.display,
|
|
||||||
&_glfw.x11.xshape.major,
|
|
||||||
&_glfw.x11.xshape.minor))
|
|
||||||
{
|
|
||||||
_glfw.x11.xshape.available = GLFW_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the key code LUT
|
// Update the key code LUT
|
||||||
// FIXME: We should listen to XkbMapNotify events to track changes to
|
// FIXME: We should listen to XkbMapNotify events to track changes to
|
||||||
// the keyboard mapping.
|
// the keyboard mapping.
|
||||||
@@ -1114,225 +1046,6 @@ int _glfwPlatformInit(void)
|
|||||||
if (strcmp(setlocale(LC_CTYPE, NULL), "C") == 0)
|
if (strcmp(setlocale(LC_CTYPE, NULL), "C") == 0)
|
||||||
setlocale(LC_CTYPE, "");
|
setlocale(LC_CTYPE, "");
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
|
||||||
_glfw.x11.xlib.handle = _glfw_dlopen("libX11-6.so");
|
|
||||||
#else
|
|
||||||
_glfw.x11.xlib.handle = _glfw_dlopen("libX11.so.6");
|
|
||||||
#endif
|
|
||||||
if (!_glfw.x11.xlib.handle)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "X11: Failed to load Xlib");
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfw.x11.xlib.AllocClassHint = (PFN_XAllocClassHint)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XAllocClassHint");
|
|
||||||
_glfw.x11.xlib.AllocSizeHints = (PFN_XAllocSizeHints)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XAllocSizeHints");
|
|
||||||
_glfw.x11.xlib.AllocWMHints = (PFN_XAllocWMHints)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XAllocWMHints");
|
|
||||||
_glfw.x11.xlib.ChangeProperty = (PFN_XChangeProperty)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XChangeProperty");
|
|
||||||
_glfw.x11.xlib.ChangeWindowAttributes = (PFN_XChangeWindowAttributes)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XChangeWindowAttributes");
|
|
||||||
_glfw.x11.xlib.CheckIfEvent = (PFN_XCheckIfEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCheckIfEvent");
|
|
||||||
_glfw.x11.xlib.CheckTypedWindowEvent = (PFN_XCheckTypedWindowEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCheckTypedWindowEvent");
|
|
||||||
_glfw.x11.xlib.CloseDisplay = (PFN_XCloseDisplay)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCloseDisplay");
|
|
||||||
_glfw.x11.xlib.CloseIM = (PFN_XCloseIM)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCloseIM");
|
|
||||||
_glfw.x11.xlib.ConvertSelection = (PFN_XConvertSelection)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XConvertSelection");
|
|
||||||
_glfw.x11.xlib.CreateColormap = (PFN_XCreateColormap)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCreateColormap");
|
|
||||||
_glfw.x11.xlib.CreateFontCursor = (PFN_XCreateFontCursor)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCreateFontCursor");
|
|
||||||
_glfw.x11.xlib.CreateIC = (PFN_XCreateIC)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCreateIC");
|
|
||||||
_glfw.x11.xlib.CreateRegion = (PFN_XCreateRegion)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCreateRegion");
|
|
||||||
_glfw.x11.xlib.CreateWindow = (PFN_XCreateWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XCreateWindow");
|
|
||||||
_glfw.x11.xlib.DefineCursor = (PFN_XDefineCursor)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDefineCursor");
|
|
||||||
_glfw.x11.xlib.DeleteContext = (PFN_XDeleteContext)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDeleteContext");
|
|
||||||
_glfw.x11.xlib.DeleteProperty = (PFN_XDeleteProperty)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDeleteProperty");
|
|
||||||
_glfw.x11.xlib.DestroyIC = (PFN_XDestroyIC)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDestroyIC");
|
|
||||||
_glfw.x11.xlib.DestroyRegion = (PFN_XDestroyRegion)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDestroyRegion");
|
|
||||||
_glfw.x11.xlib.DestroyWindow = (PFN_XDestroyWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDestroyWindow");
|
|
||||||
_glfw.x11.xlib.DisplayKeycodes = (PFN_XDisplayKeycodes)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XDisplayKeycodes");
|
|
||||||
_glfw.x11.xlib.EventsQueued = (PFN_XEventsQueued)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XEventsQueued");
|
|
||||||
_glfw.x11.xlib.FilterEvent = (PFN_XFilterEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFilterEvent");
|
|
||||||
_glfw.x11.xlib.FindContext = (PFN_XFindContext)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFindContext");
|
|
||||||
_glfw.x11.xlib.Flush = (PFN_XFlush)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFlush");
|
|
||||||
_glfw.x11.xlib.Free = (PFN_XFree)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFree");
|
|
||||||
_glfw.x11.xlib.FreeColormap = (PFN_XFreeColormap)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFreeColormap");
|
|
||||||
_glfw.x11.xlib.FreeCursor = (PFN_XFreeCursor)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFreeCursor");
|
|
||||||
_glfw.x11.xlib.FreeEventData = (PFN_XFreeEventData)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XFreeEventData");
|
|
||||||
_glfw.x11.xlib.GetErrorText = (PFN_XGetErrorText)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetErrorText");
|
|
||||||
_glfw.x11.xlib.GetEventData = (PFN_XGetEventData)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetEventData");
|
|
||||||
_glfw.x11.xlib.GetICValues = (PFN_XGetICValues)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetICValues");
|
|
||||||
_glfw.x11.xlib.GetIMValues = (PFN_XGetIMValues)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetIMValues");
|
|
||||||
_glfw.x11.xlib.GetInputFocus = (PFN_XGetInputFocus)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetInputFocus");
|
|
||||||
_glfw.x11.xlib.GetKeyboardMapping = (PFN_XGetKeyboardMapping)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetKeyboardMapping");
|
|
||||||
_glfw.x11.xlib.GetScreenSaver = (PFN_XGetScreenSaver)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetScreenSaver");
|
|
||||||
_glfw.x11.xlib.GetSelectionOwner = (PFN_XGetSelectionOwner)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetSelectionOwner");
|
|
||||||
_glfw.x11.xlib.GetVisualInfo = (PFN_XGetVisualInfo)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetVisualInfo");
|
|
||||||
_glfw.x11.xlib.GetWMNormalHints = (PFN_XGetWMNormalHints)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetWMNormalHints");
|
|
||||||
_glfw.x11.xlib.GetWindowAttributes = (PFN_XGetWindowAttributes)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetWindowAttributes");
|
|
||||||
_glfw.x11.xlib.GetWindowProperty = (PFN_XGetWindowProperty)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGetWindowProperty");
|
|
||||||
_glfw.x11.xlib.GrabPointer = (PFN_XGrabPointer)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XGrabPointer");
|
|
||||||
_glfw.x11.xlib.IconifyWindow = (PFN_XIconifyWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XIconifyWindow");
|
|
||||||
_glfw.x11.xlib.InitThreads = (PFN_XInitThreads)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XInitThreads");
|
|
||||||
_glfw.x11.xlib.InternAtom = (PFN_XInternAtom)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XInternAtom");
|
|
||||||
_glfw.x11.xlib.LookupString = (PFN_XLookupString)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XLookupString");
|
|
||||||
_glfw.x11.xlib.MapRaised = (PFN_XMapRaised)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XMapRaised");
|
|
||||||
_glfw.x11.xlib.MapWindow = (PFN_XMapWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XMapWindow");
|
|
||||||
_glfw.x11.xlib.MoveResizeWindow = (PFN_XMoveResizeWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XMoveResizeWindow");
|
|
||||||
_glfw.x11.xlib.MoveWindow = (PFN_XMoveWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XMoveWindow");
|
|
||||||
_glfw.x11.xlib.NextEvent = (PFN_XNextEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XNextEvent");
|
|
||||||
_glfw.x11.xlib.OpenDisplay = (PFN_XOpenDisplay)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XOpenDisplay");
|
|
||||||
_glfw.x11.xlib.OpenIM = (PFN_XOpenIM)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XOpenIM");
|
|
||||||
_glfw.x11.xlib.PeekEvent = (PFN_XPeekEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XPeekEvent");
|
|
||||||
_glfw.x11.xlib.Pending = (PFN_XPending)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XPending");
|
|
||||||
_glfw.x11.xlib.QueryExtension = (PFN_XQueryExtension)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XQueryExtension");
|
|
||||||
_glfw.x11.xlib.QueryPointer = (PFN_XQueryPointer)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XQueryPointer");
|
|
||||||
_glfw.x11.xlib.RaiseWindow = (PFN_XRaiseWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XRaiseWindow");
|
|
||||||
_glfw.x11.xlib.RegisterIMInstantiateCallback = (PFN_XRegisterIMInstantiateCallback)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XRegisterIMInstantiateCallback");
|
|
||||||
_glfw.x11.xlib.ResizeWindow = (PFN_XResizeWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XResizeWindow");
|
|
||||||
_glfw.x11.xlib.ResourceManagerString = (PFN_XResourceManagerString)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XResourceManagerString");
|
|
||||||
_glfw.x11.xlib.SaveContext = (PFN_XSaveContext)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSaveContext");
|
|
||||||
_glfw.x11.xlib.SelectInput = (PFN_XSelectInput)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSelectInput");
|
|
||||||
_glfw.x11.xlib.SendEvent = (PFN_XSendEvent)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSendEvent");
|
|
||||||
_glfw.x11.xlib.SetClassHint = (PFN_XSetClassHint)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetClassHint");
|
|
||||||
_glfw.x11.xlib.SetErrorHandler = (PFN_XSetErrorHandler)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetErrorHandler");
|
|
||||||
_glfw.x11.xlib.SetICFocus = (PFN_XSetICFocus)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetICFocus");
|
|
||||||
_glfw.x11.xlib.SetIMValues = (PFN_XSetIMValues)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetIMValues");
|
|
||||||
_glfw.x11.xlib.SetInputFocus = (PFN_XSetInputFocus)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetInputFocus");
|
|
||||||
_glfw.x11.xlib.SetLocaleModifiers = (PFN_XSetLocaleModifiers)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetLocaleModifiers");
|
|
||||||
_glfw.x11.xlib.SetScreenSaver = (PFN_XSetScreenSaver)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetScreenSaver");
|
|
||||||
_glfw.x11.xlib.SetSelectionOwner = (PFN_XSetSelectionOwner)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetSelectionOwner");
|
|
||||||
_glfw.x11.xlib.SetWMHints = (PFN_XSetWMHints)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetWMHints");
|
|
||||||
_glfw.x11.xlib.SetWMNormalHints = (PFN_XSetWMNormalHints)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetWMNormalHints");
|
|
||||||
_glfw.x11.xlib.SetWMProtocols = (PFN_XSetWMProtocols)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSetWMProtocols");
|
|
||||||
_glfw.x11.xlib.SupportsLocale = (PFN_XSupportsLocale)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSupportsLocale");
|
|
||||||
_glfw.x11.xlib.Sync = (PFN_XSync)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XSync");
|
|
||||||
_glfw.x11.xlib.TranslateCoordinates = (PFN_XTranslateCoordinates)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XTranslateCoordinates");
|
|
||||||
_glfw.x11.xlib.UndefineCursor = (PFN_XUndefineCursor)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XUndefineCursor");
|
|
||||||
_glfw.x11.xlib.UngrabPointer = (PFN_XUngrabPointer)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XUngrabPointer");
|
|
||||||
_glfw.x11.xlib.UnmapWindow = (PFN_XUnmapWindow)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XUnmapWindow");
|
|
||||||
_glfw.x11.xlib.UnsetICFocus = (PFN_XUnsetICFocus)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XUnsetICFocus");
|
|
||||||
_glfw.x11.xlib.VisualIDFromVisual = (PFN_XVisualIDFromVisual)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XVisualIDFromVisual");
|
|
||||||
_glfw.x11.xlib.WarpPointer = (PFN_XWarpPointer)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XWarpPointer");
|
|
||||||
_glfw.x11.xkb.FreeKeyboard = (PFN_XkbFreeKeyboard)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbFreeKeyboard");
|
|
||||||
_glfw.x11.xkb.FreeNames = (PFN_XkbFreeNames)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbFreeNames");
|
|
||||||
_glfw.x11.xkb.GetMap = (PFN_XkbGetMap)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbGetMap");
|
|
||||||
_glfw.x11.xkb.GetNames = (PFN_XkbGetNames)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbGetNames");
|
|
||||||
_glfw.x11.xkb.GetState = (PFN_XkbGetState)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbGetState");
|
|
||||||
_glfw.x11.xkb.KeycodeToKeysym = (PFN_XkbKeycodeToKeysym)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbKeycodeToKeysym");
|
|
||||||
_glfw.x11.xkb.QueryExtension = (PFN_XkbQueryExtension)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbQueryExtension");
|
|
||||||
_glfw.x11.xkb.SelectEventDetails = (PFN_XkbSelectEventDetails)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbSelectEventDetails");
|
|
||||||
_glfw.x11.xkb.SetDetectableAutoRepeat = (PFN_XkbSetDetectableAutoRepeat)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XkbSetDetectableAutoRepeat");
|
|
||||||
_glfw.x11.xrm.DestroyDatabase = (PFN_XrmDestroyDatabase)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XrmDestroyDatabase");
|
|
||||||
_glfw.x11.xrm.GetResource = (PFN_XrmGetResource)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XrmGetResource");
|
|
||||||
_glfw.x11.xrm.GetStringDatabase = (PFN_XrmGetStringDatabase)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XrmGetStringDatabase");
|
|
||||||
_glfw.x11.xrm.Initialize = (PFN_XrmInitialize)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XrmInitialize");
|
|
||||||
_glfw.x11.xrm.UniqueQuark = (PFN_XrmUniqueQuark)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XrmUniqueQuark");
|
|
||||||
_glfw.x11.xlib.UnregisterIMInstantiateCallback = (PFN_XUnregisterIMInstantiateCallback)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "XUnregisterIMInstantiateCallback");
|
|
||||||
_glfw.x11.xlib.utf8LookupString = (PFN_Xutf8LookupString)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "Xutf8LookupString");
|
|
||||||
_glfw.x11.xlib.utf8SetWMProperties = (PFN_Xutf8SetWMProperties)
|
|
||||||
_glfw_dlsym(_glfw.x11.xlib.handle, "Xutf8SetWMProperties");
|
|
||||||
|
|
||||||
if (_glfw.x11.xlib.utf8LookupString && _glfw.x11.xlib.utf8SetWMProperties)
|
|
||||||
_glfw.x11.xlib.utf8 = GLFW_TRUE;
|
|
||||||
|
|
||||||
XInitThreads();
|
XInitThreads();
|
||||||
XrmInitialize();
|
XrmInitialize();
|
||||||
|
|
||||||
@@ -1366,16 +1079,25 @@ int _glfwPlatformInit(void)
|
|||||||
_glfw.x11.helperWindowHandle = createHelperWindow();
|
_glfw.x11.helperWindowHandle = createHelperWindow();
|
||||||
_glfw.x11.hiddenCursorHandle = createHiddenCursor();
|
_glfw.x11.hiddenCursorHandle = createHiddenCursor();
|
||||||
|
|
||||||
if (XSupportsLocale() && _glfw.x11.xlib.utf8)
|
if (XSupportsLocale())
|
||||||
{
|
{
|
||||||
XSetLocaleModifiers("");
|
XSetLocaleModifiers("");
|
||||||
|
|
||||||
// If an IM is already present our callback will be called right away
|
_glfw.x11.im = XOpenIM(_glfw.x11.display, 0, NULL, NULL);
|
||||||
XRegisterIMInstantiateCallback(_glfw.x11.display,
|
if (_glfw.x11.im)
|
||||||
NULL, NULL, NULL,
|
{
|
||||||
inputMethodInstantiateCallback,
|
if (!hasUsableInputMethodStyle())
|
||||||
NULL);
|
{
|
||||||
|
XCloseIM(_glfw.x11.im);
|
||||||
|
_glfw.x11.im = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
if (!_glfwInitJoysticksLinux())
|
||||||
|
return GLFW_FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
_glfwInitTimerPOSIX();
|
_glfwInitTimerPOSIX();
|
||||||
|
|
||||||
@@ -1406,11 +1128,6 @@ void _glfwPlatformTerminate(void)
|
|||||||
free(_glfw.x11.primarySelectionString);
|
free(_glfw.x11.primarySelectionString);
|
||||||
free(_glfw.x11.clipboardString);
|
free(_glfw.x11.clipboardString);
|
||||||
|
|
||||||
XUnregisterIMInstantiateCallback(_glfw.x11.display,
|
|
||||||
NULL, NULL, NULL,
|
|
||||||
inputMethodInstantiateCallback,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (_glfw.x11.im)
|
if (_glfw.x11.im)
|
||||||
{
|
{
|
||||||
XCloseIM(_glfw.x11.im);
|
XCloseIM(_glfw.x11.im);
|
||||||
@@ -1470,11 +1187,9 @@ void _glfwPlatformTerminate(void)
|
|||||||
_glfwTerminateEGL();
|
_glfwTerminateEGL();
|
||||||
_glfwTerminateGLX();
|
_glfwTerminateGLX();
|
||||||
|
|
||||||
if (_glfw.x11.xlib.handle)
|
#if defined(__linux__)
|
||||||
{
|
_glfwTerminateJoysticksLinux();
|
||||||
_glfw_dlclose(_glfw.x11.xlib.handle);
|
#endif
|
||||||
_glfw.x11.xlib.handle = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* _glfwPlatformGetVersionString(void)
|
const char* _glfwPlatformGetVersionString(void)
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
|
|||||||
+6
-357
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.3 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,7 +33,6 @@
|
|||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/Xresource.h>
|
|
||||||
#include <X11/Xcursor/Xcursor.h>
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
|
||||||
// The XRandR extension provides mode setting and gamma control
|
// The XRandR extension provides mode setting and gamma control
|
||||||
@@ -48,214 +47,6 @@
|
|||||||
// The XInput extension provides raw mouse motion input
|
// The XInput extension provides raw mouse motion input
|
||||||
#include <X11/extensions/XInput2.h>
|
#include <X11/extensions/XInput2.h>
|
||||||
|
|
||||||
// The Shape extension provides custom window shapes
|
|
||||||
#include <X11/extensions/shape.h>
|
|
||||||
|
|
||||||
typedef XClassHint* (* PFN_XAllocClassHint)(void);
|
|
||||||
typedef XSizeHints* (* PFN_XAllocSizeHints)(void);
|
|
||||||
typedef XWMHints* (* PFN_XAllocWMHints)(void);
|
|
||||||
typedef int (* PFN_XChangeProperty)(Display*,Window,Atom,Atom,int,int,const unsigned char*,int);
|
|
||||||
typedef int (* PFN_XChangeWindowAttributes)(Display*,Window,unsigned long,XSetWindowAttributes*);
|
|
||||||
typedef Bool (* PFN_XCheckIfEvent)(Display*,XEvent*,Bool(*)(Display*,XEvent*,XPointer),XPointer);
|
|
||||||
typedef Bool (* PFN_XCheckTypedWindowEvent)(Display*,Window,int,XEvent*);
|
|
||||||
typedef int (* PFN_XCloseDisplay)(Display*);
|
|
||||||
typedef Status (* PFN_XCloseIM)(XIM);
|
|
||||||
typedef int (* PFN_XConvertSelection)(Display*,Atom,Atom,Atom,Window,Time);
|
|
||||||
typedef Colormap (* PFN_XCreateColormap)(Display*,Window,Visual*,int);
|
|
||||||
typedef Cursor (* PFN_XCreateFontCursor)(Display*,unsigned int);
|
|
||||||
typedef XIC (* PFN_XCreateIC)(XIM,...);
|
|
||||||
typedef Region (* PFN_XCreateRegion)(void);
|
|
||||||
typedef Window (* PFN_XCreateWindow)(Display*,Window,int,int,unsigned int,unsigned int,unsigned int,int,unsigned int,Visual*,unsigned long,XSetWindowAttributes*);
|
|
||||||
typedef int (* PFN_XDefineCursor)(Display*,Window,Cursor);
|
|
||||||
typedef int (* PFN_XDeleteContext)(Display*,XID,XContext);
|
|
||||||
typedef int (* PFN_XDeleteProperty)(Display*,Window,Atom);
|
|
||||||
typedef void (* PFN_XDestroyIC)(XIC);
|
|
||||||
typedef int (* PFN_XDestroyRegion)(Region);
|
|
||||||
typedef int (* PFN_XDestroyWindow)(Display*,Window);
|
|
||||||
typedef int (* PFN_XDisplayKeycodes)(Display*,int*,int*);
|
|
||||||
typedef int (* PFN_XEventsQueued)(Display*,int);
|
|
||||||
typedef Bool (* PFN_XFilterEvent)(XEvent*,Window);
|
|
||||||
typedef int (* PFN_XFindContext)(Display*,XID,XContext,XPointer*);
|
|
||||||
typedef int (* PFN_XFlush)(Display*);
|
|
||||||
typedef int (* PFN_XFree)(void*);
|
|
||||||
typedef int (* PFN_XFreeColormap)(Display*,Colormap);
|
|
||||||
typedef int (* PFN_XFreeCursor)(Display*,Cursor);
|
|
||||||
typedef void (* PFN_XFreeEventData)(Display*,XGenericEventCookie*);
|
|
||||||
typedef int (* PFN_XGetErrorText)(Display*,int,char*,int);
|
|
||||||
typedef Bool (* PFN_XGetEventData)(Display*,XGenericEventCookie*);
|
|
||||||
typedef char* (* PFN_XGetICValues)(XIC,...);
|
|
||||||
typedef char* (* PFN_XGetIMValues)(XIM,...);
|
|
||||||
typedef int (* PFN_XGetInputFocus)(Display*,Window*,int*);
|
|
||||||
typedef KeySym* (* PFN_XGetKeyboardMapping)(Display*,KeyCode,int,int*);
|
|
||||||
typedef int (* PFN_XGetScreenSaver)(Display*,int*,int*,int*,int*);
|
|
||||||
typedef Window (* PFN_XGetSelectionOwner)(Display*,Atom);
|
|
||||||
typedef XVisualInfo* (* PFN_XGetVisualInfo)(Display*,long,XVisualInfo*,int*);
|
|
||||||
typedef Status (* PFN_XGetWMNormalHints)(Display*,Window,XSizeHints*,long*);
|
|
||||||
typedef Status (* PFN_XGetWindowAttributes)(Display*,Window,XWindowAttributes*);
|
|
||||||
typedef int (* PFN_XGetWindowProperty)(Display*,Window,Atom,long,long,Bool,Atom,Atom*,int*,unsigned long*,unsigned long*,unsigned char**);
|
|
||||||
typedef int (* PFN_XGrabPointer)(Display*,Window,Bool,unsigned int,int,int,Window,Cursor,Time);
|
|
||||||
typedef Status (* PFN_XIconifyWindow)(Display*,Window,int);
|
|
||||||
typedef Status (* PFN_XInitThreads)(void);
|
|
||||||
typedef Atom (* PFN_XInternAtom)(Display*,const char*,Bool);
|
|
||||||
typedef int (* PFN_XLookupString)(XKeyEvent*,char*,int,KeySym*,XComposeStatus*);
|
|
||||||
typedef int (* PFN_XMapRaised)(Display*,Window);
|
|
||||||
typedef int (* PFN_XMapWindow)(Display*,Window);
|
|
||||||
typedef int (* PFN_XMoveResizeWindow)(Display*,Window,int,int,unsigned int,unsigned int);
|
|
||||||
typedef int (* PFN_XMoveWindow)(Display*,Window,int,int);
|
|
||||||
typedef int (* PFN_XNextEvent)(Display*,XEvent*);
|
|
||||||
typedef Display* (* PFN_XOpenDisplay)(const char*);
|
|
||||||
typedef XIM (* PFN_XOpenIM)(Display*,XrmDatabase*,char*,char*);
|
|
||||||
typedef int (* PFN_XPeekEvent)(Display*,XEvent*);
|
|
||||||
typedef int (* PFN_XPending)(Display*);
|
|
||||||
typedef Bool (* PFN_XQueryExtension)(Display*,const char*,int*,int*,int*);
|
|
||||||
typedef Bool (* PFN_XQueryPointer)(Display*,Window,Window*,Window*,int*,int*,int*,int*,unsigned int*);
|
|
||||||
typedef int (* PFN_XRaiseWindow)(Display*,Window);
|
|
||||||
typedef Bool (* PFN_XRegisterIMInstantiateCallback)(Display*,void*,char*,char*,XIDProc,XPointer);
|
|
||||||
typedef int (* PFN_XResizeWindow)(Display*,Window,unsigned int,unsigned int);
|
|
||||||
typedef char* (* PFN_XResourceManagerString)(Display*);
|
|
||||||
typedef int (* PFN_XSaveContext)(Display*,XID,XContext,const char*);
|
|
||||||
typedef int (* PFN_XSelectInput)(Display*,Window,long);
|
|
||||||
typedef Status (* PFN_XSendEvent)(Display*,Window,Bool,long,XEvent*);
|
|
||||||
typedef int (* PFN_XSetClassHint)(Display*,Window,XClassHint*);
|
|
||||||
typedef XErrorHandler (* PFN_XSetErrorHandler)(XErrorHandler);
|
|
||||||
typedef void (* PFN_XSetICFocus)(XIC);
|
|
||||||
typedef char* (* PFN_XSetIMValues)(XIM,...);
|
|
||||||
typedef int (* PFN_XSetInputFocus)(Display*,Window,int,Time);
|
|
||||||
typedef char* (* PFN_XSetLocaleModifiers)(const char*);
|
|
||||||
typedef int (* PFN_XSetScreenSaver)(Display*,int,int,int,int);
|
|
||||||
typedef int (* PFN_XSetSelectionOwner)(Display*,Atom,Window,Time);
|
|
||||||
typedef int (* PFN_XSetWMHints)(Display*,Window,XWMHints*);
|
|
||||||
typedef void (* PFN_XSetWMNormalHints)(Display*,Window,XSizeHints*);
|
|
||||||
typedef Status (* PFN_XSetWMProtocols)(Display*,Window,Atom*,int);
|
|
||||||
typedef Bool (* PFN_XSupportsLocale)(void);
|
|
||||||
typedef int (* PFN_XSync)(Display*,Bool);
|
|
||||||
typedef Bool (* PFN_XTranslateCoordinates)(Display*,Window,Window,int,int,int*,int*,Window*);
|
|
||||||
typedef int (* PFN_XUndefineCursor)(Display*,Window);
|
|
||||||
typedef int (* PFN_XUngrabPointer)(Display*,Time);
|
|
||||||
typedef int (* PFN_XUnmapWindow)(Display*,Window);
|
|
||||||
typedef void (* PFN_XUnsetICFocus)(XIC);
|
|
||||||
typedef VisualID (* PFN_XVisualIDFromVisual)(Visual*);
|
|
||||||
typedef int (* PFN_XWarpPointer)(Display*,Window,Window,int,int,unsigned int,unsigned int,int,int);
|
|
||||||
typedef void (* PFN_XkbFreeKeyboard)(XkbDescPtr,unsigned int,Bool);
|
|
||||||
typedef void (* PFN_XkbFreeNames)(XkbDescPtr,unsigned int,Bool);
|
|
||||||
typedef XkbDescPtr (* PFN_XkbGetMap)(Display*,unsigned int,unsigned int);
|
|
||||||
typedef Status (* PFN_XkbGetNames)(Display*,unsigned int,XkbDescPtr);
|
|
||||||
typedef Status (* PFN_XkbGetState)(Display*,unsigned int,XkbStatePtr);
|
|
||||||
typedef KeySym (* PFN_XkbKeycodeToKeysym)(Display*,KeyCode,int,int);
|
|
||||||
typedef Bool (* PFN_XkbQueryExtension)(Display*,int*,int*,int*,int*,int*);
|
|
||||||
typedef Bool (* PFN_XkbSelectEventDetails)(Display*,unsigned int,unsigned int,unsigned long,unsigned long);
|
|
||||||
typedef Bool (* PFN_XkbSetDetectableAutoRepeat)(Display*,Bool,Bool*);
|
|
||||||
typedef void (* PFN_XrmDestroyDatabase)(XrmDatabase);
|
|
||||||
typedef Bool (* PFN_XrmGetResource)(XrmDatabase,const char*,const char*,char**,XrmValue*);
|
|
||||||
typedef XrmDatabase (* PFN_XrmGetStringDatabase)(const char*);
|
|
||||||
typedef void (* PFN_XrmInitialize)(void);
|
|
||||||
typedef XrmQuark (* PFN_XrmUniqueQuark)(void);
|
|
||||||
typedef Bool (* PFN_XUnregisterIMInstantiateCallback)(Display*,void*,char*,char*,XIDProc,XPointer);
|
|
||||||
typedef int (* PFN_Xutf8LookupString)(XIC,XKeyPressedEvent*,char*,int,KeySym*,Status*);
|
|
||||||
typedef void (* PFN_Xutf8SetWMProperties)(Display*,Window,const char*,const char*,char**,int,XSizeHints*,XWMHints*,XClassHint*);
|
|
||||||
#define XAllocClassHint _glfw.x11.xlib.AllocClassHint
|
|
||||||
#define XAllocSizeHints _glfw.x11.xlib.AllocSizeHints
|
|
||||||
#define XAllocWMHints _glfw.x11.xlib.AllocWMHints
|
|
||||||
#define XChangeProperty _glfw.x11.xlib.ChangeProperty
|
|
||||||
#define XChangeWindowAttributes _glfw.x11.xlib.ChangeWindowAttributes
|
|
||||||
#define XCheckIfEvent _glfw.x11.xlib.CheckIfEvent
|
|
||||||
#define XCheckTypedWindowEvent _glfw.x11.xlib.CheckTypedWindowEvent
|
|
||||||
#define XCloseDisplay _glfw.x11.xlib.CloseDisplay
|
|
||||||
#define XCloseIM _glfw.x11.xlib.CloseIM
|
|
||||||
#define XConvertSelection _glfw.x11.xlib.ConvertSelection
|
|
||||||
#define XCreateColormap _glfw.x11.xlib.CreateColormap
|
|
||||||
#define XCreateFontCursor _glfw.x11.xlib.CreateFontCursor
|
|
||||||
#define XCreateIC _glfw.x11.xlib.CreateIC
|
|
||||||
#define XCreateRegion _glfw.x11.xlib.CreateRegion
|
|
||||||
#define XCreateWindow _glfw.x11.xlib.CreateWindow
|
|
||||||
#define XDefineCursor _glfw.x11.xlib.DefineCursor
|
|
||||||
#define XDeleteContext _glfw.x11.xlib.DeleteContext
|
|
||||||
#define XDeleteProperty _glfw.x11.xlib.DeleteProperty
|
|
||||||
#define XDestroyIC _glfw.x11.xlib.DestroyIC
|
|
||||||
#define XDestroyRegion _glfw.x11.xlib.DestroyRegion
|
|
||||||
#define XDestroyWindow _glfw.x11.xlib.DestroyWindow
|
|
||||||
#define XDisplayKeycodes _glfw.x11.xlib.DisplayKeycodes
|
|
||||||
#define XEventsQueued _glfw.x11.xlib.EventsQueued
|
|
||||||
#define XFilterEvent _glfw.x11.xlib.FilterEvent
|
|
||||||
#define XFindContext _glfw.x11.xlib.FindContext
|
|
||||||
#define XFlush _glfw.x11.xlib.Flush
|
|
||||||
#define XFree _glfw.x11.xlib.Free
|
|
||||||
#define XFreeColormap _glfw.x11.xlib.FreeColormap
|
|
||||||
#define XFreeCursor _glfw.x11.xlib.FreeCursor
|
|
||||||
#define XFreeEventData _glfw.x11.xlib.FreeEventData
|
|
||||||
#define XGetErrorText _glfw.x11.xlib.GetErrorText
|
|
||||||
#define XGetEventData _glfw.x11.xlib.GetEventData
|
|
||||||
#define XGetICValues _glfw.x11.xlib.GetICValues
|
|
||||||
#define XGetIMValues _glfw.x11.xlib.GetIMValues
|
|
||||||
#define XGetInputFocus _glfw.x11.xlib.GetInputFocus
|
|
||||||
#define XGetKeyboardMapping _glfw.x11.xlib.GetKeyboardMapping
|
|
||||||
#define XGetScreenSaver _glfw.x11.xlib.GetScreenSaver
|
|
||||||
#define XGetSelectionOwner _glfw.x11.xlib.GetSelectionOwner
|
|
||||||
#define XGetVisualInfo _glfw.x11.xlib.GetVisualInfo
|
|
||||||
#define XGetWMNormalHints _glfw.x11.xlib.GetWMNormalHints
|
|
||||||
#define XGetWindowAttributes _glfw.x11.xlib.GetWindowAttributes
|
|
||||||
#define XGetWindowProperty _glfw.x11.xlib.GetWindowProperty
|
|
||||||
#define XGrabPointer _glfw.x11.xlib.GrabPointer
|
|
||||||
#define XIconifyWindow _glfw.x11.xlib.IconifyWindow
|
|
||||||
#define XInitThreads _glfw.x11.xlib.InitThreads
|
|
||||||
#define XInternAtom _glfw.x11.xlib.InternAtom
|
|
||||||
#define XLookupString _glfw.x11.xlib.LookupString
|
|
||||||
#define XMapRaised _glfw.x11.xlib.MapRaised
|
|
||||||
#define XMapWindow _glfw.x11.xlib.MapWindow
|
|
||||||
#define XMoveResizeWindow _glfw.x11.xlib.MoveResizeWindow
|
|
||||||
#define XMoveWindow _glfw.x11.xlib.MoveWindow
|
|
||||||
#define XNextEvent _glfw.x11.xlib.NextEvent
|
|
||||||
#define XOpenDisplay _glfw.x11.xlib.OpenDisplay
|
|
||||||
#define XOpenIM _glfw.x11.xlib.OpenIM
|
|
||||||
#define XPeekEvent _glfw.x11.xlib.PeekEvent
|
|
||||||
#define XPending _glfw.x11.xlib.Pending
|
|
||||||
#define XQueryExtension _glfw.x11.xlib.QueryExtension
|
|
||||||
#define XQueryPointer _glfw.x11.xlib.QueryPointer
|
|
||||||
#define XRaiseWindow _glfw.x11.xlib.RaiseWindow
|
|
||||||
#define XRegisterIMInstantiateCallback _glfw.x11.xlib.RegisterIMInstantiateCallback
|
|
||||||
#define XResizeWindow _glfw.x11.xlib.ResizeWindow
|
|
||||||
#define XResourceManagerString _glfw.x11.xlib.ResourceManagerString
|
|
||||||
#define XSaveContext _glfw.x11.xlib.SaveContext
|
|
||||||
#define XSelectInput _glfw.x11.xlib.SelectInput
|
|
||||||
#define XSendEvent _glfw.x11.xlib.SendEvent
|
|
||||||
#define XSetClassHint _glfw.x11.xlib.SetClassHint
|
|
||||||
#define XSetErrorHandler _glfw.x11.xlib.SetErrorHandler
|
|
||||||
#define XSetICFocus _glfw.x11.xlib.SetICFocus
|
|
||||||
#define XSetIMValues _glfw.x11.xlib.SetIMValues
|
|
||||||
#define XSetInputFocus _glfw.x11.xlib.SetInputFocus
|
|
||||||
#define XSetLocaleModifiers _glfw.x11.xlib.SetLocaleModifiers
|
|
||||||
#define XSetScreenSaver _glfw.x11.xlib.SetScreenSaver
|
|
||||||
#define XSetSelectionOwner _glfw.x11.xlib.SetSelectionOwner
|
|
||||||
#define XSetWMHints _glfw.x11.xlib.SetWMHints
|
|
||||||
#define XSetWMNormalHints _glfw.x11.xlib.SetWMNormalHints
|
|
||||||
#define XSetWMProtocols _glfw.x11.xlib.SetWMProtocols
|
|
||||||
#define XSupportsLocale _glfw.x11.xlib.SupportsLocale
|
|
||||||
#define XSync _glfw.x11.xlib.Sync
|
|
||||||
#define XTranslateCoordinates _glfw.x11.xlib.TranslateCoordinates
|
|
||||||
#define XUndefineCursor _glfw.x11.xlib.UndefineCursor
|
|
||||||
#define XUngrabPointer _glfw.x11.xlib.UngrabPointer
|
|
||||||
#define XUnmapWindow _glfw.x11.xlib.UnmapWindow
|
|
||||||
#define XUnsetICFocus _glfw.x11.xlib.UnsetICFocus
|
|
||||||
#define XVisualIDFromVisual _glfw.x11.xlib.VisualIDFromVisual
|
|
||||||
#define XWarpPointer _glfw.x11.xlib.WarpPointer
|
|
||||||
#define XkbFreeKeyboard _glfw.x11.xkb.FreeKeyboard
|
|
||||||
#define XkbFreeNames _glfw.x11.xkb.FreeNames
|
|
||||||
#define XkbGetMap _glfw.x11.xkb.GetMap
|
|
||||||
#define XkbGetNames _glfw.x11.xkb.GetNames
|
|
||||||
#define XkbGetState _glfw.x11.xkb.GetState
|
|
||||||
#define XkbKeycodeToKeysym _glfw.x11.xkb.KeycodeToKeysym
|
|
||||||
#define XkbQueryExtension _glfw.x11.xkb.QueryExtension
|
|
||||||
#define XkbSelectEventDetails _glfw.x11.xkb.SelectEventDetails
|
|
||||||
#define XkbSetDetectableAutoRepeat _glfw.x11.xkb.SetDetectableAutoRepeat
|
|
||||||
#define XrmDestroyDatabase _glfw.x11.xrm.DestroyDatabase
|
|
||||||
#define XrmGetResource _glfw.x11.xrm.GetResource
|
|
||||||
#define XrmGetStringDatabase _glfw.x11.xrm.GetStringDatabase
|
|
||||||
#define XrmInitialize _glfw.x11.xrm.Initialize
|
|
||||||
#define XrmUniqueQuark _glfw.x11.xrm.UniqueQuark
|
|
||||||
#define XUnregisterIMInstantiateCallback _glfw.x11.xlib.UnregisterIMInstantiateCallback
|
|
||||||
#define Xutf8LookupString _glfw.x11.xlib.utf8LookupString
|
|
||||||
#define Xutf8SetWMProperties _glfw.x11.xlib.utf8SetWMProperties
|
|
||||||
|
|
||||||
typedef XRRCrtcGamma* (* PFN_XRRAllocGamma)(int);
|
typedef XRRCrtcGamma* (* PFN_XRRAllocGamma)(int);
|
||||||
typedef void (* PFN_XRRFreeCrtcInfo)(XRRCrtcInfo*);
|
typedef void (* PFN_XRRFreeCrtcInfo)(XRRCrtcInfo*);
|
||||||
typedef void (* PFN_XRRFreeGamma)(XRRCrtcGamma*);
|
typedef void (* PFN_XRRFreeGamma)(XRRCrtcGamma*);
|
||||||
@@ -294,15 +85,9 @@ typedef int (* PFN_XRRUpdateConfiguration)(XEvent*);
|
|||||||
typedef XcursorImage* (* PFN_XcursorImageCreate)(int,int);
|
typedef XcursorImage* (* PFN_XcursorImageCreate)(int,int);
|
||||||
typedef void (* PFN_XcursorImageDestroy)(XcursorImage*);
|
typedef void (* PFN_XcursorImageDestroy)(XcursorImage*);
|
||||||
typedef Cursor (* PFN_XcursorImageLoadCursor)(Display*,const XcursorImage*);
|
typedef Cursor (* PFN_XcursorImageLoadCursor)(Display*,const XcursorImage*);
|
||||||
typedef char* (* PFN_XcursorGetTheme)(Display*);
|
|
||||||
typedef int (* PFN_XcursorGetDefaultSize)(Display*);
|
|
||||||
typedef XcursorImage* (* PFN_XcursorLibraryLoadImage)(const char*,const char*,int);
|
|
||||||
#define XcursorImageCreate _glfw.x11.xcursor.ImageCreate
|
#define XcursorImageCreate _glfw.x11.xcursor.ImageCreate
|
||||||
#define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy
|
#define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy
|
||||||
#define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor
|
#define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor
|
||||||
#define XcursorGetTheme _glfw.x11.xcursor.GetTheme
|
|
||||||
#define XcursorGetDefaultSize _glfw.x11.xcursor.GetDefaultSize
|
|
||||||
#define XcursorLibraryLoadImage _glfw.x11.xcursor.LibraryLoadImage
|
|
||||||
|
|
||||||
typedef Bool (* PFN_XineramaIsActive)(Display*);
|
typedef Bool (* PFN_XineramaIsActive)(Display*);
|
||||||
typedef Bool (* PFN_XineramaQueryExtension)(Display*,int*,int*);
|
typedef Bool (* PFN_XineramaQueryExtension)(Display*,int*,int*);
|
||||||
@@ -338,16 +123,6 @@ typedef XRenderPictFormat* (* PFN_XRenderFindVisualFormat)(Display*,Visual const
|
|||||||
#define XRenderQueryVersion _glfw.x11.xrender.QueryVersion
|
#define XRenderQueryVersion _glfw.x11.xrender.QueryVersion
|
||||||
#define XRenderFindVisualFormat _glfw.x11.xrender.FindVisualFormat
|
#define XRenderFindVisualFormat _glfw.x11.xrender.FindVisualFormat
|
||||||
|
|
||||||
typedef Bool (* PFN_XShapeQueryExtension)(Display*,int*,int*);
|
|
||||||
typedef Status (* PFN_XShapeQueryVersion)(Display*dpy,int*,int*);
|
|
||||||
typedef void (* PFN_XShapeCombineRegion)(Display*,Window,int,int,int,Region,int);
|
|
||||||
typedef void (* PFN_XShapeCombineMask)(Display*,Window,int,int,int,Pixmap,int);
|
|
||||||
|
|
||||||
#define XShapeQueryExtension _glfw.x11.xshape.QueryExtension
|
|
||||||
#define XShapeQueryVersion _glfw.x11.xshape.QueryVersion
|
|
||||||
#define XShapeCombineRegion _glfw.x11.xshape.ShapeCombineRegion
|
|
||||||
#define XShapeCombineMask _glfw.x11.xshape.ShapeCombineMask
|
|
||||||
|
|
||||||
typedef VkFlags VkXlibSurfaceCreateFlagsKHR;
|
typedef VkFlags VkXlibSurfaceCreateFlagsKHR;
|
||||||
typedef VkFlags VkXcbSurfaceCreateFlagsKHR;
|
typedef VkFlags VkXcbSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
@@ -378,6 +153,8 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(Vk
|
|||||||
#include "posix_time.h"
|
#include "posix_time.h"
|
||||||
#include "xkb_unicode.h"
|
#include "xkb_unicode.h"
|
||||||
#include "glx_context.h"
|
#include "glx_context.h"
|
||||||
|
#include "egl_context.h"
|
||||||
|
#include "osmesa_context.h"
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#include "linux_joystick.h"
|
#include "linux_joystick.h"
|
||||||
#else
|
#else
|
||||||
@@ -388,6 +165,9 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(Vk
|
|||||||
#define _glfw_dlclose(handle) dlclose(handle)
|
#define _glfw_dlclose(handle) dlclose(handle)
|
||||||
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
||||||
|
|
||||||
|
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->x11.handle)
|
||||||
|
#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.x11.display)
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 x11
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 x11
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11
|
||||||
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 x11
|
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 x11
|
||||||
@@ -422,7 +202,6 @@ typedef struct _GLFWwindowX11
|
|||||||
// The time of the last KeyPress event per keycode, for discarding
|
// The time of the last KeyPress event per keycode, for discarding
|
||||||
// duplicate key events generated for some keys by ibus
|
// duplicate key events generated for some keys by ibus
|
||||||
Time keyPressTimes[256];
|
Time keyPressTimes[256];
|
||||||
|
|
||||||
} _GLFWwindowX11;
|
} _GLFWwindowX11;
|
||||||
|
|
||||||
// X11-specific global data
|
// X11-specific global data
|
||||||
@@ -516,107 +295,6 @@ typedef struct _GLFWlibraryX11
|
|||||||
Atom ATOM_PAIR;
|
Atom ATOM_PAIR;
|
||||||
Atom GLFW_SELECTION;
|
Atom GLFW_SELECTION;
|
||||||
|
|
||||||
struct {
|
|
||||||
void* handle;
|
|
||||||
GLFWbool utf8;
|
|
||||||
PFN_XAllocClassHint AllocClassHint;
|
|
||||||
PFN_XAllocSizeHints AllocSizeHints;
|
|
||||||
PFN_XAllocWMHints AllocWMHints;
|
|
||||||
PFN_XChangeProperty ChangeProperty;
|
|
||||||
PFN_XChangeWindowAttributes ChangeWindowAttributes;
|
|
||||||
PFN_XCheckIfEvent CheckIfEvent;
|
|
||||||
PFN_XCheckTypedWindowEvent CheckTypedWindowEvent;
|
|
||||||
PFN_XCloseDisplay CloseDisplay;
|
|
||||||
PFN_XCloseIM CloseIM;
|
|
||||||
PFN_XConvertSelection ConvertSelection;
|
|
||||||
PFN_XCreateColormap CreateColormap;
|
|
||||||
PFN_XCreateFontCursor CreateFontCursor;
|
|
||||||
PFN_XCreateIC CreateIC;
|
|
||||||
PFN_XCreateRegion CreateRegion;
|
|
||||||
PFN_XCreateWindow CreateWindow;
|
|
||||||
PFN_XDefineCursor DefineCursor;
|
|
||||||
PFN_XDeleteContext DeleteContext;
|
|
||||||
PFN_XDeleteProperty DeleteProperty;
|
|
||||||
PFN_XDestroyIC DestroyIC;
|
|
||||||
PFN_XDestroyRegion DestroyRegion;
|
|
||||||
PFN_XDestroyWindow DestroyWindow;
|
|
||||||
PFN_XDisplayKeycodes DisplayKeycodes;
|
|
||||||
PFN_XEventsQueued EventsQueued;
|
|
||||||
PFN_XFilterEvent FilterEvent;
|
|
||||||
PFN_XFindContext FindContext;
|
|
||||||
PFN_XFlush Flush;
|
|
||||||
PFN_XFree Free;
|
|
||||||
PFN_XFreeColormap FreeColormap;
|
|
||||||
PFN_XFreeCursor FreeCursor;
|
|
||||||
PFN_XFreeEventData FreeEventData;
|
|
||||||
PFN_XGetErrorText GetErrorText;
|
|
||||||
PFN_XGetEventData GetEventData;
|
|
||||||
PFN_XGetICValues GetICValues;
|
|
||||||
PFN_XGetIMValues GetIMValues;
|
|
||||||
PFN_XGetInputFocus GetInputFocus;
|
|
||||||
PFN_XGetKeyboardMapping GetKeyboardMapping;
|
|
||||||
PFN_XGetScreenSaver GetScreenSaver;
|
|
||||||
PFN_XGetSelectionOwner GetSelectionOwner;
|
|
||||||
PFN_XGetVisualInfo GetVisualInfo;
|
|
||||||
PFN_XGetWMNormalHints GetWMNormalHints;
|
|
||||||
PFN_XGetWindowAttributes GetWindowAttributes;
|
|
||||||
PFN_XGetWindowProperty GetWindowProperty;
|
|
||||||
PFN_XGrabPointer GrabPointer;
|
|
||||||
PFN_XIconifyWindow IconifyWindow;
|
|
||||||
PFN_XInitThreads InitThreads;
|
|
||||||
PFN_XInternAtom InternAtom;
|
|
||||||
PFN_XLookupString LookupString;
|
|
||||||
PFN_XMapRaised MapRaised;
|
|
||||||
PFN_XMapWindow MapWindow;
|
|
||||||
PFN_XMoveResizeWindow MoveResizeWindow;
|
|
||||||
PFN_XMoveWindow MoveWindow;
|
|
||||||
PFN_XNextEvent NextEvent;
|
|
||||||
PFN_XOpenDisplay OpenDisplay;
|
|
||||||
PFN_XOpenIM OpenIM;
|
|
||||||
PFN_XPeekEvent PeekEvent;
|
|
||||||
PFN_XPending Pending;
|
|
||||||
PFN_XQueryExtension QueryExtension;
|
|
||||||
PFN_XQueryPointer QueryPointer;
|
|
||||||
PFN_XRaiseWindow RaiseWindow;
|
|
||||||
PFN_XRegisterIMInstantiateCallback RegisterIMInstantiateCallback;
|
|
||||||
PFN_XResizeWindow ResizeWindow;
|
|
||||||
PFN_XResourceManagerString ResourceManagerString;
|
|
||||||
PFN_XSaveContext SaveContext;
|
|
||||||
PFN_XSelectInput SelectInput;
|
|
||||||
PFN_XSendEvent SendEvent;
|
|
||||||
PFN_XSetClassHint SetClassHint;
|
|
||||||
PFN_XSetErrorHandler SetErrorHandler;
|
|
||||||
PFN_XSetICFocus SetICFocus;
|
|
||||||
PFN_XSetIMValues SetIMValues;
|
|
||||||
PFN_XSetInputFocus SetInputFocus;
|
|
||||||
PFN_XSetLocaleModifiers SetLocaleModifiers;
|
|
||||||
PFN_XSetScreenSaver SetScreenSaver;
|
|
||||||
PFN_XSetSelectionOwner SetSelectionOwner;
|
|
||||||
PFN_XSetWMHints SetWMHints;
|
|
||||||
PFN_XSetWMNormalHints SetWMNormalHints;
|
|
||||||
PFN_XSetWMProtocols SetWMProtocols;
|
|
||||||
PFN_XSupportsLocale SupportsLocale;
|
|
||||||
PFN_XSync Sync;
|
|
||||||
PFN_XTranslateCoordinates TranslateCoordinates;
|
|
||||||
PFN_XUndefineCursor UndefineCursor;
|
|
||||||
PFN_XUngrabPointer UngrabPointer;
|
|
||||||
PFN_XUnmapWindow UnmapWindow;
|
|
||||||
PFN_XUnsetICFocus UnsetICFocus;
|
|
||||||
PFN_XVisualIDFromVisual VisualIDFromVisual;
|
|
||||||
PFN_XWarpPointer WarpPointer;
|
|
||||||
PFN_XUnregisterIMInstantiateCallback UnregisterIMInstantiateCallback;
|
|
||||||
PFN_Xutf8LookupString utf8LookupString;
|
|
||||||
PFN_Xutf8SetWMProperties utf8SetWMProperties;
|
|
||||||
} xlib;
|
|
||||||
|
|
||||||
struct {
|
|
||||||
PFN_XrmDestroyDatabase DestroyDatabase;
|
|
||||||
PFN_XrmGetResource GetResource;
|
|
||||||
PFN_XrmGetStringDatabase GetStringDatabase;
|
|
||||||
PFN_XrmInitialize Initialize;
|
|
||||||
PFN_XrmUniqueQuark UniqueQuark;
|
|
||||||
} xrm;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
GLFWbool available;
|
GLFWbool available;
|
||||||
void* handle;
|
void* handle;
|
||||||
@@ -654,15 +332,6 @@ typedef struct _GLFWlibraryX11
|
|||||||
int major;
|
int major;
|
||||||
int minor;
|
int minor;
|
||||||
unsigned int group;
|
unsigned int group;
|
||||||
PFN_XkbFreeKeyboard FreeKeyboard;
|
|
||||||
PFN_XkbFreeNames FreeNames;
|
|
||||||
PFN_XkbGetMap GetMap;
|
|
||||||
PFN_XkbGetNames GetNames;
|
|
||||||
PFN_XkbGetState GetState;
|
|
||||||
PFN_XkbKeycodeToKeysym KeycodeToKeysym;
|
|
||||||
PFN_XkbQueryExtension QueryExtension;
|
|
||||||
PFN_XkbSelectEventDetails SelectEventDetails;
|
|
||||||
PFN_XkbSetDetectableAutoRepeat SetDetectableAutoRepeat;
|
|
||||||
} xkb;
|
} xkb;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -684,9 +353,6 @@ typedef struct _GLFWlibraryX11
|
|||||||
PFN_XcursorImageCreate ImageCreate;
|
PFN_XcursorImageCreate ImageCreate;
|
||||||
PFN_XcursorImageDestroy ImageDestroy;
|
PFN_XcursorImageDestroy ImageDestroy;
|
||||||
PFN_XcursorImageLoadCursor ImageLoadCursor;
|
PFN_XcursorImageLoadCursor ImageLoadCursor;
|
||||||
PFN_XcursorGetTheme GetTheme;
|
|
||||||
PFN_XcursorGetDefaultSize GetDefaultSize;
|
|
||||||
PFN_XcursorLibraryLoadImage LibraryLoadImage;
|
|
||||||
} xcursor;
|
} xcursor;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -738,20 +404,6 @@ typedef struct _GLFWlibraryX11
|
|||||||
PFN_XRenderQueryVersion QueryVersion;
|
PFN_XRenderQueryVersion QueryVersion;
|
||||||
PFN_XRenderFindVisualFormat FindVisualFormat;
|
PFN_XRenderFindVisualFormat FindVisualFormat;
|
||||||
} xrender;
|
} xrender;
|
||||||
|
|
||||||
struct {
|
|
||||||
GLFWbool available;
|
|
||||||
void* handle;
|
|
||||||
int major;
|
|
||||||
int minor;
|
|
||||||
int eventBase;
|
|
||||||
int errorBase;
|
|
||||||
PFN_XShapeQueryExtension QueryExtension;
|
|
||||||
PFN_XShapeCombineRegion ShapeCombineRegion;
|
|
||||||
PFN_XShapeQueryVersion QueryVersion;
|
|
||||||
PFN_XShapeCombineMask ShapeCombineMask;
|
|
||||||
} xshape;
|
|
||||||
|
|
||||||
} _GLFWlibraryX11;
|
} _GLFWlibraryX11;
|
||||||
|
|
||||||
// X11-specific per-monitor data
|
// X11-specific per-monitor data
|
||||||
@@ -765,7 +417,6 @@ typedef struct _GLFWmonitorX11
|
|||||||
// Index of corresponding Xinerama screen,
|
// Index of corresponding Xinerama screen,
|
||||||
// for EWMH full screen window placement
|
// for EWMH full screen window placement
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
} _GLFWmonitorX11;
|
} _GLFWmonitorX11;
|
||||||
|
|
||||||
// X11-specific per-cursor data
|
// X11-specific per-cursor data
|
||||||
@@ -773,7 +424,6 @@ typedef struct _GLFWmonitorX11
|
|||||||
typedef struct _GLFWcursorX11
|
typedef struct _GLFWcursorX11
|
||||||
{
|
{
|
||||||
Cursor handle;
|
Cursor handle;
|
||||||
|
|
||||||
} _GLFWcursorX11;
|
} _GLFWcursorX11;
|
||||||
|
|
||||||
|
|
||||||
@@ -794,5 +444,4 @@ void _glfwReleaseErrorHandlerX11(void);
|
|||||||
void _glfwInputErrorX11(int error, const char* message);
|
void _glfwInputErrorX11(int error, const char* message);
|
||||||
|
|
||||||
void _glfwPushSelectionToManagerX11(void);
|
void _glfwPushSelectionToManagerX11(void);
|
||||||
void _glfwCreateInputContextX11(_GLFWwindow* window);
|
|
||||||
|
|
||||||
|
|||||||
+90
-181
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
@@ -463,6 +463,7 @@ static size_t encodeUTF8(char* s, unsigned int ch)
|
|||||||
// Decode a Unicode code point from a UTF-8 stream
|
// Decode a Unicode code point from a UTF-8 stream
|
||||||
// Based on cutef8 by Jeff Bezanson (Public Domain)
|
// Based on cutef8 by Jeff Bezanson (Public Domain)
|
||||||
//
|
//
|
||||||
|
#if defined(X_HAVE_UTF8_STRING)
|
||||||
static unsigned int decodeUTF8(const char** s)
|
static unsigned int decodeUTF8(const char** s)
|
||||||
{
|
{
|
||||||
unsigned int ch = 0, count = 0;
|
unsigned int ch = 0, count = 0;
|
||||||
@@ -482,6 +483,7 @@ static unsigned int decodeUTF8(const char** s)
|
|||||||
assert(count <= 6);
|
assert(count <= 6);
|
||||||
return ch - offsets[count - 1];
|
return ch - offsets[count - 1];
|
||||||
}
|
}
|
||||||
|
#endif /*X_HAVE_UTF8_STRING*/
|
||||||
|
|
||||||
// Convert the specified Latin-1 string to UTF-8
|
// Convert the specified Latin-1 string to UTF-8
|
||||||
//
|
//
|
||||||
@@ -588,14 +590,6 @@ static void enableCursor(_GLFWwindow* window)
|
|||||||
updateCursorImage(window);
|
updateCursorImage(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear its handle when the input context has been destroyed
|
|
||||||
//
|
|
||||||
static void inputContextDestroyCallback(XIC ic, XPointer clientData, XPointer callData)
|
|
||||||
{
|
|
||||||
_GLFWwindow* window = (_GLFWwindow*) clientData;
|
|
||||||
window->x11.ic = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the X11 window (and its colormap)
|
// Create the X11 window (and its colormap)
|
||||||
//
|
//
|
||||||
static GLFWbool createNativeWindow(_GLFWwindow* window,
|
static GLFWbool createNativeWindow(_GLFWwindow* window,
|
||||||
@@ -774,10 +768,27 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
|||||||
PropModeReplace, (unsigned char*) &version, 1);
|
PropModeReplace, (unsigned char*) &version, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.x11.im)
|
|
||||||
_glfwCreateInputContextX11(window);
|
|
||||||
|
|
||||||
_glfwPlatformSetWindowTitle(window, wndconfig->title);
|
_glfwPlatformSetWindowTitle(window, wndconfig->title);
|
||||||
|
|
||||||
|
if (_glfw.x11.im)
|
||||||
|
{
|
||||||
|
window->x11.ic = XCreateIC(_glfw.x11.im,
|
||||||
|
XNInputStyle,
|
||||||
|
XIMPreeditNothing | XIMStatusNothing,
|
||||||
|
XNClientWindow,
|
||||||
|
window->x11.handle,
|
||||||
|
XNFocusWindow,
|
||||||
|
window->x11.handle,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->x11.ic)
|
||||||
|
{
|
||||||
|
unsigned long filter = 0;
|
||||||
|
if (XGetICValues(window->x11.ic, XNFilterEvents, &filter, NULL) == NULL)
|
||||||
|
XSelectInput(_glfw.x11.display, window->x11.handle, wa.event_mask | filter);
|
||||||
|
}
|
||||||
|
|
||||||
_glfwPlatformGetWindowPos(window, &window->x11.xpos, &window->x11.ypos);
|
_glfwPlatformGetWindowPos(window, &window->x11.xpos, &window->x11.ypos);
|
||||||
_glfwPlatformGetWindowSize(window, &window->x11.width, &window->x11.height);
|
_glfwPlatformGetWindowSize(window, &window->x11.width, &window->x11.height);
|
||||||
|
|
||||||
@@ -1162,6 +1173,7 @@ static void processEvent(XEvent *event)
|
|||||||
if (event->type == KeyPress || event->type == KeyRelease)
|
if (event->type == KeyPress || event->type == KeyRelease)
|
||||||
keycode = event->xkey.keycode;
|
keycode = event->xkey.keycode;
|
||||||
|
|
||||||
|
if (_glfw.x11.im)
|
||||||
filtered = XFilterEvent(event, None);
|
filtered = XFilterEvent(event, None);
|
||||||
|
|
||||||
if (_glfw.x11.randr.available)
|
if (_glfw.x11.randr.available)
|
||||||
@@ -1283,6 +1295,7 @@ static void processEvent(XEvent *event)
|
|||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
Status status;
|
Status status;
|
||||||
|
#if defined(X_HAVE_UTF8_STRING)
|
||||||
char buffer[100];
|
char buffer[100];
|
||||||
char* chars = buffer;
|
char* chars = buffer;
|
||||||
|
|
||||||
@@ -1307,6 +1320,33 @@ static void processEvent(XEvent *event)
|
|||||||
while (c - chars < count)
|
while (c - chars < count)
|
||||||
_glfwInputChar(window, decodeUTF8(&c), mods, plain);
|
_glfwInputChar(window, decodeUTF8(&c), mods, plain);
|
||||||
}
|
}
|
||||||
|
#else /*X_HAVE_UTF8_STRING*/
|
||||||
|
wchar_t buffer[16];
|
||||||
|
wchar_t* chars = buffer;
|
||||||
|
|
||||||
|
count = XwcLookupString(window->x11.ic,
|
||||||
|
&event->xkey,
|
||||||
|
buffer,
|
||||||
|
sizeof(buffer) / sizeof(wchar_t),
|
||||||
|
NULL,
|
||||||
|
&status);
|
||||||
|
|
||||||
|
if (status == XBufferOverflow)
|
||||||
|
{
|
||||||
|
chars = calloc(count, sizeof(wchar_t));
|
||||||
|
count = XwcLookupString(window->x11.ic,
|
||||||
|
&event->xkey,
|
||||||
|
chars, count,
|
||||||
|
NULL, &status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == XLookupChars || status == XLookupBoth)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
_glfwInputChar(window, chars[i], mods, plain);
|
||||||
|
}
|
||||||
|
#endif /*X_HAVE_UTF8_STRING*/
|
||||||
|
|
||||||
if (chars != buffer)
|
if (chars != buffer)
|
||||||
free(chars);
|
free(chars);
|
||||||
@@ -1933,38 +1973,6 @@ void _glfwPushSelectionToManagerX11(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwCreateInputContextX11(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
XIMCallback callback;
|
|
||||||
callback.callback = (XIMProc) inputContextDestroyCallback;
|
|
||||||
callback.client_data = (XPointer) window;
|
|
||||||
|
|
||||||
window->x11.ic = XCreateIC(_glfw.x11.im,
|
|
||||||
XNInputStyle,
|
|
||||||
XIMPreeditNothing | XIMStatusNothing,
|
|
||||||
XNClientWindow,
|
|
||||||
window->x11.handle,
|
|
||||||
XNFocusWindow,
|
|
||||||
window->x11.handle,
|
|
||||||
XNDestroyCallback,
|
|
||||||
&callback,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (window->x11.ic)
|
|
||||||
{
|
|
||||||
XWindowAttributes attribs;
|
|
||||||
XGetWindowAttributes(_glfw.x11.display, window->x11.handle, &attribs);
|
|
||||||
|
|
||||||
unsigned long filter = 0;
|
|
||||||
if (XGetICValues(window->x11.ic, XNFilterEvents, &filter, NULL) == NULL)
|
|
||||||
{
|
|
||||||
XSelectInput(_glfw.x11.display,
|
|
||||||
window->x11.handle,
|
|
||||||
attribs.your_event_mask | filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
@@ -2076,14 +2084,21 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
|||||||
|
|
||||||
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
|
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
|
||||||
{
|
{
|
||||||
if (_glfw.x11.xlib.utf8)
|
#if defined(X_HAVE_UTF8_STRING)
|
||||||
{
|
|
||||||
Xutf8SetWMProperties(_glfw.x11.display,
|
Xutf8SetWMProperties(_glfw.x11.display,
|
||||||
window->x11.handle,
|
window->x11.handle,
|
||||||
title, title,
|
title, title,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
}
|
#else
|
||||||
|
// This may be a slightly better fallback than using XStoreName and
|
||||||
|
// XSetIconName, which always store their arguments using STRING
|
||||||
|
XmbSetWMProperties(_glfw.x11.display,
|
||||||
|
window->x11.handle,
|
||||||
|
title, title,
|
||||||
|
NULL, 0,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
_glfw.x11.NET_WM_NAME, _glfw.x11.UTF8_STRING, 8,
|
_glfw.x11.NET_WM_NAME, _glfw.x11.UTF8_STRING, 8,
|
||||||
@@ -2108,8 +2123,8 @@ void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
|||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
longCount += 2 + images[i].width * images[i].height;
|
longCount += 2 + images[i].width * images[i].height;
|
||||||
|
|
||||||
long* icon = calloc(longCount, sizeof(long));
|
unsigned long* icon = calloc(longCount, sizeof(unsigned long));
|
||||||
long* target = icon;
|
unsigned long* target = icon;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
@@ -2118,13 +2133,19 @@ void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
|||||||
|
|
||||||
for (j = 0; j < images[i].width * images[i].height; j++)
|
for (j = 0; j < images[i].width * images[i].height; j++)
|
||||||
{
|
{
|
||||||
*target++ = (images[i].pixels[j * 4 + 0] << 16) |
|
*target++ = (((unsigned long) images[i].pixels[j * 4 + 0]) << 16) |
|
||||||
(images[i].pixels[j * 4 + 1] << 8) |
|
(((unsigned long) images[i].pixels[j * 4 + 1]) << 8) |
|
||||||
(images[i].pixels[j * 4 + 2] << 0) |
|
(((unsigned long) images[i].pixels[j * 4 + 2]) << 0) |
|
||||||
(images[i].pixels[j * 4 + 3] << 24);
|
(((unsigned long) images[i].pixels[j * 4 + 3]) << 24);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: XChangeProperty expects 32-bit values like the image data above to be
|
||||||
|
// placed in the 32 least significant bits of individual longs. This is
|
||||||
|
// true even if long is 64-bit and a WM protocol calls for "packed" data.
|
||||||
|
// This is because of a historical mistake that then became part of the Xlib
|
||||||
|
// ABI. Xlib will pack these values into a regular array of 32-bit values
|
||||||
|
// before sending it over the wire.
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
_glfw.x11.NET_WM_ICON,
|
_glfw.x11.NET_WM_ICON,
|
||||||
XA_CARDINAL, 32,
|
XA_CARDINAL, 32,
|
||||||
@@ -2485,7 +2506,11 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
_glfwPlatformSetWindowDecorated(window, window->decorated);
|
||||||
|
_glfwPlatformSetWindowFloating(window, window->floating);
|
||||||
releaseMonitor(window);
|
releaseMonitor(window);
|
||||||
|
}
|
||||||
|
|
||||||
_glfwInputWindowMonitor(window, monitor);
|
_glfwInputWindowMonitor(window, monitor);
|
||||||
updateNormalHints(window, width, height);
|
updateNormalHints(window, width, height);
|
||||||
@@ -2667,15 +2692,15 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < count)
|
if (i == count)
|
||||||
return;
|
{
|
||||||
|
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
PropModeAppend,
|
PropModeAppend,
|
||||||
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (states)
|
else if (states)
|
||||||
{
|
{
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
@@ -2684,9 +2709,8 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == count)
|
if (i < count)
|
||||||
return;
|
{
|
||||||
|
|
||||||
states[i] = states[count - 1];
|
states[i] = states[count - 1];
|
||||||
count--;
|
count--;
|
||||||
|
|
||||||
@@ -2694,6 +2718,7 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
PropModeReplace, (unsigned char*) states, count);
|
PropModeReplace, (unsigned char*) states, count);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (states)
|
if (states)
|
||||||
XFree(states);
|
XFree(states);
|
||||||
@@ -2702,25 +2727,6 @@ void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
XFlush(_glfw.x11.display);
|
XFlush(_glfw.x11.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowMousePassthrough(_GLFWwindow* window, GLFWbool enabled)
|
|
||||||
{
|
|
||||||
if (!_glfw.x11.xshape.available)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
Region region = XCreateRegion();
|
|
||||||
XShapeCombineRegion(_glfw.x11.display, window->x11.handle,
|
|
||||||
ShapeInput, 0, 0, region, ShapeSet);
|
|
||||||
XDestroyRegion(region);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XShapeCombineMask(_glfw.x11.display, window->x11.handle,
|
|
||||||
ShapeInput, 0, 0, None, ShapeSet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
float opacity = 1.f;
|
float opacity = 1.f;
|
||||||
@@ -2776,12 +2782,11 @@ void _glfwPlatformPollEvents(void)
|
|||||||
_GLFWwindow* window;
|
_GLFWwindow* window;
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
if (_glfw.joysticksInitialized)
|
|
||||||
_glfwDetectJoystickConnectionLinux();
|
_glfwDetectJoystickConnectionLinux();
|
||||||
#endif
|
#endif
|
||||||
XPending(_glfw.x11.display);
|
XPending(_glfw.x11.display);
|
||||||
|
|
||||||
while (QLength(_glfw.x11.display))
|
while (XQLength(_glfw.x11.display))
|
||||||
{
|
{
|
||||||
XEvent event;
|
XEvent event;
|
||||||
XNextEvent(_glfw.x11.display, &event);
|
XNextEvent(_glfw.x11.display, &event);
|
||||||
@@ -2887,7 +2892,7 @@ const char* _glfwPlatformGetScancodeName(int scancode)
|
|||||||
if (scancode < 0 || scancode > 0xff ||
|
if (scancode < 0 || scancode > 0xff ||
|
||||||
_glfw.x11.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
_glfw.x11.keycodes[scancode] == GLFW_KEY_UNKNOWN)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode");
|
_glfwInputError(GLFW_INVALID_VALUE, "Invalid scancode %i", scancode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2927,47 +2932,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
|||||||
|
|
||||||
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
||||||
{
|
{
|
||||||
if (_glfw.x11.xcursor.handle)
|
int native = 0;
|
||||||
{
|
|
||||||
char* theme = XcursorGetTheme(_glfw.x11.display);
|
|
||||||
if (theme)
|
|
||||||
{
|
|
||||||
const int size = XcursorGetDefaultSize(_glfw.x11.display);
|
|
||||||
const char* name = NULL;
|
|
||||||
|
|
||||||
if (shape == GLFW_ARROW_CURSOR)
|
|
||||||
name = "default";
|
|
||||||
else if (shape == GLFW_IBEAM_CURSOR)
|
|
||||||
name = "text";
|
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
|
||||||
name = "crosshair";
|
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
|
||||||
name = "pointer";
|
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
|
||||||
name = "ew-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
|
||||||
name = "ns-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NWSE_CURSOR)
|
|
||||||
name = "nwse-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_NESW_CURSOR)
|
|
||||||
name = "nesw-resize";
|
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
name = "all-scroll";
|
|
||||||
else if (shape == GLFW_NOT_ALLOWED_CURSOR)
|
|
||||||
name = "not-allowed";
|
|
||||||
|
|
||||||
XcursorImage* image = XcursorLibraryLoadImage(name, theme, size);
|
|
||||||
if (image)
|
|
||||||
{
|
|
||||||
cursor->x11.handle = XcursorImageLoadCursor(_glfw.x11.display, image);
|
|
||||||
XcursorImageDestroy(image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cursor->x11.handle)
|
|
||||||
{
|
|
||||||
unsigned int native = 0;
|
|
||||||
|
|
||||||
if (shape == GLFW_ARROW_CURSOR)
|
if (shape == GLFW_ARROW_CURSOR)
|
||||||
native = XC_left_ptr;
|
native = XC_left_ptr;
|
||||||
@@ -2975,20 +2940,14 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
|||||||
native = XC_xterm;
|
native = XC_xterm;
|
||||||
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
else if (shape == GLFW_CROSSHAIR_CURSOR)
|
||||||
native = XC_crosshair;
|
native = XC_crosshair;
|
||||||
else if (shape == GLFW_POINTING_HAND_CURSOR)
|
else if (shape == GLFW_HAND_CURSOR)
|
||||||
native = XC_hand2;
|
native = XC_hand2;
|
||||||
else if (shape == GLFW_RESIZE_EW_CURSOR)
|
else if (shape == GLFW_HRESIZE_CURSOR)
|
||||||
native = XC_sb_h_double_arrow;
|
native = XC_sb_h_double_arrow;
|
||||||
else if (shape == GLFW_RESIZE_NS_CURSOR)
|
else if (shape == GLFW_VRESIZE_CURSOR)
|
||||||
native = XC_sb_v_double_arrow;
|
native = XC_sb_v_double_arrow;
|
||||||
else if (shape == GLFW_RESIZE_ALL_CURSOR)
|
|
||||||
native = XC_fleur;
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_CURSOR_UNAVAILABLE,
|
|
||||||
"X11: Standard cursor shape unavailable");
|
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
cursor->x11.handle = XCreateFontCursor(_glfw.x11.display, native);
|
cursor->x11.handle = XCreateFontCursor(_glfw.x11.display, native);
|
||||||
if (!cursor->x11.handle)
|
if (!cursor->x11.handle)
|
||||||
@@ -2997,7 +2956,6 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
|||||||
"X11: Failed to create standard cursor");
|
"X11: Failed to create standard cursor");
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
@@ -3041,55 +2999,6 @@ const char* _glfwPlatformGetClipboardString(void)
|
|||||||
return getSelectionString(_glfw.x11.CLIPBOARD);
|
return getSelectionString(_glfw.x11.CLIPBOARD);
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum _glfwPlatformGetEGLPlatform(EGLint** attribs)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle)
|
|
||||||
{
|
|
||||||
int type = 0;
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_opengl)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_OPENGL)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.ANGLE_platform_angle_vulkan)
|
|
||||||
{
|
|
||||||
if (_glfw.hints.init.angleType == GLFW_ANGLE_PLATFORM_TYPE_VULKAN)
|
|
||||||
type = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type)
|
|
||||||
{
|
|
||||||
*attribs = calloc(5, sizeof(EGLint));
|
|
||||||
(*attribs)[0] = EGL_PLATFORM_ANGLE_TYPE_ANGLE;
|
|
||||||
(*attribs)[1] = type;
|
|
||||||
(*attribs)[2] = EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE;
|
|
||||||
(*attribs)[3] = EGL_PLATFORM_X11_EXT;
|
|
||||||
(*attribs)[4] = EGL_NONE;
|
|
||||||
return EGL_PLATFORM_ANGLE_ANGLE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.egl.EXT_platform_base && _glfw.egl.EXT_platform_x11)
|
|
||||||
return EGL_PLATFORM_X11_EXT;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeDisplayType _glfwPlatformGetEGLNativeDisplay(void)
|
|
||||||
{
|
|
||||||
return _glfw.x11.display;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLNativeWindowType _glfwPlatformGetEGLNativeWindow(_GLFWwindow* window)
|
|
||||||
{
|
|
||||||
if (_glfw.egl.platform)
|
|
||||||
return &window->x11.handle;
|
|
||||||
else
|
|
||||||
return (EGLNativeWindowType) window->x11.handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
{
|
{
|
||||||
if (!_glfw.vk.KHR_surface)
|
if (!_glfw.vk.KHR_surface)
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 X11 - www.glfw.org
|
// GLFW 3.3 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>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.4 Linux - www.glfw.org
|
// GLFW 3.3 Linux - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>
|
||||||
//
|
//
|
||||||
|
|||||||
+27
-10
@@ -7,7 +7,8 @@ if (MATH_LIBRARY)
|
|||||||
link_libraries("${MATH_LIBRARY}")
|
link_libraries("${MATH_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
# Workaround for the MS CRT deprecating parts of the standard library
|
||||||
|
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -20,6 +21,17 @@ set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
|||||||
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
||||||
|
|
||||||
|
if (${CMAKE_VERSION} VERSION_EQUAL "3.1.0" OR
|
||||||
|
${CMAKE_VERSION} VERSION_GREATER "3.1.0")
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
else()
|
||||||
|
# Remove this fallback when removing support for CMake version less than 3.1
|
||||||
|
add_compile_options("$<$<C_COMPILER_ID:AppleClang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:Clang>:-std=c99>"
|
||||||
|
"$<$<C_COMPILER_ID:GNU>:-std=c99>")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(clipboard clipboard.c ${GETOPT} ${GLAD_GL})
|
add_executable(clipboard clipboard.c ${GETOPT} ${GLAD_GL})
|
||||||
add_executable(events events.c ${GETOPT} ${GLAD_GL})
|
add_executable(events events.c ${GETOPT} ${GLAD_GL})
|
||||||
add_executable(msaa msaa.c ${GETOPT} ${GLAD_GL})
|
add_executable(msaa msaa.c ${GETOPT} ${GLAD_GL})
|
||||||
@@ -34,33 +46,37 @@ add_executable(gamma WIN32 MACOSX_BUNDLE gamma.c ${GLAD_GL})
|
|||||||
add_executable(icon WIN32 MACOSX_BUNDLE icon.c ${GLAD_GL})
|
add_executable(icon WIN32 MACOSX_BUNDLE icon.c ${GLAD_GL})
|
||||||
add_executable(inputlag WIN32 MACOSX_BUNDLE inputlag.c ${GETOPT} ${GLAD_GL})
|
add_executable(inputlag WIN32 MACOSX_BUNDLE inputlag.c ${GETOPT} ${GLAD_GL})
|
||||||
add_executable(joysticks WIN32 MACOSX_BUNDLE joysticks.c ${GLAD_GL})
|
add_executable(joysticks WIN32 MACOSX_BUNDLE joysticks.c ${GLAD_GL})
|
||||||
|
add_executable(opacity WIN32 MACOSX_BUNDLE opacity.c ${GLAD_GL})
|
||||||
add_executable(tearing WIN32 MACOSX_BUNDLE tearing.c ${GLAD_GL})
|
add_executable(tearing WIN32 MACOSX_BUNDLE tearing.c ${GLAD_GL})
|
||||||
add_executable(threads WIN32 MACOSX_BUNDLE threads.c ${TINYCTHREAD} ${GLAD_GL})
|
add_executable(threads WIN32 MACOSX_BUNDLE threads.c ${TINYCTHREAD} ${GLAD_GL})
|
||||||
add_executable(timeout WIN32 MACOSX_BUNDLE timeout.c ${GLAD_GL})
|
add_executable(timeout WIN32 MACOSX_BUNDLE timeout.c ${GLAD_GL})
|
||||||
add_executable(title WIN32 MACOSX_BUNDLE title.c ${GLAD_GL})
|
add_executable(title WIN32 MACOSX_BUNDLE title.c ${GLAD_GL})
|
||||||
add_executable(triangle-vulkan WIN32 triangle-vulkan.c ${GLAD_VULKAN})
|
add_executable(triangle-vulkan WIN32 triangle-vulkan.c ${GLAD_VULKAN})
|
||||||
add_executable(window WIN32 MACOSX_BUNDLE window.c ${GLAD_GL})
|
add_executable(windows WIN32 MACOSX_BUNDLE windows.c ${GETOPT} ${GLAD_GL})
|
||||||
|
|
||||||
target_link_libraries(empty Threads::Threads)
|
target_link_libraries(empty "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
target_link_libraries(threads Threads::Threads)
|
target_link_libraries(threads "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
if (RT_LIBRARY)
|
if (RT_LIBRARY)
|
||||||
target_link_libraries(empty "${RT_LIBRARY}")
|
target_link_libraries(empty "${RT_LIBRARY}")
|
||||||
target_link_libraries(threads "${RT_LIBRARY}")
|
target_link_libraries(threads "${RT_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(GUI_ONLY_BINARIES empty gamma icon inputlag joysticks tearing threads
|
set(GUI_ONLY_BINARIES empty gamma icon inputlag joysticks opacity tearing
|
||||||
timeout title triangle-vulkan window)
|
threads timeout title triangle-vulkan windows)
|
||||||
set(CONSOLE_BINARIES clipboard events msaa glfwinfo iconify monitors reopen
|
set(CONSOLE_BINARIES clipboard events msaa glfwinfo iconify monitors reopen
|
||||||
cursor)
|
cursor)
|
||||||
|
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
||||||
C_STANDARD 99
|
|
||||||
FOLDER "GLFW3/Tests")
|
FOLDER "GLFW3/Tests")
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
# Tell MSVC to use main instead of WinMain for Windows subsystem executables
|
# Tell MSVC to use main instead of WinMain
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
||||||
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
LINK_FLAGS "/ENTRY:mainCRTStartup")
|
||||||
|
elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
|
# Tell Clang using MS CRT to use main instead of WinMain
|
||||||
|
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
||||||
|
LINK_FLAGS "-Wl,/entry:mainCRTStartup")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
@@ -68,15 +84,16 @@ if (APPLE)
|
|||||||
set_target_properties(gamma PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gamma")
|
set_target_properties(gamma PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gamma")
|
||||||
set_target_properties(inputlag PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Input Lag")
|
set_target_properties(inputlag PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Input Lag")
|
||||||
set_target_properties(joysticks PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Joysticks")
|
set_target_properties(joysticks PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Joysticks")
|
||||||
|
set_target_properties(opacity PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Opacity")
|
||||||
set_target_properties(tearing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Tearing")
|
set_target_properties(tearing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Tearing")
|
||||||
set_target_properties(threads PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Threads")
|
set_target_properties(threads PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Threads")
|
||||||
set_target_properties(timeout PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Timeout")
|
set_target_properties(timeout PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Timeout")
|
||||||
set_target_properties(title PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Title")
|
set_target_properties(title PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Title")
|
||||||
set_target_properties(window PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Window")
|
set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows")
|
||||||
|
|
||||||
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
|
MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
|
||||||
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/Info.plist.in")
|
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/MacOSXBundleInfo.plist.in")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user