mirror of
https://github.com/glfw/glfw.git
synced 2025-06-25 17:07:43 +00:00
Compare commits
1746 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e7ea71be03 | ||
|
cf4734ce8a | ||
|
21fea01161 | ||
|
a576a56a8d | ||
|
b850107a32 | ||
|
043378876a | ||
|
b35641f4a3 | ||
|
64906f8e64 | ||
|
51b6434ac4 | ||
|
dfebad786d | ||
|
97892c6037 | ||
|
8b574030a8 | ||
|
228e58262e | ||
|
3573c5a890 | ||
|
072f660d93 | ||
|
68dcea0d7f | ||
|
38ec7abd3b | ||
|
738dd6ff1d | ||
|
860c8ef38f | ||
|
42dc1ffaee | ||
|
bf945f1213 | ||
|
dc557ecf38 | ||
|
d24ee9953f | ||
|
7b6aead9fb | ||
|
e14e72a2e7 | ||
|
523d1d61ca | ||
|
4d9557aefe | ||
|
415df7e3ba | ||
|
fb9c23fbf2 | ||
|
d45cbc82c9 | ||
|
d7e7b164bc | ||
|
421dc66afb | ||
|
b864e4baeb | ||
|
f6f7ee2284 | ||
|
961e45bded | ||
|
e28397bda0 | ||
|
8f2f766f0d | ||
|
f6360eadee | ||
|
1fb7f0e120 | ||
|
0bb605cd79 | ||
|
559bd3adb9 | ||
|
65102e2005 | ||
|
dbf7cfc4dc | ||
|
42afd127a9 | ||
|
7bdcdf435a | ||
|
c8372cda08 | ||
|
1ce41b358b | ||
|
af5d250553 | ||
|
95d464bb4b | ||
|
bafece4cf7 | ||
|
64b4f0f30c | ||
|
a53ce7e8b8 | ||
|
f0ec791386 | ||
|
14e653358b | ||
|
690a15f929 | ||
|
b61f3fc479 | ||
|
a650c69cff | ||
|
2b3f919b60 | ||
|
a9cc7c7260 | ||
|
63397fb0d5 | ||
|
532bd66e7f | ||
|
244852a93a | ||
|
973a3c0b31 | ||
|
1a0bae7fa8 | ||
|
611099f745 | ||
|
3e73a5c76c | ||
|
e3e41ba339 | ||
|
fb10e95f78 | ||
|
d93868bcf3 | ||
|
275b92f887 | ||
|
6c1e3fd84c | ||
|
efffd492dd | ||
|
77ced84e9c | ||
|
8946f5314d | ||
|
2afd57bf9b | ||
|
a12311e596 | ||
|
bb951b4b71 | ||
|
5a0ab56ed7 | ||
|
30127690a2 | ||
|
6f1ddf51a1 | ||
|
6565c0cc04 | ||
|
edd38207a6 | ||
|
9953f7ead1 | ||
|
1be7bc546b | ||
|
4c283e4a3c | ||
|
e25c1cc74f | ||
|
72164e6921 | ||
|
a268b4b3a4 | ||
|
4baeadbd66 | ||
|
6ac0835ad2 | ||
|
ea6dd72c71 | ||
|
5e97447dd5 | ||
|
d3a7362430 | ||
|
1fe98a0d53 | ||
|
a360198f8f | ||
|
eeb403135d | ||
|
00e86d4b73 | ||
|
86d7bcb124 | ||
|
d7aeb1eae8 | ||
|
f74ff2aa10 | ||
|
c47894a9a3 | ||
|
42afff41fe | ||
|
23962c9dc7 | ||
|
ad264f5061 | ||
|
94310c5281 | ||
|
bdedec9932 | ||
|
9317970243 | ||
|
2590d4cdd4 | ||
|
51920ede68 | ||
|
291f4d89cd | ||
|
bc95384f4c | ||
|
becf1dc14b | ||
|
86bf5698ec | ||
|
7e2470d343 | ||
|
bbf661ca38 | ||
|
d81fcb93f1 | ||
|
c339dfc63d | ||
|
9afbcb442b | ||
|
d79afa8055 | ||
|
996826eec6 | ||
|
1de78b2ff9 | ||
|
7321b56cad | ||
|
c8521b7fda | ||
|
8e6c8d7eff | ||
|
ba796ec9c6 | ||
|
d107e497a9 | ||
|
d2058526cc | ||
|
cf29ff2b9d | ||
|
8ff8d67560 | ||
|
d2b88cf7ab | ||
|
200639712b | ||
|
507621977f | ||
|
29885c6942 | ||
|
2c3eb75748 | ||
|
73948e6c0f | ||
|
5a9ea8f99f | ||
|
4e8c4901e9 | ||
|
d9646631d6 | ||
|
6b39ab0074 | ||
|
40aa77a160 | ||
|
9f6da7e7c6 | ||
|
ab09dc8fb1 | ||
|
b4c3ef9d0f | ||
|
2c1d31009f | ||
|
ea3ea62708 | ||
|
eeeb56eb23 | ||
|
378e5fc814 | ||
|
7b152019da | ||
|
8e9a5d29a8 | ||
|
46cebb5081 | ||
|
68edc66aa4 | ||
|
ddd92a4fa8 | ||
|
5e4496cb42 | ||
|
0ede5f58c6 | ||
|
52405a9d59 | ||
|
9959dc69ca | ||
|
557a633b2d | ||
|
b1517e5b3e | ||
|
3f31519de8 | ||
|
1b2605dbcd | ||
|
93d70cb6a8 | ||
|
fa0ea5c41f | ||
|
8c5471d6cd | ||
|
fb94e4268b | ||
|
d097e35743 | ||
|
23e40548b1 | ||
|
9fdc425931 | ||
|
23ea072c41 | ||
|
659d161446 | ||
|
dbe810e403 | ||
|
afd22ebcf3 | ||
|
97820bc329 | ||
|
d9709904fe | ||
|
a87acd8c1f | ||
|
2a4dd9c28f | ||
|
c992226a9c | ||
|
0bd3e879e1 | ||
|
509f4131be | ||
|
01d7c331fd | ||
|
938a3c29b2 | ||
|
3ed6e9d89a | ||
|
9a80225ddf | ||
|
46c2e35c55 | ||
|
93a3ba8080 | ||
|
3eaf1255b2 | ||
|
6b48f2be97 | ||
|
00a663dafd | ||
|
3fa2360720 | ||
|
0b94e1b29b | ||
|
f27daa34ad | ||
|
6f2d7064be | ||
|
9cce2896ee | ||
|
23ab972724 | ||
|
fbdb53b9ca | ||
|
cd466cf9fd | ||
|
39f0e86228 | ||
|
efa9297a41 | ||
|
91c837ace5 | ||
|
6d9083af03 | ||
|
4cf510511c | ||
|
c1a79c1c41 | ||
|
8397b39afa | ||
|
735fc101f5 | ||
|
228428fa4f | ||
|
82e77dbff4 | ||
|
9a87635686 | ||
|
2b580012da | ||
|
5c463a9070 | ||
|
9b1f63bad9 | ||
|
1c9fcdc9df | ||
|
30b91c8b60 | ||
|
e0ae1c45df | ||
|
8f470597d6 | ||
|
57cbded076 | ||
|
41d8da1cea | ||
|
00967cbb8a | ||
|
dd8a678a66 | ||
|
97b9e49637 | ||
|
b2b087cd8e | ||
|
d299d9f788 | ||
|
ed1d9e1ca7 | ||
|
ab3ea8ac9f | ||
|
c812b9d87c | ||
|
8a72918bcd | ||
|
ab1b1edfd0 | ||
|
93e93135f2 | ||
|
e057666642 | ||
|
6b57e08bb0 | ||
|
2c0f34b60f | ||
|
ef6c9d8b4f | ||
|
c18851f52e | ||
|
55aad3c37b | ||
|
0f9a9578f3 | ||
|
7d73629e50 | ||
|
2efc598d70 | ||
|
2e12ef00bb | ||
|
3a60992a41 | ||
|
3a5c726d1b | ||
|
7be6a2cabe | ||
|
488008e0a2 | ||
|
a46f829de8 | ||
|
03af6b3d4c | ||
|
09ebf3f0bf | ||
|
e85b645b8a | ||
|
b9ed25d2e9 | ||
|
26b85215c0 | ||
|
6987294df9 | ||
|
71be34a6c3 | ||
|
7cc8b053b8 | ||
|
91a96ed434 | ||
|
c424fe5589 | ||
|
c50d53160f | ||
|
40b5a8a37c | ||
|
9180923ea0 | ||
|
a1a73ee862 | ||
|
e47cb7c1e2 | ||
|
4df24735ef | ||
|
d77aaa770f | ||
|
aa80d24d01 | ||
|
fd7e737216 | ||
|
6dd526fb1a | ||
|
2796e61af7 | ||
|
88a39006e3 | ||
|
5c948a6e6e | ||
|
8e725338bf | ||
|
060631c965 | ||
|
36f0bf00a9 | ||
|
84e165ef64 | ||
|
2db528d8cd | ||
|
78b19548d9 | ||
|
dfb26023fc | ||
|
9b7713cf92 | ||
|
3b3d58df47 | ||
|
510a08cde2 | ||
|
0d599026d0 | ||
|
6f8ec4075b | ||
|
98d6e8485b | ||
|
da6713cd09 | ||
|
d578c2ddfe | ||
|
74b4ceb835 | ||
|
c4fbe80d90 | ||
|
be7f4513c0 | ||
|
47193f15de | ||
|
80dc0533cf | ||
|
29b7669bc6 | ||
|
f35e2274cb | ||
|
3203599cac | ||
|
2df0ce07fa | ||
|
83a134a92f | ||
|
eb9c3bee71 | ||
|
0cd1916de3 | ||
|
77819c0c54 | ||
|
e52046955d | ||
|
55fcfb1bb6 | ||
|
203002ef2c | ||
|
85f5a51912 | ||
|
9ad9f5c52a | ||
|
5002522f73 | ||
|
91f18fb576 | ||
|
e37ba80b13 | ||
|
c3ad3d49ed | ||
|
209f6cf093 | ||
|
33d37782c6 | ||
|
229d628ec4 | ||
|
c28d420060 | ||
|
18df0baea6 | ||
|
a7b6f35500 | ||
|
0f5b095042 | ||
|
24cdc5afda | ||
|
75295f4878 | ||
|
040712ce99 | ||
|
2877fea550 | ||
|
e33db6d7aa | ||
|
afb127769a | ||
|
ed39ff43f9 | ||
|
98c9961f32 | ||
|
3bbb41eacc | ||
|
0b76e3a6f1 | ||
|
6857995498 | ||
|
fdc72edf81 | ||
|
f39ffefb6a | ||
|
ddd087d662 | ||
|
523fdf50c1 | ||
|
d3ede7b684 | ||
|
a465c1c32e | ||
|
2ae3e0c8d7 | ||
|
ad3dbeb65f | ||
|
05f6c13d11 | ||
|
edec334b32 | ||
|
26920a1a38 | ||
|
736a88b067 | ||
|
2c204ab52e | ||
|
e9c58bc181 | ||
|
62e175ef9f | ||
|
ce85c7dcaf | ||
|
5c3ebfb9cc | ||
|
7dfd84c458 | ||
|
685de9089f | ||
|
09653b8c54 | ||
|
72642ea0d1 | ||
|
8f050b5655 | ||
|
acf0c10e7a | ||
|
80e31ce9e1 | ||
|
d3c2121221 | ||
|
23e6e8e4b7 | ||
|
f60547ac80 | ||
|
06089a91a6 | ||
|
82ccbb3ef0 | ||
|
a8d8b760fb | ||
|
2d281d7928 | ||
|
89514cf0fc | ||
|
10e9033a29 | ||
|
29523dbfbf | ||
|
f843d53333 | ||
|
4cb36872a5 | ||
|
0f38382e25 | ||
|
f010335b8c | ||
|
b7a3af9b79 | ||
|
967282c2e6 | ||
|
8d216054ad | ||
|
34418951cc | ||
|
ad4a9e42f0 | ||
|
e0889736fd | ||
|
c132135332 | ||
|
4651165272 | ||
|
8d87be1268 | ||
|
89d3ea8d69 | ||
|
990dc4b388 | ||
|
a4460b694e | ||
|
4506175023 | ||
|
ba11e60859 | ||
|
2d45681bc3 | ||
|
4c110bba41 | ||
|
738b1c73b5 | ||
|
b386371f57 | ||
|
9c95cfb9f1 | ||
|
920d110b6c | ||
|
554cbdb205 | ||
|
955fbd9d26 | ||
|
07a5518c3e | ||
|
66a4882eb1 | ||
|
8d9231fe5e | ||
|
03cfe957e7 | ||
|
add0521efb | ||
|
535c3ce632 | ||
|
3ee5031fd7 | ||
|
9cc252a406 | ||
|
46950a5e61 | ||
|
1461c59aa2 | ||
|
b54fb0af10 | ||
|
8f9ff8503e | ||
|
aa803f7de5 | ||
|
34573798f4 | ||
|
8ff9ed92b4 | ||
|
723f3eb40d | ||
|
1eef3a363e | ||
|
367d06deaf | ||
|
a730acf8e5 | ||
|
adc202d2c3 | ||
|
d78b0a4ead | ||
|
1e0c3bca7f | ||
|
71742d9a27 | ||
|
a32cbf6d4f | ||
|
7ce1f3e1cf | ||
|
bb9d699ae6 | ||
|
203a7c59d2 | ||
|
3c2913dcb9 | ||
|
84b0923fe6 | ||
|
cd22e28495 | ||
|
363d471441 | ||
|
87970b7f26 | ||
|
1e987cb92e | ||
|
92b5c67b50 | ||
|
d3e4fcf8b7 | ||
|
ad01c1b614 | ||
|
789d2924c0 | ||
|
2e656afc49 | ||
|
20adc18aa5 | ||
|
152f50cd01 | ||
|
4a68926bfd | ||
|
a28adba06a | ||
|
97da62a027 | ||
|
e023618daa | ||
|
7f6aa587f8 | ||
|
df8d7bc892 | ||
|
0ce611958e | ||
|
1a7da42e6e | ||
|
bf99587005 | ||
|
293d19a153 | ||
|
b70259e52d | ||
|
fe7be39793 | ||
|
17a9e34fbc | ||
|
cb22c54119 | ||
|
37b7540db9 | ||
|
715b874db3 | ||
|
8aaea57421 | ||
|
25c521cbe5 | ||
|
c05acf6246 | ||
|
12c2ccd609 | ||
|
216ea3d735 | ||
|
c1ecd4673e | ||
|
7bede13b1d | ||
|
a3d1633e1d | ||
|
3f5dfeaf29 | ||
|
850893a39f | ||
|
79e7e65c9d | ||
|
855d338a65 | ||
|
8edbc4971d | ||
|
05b0e2fab2 | ||
|
7d060ba4f1 | ||
|
f8ef3ca719 | ||
|
094aa6d3c7 | ||
|
e24fe4b189 | ||
|
c2f0a0ae59 | ||
|
6281f498c8 | ||
|
68879081cb | ||
|
963e728881 | ||
|
900848ad0c | ||
|
cd01187b9d | ||
|
c19f36b28d | ||
|
53d86c64d7 | ||
|
fbfd7e65c8 | ||
|
d1efa32983 | ||
|
79de08db06 | ||
|
e40fa3bb94 | ||
|
9cd4d2fa20 | ||
|
37fc28bff6 | ||
|
706d1f1653 | ||
|
b3a98f8555 | ||
|
eacc1cafba | ||
|
a30cd6acef | ||
|
bb193325cc | ||
|
b55a517ae0 | ||
|
544790666b | ||
|
fb0f2f92a3 | ||
|
83d3fb08ec | ||
|
999962bd2f | ||
|
f75c251dec | ||
|
575d2971d4 | ||
|
2a78a2cf82 | ||
|
76a5f781db | ||
|
393eac458b | ||
|
db91507956 | ||
|
ee6ff939a5 | ||
|
68534cc2ce | ||
|
4005f70eef | ||
|
53d7622a3a | ||
|
41ebcf1eed | ||
|
0fe96ec202 | ||
|
3d52f7e345 | ||
|
f4d0365a5a | ||
|
309d79376f | ||
|
6efaaec9ce | ||
|
38dd515524 | ||
|
727db55c3a | ||
|
56a4cb0a3a | ||
|
ff9d9515f6 | ||
|
36ea36736d | ||
|
09f9773e6f | ||
|
bdfe6b09af | ||
|
b6834bf2a1 | ||
|
35f3b58c21 | ||
|
f5758d75d0 | ||
|
b7d0c6037d | ||
|
e31deedc99 | ||
|
6d51b39106 | ||
|
d0776e04a3 | ||
|
8b8d10bc01 | ||
|
0a9488e3f0 | ||
|
efe764b492 | ||
|
983c44b255 | ||
|
cca9008db2 | ||
|
0391b7b277 | ||
|
1d8d1ff3d0 | ||
|
4be0444ee6 | ||
|
6a20053102 | ||
|
7614d088e9 | ||
|
6ed5294223 | ||
|
157ebb80aa | ||
|
e7758c506d | ||
|
4cbe743b74 | ||
|
216d5e8402 | ||
|
63da04e5ce | ||
|
8e23579842 | ||
|
150744ecca | ||
|
8c8def5de5 | ||
|
4f077c4133 | ||
|
7c25dff002 | ||
|
daed5edd6e | ||
|
d7b7c3b12a | ||
|
62074f3dea | ||
|
518e26e16e | ||
|
22b586b3d8 | ||
|
4e557437f2 | ||
|
2ac7e20aaf | ||
|
85348c67cd | ||
|
071d7c0f46 | ||
|
71829a0f0d | ||
|
244948e174 | ||
|
d83849792b | ||
|
dffe203c17 | ||
|
87d5646f5d | ||
|
9a0e88a016 | ||
|
aff00d0dd8 | ||
|
111c02d74e | ||
|
58b48a3a00 | ||
|
201400b974 | ||
|
afa78b4270 | ||
|
0c90e1a33f | ||
|
01778329ec | ||
|
56092814f3 | ||
|
3dc7349c35 | ||
|
9e1ee3f263 | ||
|
ab34cc51c6 | ||
|
1d88a2e3d6 | ||
|
076bfd55be | ||
|
836e709503 | ||
|
3b95970482 | ||
|
b6f7ead3c5 | ||
|
1a5e07fd4b | ||
|
f010d8b77d | ||
|
6876cf8d7e | ||
|
52d8347d34 | ||
|
a89fcd20d8 | ||
|
5b73fc8b80 | ||
|
6f7c61c6b3 | ||
|
15e05adf67 | ||
|
787295b3af | ||
|
78380c7761 | ||
|
3b13228650 | ||
|
4e788fc6dc | ||
|
5a6001a83b | ||
|
df15a33e10 | ||
|
114776a246 | ||
|
fd79b02840 | ||
|
184377b493 | ||
|
04f21abb52 | ||
|
da236ba807 | ||
|
a39115a27b | ||
|
bbbbd3e870 | ||
|
e17ffcd0db | ||
|
9a3a8bc267 | ||
|
a646f51bca | ||
|
0e9ec7788b | ||
|
e3f916808d | ||
|
061a0263a9 | ||
|
85bce8a8ea | ||
|
ec621a00bd | ||
|
330f7da746 | ||
|
0beadfdc66 | ||
|
4c90e21e8f | ||
|
f90df24244 | ||
|
a25e8eb50d | ||
|
84f95a7d7f | ||
|
f4a7329604 | ||
|
9416a43404 | ||
|
33cd8b865d | ||
|
291f6dc32c | ||
|
52ba8c7f07 | ||
|
17ae300d96 | ||
|
9c62a21ba9 | ||
|
1f34295a74 | ||
|
4afa227a05 | ||
|
2c7f3ce91b | ||
|
b925a54ef1 | ||
|
729c9988d0 | ||
|
410890aa80 | ||
|
6de084000b | ||
|
9477311130 | ||
|
384ff74a46 | ||
|
f8d6801a50 | ||
|
3959ee8949 | ||
|
8ab40399d3 | ||
|
2bc52ca82e | ||
|
5aff72aa00 | ||
|
8b11867464 | ||
|
552209fe46 | ||
|
f5af421a6b | ||
|
5d1d1a01e3 | ||
|
3a8ebb1903 | ||
|
6ce6b50787 | ||
|
761f97d6b6 | ||
|
0b9e48fa3d | ||
|
1adfbde4d7 | ||
|
08e5a17063 | ||
|
7e8da57094 | ||
|
0dc1005c85 | ||
|
3327050ca6 | ||
|
5c928ff452 | ||
|
2f76f70c76 | ||
|
420b165bff | ||
|
a62a6c5019 | ||
|
d5f32dfb3b | ||
|
a6f8cc9d44 | ||
|
af8f9713dd | ||
|
0bccc3852b | ||
|
ac627706ef | ||
|
6b78419c9a | ||
|
9b140d08d7 | ||
|
35f3508ecd | ||
|
c940695eb0 | ||
|
0ef149c8f2 | ||
|
a506a8dc73 | ||
|
8d47dc5894 | ||
|
48aa567d0c | ||
|
53b1396a09 | ||
|
60e7364b30 | ||
|
166611cef5 | ||
|
0b2660f39f | ||
|
40d150c399 | ||
|
8aaf072842 | ||
|
2e6fb7fe22 | ||
|
2747e47393 | ||
|
1353f37a51 | ||
|
539535a367 | ||
|
73ef5f0abb | ||
|
58df92acad | ||
|
96f9f5c4b9 | ||
|
1ed1489831 | ||
|
bb1d917c2f | ||
|
59196f9ad8 | ||
|
9d7897f961 | ||
|
b3a79103a6 | ||
|
b9dfce0070 | ||
|
7765451d0f | ||
|
cd0dc76c7c | ||
|
da26eefc61 | ||
|
b488c3f87f | ||
|
05dd2fa298 | ||
|
a2674a9034 | ||
|
0cc13ceafc | ||
|
c01acc267a | ||
|
e0f7ce402b | ||
|
f771d41292 | ||
|
782e6b6cef | ||
|
f760b124ca | ||
|
5f60c22cfa | ||
|
5c92cd9f52 | ||
|
686e18fd72 | ||
|
3207fc7120 | ||
|
74b9f309a9 | ||
|
a122d91303 | ||
|
dfeacee000 | ||
|
1095a43708 | ||
|
6d2003d07a | ||
|
7da3e52c86 | ||
|
68e4261d73 | ||
|
e81d381256 | ||
|
d285a9fdeb | ||
|
6c031af245 | ||
|
49dbcfcb8c | ||
|
ceb20c7f97 | ||
|
4ae93e0547 | ||
|
9a3664b4a9 | ||
|
6ce2070392 | ||
|
e47832ffcf | ||
|
ad9eb768c9 | ||
|
854ce1db4e | ||
|
f5f060e6bf | ||
|
0dea8a4441 | ||
|
e6a6a99813 | ||
|
1cecb8beb0 | ||
|
36f8250321 | ||
|
b420ca7404 | ||
|
4e3b43383a | ||
|
8a69a0d7e5 | ||
|
2539d03747 | ||
|
bcb8558189 | ||
|
aec9fae8f3 | ||
|
d7f7b0e1b5 | ||
|
b66f105f3e | ||
|
bf1c62b261 | ||
|
3a3c32c6b1 | ||
|
81f475bccb | ||
|
c1f60ab5dc | ||
|
e47705d8fb | ||
|
8369880b56 | ||
|
cfc23cd087 | ||
|
69ff0b8ee0 | ||
|
e0c77f71f9 | ||
|
c72da994ba | ||
|
399c2a1fad | ||
|
9a87c2a4b4 | ||
|
fbf8aae44f | ||
|
7486e12f88 | ||
|
105cf32e0b | ||
|
a84a30ab63 | ||
|
250b94cd03 | ||
|
d4f5074535 | ||
|
91eebe922d | ||
|
51a465ee2b | ||
|
5f9dfe3d83 | ||
|
27295b508f | ||
|
ef5220d6b1 | ||
|
a17a1b2011 | ||
|
e07925c404 | ||
|
cf3a03a85d | ||
|
0c403c8ca6 | ||
|
844bc8031c | ||
|
67c720d117 | ||
|
d7ae90a790 | ||
|
41a19ed49c | ||
|
949275bbed | ||
|
cab41529da | ||
|
318e08d914 | ||
|
560304e0f4 | ||
|
9ecacf1d7f | ||
|
ee45b58647 | ||
|
215a05af3d | ||
|
a41a58a95e | ||
|
e65de2941c | ||
|
2c8e0512dd | ||
|
44b5d06583 | ||
|
350ba73267 | ||
|
9516df52a4 | ||
|
72366ac9a9 | ||
|
6aca3e99f0 | ||
|
4381b86b6b | ||
|
27d19d06ca | ||
|
4b8ac11aa3 | ||
|
a0a5cc57df | ||
|
0c27ed1d0e | ||
|
d1ae7bac60 | ||
|
40c7e471e3 | ||
|
76406c7894 | ||
|
d973acc123 | ||
|
46c7c1cdff | ||
|
13479ed27d | ||
|
a5e5b782c7 | ||
|
65cfe743af | ||
|
d862d56acb | ||
|
190673e779 | ||
|
789a2bcb39 | ||
|
5f1631cb0e | ||
|
a491b0698c | ||
|
562c17d131 | ||
|
7da87aaae7 | ||
|
15d91801b7 | ||
|
c5cb4a253a | ||
|
9372ba95fa | ||
|
aa5e313561 | ||
|
fe57e3c292 | ||
|
6b01affd89 | ||
|
bf292f0083 | ||
|
781fbbadb0 | ||
|
5dd207048c | ||
|
a3d28ef52c | ||
|
8149a5fc00 | ||
|
74a46dfa0c | ||
|
4ec7daf3e9 | ||
|
c3ca88055f | ||
|
54e8e0b092 | ||
|
b4a8eb9b19 | ||
|
28773a069e | ||
|
73a8ebb691 | ||
|
4e70c95aa3 | ||
|
9db156421f | ||
|
0b652a44d2 | ||
|
9b6d68ec70 | ||
|
4837b78ffe | ||
|
bc3be40f21 | ||
|
da3f20d860 | ||
|
fb0028c766 | ||
|
994c3b4e48 | ||
|
18307467b4 | ||
|
49c5d837b4 | ||
|
8a5fd0c5a4 | ||
|
a5ed740d9d | ||
|
a264d32987 | ||
|
081484ed34 | ||
|
506a6aafde | ||
|
a875a536b7 | ||
|
2551829f75 | ||
|
7e03bce138 | ||
|
ac30ef3e0c | ||
|
a43f545677 | ||
|
59055d585f | ||
|
8a1f4940fc | ||
|
5f4a6f689a | ||
|
c016b26852 | ||
|
db76abb63c | ||
|
c194193797 | ||
|
9dc365f192 | ||
|
c81def70be | ||
|
197193ac0b | ||
|
135d87aa3c | ||
|
2fb336268f | ||
|
9486ec0c02 | ||
|
dff6253ca7 | ||
|
bc7b19cbd1 | ||
|
ce9d124243 | ||
|
f6d44cedfd | ||
|
d74c18117d | ||
|
92c70b2a83 | ||
|
7dd14a4b20 | ||
|
fa60269245 | ||
|
6e6805000a | ||
|
b3544ca43e | ||
|
382943f2b0 | ||
|
ef6189f348 | ||
|
7dbdd2e6a5 | ||
|
80fde12fda | ||
|
a80788c17f | ||
|
a9f674e719 | ||
|
b5d4f24f74 | ||
|
d861d7bffe | ||
|
c42d8f3e5b | ||
|
50a6270e55 | ||
|
b804379463 | ||
|
359758bb53 | ||
|
e96dc5d219 | ||
|
2c519709be | ||
|
bd452016be | ||
|
bac15f9449 | ||
|
c819f27ce3 | ||
|
94cb0347ab | ||
|
953a1c3f8b | ||
|
70a3104c49 | ||
|
bc5523e994 | ||
|
8e288dc94c | ||
|
de23429455 | ||
|
08f01c31a0 | ||
|
20e522cdf4 | ||
|
c5f1ca3e41 | ||
|
b69fb99031 | ||
|
c88ee1c9d3 | ||
|
28d8507700 | ||
|
75294462b3 | ||
|
5fc4c01302 | ||
|
33683ec60e | ||
|
04f7f55f07 | ||
|
4d0ae4ffa7 | ||
|
82978bb3af | ||
|
376897a344 | ||
|
36c547875c | ||
|
692754a2c5 | ||
|
3a37a08998 | ||
|
7749aac50d | ||
|
1e20218b3d | ||
|
545f409592 | ||
|
8f852e0833 | ||
|
f71b55f83d | ||
|
d25248343e | ||
|
1bd0a55aa7 | ||
|
3d2540c373 | ||
|
3ec8f4a7f5 | ||
|
243b1bc292 | ||
|
7105ff2dfd | ||
|
7f02898264 | ||
|
aa8e8ab960 | ||
|
26aac53e1d | ||
|
2777f6a754 | ||
|
cbf23e5615 | ||
|
56ca0cb3b3 | ||
|
4cc5d2e623 | ||
|
f764836e58 | ||
|
2c7ef5b480 | ||
|
711b9694a1 | ||
|
efda4afb49 | ||
|
65748fb8f3 | ||
|
6abad2efd2 | ||
|
eecf83c5d0 | ||
|
2e039d9275 | ||
|
b430bc4935 | ||
|
062a1c22b5 | ||
|
a4d910b4a7 | ||
|
4f0b8b0dda | ||
|
7bd0af3089 | ||
|
84b13113ed | ||
|
62b7fe8311 | ||
|
773f4495f0 | ||
|
5bea122211 | ||
|
d232bcfcdd | ||
|
36f90800d8 | ||
|
c6b95e3b07 | ||
|
e463e85bba | ||
|
3a5e99e59a | ||
|
3262c29440 | ||
|
1d62157268 | ||
|
1f508530f0 | ||
|
fad9896d38 | ||
|
0c6b505619 | ||
|
2db3b9688d | ||
|
d834f01ca4 | ||
|
537ea4ccf1 | ||
|
51bb76c7c3 | ||
|
71e6ff386d | ||
|
98dde03ce1 | ||
|
e1d9e2ba73 | ||
|
84ec99bb01 | ||
|
d0c3fa900a | ||
|
267e06a41e | ||
|
bb6945a18a | ||
|
22a6c02a4c | ||
|
3fd4e79adb | ||
|
56aad76b16 | ||
|
feaa532886 | ||
|
e91d0fc499 | ||
|
3cf7645b96 | ||
|
e4aba7feaa | ||
|
a639d6e635 | ||
|
d44bfe0264 | ||
|
f61d0916fd | ||
|
c415c71947 | ||
|
144c98bcb3 | ||
|
fa025d8f80 | ||
|
700d1f28d8 | ||
|
0b01d850ed | ||
|
57bf6b2f75 | ||
|
ceb16cb5f1 | ||
|
0ccb690853 | ||
|
535491c4f3 | ||
|
7dc36dd7da | ||
|
c0eabc594f | ||
|
8ee589e43b | ||
|
cd290f767f | ||
|
a255e7ace6 | ||
|
5c5963f1c0 | ||
|
090b16bfae | ||
|
42a3e4434f | ||
|
15af302f77 | ||
|
be71147ad5 | ||
|
ff7d42a55e | ||
|
599fb3de34 | ||
|
a337c56848 | ||
|
b079610962 | ||
|
186e9372d5 | ||
|
ab118b2529 | ||
|
1f91697cd3 | ||
|
334a485968 | ||
|
0e74265426 | ||
|
3c3981a4f0 | ||
|
d0b7f539e2 | ||
|
62d296992e | ||
|
5f4e66b21a | ||
|
f03614277d | ||
|
45a62adf82 | ||
|
718609275d | ||
|
28f118f4de | ||
|
224e9205e0 | ||
|
bd23be2594 | ||
|
93962ec168 | ||
|
f4f1002d14 | ||
|
d7e30b1c74 | ||
|
3461d1c2a5 | ||
|
0fa77ea63a | ||
|
c585bf010b | ||
|
0267cebe00 | ||
|
f8a70aca67 | ||
|
422bf79e8f | ||
|
5644b66bac | ||
|
6e382c9b7f | ||
|
87458617e0 | ||
|
297999c9e1 | ||
|
b702577cd2 | ||
|
1857fc2272 | ||
|
a507872051 | ||
|
c0a3a9aefe | ||
|
5292914ce1 | ||
|
8d4fd40b64 | ||
|
02874d9c14 | ||
|
0d355379e0 | ||
|
c32dc3a085 | ||
|
cad22cb2f6 | ||
|
1fca33b3c1 | ||
|
9420e6f0d0 | ||
|
980fc9b52f | ||
|
e108c0de0d | ||
|
9e54b97cfa | ||
|
056c5d3f90 | ||
|
a4fbc6fe91 | ||
|
8055dad7e4 | ||
|
8d7e5cdb49 | ||
|
f8bcc7e65c | ||
|
ba761ab06e | ||
|
d0e8d06d95 | ||
|
3615d437a7 | ||
|
82ca58da04 | ||
|
4e3204d86d | ||
|
9883cb64f0 | ||
|
4b20fb705b | ||
|
a43d1a4937 | ||
|
3a2a97f15d | ||
|
4f14c1e776 | ||
|
d82e7b5cb1 | ||
|
0118743333 | ||
|
a726942bfe | ||
|
68fd4e8bb3 | ||
|
ba4e78e57f | ||
|
222ac78a44 | ||
|
bea4818030 | ||
|
f1d40fa046 | ||
|
6907629cbf | ||
|
e6d22346f9 | ||
|
154db76a6c | ||
|
3fd70cc513 | ||
|
f7733c7b4f | ||
|
5c752355cb | ||
|
c733ab0a22 | ||
|
be295ccbea | ||
|
c20754c4a6 | ||
|
621ece63c8 | ||
|
2fbb560eb7 | ||
|
7c3aaf8065 | ||
|
44af6bb936 | ||
|
1155c83013 | ||
|
9e29f556fd | ||
|
5f9cbd0ebc | ||
|
ec3784f3d7 | ||
|
782f7fe0c7 | ||
|
bcd8f9aff2 | ||
|
45bd991ea9 | ||
|
edf0a07174 | ||
|
36ce73bbfd | ||
|
1d95acdf56 | ||
|
2e70950c0f | ||
|
2a27eb95e4 | ||
|
e2fa82ffbb | ||
|
cf79f06257 | ||
|
90e22947c6 | ||
|
463ef7eb71 | ||
|
51ca41dd9f | ||
|
530b37f4db | ||
|
78e6a0063d | ||
|
7f4dde15e4 | ||
|
b41cd34143 | ||
|
d5ab3e919a | ||
|
a46104ee69 | ||
|
757cd3aea2 | ||
|
29d8ca4ce4 | ||
|
3d748cf530 | ||
|
babafc13db | ||
|
9b0c16596c | ||
|
2053f3ed22 | ||
|
55b1a16f90 | ||
|
ea7eb2ddab | ||
|
9a9568212c | ||
|
72c3908e14 | ||
|
cde0aaaab1 | ||
|
c90c7b9710 | ||
|
1635fe2826 | ||
|
9ac9d7b85a | ||
|
e29882523e | ||
|
3531c320af | ||
|
52c7a4fc7f | ||
|
3201eedc34 | ||
|
a533c9b3ca | ||
|
064dfaa549 | ||
|
751c6f9a27 | ||
|
8c611fd5d0 | ||
|
8e313d911b | ||
|
3b255af4c3 | ||
|
a59315ed6a | ||
|
f4a304ff03 | ||
|
86e7bf4169 | ||
|
91c1ff1b7d | ||
|
c4903d9267 | ||
|
cf0857f79a | ||
|
cc621765e5 | ||
|
17a15a20f2 | ||
|
c3ed70a4b7 | ||
|
88c5edb409 | ||
|
f9923e9095 | ||
|
df7f36a316 | ||
|
bb2ca1da13 | ||
|
f680001b95 | ||
|
18145a7f3d | ||
|
9bfdd218fb | ||
|
a9892acb94 | ||
|
041167895d | ||
|
fb01b16b94 | ||
|
bc5a24fee6 | ||
|
1fe340982f | ||
|
53c8c72c67 | ||
|
9bb50db6dd | ||
|
cc3552465d | ||
|
62993d9391 | ||
|
da8f3bc174 | ||
|
85fd5aa6c4 | ||
|
769f727e47 | ||
|
d9466050d9 | ||
|
5595fa3ae6 | ||
|
6dfc12a439 | ||
|
245461eb86 | ||
|
031a8f9583 | ||
|
6a199c1f5e | ||
|
64c034edfb | ||
|
c08abffc50 | ||
|
8b54e28c4e | ||
|
3c4b9a7eef | ||
|
92b3fd02e5 | ||
|
2de2589f91 | ||
|
0b3677c2b1 | ||
|
868f1e7bfc | ||
|
e779280802 | ||
|
1725d1c4f5 | ||
|
6bd264244a | ||
|
fac7d531ec | ||
|
5afcd0981b | ||
|
cc805c0963 | ||
|
e75af5f531 | ||
|
dcd2a19d90 | ||
|
3e884aea46 | ||
|
ab16fcc8db | ||
|
754b7feaa1 | ||
|
4d3f0fb5df | ||
|
15cad02235 | ||
|
e0b83bbe8d | ||
|
321062833a | ||
|
5ea6e6cda2 | ||
|
dede6d6886 | ||
|
685f2a5f91 | ||
|
eeac43c3f7 | ||
|
089ea9af22 | ||
|
5294439595 | ||
|
b3efdcb38a | ||
|
3238f2291f | ||
|
ed12a54afd | ||
|
338afe3c6d | ||
|
b1b21292b9 | ||
|
a67d8afbd4 | ||
|
d4cbe451fc | ||
|
096ace5a68 | ||
|
8d3595fb4d | ||
|
018ab7229b | ||
|
f4764f7288 | ||
|
ccef385f02 | ||
|
e1495c013d | ||
|
f82a8f09eb | ||
|
0be4f3f75a | ||
|
bf6551a3ca | ||
|
617a322bd8 | ||
|
fdfb5ab466 | ||
|
a9a5a0b016 | ||
|
8d1a64c831 | ||
|
15d89bdff6 | ||
|
2167bee551 | ||
|
7ef34eb06d | ||
|
c443b02472 | ||
|
fcc244ea6d | ||
|
8b9221d845 | ||
|
50eccd298a | ||
|
819a2205e5 | ||
|
5d8b04a7ac | ||
|
d222a40046 | ||
|
23dfeee4cb | ||
|
474fa73e6c | ||
|
0a3c4f5d80 | ||
|
2884915000 | ||
|
5f8108e8a9 | ||
|
b4c99aacd4 | ||
|
30f5f97370 | ||
|
34d20b0f03 | ||
|
94ffc12b38 | ||
|
ab3bfb4205 | ||
|
8d98a6e37d | ||
|
b88be7c1e9 | ||
|
77879736af | ||
|
0d4534733b | ||
|
2926ce4838 | ||
|
a8e551cffa | ||
|
a0dbffb8f2 | ||
|
dfc7eacd50 | ||
|
0c4ca85149 | ||
|
c9d691e65e | ||
|
60e82ba472 | ||
|
f51c219b1c | ||
|
31cea7fa24 | ||
|
58b21d336c | ||
|
5e5bc14468 | ||
|
8ed91e8a77 | ||
|
4e31dc5e6e | ||
|
1f8ec20b55 | ||
|
4a42364a19 | ||
|
9f7ec6b094 | ||
|
9dc18a62a6 | ||
|
5b65b9b860 | ||
|
552e40a4be | ||
|
79e16baca3 | ||
|
9a7656364e | ||
|
2de3605b4c | ||
|
d6b9d00ceb | ||
|
f67b610dd4 | ||
|
608f055c72 | ||
|
84d10b32c3 | ||
|
8bc0c5c2c0 | ||
|
97bf16e5b6 | ||
|
90f5edc0b8 | ||
|
c14a35e21e | ||
|
f4cd470bcb | ||
|
3c9011030f | ||
|
2040309d0c | ||
|
58cc4b2c5c | ||
|
b020467192 | ||
|
d10463ac91 | ||
|
cfb5cb8805 | ||
|
1d75b205cb | ||
|
f940a97500 | ||
|
ff6a8891d4 | ||
|
c29e4455bb | ||
|
9bfa499d94 | ||
|
53b193a161 | ||
|
e98102162f | ||
|
f5d3954568 | ||
|
ae53cd29ef | ||
|
a678665c49 | ||
|
8a8eefa0d8 | ||
|
525ad7bfb8 | ||
|
eb7c9994bf | ||
|
94c7aa0d67 | ||
|
f2617a671f | ||
|
4778d02c67 | ||
|
f710db6504 | ||
|
0e759c9422 | ||
|
a162004a90 | ||
|
ae44a28125 | ||
|
14856e8b60 | ||
|
73567ae5be | ||
|
0d5f7a9eab | ||
|
a199efae44 | ||
|
14ad79f035 | ||
|
f9b0dc9827 | ||
|
440e7e36f3 | ||
|
407a3e2860 | ||
|
5fbf4ddde8 | ||
|
6e69f63ffa | ||
|
eb732457ea | ||
|
973bf29622 | ||
|
bb3ab87a18 | ||
|
d6b3a60fbc | ||
|
6c421f131d | ||
|
93186e4999 | ||
|
2c1fc13ee4 | ||
|
20b12204af | ||
|
ee9dffcd66 | ||
|
370eac3c48 | ||
|
1034b6e0db | ||
|
ac94014ef8 | ||
|
9f91bd6ea9 | ||
|
84077401e9 | ||
|
10c18f8124 | ||
|
09e0714284 | ||
|
7c2c7858c6 | ||
|
9da2285b14 | ||
|
6158801aeb | ||
|
3d493b60f1 | ||
|
18ee28bf82 | ||
|
5f8431d7ca | ||
|
0ee9a03b1e | ||
|
c3cba58a71 | ||
|
ce4672d74b | ||
|
8dab9f6ab1 | ||
|
682f1cf203 | ||
|
0e8c4ea7ce | ||
|
fd72eb917e | ||
|
d81946a35b | ||
|
638c4b604e | ||
|
b8df6ae3c1 | ||
|
df434c839a | ||
|
c2858e9ed7 | ||
|
7c87948eaf | ||
|
30489c5aa1 | ||
|
390a66d2e7 | ||
|
9e6c0c747b | ||
|
8094a1c99e | ||
|
bfe2d42af4 | ||
|
1a250234ea | ||
|
3169179de1 | ||
|
fe9c7a01c5 | ||
|
65166858ff | ||
|
b5e24676a4 | ||
|
40ab709aac | ||
|
d18431338a | ||
|
cc87d5ab10 | ||
|
25cf67667f | ||
|
bb13275b72 | ||
|
9c513346ad | ||
|
68809869f9 | ||
|
1fe319d234 | ||
|
d630684654 | ||
|
8b81a03a5a | ||
|
9903f88947 | ||
|
d73ab0bd58 | ||
|
11e47f08b1 | ||
|
aef4edadd0 | ||
|
bf7cc2ffac | ||
|
adebcc7111 | ||
|
fb4f633243 | ||
|
49130ab8ec | ||
|
baed2dad56 | ||
|
98990217bc | ||
|
71018b4ab5 | ||
|
79e2433eb0 | ||
|
546c99a3a3 | ||
|
7b877c4e24 | ||
|
31cbb20ba2 | ||
|
f2756d0b3f | ||
|
9718675d86 | ||
|
80d181f12d | ||
|
a7a70cf34d | ||
|
2867ca1e5b | ||
|
a1154247fa | ||
|
fcedb0be32 | ||
|
bf09dba95b | ||
|
16bf872117 | ||
|
1be81a1540 | ||
|
81963967e5 | ||
|
66c0394ae1 | ||
|
f308228a19 | ||
|
56ecd62f58 | ||
|
94ee10e655 | ||
|
07cc6e00da | ||
|
6d463d36fa | ||
|
95e282d5a0 | ||
|
5aeb37d1b8 | ||
|
da68ec56c3 | ||
|
5d0d30db38 | ||
|
32e78aeb2e | ||
|
93e66661d3 | ||
|
ac009a5f5c | ||
|
51f0cd3b51 | ||
|
019609b6cd | ||
|
eed94448fd | ||
|
25b7eba4a0 | ||
|
176ab9a5d2 | ||
|
f4fb25b63d | ||
|
e3be6b8ae0 | ||
|
3d110d2e1b | ||
|
0b5023bc62 | ||
|
9dbc935afb | ||
|
f7dc6df02c | ||
|
f30acd8f74 | ||
|
16ae02ab85 | ||
|
4637c31d82 | ||
|
7f0d5e0a03 | ||
|
f8668c5a9f | ||
|
1955c37c48 | ||
|
d099181307 | ||
|
b97039f3f5 | ||
|
a368d89c94 | ||
|
d80d4be030 | ||
|
d8551b73f6 | ||
|
45ca8b8d19 | ||
|
58a247b26d | ||
|
2f8b71d7a1 | ||
|
ce5e649d3b | ||
|
80e4922b5e | ||
|
c23fca6343 | ||
|
0882fffc37 | ||
|
ad9458a14c | ||
|
0d6937b33b | ||
|
af866e05d2 | ||
|
b4ea2d32e6 | ||
|
0c70eb8d5c | ||
|
08737bdc02 | ||
|
0d9e71fe81 | ||
|
ac01da6953 | ||
|
99e72830ea | ||
|
3f852c321f | ||
|
15d102b75e | ||
|
0019f7a45e | ||
|
2d0ffd788b | ||
|
e27dc50689 | ||
|
b7a0f225ea | ||
|
29a75ab09d | ||
|
3ee7f8f695 | ||
|
e376404d38 | ||
|
079518617c | ||
|
549308051d | ||
|
5bc1c38159 | ||
|
f95c9d1bf3 | ||
|
75e44abf09 | ||
|
a397195d3f | ||
|
ab2247f8f3 | ||
|
5b7281bd41 | ||
|
85eda77d35 | ||
|
213dd2d0d6 | ||
|
00d2efb9ab | ||
|
4feede6dd5 | ||
|
c0bc10427c | ||
|
2d8d8f5917 | ||
|
472e5fc4a9 | ||
|
e55e616f1f | ||
|
50a228394f | ||
|
afbd589348 | ||
|
82284b86eb | ||
|
d3247a8c83 | ||
|
67c9155f3b | ||
|
8e899ccc29 | ||
|
d55c57b504 | ||
|
ea6c50d9e2 | ||
|
6634c47e57 | ||
|
2fa90ae19f | ||
|
2e9aff759e | ||
|
617c42b20a | ||
|
953106e74d | ||
|
07bf2b166b | ||
|
8c0512027f | ||
|
be51c201dd | ||
|
57f872054c | ||
|
9bb5e880ae | ||
|
9610d68f19 | ||
|
539a728063 | ||
|
58c05ba8ee | ||
|
d5de48ab53 | ||
|
99762ad7f0 | ||
|
6da26c8d6c | ||
|
d2952e4e92 | ||
|
206f9ca4bc | ||
|
d1a2ec4d20 | ||
|
78666204a1 | ||
|
2ca9a0979e | ||
|
5bcf9c76fd | ||
|
4dee58d480 | ||
|
32f482a6d8 | ||
|
0321bec232 | ||
|
2bb8517e9e | ||
|
f4ea29cd06 | ||
|
52f7684487 | ||
|
d2779aa765 | ||
|
a3007b9b0e | ||
|
14a3fe0ac0 | ||
|
beaeb0d4af | ||
|
c48127fa9e | ||
|
372e908682 | ||
|
bc7ebc1a89 | ||
|
186d03b32a | ||
|
c8ea64976f | ||
|
2023095d8e | ||
|
8597002a17 | ||
|
4f7102be26 | ||
|
e4e3e50867 | ||
|
fa0b5e1b85 | ||
|
018ae69b33 | ||
|
244d6d7823 | ||
|
d1d08ef99f | ||
|
85c6168bba | ||
|
2f5e230338 | ||
|
baa9cd8968 | ||
|
412eb6a611 | ||
|
4e8e25a521 | ||
|
731ff91acd | ||
|
b234e28d5d | ||
|
d6fcbdc38b | ||
|
f737e8ce9f | ||
|
6350641f0a | ||
|
16ddfafeaa | ||
|
4884232360 | ||
|
9457cf33d1 | ||
|
66b16f1fc1 | ||
|
2226e60944 | ||
|
9558b85f7b | ||
|
c9003b5547 | ||
|
9f63a8abfa | ||
|
4ff66a7818 | ||
|
72d58d7b93 | ||
|
11c15b562d | ||
|
9b81d72c46 | ||
|
b0277a129b | ||
|
120082ee3a | ||
|
6abb5cbcbb | ||
|
b215a989f5 | ||
|
5fe4dfb511 | ||
|
cf2eab5b4e | ||
|
55d0560746 | ||
|
1982543cd2 | ||
|
aaf2800c9c | ||
|
62414bff6e | ||
|
2376d3b16a | ||
|
6a65341e14 | ||
|
bff31f006e | ||
|
7410346c5c | ||
|
27a8b3c17b | ||
|
7c070f55be | ||
|
3d8aa53573 | ||
|
7c88c92778 | ||
|
21355e31db | ||
|
97dbd8b63b | ||
|
0df9cc2fc5 | ||
|
e2ce3026a0 | ||
|
6a8ade99c7 | ||
|
43fc399cd1 | ||
|
5ae781586f | ||
|
798d7c6d68 | ||
|
368dec7ac7 | ||
|
12dcfd08b8 | ||
|
0e0862cfc7 | ||
|
5b306f0390 | ||
|
d88347ee7d | ||
|
7a8516d296 | ||
|
c50aba1335 | ||
|
6d9a58bfef | ||
|
071a049f07 | ||
|
e019f7e7f2 | ||
|
315c9455d5 | ||
|
97b0c645bf | ||
|
53f46d32e2 | ||
|
e9560ef021 | ||
|
a44f2c0e65 | ||
|
c54b5da403 | ||
|
c745f434f5 | ||
|
3fa6f48ac6 | ||
|
ce8fe645f4 | ||
|
79eaf49ec0 | ||
|
9950d8a319 | ||
|
4928e2bf0a | ||
|
a570d0a129 | ||
|
918b4e81d2 | ||
|
dd96d0ac93 | ||
|
106a617fa8 | ||
|
3817b4e1c5 | ||
|
2ba461e348 | ||
|
5352e2caa0 | ||
|
463930761b | ||
|
980f955f6c | ||
|
f69829f7b4 | ||
|
c3fd757b03 | ||
|
343288c1f6 | ||
|
355b46e6c5 | ||
|
366b90be1a | ||
|
77a8f103d8 | ||
|
4250725a60 | ||
|
b151904316 | ||
|
558afefc04 | ||
|
21eabd3938 | ||
|
0c090a8c8b | ||
|
926d2beddb | ||
|
98bdd36231 | ||
|
8e870d4cc0 | ||
|
afb5449ca4 | ||
|
5a74b5008d | ||
|
72ac5badb0 | ||
|
3af0c47c97 | ||
|
a46c95c7f2 | ||
|
6801478a13 | ||
|
ef5a21496c | ||
|
67a55efa27 | ||
|
c5694b3013 | ||
|
466347a335 | ||
|
9cfaf0944c | ||
|
bfd564f257 | ||
|
43c1910453 | ||
|
260dbf0a1d | ||
|
f3e20ca437 | ||
|
a2867ff6ea | ||
|
9689f7b925 | ||
|
2037b5ce39 | ||
|
f4c5e6568e | ||
|
865bf67b1a | ||
|
f474b6da85 | ||
|
a578bc2fad | ||
|
5a11d19940 | ||
|
c28778e28c | ||
|
c873327fe3 | ||
|
d25b427efe | ||
|
9cd378caa7 | ||
|
b0258803c6 | ||
|
77eb94409c | ||
|
0735250eb1 | ||
|
fa21cd13d2 | ||
|
d74fffd5de | ||
|
e7722af9a2 | ||
|
0cd409bd6d | ||
|
2ea7f9769a | ||
|
221451b817 | ||
|
48a795c101 | ||
|
f29c963030 | ||
|
dd81707992 | ||
|
ec410fb6fe | ||
|
3edaa5280d | ||
|
51e415a026 | ||
|
04f559e28d | ||
|
ecda05af29 | ||
|
4661315192 | ||
|
0f488ac286 | ||
|
e649708cb2 | ||
|
f656d95339 | ||
|
6eae8f22dc | ||
|
21eeaffc23 | ||
|
831426ca63 | ||
|
58ceab5f1e | ||
|
766a9dc9fd | ||
|
0e8ba24f32 | ||
|
744cee6ec9 | ||
|
32eb50b75e | ||
|
887e58bd21 | ||
|
11a2413476 | ||
|
be4eb6fb2b | ||
|
9e56099edd | ||
|
d92bb41e25 | ||
|
69e351b44a | ||
|
ce161c2c02 | ||
|
f383f7721c | ||
|
1252016b9c | ||
|
1b17a5293c | ||
|
3e4752f99e | ||
|
f44307da4e | ||
|
fd127d59fa | ||
|
29b72c59f3 | ||
|
11376a2dd0 | ||
|
cc9168bda1 | ||
|
f4d0c83181 | ||
|
096efdf798 | ||
|
20735bf840 | ||
|
e3c3e780ae | ||
|
9190cf8796 | ||
|
d19a21bd01 | ||
|
94b8486d4b | ||
|
cce430fbfa | ||
|
5b8051581e | ||
|
0e8d129efb | ||
|
62012e3c68 | ||
|
b8c71e7f2d | ||
|
ac83639631 | ||
|
fef21361c5 | ||
|
368fa9475d | ||
|
a90ee65f7b | ||
|
e83be1d73a | ||
|
e8c3e54dda | ||
|
2aee114950 | ||
|
4d322a97e1 | ||
|
8210f89b12 | ||
|
a28baabefe | ||
|
e94d16667b | ||
|
c3db1cae3f | ||
|
017162e3fd | ||
|
fef25ea934 | ||
|
a9282bad29 | ||
|
67931bdeb2 | ||
|
85f867983f | ||
|
ec17161651 | ||
|
3d4bd9667a | ||
|
7420814fe2 | ||
|
8d6f265441 | ||
|
bc8b0480e9 | ||
|
046d281abc | ||
|
efc6b35615 | ||
|
bf747e32b4 | ||
|
ef15735161 | ||
|
99c65bb67c | ||
|
967e837c73 | ||
|
ca084d40c1 | ||
|
238ebb600d | ||
|
a49601ba87 | ||
|
aa10ec6e45 | ||
|
be935debe9 | ||
|
1c8a74b661 | ||
|
73ddbc3acd | ||
|
7f9840cecf | ||
|
cc3036860a | ||
|
2af40c3fe6 | ||
|
ea1958a948 | ||
|
9d42e146e7 | ||
|
c156b50e4c | ||
|
3752d68e7d | ||
|
cb860e8150 | ||
|
434238fcd4 | ||
|
2d10547266 | ||
|
f9a21281c4 | ||
|
d590eb074f | ||
|
66ff4aae89 | ||
|
450d0d69af | ||
|
28889954ef | ||
|
f0a55df963 | ||
|
40fff219b5 | ||
|
2ed818bc03 | ||
|
9017eaee08 | ||
|
38aae024cd | ||
|
1fc11c27e7 | ||
|
c4a8930909 | ||
|
a280c97321 | ||
|
dfd1c85916 | ||
|
fc86d741db | ||
|
ca38af0d83 | ||
|
f7584bf14c | ||
|
0090ce3df7 | ||
|
433db8f9f9 | ||
|
7e9e321c38 | ||
|
6ac1ed18ea | ||
|
54930ddd33 | ||
|
3e59b7345c | ||
|
838c4e938c | ||
|
f79a52fe9b | ||
|
2eb1657d91 | ||
|
e6a32db7b9 | ||
|
acce7ec9cf | ||
|
fbb2d5e10d | ||
|
f86edf8d3c | ||
|
08ba147241 | ||
|
2b6a139526 | ||
|
9f60cd18e3 | ||
|
ac7b3e405c | ||
|
bb3cb8f233 | ||
|
e745b0dd47 | ||
|
f17d60da64 | ||
|
afb6e485b7 | ||
|
ccfd6dde45 | ||
|
706868dad8 | ||
|
3b3a1390ad | ||
|
fafe1732b5 | ||
|
5ff7d9505f | ||
|
2e6a110181 | ||
|
1592b40e25 | ||
|
9cd0c101f0 | ||
|
3d62c9ed9d | ||
|
53fafad915 |
@ -1,22 +1,47 @@
|
|||||||
|
image:
|
||||||
|
- Visual Studio 2015
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- ci
|
- ci
|
||||||
- master
|
- master
|
||||||
|
- latest
|
||||||
|
- 3.3-stable
|
||||||
skip_tags: true
|
skip_tags: true
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- BUILD_SHARED_LIBS: ON
|
- GENERATOR: MinGW Makefiles
|
||||||
- BUILD_SHARED_LIBS: OFF
|
BUILD_SHARED_LIBS: ON
|
||||||
|
CFLAGS: -Werror
|
||||||
|
- GENERATOR: MinGW Makefiles
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
CFLAGS: -Werror
|
||||||
|
- GENERATOR: Visual Studio 12 2013
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
CFLAGS: /WX
|
||||||
|
- GENERATOR: Visual Studio 12 2013
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
CFLAGS: /WX
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
build_script:
|
for:
|
||||||
- mkdir build
|
-
|
||||||
- cd build
|
matrix:
|
||||||
- cmake -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% ..
|
only:
|
||||||
- cmake --build .
|
- GENERATOR: MinGW Makefiles
|
||||||
|
build_script:
|
||||||
|
- set PATH=%PATH:C:\Program Files\Git\usr\bin=C:\MinGW\bin%
|
||||||
|
- cmake -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
||||||
|
- cmake --build build
|
||||||
|
-
|
||||||
|
matrix:
|
||||||
|
only:
|
||||||
|
- GENERATOR: Visual Studio 12 2013
|
||||||
|
build_script:
|
||||||
|
- cmake -B build -G "%GENERATOR%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS%
|
||||||
|
- cmake --build build --target glfw
|
||||||
notifications:
|
notifications:
|
||||||
- provider: Email
|
- provider: Email
|
||||||
to:
|
to:
|
||||||
- ci@glfw.org
|
- ci@glfw.org
|
||||||
- on_build_failure: true
|
on_build_failure: true
|
||||||
- on_build_success: false
|
on_build_success: false
|
||||||
|
67
.editorconfig
Normal file
67
.editorconfig
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# EditorConfig for GLFW and its internal dependencies
|
||||||
|
#
|
||||||
|
# All files created by GLFW should indent with four spaces unless their format requires
|
||||||
|
# otherwise. A few files still use other indent styles for historical reasons.
|
||||||
|
#
|
||||||
|
# Dependencies have (what seemed to be) their existing styles described. Those with
|
||||||
|
# existing trailing whitespace have it preserved to avoid cluttering future commits.
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
|
||||||
|
[include/GLFW/*.h]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[{src,examples,tests}/*.{c,m,h,rc,in}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[CMakeLists.txt]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[CMake/**.{cmake,in}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.{md}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[DoxygenLayout.xml]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[docs/*.{scss,html}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = unset
|
||||||
|
|
||||||
|
[deps/mingw/*.h]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 8
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[deps/getopt.{c,h}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[deps/linmath.h]
|
||||||
|
indent_style = tab
|
||||||
|
tab_width = 4
|
||||||
|
indent_size = 4
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[deps/nuklear*.h]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[deps/tinycthread.{c,h}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
5
.gitattributes
vendored
Normal file
5
.gitattributes
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*.m linguist-language=Objective-C
|
||||||
|
.gitignore export-ignore
|
||||||
|
.gitattributes export-ignore
|
||||||
|
.travis.yml export-ignore
|
||||||
|
.appveyor.yml export-ignore
|
8
.github/CODEOWNERS
vendored
Normal file
8
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
* @elmindreda
|
||||||
|
|
||||||
|
docs/*.css @glfw/webdev
|
||||||
|
docs/*.scss @glfw/webdev
|
||||||
|
docs/*.html @glfw/webdev
|
||||||
|
docs/*.xml @glfw/webdev
|
||||||
|
|
100
.github/workflows/build.yml
vendored
Normal file
100
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
name: Build
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ ci, master, latest, 3.3-stable ]
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
statuses: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-clang:
|
||||||
|
name: Linux (Clang)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 4
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: -Werror
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libwayland-dev libxkbcommon-dev
|
||||||
|
|
||||||
|
- name: Configure Null shared library
|
||||||
|
run: cmake -B build-null-shared -D GLFW_BUILD_WAYLAND=OFF -D GLFW_BUILD_X11=OFF -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Null shared library
|
||||||
|
run: cmake --build build-null-shared --parallel
|
||||||
|
|
||||||
|
- name: Configure X11 shared library
|
||||||
|
run: cmake -B build-x11-shared -D GLFW_BUILD_WAYLAND=OFF -D GLFW_BUILD_X11=ON -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build X11 shared library
|
||||||
|
run: cmake --build build-x11-shared --parallel
|
||||||
|
|
||||||
|
- name: Configure Wayland shared library
|
||||||
|
run: cmake -B build-wayland-shared -D GLFW_BUILD_WAYLAND=ON -D GLFW_BUILD_X11=OFF -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Wayland shared library
|
||||||
|
run: cmake --build build-wayland-shared --parallel
|
||||||
|
|
||||||
|
- name: Configure Wayland+X11 static library
|
||||||
|
run: cmake -B build-full-static -D GLFW_BUILD_WAYLAND=ON -D GLFW_BUILD_X11=ON
|
||||||
|
- name: Build Wayland+X11 static library
|
||||||
|
run: cmake --build build-full-static --parallel
|
||||||
|
|
||||||
|
- name: Configure Wayland+X11 shared library
|
||||||
|
run: cmake -B build-full-shared -D GLFW_BUILD_WAYLAND=ON -D BUILD_SHARED_LIBS=ON -D GLFW_BUILD_X11=ON
|
||||||
|
- name: Build Wayland+X11 shared library
|
||||||
|
run: cmake --build build-full-shared --parallel
|
||||||
|
|
||||||
|
build-macos-clang:
|
||||||
|
name: macOS (Clang)
|
||||||
|
runs-on: macos-latest
|
||||||
|
timeout-minutes: 4
|
||||||
|
env:
|
||||||
|
CFLAGS: -Werror
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: 10.11
|
||||||
|
CMAKE_OSX_ARCHITECTURES: x86_64;arm64
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Configure Null shared library
|
||||||
|
run: cmake -B build-null-shared -D GLFW_BUILD_COCOA=OFF -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Null shared library
|
||||||
|
run: cmake --build build-null-shared --parallel
|
||||||
|
|
||||||
|
- name: Configure Cocoa static library
|
||||||
|
run: cmake -B build-cocoa-static
|
||||||
|
- name: Build Cocoa static library
|
||||||
|
run: cmake --build build-cocoa-static --parallel
|
||||||
|
|
||||||
|
- name: Configure Cocoa shared library
|
||||||
|
run: cmake -B build-cocoa-shared -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Cocoa shared library
|
||||||
|
run: cmake --build build-cocoa-shared --parallel
|
||||||
|
|
||||||
|
build-windows-vs2022:
|
||||||
|
name: Windows (VS2022)
|
||||||
|
runs-on: windows-latest
|
||||||
|
timeout-minutes: 4
|
||||||
|
env:
|
||||||
|
CFLAGS: /WX
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Configure Win32 shared x86 library
|
||||||
|
run: cmake -B build-win32-shared-x86 -G "Visual Studio 17 2022" -A Win32 -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Win32 shared x86 library
|
||||||
|
run: cmake --build build-win32-shared-x86 --parallel
|
||||||
|
|
||||||
|
- name: Configure Win32 static x64 library
|
||||||
|
run: cmake -B build-win32-static-x64 -G "Visual Studio 17 2022" -A x64
|
||||||
|
- name: Build Win32 static x64 library
|
||||||
|
run: cmake --build build-win32-static-x64 --parallel
|
||||||
|
|
||||||
|
- name: Configure Win32 shared x64 library
|
||||||
|
run: cmake -B build-win32-shared-x64 -G "Visual Studio 17 2022" -A x64 -D BUILD_SHARED_LIBS=ON
|
||||||
|
- name: Build Win32 shared x64 library
|
||||||
|
run: cmake --build build-win32-shared-x64 --parallel
|
||||||
|
|
52
.gitignore
vendored
52
.gitignore
vendored
@ -1,25 +1,46 @@
|
|||||||
# External junk
|
# The canonical out-of-tree build subdirectory
|
||||||
.DS_Store
|
build
|
||||||
|
build-*
|
||||||
|
|
||||||
|
# Visual Studio clutter
|
||||||
_ReSharper*
|
_ReSharper*
|
||||||
*.opensdf
|
|
||||||
*.sdf
|
*.sdf
|
||||||
*.suo
|
*.suo
|
||||||
*.dir
|
*.dir
|
||||||
*.vcxproj*
|
*.vcxproj*
|
||||||
*.sln
|
*.sln
|
||||||
|
.vs
|
||||||
|
CMakeSettings.json
|
||||||
Win32
|
Win32
|
||||||
x64
|
x64
|
||||||
Debug
|
Debug
|
||||||
Release
|
Release
|
||||||
MinSizeRel
|
MinSizeRel
|
||||||
RelWithDebInfo
|
RelWithDebInfo
|
||||||
*.xcodeproj
|
*.opensdf
|
||||||
|
|
||||||
# CMake files
|
# Xcode clutter
|
||||||
|
GLFW.build
|
||||||
|
GLFW.xcodeproj
|
||||||
|
|
||||||
|
# macOS clutter
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Makefile generator clutter
|
||||||
Makefile
|
Makefile
|
||||||
|
|
||||||
|
# Ninja generator clutter
|
||||||
|
build.ninja
|
||||||
|
rules.ninja
|
||||||
|
.ninja_deps
|
||||||
|
.ninja_log
|
||||||
|
|
||||||
|
# CMake clutter
|
||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
CMakeScripts
|
CMakeScripts
|
||||||
|
CMakeDoxyfile.in
|
||||||
|
CMakeDoxygenDefaults.cmake
|
||||||
cmake_install.cmake
|
cmake_install.cmake
|
||||||
cmake_uninstall.cmake
|
cmake_uninstall.cmake
|
||||||
|
|
||||||
@ -32,19 +53,15 @@ 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.2
|
src/libglfw.so.3.5
|
||||||
src/libglfw.dylib
|
src/libglfw.dylib
|
||||||
src/libglfw.dylib
|
src/libglfw.dylib
|
||||||
src/libglfw.3.dylib
|
src/libglfw.3.dylib
|
||||||
src/libglfw.3.2.dylib
|
src/libglfw.3.5.dylib
|
||||||
src/libglfw3.a
|
src/libglfw3.a
|
||||||
src/glfw3.lib
|
src/glfw3.lib
|
||||||
src/glfw3.dll
|
src/glfw3.dll
|
||||||
@ -55,10 +72,13 @@ examples/*.exe
|
|||||||
examples/boing
|
examples/boing
|
||||||
examples/gears
|
examples/gears
|
||||||
examples/heightmap
|
examples/heightmap
|
||||||
|
examples/offscreen
|
||||||
examples/particles
|
examples/particles
|
||||||
examples/splitview
|
examples/splitview
|
||||||
examples/simple
|
examples/sharing
|
||||||
|
examples/triangle-opengl
|
||||||
examples/wave
|
examples/wave
|
||||||
|
examples/windows
|
||||||
tests/*.app
|
tests/*.app
|
||||||
tests/*.exe
|
tests/*.exe
|
||||||
tests/clipboard
|
tests/clipboard
|
||||||
@ -67,16 +87,18 @@ tests/empty
|
|||||||
tests/events
|
tests/events
|
||||||
tests/gamma
|
tests/gamma
|
||||||
tests/glfwinfo
|
tests/glfwinfo
|
||||||
|
tests/icon
|
||||||
tests/iconify
|
tests/iconify
|
||||||
|
tests/inputlag
|
||||||
tests/joysticks
|
tests/joysticks
|
||||||
tests/monitors
|
tests/monitors
|
||||||
tests/msaa
|
tests/msaa
|
||||||
tests/reopen
|
tests/reopen
|
||||||
tests/sharing
|
|
||||||
tests/tearing
|
tests/tearing
|
||||||
tests/threads
|
tests/threads
|
||||||
|
tests/timeout
|
||||||
tests/title
|
tests/title
|
||||||
tests/version
|
tests/triangle-vulkan
|
||||||
tests/vulkan
|
tests/window
|
||||||
tests/windows
|
tests/windows
|
||||||
|
|
||||||
|
10
.mailmap
Normal file
10
.mailmap
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Camilla Löwy <elmindreda@glfw.org> <elmindreda@users.sourceforge.net>
|
||||||
|
Camilla Löwy <elmindreda@glfw.org> <elmindreda@elmindreda.org>
|
||||||
|
Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
|
||||||
|
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
||||||
|
|
||||||
|
Marcus Geelnard <m@bitsnbites.eu> <marcus256@users.sourceforge.net>
|
||||||
|
Marcus Geelnard <m@bitsnbites.eu> <marcus@geelnards-pc.(none)>
|
||||||
|
Marcus Geelnard <m@bitsnbites.eu>
|
||||||
|
|
30
.travis.yml
30
.travis.yml
@ -1,30 +0,0 @@
|
|||||||
language: c
|
|
||||||
compiler: clang
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- ci
|
|
||||||
- master
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
sudo: false
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- kubuntu-backports
|
|
||||||
packages:
|
|
||||||
- cmake
|
|
||||||
env:
|
|
||||||
- BUILD_SHARED_LIBS=ON
|
|
||||||
- BUILD_SHARED_LIBS=OFF
|
|
||||||
script:
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ..
|
|
||||||
- cmake --build .
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
recipients:
|
|
||||||
- ci@glfw.org
|
|
||||||
on_success: never
|
|
||||||
on_failure: always
|
|
50
CMake/GenerateMappings.cmake
Normal file
50
CMake/GenerateMappings.cmake
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Usage:
|
||||||
|
# cmake -P GenerateMappings.cmake <path/to/mappings.h.in> <path/to/mappings.h>
|
||||||
|
|
||||||
|
cmake_policy(VERSION 3.16)
|
||||||
|
|
||||||
|
set(source_url "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt")
|
||||||
|
set(source_path "${CMAKE_CURRENT_BINARY_DIR}/gamecontrollerdb.txt")
|
||||||
|
set(template_path "${CMAKE_ARGV3}")
|
||||||
|
set(target_path "${CMAKE_ARGV4}")
|
||||||
|
|
||||||
|
if (NOT EXISTS "${template_path}")
|
||||||
|
message(FATAL_ERROR "Failed to find template file ${template_path}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(DOWNLOAD "${source_url}" "${source_path}"
|
||||||
|
STATUS download_status
|
||||||
|
TLS_VERIFY on)
|
||||||
|
|
||||||
|
list(GET download_status 0 status_code)
|
||||||
|
list(GET download_status 1 status_message)
|
||||||
|
|
||||||
|
if (status_code)
|
||||||
|
message(FATAL_ERROR "Failed to download ${source_url}: ${status_message}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(STRINGS "${source_path}" lines)
|
||||||
|
list(FILTER lines INCLUDE REGEX "^[0-9a-fA-F]")
|
||||||
|
|
||||||
|
foreach(line IN LISTS lines)
|
||||||
|
if (line MATCHES "platform:Windows")
|
||||||
|
if (GLFW_WIN32_MAPPINGS)
|
||||||
|
string(APPEND GLFW_WIN32_MAPPINGS "\n")
|
||||||
|
endif()
|
||||||
|
string(APPEND GLFW_WIN32_MAPPINGS "\"${line}\",")
|
||||||
|
elseif (line MATCHES "platform:Mac OS X")
|
||||||
|
if (GLFW_COCOA_MAPPINGS)
|
||||||
|
string(APPEND GLFW_COCOA_MAPPINGS "\n")
|
||||||
|
endif()
|
||||||
|
string(APPEND GLFW_COCOA_MAPPINGS "\"${line}\",")
|
||||||
|
elseif (line MATCHES "platform:Linux")
|
||||||
|
if (GLFW_LINUX_MAPPINGS)
|
||||||
|
string(APPEND GLFW_LINUX_MAPPINGS "\n")
|
||||||
|
endif()
|
||||||
|
string(APPEND GLFW_LINUX_MAPPINGS "\"${line}\",")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
configure_file("${template_path}" "${target_path}" @ONLY NEWLINE_STYLE UNIX)
|
||||||
|
file(REMOVE "${source_path}")
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
# Define the environment for cross compiling from Linux to Win64
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows)
|
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
|
||||||
SET(CMAKE_C_COMPILER "amd64-mingw32msvc-gcc")
|
|
||||||
SET(CMAKE_CXX_COMPILER "amd64-mingw32msvc-g++")
|
|
||||||
SET(CMAKE_RC_COMPILER "amd64-mingw32msvc-windres")
|
|
||||||
SET(CMAKE_RANLIB "amd64-mingw32msvc-ranlib")
|
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/amd64-mingw32msvc")
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
if (NOT EXISTS "@GLFW_BINARY_DIR@/install_manifest.txt")
|
||||||
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
message(FATAL_ERROR "Cannot find install manifest: \"@GLFW_BINARY_DIR@/install_manifest.txt\"")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
file(READ "@GLFW_BINARY_DIR@/install_manifest.txt" files)
|
||||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
string(REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
|
||||||
foreach (file ${files})
|
foreach (file ${files})
|
13
CMake/glfw3.pc.in
Normal file
13
CMake/glfw3.pc.in
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||||
|
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A multi-platform library for OpenGL, window and input
|
||||||
|
Version: @GLFW_VERSION@
|
||||||
|
URL: https://www.glfw.org/
|
||||||
|
Requires.private: @GLFW_PKG_CONFIG_REQUIRES_PRIVATE@
|
||||||
|
Libs: -L${libdir} -l@GLFW_LIB_NAME@@GLFW_LIB_NAME_SUFFIX@
|
||||||
|
Libs.private: @GLFW_PKG_CONFIG_LIBS_PRIVATE@
|
||||||
|
Cflags: -I${includedir}
|
3
CMake/glfw3Config.cmake.in
Normal file
3
CMake/glfw3Config.cmake.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
find_dependency(Threads)
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/glfw3Targets.cmake")
|
@ -1,13 +0,0 @@
|
|||||||
# Define the environment for cross compiling from Linux to Win32
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows)
|
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
|
||||||
SET(CMAKE_C_COMPILER "i586-mingw32msvc-gcc")
|
|
||||||
SET(CMAKE_CXX_COMPILER "i586-mingw32msvc-g++")
|
|
||||||
SET(CMAKE_RC_COMPILER "i586-mingw32msvc-windres")
|
|
||||||
SET(CMAKE_RANLIB "i586-mingw32msvc-ranlib")
|
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/i586-mingw32msvc")
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
@ -1,13 +0,0 @@
|
|||||||
# Define the environment for cross compiling from Linux to Win32
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
|
||||||
SET(CMAKE_C_COMPILER "i686-pc-mingw32-gcc")
|
|
||||||
SET(CMAKE_CXX_COMPILER "i686-pc-mingw32-g++")
|
|
||||||
SET(CMAKE_RC_COMPILER "i686-pc-mingw32-windres")
|
|
||||||
SET(CMAKE_RANLIB "i686-pc-mingw32-ranlib")
|
|
||||||
|
|
||||||
#Configure the behaviour of the find commands
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/opt/mingw/usr/i686-pc-mingw32")
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
13
CMake/i686-w64-mingw32-clang.cmake
Normal file
13
CMake/i686-w64-mingw32-clang.cmake
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Define the environment for cross-compiling with 32-bit MinGW-w64 Clang
|
||||||
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
SET(CMAKE_C_COMPILER "i686-w64-mingw32-clang")
|
||||||
|
SET(CMAKE_CXX_COMPILER "i686-w64-mingw32-clang++")
|
||||||
|
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
||||||
|
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
||||||
|
|
||||||
|
# Configure the behaviour of the find commands
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
@ -1,4 +1,4 @@
|
|||||||
# Define the environment for cross compiling from Linux to Win32
|
# Define the environment for cross-compiling with 32-bit MinGW-w64 GCC
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
SET(CMAKE_C_COMPILER "i686-w64-mingw32-gcc")
|
SET(CMAKE_C_COMPILER "i686-w64-mingw32-gcc")
|
||||||
@ -6,7 +6,7 @@ SET(CMAKE_CXX_COMPILER "i686-w64-mingw32-g++")
|
|||||||
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
SET(CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
|
||||||
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
SET(CMAKE_RANLIB "i686-w64-mingw32-ranlib")
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
# Configure the behaviour of the find commands
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
17
CMake/modules/FindEpollShim.cmake
Normal file
17
CMake/modules/FindEpollShim.cmake
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Find EpollShim
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# EPOLLSHIM_FOUND - System has EpollShim
|
||||||
|
# EPOLLSHIM_INCLUDE_DIRS - The EpollShim include directories
|
||||||
|
# EPOLLSHIM_LIBRARIES - The libraries needed to use EpollShim
|
||||||
|
|
||||||
|
find_path(EPOLLSHIM_INCLUDE_DIRS NAMES sys/epoll.h sys/timerfd.h HINTS /usr/local/include/libepoll-shim)
|
||||||
|
find_library(EPOLLSHIM_LIBRARIES NAMES epoll-shim libepoll-shim HINTS /usr/local/lib)
|
||||||
|
|
||||||
|
if (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
||||||
|
set(EPOLLSHIM_FOUND TRUE)
|
||||||
|
endif (EPOLLSHIM_INCLUDE_DIRS AND EPOLLSHIM_LIBRARIES)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(EpollShim DEFAULT_MSG EPOLLSHIM_LIBRARIES EPOLLSHIM_INCLUDE_DIRS)
|
||||||
|
mark_as_advanced(EPOLLSHIM_INCLUDE_DIRS EPOLLSHIM_LIBRARIES)
|
@ -1,18 +0,0 @@
|
|||||||
# Try to find Mir on a Unix system
|
|
||||||
#
|
|
||||||
# This will define:
|
|
||||||
#
|
|
||||||
# MIR_LIBRARIES - Link these to use Wayland
|
|
||||||
# MIR_INCLUDE_DIR - Include directory for Wayland
|
|
||||||
#
|
|
||||||
# Copyright (c) 2014 Brandon Schaefer <brandon.schaefer@canonical.com>
|
|
||||||
|
|
||||||
if (NOT WIN32)
|
|
||||||
|
|
||||||
find_package (PkgConfig)
|
|
||||||
pkg_check_modules (PKG_MIR QUIET mirclient)
|
|
||||||
|
|
||||||
set (MIR_INCLUDE_DIR ${PKG_MIR_INCLUDE_DIRS})
|
|
||||||
set (MIR_LIBRARIES ${PKG_MIR_LIBRARIES})
|
|
||||||
|
|
||||||
endif ()
|
|
@ -1,34 +0,0 @@
|
|||||||
# Find Vulkan
|
|
||||||
#
|
|
||||||
# VULKAN_INCLUDE_DIR
|
|
||||||
# VULKAN_LIBRARY
|
|
||||||
# VULKAN_FOUND
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/Include"
|
|
||||||
"$ENV{VK_SDK_PATH}/Include")
|
|
||||||
if (CMAKE_CL_64)
|
|
||||||
find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/Bin"
|
|
||||||
"$ENV{VK_SDK_PATH}/Bin")
|
|
||||||
find_library(VULKAN_STATIC_LIBRARY NAMES vkstatic.1 HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/Bin"
|
|
||||||
"$ENV{VK_SDK_PATH}/Bin")
|
|
||||||
else()
|
|
||||||
find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/Bin32"
|
|
||||||
"$ENV{VK_SDK_PATH}/Bin32")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/include")
|
|
||||||
find_library(VULKAN_LIBRARY NAMES vulkan HINTS
|
|
||||||
"$ENV{VULKAN_SDK}/lib")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(Vulkan DEFAULT_MSG VULKAN_LIBRARY VULKAN_INCLUDE_DIR)
|
|
||||||
|
|
||||||
mark_as_advanced(VULKAN_INCLUDE_DIR VULKAN_LIBRARY VULKAN_STATIC_LIBRARY)
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
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})
|
|
@ -1,34 +0,0 @@
|
|||||||
# - 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)
|
|
||||||
|
|
13
CMake/x86_64-w64-mingw32-clang.cmake
Normal file
13
CMake/x86_64-w64-mingw32-clang.cmake
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Define the environment for cross-compiling with 64-bit MinGW-w64 Clang
|
||||||
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-clang")
|
||||||
|
SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-clang++")
|
||||||
|
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
||||||
|
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
||||||
|
|
||||||
|
# Configure the behaviour of the find commands
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
@ -1,4 +1,4 @@
|
|||||||
# Define the environment for cross compiling from Linux to Win32
|
# Define the environment for cross-compiling with 64-bit MinGW-w64 GCC
|
||||||
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
SET(CMAKE_SYSTEM_NAME Windows) # Target system name
|
||||||
SET(CMAKE_SYSTEM_VERSION 1)
|
SET(CMAKE_SYSTEM_VERSION 1)
|
||||||
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc")
|
SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc")
|
||||||
@ -6,7 +6,7 @@ SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++")
|
|||||||
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
SET(CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
|
||||||
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
SET(CMAKE_RANLIB "x86_64-w64-mingw32-ranlib")
|
||||||
|
|
||||||
# Configure the behaviour of the find commands
|
# Configure the behaviour of the find commands
|
||||||
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
SET(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
393
CMakeLists.txt
393
CMakeLists.txt
@ -1,376 +1,96 @@
|
|||||||
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
cmake_minimum_required(VERSION 3.16...3.28 FATAL_ERROR)
|
||||||
|
|
||||||
project(GLFW C)
|
project(GLFW VERSION 3.5.0 LANGUAGES C HOMEPAGE_URL "https://www.glfw.org/")
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.12)
|
|
||||||
|
|
||||||
if (NOT CMAKE_VERSION VERSION_LESS "3.0")
|
|
||||||
# Until all major package systems have moved to CMake 3,
|
|
||||||
# we stick with the older INSTALL_NAME_DIR mechanism
|
|
||||||
cmake_policy(SET CMP0042 OLD)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(GLFW_VERSION_MAJOR "3")
|
|
||||||
set(GLFW_VERSION_MINOR "2")
|
|
||||||
set(GLFW_VERSION_PATCH "1")
|
|
||||||
set(GLFW_VERSION_EXTRA "")
|
|
||||||
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
|
|
||||||
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
|
|
||||||
set(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib will be installed: lib or lib64")
|
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}" GLFW_STANDALONE)
|
||||||
|
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||||
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ${GLFW_STANDALONE})
|
||||||
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ${GLFW_STANDALONE})
|
||||||
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 "Use the Vulkan loader statically linked into application" OFF)
|
|
||||||
option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
|
|
||||||
|
|
||||||
if (WIN32)
|
include(GNUInstallDirs)
|
||||||
option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF)
|
include(CMakeDependentOption)
|
||||||
|
|
||||||
|
if (GLFW_USE_OSMESA)
|
||||||
|
message(FATAL_ERROR "GLFW_USE_OSMESA has been removed; set the GLFW_PLATFORM init hint")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (DEFINED GLFW_USE_WAYLAND AND UNIX AND NOT APPLE)
|
||||||
option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
|
message(FATAL_ERROR
|
||||||
option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
|
"GLFW_USE_WAYLAND has been removed; delete the CMake cache and set GLFW_BUILD_WAYLAND and GLFW_BUILD_X11 instead")
|
||||||
option(GLFW_USE_RETINA "Use the full resolution of Retina displays" ON)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
cmake_dependent_option(GLFW_BUILD_WIN32 "Build support for Win32" ON "WIN32" OFF)
|
||||||
option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF)
|
cmake_dependent_option(GLFW_BUILD_COCOA "Build support for Cocoa" ON "APPLE" OFF)
|
||||||
option(GLFW_USE_MIR "Use Mir for window creation" OFF)
|
cmake_dependent_option(GLFW_BUILD_X11 "Build support for X11" ON "UNIX;NOT APPLE" OFF)
|
||||||
endif()
|
cmake_dependent_option(GLFW_BUILD_WAYLAND "Build support for Wayland" ON "UNIX;NOT APPLE" OFF)
|
||||||
|
|
||||||
if (MSVC)
|
cmake_dependent_option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF
|
||||||
option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON)
|
"WIN32" OFF)
|
||||||
endif()
|
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
|
||||||
|
"MSVC" OFF)
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS)
|
set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING
|
||||||
set(_GLFW_BUILD_DLL 1)
|
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
||||||
endif()
|
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS AND UNIX)
|
if (GLFW_LIBRARY_TYPE)
|
||||||
# On Unix-like systems, shared libraries can use the soname system.
|
if (GLFW_LIBRARY_TYPE STREQUAL "SHARED")
|
||||||
set(GLFW_LIB_NAME glfw)
|
set(GLFW_BUILD_SHARED_LIBRARY TRUE)
|
||||||
|
else()
|
||||||
|
set(GLFW_BUILD_SHARED_LIBRARY FALSE)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
set(GLFW_LIB_NAME glfw3)
|
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_VULKAN_STATIC)
|
|
||||||
set(_GLFW_VULKAN_STATIC 1)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
find_package(Vulkan)
|
|
||||||
|
|
||||||
if (GLFW_BUILD_DOCS)
|
#--------------------------------------------------------------------
|
||||||
set(DOXYGEN_SKIP_DOT TRUE)
|
# Report backend selection
|
||||||
find_package(Doxygen)
|
#--------------------------------------------------------------------
|
||||||
|
if (GLFW_BUILD_WIN32)
|
||||||
|
message(STATUS "Including Win32 support")
|
||||||
|
endif()
|
||||||
|
if (GLFW_BUILD_COCOA)
|
||||||
|
message(STATUS "Including Cocoa support")
|
||||||
|
endif()
|
||||||
|
if (GLFW_BUILD_WAYLAND)
|
||||||
|
message(STATUS "Including Wayland support")
|
||||||
|
endif()
|
||||||
|
if (GLFW_BUILD_X11)
|
||||||
|
message(STATUS "Including X11 support")
|
||||||
endif()
|
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 AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
||||||
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||||
foreach (flag CMAKE_C_FLAGS
|
|
||||||
CMAKE_C_FLAGS_DEBUG
|
|
||||||
CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL
|
|
||||||
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
||||||
|
|
||||||
if (${flag} MATCHES "/MD")
|
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
|
||||||
endif()
|
|
||||||
if (${flag} MATCHES "/MDd")
|
|
||||||
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MINGW)
|
|
||||||
# Workaround for legacy MinGW not providing XInput and DirectInput
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
|
|
||||||
check_include_file(dinput.h DINPUT_H_FOUND)
|
|
||||||
check_include_file(xinput.h XINPUT_H_FOUND)
|
|
||||||
if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/mingw")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Enable link-time exploit mitigation features enabled by default on MSVC
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
|
|
||||||
# Compatibility with data execution prevention (DEP)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
|
||||||
if (_GLFW_HAS_DEP)
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
|
||||||
if (_GLFW_HAS_ASLR)
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compatibility with 64-bit address space layout randomization (ASLR)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
|
||||||
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
|
||||||
if (_GLFW_HAS_64ASLR)
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Detect and select backend APIs
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (WIN32)
|
|
||||||
set(_GLFW_WIN32 1)
|
|
||||||
message(STATUS "Using Win32 for window creation")
|
|
||||||
elseif (APPLE)
|
|
||||||
set(_GLFW_COCOA 1)
|
|
||||||
message(STATUS "Using Cocoa for window creation")
|
|
||||||
elseif (UNIX)
|
|
||||||
if (GLFW_USE_WAYLAND)
|
|
||||||
set(_GLFW_WAYLAND 1)
|
|
||||||
message(STATUS "Using Wayland for window creation")
|
|
||||||
elseif (GLFW_USE_MIR)
|
|
||||||
set(_GLFW_MIR 1)
|
|
||||||
message(STATUS "Using Mir for window creation")
|
|
||||||
else()
|
|
||||||
set(_GLFW_X11 1)
|
|
||||||
message(STATUS "Using X11 for window creation")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "No supported platform was detected")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Add Vulkan static library if requested
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (GLFW_VULKAN_STATIC)
|
|
||||||
if (VULKAN_FOUND AND VULKAN_STATIC_LIBRARY)
|
|
||||||
list(APPEND glfw_LIBRARIES ${VULKAN_STATIC_LIBRARY})
|
|
||||||
else()
|
|
||||||
if (BUILD_SHARED_LIBS OR GLFW_BUILD_EXAMPLES OR GLFW_BUILD_TESTS)
|
|
||||||
message(FATAL_ERROR "Vulkan loader static library not found")
|
|
||||||
else()
|
|
||||||
message(WARNING "Vulkan loader static library not found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Find and add Unix math and time libraries
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (UNIX AND NOT APPLE)
|
|
||||||
find_library(RT_LIBRARY rt)
|
|
||||||
mark_as_advanced(RT_LIBRARY)
|
|
||||||
if (RT_LIBRARY)
|
|
||||||
list(APPEND glfw_LIBRARIES "${RT_LIBRARY}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lrt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(MATH_LIBRARY m)
|
|
||||||
mark_as_advanced(MATH_LIBRARY)
|
|
||||||
if (MATH_LIBRARY)
|
|
||||||
list(APPEND glfw_LIBRARIES "${MATH_LIBRARY}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lm")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_DL_LIBS)
|
|
||||||
list(APPEND glfw_LIBRARIES "${CMAKE_DL_LIBS}")
|
|
||||||
list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Use Win32 for window creation
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (_GLFW_WIN32)
|
|
||||||
|
|
||||||
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
|
||||||
|
|
||||||
if (GLFW_USE_HYBRID_HPG)
|
|
||||||
set(_GLFW_USE_HYBRID_HPG 1)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Use X11 for window creation
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (_GLFW_X11)
|
|
||||||
|
|
||||||
find_package(X11 REQUIRED)
|
|
||||||
|
|
||||||
list(APPEND glfw_PKG_DEPS "x11")
|
|
||||||
|
|
||||||
# Set up library and include paths
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
||||||
|
|
||||||
# Check for XRandR (modern resolution switching and gamma control)
|
|
||||||
if (NOT X11_Xrandr_FOUND)
|
|
||||||
message(FATAL_ERROR "The RandR library and headers were not found")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${X11_Xrandr_INCLUDE_PATH}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${X11_Xrandr_LIB}")
|
|
||||||
list(APPEND glfw_PKG_DEPS "xrandr")
|
|
||||||
|
|
||||||
# Check for Xinerama (legacy multi-monitor support)
|
|
||||||
if (NOT X11_Xinerama_FOUND)
|
|
||||||
message(FATAL_ERROR "The Xinerama library and headers were not found")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${X11_Xinerama_INCLUDE_PATH}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${X11_Xinerama_LIB}")
|
|
||||||
list(APPEND glfw_PKG_DEPS "xinerama")
|
|
||||||
|
|
||||||
# Check for Xf86VidMode (fallback gamma control)
|
|
||||||
if (X11_xf86vmode_FOUND)
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${X11_xf86vmode_INCLUDE_PATH}")
|
|
||||||
list(APPEND glfw_PKG_DEPS "xxf86vm")
|
|
||||||
|
|
||||||
if (X11_Xxf86vm_LIB)
|
|
||||||
list(APPEND glfw_LIBRARIES "${X11_Xxf86vm_LIB}")
|
|
||||||
else()
|
|
||||||
# Backwards compatibility (see CMake bug 0006976)
|
|
||||||
list(APPEND glfw_LIBRARIES Xxf86vm)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(_GLFW_HAS_XF86VM TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for Xkb (X keyboard extension)
|
|
||||||
if (NOT X11_Xkb_FOUND)
|
|
||||||
message(FATAL_ERROR "The X keyboard extension headers were not found")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIR "${X11_Xkb_INCLUDE_PATH}")
|
|
||||||
|
|
||||||
# Check for Xcursor
|
|
||||||
if (NOT X11_Xcursor_FOUND)
|
|
||||||
message(FATAL_ERROR "The Xcursor libraries and headers were not found")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIR "${X11_Xcursor_INCLUDE_PATH}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${X11_Xcursor_LIB}")
|
|
||||||
list(APPEND glfw_PKG_DEPS "xcursor")
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Use Wayland for window creation
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (_GLFW_WAYLAND)
|
|
||||||
find_package(ECM REQUIRED NO_MODULE)
|
|
||||||
list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
|
|
||||||
|
|
||||||
find_package(Wayland REQUIRED)
|
|
||||||
find_package(WaylandScanner REQUIRED)
|
|
||||||
find_package(WaylandProtocols 1.1 REQUIRED)
|
|
||||||
|
|
||||||
list(APPEND glfw_PKG_DEPS "wayland-egl")
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIR}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
||||||
|
|
||||||
find_package(XKBCommon REQUIRED)
|
|
||||||
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Use Mir for window creation
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (_GLFW_MIR)
|
|
||||||
find_package(Mir REQUIRED)
|
|
||||||
list(APPEND glfw_PKG_DEPS "mirclient")
|
|
||||||
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIR}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${MIR_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
||||||
|
|
||||||
find_package(XKBCommon REQUIRED)
|
|
||||||
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
|
||||||
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
|
||||||
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Use Cocoa for window creation and NSOpenGL for context creation
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
if (_GLFW_COCOA)
|
|
||||||
|
|
||||||
if (GLFW_USE_MENUBAR)
|
|
||||||
set(_GLFW_USE_MENUBAR 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_USE_CHDIR)
|
|
||||||
set(_GLFW_USE_CHDIR 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GLFW_USE_RETINA)
|
|
||||||
set(_GLFW_USE_RETINA 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set up library and include paths
|
|
||||||
find_library(COCOA_FRAMEWORK Cocoa)
|
|
||||||
find_library(IOKIT_FRAMEWORK IOKit)
|
|
||||||
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
|
||||||
find_library(CORE_VIDEO_FRAMEWORK CoreVideo)
|
|
||||||
mark_as_advanced(COCOA_FRAMEWORK
|
|
||||||
IOKIT_FRAMEWORK
|
|
||||||
CORE_FOUNDATION_FRAMEWORK
|
|
||||||
CORE_VIDEO_FRAMEWORK)
|
|
||||||
list(APPEND glfw_LIBRARIES "${COCOA_FRAMEWORK}"
|
|
||||||
"${IOKIT_FRAMEWORK}"
|
|
||||||
"${CORE_FOUNDATION_FRAMEWORK}"
|
|
||||||
"${CORE_VIDEO_FRAMEWORK}")
|
|
||||||
|
|
||||||
set(glfw_PKG_DEPS "")
|
|
||||||
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# Export GLFW library dependencies
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
foreach(arg ${glfw_PKG_DEPS})
|
|
||||||
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} ${arg}")
|
|
||||||
endforeach()
|
|
||||||
foreach(arg ${glfw_PKG_LIBS})
|
|
||||||
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} ${arg}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Create generated files
|
# Create generated files
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
set(GLFW_CONFIG_PATH "lib${LIB_SUFFIX}/cmake/glfw3")
|
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
|
||||||
|
|
||||||
configure_package_config_file(src/glfw3Config.cmake.in
|
configure_package_config_file(CMake/glfw3Config.cmake.in
|
||||||
src/glfw3Config.cmake
|
src/glfw3Config.cmake
|
||||||
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
||||||
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
||||||
|
|
||||||
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
||||||
VERSION ${GLFW_VERSION_FULL}
|
VERSION ${GLFW_VERSION}
|
||||||
COMPATIBILITY SameMajorVersion)
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
|
||||||
configure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)
|
|
||||||
|
|
||||||
configure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
# Add subdirectories
|
# Add subdirectories
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
@ -384,7 +104,7 @@ if (GLFW_BUILD_TESTS)
|
|||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
|
if (GLFW_BUILD_DOCS)
|
||||||
add_subdirectory(docs)
|
add_subdirectory(docs)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -393,7 +113,7 @@ endif()
|
|||||||
# The library is installed by src/CMakeLists.txt
|
# The library is installed by src/CMakeLists.txt
|
||||||
#--------------------------------------------------------------------
|
#--------------------------------------------------------------------
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
install(DIRECTORY include/GLFW DESTINATION include
|
install(DIRECTORY include/GLFW DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
|
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
|
||||||
|
|
||||||
install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
|
||||||
@ -404,16 +124,17 @@ if (GLFW_INSTALL)
|
|||||||
EXPORT_LINK_INTERFACE_LIBRARIES
|
EXPORT_LINK_INTERFACE_LIBRARIES
|
||||||
DESTINATION "${GLFW_CONFIG_PATH}")
|
DESTINATION "${GLFW_CONFIG_PATH}")
|
||||||
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
||||||
DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
|
|
||||||
# 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_uninstall.cmake.in
|
configure_file(CMake/cmake_uninstall.cmake.in
|
||||||
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
||||||
|
|
||||||
add_custom_target(uninstall
|
add_custom_target(uninstall
|
||||||
"${CMAKE_COMMAND}" -P
|
"${CMAKE_COMMAND}" -P
|
||||||
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
||||||
|
set_target_properties(uninstall PROPERTIES FOLDER "GLFW3")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
300
CONTRIBUTORS.md
Normal file
300
CONTRIBUTORS.md
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
# Acknowledgements
|
||||||
|
|
||||||
|
GLFW exists because people around the world donated their time and lent their
|
||||||
|
skills. This list only includes contributions to the main repository and
|
||||||
|
excludes other invaluable contributions like language bindings and text and
|
||||||
|
video tutorials.
|
||||||
|
|
||||||
|
- Bobyshev Alexander
|
||||||
|
- Laurent Aphecetche
|
||||||
|
- Matt Arsenault
|
||||||
|
- Takuro Ashie
|
||||||
|
- ashishgamedev
|
||||||
|
- David Avedissian
|
||||||
|
- Luca Bacci
|
||||||
|
- Keith Bauer
|
||||||
|
- John Bartholomew
|
||||||
|
- Coşku Baş
|
||||||
|
- Bayemite
|
||||||
|
- Niklas Behrens
|
||||||
|
- Andrew Belt
|
||||||
|
- Nevyn Bengtsson
|
||||||
|
- Niklas Bergström
|
||||||
|
- Denis Bernard
|
||||||
|
- BiBi
|
||||||
|
- Doug Binks
|
||||||
|
- blanco
|
||||||
|
- Waris Boonyasiriwat
|
||||||
|
- Kyle Brenneman
|
||||||
|
- Rok Breulj
|
||||||
|
- TheBrokenRail
|
||||||
|
- Kai Burjack
|
||||||
|
- Martin Capitanio
|
||||||
|
- Nicolas Caramelli
|
||||||
|
- David Carlier
|
||||||
|
- Arturo Castro
|
||||||
|
- Jose Luis Cercós Pita
|
||||||
|
- Chi-kwan Chan
|
||||||
|
- Victor Chernyakin
|
||||||
|
- TheChocolateOre
|
||||||
|
- Ali Chraghi
|
||||||
|
- Joseph Chua
|
||||||
|
- Ian Clarkson
|
||||||
|
- Michał Cichoń
|
||||||
|
- Lambert Clara
|
||||||
|
- Anna Clarke
|
||||||
|
- Josh Codd
|
||||||
|
- Yaron Cohen-Tal
|
||||||
|
- Omar Cornut
|
||||||
|
- Andrew Corrigan
|
||||||
|
- Bailey Cosier
|
||||||
|
- Noel Cower
|
||||||
|
- James Cowgill
|
||||||
|
- CuriouserThing
|
||||||
|
- Bill Currie
|
||||||
|
- Jason Daly
|
||||||
|
- danhambleton
|
||||||
|
- Jarrod Davis
|
||||||
|
- Olivier Delannoy
|
||||||
|
- Paul R. Deppe
|
||||||
|
- Michael Dickens
|
||||||
|
- Роман Донченко
|
||||||
|
- Mario Dorn
|
||||||
|
- Wolfgang Draxinger
|
||||||
|
- Jonathan Dummer
|
||||||
|
- Ralph Eastwood
|
||||||
|
- Fredrik Ehnbom
|
||||||
|
- Robin Eklind
|
||||||
|
- Jan Ekström
|
||||||
|
- Siavash Eliasi
|
||||||
|
- er-azh
|
||||||
|
- Ahmad Fatoum
|
||||||
|
- Nikita Fediuchin
|
||||||
|
- Felipe Ferreira
|
||||||
|
- Michael Fogleman
|
||||||
|
- forworldm
|
||||||
|
- Jason Francis
|
||||||
|
- Gerald Franz
|
||||||
|
- Mário Freitas
|
||||||
|
- GeO4d
|
||||||
|
- Marcus Geelnard
|
||||||
|
- Gegy
|
||||||
|
- ghuser404
|
||||||
|
- Charles Giessen
|
||||||
|
- Ryan C. Gordon
|
||||||
|
- Stephen Gowen
|
||||||
|
- Kovid Goyal
|
||||||
|
- Kevin Grandemange
|
||||||
|
- Eloi Marín Gratacós
|
||||||
|
- Grzesiek11
|
||||||
|
- Stefan Gustavson
|
||||||
|
- Andrew Gutekanst
|
||||||
|
- Stephen Gutekanst
|
||||||
|
- Jonathan Hale
|
||||||
|
- Daniel Hauser
|
||||||
|
- hdf89shfdfs
|
||||||
|
- Moritz Heinemann
|
||||||
|
- Sylvain Hellegouarch
|
||||||
|
- Björn Hempel
|
||||||
|
- Matthew Henry
|
||||||
|
- heromyth
|
||||||
|
- Lucas Hinderberger
|
||||||
|
- Paul Holden
|
||||||
|
- Hajime Hoshi
|
||||||
|
- Warren Hu
|
||||||
|
- Charles Huber
|
||||||
|
- Brent Huisman
|
||||||
|
- Florian Hülsmann
|
||||||
|
- illustris
|
||||||
|
- InKryption
|
||||||
|
- IntellectualKitty
|
||||||
|
- Aaron Jacobs
|
||||||
|
- JannikGM
|
||||||
|
- Erik S. V. Jansson
|
||||||
|
- jjYBdx4IL
|
||||||
|
- Peter Johnson
|
||||||
|
- 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
|
||||||
|
- Guillaume Lebrun
|
||||||
|
- Francis Lecavalier
|
||||||
|
- Jong Won Lee
|
||||||
|
- Robin Leffmann
|
||||||
|
- Glenn Lewis
|
||||||
|
- Shane Liesegang
|
||||||
|
- Anders Lindqvist
|
||||||
|
- Leon Linhart
|
||||||
|
- Marco Lizza
|
||||||
|
- lo-v-ol
|
||||||
|
- Eyal Lotem
|
||||||
|
- Aaron Loucks
|
||||||
|
- Ned Loynd
|
||||||
|
- Luflosi
|
||||||
|
- lukect
|
||||||
|
- Tristam MacDonald
|
||||||
|
- Jean-Luc Mackail
|
||||||
|
- Hans Mackowiak
|
||||||
|
- Ramiro Magno
|
||||||
|
- Дмитри Малышев
|
||||||
|
- Zbigniew Mandziejewicz
|
||||||
|
- Adam Marcus
|
||||||
|
- Célestin Marot
|
||||||
|
- Kyle McDonald
|
||||||
|
- David V. McKay
|
||||||
|
- David Medlock
|
||||||
|
- Bryce Mehring
|
||||||
|
- Jonathan Mercier
|
||||||
|
- Marcel Metz
|
||||||
|
- Liam Middlebrook
|
||||||
|
- mightgoyardstill
|
||||||
|
- Ave Milia
|
||||||
|
- Icyllis Milica
|
||||||
|
- Jonathan Miller
|
||||||
|
- Kenneth Miller
|
||||||
|
- Bruce Mitchener
|
||||||
|
- Jack Moffitt
|
||||||
|
- Ravi Mohan
|
||||||
|
- Jeff Molofee
|
||||||
|
- Alexander Monakov
|
||||||
|
- Pierre Morel
|
||||||
|
- Jon Morton
|
||||||
|
- Pierre Moulon
|
||||||
|
- Martins Mozeiko
|
||||||
|
- Pascal Muetschard
|
||||||
|
- James Murphy
|
||||||
|
- Julian Møller
|
||||||
|
- Julius Häger
|
||||||
|
- Nat!
|
||||||
|
- NateIsStalling
|
||||||
|
- ndogxj
|
||||||
|
- F. Nedelec
|
||||||
|
- n3rdopolis
|
||||||
|
- Kristian Nielsen
|
||||||
|
- Joel Niemelä
|
||||||
|
- Victor Nova
|
||||||
|
- Kamil Nowakowski
|
||||||
|
- onox
|
||||||
|
- Denis Ovod
|
||||||
|
- Ozzy
|
||||||
|
- Andri Pálsson
|
||||||
|
- luz paz
|
||||||
|
- Peoro
|
||||||
|
- Braden Pellett
|
||||||
|
- Christopher Pelloux
|
||||||
|
- Michael Pennington
|
||||||
|
- Arturo J. Pérez
|
||||||
|
- Vladimir Perminov
|
||||||
|
- Olivier Perret
|
||||||
|
- Anthony Pesch
|
||||||
|
- Orson Peters
|
||||||
|
- Emmanuel Gil Peyrot
|
||||||
|
- Cyril Pichard
|
||||||
|
- Pilzschaf
|
||||||
|
- Keith Pitt
|
||||||
|
- Stanislav Podgorskiy
|
||||||
|
- Konstantin Podsvirov
|
||||||
|
- Nathan Poirier
|
||||||
|
- Pokechu22
|
||||||
|
- Alexandre Pretyman
|
||||||
|
- Pablo Prietz
|
||||||
|
- przemekmirek
|
||||||
|
- pthom
|
||||||
|
- Martin Pulec
|
||||||
|
- Guillaume Racicot
|
||||||
|
- Juan Ramos
|
||||||
|
- Christian Rauch
|
||||||
|
- Philip Rideout
|
||||||
|
- Eddie Ringle
|
||||||
|
- Max Risuhin
|
||||||
|
- Joe Roback
|
||||||
|
- Jorge Rodriguez
|
||||||
|
- Jari Ronkainen
|
||||||
|
- Luca Rood
|
||||||
|
- Ed Ropple
|
||||||
|
- Aleksey Rybalkin
|
||||||
|
- Mikko Rytkönen
|
||||||
|
- Riku Salminen
|
||||||
|
- Yoshinori Sano
|
||||||
|
- Brandon Schaefer
|
||||||
|
- Sebastian Schuberth
|
||||||
|
- Scr3amer
|
||||||
|
- Jan Schuerkamp
|
||||||
|
- Christian Sdunek
|
||||||
|
- Matt Sealey
|
||||||
|
- Steve Sexton
|
||||||
|
- Arkady Shapkin
|
||||||
|
- Mingjie Shen
|
||||||
|
- Ali Sherief
|
||||||
|
- Yoshiki Shibukawa
|
||||||
|
- Dmitri Shuralyov
|
||||||
|
- Joao da Silva
|
||||||
|
- Daniel Sieger
|
||||||
|
- Daljit Singh
|
||||||
|
- Michael Skec
|
||||||
|
- Daniel Skorupski
|
||||||
|
- Slemmie
|
||||||
|
- Anthony Smith
|
||||||
|
- Bradley Smith
|
||||||
|
- Cliff Smolinsky
|
||||||
|
- Patrick Snape
|
||||||
|
- Erlend Sogge Heggen
|
||||||
|
- Olivier Sohn
|
||||||
|
- Julian Squires
|
||||||
|
- Johannes Stein
|
||||||
|
- Pontus Stenetorp
|
||||||
|
- Michael Stocker
|
||||||
|
- Justin Stoecker
|
||||||
|
- Elviss Strazdins
|
||||||
|
- Paul Sultana
|
||||||
|
- Nathan Sweet
|
||||||
|
- TTK-Bandit
|
||||||
|
- Nuno Teixeira
|
||||||
|
- Jared Tiala
|
||||||
|
- Sergey Tikhomirov
|
||||||
|
- Arthur Tombs
|
||||||
|
- TronicLabs
|
||||||
|
- Ioannis Tsakpinis
|
||||||
|
- Samuli Tuomola
|
||||||
|
- Matthew Turner
|
||||||
|
- urraka
|
||||||
|
- Elias Vanderstuyft
|
||||||
|
- Stef Velzel
|
||||||
|
- Jari Vetoniemi
|
||||||
|
- Ricardo Vieira
|
||||||
|
- Nicholas Vitovitch
|
||||||
|
- Vladimír Vondruš
|
||||||
|
- Simon Voordouw
|
||||||
|
- Corentin Wallez
|
||||||
|
- Torsten Walluhn
|
||||||
|
- Patrick Walton
|
||||||
|
- Jim Wang
|
||||||
|
- Xo Wang
|
||||||
|
- Andre Weissflog
|
||||||
|
- Jay Weisskopf
|
||||||
|
- Frank Wille
|
||||||
|
- Andy Williams
|
||||||
|
- Joel Winarske
|
||||||
|
- Richard A. Wilkes
|
||||||
|
- Tatsuya Yatagawa
|
||||||
|
- Ryogo Yoshimura
|
||||||
|
- Lukas Zanner
|
||||||
|
- Andrey Zholos
|
||||||
|
- Aihui Zhu
|
||||||
|
- Santi Zupancic
|
||||||
|
- Jonas Ådahl
|
||||||
|
- Lasse Öörni
|
||||||
|
- Leonard König
|
||||||
|
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
||||||
|
reports, patches, feedback, testing and encouragement
|
||||||
|
|
@ -1,5 +1,6 @@
|
|||||||
Copyright (c) 2002-2006 Marcus Geelnard
|
Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
|
||||||
|
Copyright (c) 2006-2019 Camilla Löwy
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
281
README.md
281
README.md
@ -1,8 +1,7 @@
|
|||||||
# 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)
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
@ -10,64 +9,89 @@ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan
|
|||||||
application development. It provides a simple, platform-independent API for
|
application development. It provides a simple, platform-independent API for
|
||||||
creating windows, contexts and surfaces, reading input, handling events, etc.
|
creating windows, contexts and surfaces, reading input, handling events, etc.
|
||||||
|
|
||||||
|
GLFW natively supports Windows, macOS and Linux and other Unix-like systems. On
|
||||||
|
Linux both Wayland and X11 are supported.
|
||||||
|
|
||||||
GLFW is licensed under the [zlib/libpng
|
GLFW is licensed under the [zlib/libpng
|
||||||
license](https://opensource.org/licenses/Zlib).
|
license](https://www.glfw.org/license.html).
|
||||||
|
|
||||||
This is version 3.2.1, which adds support for statically linking the Vulkan
|
You can [download](https://www.glfw.org/download.html) the latest stable release
|
||||||
loader and fixes for a number of bugs that together affect all supported
|
as source or Windows binaries. Each release starting with 3.0 also has
|
||||||
platforms.
|
a corresponding [annotated tag](https://github.com/glfw/glfw/releases) with
|
||||||
|
source and binary archives.
|
||||||
|
|
||||||
See the [downloads](http://www.glfw.org/download.html) page for details and
|
The [documentation](https://www.glfw.org/docs/latest/) is available online and is
|
||||||
files, or fetch the `latest` branch, which always points to the latest stable
|
included in all source and binary archives. See the [release
|
||||||
release. Each release starting with 3.0 also has a corresponding [annotated
|
notes](https://www.glfw.org/docs/latest/news.html) for new features, caveats and
|
||||||
tag](https://github.com/glfw/glfw/releases) with source and binary archives.
|
deprecations in the latest release. For more details see the [version
|
||||||
|
history](https://www.glfw.org/changelog.html).
|
||||||
|
|
||||||
|
The `master` branch is the stable integration branch and _should_ always compile
|
||||||
|
and run on all supported platforms, although details of newly added features may
|
||||||
|
change until they have been included in a release. New features and many bug
|
||||||
|
fixes live in [other branches](https://github.com/glfw/glfw/branches/all) until
|
||||||
|
they are stable enough to merge.
|
||||||
|
|
||||||
If you are new to GLFW, you may find the
|
If you are new to GLFW, you may find the
|
||||||
[tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW
|
[tutorial](https://www.glfw.org/docs/latest/quick.html) for GLFW 3 useful. If
|
||||||
3 useful. If you have used GLFW 2 in the past, there is a
|
you have used GLFW 2 in the past, there is a [transition
|
||||||
[transition guide](http://www.glfw.org/docs/latest/moving.html) for moving to
|
guide](https://www.glfw.org/docs/latest/moving.html) for moving to the GLFW
|
||||||
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
|
||||||
|
|
||||||
GLFW itself requires only the headers and libraries for your window system. It
|
GLFW is written primarily in C99, with parts of macOS support being written in
|
||||||
does not need the headers for any context creation API (WGL, GLX, EGL, NSGL) or
|
Objective-C. GLFW itself requires only the headers and libraries for your OS
|
||||||
rendering API (OpenGL, OpenGL ES, Vulkan) to enable support for them.
|
and window system. It does not need any additional headers for context creation
|
||||||
|
APIs (WGL, GLX, EGL, NSGL, OSMesa) or rendering APIs (OpenGL, OpenGL ES, Vulkan)
|
||||||
|
to enable support for them.
|
||||||
|
|
||||||
GLFW supports compilation on Windows with Visual C++ 2010 and later, MinGW and
|
GLFW supports compilation on Windows with Visual C++ 2013 and later, MinGW and
|
||||||
MinGW-w64, on OS X with Clang and on Linux and other Unix-like systems with GCC
|
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 also [pre-compiled Windows
|
There are [pre-compiled binaries](https://www.glfw.org/download.html) available
|
||||||
binaries](http://www.glfw.org/download.html) available for all compilers
|
for all supported compilers on Windows and macOS.
|
||||||
supported on that platform.
|
|
||||||
|
|
||||||
See the [compilation guide](http://www.glfw.org/docs/latest/compile.html) in the
|
See the [compilation guide](https://www.glfw.org/docs/latest/compile.html) for
|
||||||
documentation for more information.
|
more information about how to compile GLFW yourself.
|
||||||
|
|
||||||
|
|
||||||
## Using GLFW
|
## Using GLFW
|
||||||
|
|
||||||
See the [building application guide](http://www.glfw.org/docs/latest/build.html)
|
See the [documentation](https://www.glfw.org/docs/latest/) for tutorials, guides
|
||||||
guide in the documentation for more information.
|
and the API reference.
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing to GLFW
|
||||||
|
|
||||||
|
See the [contribution
|
||||||
|
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
|
||||||
## System requirements
|
## System requirements
|
||||||
|
|
||||||
GLFW supports Windows XP and later, OS X 10.7 Lion and later, and Linux and
|
GLFW supports Windows XP and later and macOS 10.11 and later. Linux and other
|
||||||
other Unix-like systems with the X Window System. Experimental implementations
|
Unix-like systems running the X Window System are supported even without
|
||||||
for the Wayland protocol and the Mir display server are available but not yet
|
a desktop environment or modern extensions, although some features require
|
||||||
officially supported.
|
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 depends only on the headers and libraries for your window system.
|
GLFW itself needs only CMake 3.16 or later and the headers and libraries for your
|
||||||
|
OS and window system.
|
||||||
|
|
||||||
The examples and test programs depend on a number of tiny libraries. These are
|
The examples and test programs depend on a number of tiny libraries. These are
|
||||||
located in the `deps/` directory.
|
located in the `deps/` directory.
|
||||||
@ -76,199 +100,54 @@ located in the `deps/` directory.
|
|||||||
with command-line options
|
with command-line options
|
||||||
- [TinyCThread](https://github.com/tinycthread/tinycthread) for threaded
|
- [TinyCThread](https://github.com/tinycthread/tinycthread) for threaded
|
||||||
examples
|
examples
|
||||||
- An OpenGL 3.2 core loader generated by
|
- [glad2](https://github.com/Dav1dde/glad) for loading OpenGL and Vulkan
|
||||||
[glad](https://github.com/Dav1dde/glad) for examples using modern OpenGL
|
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
|
||||||
- [Vulkan headers](https://www.khronos.org/registry/vulkan/) for Vulkan tests
|
- [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
|
||||||
|
|
||||||
The Vulkan example additionally requires the Vulkan SDK to be installed, or it
|
The documentation is generated with [Doxygen](https://doxygen.org/) if CMake can
|
||||||
will not be included in the build.
|
find that tool.
|
||||||
|
|
||||||
The documentation is generated with [Doxygen](http://doxygen.org/). If CMake
|
|
||||||
does not find Doxygen, the documentation will not be generated when you build.
|
|
||||||
|
|
||||||
|
|
||||||
## Reporting bugs
|
## Reporting bugs
|
||||||
|
|
||||||
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
|
||||||
guide](https://github.com/glfw/glfw/blob/master/.github/CONTRIBUTING.md) for
|
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
||||||
information on what to include when reporting a bug.
|
information on what to include when reporting a bug.
|
||||||
|
|
||||||
|
|
||||||
## Changelog
|
## Changelog since 3.4
|
||||||
|
|
||||||
- Added on-demand loading of Vulkan and context creation API libraries
|
- Added `GLFW_UNLIMITED_MOUSE_BUTTONS` input mode that allows mouse buttons beyond
|
||||||
- Added `_GLFW_VULKAN_STATIC` build macro to make the library use the Vulkan
|
the limit of the mouse button tokens to be reported (#2423)
|
||||||
loader linked statically into the application (#820)
|
- Updated minimum CMake version to 3.16 (#2541)
|
||||||
- Bugfix: Single compilation unit builds failed due to naming conflicts (#783)
|
- [Cocoa] Added `QuartzCore` framework as link-time dependency
|
||||||
- Bugfix: The range checks for `glfwSetCursorPos` used the wrong minimum (#773)
|
- [Cocoa] Removed support for OS X 10.10 Yosemite and earlier (#2506)
|
||||||
- Bugfix: Defining `GLFW_INCLUDE_VULKAN` when compiling the library did not
|
- [Wayland] Bugfix: The fractional scaling related objects were not destroyed
|
||||||
fail with the expected error message (#823)
|
- [Wayland] Bugfix: `glfwInit` would segfault on compositor with no seat (#2517)
|
||||||
- Bugfix: Inherited value of `CMAKE_MODULE_PATH` was clobbered (#822)
|
- [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault
|
||||||
- [Win32] Bugfix: `glfwSetClipboardString` created an unnecessary intermediate
|
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
|
||||||
copy of the string
|
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
||||||
- [Win32] Bugfix: Examples failed to build on Visual C++ 2010 due to C99 in
|
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
||||||
`linmath.h` (#785)
|
- [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to
|
||||||
- [Win32] Bugfix: The first shown window ignored the `GLFW_MAXIMIZED` hint
|
`GLFW_NATIVE_CONTEXT_API` (#2518)
|
||||||
when the process was provided a `STARTUPINFO` (#780)
|
|
||||||
- [Cocoa] Bugfix: Event processing would segfault on some machines due to
|
|
||||||
a previous distributed notification listener not being fully
|
|
||||||
removed (#817,#826)
|
|
||||||
- [Cocoa] Bugfix: Some include statements were duplicated (#838)
|
|
||||||
- [X11] Bugfix: Window size limits were ignored if the minimum or maximum size
|
|
||||||
was set to `GLFW_DONT_CARE` (#805)
|
|
||||||
- [X11] Bugfix: Input focus was set before window was visible, causing
|
|
||||||
`BadMatch` on some non-reparenting WMs (#789,#798)
|
|
||||||
- [X11] Bugfix: `glfwGetWindowPos` and `glfwSetWindowPos` operated on the
|
|
||||||
window frame instead of the client area (#800)
|
|
||||||
- [WGL] Added reporting of errors from `WGL_ARB_create_context` extension
|
|
||||||
- [GLX] Bugfix: Dynamically loaded entry points were not verified
|
|
||||||
- [EGL] Added `lib` prefix matching between EGL and OpenGL ES library binaries
|
|
||||||
- [EGL] Bugfix: Dynamically loaded entry points were not verified
|
|
||||||
|
|
||||||
|
|
||||||
## 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](http://discourse.glfw.org/), and the `#glfw` IRC channel on
|
[forum](https://discourse.glfw.org/).
|
||||||
[Freenode](http://freenode.net/).
|
|
||||||
|
|
||||||
If you have a bug to report, a patch to submit or a feature you'd like to
|
If you have a bug to report, a patch to submit or a feature you'd like to
|
||||||
request, please file it in the
|
request, please file it in the
|
||||||
[issue tracker](https://github.com/glfw/glfw/issues) on GitHub.
|
[issue tracker](https://github.com/glfw/glfw/issues) on GitHub.
|
||||||
|
|
||||||
Finally, if you're interested in helping out with the development of GLFW or
|
Finally, if you're interested in helping out with the development of GLFW or
|
||||||
porting it to your favorite platform, join us on the forum, GitHub or IRC.
|
porting it to your favorite platform, join us on the forum or GitHub.
|
||||||
|
|
||||||
|
|
||||||
## Acknowledgements
|
|
||||||
|
|
||||||
GLFW exists because people around the world donated their time and lent their
|
|
||||||
skills.
|
|
||||||
|
|
||||||
- Bobyshev Alexander
|
|
||||||
- artblanc
|
|
||||||
- arturo
|
|
||||||
- Matt Arsenault
|
|
||||||
- Keith Bauer
|
|
||||||
- John Bartholomew
|
|
||||||
- Niklas Behrens
|
|
||||||
- Niklas Bergström
|
|
||||||
- Doug Binks
|
|
||||||
- blanco
|
|
||||||
- Martin Capitanio
|
|
||||||
- Chi-kwan Chan
|
|
||||||
- Lambert Clara
|
|
||||||
- Andrew Corrigan
|
|
||||||
- Noel Cower
|
|
||||||
- Jarrod Davis
|
|
||||||
- Olivier Delannoy
|
|
||||||
- Paul R. Deppe
|
|
||||||
- Michael Dickens
|
|
||||||
- Роман Донченко
|
|
||||||
- Mario Dorn
|
|
||||||
- Jonathan Dummer
|
|
||||||
- Ralph Eastwood
|
|
||||||
- Siavash Eliasi
|
|
||||||
- Michael Fogleman
|
|
||||||
- Gerald Franz
|
|
||||||
- GeO4d
|
|
||||||
- Marcus Geelnard
|
|
||||||
- Eloi Marín Gratacós
|
|
||||||
- Stefan Gustavson
|
|
||||||
- Sylvain Hellegouarch
|
|
||||||
- Matthew Henry
|
|
||||||
- heromyth
|
|
||||||
- Lucas Hinderberger
|
|
||||||
- Paul Holden
|
|
||||||
- Warren Hu
|
|
||||||
- IntellectualKitty
|
|
||||||
- Aaron Jacobs
|
|
||||||
- Erik S. V. Jansson
|
|
||||||
- Toni Jovanoski
|
|
||||||
- Arseny Kapoulkine
|
|
||||||
- Osman Keskin
|
|
||||||
- Cameron King
|
|
||||||
- Peter Knut
|
|
||||||
- Christoph Kubisch
|
|
||||||
- Eric Larson
|
|
||||||
- Robin Leffmann
|
|
||||||
- Glenn Lewis
|
|
||||||
- Shane Liesegang
|
|
||||||
- Eyal Lotem
|
|
||||||
- Дмитри Малышев
|
|
||||||
- Martins Mozeiko
|
|
||||||
- Tristam MacDonald
|
|
||||||
- Hans Mackowiak
|
|
||||||
- Zbigniew Mandziejewicz
|
|
||||||
- Kyle McDonald
|
|
||||||
- David Medlock
|
|
||||||
- Bryce Mehring
|
|
||||||
- Jonathan Mercier
|
|
||||||
- Marcel Metz
|
|
||||||
- Jonathan Miller
|
|
||||||
- Kenneth Miller
|
|
||||||
- Bruce Mitchener
|
|
||||||
- Jack Moffitt
|
|
||||||
- Jeff Molofee
|
|
||||||
- Jon Morton
|
|
||||||
- Pierre Moulon
|
|
||||||
- Julian Møller
|
|
||||||
- Kamil Nowakowski
|
|
||||||
- Ozzy
|
|
||||||
- Andri Pálsson
|
|
||||||
- Peoro
|
|
||||||
- Braden Pellett
|
|
||||||
- Arturo J. Pérez
|
|
||||||
- Orson Peters
|
|
||||||
- Emmanuel Gil Peyrot
|
|
||||||
- Cyril Pichard
|
|
||||||
- Pieroman
|
|
||||||
- Philip Rideout
|
|
||||||
- Jorge Rodriguez
|
|
||||||
- Ed Ropple
|
|
||||||
- Aleksey Rybalkin
|
|
||||||
- Riku Salminen
|
|
||||||
- Brandon Schaefer
|
|
||||||
- Sebastian Schuberth
|
|
||||||
- Matt Sealey
|
|
||||||
- SephiRok
|
|
||||||
- Steve Sexton
|
|
||||||
- Systemcluster
|
|
||||||
- Yoshiki Shibukawa
|
|
||||||
- Dmitri Shuralyov
|
|
||||||
- Daniel Skorupski
|
|
||||||
- Bradley Smith
|
|
||||||
- Patrick Snape
|
|
||||||
- Julian Squires
|
|
||||||
- Johannes Stein
|
|
||||||
- Justin Stoecker
|
|
||||||
- Elviss Strazdins
|
|
||||||
- Nathan Sweet
|
|
||||||
- TTK-Bandit
|
|
||||||
- Sergey Tikhomirov
|
|
||||||
- Arthur Tombs
|
|
||||||
- Ioannis Tsakpinis
|
|
||||||
- Samuli Tuomola
|
|
||||||
- urraka
|
|
||||||
- Jari Vetoniemi
|
|
||||||
- Ricardo Vieira
|
|
||||||
- Nicholas Vitovitch
|
|
||||||
- Simon Voordouw
|
|
||||||
- Torsten Walluhn
|
|
||||||
- Patrick Walton
|
|
||||||
- Xo Wang
|
|
||||||
- Jay Weisskopf
|
|
||||||
- Frank Wille
|
|
||||||
- yuriks
|
|
||||||
- Santi Zupancic
|
|
||||||
- Jonas Ådahl
|
|
||||||
- Lasse Öörni
|
|
||||||
- All the unmentioned and anonymous contributors in the GLFW community, for bug
|
|
||||||
reports, patches, feedback, testing and encouragement
|
|
||||||
|
|
||||||
|
282
deps/KHR/khrplatform.h
vendored
282
deps/KHR/khrplatform.h
vendored
@ -1,282 +0,0 @@
|
|||||||
#ifndef __khrplatform_h_
|
|
||||||
#define __khrplatform_h_
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Copyright (c) 2008-2009 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
** copy of this software and/or associated documentation files (the
|
|
||||||
** "Materials"), to deal in the Materials without restriction, including
|
|
||||||
** without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
|
||||||
** permit persons to whom the Materials are furnished to do so, subject to
|
|
||||||
** the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included
|
|
||||||
** in all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Khronos platform-specific types and definitions.
|
|
||||||
*
|
|
||||||
* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $
|
|
||||||
*
|
|
||||||
* Adopters may modify this file to suit their platform. Adopters are
|
|
||||||
* encouraged to submit platform specific modifications to the Khronos
|
|
||||||
* group so that they can be included in future versions of this file.
|
|
||||||
* Please submit changes by sending them to the public Khronos Bugzilla
|
|
||||||
* (http://khronos.org/bugzilla) by filing a bug against product
|
|
||||||
* "Khronos (general)" component "Registry".
|
|
||||||
*
|
|
||||||
* A predefined template which fills in some of the bug fields can be
|
|
||||||
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
|
|
||||||
* must create a Bugzilla login first.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* See the Implementer's Guidelines for information about where this file
|
|
||||||
* should be located on your system and for more details of its use:
|
|
||||||
* http://www.khronos.org/registry/implementers_guide.pdf
|
|
||||||
*
|
|
||||||
* This file should be included as
|
|
||||||
* #include <KHR/khrplatform.h>
|
|
||||||
* by Khronos client API header files that use its types and defines.
|
|
||||||
*
|
|
||||||
* The types in khrplatform.h should only be used to define API-specific types.
|
|
||||||
*
|
|
||||||
* Types defined in khrplatform.h:
|
|
||||||
* khronos_int8_t signed 8 bit
|
|
||||||
* khronos_uint8_t unsigned 8 bit
|
|
||||||
* khronos_int16_t signed 16 bit
|
|
||||||
* khronos_uint16_t unsigned 16 bit
|
|
||||||
* khronos_int32_t signed 32 bit
|
|
||||||
* khronos_uint32_t unsigned 32 bit
|
|
||||||
* khronos_int64_t signed 64 bit
|
|
||||||
* khronos_uint64_t unsigned 64 bit
|
|
||||||
* khronos_intptr_t signed same number of bits as a pointer
|
|
||||||
* khronos_uintptr_t unsigned same number of bits as a pointer
|
|
||||||
* khronos_ssize_t signed size
|
|
||||||
* khronos_usize_t unsigned size
|
|
||||||
* khronos_float_t signed 32 bit floating point
|
|
||||||
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
|
||||||
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
|
||||||
* nanoseconds
|
|
||||||
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
|
||||||
* khronos_boolean_enum_t enumerated boolean type. This should
|
|
||||||
* only be used as a base type when a client API's boolean type is
|
|
||||||
* an enum. Client APIs which use an integer or other type for
|
|
||||||
* booleans cannot use this as the base type for their boolean.
|
|
||||||
*
|
|
||||||
* Tokens defined in khrplatform.h:
|
|
||||||
*
|
|
||||||
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
|
||||||
*
|
|
||||||
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
|
||||||
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
|
||||||
*
|
|
||||||
* Calling convention macros defined in this file:
|
|
||||||
* KHRONOS_APICALL
|
|
||||||
* KHRONOS_APIENTRY
|
|
||||||
* KHRONOS_APIATTRIBUTES
|
|
||||||
*
|
|
||||||
* These may be used in function prototypes as:
|
|
||||||
*
|
|
||||||
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
|
||||||
* int arg1,
|
|
||||||
* int arg2) KHRONOS_APIATTRIBUTES;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
|
||||||
* Definition of KHRONOS_APICALL
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
* This precedes the return type of the function in the function prototype.
|
|
||||||
*/
|
|
||||||
#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
|
||||||
# define KHRONOS_APICALL __declspec(dllimport)
|
|
||||||
#elif defined (__SYMBIAN32__)
|
|
||||||
# define KHRONOS_APICALL IMPORT_C
|
|
||||||
#else
|
|
||||||
# define KHRONOS_APICALL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
|
||||||
* Definition of KHRONOS_APIENTRY
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
* This follows the return type of the function and precedes the function
|
|
||||||
* name in the function prototype.
|
|
||||||
*/
|
|
||||||
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
|
||||||
/* Win32 but not WinCE */
|
|
||||||
# define KHRONOS_APIENTRY __stdcall
|
|
||||||
#else
|
|
||||||
# define KHRONOS_APIENTRY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
|
||||||
* Definition of KHRONOS_APIATTRIBUTES
|
|
||||||
*-------------------------------------------------------------------------
|
|
||||||
* This follows the closing parenthesis of the function prototype arguments.
|
|
||||||
*/
|
|
||||||
#if defined (__ARMCC_2__)
|
|
||||||
#define KHRONOS_APIATTRIBUTES __softfp
|
|
||||||
#else
|
|
||||||
#define KHRONOS_APIATTRIBUTES
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
|
||||||
* basic type definitions
|
|
||||||
*-----------------------------------------------------------------------*/
|
|
||||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Using <stdint.h>
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
|
||||||
typedef int32_t khronos_int32_t;
|
|
||||||
typedef uint32_t khronos_uint32_t;
|
|
||||||
typedef int64_t khronos_int64_t;
|
|
||||||
typedef uint64_t khronos_uint64_t;
|
|
||||||
#define KHRONOS_SUPPORT_INT64 1
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 1
|
|
||||||
|
|
||||||
#elif defined(__VMS ) || defined(__sgi)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Using <inttypes.h>
|
|
||||||
*/
|
|
||||||
#include <inttypes.h>
|
|
||||||
typedef int32_t khronos_int32_t;
|
|
||||||
typedef uint32_t khronos_uint32_t;
|
|
||||||
typedef int64_t khronos_int64_t;
|
|
||||||
typedef uint64_t khronos_uint64_t;
|
|
||||||
#define KHRONOS_SUPPORT_INT64 1
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 1
|
|
||||||
|
|
||||||
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Win32
|
|
||||||
*/
|
|
||||||
typedef __int32 khronos_int32_t;
|
|
||||||
typedef unsigned __int32 khronos_uint32_t;
|
|
||||||
typedef __int64 khronos_int64_t;
|
|
||||||
typedef unsigned __int64 khronos_uint64_t;
|
|
||||||
#define KHRONOS_SUPPORT_INT64 1
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 1
|
|
||||||
|
|
||||||
#elif defined(__sun__) || defined(__digital__)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sun or Digital
|
|
||||||
*/
|
|
||||||
typedef int khronos_int32_t;
|
|
||||||
typedef unsigned int khronos_uint32_t;
|
|
||||||
#if defined(__arch64__) || defined(_LP64)
|
|
||||||
typedef long int khronos_int64_t;
|
|
||||||
typedef unsigned long int khronos_uint64_t;
|
|
||||||
#else
|
|
||||||
typedef long long int khronos_int64_t;
|
|
||||||
typedef unsigned long long int khronos_uint64_t;
|
|
||||||
#endif /* __arch64__ */
|
|
||||||
#define KHRONOS_SUPPORT_INT64 1
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 1
|
|
||||||
|
|
||||||
#elif 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hypothetical platform with no float or int64 support
|
|
||||||
*/
|
|
||||||
typedef int khronos_int32_t;
|
|
||||||
typedef unsigned int khronos_uint32_t;
|
|
||||||
#define KHRONOS_SUPPORT_INT64 0
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 0
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generic fallback
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
|
||||||
typedef int32_t khronos_int32_t;
|
|
||||||
typedef uint32_t khronos_uint32_t;
|
|
||||||
typedef int64_t khronos_int64_t;
|
|
||||||
typedef uint64_t khronos_uint64_t;
|
|
||||||
#define KHRONOS_SUPPORT_INT64 1
|
|
||||||
#define KHRONOS_SUPPORT_FLOAT 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Types that are (so far) the same on all platforms
|
|
||||||
*/
|
|
||||||
typedef signed char khronos_int8_t;
|
|
||||||
typedef unsigned char khronos_uint8_t;
|
|
||||||
typedef signed short int khronos_int16_t;
|
|
||||||
typedef unsigned short int khronos_uint16_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Types that differ between LLP64 and LP64 architectures - in LLP64,
|
|
||||||
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
|
|
||||||
* to be the only LLP64 architecture in current use.
|
|
||||||
*/
|
|
||||||
#ifdef _WIN64
|
|
||||||
typedef signed long long int khronos_intptr_t;
|
|
||||||
typedef unsigned long long int khronos_uintptr_t;
|
|
||||||
typedef signed long long int khronos_ssize_t;
|
|
||||||
typedef unsigned long long int khronos_usize_t;
|
|
||||||
#else
|
|
||||||
typedef signed long int khronos_intptr_t;
|
|
||||||
typedef unsigned long int khronos_uintptr_t;
|
|
||||||
typedef signed long int khronos_ssize_t;
|
|
||||||
typedef unsigned long int khronos_usize_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if KHRONOS_SUPPORT_FLOAT
|
|
||||||
/*
|
|
||||||
* Float type
|
|
||||||
*/
|
|
||||||
typedef float khronos_float_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if KHRONOS_SUPPORT_INT64
|
|
||||||
/* Time types
|
|
||||||
*
|
|
||||||
* These types can be used to represent a time interval in nanoseconds or
|
|
||||||
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
|
||||||
* of nanoseconds since some arbitrary system event (e.g. since the last
|
|
||||||
* time the system booted). The Unadjusted System Time is an unsigned
|
|
||||||
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
|
||||||
* may be either signed or unsigned.
|
|
||||||
*/
|
|
||||||
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
|
||||||
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dummy value used to pad enum types to 32 bits.
|
|
||||||
*/
|
|
||||||
#ifndef KHRONOS_MAX_ENUM
|
|
||||||
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enumerated boolean type
|
|
||||||
*
|
|
||||||
* Values other than zero should be considered to be true. Therefore
|
|
||||||
* comparisons should not be made against KHRONOS_TRUE.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
KHRONOS_FALSE = 0,
|
|
||||||
KHRONOS_TRUE = 1,
|
|
||||||
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
|
||||||
} khronos_boolean_enum_t;
|
|
||||||
|
|
||||||
#endif /* __khrplatform_h_ */
|
|
1555
deps/glad.c
vendored
1555
deps/glad.c
vendored
File diff suppressed because it is too large
Load Diff
5996
deps/glad/gl.h
vendored
Normal file
5996
deps/glad/gl.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3520
deps/glad/glad.h
vendored
3520
deps/glad/glad.h
vendored
File diff suppressed because it is too large
Load Diff
1805
deps/glad/gles2.h
vendored
Normal file
1805
deps/glad/gles2.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6330
deps/glad/vulkan.h
vendored
Normal file
6330
deps/glad/vulkan.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
286
deps/linmath.h
vendored
286
deps/linmath.h
vendored
@ -1,70 +1,96 @@
|
|||||||
#ifndef LINMATH_H
|
#ifndef LINMATH_H
|
||||||
#define LINMATH_H
|
#define LINMATH_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
/* 2021-03-21 Camilla Löwy <elmindreda@elmindreda.org>
|
||||||
#define inline __inline
|
* - Replaced double constants with float equivalents
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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]; \
|
||||||
static inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \
|
LINMATH_H_FUNC 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]; \
|
||||||
} \
|
} \
|
||||||
static inline void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \
|
LINMATH_H_FUNC 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]; \
|
||||||
} \
|
} \
|
||||||
static inline void vec##n##_scale(vec##n r, vec##n const v, float const s) \
|
LINMATH_H_FUNC 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; \
|
||||||
} \
|
} \
|
||||||
static inline float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
LINMATH_H_FUNC float vec##n##_mul_inner(vec##n const a, vec##n const b) \
|
||||||
{ \
|
{ \
|
||||||
float p = 0.; \
|
float p = 0.f; \
|
||||||
int i; \
|
int i; \
|
||||||
for(i=0; i<n; ++i) \
|
for(i=0; i<n; ++i) \
|
||||||
p += b[i]*a[i]; \
|
p += b[i]*a[i]; \
|
||||||
return p; \
|
return p; \
|
||||||
} \
|
} \
|
||||||
static inline float vec##n##_len(vec##n const v) \
|
LINMATH_H_FUNC float vec##n##_len(vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
return (float) sqrt(vec##n##_mul_inner(v,v)); \
|
return sqrtf(vec##n##_mul_inner(v,v)); \
|
||||||
} \
|
} \
|
||||||
static inline void vec##n##_norm(vec##n r, vec##n const v) \
|
LINMATH_H_FUNC void vec##n##_norm(vec##n r, vec##n const v) \
|
||||||
{ \
|
{ \
|
||||||
float k = 1.f / vec##n##_len(v); \
|
float k = 1.f / vec##n##_len(v); \
|
||||||
vec##n##_scale(r, v, k); \
|
vec##n##_scale(r, v, k); \
|
||||||
|
} \
|
||||||
|
LINMATH_H_FUNC void vec##n##_min(vec##n r, vec##n const a, vec##n const b) \
|
||||||
|
{ \
|
||||||
|
int i; \
|
||||||
|
for(i=0; i<n; ++i) \
|
||||||
|
r[i] = a[i]<b[i] ? a[i] : b[i]; \
|
||||||
|
} \
|
||||||
|
LINMATH_H_FUNC void vec##n##_max(vec##n r, vec##n const a, vec##n const b) \
|
||||||
|
{ \
|
||||||
|
int i; \
|
||||||
|
for(i=0; i<n; ++i) \
|
||||||
|
r[i] = a[i]>b[i] ? a[i] : b[i]; \
|
||||||
|
} \
|
||||||
|
LINMATH_H_FUNC void vec##n##_dup(vec##n r, vec##n const src) \
|
||||||
|
{ \
|
||||||
|
int i; \
|
||||||
|
for(i=0; i<n; ++i) \
|
||||||
|
r[i] = src[i]; \
|
||||||
}
|
}
|
||||||
|
|
||||||
LINMATH_H_DEFINE_VEC(2)
|
LINMATH_H_DEFINE_VEC(2)
|
||||||
LINMATH_H_DEFINE_VEC(3)
|
LINMATH_H_DEFINE_VEC(3)
|
||||||
LINMATH_H_DEFINE_VEC(4)
|
LINMATH_H_DEFINE_VEC(4)
|
||||||
|
|
||||||
static inline void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)
|
LINMATH_H_FUNC 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];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
LINMATH_H_FUNC void vec3_reflect(vec3 r, vec3 const v, vec3 const n)
|
||||||
{
|
{
|
||||||
float p = 2.f*vec3_mul_inner(v, n);
|
float p = 2.f * vec3_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
r[i] = v[i] - p*n[i];
|
r[i] = v[i] - p*n[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
LINMATH_H_FUNC void vec4_mul_cross(vec4 r, vec4 const a, vec4 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];
|
||||||
@ -72,7 +98,7 @@ static inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)
|
|||||||
r[3] = 1.f;
|
r[3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 const v, vec4 const n)
|
||||||
{
|
{
|
||||||
float p = 2.f*vec4_mul_inner(v, n);
|
float p = 2.f*vec4_mul_inner(v, n);
|
||||||
int i;
|
int i;
|
||||||
@ -81,68 +107,66 @@ static inline void vec4_reflect(vec4 r, vec4 v, vec4 n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef vec4 mat4x4[4];
|
typedef vec4 mat4x4[4];
|
||||||
static inline void mat4x4_identity(mat4x4 M)
|
LINMATH_H_FUNC 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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_dup(mat4x4 M, mat4x4 N)
|
LINMATH_H_FUNC void mat4x4_dup(mat4x4 M, mat4x4 const N)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i;
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
for(j=0; j<4; ++j)
|
vec4_dup(M[i], N[i]);
|
||||||
M[i][j] = N[i][j];
|
|
||||||
}
|
}
|
||||||
static inline void mat4x4_row(vec4 r, mat4x4 M, int i)
|
LINMATH_H_FUNC void mat4x4_row(vec4 r, mat4x4 const 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];
|
||||||
}
|
}
|
||||||
static inline void mat4x4_col(vec4 r, mat4x4 M, int i)
|
LINMATH_H_FUNC void mat4x4_col(vec4 r, mat4x4 const 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];
|
||||||
}
|
}
|
||||||
static inline void mat4x4_transpose(mat4x4 M, mat4x4 N)
|
LINMATH_H_FUNC void mat4x4_transpose(mat4x4 M, mat4x4 const N)
|
||||||
{
|
{
|
||||||
|
// Note: if M and N are the same, the user has to
|
||||||
|
// explicitly make a copy of M and set it to N.
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j)
|
for(j=0; j<4; ++j)
|
||||||
for(i=0; i<4; ++i)
|
for(i=0; i<4; ++i)
|
||||||
M[i][j] = N[j][i];
|
M[i][j] = N[j][i];
|
||||||
}
|
}
|
||||||
static inline void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)
|
LINMATH_H_FUNC void mat4x4_add(mat4x4 M, mat4x4 const a, mat4x4 const 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]);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)
|
LINMATH_H_FUNC void mat4x4_sub(mat4x4 M, mat4x4 const a, mat4x4 const 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]);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_scale(mat4x4 M, mat4x4 a, float k)
|
LINMATH_H_FUNC void mat4x4_scale(mat4x4 M, mat4x4 const 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);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)
|
LINMATH_H_FUNC void mat4x4_scale_aniso(mat4x4 M, mat4x4 const a, float x, float y, float z)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
vec4_scale(M[0], a[0], x);
|
vec4_scale(M[0], a[0], x);
|
||||||
vec4_scale(M[1], a[1], y);
|
vec4_scale(M[1], a[1], y);
|
||||||
vec4_scale(M[2], a[2], z);
|
vec4_scale(M[2], a[2], z);
|
||||||
for(i = 0; i < 4; ++i) {
|
vec4_dup(M[3], a[3]);
|
||||||
M[3][i] = a[3][i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
static inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 const a, mat4x4 const b)
|
||||||
{
|
{
|
||||||
mat4x4 temp;
|
mat4x4 temp;
|
||||||
int k, r, c;
|
int k, r, c;
|
||||||
@ -153,7 +177,7 @@ static inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)
|
|||||||
}
|
}
|
||||||
mat4x4_dup(M, temp);
|
mat4x4_dup(M, temp);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 const M, vec4 const v)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
for(j=0; j<4; ++j) {
|
for(j=0; j<4; ++j) {
|
||||||
@ -162,14 +186,14 @@ static inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
|
|||||||
r[j] += M[i][j] * v[i];
|
r[j] += M[i][j] * v[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static inline void mat4x4_translate(mat4x4 T, float x, float y, float z)
|
LINMATH_H_FUNC 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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)
|
LINMATH_H_FUNC 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;
|
||||||
@ -179,33 +203,32 @@ static inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z
|
|||||||
M[3][i] += vec4_mul_inner(r, t);
|
M[3][i] += vec4_mul_inner(r, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static inline void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)
|
LINMATH_H_FUNC void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 const a, vec3 const 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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)
|
LINMATH_H_FUNC void mat4x4_rotate(mat4x4 R, mat4x4 const 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;
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
S[1][2] = u[0];
|
mat4x4 S = {
|
||||||
S[2][1] = -u[0];
|
{ 0, u[2], -u[1], 0},
|
||||||
S[2][0] = u[1];
|
{-u[2], 0, u[0], 0},
|
||||||
S[0][2] = -u[1];
|
{ u[1], -u[0], 0, 0},
|
||||||
S[0][1] = u[2];
|
{ 0, 0, 0, 0}
|
||||||
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);
|
||||||
|
|
||||||
@ -214,13 +237,13 @@ static inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z,
|
|||||||
mat4x4_add(T, T, C);
|
mat4x4_add(T, T, C);
|
||||||
mat4x4_add(T, T, S);
|
mat4x4_add(T, T, S);
|
||||||
|
|
||||||
T[3][3] = 1.;
|
T[3][3] = 1.f;
|
||||||
mat4x4_mul(R, M, T);
|
mat4x4_mul(R, M, T);
|
||||||
} else {
|
} else {
|
||||||
mat4x4_dup(R, M);
|
mat4x4_dup(R, M);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
LINMATH_H_FUNC void mat4x4_rotate_X(mat4x4 Q, mat4x4 const M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
@ -232,19 +255,19 @@ static inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)
|
|||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)
|
LINMATH_H_FUNC void mat4x4_rotate_Y(mat4x4 Q, mat4x4 const M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
mat4x4 R = {
|
mat4x4 R = {
|
||||||
{ c, 0.f, s, 0.f},
|
{ c, 0.f, -s, 0.f},
|
||||||
{ 0.f, 1.f, 0.f, 0.f},
|
{ 0.f, 1.f, 0.f, 0.f},
|
||||||
{ -s, 0.f, c, 0.f},
|
{ s, 0.f, c, 0.f},
|
||||||
{ 0.f, 0.f, 0.f, 1.f}
|
{ 0.f, 0.f, 0.f, 1.f}
|
||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
LINMATH_H_FUNC void mat4x4_rotate_Z(mat4x4 Q, mat4x4 const M, float angle)
|
||||||
{
|
{
|
||||||
float s = sinf(angle);
|
float s = sinf(angle);
|
||||||
float c = cosf(angle);
|
float c = cosf(angle);
|
||||||
@ -256,9 +279,8 @@ static inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)
|
|||||||
};
|
};
|
||||||
mat4x4_mul(Q, M, R);
|
mat4x4_mul(Q, M, R);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_invert(mat4x4 T, mat4x4 M)
|
LINMATH_H_FUNC void mat4x4_invert(mat4x4 T, mat4x4 const 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];
|
||||||
@ -274,10 +296,10 @@ static inline void mat4x4_invert(mat4x4 T, mat4x4 M)
|
|||||||
c[3] = M[2][1]*M[3][2] - M[3][1]*M[2][2];
|
c[3] = M[2][1]*M[3][2] - M[3][1]*M[2][2];
|
||||||
c[4] = M[2][1]*M[3][3] - M[3][1]*M[2][3];
|
c[4] = M[2][1]*M[3][3] - M[3][1]*M[2][3];
|
||||||
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 */
|
||||||
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] );
|
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] );
|
||||||
|
|
||||||
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;
|
||||||
T[0][2] = ( M[3][1] * s[5] - M[3][2] * s[4] + M[3][3] * s[3]) * idet;
|
T[0][2] = ( M[3][1] * s[5] - M[3][2] * s[4] + M[3][3] * s[3]) * idet;
|
||||||
@ -298,35 +320,34 @@ static inline 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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)
|
LINMATH_H_FUNC void mat4x4_orthonormalize(mat4x4 R, mat4x4 const M)
|
||||||
{
|
{
|
||||||
float s = 1.;
|
mat4x4_dup(R, M);
|
||||||
|
float s = 1.f;
|
||||||
vec3 h;
|
vec3 h;
|
||||||
|
|
||||||
mat4x4_dup(R, M);
|
|
||||||
vec3_norm(R[2], R[2]);
|
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]);
|
|
||||||
|
|
||||||
s = vec3_mul_inner(R[1], R[2]);
|
s = vec3_mul_inner(R[1], R[2]);
|
||||||
vec3_scale(h, R[2], s);
|
vec3_scale(h, R[2], s);
|
||||||
vec3_sub(R[1], R[1], h);
|
vec3_sub(R[1], R[1], h);
|
||||||
vec3_norm(R[1], R[1]);
|
vec3_norm(R[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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
LINMATH_H_FUNC 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;
|
||||||
|
|
||||||
M[1][1] = 2.f*n/(t-b);
|
M[1][1] = 2.f*n/(t-b);
|
||||||
M[1][0] = M[1][2] = M[1][3] = 0.f;
|
M[1][0] = M[1][2] = M[1][3] = 0.f;
|
||||||
|
|
||||||
@ -334,11 +355,11 @@ static inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t,
|
|||||||
M[2][1] = (t+b)/(t-b);
|
M[2][1] = (t+b)/(t-b);
|
||||||
M[2][2] = -(f+n)/(f-n);
|
M[2][2] = -(f+n)/(f-n);
|
||||||
M[2][3] = -1.f;
|
M[2][3] = -1.f;
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)
|
LINMATH_H_FUNC 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;
|
||||||
@ -348,17 +369,17 @@ static inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, fl
|
|||||||
|
|
||||||
M[2][2] = -2.f/(f-n);
|
M[2][2] = -2.f/(f-n);
|
||||||
M[2][0] = M[2][1] = M[2][3] = 0.f;
|
M[2][0] = M[2][1] = M[2][3] = 0.f;
|
||||||
|
|
||||||
M[3][0] = -(r+l)/(r-l);
|
M[3][0] = -(r+l)/(r-l);
|
||||||
M[3][1] = -(t+b)/(t-b);
|
M[3][1] = -(t+b)/(t-b);
|
||||||
M[3][2] = -(f+n)/(f-n);
|
M[3][2] = -(f+n)/(f-n);
|
||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)
|
LINMATH_H_FUNC 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 / (float) tan(y_fov / 2.f);
|
float const a = 1.f / tanf(y_fov / 2.f);
|
||||||
|
|
||||||
m[0][0] = a / aspect;
|
m[0][0] = a / aspect;
|
||||||
m[0][1] = 0.f;
|
m[0][1] = 0.f;
|
||||||
@ -380,7 +401,7 @@ static inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float
|
|||||||
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;
|
||||||
}
|
}
|
||||||
static inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
LINMATH_H_FUNC void mat4x4_look_at(mat4x4 m, vec3 const eye, vec3 const center, vec3 const 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 */
|
||||||
@ -389,15 +410,14 @@ static inline 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_sub(f, center, eye);
|
||||||
|
vec3_norm(f, f);
|
||||||
|
|
||||||
vec3 s;
|
vec3 s;
|
||||||
vec3 t;
|
|
||||||
|
|
||||||
vec3_sub(f, center, eye);
|
|
||||||
vec3_norm(f, f);
|
|
||||||
|
|
||||||
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];
|
||||||
@ -424,24 +444,18 @@ static inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef float quat[4];
|
typedef float quat[4];
|
||||||
static inline void quat_identity(quat q)
|
#define quat_add vec4_add
|
||||||
|
#define quat_sub vec4_sub
|
||||||
|
#define quat_norm vec4_norm
|
||||||
|
#define quat_scale vec4_scale
|
||||||
|
#define quat_mul_inner vec4_mul_inner
|
||||||
|
|
||||||
|
LINMATH_H_FUNC void quat_identity(quat q)
|
||||||
{
|
{
|
||||||
q[0] = q[1] = q[2] = 0.f;
|
q[0] = q[1] = q[2] = 0.f;
|
||||||
q[3] = 1.f;
|
q[3] = 1.f;
|
||||||
}
|
}
|
||||||
static inline void quat_add(quat r, quat a, quat b)
|
LINMATH_H_FUNC void quat_mul(quat r, quat const p, quat const q)
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0; i<4; ++i)
|
|
||||||
r[i] = a[i] + b[i];
|
|
||||||
}
|
|
||||||
static inline void quat_sub(quat r, quat a, quat b)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0; i<4; ++i)
|
|
||||||
r[i] = a[i] - b[i];
|
|
||||||
}
|
|
||||||
static inline void quat_mul(quat r, quat p, quat q)
|
|
||||||
{
|
{
|
||||||
vec3 w;
|
vec3 w;
|
||||||
vec3_mul_cross(r, p, q);
|
vec3_mul_cross(r, p, q);
|
||||||
@ -451,56 +465,42 @@ static inline 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);
|
||||||
}
|
}
|
||||||
static inline void quat_scale(quat r, quat v, float s)
|
LINMATH_H_FUNC void quat_conj(quat r, quat const q)
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0; i<4; ++i)
|
|
||||||
r[i] = v[i] * s;
|
|
||||||
}
|
|
||||||
static inline float quat_inner_product(quat a, quat b)
|
|
||||||
{
|
|
||||||
float p = 0.f;
|
|
||||||
int i;
|
|
||||||
for(i=0; i<4; ++i)
|
|
||||||
p += b[i]*a[i];
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
static inline void quat_conj(quat r, quat q)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<3; ++i)
|
for(i=0; i<3; ++i)
|
||||||
r[i] = -q[i];
|
r[i] = -q[i];
|
||||||
r[3] = q[3];
|
r[3] = q[3];
|
||||||
}
|
}
|
||||||
static inline void quat_rotate(quat r, float angle, vec3 axis) {
|
LINMATH_H_FUNC void quat_rotate(quat r, float angle, vec3 const axis) {
|
||||||
int i;
|
vec3 axis_norm;
|
||||||
vec3 v;
|
vec3_norm(axis_norm, axis);
|
||||||
vec3_scale(v, axis, sinf(angle / 2));
|
float s = sinf(angle / 2);
|
||||||
for(i=0; i<3; ++i)
|
float c = cosf(angle / 2);
|
||||||
r[i] = v[i];
|
vec3_scale(r, axis_norm, s);
|
||||||
r[3] = cosf(angle / 2);
|
r[3] = c;
|
||||||
}
|
}
|
||||||
#define quat_norm vec4_norm
|
LINMATH_H_FUNC void quat_mul_vec3(vec3 r, quat const q, vec3 const 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 = {q[0], q[1], q[2]};
|
vec3 t;
|
||||||
|
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, t, v);
|
vec3_mul_cross(t, q_xyz, v);
|
||||||
vec3_scale(t, t, 2);
|
vec3_scale(t, t, 2);
|
||||||
|
|
||||||
vec3_mul_cross(u, u, t);
|
vec3_mul_cross(u, q_xyz, 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);
|
||||||
}
|
}
|
||||||
static inline void mat4x4_from_quat(mat4x4 M, quat q)
|
LINMATH_H_FUNC void mat4x4_from_quat(mat4x4 M, quat const q)
|
||||||
{
|
{
|
||||||
float a = q[3];
|
float a = q[3];
|
||||||
float b = q[0];
|
float b = q[0];
|
||||||
@ -510,7 +510,7 @@ static inline void mat4x4_from_quat(mat4x4 M, quat q)
|
|||||||
float b2 = b*b;
|
float b2 = b*b;
|
||||||
float c2 = c*c;
|
float c2 = c*c;
|
||||||
float d2 = d*d;
|
float d2 = d*d;
|
||||||
|
|
||||||
M[0][0] = a2 + b2 - c2 - d2;
|
M[0][0] = a2 + b2 - c2 - d2;
|
||||||
M[0][1] = 2.f*(b*c + a*d);
|
M[0][1] = 2.f*(b*c + a*d);
|
||||||
M[0][2] = 2.f*(b*d - a*c);
|
M[0][2] = 2.f*(b*d - a*c);
|
||||||
@ -530,18 +530,21 @@ static inline void mat4x4_from_quat(mat4x4 M, quat q)
|
|||||||
M[3][3] = 1.f;
|
M[3][3] = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)
|
LINMATH_H_FUNC void mat4x4o_mul_quat(mat4x4 R, mat4x4 const M, quat const q)
|
||||||
{
|
{
|
||||||
/* XXX: The way this is written only works for othogonal matrices. */
|
/* XXX: The way this is written only works for orthogonal matrices. */
|
||||||
/* TODO: Take care of non-orthogonal case. */
|
/* TODO: Take care of non-orthogonal case. */
|
||||||
quat_mul_vec3(R[0], q, M[0]);
|
quat_mul_vec3(R[0], q, M[0]);
|
||||||
quat_mul_vec3(R[1], q, M[1]);
|
quat_mul_vec3(R[1], q, M[1]);
|
||||||
quat_mul_vec3(R[2], q, M[2]);
|
quat_mul_vec3(R[2], q, M[2]);
|
||||||
|
|
||||||
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
R[3][0] = R[3][1] = R[3][2] = 0.f;
|
||||||
R[3][3] = 1.f;
|
R[0][3] = M[0][3];
|
||||||
|
R[1][3] = M[1][3];
|
||||||
|
R[2][3] = M[2][3];
|
||||||
|
R[3][3] = M[3][3]; // typically 1.0, but here we make it general
|
||||||
}
|
}
|
||||||
static inline void quat_from_mat4x4(quat q, mat4x4 M)
|
LINMATH_H_FUNC void quat_from_mat4x4(quat q, mat4x4 const M)
|
||||||
{
|
{
|
||||||
float r=0.f;
|
float r=0.f;
|
||||||
int i;
|
int i;
|
||||||
@ -557,7 +560,7 @@ static inline void quat_from_mat4x4(quat q, mat4x4 M)
|
|||||||
p = &perm[i];
|
p = &perm[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
r = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );
|
r = sqrtf(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;
|
||||||
@ -571,4 +574,33 @@ static inline 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 const M, vec2 const _a, vec2 const _b, float s)
|
||||||
|
{
|
||||||
|
vec2 a; memcpy(a, _a, sizeof(a));
|
||||||
|
vec2 b; memcpy(b, _b, sizeof(b));
|
||||||
|
|
||||||
|
float z_a = 0.f;
|
||||||
|
float z_b = 0.f;
|
||||||
|
|
||||||
|
if(vec2_len(a) < 1.f) {
|
||||||
|
z_a = sqrtf(1.f - vec2_mul_inner(a, a));
|
||||||
|
} else {
|
||||||
|
vec2_norm(a, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vec2_len(b) < 1.f) {
|
||||||
|
z_b = sqrtf(1.f - vec2_mul_inner(b, b));
|
||||||
|
} else {
|
||||||
|
vec2_norm(b, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 a_ = {a[0], a[1], z_a};
|
||||||
|
vec3 b_ = {b[0], b[1], z_b};
|
||||||
|
|
||||||
|
vec3 c_;
|
||||||
|
vec3_mul_cross(c_, a_, b_);
|
||||||
|
|
||||||
|
float const angle = acos(vec3_mul_inner(a_, b_)) * s;
|
||||||
|
mat4x4_rotate(R, M, c_[0], c_[1], c_[2], angle);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
25778
deps/nuklear.h
vendored
Normal file
25778
deps/nuklear.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
381
deps/nuklear_glfw_gl2.h
vendored
Normal file
381
deps/nuklear_glfw_gl2.h
vendored
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
/*
|
||||||
|
* Nuklear - v1.32.0 - public domain
|
||||||
|
* no warrenty implied; use at your own risk.
|
||||||
|
* authored from 2015-2017 by Micha Mettke
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* ==============================================================
|
||||||
|
*
|
||||||
|
* API
|
||||||
|
*
|
||||||
|
* ===============================================================
|
||||||
|
*/
|
||||||
|
#ifndef NK_GLFW_GL2_H_
|
||||||
|
#define NK_GLFW_GL2_H_
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
enum nk_glfw_init_state{
|
||||||
|
NK_GLFW3_DEFAULT = 0,
|
||||||
|
NK_GLFW3_INSTALL_CALLBACKS
|
||||||
|
};
|
||||||
|
NK_API struct nk_context* nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state);
|
||||||
|
NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas);
|
||||||
|
NK_API void nk_glfw3_font_stash_end(void);
|
||||||
|
|
||||||
|
NK_API void nk_glfw3_new_frame(void);
|
||||||
|
NK_API void nk_glfw3_render(enum nk_anti_aliasing);
|
||||||
|
NK_API void nk_glfw3_shutdown(void);
|
||||||
|
|
||||||
|
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
|
||||||
|
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ==============================================================
|
||||||
|
*
|
||||||
|
* IMPLEMENTATION
|
||||||
|
*
|
||||||
|
* ===============================================================
|
||||||
|
*/
|
||||||
|
#ifdef NK_GLFW_GL2_IMPLEMENTATION
|
||||||
|
|
||||||
|
#ifndef NK_GLFW_TEXT_MAX
|
||||||
|
#define NK_GLFW_TEXT_MAX 256
|
||||||
|
#endif
|
||||||
|
#ifndef NK_GLFW_DOUBLE_CLICK_LO
|
||||||
|
#define NK_GLFW_DOUBLE_CLICK_LO 0.02
|
||||||
|
#endif
|
||||||
|
#ifndef NK_GLFW_DOUBLE_CLICK_HI
|
||||||
|
#define NK_GLFW_DOUBLE_CLICK_HI 0.2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct nk_glfw_device {
|
||||||
|
struct nk_buffer cmds;
|
||||||
|
struct nk_draw_null_texture null;
|
||||||
|
GLuint font_tex;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nk_glfw_vertex {
|
||||||
|
float position[2];
|
||||||
|
float uv[2];
|
||||||
|
nk_byte col[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct nk_glfw {
|
||||||
|
GLFWwindow *win;
|
||||||
|
int width, height;
|
||||||
|
int display_width, display_height;
|
||||||
|
struct nk_glfw_device ogl;
|
||||||
|
struct nk_context ctx;
|
||||||
|
struct nk_font_atlas atlas;
|
||||||
|
struct nk_vec2 fb_scale;
|
||||||
|
unsigned int text[NK_GLFW_TEXT_MAX];
|
||||||
|
int text_len;
|
||||||
|
struct nk_vec2 scroll;
|
||||||
|
double last_button_click;
|
||||||
|
int is_double_click_down;
|
||||||
|
struct nk_vec2 double_click_pos;
|
||||||
|
} glfw;
|
||||||
|
|
||||||
|
NK_INTERN void
|
||||||
|
nk_glfw3_device_upload_atlas(const void *image, int width, int height)
|
||||||
|
{
|
||||||
|
struct nk_glfw_device *dev = &glfw.ogl;
|
||||||
|
glGenTextures(1, &dev->font_tex);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, dev->font_tex);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,
|
||||||
|
GL_RGBA, GL_UNSIGNED_BYTE, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_render(enum nk_anti_aliasing AA)
|
||||||
|
{
|
||||||
|
/* setup global state */
|
||||||
|
struct nk_glfw_device *dev = &glfw.ogl;
|
||||||
|
glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
/* setup viewport/project */
|
||||||
|
glViewport(0,0,(GLsizei)glfw.display_width,(GLsizei)glfw.display_height);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho(0.0f, glfw.width, glfw.height, 0.0f, -1.0f, 1.0f);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
|
{
|
||||||
|
GLsizei vs = sizeof(struct nk_glfw_vertex);
|
||||||
|
size_t vp = offsetof(struct nk_glfw_vertex, position);
|
||||||
|
size_t vt = offsetof(struct nk_glfw_vertex, uv);
|
||||||
|
size_t vc = offsetof(struct nk_glfw_vertex, col);
|
||||||
|
|
||||||
|
/* convert from command queue into draw list and draw to screen */
|
||||||
|
const struct nk_draw_command *cmd;
|
||||||
|
const nk_draw_index *offset = NULL;
|
||||||
|
struct nk_buffer vbuf, ebuf;
|
||||||
|
|
||||||
|
/* fill convert configuration */
|
||||||
|
struct nk_convert_config config;
|
||||||
|
static const struct nk_draw_vertex_layout_element vertex_layout[] = {
|
||||||
|
{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)},
|
||||||
|
{NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)},
|
||||||
|
{NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)},
|
||||||
|
{NK_VERTEX_LAYOUT_END}
|
||||||
|
};
|
||||||
|
NK_MEMSET(&config, 0, sizeof(config));
|
||||||
|
config.vertex_layout = vertex_layout;
|
||||||
|
config.vertex_size = sizeof(struct nk_glfw_vertex);
|
||||||
|
config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex);
|
||||||
|
config.null = dev->null;
|
||||||
|
config.circle_segment_count = 22;
|
||||||
|
config.curve_segment_count = 22;
|
||||||
|
config.arc_segment_count = 22;
|
||||||
|
config.global_alpha = 1.0f;
|
||||||
|
config.shape_AA = AA;
|
||||||
|
config.line_AA = AA;
|
||||||
|
|
||||||
|
/* convert shapes into vertexes */
|
||||||
|
nk_buffer_init_default(&vbuf);
|
||||||
|
nk_buffer_init_default(&ebuf);
|
||||||
|
nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config);
|
||||||
|
|
||||||
|
/* setup vertex buffer pointer */
|
||||||
|
{const void *vertices = nk_buffer_memory_const(&vbuf);
|
||||||
|
glVertexPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vp));
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vt));
|
||||||
|
glColorPointer(4, GL_UNSIGNED_BYTE, vs, (const void*)((const nk_byte*)vertices + vc));}
|
||||||
|
|
||||||
|
/* iterate over and execute each draw command */
|
||||||
|
offset = (const nk_draw_index*)nk_buffer_memory_const(&ebuf);
|
||||||
|
nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
|
||||||
|
{
|
||||||
|
if (!cmd->elem_count) continue;
|
||||||
|
glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id);
|
||||||
|
glScissor(
|
||||||
|
(GLint)(cmd->clip_rect.x * glfw.fb_scale.x),
|
||||||
|
(GLint)((glfw.height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h)) * glfw.fb_scale.y),
|
||||||
|
(GLint)(cmd->clip_rect.w * glfw.fb_scale.x),
|
||||||
|
(GLint)(cmd->clip_rect.h * glfw.fb_scale.y));
|
||||||
|
glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);
|
||||||
|
offset += cmd->elem_count;
|
||||||
|
}
|
||||||
|
nk_clear(&glfw.ctx);
|
||||||
|
nk_buffer_free(&vbuf);
|
||||||
|
nk_buffer_free(&ebuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* default OpenGL state */
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
|
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPopMatrix();
|
||||||
|
glPopAttrib();
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
|
||||||
|
{
|
||||||
|
(void)win;
|
||||||
|
if (glfw.text_len < NK_GLFW_TEXT_MAX)
|
||||||
|
glfw.text[glfw.text_len++] = codepoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
||||||
|
{
|
||||||
|
(void)win; (void)xoff;
|
||||||
|
glfw.scroll.x += (float)xoff;
|
||||||
|
glfw.scroll.y += (float)yoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
if (button != GLFW_MOUSE_BUTTON_LEFT) return;
|
||||||
|
glfwGetCursorPos(window, &x, &y);
|
||||||
|
if (action == GLFW_PRESS) {
|
||||||
|
double dt = glfwGetTime() - glfw.last_button_click;
|
||||||
|
if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI) {
|
||||||
|
glfw.is_double_click_down = nk_true;
|
||||||
|
glfw.double_click_pos = nk_vec2((float)x, (float)y);
|
||||||
|
}
|
||||||
|
glfw.last_button_click = glfwGetTime();
|
||||||
|
} else glfw.is_double_click_down = nk_false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_INTERN void
|
||||||
|
nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit)
|
||||||
|
{
|
||||||
|
const char *text = glfwGetClipboardString(glfw.win);
|
||||||
|
if (text) nk_textedit_paste(edit, text, nk_strlen(text));
|
||||||
|
(void)usr;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_INTERN void
|
||||||
|
nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len)
|
||||||
|
{
|
||||||
|
char *str = 0;
|
||||||
|
(void)usr;
|
||||||
|
if (!len) return;
|
||||||
|
str = (char*)malloc((size_t)len+1);
|
||||||
|
if (!str) return;
|
||||||
|
NK_MEMCPY(str, text, (size_t)len);
|
||||||
|
str[len] = '\0';
|
||||||
|
glfwSetClipboardString(glfw.win, str);
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API struct nk_context*
|
||||||
|
nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)
|
||||||
|
{
|
||||||
|
glfw.win = win;
|
||||||
|
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
|
||||||
|
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
|
||||||
|
glfwSetCharCallback(win, nk_glfw3_char_callback);
|
||||||
|
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
|
||||||
|
}
|
||||||
|
nk_init_default(&glfw.ctx, 0);
|
||||||
|
glfw.ctx.clip.copy = nk_glfw3_clipboard_copy;
|
||||||
|
glfw.ctx.clip.paste = nk_glfw3_clipboard_paste;
|
||||||
|
glfw.ctx.clip.userdata = nk_handle_ptr(0);
|
||||||
|
nk_buffer_init_default(&glfw.ogl.cmds);
|
||||||
|
|
||||||
|
glfw.is_double_click_down = nk_false;
|
||||||
|
glfw.double_click_pos = nk_vec2(0, 0);
|
||||||
|
|
||||||
|
return &glfw.ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas)
|
||||||
|
{
|
||||||
|
nk_font_atlas_init_default(&glfw.atlas);
|
||||||
|
nk_font_atlas_begin(&glfw.atlas);
|
||||||
|
*atlas = &glfw.atlas;
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_font_stash_end(void)
|
||||||
|
{
|
||||||
|
const void *image; int w, h;
|
||||||
|
image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
|
||||||
|
nk_glfw3_device_upload_atlas(image, w, h);
|
||||||
|
nk_font_atlas_end(&glfw.atlas, nk_handle_id((int)glfw.ogl.font_tex), &glfw.ogl.null);
|
||||||
|
if (glfw.atlas.default_font)
|
||||||
|
nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API void
|
||||||
|
nk_glfw3_new_frame(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double x, y;
|
||||||
|
struct nk_context *ctx = &glfw.ctx;
|
||||||
|
struct GLFWwindow *win = glfw.win;
|
||||||
|
|
||||||
|
glfwGetWindowSize(win, &glfw.width, &glfw.height);
|
||||||
|
glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height);
|
||||||
|
glfw.fb_scale.x = (float)glfw.display_width/(float)glfw.width;
|
||||||
|
glfw.fb_scale.y = (float)glfw.display_height/(float)glfw.height;
|
||||||
|
|
||||||
|
nk_input_begin(ctx);
|
||||||
|
for (i = 0; i < glfw.text_len; ++i)
|
||||||
|
nk_input_unicode(ctx, glfw.text[i]);
|
||||||
|
|
||||||
|
/* optional grabbing behavior */
|
||||||
|
if (ctx->input.mouse.grab)
|
||||||
|
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
|
else if (ctx->input.mouse.ungrab)
|
||||||
|
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
|
|
||||||
|
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
|
||||||
|
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
|
||||||
|
|
||||||
|
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
|
||||||
|
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
|
||||||
|
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
|
||||||
|
} else {
|
||||||
|
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
|
||||||
|
nk_input_key(ctx, NK_KEY_COPY, 0);
|
||||||
|
nk_input_key(ctx, NK_KEY_PASTE, 0);
|
||||||
|
nk_input_key(ctx, NK_KEY_CUT, 0);
|
||||||
|
nk_input_key(ctx, NK_KEY_SHIFT, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwGetCursorPos(win, &x, &y);
|
||||||
|
nk_input_motion(ctx, (int)x, (int)y);
|
||||||
|
if (ctx->input.mouse.grabbed) {
|
||||||
|
glfwSetCursorPos(glfw.win, (double)ctx->input.mouse.prev.x, (double)ctx->input.mouse.prev.y);
|
||||||
|
ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;
|
||||||
|
ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);
|
||||||
|
nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);
|
||||||
|
nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);
|
||||||
|
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down);
|
||||||
|
nk_input_scroll(ctx, glfw.scroll);
|
||||||
|
nk_input_end(&glfw.ctx);
|
||||||
|
glfw.text_len = 0;
|
||||||
|
glfw.scroll = nk_vec2(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NK_API
|
||||||
|
void nk_glfw3_shutdown(void)
|
||||||
|
{
|
||||||
|
struct nk_glfw_device *dev = &glfw.ogl;
|
||||||
|
nk_font_atlas_clear(&glfw.atlas);
|
||||||
|
nk_free(&glfw.ctx);
|
||||||
|
glDeleteTextures(1, &dev->font_tex);
|
||||||
|
nk_buffer_free(&dev->cmds);
|
||||||
|
NK_MEMSET(&glfw, 0, sizeof(glfw));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
1724
deps/stb_image_write.h
vendored
Normal file
1724
deps/stb_image_write.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
deps/tinycthread.c
vendored
2
deps/tinycthread.c
vendored
@ -21,7 +21,7 @@ freely, subject to the following restrictions:
|
|||||||
distribution.
|
distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* 2013-01-06 Camilla Berglund <elmindreda@glfw.org>
|
/* 2013-01-06 Camilla Löwy <elmindreda@glfw.org>
|
||||||
*
|
*
|
||||||
* Added casts from time_t to DWORD to avoid warnings on VC++.
|
* Added casts from time_t to DWORD to avoid warnings on VC++.
|
||||||
* Fixed time retrieval on POSIX systems.
|
* Fixed time retrieval on POSIX systems.
|
||||||
|
4
deps/tinycthread.h
vendored
4
deps/tinycthread.h
vendored
@ -123,7 +123,9 @@ typedef int _tthread_clockid_t;
|
|||||||
/* Emulate clock_gettime */
|
/* Emulate clock_gettime */
|
||||||
int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts);
|
int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts);
|
||||||
#define clock_gettime _tthread_clock_gettime
|
#define clock_gettime _tthread_clock_gettime
|
||||||
#define CLOCK_REALTIME 0
|
#ifndef CLOCK_REALTIME
|
||||||
|
#define CLOCK_REALTIME 0
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
120
deps/vulkan/vk_platform.h
vendored
120
deps/vulkan/vk_platform.h
vendored
@ -1,120 +0,0 @@
|
|||||||
//
|
|
||||||
// File: vk_platform.h
|
|
||||||
//
|
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2015 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
** you may not use this file except in compliance with the License.
|
|
||||||
** You may obtain a copy of the License at
|
|
||||||
**
|
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
**
|
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
** See the License for the specific language governing permissions and
|
|
||||||
** limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef VK_PLATFORM_H_
|
|
||||||
#define VK_PLATFORM_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
/*
|
|
||||||
***************************************************************************************************
|
|
||||||
* Platform-specific directives and type declarations
|
|
||||||
***************************************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Platform-specific calling convention macros.
|
|
||||||
*
|
|
||||||
* Platforms should define these so that Vulkan clients call Vulkan commands
|
|
||||||
* with the same calling conventions that the Vulkan implementation expects.
|
|
||||||
*
|
|
||||||
* VKAPI_ATTR - Placed before the return type in function declarations.
|
|
||||||
* Useful for C++11 and GCC/Clang-style function attribute syntax.
|
|
||||||
* VKAPI_CALL - Placed after the return type in function declarations.
|
|
||||||
* Useful for MSVC-style calling convention syntax.
|
|
||||||
* VKAPI_PTR - Placed between the '(' and '*' in function pointer types.
|
|
||||||
*
|
|
||||||
* Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void);
|
|
||||||
* Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
|
|
||||||
*/
|
|
||||||
#if defined(_WIN32)
|
|
||||||
// On Windows, Vulkan commands use the stdcall convention
|
|
||||||
#define VKAPI_ATTR
|
|
||||||
#define VKAPI_CALL __stdcall
|
|
||||||
#define VKAPI_PTR VKAPI_CALL
|
|
||||||
#elif defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__)
|
|
||||||
// Android does not support Vulkan in native code using the "armeabi" ABI.
|
|
||||||
#error "Vulkan requires the 'armeabi-v7a' or 'armeabi-v7a-hard' ABI on 32-bit ARM CPUs"
|
|
||||||
#elif defined(__ANDROID__) && defined(__ARM_ARCH_7A__)
|
|
||||||
// On Android/ARMv7a, Vulkan functions use the armeabi-v7a-hard calling
|
|
||||||
// convention, even if the application's native code is compiled with the
|
|
||||||
// armeabi-v7a calling convention.
|
|
||||||
#define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
|
|
||||||
#define VKAPI_CALL
|
|
||||||
#define VKAPI_PTR VKAPI_ATTR
|
|
||||||
#else
|
|
||||||
// On other platforms, use the default calling convention
|
|
||||||
#define VKAPI_ATTR
|
|
||||||
#define VKAPI_CALL
|
|
||||||
#define VKAPI_PTR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#if !defined(VK_NO_STDINT_H)
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
|
||||||
typedef signed __int8 int8_t;
|
|
||||||
typedef unsigned __int8 uint8_t;
|
|
||||||
typedef signed __int16 int16_t;
|
|
||||||
typedef unsigned __int16 uint16_t;
|
|
||||||
typedef signed __int32 int32_t;
|
|
||||||
typedef unsigned __int32 uint32_t;
|
|
||||||
typedef signed __int64 int64_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
#endif // !defined(VK_NO_STDINT_H)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
// Platform-specific headers required by platform window system extensions.
|
|
||||||
// These are enabled prior to #including "vulkan.h". The same enable then
|
|
||||||
// controls inclusion of the extension interfaces in vulkan.h.
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_ANDROID_KHR
|
|
||||||
#include <android/native_window.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_MIR_KHR
|
|
||||||
#include <mir_toolkit/client_types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_WIN32_KHR
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_XLIB_KHR
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VK_USE_PLATFORM_XCB_KHR
|
|
||||||
#include <xcb/xcb.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
3835
deps/vulkan/vulkan.h
vendored
3835
deps/vulkan/vulkan.h
vendored
File diff suppressed because it is too large
Load Diff
102
deps/wayland/fractional-scale-v1.xml
vendored
Normal file
102
deps/wayland/fractional-scale-v1.xml
vendored
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="fractional_scale_v1">
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2022 Kenny Levinsen
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<description summary="Protocol for requesting fractional surface scales">
|
||||||
|
This protocol allows a compositor to suggest for surfaces to render at
|
||||||
|
fractional scales.
|
||||||
|
|
||||||
|
A client can submit scaled content by utilizing wp_viewport. This is done by
|
||||||
|
creating a wp_viewport object for the surface and setting the destination
|
||||||
|
rectangle to the surface size before the scale factor is applied.
|
||||||
|
|
||||||
|
The buffer size is calculated by multiplying the surface size by the
|
||||||
|
intended scale.
|
||||||
|
|
||||||
|
The wl_surface buffer scale should remain set to 1.
|
||||||
|
|
||||||
|
If a surface has a surface-local size of 100 px by 50 px and wishes to
|
||||||
|
submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should
|
||||||
|
be used and the wp_viewport destination rectangle should be 100 px by 50 px.
|
||||||
|
|
||||||
|
For toplevel surfaces, the size is rounded halfway away from zero. The
|
||||||
|
rounding algorithm for subsurface position and size is not defined.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<interface name="wp_fractional_scale_manager_v1" version="1">
|
||||||
|
<description summary="fractional surface scale information">
|
||||||
|
A global interface for requesting surfaces to use fractional scales.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="unbind the fractional surface scale interface">
|
||||||
|
Informs the server that the client will not be using this protocol
|
||||||
|
object anymore. This does not affect any other objects,
|
||||||
|
wp_fractional_scale_v1 objects included.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="fractional_scale_exists" value="0"
|
||||||
|
summary="the surface already has a fractional_scale object associated"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="get_fractional_scale">
|
||||||
|
<description summary="extend surface interface for scale information">
|
||||||
|
Create an add-on object for the the wl_surface to let the compositor
|
||||||
|
request fractional scales. If the given wl_surface already has a
|
||||||
|
wp_fractional_scale_v1 object associated, the fractional_scale_exists
|
||||||
|
protocol error is raised.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="wp_fractional_scale_v1"
|
||||||
|
summary="the new surface scale info interface id"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="the surface"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="wp_fractional_scale_v1" version="1">
|
||||||
|
<description summary="fractional scale interface to a wl_surface">
|
||||||
|
An additional interface to a wl_surface object which allows the compositor
|
||||||
|
to inform the client of the preferred scale.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="remove surface scale information for surface">
|
||||||
|
Destroy the fractional scale object. When this object is destroyed,
|
||||||
|
preferred_scale events will no longer be sent.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="preferred_scale">
|
||||||
|
<description summary="notify of new preferred scale">
|
||||||
|
Notification of a new preferred scale for this surface that the
|
||||||
|
compositor suggests that the client should use.
|
||||||
|
|
||||||
|
The sent scale is the numerator of a fraction with a denominator of 120.
|
||||||
|
</description>
|
||||||
|
<arg name="scale" type="uint" summary="the new preferred scale"/>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
83
deps/wayland/idle-inhibit-unstable-v1.xml
vendored
Normal file
83
deps/wayland/idle-inhibit-unstable-v1.xml
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="idle_inhibit_unstable_v1">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2015 Samsung Electronics Co., Ltd
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<interface name="zwp_idle_inhibit_manager_v1" version="1">
|
||||||
|
<description summary="control behavior when display idles">
|
||||||
|
This interface permits inhibiting the idle behavior such as screen
|
||||||
|
blanking, locking, and screensaving. The client binds the idle manager
|
||||||
|
globally, then creates idle-inhibitor objects for each surface.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is experimental and
|
||||||
|
backward incompatible changes may be made. Backward compatible changes
|
||||||
|
may be added together with the corresponding interface version bump.
|
||||||
|
Backward incompatible changes are done by bumping the version number in
|
||||||
|
the protocol and interface names and resetting the interface version.
|
||||||
|
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||||
|
version number in the protocol and interface names are removed and the
|
||||||
|
interface version number is reset.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the idle inhibitor object">
|
||||||
|
Destroy the inhibit manager.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="create_inhibitor">
|
||||||
|
<description summary="create a new inhibitor object">
|
||||||
|
Create a new inhibitor object associated with the given surface.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zwp_idle_inhibitor_v1"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="the surface that inhibits the idle behavior"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zwp_idle_inhibitor_v1" version="1">
|
||||||
|
<description summary="context object for inhibiting idle behavior">
|
||||||
|
An idle inhibitor prevents the output that the associated surface is
|
||||||
|
visible on from being set to a state where it is not visually usable due
|
||||||
|
to lack of user interaction (e.g. blanked, dimmed, locked, set to power
|
||||||
|
save, etc.) Any screensaver processes are also blocked from displaying.
|
||||||
|
|
||||||
|
If the surface is destroyed, unmapped, becomes occluded, loses
|
||||||
|
visibility, or otherwise becomes not visually relevant for the user, the
|
||||||
|
idle inhibitor will not be honored by the compositor; if the surface
|
||||||
|
subsequently regains visibility the inhibitor takes effect once again.
|
||||||
|
Likewise, the inhibitor isn't honored if the system was already idled at
|
||||||
|
the time the inhibitor was established, although if the system later
|
||||||
|
de-idles and re-idles the inhibitor will take effect.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the idle inhibitor object">
|
||||||
|
Remove the inhibitor effect from the associated wl_surface.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
339
deps/wayland/pointer-constraints-unstable-v1.xml
vendored
Normal file
339
deps/wayland/pointer-constraints-unstable-v1.xml
vendored
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="pointer_constraints_unstable_v1">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2014 Jonas Ådahl
|
||||||
|
Copyright © 2015 Red Hat Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<description summary="protocol for constraining pointer motions">
|
||||||
|
This protocol specifies a set of interfaces used for adding constraints to
|
||||||
|
the motion of a pointer. Possible constraints include confining pointer
|
||||||
|
motions to a given region, or locking it to its current position.
|
||||||
|
|
||||||
|
In order to constrain the pointer, a client must first bind the global
|
||||||
|
interface "wp_pointer_constraints" which, if a compositor supports pointer
|
||||||
|
constraints, is exposed by the registry. Using the bound global object, the
|
||||||
|
client uses the request that corresponds to the type of constraint it wants
|
||||||
|
to make. See wp_pointer_constraints for more details.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is experimental and backward
|
||||||
|
incompatible changes may be made. Backward compatible changes may be added
|
||||||
|
together with the corresponding interface version bump. Backward
|
||||||
|
incompatible changes are done by bumping the version number in the protocol
|
||||||
|
and interface names and resetting the interface version. Once the protocol
|
||||||
|
is to be declared stable, the 'z' prefix and the version number in the
|
||||||
|
protocol and interface names are removed and the interface version number is
|
||||||
|
reset.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<interface name="zwp_pointer_constraints_v1" version="1">
|
||||||
|
<description summary="constrain the movement of a pointer">
|
||||||
|
The global interface exposing pointer constraining functionality. It
|
||||||
|
exposes two requests: lock_pointer for locking the pointer to its
|
||||||
|
position, and confine_pointer for locking the pointer to a region.
|
||||||
|
|
||||||
|
The lock_pointer and confine_pointer requests create the objects
|
||||||
|
wp_locked_pointer and wp_confined_pointer respectively, and the client can
|
||||||
|
use these objects to interact with the lock.
|
||||||
|
|
||||||
|
For any surface, only one lock or confinement may be active across all
|
||||||
|
wl_pointer objects of the same seat. If a lock or confinement is requested
|
||||||
|
when another lock or confinement is active or requested on the same surface
|
||||||
|
and with any of the wl_pointer objects of the same seat, an
|
||||||
|
'already_constrained' error will be raised.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<description summary="wp_pointer_constraints error values">
|
||||||
|
These errors can be emitted in response to wp_pointer_constraints
|
||||||
|
requests.
|
||||||
|
</description>
|
||||||
|
<entry name="already_constrained" value="1"
|
||||||
|
summary="pointer constraint already requested on that surface"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<enum name="lifetime">
|
||||||
|
<description summary="constraint lifetime">
|
||||||
|
These values represent different lifetime semantics. They are passed
|
||||||
|
as arguments to the factory requests to specify how the constraint
|
||||||
|
lifetimes should be managed.
|
||||||
|
</description>
|
||||||
|
<entry name="oneshot" value="1">
|
||||||
|
<description summary="the pointer constraint is defunct once deactivated">
|
||||||
|
A oneshot pointer constraint will never reactivate once it has been
|
||||||
|
deactivated. See the corresponding deactivation event
|
||||||
|
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
|
||||||
|
details.
|
||||||
|
</description>
|
||||||
|
</entry>
|
||||||
|
<entry name="persistent" value="2">
|
||||||
|
<description summary="the pointer constraint may reactivate">
|
||||||
|
A persistent pointer constraint may again reactivate once it has
|
||||||
|
been deactivated. See the corresponding deactivation event
|
||||||
|
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
|
||||||
|
details.
|
||||||
|
</description>
|
||||||
|
</entry>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the pointer constraints manager object">
|
||||||
|
Used by the client to notify the server that it will no longer use this
|
||||||
|
pointer constraints object.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="lock_pointer">
|
||||||
|
<description summary="lock pointer to a position">
|
||||||
|
The lock_pointer request lets the client request to disable movements of
|
||||||
|
the virtual pointer (i.e. the cursor), effectively locking the pointer
|
||||||
|
to a position. This request may not take effect immediately; in the
|
||||||
|
future, when the compositor deems implementation-specific constraints
|
||||||
|
are satisfied, the pointer lock will be activated and the compositor
|
||||||
|
sends a locked event.
|
||||||
|
|
||||||
|
The protocol provides no guarantee that the constraints are ever
|
||||||
|
satisfied, and does not require the compositor to send an error if the
|
||||||
|
constraints cannot ever be satisfied. It is thus possible to request a
|
||||||
|
lock that will never activate.
|
||||||
|
|
||||||
|
There may not be another pointer constraint of any kind requested or
|
||||||
|
active on the surface for any of the wl_pointer objects of the seat of
|
||||||
|
the passed pointer when requesting a lock. If there is, an error will be
|
||||||
|
raised. See general pointer lock documentation for more details.
|
||||||
|
|
||||||
|
The intersection of the region passed with this request and the input
|
||||||
|
region of the surface is used to determine where the pointer must be
|
||||||
|
in order for the lock to activate. It is up to the compositor whether to
|
||||||
|
warp the pointer or require some kind of user interaction for the lock
|
||||||
|
to activate. If the region is null the surface input region is used.
|
||||||
|
|
||||||
|
A surface may receive pointer focus without the lock being activated.
|
||||||
|
|
||||||
|
The request creates a new object wp_locked_pointer which is used to
|
||||||
|
interact with the lock as well as receive updates about its state. See
|
||||||
|
the the description of wp_locked_pointer for further information.
|
||||||
|
|
||||||
|
Note that while a pointer is locked, the wl_pointer objects of the
|
||||||
|
corresponding seat will not emit any wl_pointer.motion events, but
|
||||||
|
relative motion events will still be emitted via wp_relative_pointer
|
||||||
|
objects of the same seat. wl_pointer.axis and wl_pointer.button events
|
||||||
|
are unaffected.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zwp_locked_pointer_v1"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="surface to lock pointer to"/>
|
||||||
|
<arg name="pointer" type="object" interface="wl_pointer"
|
||||||
|
summary="the pointer that should be locked"/>
|
||||||
|
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||||
|
summary="region of surface"/>
|
||||||
|
<arg name="lifetime" type="uint" enum="lifetime" summary="lock lifetime"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="confine_pointer">
|
||||||
|
<description summary="confine pointer to a region">
|
||||||
|
The confine_pointer request lets the client request to confine the
|
||||||
|
pointer cursor to a given region. This request may not take effect
|
||||||
|
immediately; in the future, when the compositor deems implementation-
|
||||||
|
specific constraints are satisfied, the pointer confinement will be
|
||||||
|
activated and the compositor sends a confined event.
|
||||||
|
|
||||||
|
The intersection of the region passed with this request and the input
|
||||||
|
region of the surface is used to determine where the pointer must be
|
||||||
|
in order for the confinement to activate. It is up to the compositor
|
||||||
|
whether to warp the pointer or require some kind of user interaction for
|
||||||
|
the confinement to activate. If the region is null the surface input
|
||||||
|
region is used.
|
||||||
|
|
||||||
|
The request will create a new object wp_confined_pointer which is used
|
||||||
|
to interact with the confinement as well as receive updates about its
|
||||||
|
state. See the the description of wp_confined_pointer for further
|
||||||
|
information.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zwp_confined_pointer_v1"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="surface to lock pointer to"/>
|
||||||
|
<arg name="pointer" type="object" interface="wl_pointer"
|
||||||
|
summary="the pointer that should be confined"/>
|
||||||
|
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||||
|
summary="region of surface"/>
|
||||||
|
<arg name="lifetime" type="uint" enum="lifetime" summary="confinement lifetime"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zwp_locked_pointer_v1" version="1">
|
||||||
|
<description summary="receive relative pointer motion events">
|
||||||
|
The wp_locked_pointer interface represents a locked pointer state.
|
||||||
|
|
||||||
|
While the lock of this object is active, the wl_pointer objects of the
|
||||||
|
associated seat will not emit any wl_pointer.motion events.
|
||||||
|
|
||||||
|
This object will send the event 'locked' when the lock is activated.
|
||||||
|
Whenever the lock is activated, it is guaranteed that the locked surface
|
||||||
|
will already have received pointer focus and that the pointer will be
|
||||||
|
within the region passed to the request creating this object.
|
||||||
|
|
||||||
|
To unlock the pointer, send the destroy request. This will also destroy
|
||||||
|
the wp_locked_pointer object.
|
||||||
|
|
||||||
|
If the compositor decides to unlock the pointer the unlocked event is
|
||||||
|
sent. See wp_locked_pointer.unlock for details.
|
||||||
|
|
||||||
|
When unlocking, the compositor may warp the cursor position to the set
|
||||||
|
cursor position hint. If it does, it will not result in any relative
|
||||||
|
motion events emitted via wp_relative_pointer.
|
||||||
|
|
||||||
|
If the surface the lock was requested on is destroyed and the lock is not
|
||||||
|
yet activated, the wp_locked_pointer object is now defunct and must be
|
||||||
|
destroyed.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the locked pointer object">
|
||||||
|
Destroy the locked pointer object. If applicable, the compositor will
|
||||||
|
unlock the pointer.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_cursor_position_hint">
|
||||||
|
<description summary="set the pointer cursor position hint">
|
||||||
|
Set the cursor position hint relative to the top left corner of the
|
||||||
|
surface.
|
||||||
|
|
||||||
|
If the client is drawing its own cursor, it should update the position
|
||||||
|
hint to the position of its own cursor. A compositor may use this
|
||||||
|
information to warp the pointer upon unlock in order to avoid pointer
|
||||||
|
jumps.
|
||||||
|
|
||||||
|
The cursor position hint is double buffered. The new hint will only take
|
||||||
|
effect when the associated surface gets it pending state applied. See
|
||||||
|
wl_surface.commit for details.
|
||||||
|
</description>
|
||||||
|
<arg name="surface_x" type="fixed"
|
||||||
|
summary="surface-local x coordinate"/>
|
||||||
|
<arg name="surface_y" type="fixed"
|
||||||
|
summary="surface-local y coordinate"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_region">
|
||||||
|
<description summary="set a new lock region">
|
||||||
|
Set a new region used to lock the pointer.
|
||||||
|
|
||||||
|
The new lock region is double-buffered. The new lock region will
|
||||||
|
only take effect when the associated surface gets its pending state
|
||||||
|
applied. See wl_surface.commit for details.
|
||||||
|
|
||||||
|
For details about the lock region, see wp_locked_pointer.
|
||||||
|
</description>
|
||||||
|
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||||
|
summary="region of surface"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="locked">
|
||||||
|
<description summary="lock activation event">
|
||||||
|
Notification that the pointer lock of the seat's pointer is activated.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="unlocked">
|
||||||
|
<description summary="lock deactivation event">
|
||||||
|
Notification that the pointer lock of the seat's pointer is no longer
|
||||||
|
active. If this is a oneshot pointer lock (see
|
||||||
|
wp_pointer_constraints.lifetime) this object is now defunct and should
|
||||||
|
be destroyed. If this is a persistent pointer lock (see
|
||||||
|
wp_pointer_constraints.lifetime) this pointer lock may again
|
||||||
|
reactivate in the future.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zwp_confined_pointer_v1" version="1">
|
||||||
|
<description summary="confined pointer object">
|
||||||
|
The wp_confined_pointer interface represents a confined pointer state.
|
||||||
|
|
||||||
|
This object will send the event 'confined' when the confinement is
|
||||||
|
activated. Whenever the confinement is activated, it is guaranteed that
|
||||||
|
the surface the pointer is confined to will already have received pointer
|
||||||
|
focus and that the pointer will be within the region passed to the request
|
||||||
|
creating this object. It is up to the compositor to decide whether this
|
||||||
|
requires some user interaction and if the pointer will warp to within the
|
||||||
|
passed region if outside.
|
||||||
|
|
||||||
|
To unconfine the pointer, send the destroy request. This will also destroy
|
||||||
|
the wp_confined_pointer object.
|
||||||
|
|
||||||
|
If the compositor decides to unconfine the pointer the unconfined event is
|
||||||
|
sent. The wp_confined_pointer object is at this point defunct and should
|
||||||
|
be destroyed.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the confined pointer object">
|
||||||
|
Destroy the confined pointer object. If applicable, the compositor will
|
||||||
|
unconfine the pointer.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_region">
|
||||||
|
<description summary="set a new confine region">
|
||||||
|
Set a new region used to confine the pointer.
|
||||||
|
|
||||||
|
The new confine region is double-buffered. The new confine region will
|
||||||
|
only take effect when the associated surface gets its pending state
|
||||||
|
applied. See wl_surface.commit for details.
|
||||||
|
|
||||||
|
If the confinement is active when the new confinement region is applied
|
||||||
|
and the pointer ends up outside of newly applied region, the pointer may
|
||||||
|
warped to a position within the new confinement region. If warped, a
|
||||||
|
wl_pointer.motion event will be emitted, but no
|
||||||
|
wp_relative_pointer.relative_motion event.
|
||||||
|
|
||||||
|
The compositor may also, instead of using the new region, unconfine the
|
||||||
|
pointer.
|
||||||
|
|
||||||
|
For details about the confine region, see wp_confined_pointer.
|
||||||
|
</description>
|
||||||
|
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||||
|
summary="region of surface"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="confined">
|
||||||
|
<description summary="pointer confined">
|
||||||
|
Notification that the pointer confinement of the seat's pointer is
|
||||||
|
activated.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="unconfined">
|
||||||
|
<description summary="pointer unconfined">
|
||||||
|
Notification that the pointer confinement of the seat's pointer is no
|
||||||
|
longer active. If this is a oneshot pointer confinement (see
|
||||||
|
wp_pointer_constraints.lifetime) this object is now defunct and should
|
||||||
|
be destroyed. If this is a persistent pointer confinement (see
|
||||||
|
wp_pointer_constraints.lifetime) this pointer confinement may again
|
||||||
|
reactivate in the future.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
</protocol>
|
136
deps/wayland/relative-pointer-unstable-v1.xml
vendored
Normal file
136
deps/wayland/relative-pointer-unstable-v1.xml
vendored
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="relative_pointer_unstable_v1">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2014 Jonas Ådahl
|
||||||
|
Copyright © 2015 Red Hat Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<description summary="protocol for relative pointer motion events">
|
||||||
|
This protocol specifies a set of interfaces used for making clients able to
|
||||||
|
receive relative pointer events not obstructed by barriers (such as the
|
||||||
|
monitor edge or other pointer barriers).
|
||||||
|
|
||||||
|
To start receiving relative pointer events, a client must first bind the
|
||||||
|
global interface "wp_relative_pointer_manager" which, if a compositor
|
||||||
|
supports relative pointer motion events, is exposed by the registry. After
|
||||||
|
having created the relative pointer manager proxy object, the client uses
|
||||||
|
it to create the actual relative pointer object using the
|
||||||
|
"get_relative_pointer" request given a wl_pointer. The relative pointer
|
||||||
|
motion events will then, when applicable, be transmitted via the proxy of
|
||||||
|
the newly created relative pointer object. See the documentation of the
|
||||||
|
relative pointer interface for more details.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is experimental and backward
|
||||||
|
incompatible changes may be made. Backward compatible changes may be added
|
||||||
|
together with the corresponding interface version bump. Backward
|
||||||
|
incompatible changes are done by bumping the version number in the protocol
|
||||||
|
and interface names and resetting the interface version. Once the protocol
|
||||||
|
is to be declared stable, the 'z' prefix and the version number in the
|
||||||
|
protocol and interface names are removed and the interface version number is
|
||||||
|
reset.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<interface name="zwp_relative_pointer_manager_v1" version="1">
|
||||||
|
<description summary="get relative pointer objects">
|
||||||
|
A global interface used for getting the relative pointer object for a
|
||||||
|
given pointer.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the relative pointer manager object">
|
||||||
|
Used by the client to notify the server that it will no longer use this
|
||||||
|
relative pointer manager object.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_relative_pointer">
|
||||||
|
<description summary="get a relative pointer object">
|
||||||
|
Create a relative pointer interface given a wl_pointer object. See the
|
||||||
|
wp_relative_pointer interface for more details.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zwp_relative_pointer_v1"/>
|
||||||
|
<arg name="pointer" type="object" interface="wl_pointer"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zwp_relative_pointer_v1" version="1">
|
||||||
|
<description summary="relative pointer object">
|
||||||
|
A wp_relative_pointer object is an extension to the wl_pointer interface
|
||||||
|
used for emitting relative pointer events. It shares the same focus as
|
||||||
|
wl_pointer objects of the same seat and will only emit events when it has
|
||||||
|
focus.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="release the relative pointer object"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="relative_motion">
|
||||||
|
<description summary="relative pointer motion">
|
||||||
|
Relative x/y pointer motion from the pointer of the seat associated with
|
||||||
|
this object.
|
||||||
|
|
||||||
|
A relative motion is in the same dimension as regular wl_pointer motion
|
||||||
|
events, except they do not represent an absolute position. For example,
|
||||||
|
moving a pointer from (x, y) to (x', y') would have the equivalent
|
||||||
|
relative motion (x' - x, y' - y). If a pointer motion caused the
|
||||||
|
absolute pointer position to be clipped by for example the edge of the
|
||||||
|
monitor, the relative motion is unaffected by the clipping and will
|
||||||
|
represent the unclipped motion.
|
||||||
|
|
||||||
|
This event also contains non-accelerated motion deltas. The
|
||||||
|
non-accelerated delta is, when applicable, the regular pointer motion
|
||||||
|
delta as it was before having applied motion acceleration and other
|
||||||
|
transformations such as normalization.
|
||||||
|
|
||||||
|
Note that the non-accelerated delta does not represent 'raw' events as
|
||||||
|
they were read from some device. Pointer motion acceleration is device-
|
||||||
|
and configuration-specific and non-accelerated deltas and accelerated
|
||||||
|
deltas may have the same value on some devices.
|
||||||
|
|
||||||
|
Relative motions are not coupled to wl_pointer.motion events, and can be
|
||||||
|
sent in combination with such events, but also independently. There may
|
||||||
|
also be scenarios where wl_pointer.motion is sent, but there is no
|
||||||
|
relative motion. The order of an absolute and relative motion event
|
||||||
|
originating from the same physical motion is not guaranteed.
|
||||||
|
|
||||||
|
If the client needs button events or focus state, it can receive them
|
||||||
|
from a wl_pointer object of the same seat that the wp_relative_pointer
|
||||||
|
object is associated with.
|
||||||
|
</description>
|
||||||
|
<arg name="utime_hi" type="uint"
|
||||||
|
summary="high 32 bits of a 64 bit timestamp with microsecond granularity"/>
|
||||||
|
<arg name="utime_lo" type="uint"
|
||||||
|
summary="low 32 bits of a 64 bit timestamp with microsecond granularity"/>
|
||||||
|
<arg name="dx" type="fixed"
|
||||||
|
summary="the x component of the motion vector"/>
|
||||||
|
<arg name="dy" type="fixed"
|
||||||
|
summary="the y component of the motion vector"/>
|
||||||
|
<arg name="dx_unaccel" type="fixed"
|
||||||
|
summary="the x component of the unaccelerated motion vector"/>
|
||||||
|
<arg name="dy_unaccel" type="fixed"
|
||||||
|
summary="the y component of the unaccelerated motion vector"/>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
</protocol>
|
180
deps/wayland/viewporter.xml
vendored
Normal file
180
deps/wayland/viewporter.xml
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="viewporter">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2013-2016 Collabora, Ltd.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<interface name="wp_viewporter" version="1">
|
||||||
|
<description summary="surface cropping and scaling">
|
||||||
|
The global interface exposing surface cropping and scaling
|
||||||
|
capabilities is used to instantiate an interface extension for a
|
||||||
|
wl_surface object. This extended interface will then allow
|
||||||
|
cropping and scaling the surface contents, effectively
|
||||||
|
disconnecting the direct relationship between the buffer and the
|
||||||
|
surface size.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="unbind from the cropping and scaling interface">
|
||||||
|
Informs the server that the client will not be using this
|
||||||
|
protocol object anymore. This does not affect any other objects,
|
||||||
|
wp_viewport objects included.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="viewport_exists" value="0"
|
||||||
|
summary="the surface already has a viewport object associated"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="get_viewport">
|
||||||
|
<description summary="extend surface interface for crop and scale">
|
||||||
|
Instantiate an interface extension for the given wl_surface to
|
||||||
|
crop and scale its content. If the given wl_surface already has
|
||||||
|
a wp_viewport object associated, the viewport_exists
|
||||||
|
protocol error is raised.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="wp_viewport"
|
||||||
|
summary="the new viewport interface id"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="the surface"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="wp_viewport" version="1">
|
||||||
|
<description summary="crop and scale interface to a wl_surface">
|
||||||
|
An additional interface to a wl_surface object, which allows the
|
||||||
|
client to specify the cropping and scaling of the surface
|
||||||
|
contents.
|
||||||
|
|
||||||
|
This interface works with two concepts: the source rectangle (src_x,
|
||||||
|
src_y, src_width, src_height), and the destination size (dst_width,
|
||||||
|
dst_height). The contents of the source rectangle are scaled to the
|
||||||
|
destination size, and content outside the source rectangle is ignored.
|
||||||
|
This state is double-buffered, and is applied on the next
|
||||||
|
wl_surface.commit.
|
||||||
|
|
||||||
|
The two parts of crop and scale state are independent: the source
|
||||||
|
rectangle, and the destination size. Initially both are unset, that
|
||||||
|
is, no scaling is applied. The whole of the current wl_buffer is
|
||||||
|
used as the source, and the surface size is as defined in
|
||||||
|
wl_surface.attach.
|
||||||
|
|
||||||
|
If the destination size is set, it causes the surface size to become
|
||||||
|
dst_width, dst_height. The source (rectangle) is scaled to exactly
|
||||||
|
this size. This overrides whatever the attached wl_buffer size is,
|
||||||
|
unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
|
||||||
|
has no content and therefore no size. Otherwise, the size is always
|
||||||
|
at least 1x1 in surface local coordinates.
|
||||||
|
|
||||||
|
If the source rectangle is set, it defines what area of the wl_buffer is
|
||||||
|
taken as the source. If the source rectangle is set and the destination
|
||||||
|
size is not set, then src_width and src_height must be integers, and the
|
||||||
|
surface size becomes the source rectangle size. This results in cropping
|
||||||
|
without scaling. If src_width or src_height are not integers and
|
||||||
|
destination size is not set, the bad_size protocol error is raised when
|
||||||
|
the surface state is applied.
|
||||||
|
|
||||||
|
The coordinate transformations from buffer pixel coordinates up to
|
||||||
|
the surface-local coordinates happen in the following order:
|
||||||
|
1. buffer_transform (wl_surface.set_buffer_transform)
|
||||||
|
2. buffer_scale (wl_surface.set_buffer_scale)
|
||||||
|
3. crop and scale (wp_viewport.set*)
|
||||||
|
This means, that the source rectangle coordinates of crop and scale
|
||||||
|
are given in the coordinates after the buffer transform and scale,
|
||||||
|
i.e. in the coordinates that would be the surface-local coordinates
|
||||||
|
if the crop and scale was not applied.
|
||||||
|
|
||||||
|
If src_x or src_y are negative, the bad_value protocol error is raised.
|
||||||
|
Otherwise, if the source rectangle is partially or completely outside of
|
||||||
|
the non-NULL wl_buffer, then the out_of_buffer protocol error is raised
|
||||||
|
when the surface state is applied. A NULL wl_buffer does not raise the
|
||||||
|
out_of_buffer error.
|
||||||
|
|
||||||
|
If the wl_surface associated with the wp_viewport is destroyed,
|
||||||
|
all wp_viewport requests except 'destroy' raise the protocol error
|
||||||
|
no_surface.
|
||||||
|
|
||||||
|
If the wp_viewport object is destroyed, the crop and scale
|
||||||
|
state is removed from the wl_surface. The change will be applied
|
||||||
|
on the next wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="remove scaling and cropping from the surface">
|
||||||
|
The associated wl_surface's crop and scale state is removed.
|
||||||
|
The change is applied on the next wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="bad_value" value="0"
|
||||||
|
summary="negative or zero values in width or height"/>
|
||||||
|
<entry name="bad_size" value="1"
|
||||||
|
summary="destination size is not integer"/>
|
||||||
|
<entry name="out_of_buffer" value="2"
|
||||||
|
summary="source rectangle extends outside of the content area"/>
|
||||||
|
<entry name="no_surface" value="3"
|
||||||
|
summary="the wl_surface was destroyed"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="set_source">
|
||||||
|
<description summary="set the source rectangle for cropping">
|
||||||
|
Set the source rectangle of the associated wl_surface. See
|
||||||
|
wp_viewport for the description, and relation to the wl_buffer
|
||||||
|
size.
|
||||||
|
|
||||||
|
If all of x, y, width and height are -1.0, the source rectangle is
|
||||||
|
unset instead. Any other set of values where width or height are zero
|
||||||
|
or negative, or x or y are negative, raise the bad_value protocol
|
||||||
|
error.
|
||||||
|
|
||||||
|
The crop and scale state is double-buffered state, and will be
|
||||||
|
applied on the next wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="x" type="fixed" summary="source rectangle x"/>
|
||||||
|
<arg name="y" type="fixed" summary="source rectangle y"/>
|
||||||
|
<arg name="width" type="fixed" summary="source rectangle width"/>
|
||||||
|
<arg name="height" type="fixed" summary="source rectangle height"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_destination">
|
||||||
|
<description summary="set the surface size for scaling">
|
||||||
|
Set the destination size of the associated wl_surface. See
|
||||||
|
wp_viewport for the description, and relation to the wl_buffer
|
||||||
|
size.
|
||||||
|
|
||||||
|
If width is -1 and height is -1, the destination size is unset
|
||||||
|
instead. Any other pair of values for width and height that
|
||||||
|
contains zero or negative values raises the bad_value protocol
|
||||||
|
error.
|
||||||
|
|
||||||
|
The crop and scale state is double-buffered state, and will be
|
||||||
|
applied on the next wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="width" type="int" summary="surface width"/>
|
||||||
|
<arg name="height" type="int" summary="surface height"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
</protocol>
|
3151
deps/wayland/wayland.xml
vendored
Normal file
3151
deps/wayland/wayland.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
200
deps/wayland/xdg-activation-v1.xml
vendored
Normal file
200
deps/wayland/xdg-activation-v1.xml
vendored
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="xdg_activation_v1">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||||
|
Copyright © 2020 Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<description summary="Protocol for requesting activation of surfaces">
|
||||||
|
The way for a client to pass focus to another toplevel is as follows.
|
||||||
|
|
||||||
|
The client that intends to activate another toplevel uses the
|
||||||
|
xdg_activation_v1.get_activation_token request to get an activation token.
|
||||||
|
This token is then forwarded to the client, which is supposed to activate
|
||||||
|
one of its surfaces, through a separate band of communication.
|
||||||
|
|
||||||
|
One established way of doing this is through the XDG_ACTIVATION_TOKEN
|
||||||
|
environment variable of a newly launched child process. The child process
|
||||||
|
should unset the environment variable again right after reading it out in
|
||||||
|
order to avoid propagating it to other child processes.
|
||||||
|
|
||||||
|
Another established way exists for Applications implementing the D-Bus
|
||||||
|
interface org.freedesktop.Application, which should get their token under
|
||||||
|
activation-token on their platform_data.
|
||||||
|
|
||||||
|
In general activation tokens may be transferred across clients through
|
||||||
|
means not described in this protocol.
|
||||||
|
|
||||||
|
The client to be activated will then pass the token
|
||||||
|
it received to the xdg_activation_v1.activate request. The compositor can
|
||||||
|
then use this token to decide how to react to the activation request.
|
||||||
|
|
||||||
|
The token the activating client gets may be ineffective either already at
|
||||||
|
the time it receives it, for example if it was not focused, for focus
|
||||||
|
stealing prevention. The activating client will have no way to discover
|
||||||
|
the validity of the token, and may still forward it to the to be activated
|
||||||
|
client.
|
||||||
|
|
||||||
|
The created activation token may optionally get information attached to it
|
||||||
|
that can be used by the compositor to identify the application that we
|
||||||
|
intend to activate. This can for example be used to display a visual hint
|
||||||
|
about what application is being started.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is currently in the testing
|
||||||
|
phase. Backward compatible changes may be added together with the
|
||||||
|
corresponding interface version bump. Backward incompatible changes can
|
||||||
|
only be done by creating a new major version of the extension.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<interface name="xdg_activation_v1" version="1">
|
||||||
|
<description summary="interface for activating surfaces">
|
||||||
|
A global interface used for informing the compositor about applications
|
||||||
|
being activated or started, or for applications to request to be
|
||||||
|
activated.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the xdg_activation object">
|
||||||
|
Notify the compositor that the xdg_activation object will no longer be
|
||||||
|
used.
|
||||||
|
|
||||||
|
The child objects created via this interface are unaffected and should
|
||||||
|
be destroyed separately.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_activation_token">
|
||||||
|
<description summary="requests a token">
|
||||||
|
Creates an xdg_activation_token_v1 object that will provide
|
||||||
|
the initiating client with a unique token for this activation. This
|
||||||
|
token should be offered to the clients to be activated.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<arg name="id" type="new_id" interface="xdg_activation_token_v1"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="activate">
|
||||||
|
<description summary="notify new interaction being available">
|
||||||
|
Requests surface activation. It's up to the compositor to display
|
||||||
|
this information as desired, for example by placing the surface above
|
||||||
|
the rest.
|
||||||
|
|
||||||
|
The compositor may know who requested this by checking the activation
|
||||||
|
token and might decide not to follow through with the activation if it's
|
||||||
|
considered unwanted.
|
||||||
|
|
||||||
|
Compositors can ignore unknown activation tokens when an invalid
|
||||||
|
token is passed.
|
||||||
|
</description>
|
||||||
|
<arg name="token" type="string" summary="the activation token of the initiating client"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="the wl_surface to activate"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="xdg_activation_token_v1" version="1">
|
||||||
|
<description summary="an exported activation handle">
|
||||||
|
An object for setting up a token and receiving a token handle that can
|
||||||
|
be passed as an activation token to another client.
|
||||||
|
|
||||||
|
The object is created using the xdg_activation_v1.get_activation_token
|
||||||
|
request. This object should then be populated with the app_id, surface
|
||||||
|
and serial information and committed. The compositor shall then issue a
|
||||||
|
done event with the token. In case the request's parameters are invalid,
|
||||||
|
the compositor will provide an invalid token.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="already_used" value="0"
|
||||||
|
summary="The token has already been used previously"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="set_serial">
|
||||||
|
<description summary="specifies the seat and serial of the activating event">
|
||||||
|
Provides information about the seat and serial event that requested the
|
||||||
|
token.
|
||||||
|
|
||||||
|
The serial can come from an input or focus event. For instance, if a
|
||||||
|
click triggers the launch of a third-party client, the launcher client
|
||||||
|
should send a set_serial request with the serial and seat from the
|
||||||
|
wl_pointer.button event.
|
||||||
|
|
||||||
|
Some compositors might refuse to activate toplevels when the token
|
||||||
|
doesn't have a valid and recent enough event serial.
|
||||||
|
|
||||||
|
Must be sent before commit. This information is optional.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint"
|
||||||
|
summary="the serial of the event that triggered the activation"/>
|
||||||
|
<arg name="seat" type="object" interface="wl_seat"
|
||||||
|
summary="the wl_seat of the event"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_app_id">
|
||||||
|
<description summary="specifies the application being activated">
|
||||||
|
The requesting client can specify an app_id to associate the token
|
||||||
|
being created with it.
|
||||||
|
|
||||||
|
Must be sent before commit. This information is optional.
|
||||||
|
</description>
|
||||||
|
<arg name="app_id" type="string"
|
||||||
|
summary="the application id of the client being activated."/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_surface">
|
||||||
|
<description summary="specifies the surface requesting activation">
|
||||||
|
This request sets the surface requesting the activation. Note, this is
|
||||||
|
different from the surface that will be activated.
|
||||||
|
|
||||||
|
Some compositors might refuse to activate toplevels when the token
|
||||||
|
doesn't have a requesting surface.
|
||||||
|
|
||||||
|
Must be sent before commit. This information is optional.
|
||||||
|
</description>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"
|
||||||
|
summary="the requesting surface"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="commit">
|
||||||
|
<description summary="issues the token request">
|
||||||
|
Requests an activation token based on the different parameters that
|
||||||
|
have been offered through set_serial, set_surface and set_app_id.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="done">
|
||||||
|
<description summary="the exported activation token">
|
||||||
|
The 'done' event contains the unique token of this activation request
|
||||||
|
and notifies that the provider is done.
|
||||||
|
</description>
|
||||||
|
<arg name="token" type="string" summary="the exported activation token"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the xdg_activation_token_v1 object">
|
||||||
|
Notify the compositor that the xdg_activation_token_v1 object will no
|
||||||
|
longer be used. The received token stays valid.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
156
deps/wayland/xdg-decoration-unstable-v1.xml
vendored
Normal file
156
deps/wayland/xdg-decoration-unstable-v1.xml
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="xdg_decoration_unstable_v1">
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2018 Simon Ser
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice (including the next
|
||||||
|
paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<interface name="zxdg_decoration_manager_v1" version="1">
|
||||||
|
<description summary="window decoration manager">
|
||||||
|
This interface allows a compositor to announce support for server-side
|
||||||
|
decorations.
|
||||||
|
|
||||||
|
A window decoration is a set of window controls as deemed appropriate by
|
||||||
|
the party managing them, such as user interface components used to move,
|
||||||
|
resize and change a window's state.
|
||||||
|
|
||||||
|
A client can use this protocol to request being decorated by a supporting
|
||||||
|
compositor.
|
||||||
|
|
||||||
|
If compositor and client do not negotiate the use of a server-side
|
||||||
|
decoration using this protocol, clients continue to self-decorate as they
|
||||||
|
see fit.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is experimental and
|
||||||
|
backward incompatible changes may be made. Backward compatible changes
|
||||||
|
may be added together with the corresponding interface version bump.
|
||||||
|
Backward incompatible changes are done by bumping the version number in
|
||||||
|
the protocol and interface names and resetting the interface version.
|
||||||
|
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||||
|
version number in the protocol and interface names are removed and the
|
||||||
|
interface version number is reset.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the decoration manager object">
|
||||||
|
Destroy the decoration manager. This doesn't destroy objects created
|
||||||
|
with the manager.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_toplevel_decoration">
|
||||||
|
<description summary="create a new toplevel decoration object">
|
||||||
|
Create a new decoration object associated with the given toplevel.
|
||||||
|
|
||||||
|
Creating an xdg_toplevel_decoration from an xdg_toplevel which has a
|
||||||
|
buffer attached or committed is a client error, and any attempts by a
|
||||||
|
client to attach or manipulate a buffer prior to the first
|
||||||
|
xdg_toplevel_decoration.configure event must also be treated as
|
||||||
|
errors.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zxdg_toplevel_decoration_v1"/>
|
||||||
|
<arg name="toplevel" type="object" interface="xdg_toplevel"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zxdg_toplevel_decoration_v1" version="1">
|
||||||
|
<description summary="decoration object for a toplevel surface">
|
||||||
|
The decoration object allows the compositor to toggle server-side window
|
||||||
|
decorations for a toplevel surface. The client can request to switch to
|
||||||
|
another mode.
|
||||||
|
|
||||||
|
The xdg_toplevel_decoration object must be destroyed before its
|
||||||
|
xdg_toplevel.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="unconfigured_buffer" value="0"
|
||||||
|
summary="xdg_toplevel has a buffer attached before configure"/>
|
||||||
|
<entry name="already_constructed" value="1"
|
||||||
|
summary="xdg_toplevel already has a decoration object"/>
|
||||||
|
<entry name="orphaned" value="2"
|
||||||
|
summary="xdg_toplevel destroyed before the decoration object"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the decoration object">
|
||||||
|
Switch back to a mode without any server-side decorations at the next
|
||||||
|
commit.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="mode">
|
||||||
|
<description summary="window decoration modes">
|
||||||
|
These values describe window decoration modes.
|
||||||
|
</description>
|
||||||
|
<entry name="client_side" value="1"
|
||||||
|
summary="no server-side window decoration"/>
|
||||||
|
<entry name="server_side" value="2"
|
||||||
|
summary="server-side window decoration"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="set_mode">
|
||||||
|
<description summary="set the decoration mode">
|
||||||
|
Set the toplevel surface decoration mode. This informs the compositor
|
||||||
|
that the client prefers the provided decoration mode.
|
||||||
|
|
||||||
|
After requesting a decoration mode, the compositor will respond by
|
||||||
|
emitting an xdg_surface.configure event. The client should then update
|
||||||
|
its content, drawing it without decorations if the received mode is
|
||||||
|
server-side decorations. The client must also acknowledge the configure
|
||||||
|
when committing the new content (see xdg_surface.ack_configure).
|
||||||
|
|
||||||
|
The compositor can decide not to use the client's mode and enforce a
|
||||||
|
different mode instead.
|
||||||
|
|
||||||
|
Clients whose decoration mode depend on the xdg_toplevel state may send
|
||||||
|
a set_mode request in response to an xdg_surface.configure event and wait
|
||||||
|
for the next xdg_surface.configure event to prevent unwanted state.
|
||||||
|
Such clients are responsible for preventing configure loops and must
|
||||||
|
make sure not to send multiple successive set_mode requests with the
|
||||||
|
same decoration mode.
|
||||||
|
</description>
|
||||||
|
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="unset_mode">
|
||||||
|
<description summary="unset the decoration mode">
|
||||||
|
Unset the toplevel surface decoration mode. This informs the compositor
|
||||||
|
that the client doesn't prefer a particular decoration mode.
|
||||||
|
|
||||||
|
This request has the same semantics as set_mode.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="configure">
|
||||||
|
<description summary="suggest a surface change">
|
||||||
|
The configure event asks the client to change its decoration mode. The
|
||||||
|
configured state should not be applied immediately. Clients must send an
|
||||||
|
ack_configure in response to this event. See xdg_surface.configure and
|
||||||
|
xdg_surface.ack_configure for details.
|
||||||
|
|
||||||
|
A configure event can be sent at any time. The specified mode must be
|
||||||
|
obeyed by the client.
|
||||||
|
</description>
|
||||||
|
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
1370
deps/wayland/xdg-shell.xml
vendored
Normal file
1370
deps/wayland/xdg-shell.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,32 +1,57 @@
|
|||||||
|
|
||||||
set(glfw_DOCS_SOURCES
|
# NOTE: The order of this list determines the order of items in the Guides
|
||||||
|
# (i.e. Pages) list in the generated documentation
|
||||||
|
set(source_files
|
||||||
|
main.md
|
||||||
|
news.md
|
||||||
|
quick.md
|
||||||
|
moving.md
|
||||||
|
compile.md
|
||||||
|
build.md
|
||||||
|
intro.md
|
||||||
|
context.md
|
||||||
|
monitor.md
|
||||||
|
window.md
|
||||||
|
input.md
|
||||||
|
vulkan.md
|
||||||
|
compat.md
|
||||||
|
internal.md)
|
||||||
|
|
||||||
|
set(extra_files DoxygenLayout.xml header.html footer.html extra.css spaces.svg)
|
||||||
|
|
||||||
|
set(header_paths
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h")
|
||||||
"${GLFW_SOURCE_DIR}/docs/main.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/news.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/moving.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/quick.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/compile.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/build.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/intro.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/context.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/monitor.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/window.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/input.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/vulkan.dox"
|
|
||||||
"${GLFW_SOURCE_DIR}/docs/compat.dox")
|
|
||||||
|
|
||||||
if (GLFW_DOCUMENT_INTERNALS)
|
# Format the source list into a Doxyfile INPUT value that Doxygen can parse
|
||||||
list(APPEND glfw_DOCS_SOURCES "${GLFW_SOURCE_DIR}/src/internal.h")
|
foreach(path IN LISTS header_paths)
|
||||||
endif()
|
string(APPEND GLFW_DOXYGEN_INPUT " \\\n\"${path}\"")
|
||||||
|
endforeach()
|
||||||
foreach(arg ${glfw_DOCS_SOURCES})
|
foreach(file IN LISTS source_files)
|
||||||
set(GLFW_DOCS_SOURCES "${GLFW_DOCS_SOURCES} ${arg}")
|
string(APPEND GLFW_DOXYGEN_INPUT " \\\n\"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
configure_file(Doxyfile.in Doxyfile @ONLY)
|
set(DOXYGEN_SKIP_DOT TRUE)
|
||||||
|
find_package(Doxygen)
|
||||||
add_custom_target(docs ALL "${DOXYGEN_EXECUTABLE}"
|
|
||||||
WORKING_DIRECTORY "${GLFW_BINARY_DIR}/docs"
|
if (NOT DOXYGEN_FOUND OR DOXYGEN_VERSION VERSION_LESS "1.9.8")
|
||||||
COMMENT "Generating HTML documentation" VERBATIM)
|
message(STATUS "Documentation generation requires Doxygen 1.9.8 or later")
|
||||||
|
else()
|
||||||
|
configure_file(Doxyfile.in Doxyfile @ONLY)
|
||||||
|
add_custom_command(OUTPUT "html/index.html"
|
||||||
|
COMMAND "${DOXYGEN_EXECUTABLE}"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
MAIN_DEPENDENCY Doxyfile
|
||||||
|
DEPENDS ${header_paths} ${source_files} ${extra_files}
|
||||||
|
COMMENT "Generating HTML documentation"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
add_custom_target(docs ALL SOURCES "html/index.html")
|
||||||
|
set_target_properties(docs PROPERTIES FOLDER "GLFW3")
|
||||||
|
|
||||||
|
if (GLFW_INSTALL)
|
||||||
|
install(DIRECTORY "${GLFW_BINARY_DIR}/docs/html"
|
||||||
|
DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
- [Reporting a segfault or other crash bug](#reporting-a-segfault-or-other-crash-bug)
|
- [Reporting a segfault or other crash bug](#reporting-a-segfault-or-other-crash-bug)
|
||||||
- [Reporting a context creation bug](#reporting-a-context-creation-bug)
|
- [Reporting a context creation bug](#reporting-a-context-creation-bug)
|
||||||
- [Reporting a monitor or video mode bug](#reporting-a-monitor-or-video-mode-bug)
|
- [Reporting a monitor or video mode bug](#reporting-a-monitor-or-video-mode-bug)
|
||||||
- [Reporting an input or event bug](#reporting-an-input-or-event-bug)
|
- [Reporting a window, input or event bug](#reporting-a-window-input-or-event-bug)
|
||||||
- [Reporting some other library bug](#reporting-some-other-library-bug)
|
- [Reporting some other library bug](#reporting-some-other-library-bug)
|
||||||
- [Reporting a documentation bug](#reporting-a-documentation-bug)
|
- [Reporting a documentation bug](#reporting-a-documentation-bug)
|
||||||
- [Reporting a website bug](#reporting-a-website-bug)
|
- [Reporting a website bug](#reporting-a-website-bug)
|
||||||
@ -20,37 +20,57 @@
|
|||||||
## Asking a question
|
## Asking a question
|
||||||
|
|
||||||
Questions about how to use GLFW should be asked either in the [support
|
Questions about how to use GLFW should be asked either in the [support
|
||||||
section](http://discourse.glfw.org/c/support) of the forum, under the [Stack
|
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.
|
||||||
[Freenode](http://freenode.net/).
|
|
||||||
|
|
||||||
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](http://discourse.glfw.org/c/dev) of the
|
should be asked in the [dev section](https://discourse.glfw.org/c/dev) of the
|
||||||
forum or in the IRC channel. Please don't open a GitHub issue to discuss design
|
forum. Please don't open a GitHub issue to discuss design questions without
|
||||||
questions without first checking with a maintainer.
|
first checking with a maintainer.
|
||||||
|
|
||||||
|
|
||||||
## Reporting a bug
|
## Reporting a bug
|
||||||
|
|
||||||
If GLFW is behaving unexpectedly at run-time, start by setting an [error
|
If GLFW is behaving unexpectedly at run-time, start by setting an [error
|
||||||
callback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling).
|
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling).
|
||||||
GLFW will often tell you the cause of an error via this callback. If it
|
GLFW will often tell you the cause of an error via this callback. If it
|
||||||
doesn't, that might be a separate bug.
|
doesn't, that might be a separate bug.
|
||||||
|
|
||||||
If GLFW is crashing or triggering asserts, make sure that all your object
|
If GLFW is crashing or triggering asserts, make sure that all your object
|
||||||
handles and other pointers are valid.
|
handles and other pointers are valid.
|
||||||
|
|
||||||
For bugs where it makes sense, a [Short, Self Contained, Correct (Compilable),
|
For bugs where it makes sense, a short, self contained example is absolutely
|
||||||
Example](http://www.sscce.org/) is absolutely invaluable. Just put it inline in
|
invaluable. Just put it inline in the body text. Note that if the bug is
|
||||||
the body text. Note that if the bug is reproducible with one of the test
|
reproducible with one of the test programs that come with GLFW, just mention
|
||||||
programs that come with GLFW, just mention that instead.
|
that instead.
|
||||||
|
|
||||||
__Don't worry about adding too much information__. Unimportant information can
|
__Don't worry about adding too much information__. Unimportant information can
|
||||||
be abbreviated or removed later, but missing information can stall bug fixing,
|
be abbreviated or removed later, but missing information can stall bug fixing,
|
||||||
especially when your schedule doesn't align with that of the maintainer.
|
especially when your schedule doesn't align with that of the maintainer.
|
||||||
|
|
||||||
|
__Please provide text as text, not as images__. This includes code, error
|
||||||
|
messages and any other text. Text in images cannot be found by other users
|
||||||
|
searching for the same problem and may have to be re-typed by maintainers when
|
||||||
|
debugging.
|
||||||
|
|
||||||
|
You don't need to manually indent your code or other text to quote it with
|
||||||
|
GitHub Markdown; just surround it with triple backticks:
|
||||||
|
|
||||||
|
```
|
||||||
|
Some quoted text.
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also add syntax highlighting by appending the common file extension:
|
||||||
|
|
||||||
|
```c
|
||||||
|
int five(void)
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
There are issue labels for both platforms and GPU manufacturers, so there is no
|
There are issue labels for both platforms and GPU manufacturers, so there is no
|
||||||
need to mention these in the subject line. If you do, it will be removed when
|
need to mention these in the subject line. If you do, it will be removed when
|
||||||
the issue is labeled.
|
the issue is labeled.
|
||||||
@ -66,8 +86,8 @@ means linking to many system libraries. If you are using GLFW as a static
|
|||||||
library, that means your application needs to link to these in addition to GLFW.
|
library, that means your application needs to link to these in addition to GLFW.
|
||||||
|
|
||||||
__Note:__ Check the [Compiling
|
__Note:__ Check the [Compiling
|
||||||
GLFW](http://www.glfw.org/docs/latest/compile.html) guide and or [Building
|
GLFW](https://www.glfw.org/docs/latest/compile.html) guide and or [Building
|
||||||
applications](http://www.glfw.org/docs/latest/build.html) guide for before
|
applications](https://www.glfw.org/docs/latest/build.html) guide for before
|
||||||
opening an issue of this kind. Most issues are caused by a missing package or
|
opening an issue of this kind. Most issues are caused by a missing package or
|
||||||
linker flag.
|
linker flag.
|
||||||
|
|
||||||
@ -100,7 +120,7 @@ __GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
Please also include any __error messages__ provided to your application via the
|
||||||
[error
|
[error
|
||||||
callback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
||||||
the __full call stack__ of the crash, or if the crash does not occur in debug
|
the __full call stack__ of the crash, or if the crash does not occur in debug
|
||||||
mode, mention that instead.
|
mode, mention that instead.
|
||||||
|
|
||||||
@ -120,13 +140,13 @@ Call stack:
|
|||||||
__Note:__ Windows ships with graphics drivers that do not support OpenGL. If
|
__Note:__ Windows ships with graphics drivers that do not support OpenGL. If
|
||||||
GLFW says that your machine lacks support for OpenGL, it very likely does.
|
GLFW says that your machine lacks support for OpenGL, it very likely does.
|
||||||
Install drivers from the computer manufacturer or graphics card manufacturer
|
Install drivers from the computer manufacturer or graphics card manufacturer
|
||||||
([Nvidia](http://www.geforce.com/drivers),
|
([Nvidia](https://www.geforce.com/drivers),
|
||||||
[AMD](http://support.amd.com/en-us/download),
|
[AMD](https://www.amd.com/en/support),
|
||||||
[Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to
|
[Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to
|
||||||
fix this.
|
fix this.
|
||||||
|
|
||||||
__Note:__ AMD only supports OpenGL ES on Windows via EGL. See the
|
__Note:__ AMD only supports OpenGL ES on Windows via EGL. See the
|
||||||
[GLFW\_CONTEXT\_CREATION\_API](http://www.glfw.org/docs/latest/window_guide.html#window_hints_ctx)
|
[GLFW\_CONTEXT\_CREATION\_API](https://www.glfw.org/docs/latest/window_guide.html#window_hints_ctx)
|
||||||
hint for how to select EGL.
|
hint for how to select EGL.
|
||||||
|
|
||||||
Please verify that context creation also fails with the `glfwinfo` tool before
|
Please verify that context creation also fails with the `glfwinfo` tool before
|
||||||
@ -139,9 +159,12 @@ Always include the __operating system name and version__ (e.g. `Windows
|
|||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
||||||
|
|
||||||
|
If you are running your program in a virtual machine, please mention this and
|
||||||
|
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
||||||
|
|
||||||
Please also include the __GLFW version string__ (`3.2.0 X11 EGL clock_gettime
|
Please also include the __GLFW version string__ (`3.2.0 X11 EGL clock_gettime
|
||||||
/dev/js XI Xf86vm`), as described
|
/dev/js`), as described
|
||||||
[here](http://www.glfw.org/docs/latest/intro.html#intro_version_string), the
|
[here](https://www.glfw.org/docs/latest/intro.html#intro_version_string), the
|
||||||
__GPU model and driver version__ (e.g. `GeForce GTX660 with 352.79`), and the
|
__GPU model and driver version__ (e.g. `GeForce GTX660 with 352.79`), and the
|
||||||
__output of `glfwinfo`__ (with switches matching any hints you set in your
|
__output of `glfwinfo`__ (with switches matching any hints you set in your
|
||||||
code) when reporting this kind of bug. If this tool doesn't run on the machine,
|
code) when reporting this kind of bug. If this tool doesn't run on the machine,
|
||||||
@ -178,9 +201,12 @@ Always include the __operating system name and version__ (e.g. `Windows
|
|||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
||||||
|
|
||||||
|
If you are running your program in a virtual machine, please mention this and
|
||||||
|
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
Please also include any __error messages__ provided to your application via the
|
||||||
[error
|
[error
|
||||||
callback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
||||||
the __output of `monitors`__ when reporting this kind of bug. If this tool
|
the __output of `monitors`__ when reporting this kind of bug. If this tool
|
||||||
doesn't run on the machine, mention this instead.
|
doesn't run on the machine, mention this instead.
|
||||||
|
|
||||||
@ -195,13 +221,13 @@ monitors output:
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Reporting an input or event bug
|
### Reporting a window, input or event bug
|
||||||
|
|
||||||
__Note:__ The exact ordering of related window events will sometimes differ.
|
__Note:__ The exact ordering of related window events will sometimes differ.
|
||||||
|
|
||||||
__Note:__ Window moving and resizing (by the user) will block the main thread on some
|
__Note:__ Window moving and resizing (by the user) will block the main thread on
|
||||||
platforms. This is not a bug. Set a [refresh
|
some platforms. This is not a bug. Set a [refresh
|
||||||
callback](http://www.glfw.org/docs/latest/window.html#window_refresh) if you
|
callback](https://www.glfw.org/docs/latest/window.html#window_refresh) if you
|
||||||
want to keep the window contents updated during a move or size operation.
|
want to keep the window contents updated during a move or size operation.
|
||||||
|
|
||||||
The `events` tool is included in the GLFW source tree as `tests/events.c` and is
|
The `events` tool is included in the GLFW source tree as `tests/events.c` and is
|
||||||
@ -215,12 +241,20 @@ Always include the __operating system name and version__ (e.g. `Windows
|
|||||||
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
include the __GLFW release version__ (e.g. `3.1.2`), otherwise include the
|
||||||
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
__GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
||||||
|
|
||||||
|
If you are running your program in a virtual machine, please mention this and
|
||||||
|
include the __VM name and version__ (e.g. `VirtualBox 5.1`).
|
||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
Please also include any __error messages__ provided to your application via the
|
||||||
[error
|
[error
|
||||||
callback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling) and
|
||||||
if relevant, the __output of `events`__ when reporting this kind of bug. If
|
if relevant, the __output of `events`__ when reporting this kind of bug. If
|
||||||
this tool doesn't run on the machine, mention this instead.
|
this tool doesn't run on the machine, mention this instead.
|
||||||
|
|
||||||
|
__X11:__ If possible, please include what desktop environment (e.g. GNOME,
|
||||||
|
Unity, KDE) and/or window manager (e.g. Openbox, dwm, Window Maker) you are
|
||||||
|
running. If the bug is related to keyboard input, please include any input
|
||||||
|
method (e.g. ibus, SCIM) you are using.
|
||||||
|
|
||||||
|
|
||||||
#### Quick template
|
#### Quick template
|
||||||
|
|
||||||
@ -241,7 +275,7 @@ __GLFW commit ID__ (e.g. `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.
|
|||||||
|
|
||||||
Please also include any __error messages__ provided to your application via the
|
Please also include any __error messages__ provided to your application via the
|
||||||
[error
|
[error
|
||||||
callback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling), if
|
callback](https://www.glfw.org/docs/latest/intro_guide.html#error_handling), if
|
||||||
relevant.
|
relevant.
|
||||||
|
|
||||||
|
|
||||||
@ -264,7 +298,7 @@ the source to the output or vice versa.
|
|||||||
### Reporting a website bug
|
### Reporting a website bug
|
||||||
|
|
||||||
If the bug is in the documentation (anything under `/docs/`) then please see the
|
If the bug is in the documentation (anything under `/docs/`) then please see the
|
||||||
section above. Bugs in the rest of the site are reported to to the [website
|
section above. Bugs in the rest of the site are reported to the [website
|
||||||
source repository](https://github.com/glfw/website/issues).
|
source repository](https://github.com/glfw/website/issues).
|
||||||
|
|
||||||
|
|
||||||
@ -292,7 +326,7 @@ a thousand line one, if that is the appropriate size for the fix.
|
|||||||
In addition to the code, a complete bug fix includes:
|
In addition to the code, a complete bug fix includes:
|
||||||
|
|
||||||
- Change log entry in `README.md`, describing the incorrect behavior
|
- Change log entry in `README.md`, describing the incorrect behavior
|
||||||
- Credits entries for all authors of the bug fix
|
- Credits entries in `CONTRIBUTORS.md` for all authors of the bug fix
|
||||||
|
|
||||||
Bug fixes will not be rejected because they don't include all the above parts,
|
Bug fixes will not be rejected because they don't include all the above parts,
|
||||||
but please keep in mind that maintainer time is finite and that there are many
|
but please keep in mind that maintainer time is finite and that there are many
|
||||||
@ -301,6 +335,9 @@ other bugs and features to work on.
|
|||||||
If the patch fixes a bug introduced after the last release, it should not get
|
If the patch fixes a bug introduced after the last release, it should not get
|
||||||
a change log entry.
|
a change log entry.
|
||||||
|
|
||||||
|
If you haven't already, read the excellent article [How to Write a Git Commit
|
||||||
|
Message](https://chris.beams.io/posts/git-commit/).
|
||||||
|
|
||||||
|
|
||||||
## Contributing a feature
|
## Contributing a feature
|
||||||
|
|
||||||
@ -309,18 +346,22 @@ did not write the code yourself, you must explain where it came from and under
|
|||||||
what license. Even code using the same license as GLFW may not be copied
|
what license. Even code using the same license as GLFW may not be copied
|
||||||
without attribution.
|
without attribution.
|
||||||
|
|
||||||
__There is no preferred patch size__. A one character change is just as welcome
|
__Note:__ If you haven't already implemented the feature, check first if there
|
||||||
as one adding a thousand line one, if that is the appropriate size for the
|
already is an open issue for it and if it's already being developed in an
|
||||||
|
[experimental branch](https://github.com/glfw/glfw/branches/all).
|
||||||
|
|
||||||
|
__There is no preferred patch size__. A one-character change is just as welcome
|
||||||
|
as one adding a thousand lines, if that is the appropriate size for the
|
||||||
feature.
|
feature.
|
||||||
|
|
||||||
In addition to the code, a complete feature includes:
|
In addition to the code, a complete feature includes:
|
||||||
|
|
||||||
- Change log entry in `README.md`, listing all new symbols
|
- Change log entry in `README.md`, listing all new symbols
|
||||||
- News page entry, briefly describing the feature
|
- News page entry in `docs/news.md`, briefly describing the feature
|
||||||
- Guide documentation, with minimal examples, in the relevant guide
|
- Guide documentation, with minimal examples, in the relevant guide in the `docs` folder
|
||||||
- Reference documentation, with all applicable tags
|
- Reference documentation, with all applicable tags
|
||||||
- Cross-references and mentions in appropriate places
|
- Cross-references and mentions in appropriate places
|
||||||
- Credits entries for all authors of the feature
|
- Credits entries in `CONTRIBUTORS.md` for all authors of the feature
|
||||||
|
|
||||||
If the feature requires platform-specific code, at minimum stubs must be added
|
If the feature requires platform-specific code, at minimum stubs must be added
|
||||||
for the new platform function to all supported and experimental platforms.
|
for the new platform function to all supported and experimental platforms.
|
||||||
@ -332,7 +373,10 @@ If it adds a new monitor property, support for it must be added to
|
|||||||
|
|
||||||
If it adds a new OpenGL, OpenGL ES or Vulkan option or extension, support
|
If it adds a new OpenGL, OpenGL ES or Vulkan option or extension, support
|
||||||
for it must be added to `tests/glfwinfo.c` and the behavior of the library when
|
for it must be added to `tests/glfwinfo.c` and the behavior of the library when
|
||||||
the extension is missing documented in `docs/compat.dox`.
|
the extension is missing documented in `docs/compat.md`.
|
||||||
|
|
||||||
|
If you haven't already, read the excellent article [How to Write a Git Commit
|
||||||
|
Message](https://chris.beams.io/posts/git-commit/).
|
||||||
|
|
||||||
Features will not be rejected because they don't include all the above parts,
|
Features will not be rejected because they don't include all the above parts,
|
||||||
but please keep in mind that maintainer time is finite and that there are many
|
but please keep in mind that maintainer time is finite and that there are many
|
2860
docs/Doxyfile.in
2860
docs/Doxyfile.in
File diff suppressed because it is too large
Load Diff
@ -1,115 +1,21 @@
|
|||||||
<doxygenlayout version="1.0">
|
<doxygenlayout version="1.0">
|
||||||
<!-- Generated by doxygen 1.8.3.1 -->
|
<!-- Generated by doxygen 1.8.14 -->
|
||||||
<!-- Navigation index tabs for HTML output -->
|
<!-- Navigation index tabs for HTML output -->
|
||||||
<navindex>
|
<navindex>
|
||||||
<tab type="mainpage" visible="yes" title="Introduction"/>
|
<tab type="mainpage" visible="yes" title="Introduction"/>
|
||||||
|
<tab type="user" url="quick_guide.html" title="Tutorial"/>
|
||||||
<tab type="pages" visible="yes" title="Guides" intro=""/>
|
<tab type="pages" visible="yes" title="Guides" intro=""/>
|
||||||
<tab type="modules" visible="yes" title="Reference" intro=""/>
|
<tab type="topics" visible="yes" title="Reference" intro=""/>
|
||||||
<tab type="namespaces" visible="yes" title="">
|
<tab type="filelist" visible="yes" title="Files"/>
|
||||||
<tab type="namespacelist" visible="yes" title="" intro=""/>
|
|
||||||
<tab type="namespacemembers" visible="yes" title="" intro=""/>
|
|
||||||
</tab>
|
|
||||||
<tab type="classes" visible="no" title="">
|
|
||||||
<tab type="classlist" visible="yes" title="" intro=""/>
|
|
||||||
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
|
||||||
<tab type="hierarchy" visible="yes" title="" intro=""/>
|
|
||||||
<tab type="classmembers" visible="yes" title="" intro=""/>
|
|
||||||
</tab>
|
|
||||||
<tab type="files" visible="yes" title="Header Files">
|
|
||||||
<tab type="filelist" visible="yes" title="" intro=""/>
|
|
||||||
<tab type="globals" visible="yes" title="" intro=""/>
|
|
||||||
</tab>
|
|
||||||
<tab type="examples" visible="yes" title="" intro=""/>
|
|
||||||
</navindex>
|
</navindex>
|
||||||
|
|
||||||
<!-- Layout definition for a class page -->
|
|
||||||
<class>
|
|
||||||
<briefdescription visible="yes"/>
|
|
||||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
|
||||||
<inheritancegraph visible="$CLASS_GRAPH"/>
|
|
||||||
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
|
||||||
<memberdecl>
|
|
||||||
<nestedclasses visible="yes" title=""/>
|
|
||||||
<publictypes title=""/>
|
|
||||||
<publicslots title=""/>
|
|
||||||
<signals title=""/>
|
|
||||||
<publicmethods title=""/>
|
|
||||||
<publicstaticmethods title=""/>
|
|
||||||
<publicattributes title=""/>
|
|
||||||
<publicstaticattributes title=""/>
|
|
||||||
<protectedtypes title=""/>
|
|
||||||
<protectedslots title=""/>
|
|
||||||
<protectedmethods title=""/>
|
|
||||||
<protectedstaticmethods title=""/>
|
|
||||||
<protectedattributes title=""/>
|
|
||||||
<protectedstaticattributes title=""/>
|
|
||||||
<packagetypes title=""/>
|
|
||||||
<packagemethods title=""/>
|
|
||||||
<packagestaticmethods title=""/>
|
|
||||||
<packageattributes title=""/>
|
|
||||||
<packagestaticattributes title=""/>
|
|
||||||
<properties title=""/>
|
|
||||||
<events title=""/>
|
|
||||||
<privatetypes title=""/>
|
|
||||||
<privateslots title=""/>
|
|
||||||
<privatemethods title=""/>
|
|
||||||
<privatestaticmethods title=""/>
|
|
||||||
<privateattributes title=""/>
|
|
||||||
<privatestaticattributes title=""/>
|
|
||||||
<friends title=""/>
|
|
||||||
<related title="" subtitle=""/>
|
|
||||||
<membergroups visible="yes"/>
|
|
||||||
</memberdecl>
|
|
||||||
<detaileddescription title=""/>
|
|
||||||
<memberdef>
|
|
||||||
<inlineclasses title=""/>
|
|
||||||
<typedefs title=""/>
|
|
||||||
<enums title=""/>
|
|
||||||
<constructors title=""/>
|
|
||||||
<functions title=""/>
|
|
||||||
<related title=""/>
|
|
||||||
<variables title=""/>
|
|
||||||
<properties title=""/>
|
|
||||||
<events title=""/>
|
|
||||||
</memberdef>
|
|
||||||
<allmemberslink visible="yes"/>
|
|
||||||
<usedfiles visible="$SHOW_USED_FILES"/>
|
|
||||||
<authorsection visible="yes"/>
|
|
||||||
</class>
|
|
||||||
|
|
||||||
<!-- Layout definition for a namespace page -->
|
|
||||||
<namespace>
|
|
||||||
<briefdescription visible="yes"/>
|
|
||||||
<memberdecl>
|
|
||||||
<nestednamespaces visible="yes" title=""/>
|
|
||||||
<classes visible="yes" title=""/>
|
|
||||||
<typedefs title=""/>
|
|
||||||
<enums title=""/>
|
|
||||||
<functions title=""/>
|
|
||||||
<variables title=""/>
|
|
||||||
<membergroups visible="yes"/>
|
|
||||||
</memberdecl>
|
|
||||||
<detaileddescription title=""/>
|
|
||||||
<memberdef>
|
|
||||||
<inlineclasses title=""/>
|
|
||||||
<typedefs title=""/>
|
|
||||||
<enums title=""/>
|
|
||||||
<functions title=""/>
|
|
||||||
<variables title=""/>
|
|
||||||
</memberdef>
|
|
||||||
<authorsection visible="yes"/>
|
|
||||||
</namespace>
|
|
||||||
|
|
||||||
<!-- Layout definition for a file page -->
|
<!-- Layout definition for a file page -->
|
||||||
<file>
|
<file>
|
||||||
<briefdescription visible="yes"/>
|
<detaileddescription title="Description"/>
|
||||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
<includegraph visible="$INCLUDE_GRAPH"/>
|
|
||||||
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
|
||||||
<sourcelink visible="yes"/>
|
<sourcelink visible="yes"/>
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<classes visible="yes" title=""/>
|
<constantgroups visible="yes" title=""/>
|
||||||
<namespaces visible="yes" title=""/>
|
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
@ -117,9 +23,7 @@
|
|||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
<membergroups visible="yes"/>
|
<membergroups visible="yes"/>
|
||||||
</memberdecl>
|
</memberdecl>
|
||||||
<detaileddescription title=""/>
|
|
||||||
<memberdef>
|
<memberdef>
|
||||||
<inlineclasses title=""/>
|
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
@ -131,46 +35,26 @@
|
|||||||
|
|
||||||
<!-- Layout definition for a group page -->
|
<!-- Layout definition for a group page -->
|
||||||
<group>
|
<group>
|
||||||
<briefdescription visible="yes"/>
|
|
||||||
<detaileddescription title="Description"/>
|
<detaileddescription title="Description"/>
|
||||||
<groupgraph visible="$GROUP_GRAPHS"/>
|
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<nestedgroups visible="yes" title=""/>
|
<nestedgroups visible="yes" title=""/>
|
||||||
<dirs visible="yes" title=""/>
|
<dirs visible="yes" title=""/>
|
||||||
<files visible="yes" title=""/>
|
<files visible="yes" title=""/>
|
||||||
<namespaces visible="yes" title=""/>
|
|
||||||
<classes visible="yes" title=""/>
|
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
<enumvalues title=""/>
|
<enumvalues title=""/>
|
||||||
<functions title=""/>
|
<functions title=""/>
|
||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
<signals title=""/>
|
|
||||||
<publicslots title=""/>
|
|
||||||
<protectedslots title=""/>
|
|
||||||
<privateslots title=""/>
|
|
||||||
<events title=""/>
|
|
||||||
<properties title=""/>
|
|
||||||
<friends title=""/>
|
|
||||||
<membergroups visible="yes"/>
|
|
||||||
</memberdecl>
|
</memberdecl>
|
||||||
<memberdef>
|
<memberdef>
|
||||||
<pagedocs/>
|
<pagedocs/>
|
||||||
<inlineclasses title=""/>
|
|
||||||
<defines title=""/>
|
<defines title=""/>
|
||||||
<typedefs title=""/>
|
<typedefs title=""/>
|
||||||
<enums title=""/>
|
<enums title=""/>
|
||||||
<enumvalues title=""/>
|
<enumvalues title=""/>
|
||||||
<functions title=""/>
|
<functions title=""/>
|
||||||
<variables title=""/>
|
<variables title=""/>
|
||||||
<signals title=""/>
|
|
||||||
<publicslots title=""/>
|
|
||||||
<protectedslots title=""/>
|
|
||||||
<privateslots title=""/>
|
|
||||||
<events title=""/>
|
|
||||||
<properties title=""/>
|
|
||||||
<friends title=""/>
|
|
||||||
</memberdef>
|
</memberdef>
|
||||||
<authorsection visible="yes"/>
|
<authorsection visible="yes"/>
|
||||||
</group>
|
</group>
|
||||||
@ -178,7 +62,6 @@
|
|||||||
<!-- Layout definition for a directory page -->
|
<!-- Layout definition for a directory page -->
|
||||||
<directory>
|
<directory>
|
||||||
<briefdescription visible="yes"/>
|
<briefdescription visible="yes"/>
|
||||||
<directorygraph visible="yes"/>
|
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<dirs visible="yes"/>
|
<dirs visible="yes"/>
|
||||||
<files visible="yes"/>
|
<files visible="yes"/>
|
||||||
|
13
docs/SUPPORT.md
Normal file
13
docs/SUPPORT.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Support resources
|
||||||
|
|
||||||
|
See the [latest documentation](https://www.glfw.org/docs/latest/) for tutorials,
|
||||||
|
guides and the API reference.
|
||||||
|
|
||||||
|
If you have questions about using GLFW, we have a
|
||||||
|
[forum](https://discourse.glfw.org/).
|
||||||
|
|
||||||
|
Bugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).
|
||||||
|
Please check the [contribution
|
||||||
|
guide](https://github.com/glfw/glfw/blob/master/docs/CONTRIBUTING.md) for
|
||||||
|
information on what to include when reporting a bug.
|
||||||
|
|
347
docs/build.dox
347
docs/build.dox
@ -1,347 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page build_guide Building applications
|
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This is about compiling and linking applications that use GLFW. For information on
|
|
||||||
how to write such applications, start with the
|
|
||||||
[introductory tutorial](@ref quick_guide). For information on how to compile
|
|
||||||
the GLFW library itself, see @ref compile_guide.
|
|
||||||
|
|
||||||
This is not a tutorial on compilation or linking. It assumes basic
|
|
||||||
understanding of how to compile and link a C program as well as how to use the
|
|
||||||
specific compiler of your chosen development environment. The compilation
|
|
||||||
and linking process should be explained in your C programming material and in
|
|
||||||
the documentation for your development environment.
|
|
||||||
|
|
||||||
@section build_include Including the GLFW header file
|
|
||||||
|
|
||||||
In the source files of your application where you use OpenGL or GLFW, you should
|
|
||||||
include the GLFW header file, i.e.:
|
|
||||||
|
|
||||||
@code
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The GLFW header declares the GLFW API and by default also includes the OpenGL
|
|
||||||
header of your development environment, which in turn defines all the constants,
|
|
||||||
types and function prototypes of the OpenGL API.
|
|
||||||
|
|
||||||
The GLFW header also defines everything necessary for your OpenGL header to
|
|
||||||
function. For example, under Windows you are normally required to include
|
|
||||||
`windows.h` before the OpenGL header, which would pollute your code namespace
|
|
||||||
with the entire Win32 API.
|
|
||||||
|
|
||||||
Instead, the GLFW header takes care of this for you, not by including
|
|
||||||
`windows.h`, but by duplicating only the very few necessary parts of it. It
|
|
||||||
does this only when needed, so if `windows.h` _is_ included, the GLFW header
|
|
||||||
does not try to redefine those symbols. The reverse is not true, i.e.
|
|
||||||
`windows.h` cannot cope if any of its symbols have already been defined.
|
|
||||||
|
|
||||||
In other words:
|
|
||||||
|
|
||||||
- Do _not_ include the OpenGL headers yourself, as GLFW does this for you
|
|
||||||
- Do _not_ include `windows.h` or other platform-specific headers unless you
|
|
||||||
plan on using those APIs directly
|
|
||||||
- If you _do_ need to include such headers, do it _before_ including
|
|
||||||
the GLFW header and it will handle this
|
|
||||||
|
|
||||||
If you are using an OpenGL extension loading library such as
|
|
||||||
[glad](https://github.com/Dav1dde/glad), the extension loader header should
|
|
||||||
either be included _before_ the GLFW one, or the `GLFW_INCLUDE_NONE` macro
|
|
||||||
(described below) should be defined.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_macros GLFW header option macros
|
|
||||||
|
|
||||||
These macros may be defined before the inclusion of the GLFW header and affect
|
|
||||||
its behavior.
|
|
||||||
|
|
||||||
`GLFW_DLL` is required on Windows when using the GLFW DLL, to tell the compiler
|
|
||||||
that the GLFW functions are defined in a DLL.
|
|
||||||
|
|
||||||
The following macros control which OpenGL or OpenGL ES API header is included.
|
|
||||||
Only one of these may be defined at a time.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_GLCOREARB` makes the GLFW header include the modern
|
|
||||||
`GL/glcorearb.h` header (`OpenGL/gl3.h` on OS X) instead of the regular OpenGL
|
|
||||||
header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_ES1` makes the GLFW header include the OpenGL ES 1.x `GLES/gl.h`
|
|
||||||
header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_ES2` makes the GLFW header include the OpenGL ES 2.0 `GLES2/gl2.h`
|
|
||||||
header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_ES3` makes the GLFW header include the OpenGL ES 3.0 `GLES3/gl3.h`
|
|
||||||
header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_ES31` makes the GLFW header include the OpenGL ES 3.1 `GLES3/gl31.h`
|
|
||||||
header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_VULKAN` makes the GLFW header include the Vulkan `vulkan/vulkan.h`
|
|
||||||
header instead of the regular OpenGL header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_NONE` makes the GLFW header not include any OpenGL or OpenGL ES API
|
|
||||||
header. This is useful in combination with an extension loading library.
|
|
||||||
|
|
||||||
If none of the above inclusion macros are defined, the standard OpenGL `GL/gl.h`
|
|
||||||
header (`OpenGL/gl.h` on OS X) is included.
|
|
||||||
|
|
||||||
The following macros control the inclusion of additional API headers. Any
|
|
||||||
number of these may be defined simultaneously, and/or together with one of the
|
|
||||||
above macros.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_GLEXT` makes the GLFW header include the appropriate extension
|
|
||||||
header for the OpenGL or OpenGL ES header selected above after and in addition
|
|
||||||
to that header.
|
|
||||||
|
|
||||||
`GLFW_INCLUDE_GLU` makes the header include the GLU header in addition to the
|
|
||||||
header selected above. This should only be used with the standard OpenGL header
|
|
||||||
and only for compatibility with legacy code. GLU has been deprecated and should
|
|
||||||
not be used in new code.
|
|
||||||
|
|
||||||
@note GLFW does not provide any of the API headers mentioned above. They must
|
|
||||||
be provided by your development environment or your OpenGL, OpenGL ES or Vulkan
|
|
||||||
SDK.
|
|
||||||
|
|
||||||
@note None of these macros may be defined during the compilation of GLFW itself.
|
|
||||||
If your build includes GLFW and you define any these in your build files, make
|
|
||||||
sure they are not applied to the GLFW sources.
|
|
||||||
|
|
||||||
|
|
||||||
@section build_link Link with the right libraries
|
|
||||||
|
|
||||||
GLFW is essentially a wrapper of various platform-specific APIs and therefore
|
|
||||||
needs to link against many different system libraries. If you are using GLFW as
|
|
||||||
a shared library / dynamic library / DLL then it takes care of these links.
|
|
||||||
However, if you are using GLFW as a static library then your executable will
|
|
||||||
need to link against these libraries.
|
|
||||||
|
|
||||||
On Windows and OS X, the list of system libraries is static and can be
|
|
||||||
hard-coded into your build environment. See the section for your development
|
|
||||||
environment below. On Linux and other Unix-like operating systems, the list
|
|
||||||
varies but can be retrieved in various ways as described below.
|
|
||||||
|
|
||||||
A good general introduction to linking is
|
|
||||||
[Beginner's Guide to Linkers](http://www.lurklurk.org/linkers/linkers.html) by
|
|
||||||
David Drysdale.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_win32 With MinGW or Visual C++ on Windows
|
|
||||||
|
|
||||||
The static version of the GLFW library is named `glfw3`. When using this
|
|
||||||
version, it is also necessary to link with some libraries that GLFW uses.
|
|
||||||
|
|
||||||
When linking an application under Windows that uses the static version of GLFW,
|
|
||||||
you must link with `opengl32`. On some versions of MinGW, you must also
|
|
||||||
explicitly link with `gdi32`, while other versions of MinGW include it in the
|
|
||||||
set of default libraries along with other dependencies like `user32` and
|
|
||||||
`kernel32`. If you are using GLU, you must also link with `glu32`.
|
|
||||||
|
|
||||||
The link library for the GLFW DLL is named `glfw3dll`. When compiling an
|
|
||||||
application that uses the DLL version of GLFW, you need to define the `GLFW_DLL`
|
|
||||||
macro _before_ any inclusion of the GLFW header. This can be done either with
|
|
||||||
a compiler switch or by defining it in your source code.
|
|
||||||
|
|
||||||
An application using the GLFW DLL does not need to link against any of its
|
|
||||||
dependencies, but you still have to link against `opengl32` if your application
|
|
||||||
uses OpenGL and `glu32` if it uses GLU.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_cmake_source With CMake and GLFW source
|
|
||||||
|
|
||||||
This section is about using CMake to compile and link GLFW along with your
|
|
||||||
application. If you want to use an installed binary instead, see @ref
|
|
||||||
build_link_cmake_package.
|
|
||||||
|
|
||||||
With just a few changes to your `CMakeLists.txt` you can have the GLFW source
|
|
||||||
tree 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
|
|
||||||
|
|
||||||
Then add the root directory of the GLFW source tree to your project. This
|
|
||||||
will add the `glfw` target and the necessary cache variables to your project.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
add_subdirectory(path/to/glfw)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once GLFW has been added to the project, link against it with the `glfw` target.
|
|
||||||
This adds all link-time dependencies of GLFW as it is currently configured,
|
|
||||||
the include directory for the GLFW header and, when applicable, the
|
|
||||||
[GLFW_DLL](@ref build_macros) macro.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
target_link_libraries(myapp glfw)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Note that the dependencies do not include OpenGL or GLU, as GLFW loads any
|
|
||||||
OpenGL, OpenGL ES or Vulkan libraries it needs at runtime and does not use GLU.
|
|
||||||
If your application calls OpenGL directly, instead of using a modern
|
|
||||||
[extension loader library](@ref context_glext_auto) you can find it by requiring
|
|
||||||
the OpenGL package.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
find_package(OpenGL REQUIRED)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If OpenGL is found, the `OPENGL_FOUND` variable is true and the
|
|
||||||
`OPENGL_INCLUDE_DIR` and `OPENGL_gl_LIBRARY` cache variables can be used.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
target_include_directories(myapp ${OPENGL_INCLUDE_DIR})
|
|
||||||
target_link_libraries(myapp ${OPENGL_gl_LIBRARY})
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The OpenGL CMake package also looks for GLU. If GLU is found, the
|
|
||||||
`OPENGL_GLU_FOUND` variable is true and the `OPENGL_INCLUDE_DIR` and
|
|
||||||
`OPENGL_glu_LIBRARY` cache variables can be used.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
target_link_libraries(myapp ${OPENGL_glu_LIBRARY})
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@note GLU has been deprecated and should not be used in new code, but some
|
|
||||||
legacy code requires it.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_cmake_package With CMake and installed GLFW binaries
|
|
||||||
|
|
||||||
This section is about using CMake to link GLFW after it has been built and
|
|
||||||
installed. If you want to build it along with your application instead, see
|
|
||||||
@ref build_link_cmake_source.
|
|
||||||
|
|
||||||
With just a few changes to your `CMakeLists.txt`, you can locate the package and
|
|
||||||
target files generated when GLFW is installed.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
find_package(glfw3 3.2 REQUIRED)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Note that the dependencies do not include OpenGL or GLU, as GLFW loads any
|
|
||||||
OpenGL, OpenGL ES or Vulkan libraries it needs at runtime and does not use GLU.
|
|
||||||
If your application calls OpenGL directly, instead of using a modern
|
|
||||||
[extension loader library](@ref context_glext_auto) you can find it by requiring
|
|
||||||
the OpenGL package.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
find_package(OpenGL REQUIRED)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If OpenGL is found, the `OPENGL_FOUND` variable is true and the
|
|
||||||
`OPENGL_INCLUDE_DIR` and `OPENGL_gl_LIBRARY` cache variables can be used.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
target_include_directories(myapp ${OPENGL_INCLUDE_DIR})
|
|
||||||
target_link_libraries(myapp ${OPENGL_gl_LIBRARY})
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The OpenGL CMake package also looks for GLU. If GLU is found, the
|
|
||||||
`OPENGL_GLU_FOUND` variable is true and the `OPENGL_INCLUDE_DIR` and
|
|
||||||
`OPENGL_glu_LIBRARY` cache variables can be used.
|
|
||||||
|
|
||||||
@code{.cmake}
|
|
||||||
target_link_libraries(myapp ${OPENGL_glu_LIBRARY})
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@note GLU has been deprecated and should not be used in new code, but some
|
|
||||||
legacy code requires it.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_pkgconfig With makefiles and pkg-config on Unix
|
|
||||||
|
|
||||||
GLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/),
|
|
||||||
and the `glfw3.pc` pkg-config file is generated when the GLFW library is built
|
|
||||||
and is installed along with it. A pkg-config file describes all necessary
|
|
||||||
compile-time and link-time flags and dependencies needed to use a library. When
|
|
||||||
they are updated or if they differ between systems, you will get the correct
|
|
||||||
ones automatically.
|
|
||||||
|
|
||||||
A typical compile and link command-line when using the static version of the
|
|
||||||
GLFW library may look like this:
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --static --libs glfw3`
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If you are using the shared version of the GLFW library, simply omit the
|
|
||||||
`--static` flag.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
You can also use the `glfw3.pc` file without installing it first, by using the
|
|
||||||
`PKG_CONFIG_PATH` environment variable.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
env PKG_CONFIG_PATH=path/to/glfw/src cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The dependencies do not include OpenGL or GLU, as GLFW loads any OpenGL, OpenGL
|
|
||||||
ES or Vulkan libraries it needs at runtime and does not use GLU. On OS X, GLU
|
|
||||||
is built into the OpenGL framework, so if you need GLU you don't need to do
|
|
||||||
anything extra. If you need GLU and are using Linux or BSD, you should add the
|
|
||||||
`glu` pkg-config package.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --libs glfw3 glu`
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@note GLU has been deprecated and should not be used in new code, but some
|
|
||||||
legacy code requires it.
|
|
||||||
|
|
||||||
If you are using the static version of the GLFW library, make sure you don't
|
|
||||||
link statically against GLU.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --static --libs glfw3` `pkg-config --libs glu`
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_xcode With Xcode on OS X
|
|
||||||
|
|
||||||
If you are using the dynamic library version of GLFW, simply add it to the
|
|
||||||
project dependencies.
|
|
||||||
|
|
||||||
If you are using the static library version of GLFW, add it and the Cocoa,
|
|
||||||
OpenGL, IOKit and CoreVideo frameworks to the project as dependencies. They can
|
|
||||||
all be found in `/System/Library/Frameworks`.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection build_link_osx With command-line on OS X
|
|
||||||
|
|
||||||
It is recommended that you use [pkg-config](@ref build_link_pkgconfig) when
|
|
||||||
building from the command line on OS X. That way you will get any new
|
|
||||||
dependencies added automatically. If you still wish to build manually, you need
|
|
||||||
to add the required frameworks and libraries to your command-line yourself using
|
|
||||||
the `-l` and `-framework` switches.
|
|
||||||
|
|
||||||
If you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do:
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
|
||||||
for `-lglfw`.
|
|
||||||
|
|
||||||
Note that you do not add the `.framework` extension to a framework when linking
|
|
||||||
against it from the command-line.
|
|
||||||
|
|
||||||
The OpenGL framework contains both the OpenGL and GLU APIs, so there is nothing
|
|
||||||
special to do when using GLU. Also note that even though your machine may have
|
|
||||||
`libGL`-style OpenGL libraries, they are for use with the X Window System and
|
|
||||||
will _not_ work with the OS X native version of GLFW.
|
|
||||||
|
|
||||||
*/
|
|
419
docs/build.md
Normal file
419
docs/build.md
Normal file
@ -0,0 +1,419 @@
|
|||||||
|
# Building applications {#build_guide}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
This is about compiling and linking applications that use GLFW. For information on
|
||||||
|
how to write such applications, start with the
|
||||||
|
[introductory tutorial](@ref quick_guide). For information on how to compile
|
||||||
|
the GLFW library itself, see @ref compile_guide.
|
||||||
|
|
||||||
|
This is not a tutorial on compilation or linking. It assumes basic
|
||||||
|
understanding of how to compile and link a C program as well as how to use the
|
||||||
|
specific compiler of your chosen development environment. The compilation
|
||||||
|
and linking process should be explained in your C programming material and in
|
||||||
|
the documentation for your development environment.
|
||||||
|
|
||||||
|
|
||||||
|
## Including the GLFW header file {#build_include}
|
||||||
|
|
||||||
|
You should include the GLFW header in the source files where you use OpenGL or
|
||||||
|
GLFW.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
This header defines all the constants and declares all the types and function
|
||||||
|
prototypes of the GLFW API. By default, it also includes the OpenGL header from
|
||||||
|
your development environment. See [option macros](@ref build_macros) below for
|
||||||
|
how to select OpenGL ES headers and more.
|
||||||
|
|
||||||
|
The GLFW header also defines any platform-specific macros needed by your OpenGL
|
||||||
|
header, so that it can be included without needing any window system headers.
|
||||||
|
|
||||||
|
It does this only when needed, so if window system headers are included, the
|
||||||
|
GLFW header does not try to redefine those symbols. The reverse is not true,
|
||||||
|
i.e. `windows.h` cannot cope if any Win32 symbols have already been defined.
|
||||||
|
|
||||||
|
In other words:
|
||||||
|
|
||||||
|
- Use the GLFW header to include OpenGL or OpenGL ES headers portably
|
||||||
|
- Do not include window system headers unless you will use those APIs directly
|
||||||
|
- If you do need such headers, include them before the GLFW header
|
||||||
|
|
||||||
|
If you are using an OpenGL extension loading library such as [glad][], the
|
||||||
|
extension loader header should be included before the GLFW one. GLFW attempts
|
||||||
|
to detect any OpenGL or OpenGL ES header or extension loader header included
|
||||||
|
before it and will then disable the inclusion of the default OpenGL header.
|
||||||
|
Most extension loaders also define macros that disable similar headers below it.
|
||||||
|
|
||||||
|
[glad]: https://github.com/Dav1dde/glad
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
Both of these mechanisms depend on the extension loader header defining a known
|
||||||
|
macro. If yours doesn't or you don't know which one your users will pick, the
|
||||||
|
@ref GLFW_INCLUDE_NONE macro will explicitly prevent the GLFW header from
|
||||||
|
including the OpenGL header. This will also allow you to include the two
|
||||||
|
headers in any order.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <glad/gl.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### GLFW header option macros {#build_macros}
|
||||||
|
|
||||||
|
These macros may be defined before the inclusion of the GLFW header and affect
|
||||||
|
its behavior.
|
||||||
|
|
||||||
|
@anchor GLFW_DLL
|
||||||
|
__GLFW_DLL__ is required on Windows when using the GLFW DLL, to tell the
|
||||||
|
compiler that the GLFW functions are defined in a DLL.
|
||||||
|
|
||||||
|
The following macros control which OpenGL or OpenGL ES API header is included.
|
||||||
|
Only one of these may be defined at a time.
|
||||||
|
|
||||||
|
@note GLFW does not provide any of the API headers mentioned below. They are
|
||||||
|
provided by your development environment or your OpenGL, OpenGL ES or Vulkan
|
||||||
|
SDK, and most of them can be downloaded from the [Khronos Registry][registry].
|
||||||
|
|
||||||
|
[registry]: https://www.khronos.org/registry/
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_GLCOREARB
|
||||||
|
__GLFW_INCLUDE_GLCOREARB__ makes the GLFW header include the modern
|
||||||
|
`GL/glcorearb.h` header (`OpenGL/gl3.h` on macOS) instead of the regular OpenGL
|
||||||
|
header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_ES1
|
||||||
|
__GLFW_INCLUDE_ES1__ makes the GLFW header include the OpenGL ES 1.x `GLES/gl.h`
|
||||||
|
header instead of the regular OpenGL header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_ES2
|
||||||
|
__GLFW_INCLUDE_ES2__ makes the GLFW header include the OpenGL ES 2.0
|
||||||
|
`GLES2/gl2.h` header instead of the regular OpenGL header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_ES3
|
||||||
|
__GLFW_INCLUDE_ES3__ makes the GLFW header include the OpenGL ES 3.0
|
||||||
|
`GLES3/gl3.h` header instead of the regular OpenGL header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_ES31
|
||||||
|
__GLFW_INCLUDE_ES31__ makes the GLFW header include the OpenGL ES 3.1
|
||||||
|
`GLES3/gl31.h` header instead of the regular OpenGL header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_ES32
|
||||||
|
__GLFW_INCLUDE_ES32__ makes the GLFW header include the OpenGL ES 3.2
|
||||||
|
`GLES3/gl32.h` header instead of the regular OpenGL header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_NONE
|
||||||
|
__GLFW_INCLUDE_NONE__ makes the GLFW header not include any OpenGL or OpenGL ES
|
||||||
|
API header. This is useful in combination with an extension loading library.
|
||||||
|
|
||||||
|
If none of the above inclusion macros are defined, the standard OpenGL `GL/gl.h`
|
||||||
|
header (`OpenGL/gl.h` on macOS) is included, unless GLFW detects the inclusion
|
||||||
|
guards of any OpenGL, OpenGL ES or extension loader header it knows about.
|
||||||
|
|
||||||
|
The following macros control the inclusion of additional API headers. Any
|
||||||
|
number of these may be defined simultaneously, and/or together with one of the
|
||||||
|
above macros.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_VULKAN
|
||||||
|
__GLFW_INCLUDE_VULKAN__ makes the GLFW header include the Vulkan
|
||||||
|
`vulkan/vulkan.h` header in addition to any selected OpenGL or OpenGL ES header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_GLEXT
|
||||||
|
__GLFW_INCLUDE_GLEXT__ makes the GLFW header include the appropriate extension
|
||||||
|
header for the OpenGL or OpenGL ES header selected above after and in addition
|
||||||
|
to that header.
|
||||||
|
|
||||||
|
@anchor GLFW_INCLUDE_GLU
|
||||||
|
__GLFW_INCLUDE_GLU__ makes the header include the GLU header in addition to the
|
||||||
|
header selected above. This should only be used with the standard OpenGL header
|
||||||
|
and only for compatibility with legacy code. GLU has been deprecated and should
|
||||||
|
not be used in new code.
|
||||||
|
|
||||||
|
@note None of these macros may be defined during the compilation of GLFW itself.
|
||||||
|
If your build includes GLFW and you define any these in your build files, make
|
||||||
|
sure they are not applied to the GLFW sources.
|
||||||
|
|
||||||
|
|
||||||
|
## Link with the right libraries {#build_link}
|
||||||
|
|
||||||
|
GLFW is essentially a wrapper of various platform-specific APIs and therefore
|
||||||
|
needs to link against many different system libraries. If you are using GLFW as
|
||||||
|
a shared library / dynamic library / DLL then it takes care of these links.
|
||||||
|
However, if you are using GLFW as a static library then your executable will
|
||||||
|
need to link against these libraries.
|
||||||
|
|
||||||
|
On Windows and macOS, the list of system libraries is static and can be
|
||||||
|
hard-coded into your build environment. See the section for your development
|
||||||
|
environment below. On Linux and other Unix-like operating systems, the list
|
||||||
|
varies but can be retrieved in various ways as described below.
|
||||||
|
|
||||||
|
A good general introduction to linking is [Beginner's Guide to
|
||||||
|
Linkers][linker_guide] by David Drysdale.
|
||||||
|
|
||||||
|
[linker_guide]: https://www.lurklurk.org/linkers/linkers.html
|
||||||
|
|
||||||
|
|
||||||
|
### With Visual C++ and GLFW binaries {#build_link_win32}
|
||||||
|
|
||||||
|
If you are using a downloaded [binary
|
||||||
|
archive](https://www.glfw.org/download.html), first make sure you have the
|
||||||
|
archive matching the architecture you are building for (32-bit or 64-bit), or
|
||||||
|
you will get link errors. Also make sure you are using the binaries for your
|
||||||
|
version of Visual C++ or you may get other link errors.
|
||||||
|
|
||||||
|
There are two version of the static GLFW library in the binary archive, because
|
||||||
|
it needs to use the same base run-time library variant as the rest of your
|
||||||
|
executable.
|
||||||
|
|
||||||
|
One is named `glfw3.lib` and is for projects with the _Runtime Library_ project
|
||||||
|
option set to _Multi-threaded DLL_ or _Multi-threaded Debug DLL_. The other is
|
||||||
|
named `glfw3_mt.lib` and is for projects with _Runtime Library_ set to
|
||||||
|
_Multi-threaded_ or _Multi-threaded Debug_. To use the static GLFW library you
|
||||||
|
will need to add `path/to/glfw3.lib` or `path/to/glfw3_mt.lib` to the
|
||||||
|
_Additional Dependencies_ project option.
|
||||||
|
|
||||||
|
If you compiled a GLFW static library yourself then there will only be one,
|
||||||
|
named `glfw3.lib`, and you have to make sure the run-time library variant
|
||||||
|
matches.
|
||||||
|
|
||||||
|
The DLL version of the GLFW library is named `glfw3.dll`, but you will be
|
||||||
|
linking against the `glfw3dll.lib` link library. To use the DLL you will need
|
||||||
|
to add `path/to/glfw3dll.lib` to the _Additional Dependencies_ project option.
|
||||||
|
All of its dependencies are already listed there by default, but when building
|
||||||
|
with the DLL version of GLFW, you also need to define the @ref GLFW_DLL. This
|
||||||
|
can be done either in the _Preprocessor Definitions_ project option or by
|
||||||
|
defining it in your source code before including the GLFW header.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define GLFW_DLL
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
All link-time dependencies for GLFW are already listed in the _Additional
|
||||||
|
Dependencies_ option by default.
|
||||||
|
|
||||||
|
|
||||||
|
### With MinGW-w64 and GLFW binaries {#build_link_mingw}
|
||||||
|
|
||||||
|
This is intended for building a program from the command-line or by writing
|
||||||
|
a makefile, on Windows with [MinGW-w64][] and GLFW binaries. These can be from
|
||||||
|
a downloaded and extracted [binary archive](https://www.glfw.org/download.html)
|
||||||
|
or by compiling GLFW yourself. The paths below assume a binary archive is used.
|
||||||
|
|
||||||
|
If you are using a downloaded binary archive, first make sure you have the
|
||||||
|
archive matching the architecture you are building for (32-bit or 64-bit) or you
|
||||||
|
will get link errors.
|
||||||
|
|
||||||
|
Note that the order of source files and libraries matter for GCC. Dependencies
|
||||||
|
must be listed after the files that depend on them. Any source files that
|
||||||
|
depend on GLFW must be listed before the GLFW library. GLFW in turn depends on
|
||||||
|
`gdi32` and must be listed before it.
|
||||||
|
|
||||||
|
[MinGW-w64]: https://www.mingw-w64.org/
|
||||||
|
|
||||||
|
If you are using the static version of the GLFW library, which is named
|
||||||
|
`libglfw3.a`, do:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gcc -o myprog myprog.c -I path/to/glfw/include path/to/glfw/lib-mingw-w64/libglfw3.a -lgdi32
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using the DLL version of the GLFW library, which is named
|
||||||
|
`glfw3.dll`, you will need to use the `libglfw3dll.a` link library.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gcc -o myprog myprog.c -I path/to/glfw/include path/to/glfw/lib-mingw-w64/libglfw3dll.a -lgdi32
|
||||||
|
```
|
||||||
|
|
||||||
|
The resulting executable will need to find `glfw3.dll` to run, typically by
|
||||||
|
keeping both files in the same directory.
|
||||||
|
|
||||||
|
When you are building with the DLL version of GLFW, you will also need to define
|
||||||
|
the @ref GLFW_DLL macro. This can be done in your source files, as long as it
|
||||||
|
done before including the GLFW header:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define GLFW_DLL
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
It can also be done on the command-line:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gcc -o myprog myprog.c -D GLFW_DLL -I path/to/glfw/include path/to/glfw/lib-mingw-w64/libglfw3dll.a -lgdi32
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### With CMake and GLFW source {#build_link_cmake_source}
|
||||||
|
|
||||||
|
This section is about using CMake to compile and link GLFW along with your
|
||||||
|
application. If you want to use an installed binary instead, see @ref
|
||||||
|
build_link_cmake_package.
|
||||||
|
|
||||||
|
With a few changes to your `CMakeLists.txt` you can have the GLFW source tree
|
||||||
|
built along with your application.
|
||||||
|
|
||||||
|
Add the root directory of the GLFW source tree to your project. This will add
|
||||||
|
the `glfw` target to your project.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
add_subdirectory(path/to/glfw)
|
||||||
|
```
|
||||||
|
|
||||||
|
Once GLFW has been added, link your application against the `glfw` target.
|
||||||
|
This adds the GLFW library and its link-time dependencies as it is currently
|
||||||
|
configured, the include directory for the GLFW header and, when applicable, the
|
||||||
|
@ref GLFW_DLL macro.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(myapp glfw)
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL,
|
||||||
|
OpenGL ES or Vulkan libraries it needs at runtime. If your application calls
|
||||||
|
OpenGL directly, instead of using a modern
|
||||||
|
[extension loader library](@ref context_glext_auto), use the OpenGL CMake
|
||||||
|
package.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
```
|
||||||
|
|
||||||
|
If OpenGL is found, the `OpenGL::GL` target is added to your project, containing
|
||||||
|
library and include directory paths. Link against this like any other library.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(myapp OpenGL::GL)
|
||||||
|
```
|
||||||
|
|
||||||
|
For a minimal example of a program and GLFW sources built with CMake, see the
|
||||||
|
[GLFW CMake Starter][cmake_starter] on GitHub.
|
||||||
|
|
||||||
|
[cmake_starter]: https://github.com/juliettef/GLFW-CMake-starter
|
||||||
|
|
||||||
|
|
||||||
|
### With CMake and installed GLFW binaries {#build_link_cmake_package}
|
||||||
|
|
||||||
|
This section is about using CMake to link GLFW after it has been built and
|
||||||
|
installed. If you want to build it along with your application instead, see
|
||||||
|
@ref build_link_cmake_source.
|
||||||
|
|
||||||
|
With a few changes to your `CMakeLists.txt` you can locate the package and
|
||||||
|
target files generated when GLFW is installed.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
find_package(glfw3 3.5 REQUIRED)
|
||||||
|
```
|
||||||
|
|
||||||
|
Once GLFW has been added to the project, link against it with the `glfw` target.
|
||||||
|
This adds the GLFW library and its link-time dependencies, the include directory
|
||||||
|
for the GLFW header and, when applicable, the @ref GLFW_DLL macro.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(myapp glfw)
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the `glfw` target does not depend on OpenGL, as GLFW loads any OpenGL,
|
||||||
|
OpenGL ES or Vulkan libraries it needs at runtime. If your application calls
|
||||||
|
OpenGL directly, instead of using a modern
|
||||||
|
[extension loader library](@ref context_glext_auto), use the OpenGL CMake
|
||||||
|
package.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
```
|
||||||
|
|
||||||
|
If OpenGL is found, the `OpenGL::GL` target is added to your project, containing
|
||||||
|
library and include directory paths. Link against this like any other library.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(myapp OpenGL::GL)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### With pkg-config and GLFW binaries on Unix {#build_link_pkgconfig}
|
||||||
|
|
||||||
|
This is intended for building a program from the command-line or by writing
|
||||||
|
a makefile, on macOS or any Unix-like system like Linux, FreeBSD and Cygwin.
|
||||||
|
|
||||||
|
GLFW supports [pkg-config][], and the `glfw3.pc` pkg-config file is generated
|
||||||
|
when the GLFW library is built and is installed along with it. A pkg-config
|
||||||
|
file describes all necessary compile-time and link-time flags and dependencies
|
||||||
|
needed to use a library. When they are updated or if they differ between
|
||||||
|
systems, you will get the correct ones automatically.
|
||||||
|
|
||||||
|
[pkg-config]: https://www.freedesktop.org/wiki/Software/pkg-config/
|
||||||
|
|
||||||
|
A typical compile and link command-line when using the static version of the
|
||||||
|
GLFW library may look like this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --static --libs glfw3)
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using the shared version of the GLFW library, omit the `--static`
|
||||||
|
flag.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3)
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use the `glfw3.pc` file without installing it first, by using the
|
||||||
|
`PKG_CONFIG_PATH` environment variable.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
env PKG_CONFIG_PATH=path/to/glfw/src cc $(pkg-config --cflags glfw3) -o myprog myprog.c $(pkg-config --libs glfw3)
|
||||||
|
```
|
||||||
|
|
||||||
|
The dependencies do not include OpenGL, as GLFW loads any OpenGL, OpenGL ES or
|
||||||
|
Vulkan libraries it needs at runtime. If your application calls OpenGL
|
||||||
|
directly, instead of using a modern
|
||||||
|
[extension loader library](@ref context_glext_auto), you should add the `gl`
|
||||||
|
pkg-config package.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cc $(pkg-config --cflags glfw3 gl) -o myprog myprog.c $(pkg-config --libs glfw3 gl)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### With Xcode on macOS {#build_link_xcode}
|
||||||
|
|
||||||
|
If you are using the dynamic library version of GLFW, add it to the project
|
||||||
|
dependencies.
|
||||||
|
|
||||||
|
If you are using the static library version of GLFW, add it and the Cocoa,
|
||||||
|
OpenGL, IOKit and QuartzCore frameworks to the project as dependencies. They
|
||||||
|
can all be found in `/System/Library/Frameworks`.
|
||||||
|
|
||||||
|
|
||||||
|
### With command-line or makefile on macOS {#build_link_osx}
|
||||||
|
|
||||||
|
It is recommended that you use [pkg-config](@ref build_link_pkgconfig) when
|
||||||
|
using installed GLFW binaries from the command line on macOS. That way you will
|
||||||
|
get any new dependencies added automatically. If you still wish to build
|
||||||
|
manually, you need to add the required frameworks and libraries to your
|
||||||
|
command-line yourself using the `-l` and `-framework` switches.
|
||||||
|
|
||||||
|
If you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework QuartzCore
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using the static library, named `libglfw3.a`, substitute `-lglfw3`
|
||||||
|
for `-lglfw`.
|
||||||
|
|
||||||
|
Note that you do not add the `.framework` extension to a framework when linking
|
||||||
|
against it from the command-line.
|
||||||
|
|
||||||
|
@note Your machine may have `libGL.*.dylib` style OpenGL library, but that is
|
||||||
|
for the X Window System and will not work with the macOS native version of GLFW.
|
||||||
|
|
224
docs/compat.dox
224
docs/compat.dox
@ -1,224 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page compat_guide Standards conformance
|
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide describes the various API extensions used by this version of GLFW.
|
|
||||||
It lists what are essentially implementation details, but which are nonetheless
|
|
||||||
vital knowledge for developers intending to deploy their applications on a wide
|
|
||||||
range of machines.
|
|
||||||
|
|
||||||
The information in this guide is not a part of GLFW API, but merely
|
|
||||||
preconditions for some parts of the library to function on a given machine. Any
|
|
||||||
part of this information may change in future versions of GLFW and that will not
|
|
||||||
be considered a breaking API change.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_x11 X11 extensions, protocols and IPC standards
|
|
||||||
|
|
||||||
As GLFW uses Xlib directly, without any intervening toolkit
|
|
||||||
library, it has sole responsibility for interacting well with the many and
|
|
||||||
varied window managers in use on Unix-like systems. In order for applications
|
|
||||||
and window managers to work well together, a number of standards and
|
|
||||||
conventions have been developed that regulate behavior outside the scope of the
|
|
||||||
X11 API; most importantly the
|
|
||||||
[Inter-Client Communication Conventions Manual](http://www.tronche.com/gui/x/icccm/)
|
|
||||||
(ICCCM) and
|
|
||||||
[Extended Window Manager Hints](http://standards.freedesktop.org/wm-spec/wm-spec-latest.html)
|
|
||||||
(EWMH) standards.
|
|
||||||
|
|
||||||
GLFW uses the `_MOTIF_WM_HINTS` window property to support borderless windows.
|
|
||||||
If the running window manager does not support this property, the
|
|
||||||
`GLFW_DECORATED` hint will have no effect.
|
|
||||||
|
|
||||||
GLFW uses the ICCCM `WM_DELETE_WINDOW` protocol to intercept the user
|
|
||||||
attempting to close the GLFW window. If the running window manager does not
|
|
||||||
support this protocol, the close callback will never be called.
|
|
||||||
|
|
||||||
GLFW uses the EWMH `_NET_WM_PING` protocol, allowing the window manager notify
|
|
||||||
the user when the application has stopped responding, i.e. when it has ceased to
|
|
||||||
process events. If the running window manager does not support this protocol,
|
|
||||||
the user will not be notified if the application locks up.
|
|
||||||
|
|
||||||
GLFW uses the EWMH `_NET_WM_STATE_FULLSCREEN` window state to tell the window
|
|
||||||
manager to make the GLFW window full screen. If the running window manager does
|
|
||||||
not support this state, full screen windows may not work properly. GLFW has
|
|
||||||
a fallback code path in case this state is unavailable, but every window manager
|
|
||||||
behaves slightly differently in this regard.
|
|
||||||
|
|
||||||
GLFW uses the EWMH `_NET_WM_BYPASS_COMPOSITOR` window property to tell a
|
|
||||||
compositing window manager to un-redirect full screen GLFW windows. If the
|
|
||||||
running window manager uses compositing but does not support this property then
|
|
||||||
additional copying may be performed for each buffer swap of full screen windows.
|
|
||||||
|
|
||||||
GLFW uses the
|
|
||||||
[clipboard manager protocol](http://www.freedesktop.org/wiki/ClipboardManager/)
|
|
||||||
to push a clipboard string (i.e. selection) owned by a GLFW window about to be
|
|
||||||
destroyed to the clipboard manager. If there is no running clipboard manager,
|
|
||||||
the clipboard string will be unavailable once the window has been destroyed.
|
|
||||||
|
|
||||||
GLFW uses the
|
|
||||||
[X drag-and-drop protocol](http://www.freedesktop.org/wiki/Specifications/XDND/)
|
|
||||||
to provide file drop events. If the application originating the drag does not
|
|
||||||
support this protocol, drag and drop will not work.
|
|
||||||
|
|
||||||
GLFW uses the XRandR 1.3 extension to provide multi-monitor support. If the
|
|
||||||
running X server does not support this version of this extension, multi-monitor
|
|
||||||
support will not function and only a single, desktop-spanning monitor will be
|
|
||||||
reported.
|
|
||||||
|
|
||||||
GLFW uses the XRandR 1.3 and Xf86vidmode extensions to provide gamma ramp
|
|
||||||
support. If the running X server does not support either or both of these
|
|
||||||
extensions, gamma ramp support will not function.
|
|
||||||
|
|
||||||
GLFW uses the Xkb extension and detectable auto-repeat to provide keyboard
|
|
||||||
input. If the running X server does not support this extension, a non-Xkb
|
|
||||||
fallback path is used.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_glx GLX extensions
|
|
||||||
|
|
||||||
The GLX API is the default API used to create OpenGL contexts on Unix-like
|
|
||||||
systems using the X Window System.
|
|
||||||
|
|
||||||
GLFW uses the GLX 1.3 `GLXFBConfig` functions to enumerate and select framebuffer pixel
|
|
||||||
formats. If GLX 1.3 is not supported, @ref glfwInit will fail.
|
|
||||||
|
|
||||||
GLFW uses the `GLX_MESA_swap_control,` `GLX_EXT_swap_control` and
|
|
||||||
`GLX_SGI_swap_control` extensions to provide vertical retrace synchronization
|
|
||||||
(or _vsync_), in that order of preference. Where none of these extension are
|
|
||||||
available, calling @ref glfwSwapInterval will have no effect.
|
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_multisample` extension to create contexts with
|
|
||||||
multisampling anti-aliasing. Where this extension is unavailable, the
|
|
||||||
`GLFW_SAMPLES` hint will have no effect.
|
|
||||||
|
|
||||||
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
|
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
|
||||||
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
|
||||||
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
|
||||||
`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
|
|
||||||
context profiles. Where this extension is unavailable, setting the
|
|
||||||
`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE`, or setting
|
|
||||||
`GLFW_CLIENT_API` to anything but `GLFW_OPENGL_API` or `GLFW_NO_API` will cause
|
|
||||||
@ref glfwCreateWindow to fail.
|
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_context_flush_control` extension to provide control over
|
|
||||||
whether a context is flushed when it is released (made non-current). Where this
|
|
||||||
extension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no
|
|
||||||
effect and the context will always be flushed when released.
|
|
||||||
|
|
||||||
GLFW uses the `GLX_ARB_framebuffer_sRGB` and `GLX_EXT_framebuffer_sRGB`
|
|
||||||
extensions to provide support for sRGB framebuffers. Where both of these
|
|
||||||
extensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_wgl WGL extensions
|
|
||||||
|
|
||||||
The WGL API is used to create OpenGL contexts on Microsoft Windows and other
|
|
||||||
implementations of the Win32 API, such as Wine.
|
|
||||||
|
|
||||||
GLFW uses either the `WGL_EXT_extension_string` or the
|
|
||||||
`WGL_ARB_extension_string` extension to check for the presence of all other WGL
|
|
||||||
extensions listed below. If both are available, the EXT one is preferred. If
|
|
||||||
neither is available, no other extensions are used and many GLFW features
|
|
||||||
related to context creation will have no effect or cause errors when used.
|
|
||||||
|
|
||||||
GLFW uses the `WGL_EXT_swap_control` extension to provide vertical retrace
|
|
||||||
synchronization (or _vsync_). Where this extension is unavailable, calling @ref
|
|
||||||
glfwSwapInterval will have no effect.
|
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_pixel_format` and `WGL_ARB_multisample` extensions to
|
|
||||||
create contexts with multisampling anti-aliasing. Where these extensions are
|
|
||||||
unavailable, the `GLFW_SAMPLES` hint will have no effect.
|
|
||||||
|
|
||||||
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
|
|
||||||
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
|
||||||
hints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint
|
|
||||||
will have no effect, and setting the `GLFW_OPENGL_PROFILE` or
|
|
||||||
`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
|
|
||||||
context profiles. Where this extension is unavailable, setting the
|
|
||||||
`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE` will cause
|
|
||||||
@ref glfwCreateWindow to fail.
|
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_context_flush_control` extension to provide control over
|
|
||||||
whether a context is flushed when it is released (made non-current). Where this
|
|
||||||
extension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no
|
|
||||||
effect and the context will always be flushed when released.
|
|
||||||
|
|
||||||
GLFW uses the `WGL_ARB_framebuffer_sRGB` and `WGL_EXT_framebuffer_sRGB`
|
|
||||||
extensions to provide support for sRGB framebuffers. Where both of these
|
|
||||||
extension are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_osx OpenGL 3.2 and later on OS X
|
|
||||||
|
|
||||||
Support for OpenGL 3.2 and above was introduced with OS X 10.7 and even then
|
|
||||||
only forward-compatible, core profile contexts are supported. Support for
|
|
||||||
OpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,
|
|
||||||
core profile contexts. There is also still no mechanism for requesting debug
|
|
||||||
contexts. Versions of Mac OS X earlier than 10.7 support at most OpenGL
|
|
||||||
version 2.1.
|
|
||||||
|
|
||||||
Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
|
|
||||||
`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
|
|
||||||
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 and the
|
|
||||||
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
|
|
||||||
|
|
||||||
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,
|
|
||||||
setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
|
|
||||||
a non-default value will cause @ref glfwCreateWindow to fail and the
|
|
||||||
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_vulkan Vulkan loader and API
|
|
||||||
|
|
||||||
GLFW uses the standard system-wide Vulkan loader to access the Vulkan API.
|
|
||||||
This should be installed by graphics drivers and Vulkan SDKs. If this is not
|
|
||||||
available, @ref glfwVulkanSupported will return `GLFW_FALSE` and all other
|
|
||||||
Vulkan-related functions will fail with an @ref GLFW_API_UNAVAILABLE error.
|
|
||||||
|
|
||||||
|
|
||||||
@section compat_wsi Vulkan WSI extensions
|
|
||||||
|
|
||||||
The Vulkan WSI extensions are used to create Vulkan surfaces for GLFW windows on
|
|
||||||
all supported platforms.
|
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and `VK_KHR_win32_surface` extensions to create
|
|
||||||
surfaces on Microsoft Windows. If any of these extensions are not available,
|
|
||||||
@ref glfwGetRequiredInstanceExtensions will return an empty list and window
|
|
||||||
surface creation will fail.
|
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and either the `VK_KHR_xlib_surface` or
|
|
||||||
`VK_KHR_xcb_surface` extensions to create surfaces on X11. If `VK_KHR_surface`
|
|
||||||
or both `VK_KHR_xlib_surface` and `VK_KHR_xcb_surface` are not available, @ref
|
|
||||||
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
|
||||||
creation will fail.
|
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and `VK_KHR_wayland_surface` extensions to create
|
|
||||||
surfaces on Wayland. If any of these extensions are not available, @ref
|
|
||||||
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
|
||||||
creation will fail.
|
|
||||||
|
|
||||||
GLFW uses the `VK_KHR_surface` and `VK_KHR_mir_surface` extensions to create
|
|
||||||
surfaces on Mir. If any of these extensions are not available, @ref
|
|
||||||
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
|
||||||
creation will fail.
|
|
||||||
|
|
||||||
GLFW does not support any extensions for window surface creation on OS X,
|
|
||||||
meaning@ref glfwGetRequiredInstanceExtensions will return an empty list and
|
|
||||||
window surface creation will fail.
|
|
||||||
|
|
||||||
*/
|
|
303
docs/compat.md
Normal file
303
docs/compat.md
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
# Standards conformance {#compat_guide}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
This guide describes the various API extensions used by this version of GLFW.
|
||||||
|
It lists what are essentially implementation details, but which are nonetheless
|
||||||
|
vital knowledge for developers intending to deploy their applications on a wide
|
||||||
|
range of machines.
|
||||||
|
|
||||||
|
The information in this guide is not a part of GLFW API, but merely
|
||||||
|
preconditions for some parts of the library to function on a given machine. Any
|
||||||
|
part of this information may change in future versions of GLFW and that will not
|
||||||
|
be considered a breaking API change.
|
||||||
|
|
||||||
|
|
||||||
|
## X11 extensions, protocols and IPC standards {#compat_x11}
|
||||||
|
|
||||||
|
As GLFW uses Xlib directly, without any intervening toolkit library, it has sole
|
||||||
|
responsibility for interacting well with the many and varied window managers in
|
||||||
|
use on Unix-like systems. In order for applications and window managers to work
|
||||||
|
well together, a number of standards and conventions have been developed that
|
||||||
|
regulate behavior outside the scope of the X11 API; most importantly the
|
||||||
|
[Inter-Client Communication Conventions Manual][ICCCM] (ICCCM) and [Extended
|
||||||
|
Window Manager Hints][EWMH] (EWMH) standards.
|
||||||
|
|
||||||
|
[ICCCM]: https://www.tronche.com/gui/x/icccm/
|
||||||
|
[EWMH]: https://standards.freedesktop.org/wm-spec/wm-spec-latest.html
|
||||||
|
|
||||||
|
GLFW uses the `_MOTIF_WM_HINTS` window property to support borderless windows.
|
||||||
|
If the running window manager does not support this property, the
|
||||||
|
`GLFW_DECORATED` hint will have no effect.
|
||||||
|
|
||||||
|
GLFW uses the ICCCM `WM_DELETE_WINDOW` protocol to intercept the user
|
||||||
|
attempting to close the GLFW window. If the running window manager does not
|
||||||
|
support this protocol, the close callback will never be called.
|
||||||
|
|
||||||
|
GLFW uses the EWMH `_NET_WM_PING` protocol, allowing the window manager notify
|
||||||
|
the user when the application has stopped responding, i.e. when it has ceased to
|
||||||
|
process events. If the running window manager does not support this protocol,
|
||||||
|
the user will not be notified if the application locks up.
|
||||||
|
|
||||||
|
GLFW uses the EWMH `_NET_WM_STATE_FULLSCREEN` window state to tell the window
|
||||||
|
manager to make the GLFW window full screen. If the running window manager does
|
||||||
|
not support this state, full screen windows may not work properly. GLFW has
|
||||||
|
a fallback code path in case this state is unavailable, but every window manager
|
||||||
|
behaves slightly differently in this regard.
|
||||||
|
|
||||||
|
GLFW uses the EWMH `_NET_WM_BYPASS_COMPOSITOR` window property to tell a
|
||||||
|
compositing window manager to un-redirect full screen GLFW windows. If the
|
||||||
|
running window manager uses compositing but does not support this property then
|
||||||
|
additional copying may be performed for each buffer swap of full screen windows.
|
||||||
|
|
||||||
|
GLFW uses the [clipboard manager protocol][ClipboardManager] to push a clipboard
|
||||||
|
string (i.e. selection) owned by a GLFW window about to be destroyed to the
|
||||||
|
clipboard manager. If there is no running clipboard manager, the clipboard
|
||||||
|
string will be unavailable once the window has been destroyed.
|
||||||
|
|
||||||
|
[clipboardManager]: https://www.freedesktop.org/wiki/ClipboardManager/
|
||||||
|
|
||||||
|
GLFW uses the [X drag-and-drop protocol][XDND] to provide file drop events. If
|
||||||
|
the application originating the drag does not support this protocol, drag and
|
||||||
|
drop will not work.
|
||||||
|
|
||||||
|
[XDND]: https://www.freedesktop.org/wiki/Specifications/XDND/
|
||||||
|
|
||||||
|
GLFW uses the XRandR 1.3 extension to provide multi-monitor support. If the
|
||||||
|
running X server does not support this version of this extension, multi-monitor
|
||||||
|
support will not function and only a single, desktop-spanning monitor will be
|
||||||
|
reported.
|
||||||
|
|
||||||
|
GLFW uses the XRandR 1.3 and Xf86vidmode extensions to provide gamma ramp
|
||||||
|
support. If the running X server does not support either or both of these
|
||||||
|
extensions, gamma ramp support will not function.
|
||||||
|
|
||||||
|
GLFW uses the Xkb extension and detectable auto-repeat to provide keyboard
|
||||||
|
input. If the running X server does not support this extension, a non-Xkb
|
||||||
|
fallback path is used.
|
||||||
|
|
||||||
|
GLFW uses the XInput2 extension to provide raw, non-accelerated mouse motion
|
||||||
|
when the cursor is disabled. If the running X server does not support this
|
||||||
|
extension, regular accelerated mouse motion will be used.
|
||||||
|
|
||||||
|
GLFW uses both the XRender extension and the compositing manager to support
|
||||||
|
transparent window framebuffers. If the running X server does not support this
|
||||||
|
extension or there is no running compositing manager, the
|
||||||
|
`GLFW_TRANSPARENT_FRAMEBUFFER` framebuffer hint will have no effect.
|
||||||
|
|
||||||
|
GLFW uses both the Xcursor extension and the freedesktop cursor conventions to
|
||||||
|
provide an expanded set of standard cursor shapes. If the running X server does
|
||||||
|
not support this extension or the current cursor theme does not support the
|
||||||
|
conventions, the `GLFW_RESIZE_NWSE_CURSOR`, `GLFW_RESIZE_NESW_CURSOR` and
|
||||||
|
`GLFW_NOT_ALLOWED_CURSOR` shapes will not be available and other shapes may use
|
||||||
|
legacy images.
|
||||||
|
|
||||||
|
|
||||||
|
## Wayland protocols and IPC standards {#compat_wayland}
|
||||||
|
|
||||||
|
As GLFW uses libwayland directly, without any intervening toolkit library, it
|
||||||
|
has sole responsibility for interacting well with every compositor in use on
|
||||||
|
Unix-like systems. Most of the features are provided by the core protocol,
|
||||||
|
while cursor support is provided by the libwayland-cursor helper library, EGL
|
||||||
|
integration by libwayland-egl, and keyboard handling by
|
||||||
|
[libxkbcommon](https://xkbcommon.org/). In addition, GLFW uses some additional
|
||||||
|
Wayland protocols to implement certain features if the compositor supports them.
|
||||||
|
|
||||||
|
GLFW uses xkbcommon 0.5.0 to provide key and text input support. Earlier
|
||||||
|
versions are not supported.
|
||||||
|
|
||||||
|
GLFW uses the [xdg-shell][] protocol to provide better window management. This
|
||||||
|
protocol is mandatory for GLFW to display a window.
|
||||||
|
|
||||||
|
[xdg-shell]: https://wayland.app/protocols/xdg-shell
|
||||||
|
|
||||||
|
GLFW uses the [relative-pointer-unstable-v1][] protocol alongside the
|
||||||
|
[pointer-constraints-unstable-v1][] protocol to implement disabled cursor. If
|
||||||
|
the running compositor does not support both of these protocols, disabling the
|
||||||
|
cursor will have no effect.
|
||||||
|
|
||||||
|
[relative-pointer-unstable-v1]: https://wayland.app/protocols/relative-pointer-unstable-v1
|
||||||
|
[pointer-constraints-unstable-v1]: https://wayland.app/protocols/pointer-constraints-unstable-v1
|
||||||
|
|
||||||
|
GLFW uses the [idle-inhibit-unstable-v1][] protocol to prohibit the screensaver
|
||||||
|
from starting. If the running compositor does not support this protocol, the
|
||||||
|
screensaver may start even for full screen windows.
|
||||||
|
|
||||||
|
[idle-inhibit-unstable-v1]: https://wayland.app/protocols/idle-inhibit-unstable-v1
|
||||||
|
|
||||||
|
GLFW uses the [libdecor][] library for window decorations, where available.
|
||||||
|
This in turn provides good quality client-side decorations (drawn by the
|
||||||
|
application) on desktop systems that do not support server-side decorations
|
||||||
|
(drawn by the window manager). On systems that do not provide either libdecor
|
||||||
|
or xdg-decoration, very basic window decorations are provided. These do not
|
||||||
|
include the window title or any caption buttons.
|
||||||
|
|
||||||
|
[libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor
|
||||||
|
|
||||||
|
GLFW uses the [xdg-decoration-unstable-v1][] protocol to request decorations to
|
||||||
|
be drawn around its windows. This protocol is part of wayland-protocols 1.15,
|
||||||
|
and mandatory at build time. If the running compositor does not support this
|
||||||
|
protocol, a very simple frame will be drawn by GLFW itself, using the
|
||||||
|
[viewporter][] protocol alongside subsurfaces. If the running compositor does
|
||||||
|
not support these protocols either, no decorations will be drawn around windows.
|
||||||
|
|
||||||
|
[xdg-decoration-unstable-v1]: https://wayland.app/protocols/xdg-decoration-unstable-v1
|
||||||
|
[viewporter]: https://wayland.app/protocols/viewporter
|
||||||
|
|
||||||
|
GLFW uses the [xdg-activation-v1][] protocol to implement window focus and
|
||||||
|
attention requests. If the running compositor does not support this protocol,
|
||||||
|
window focus and attention requests do nothing.
|
||||||
|
|
||||||
|
[xdg-activation-v1]: https://wayland.app/protocols/xdg-activation-v1
|
||||||
|
|
||||||
|
GLFW uses the [fractional-scale-v1][] protocol to implement fine-grained
|
||||||
|
framebuffer scaling. If the running compositor does not support this protocol,
|
||||||
|
the @ref GLFW_SCALE_FRAMEBUFFER window hint will only be able to scale the
|
||||||
|
framebuffer by integer scales. This will typically be the smallest integer not
|
||||||
|
less than the actual scale.
|
||||||
|
|
||||||
|
[fractional-scale-v1]: https://wayland.app/protocols/fractional-scale-v1
|
||||||
|
|
||||||
|
|
||||||
|
## GLX extensions {#compat_glx}
|
||||||
|
|
||||||
|
The GLX API is the default API used to create OpenGL contexts on Unix-like
|
||||||
|
systems using the X Window System.
|
||||||
|
|
||||||
|
GLFW uses the GLX 1.3 `GLXFBConfig` functions to enumerate and select framebuffer pixel
|
||||||
|
formats. If GLX 1.3 is not supported, @ref glfwInit will fail.
|
||||||
|
|
||||||
|
GLFW uses the `GLX_MESA_swap_control,` `GLX_EXT_swap_control` and
|
||||||
|
`GLX_SGI_swap_control` extensions to provide vertical retrace synchronization
|
||||||
|
(or _vsync_), in that order of preference. When none of these extensions are
|
||||||
|
available, calling @ref glfwSwapInterval will have no effect.
|
||||||
|
|
||||||
|
GLFW uses the `GLX_ARB_multisample` extension to create contexts with
|
||||||
|
multisampling anti-aliasing. Where this extension is unavailable, the
|
||||||
|
`GLFW_SAMPLES` hint will have no effect.
|
||||||
|
|
||||||
|
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
|
||||||
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
|
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
||||||
|
no effect, and setting the `GLFW_OPENGL_PROFILE` or `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
|
||||||
|
context profiles. Where this extension is unavailable, setting the
|
||||||
|
`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE`, or setting
|
||||||
|
`GLFW_CLIENT_API` to anything but `GLFW_OPENGL_API` or `GLFW_NO_API` will cause
|
||||||
|
@ref glfwCreateWindow to fail.
|
||||||
|
|
||||||
|
GLFW uses the `GLX_ARB_context_flush_control` extension to provide control over
|
||||||
|
whether a context is flushed when it is released (made non-current). Where this
|
||||||
|
extension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no
|
||||||
|
effect and the context will always be flushed when released.
|
||||||
|
|
||||||
|
GLFW uses the `GLX_ARB_framebuffer_sRGB` and `GLX_EXT_framebuffer_sRGB`
|
||||||
|
extensions to provide support for sRGB framebuffers. Where both of these
|
||||||
|
extensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
||||||
|
|
||||||
|
|
||||||
|
## WGL extensions {#compat_wgl}
|
||||||
|
|
||||||
|
The WGL API is used to create OpenGL contexts on Microsoft Windows and other
|
||||||
|
implementations of the Win32 API, such as Wine.
|
||||||
|
|
||||||
|
GLFW uses either the `WGL_EXT_extension_string` or the
|
||||||
|
`WGL_ARB_extension_string` extension to check for the presence of all other WGL
|
||||||
|
extensions listed below. If both are available, the EXT one is preferred. If
|
||||||
|
neither is available, no other extensions are used and many GLFW features
|
||||||
|
related to context creation will have no effect or cause errors when used.
|
||||||
|
|
||||||
|
GLFW uses the `WGL_EXT_swap_control` extension to provide vertical retrace
|
||||||
|
synchronization (or _vsync_). Where this extension is unavailable, calling @ref
|
||||||
|
glfwSwapInterval will have no effect.
|
||||||
|
|
||||||
|
GLFW uses the `WGL_ARB_pixel_format` and `WGL_ARB_multisample` extensions to
|
||||||
|
create contexts with multisampling anti-aliasing. Where these extensions are
|
||||||
|
unavailable, the `GLFW_SAMPLES` hint will have no effect.
|
||||||
|
|
||||||
|
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
|
||||||
|
unavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`
|
||||||
|
hints will only be partially supported, the `GLFW_CONTEXT_DEBUG` hint will have
|
||||||
|
no effect, and setting the `GLFW_OPENGL_PROFILE` or `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
|
||||||
|
context profiles. Where this extension is unavailable, setting the
|
||||||
|
`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE` will cause
|
||||||
|
@ref glfwCreateWindow to fail.
|
||||||
|
|
||||||
|
GLFW uses the `WGL_ARB_context_flush_control` extension to provide control over
|
||||||
|
whether a context is flushed when it is released (made non-current). Where this
|
||||||
|
extension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no
|
||||||
|
effect and the context will always be flushed when released.
|
||||||
|
|
||||||
|
GLFW uses the `WGL_ARB_framebuffer_sRGB` and `WGL_EXT_framebuffer_sRGB`
|
||||||
|
extensions to provide support for sRGB framebuffers. When both of these
|
||||||
|
extensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.
|
||||||
|
|
||||||
|
|
||||||
|
## OpenGL on macOS {#compat_osx}
|
||||||
|
|
||||||
|
macOS (as of version 14) still provides OpenGL but it has been deprecated by
|
||||||
|
Apple. While the API is still available, it is poorly maintained and frequently
|
||||||
|
develops new issues. On modern systems, OpenGL is implemented on top of Metal
|
||||||
|
and is not fully thread-safe.
|
||||||
|
|
||||||
|
macOS does not support OpenGL stereo rendering. If the `GLFW_STEREO` hint is
|
||||||
|
set to true, OpenGL context creation will always fail.
|
||||||
|
|
||||||
|
macOS only supports OpenGL core profile contexts that are forward-compatible,
|
||||||
|
but the `GLFW_OPENGL_FORWARD_COMPAT` hint is ignored since GLFW 3.4. Even if
|
||||||
|
this hint is set to false (the default), a forward-compatible context will be
|
||||||
|
returned if available.
|
||||||
|
|
||||||
|
macOS does not support OpenGL debug contexts, no-error contexts or robustness.
|
||||||
|
The `GLFW_CONTEXT_DEBUG`, `GLFW_CONTEXT_NO_ERROR` and `GLFW_CONTEXT_ROBUSTNESS`
|
||||||
|
hints will be ignored and a context without these features will be returned.
|
||||||
|
|
||||||
|
macOS does not flush OpenGL contexts when they are made non-current. The
|
||||||
|
`GLFW_CONTEXT_RELEASE_BEHAVIOR` hint is ignored and the release behavior will
|
||||||
|
always be the equivalent of `GLFW_RELEASE_BEHAVIOR_NONE`. If you need a context
|
||||||
|
to be flushed, call `glFlush` before making it non-current.
|
||||||
|
|
||||||
|
|
||||||
|
## Vulkan loader and API {#compat_vulkan}
|
||||||
|
|
||||||
|
By default, GLFW uses the standard system-wide Vulkan loader to access the
|
||||||
|
Vulkan API on all platforms except macOS. This is installed by both graphics
|
||||||
|
drivers and Vulkan SDKs. If either the loader or at least one minimally
|
||||||
|
functional ICD is missing, @ref glfwVulkanSupported will return `GLFW_FALSE` and
|
||||||
|
all other Vulkan-related functions will fail with an @ref GLFW_API_UNAVAILABLE
|
||||||
|
error.
|
||||||
|
|
||||||
|
|
||||||
|
## Vulkan WSI extensions {#compat_wsi}
|
||||||
|
|
||||||
|
The Vulkan WSI extensions are used to create Vulkan surfaces for GLFW windows on
|
||||||
|
all supported platforms.
|
||||||
|
|
||||||
|
GLFW uses the `VK_KHR_surface` and `VK_KHR_win32_surface` extensions to create
|
||||||
|
surfaces on Microsoft Windows. If any of these extensions are not available,
|
||||||
|
@ref glfwGetRequiredInstanceExtensions will return an empty list and window
|
||||||
|
surface creation will fail.
|
||||||
|
|
||||||
|
GLFW uses the `VK_KHR_surface` and either the `VK_MVK_macos_surface` or
|
||||||
|
`VK_EXT_metal_surface` extensions to create surfaces on macOS. If any of these
|
||||||
|
extensions are not available, @ref glfwGetRequiredInstanceExtensions will
|
||||||
|
return an empty list and window surface creation will fail.
|
||||||
|
|
||||||
|
GLFW uses the `VK_KHR_surface` and either the `VK_KHR_xlib_surface` or
|
||||||
|
`VK_KHR_xcb_surface` extensions to create surfaces on X11. If `VK_KHR_surface`
|
||||||
|
or both `VK_KHR_xlib_surface` and `VK_KHR_xcb_surface` are not available, @ref
|
||||||
|
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
||||||
|
creation will fail.
|
||||||
|
|
||||||
|
GLFW uses the `VK_KHR_surface` and `VK_KHR_wayland_surface` extensions to create
|
||||||
|
surfaces on Wayland. If any of these extensions are not available, @ref
|
||||||
|
glfwGetRequiredInstanceExtensions will return an empty list and window surface
|
||||||
|
creation will fail.
|
||||||
|
|
284
docs/compile.dox
284
docs/compile.dox
@ -1,284 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page compile_guide Compiling GLFW
|
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This is about compiling the GLFW library itself. For information on how to
|
|
||||||
build applications that use GLFW, see @ref build_guide.
|
|
||||||
|
|
||||||
|
|
||||||
@section compile_cmake Using CMake
|
|
||||||
|
|
||||||
GLFW uses [CMake](http://www.cmake.org/) to generate project files or makefiles
|
|
||||||
for a particular development environment. If you are on a Unix-like system such
|
|
||||||
as Linux or FreeBSD or have a package system like Fink, MacPorts, Cygwin or
|
|
||||||
Homebrew, you can simply install its CMake package. If not, you can download
|
|
||||||
installers for Windows and OS X from the [CMake website](http://www.cmake.org/).
|
|
||||||
|
|
||||||
@note CMake only generates project files or makefiles. It does not compile the
|
|
||||||
actual GLFW library. To compile GLFW, first generate these files for your
|
|
||||||
chosen development environment and then use them to compile the actual GLFW
|
|
||||||
library.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_deps Dependencies
|
|
||||||
|
|
||||||
Once you have installed CMake, make sure that all other dependencies are
|
|
||||||
available. On some platforms, GLFW needs a few additional packages to be
|
|
||||||
installed. See the section for your chosen platform and development environment
|
|
||||||
below.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_msvc Dependencies for Visual C++ on Windows
|
|
||||||
|
|
||||||
The Microsoft Platform SDK that is installed along with Visual C++ already
|
|
||||||
contains all the necessary headers, link libraries and tools except for CMake.
|
|
||||||
Move on to @ref compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_mingw Dependencies for MinGW or MinGW-w64 on Windows
|
|
||||||
|
|
||||||
Both the MinGW and the MinGW-w64 packages already contain all the necessary
|
|
||||||
headers, link libraries and tools except for CMake. Move on to @ref
|
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_mingw_cross Dependencies for MinGW or MinGW-w64 cross-compilation
|
|
||||||
|
|
||||||
Both Cygwin and many Linux distributions have MinGW or MinGW-w64 packages. For
|
|
||||||
example, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages
|
|
||||||
for 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives
|
|
||||||
like Ubuntu have the `mingw-w64` package for both.
|
|
||||||
|
|
||||||
GLFW has CMake toolchain files in the `CMake/` directory that allow for easy
|
|
||||||
cross-compilation of Windows binaries. To use these files you need to add a
|
|
||||||
special parameter when generating the project files or makefiles:
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-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 Debian/Ubuntu and Cygwin MinGW-w64 packages
|
|
||||||
have `/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct
|
|
||||||
invocation would be:
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
For more details see the article
|
|
||||||
[CMake Cross Compiling](http://www.paraview.org/Wiki/CMake_Cross_Compiling) on
|
|
||||||
the CMake wiki.
|
|
||||||
|
|
||||||
Once you have this set up, move on to @ref compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_xcode Dependencies for Xcode on OS X
|
|
||||||
|
|
||||||
Xcode comes with all necessary tools except for CMake. The required headers
|
|
||||||
and libraries are included in the core OS X frameworks. Xcode can be downloaded
|
|
||||||
from the Mac App Store or from the ADC Member Center.
|
|
||||||
|
|
||||||
Once you have Xcode installed, move on to @ref compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_deps_x11 Dependencies for Linux and X11
|
|
||||||
|
|
||||||
To compile GLFW for X11, you need to have the X11 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 `xorg-dev`
|
|
||||||
package, which pulls in all X.org header packages.
|
|
||||||
|
|
||||||
Once you have installed the necessary packages, move on to @ref
|
|
||||||
compile_generate.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_generate Generating build files with CMake
|
|
||||||
|
|
||||||
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
|
|
||||||
paths for this: the path to the _root_ directory of the GLFW source tree (i.e.
|
|
||||||
_not_ the `src` subdirectory) and the target path for the generated files and
|
|
||||||
compiled binaries. If these are the same, it is called an in-tree build,
|
|
||||||
otherwise it is called an out-of-tree build.
|
|
||||||
|
|
||||||
One of several advantages of out-of-tree builds is that you can generate files
|
|
||||||
and compile for different development environments using a single source tree.
|
|
||||||
|
|
||||||
@note This section is about generating the project files or makefiles necessary
|
|
||||||
to compile the GLFW library, not about compiling the actual library.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_cli Generating files with the CMake command-line tool
|
|
||||||
|
|
||||||
To make an in-tree build, enter the _root_ directory of the GLFW source tree
|
|
||||||
(i.e. _not_ the `src` subdirectory) and run CMake. The current directory is
|
|
||||||
used as target path, while the path provided as an argument is used to find the
|
|
||||||
source tree.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cd <glfw-root-dir>
|
|
||||||
cmake .
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
To make an out-of-tree build, make a directory outside of the source tree, enter
|
|
||||||
it and run CMake with the (relative or absolute) path to the root of the source
|
|
||||||
tree as an argument.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
mkdir glfw-build
|
|
||||||
cd glfw-build
|
|
||||||
cmake <glfw-root-dir>
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
|
||||||
development environment, move on to @ref compile_compile.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_generate_gui Generating files with the CMake GUI
|
|
||||||
|
|
||||||
If you are using the GUI version, choose the root of the GLFW source tree as
|
|
||||||
source location and the same directory or another, empty directory as the
|
|
||||||
destination for binaries. Choose _Configure_, change any options you wish to,
|
|
||||||
_Configure_ again to let the changes take effect and then _Generate_.
|
|
||||||
|
|
||||||
Once you have generated the project files or makefiles for your chosen
|
|
||||||
development environment, move on to @ref compile_compile.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_compile Compiling the library
|
|
||||||
|
|
||||||
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
|
|
||||||
these files, as you would with any other project.
|
|
||||||
|
|
||||||
Once the GLFW library is compiled, you are ready to build your applications,
|
|
||||||
linking it to the GLFW library. See @ref build_guide for more information.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compile_options CMake options
|
|
||||||
|
|
||||||
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
|
|
||||||
among projects using CMake and so have no `GLFW_` prefix.
|
|
||||||
|
|
||||||
If you are using the GUI version of CMake, these are listed and can be changed
|
|
||||||
from there. If you are using the command-line version of CMake you can use the
|
|
||||||
`ccmake` ncurses GUI to set options. Some package systems like Ubuntu and other
|
|
||||||
distributions based on Debian GNU/Linux have this tool in a separate
|
|
||||||
`cmake-curses-gui` package.
|
|
||||||
|
|
||||||
Finally, if you don't want to use any GUI, you can set options from the `cmake`
|
|
||||||
command-line with the `-D` flag.
|
|
||||||
|
|
||||||
@code{.sh}
|
|
||||||
cmake -DBUILD_SHARED_LIBS=ON .
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_options_shared Shared CMake options
|
|
||||||
|
|
||||||
`BUILD_SHARED_LIBS` determines whether GLFW is built as a static
|
|
||||||
library or as a DLL / shared library / dynamic library.
|
|
||||||
|
|
||||||
`LIB_SUFFIX` affects where the GLFW shared /dynamic library is installed. If it
|
|
||||||
is empty, it is installed to `${CMAKE_INSTALL_PREFIX}/lib`. If it is set to
|
|
||||||
`64`, it is installed to `${CMAKE_INSTALL_PREFIX}/lib64`.
|
|
||||||
|
|
||||||
`GLFW_BUILD_EXAMPLES` determines whether the GLFW examples are built
|
|
||||||
along with the library.
|
|
||||||
|
|
||||||
`GLFW_BUILD_TESTS` determines whether the GLFW test programs are
|
|
||||||
built along with the library.
|
|
||||||
|
|
||||||
`GLFW_BUILD_DOCS` determines whether the GLFW documentation is built along with
|
|
||||||
the library.
|
|
||||||
|
|
||||||
`GLFW_VULKAN_STATIC` determines whether to use the Vulkan loader linked
|
|
||||||
statically into the application.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_options_osx OS X specific CMake options
|
|
||||||
|
|
||||||
`GLFW_USE_CHDIR` determines whether `glfwInit` changes the current
|
|
||||||
directory of bundled applications to the `Contents/Resources` directory.
|
|
||||||
|
|
||||||
`GLFW_USE_MENUBAR` determines whether the first call to
|
|
||||||
`glfwCreateWindow` sets up a minimal menu bar.
|
|
||||||
|
|
||||||
`GLFW_USE_RETINA` determines whether windows will use the full resolution of
|
|
||||||
Retina displays.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection compile_options_win32 Windows specific CMake options
|
|
||||||
|
|
||||||
`USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the
|
|
||||||
static library version of the Visual C++ runtime library. If set to `ON`, the
|
|
||||||
DLL version of the Visual C++ library is used.
|
|
||||||
|
|
||||||
`GLFW_USE_HYBRID_HPG` determines whether to export the `NvOptimusEnablement` and
|
|
||||||
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
|
||||||
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
|
|
||||||
will not work if GLFW is built as a DLL.
|
|
||||||
|
|
||||||
|
|
||||||
@section compile_manual Compiling GLFW manually
|
|
||||||
|
|
||||||
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
|
|
||||||
a configuration macro to be defined in order to know what window system it's
|
|
||||||
being compiled for and also has optional, platform-specific ones for various
|
|
||||||
features.
|
|
||||||
|
|
||||||
When building with CMake, the `glfw_config.h` configuration header is generated
|
|
||||||
based on the current platform and CMake options. The GLFW CMake environment
|
|
||||||
defines `_GLFW_USE_CONFIG_H`, which causes this header to be included by
|
|
||||||
`internal.h`. Without this macro, GLFW will expect the necessary configuration
|
|
||||||
macros to be defined on the command-line.
|
|
||||||
|
|
||||||
The window creation API is used to create windows, handle input, monitors, gamma
|
|
||||||
ramps and clipboard. The options are:
|
|
||||||
|
|
||||||
- `_GLFW_COCOA` to use the Cocoa frameworks
|
|
||||||
- `_GLFW_WIN32` to use the Win32 API
|
|
||||||
- `_GLFW_X11` to use the X Window System
|
|
||||||
- `_GLFW_WAYLAND` to use the Wayland API (experimental and incomplete)
|
|
||||||
- `_GLFW_MIR` to use the Mir API (experimental and incomplete)
|
|
||||||
|
|
||||||
If you are building GLFW as a shared library / dynamic library / DLL then you
|
|
||||||
must also define `_GLFW_BUILD_DLL`. Otherwise, you must not define it.
|
|
||||||
|
|
||||||
If you are linking the Vulkan loader statically into your application then you
|
|
||||||
must also define `_GLFW_VULKAN_STATIC`. Otherwise, GLFW will attempt to use the
|
|
||||||
external version.
|
|
||||||
|
|
||||||
For the EGL context creation API, the following options are available:
|
|
||||||
|
|
||||||
- `_GLFW_USE_EGLPLATFORM_H` to use `EGL/eglplatform.h` for native handle
|
|
||||||
definitions (fallback)
|
|
||||||
|
|
||||||
If you are using the X11 window creation API, support for the following X11
|
|
||||||
extensions can be enabled:
|
|
||||||
|
|
||||||
- `_GLFW_HAS_XF86VM` to use Xxf86vm as a fallback when RandR gamma is broken
|
|
||||||
(recommended)
|
|
||||||
|
|
||||||
If you are using the Cocoa window creation API, the following options are
|
|
||||||
available:
|
|
||||||
|
|
||||||
- `_GLFW_USE_CHDIR` to `chdir` to the `Resources` subdirectory of the
|
|
||||||
application bundle during @ref glfwInit (recommended)
|
|
||||||
- `_GLFW_USE_MENUBAR` to create and populate the menu bar when the first window
|
|
||||||
is created (recommended)
|
|
||||||
- `_GLFW_USE_RETINA` to have windows use the full resolution of Retina displays
|
|
||||||
(recommended)
|
|
||||||
|
|
||||||
@note None of the @ref build_macros may be defined during the compilation of
|
|
||||||
GLFW. If you define any of these in your build files, make sure they are not
|
|
||||||
applied to the GLFW sources.
|
|
||||||
|
|
||||||
*/
|
|
371
docs/compile.md
Normal file
371
docs/compile.md
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
# Compiling GLFW {#compile_guide}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
This is about compiling the GLFW library itself. For information on how to
|
||||||
|
build applications that use GLFW, see @ref build_guide.
|
||||||
|
|
||||||
|
GLFW uses some C99 features and does not support Visual Studio 2012 and earlier.
|
||||||
|
|
||||||
|
|
||||||
|
## Using CMake {#compile_cmake}
|
||||||
|
|
||||||
|
GLFW behaves like most other libraries that use CMake so this guide mostly
|
||||||
|
describes the standard configure, generate and 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
|
||||||
|
for your chosen development environment. To compile GLFW, first generate these
|
||||||
|
files with CMake and then use them to compile the GLFW library.
|
||||||
|
|
||||||
|
If you are on Windows and macOS you can [download
|
||||||
|
CMake](https://cmake.org/download/) from their site.
|
||||||
|
|
||||||
|
If you are on a Unix-like system such as Linux, FreeBSD or Cygwin or have
|
||||||
|
a package system like Fink, MacPorts or Homebrew, you can install its CMake
|
||||||
|
package.
|
||||||
|
|
||||||
|
CMake is a complex tool and this guide will only show a few of the possible ways
|
||||||
|
to set up and compile GLFW. The CMake project has their own much more detailed
|
||||||
|
[CMake user guide][cmake-guide] that includes everything in this guide not
|
||||||
|
specific to GLFW. It may be a useful companion to this one.
|
||||||
|
|
||||||
|
[cmake-guide]: https://cmake.org/cmake/help/latest/guide/user-interaction/
|
||||||
|
|
||||||
|
|
||||||
|
### Installing dependencies {#compile_deps}
|
||||||
|
|
||||||
|
The C/C++ development environments in Visual Studio, Xcode and MinGW come with
|
||||||
|
all necessary dependencies for compiling GLFW, but on Unix-like systems like
|
||||||
|
Linux and FreeBSD you will need a few extra packages.
|
||||||
|
|
||||||
|
|
||||||
|
#### Dependencies for Wayland and X11 {#compile_deps_wayland}
|
||||||
|
|
||||||
|
By default, both the Wayland and X11 backends are enabled on Linux and other Unix-like
|
||||||
|
systems (except macOS). To disable one or both of these, set the @ref GLFW_BUILD_WAYLAND
|
||||||
|
or @ref GLFW_BUILD_X11 CMake options in the next step when generating build files.
|
||||||
|
|
||||||
|
To compile GLFW for both Wayland and X11, you need to have the X11, Wayland and xkbcommon
|
||||||
|
development packages installed. On some systems a few other packages are also required.
|
||||||
|
None of the development packages above are needed to build or run programs that use an
|
||||||
|
already compiled GLFW library.
|
||||||
|
|
||||||
|
On Debian and derivatives like Ubuntu and Linux Mint you will need the `libwayland-dev`
|
||||||
|
and `libxkbcommon-dev` packages to compile for Wayland and the `xorg-dev` meta-package to
|
||||||
|
compile for X11. These will pull in all other dependencies.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo apt install libwayland-dev libxkbcommon-dev xorg-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
On Fedora and derivatives like Red Hat you will need the `wayland-devel` and
|
||||||
|
`libxkbcommon-devel` packages to compile for Wayland and the `libXcursor-devel`,
|
||||||
|
`libXi-devel`, `libXinerama-devel` and `libXrandr-devel` packages to compile for X11.
|
||||||
|
These will pull in all other dependencies.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo dnf install wayland-devel libxkbcommon-devel libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
||||||
|
```
|
||||||
|
|
||||||
|
On FreeBSD you will need the `wayland`, `libxkbcommon` and `evdev-proto` packages to
|
||||||
|
compile for Wayland. The X11 headers are installed along the end-user X11 packages, so if
|
||||||
|
you have an X server running you should have the headers as well. If not, install the
|
||||||
|
`xorgproto` package to compile for X11.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install wayland libxkbcommon evdev-proto xorgproto
|
||||||
|
```
|
||||||
|
|
||||||
|
On Cygwin Wayland is not supported but you will need the `libXcursor-devel`,
|
||||||
|
`libXi-devel`, `libXinerama-devel`, `libXrandr-devel` and `libXrender-devel` packages to
|
||||||
|
compile for X11. These can be found in the Libs section of the GUI installer and will
|
||||||
|
pull in all other dependencies.
|
||||||
|
|
||||||
|
Once you have the required dependencies, move on to @ref compile_generate.
|
||||||
|
|
||||||
|
|
||||||
|
### Generating build files with CMake {#compile_generate}
|
||||||
|
|
||||||
|
Once you have all necessary dependencies it is time to generate the project
|
||||||
|
files or makefiles for your development environment. CMake needs two paths for
|
||||||
|
this:
|
||||||
|
|
||||||
|
- the path to the root directory of the GLFW source tree (not its `src`
|
||||||
|
subdirectory)
|
||||||
|
- the path to the directory where the generated build files and compiled
|
||||||
|
binaries will be placed
|
||||||
|
|
||||||
|
If these are the same, it is called an in-tree build, otherwise it is called an
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
#### Generating with the CMake GUI {#compile_generate_gui}
|
||||||
|
|
||||||
|
Start the CMake GUI and set the paths to the source and build directories
|
||||||
|
described above. Then press _Configure_ and _Generate_.
|
||||||
|
|
||||||
|
If you wish change any CMake variables in the list, press _Configure_ and then
|
||||||
|
_Generate_ to have the new values take effect. The variable list will be
|
||||||
|
populated after the first configure step.
|
||||||
|
|
||||||
|
By default, GLFW will use Wayland and X11 on Linux and other Unix-like systems other than
|
||||||
|
macOS. To disable support for one or both of these, set the @ref GLFW_BUILD_WAYLAND
|
||||||
|
and/or @ref GLFW_BUILD_X11 option in the GLFW section of the variable list, then apply the
|
||||||
|
new value as described above.
|
||||||
|
|
||||||
|
Once you have generated the project files or makefiles for your chosen
|
||||||
|
development environment, move on to @ref compile_compile.
|
||||||
|
|
||||||
|
|
||||||
|
#### Generating with command-line CMake {#compile_generate_cli}
|
||||||
|
|
||||||
|
To make a build directory, pass the source and build directories to the `cmake`
|
||||||
|
command. These can be relative or absolute paths. The build directory is
|
||||||
|
created if it doesn't already exist.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd path/to/glfw
|
||||||
|
cmake -S . -B build
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build -G Xcode
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, GLFW will use Wayland and X11 on Linux and other Unix-like systems other than
|
||||||
|
macOS. To disable support for one or both of these, set the @ref GLFW_BUILD_WAYLAND
|
||||||
|
and/or @ref GLFW_BUILD_X11 CMake option.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D GLFW_BUILD_X11=0
|
||||||
|
```
|
||||||
|
|
||||||
|
Once you have generated the project files or makefiles for your chosen
|
||||||
|
development environment, move on to @ref compile_compile.
|
||||||
|
|
||||||
|
|
||||||
|
### Compiling the library {#compile_compile}
|
||||||
|
|
||||||
|
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
|
||||||
|
these files as you would with any other project.
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd path/to/build
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
With MinGW, it is `mingw32-make`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd path/to/build
|
||||||
|
mingw32-make
|
||||||
|
```
|
||||||
|
|
||||||
|
Any CMake build directory can also be built with the `cmake` command and the
|
||||||
|
`--build` flag.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake --build path/to/build
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
## CMake options {#compile_options}
|
||||||
|
|
||||||
|
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
|
||||||
|
among projects using CMake and so have no `GLFW_` prefix.
|
||||||
|
|
||||||
|
If you are using the GUI version of CMake, these are listed and can be changed
|
||||||
|
from there. If you are using the command-line version of CMake you can use the
|
||||||
|
`ccmake` ncurses GUI to set options. Some package systems like Ubuntu and other
|
||||||
|
distributions based on Debian GNU/Linux have this tool in a separate
|
||||||
|
`cmake-curses-gui` package.
|
||||||
|
|
||||||
|
Finally, if you don't want to use any GUI, you can set options from the `cmake`
|
||||||
|
command-line with the `-D` flag.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D BUILD_SHARED_LIBS=ON
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Shared CMake options {#compile_options_shared}
|
||||||
|
|
||||||
|
@anchor BUILD_SHARED_LIBS
|
||||||
|
__BUILD_SHARED_LIBS__ determines whether GLFW is built as a static library or as
|
||||||
|
a DLL / shared library / dynamic library. This is disabled by default,
|
||||||
|
producing a static GLFW library. This variable has no `GLFW_` prefix because it
|
||||||
|
is defined by CMake. If you want to change the library only for GLFW when it is
|
||||||
|
part of a larger project, see @ref GLFW_LIBRARY_TYPE.
|
||||||
|
|
||||||
|
@anchor GLFW_LIBRARY_TYPE
|
||||||
|
__GLFW_LIBRARY_TYPE__ allows you to override @ref BUILD_SHARED_LIBS only for
|
||||||
|
GLFW, without affecting other libraries in a larger project. When set, the
|
||||||
|
value of this option must be a valid CMake library type. Set it to `STATIC` to
|
||||||
|
build GLFW as a static library, `SHARED` to build it as a shared library
|
||||||
|
/ dynamic library / DLL, or `OBJECT` to make GLFW a CMake object library.
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_EXAMPLES
|
||||||
|
__GLFW_BUILD_EXAMPLES__ determines whether the GLFW examples are built
|
||||||
|
along with the library. This is enabled by default unless GLFW is being built
|
||||||
|
as a subproject of a larger CMake project.
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_TESTS
|
||||||
|
__GLFW_BUILD_TESTS__ determines whether the GLFW test programs are
|
||||||
|
built along with the library. This is enabled by default unless GLFW is being
|
||||||
|
built as a subproject of a larger CMake project.
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_DOCS
|
||||||
|
__GLFW_BUILD_DOCS__ determines whether the GLFW documentation is built along
|
||||||
|
with the library. This is enabled by default if
|
||||||
|
[Doxygen](https://www.doxygen.nl/) is found by CMake during configuration.
|
||||||
|
|
||||||
|
|
||||||
|
### Win32 specific CMake options {#compile_options_win32}
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_WIN32
|
||||||
|
__GLFW_BUILD_WIN32__ determines whether to include support for Win32 when compiling the
|
||||||
|
library. This option is only available when compiling for Windows. This is enabled by
|
||||||
|
default.
|
||||||
|
|
||||||
|
@anchor USE_MSVC_RUNTIME_LIBRARY_DLL
|
||||||
|
__USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or the
|
||||||
|
static library version of the Visual C++ runtime library. When enabled, the
|
||||||
|
DLL version of the Visual C++ library is used. This is enabled by default.
|
||||||
|
|
||||||
|
It is recommended to set the standard CMake variable [CMAKE_MSVC_RUNTIME_LIBRARY][]
|
||||||
|
instead of this GLFW-specific option.
|
||||||
|
|
||||||
|
[CMAKE_MSVC_RUNTIME_LIBRARY]: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
|
||||||
|
|
||||||
|
@anchor GLFW_USE_HYBRID_HPG
|
||||||
|
__GLFW_USE_HYBRID_HPG__ determines whether to export the `NvOptimusEnablement` and
|
||||||
|
`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the
|
||||||
|
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
|
||||||
|
will not work if GLFW is built as a DLL. This is disabled by default, letting
|
||||||
|
the operating system and driver decide.
|
||||||
|
|
||||||
|
|
||||||
|
### macOS specific CMake options {#compile_options_macos}
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_COCOA
|
||||||
|
__GLFW_BUILD_COCOA__ determines whether to include support for Cocoa when compiling the
|
||||||
|
library. This option is only available when compiling for macOS. This is enabled by
|
||||||
|
default.
|
||||||
|
|
||||||
|
|
||||||
|
### Unix-like system specific CMake options {#compile_options_unix}
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_WAYLAND
|
||||||
|
__GLFW_BUILD_WAYLAND__ determines whether to include support for Wayland when compiling
|
||||||
|
the library. This option is only available when compiling for Linux and other Unix-like
|
||||||
|
systems other than macOS. This is enabled by default.
|
||||||
|
|
||||||
|
@anchor GLFW_BUILD_X11
|
||||||
|
__GLFW_BUILD_X11__ determines whether to include support for X11 when compiling the
|
||||||
|
library. This option is only available when compiling for Linux and other Unix-like
|
||||||
|
systems other than macOS. This is enabled by default.
|
||||||
|
|
||||||
|
|
||||||
|
## Cross-compilation with CMake and MinGW {#compile_mingw_cross}
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=path/to/file
|
||||||
|
```
|
||||||
|
|
||||||
|
The exact toolchain file to use depends on the prefix used by the MinGW or
|
||||||
|
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:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S path/to/glfw -B path/to/build -D CMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake
|
||||||
|
```
|
||||||
|
|
||||||
|
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][cmake-toolchains].
|
||||||
|
|
||||||
|
[cmake-toolchains]: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
|
||||||
|
|
||||||
|
|
||||||
|
## Compiling GLFW manually {#compile_manual}
|
||||||
|
|
||||||
|
If you wish to compile GLFW without its CMake build environment then you will have to do
|
||||||
|
at least some platform-detection yourself. There are preprocessor macros for
|
||||||
|
enabling support for the platforms (window systems) available. There are also optional,
|
||||||
|
platform-specific macros for various features.
|
||||||
|
|
||||||
|
When building, GLFW will expect the necessary configuration macros to be defined
|
||||||
|
on the command-line. The GLFW CMake files set these as private compile
|
||||||
|
definitions on the GLFW target but if you compile the GLFW sources manually you
|
||||||
|
will need to define them yourself.
|
||||||
|
|
||||||
|
The window system is used to create windows, handle input, monitors, gamma ramps and
|
||||||
|
clipboard. The options are:
|
||||||
|
|
||||||
|
- @b _GLFW_COCOA to use the Cocoa frameworks
|
||||||
|
- @b _GLFW_WIN32 to use the Win32 API
|
||||||
|
- @b _GLFW_WAYLAND to use the Wayland protocol
|
||||||
|
- @b _GLFW_X11 to use the X Window System
|
||||||
|
|
||||||
|
The @b _GLFW_WAYLAND and @b _GLFW_X11 macros may be combined and produces a library that
|
||||||
|
attempts to detect the appropriate platform at initialization.
|
||||||
|
|
||||||
|
If you are building GLFW as a shared library / dynamic library / DLL then you
|
||||||
|
must also define @b _GLFW_BUILD_DLL. Otherwise, you must not define it.
|
||||||
|
|
||||||
|
If you are using a custom name for the Vulkan, EGL, GLX, OSMesa, OpenGL, GLESv1
|
||||||
|
or GLESv2 library, you can override the default names by defining those you need
|
||||||
|
of @b _GLFW_VULKAN_LIBRARY, @b _GLFW_EGL_LIBRARY, @b _GLFW_GLX_LIBRARY, @b
|
||||||
|
_GLFW_OSMESA_LIBRARY, @b _GLFW_OPENGL_LIBRARY, @b _GLFW_GLESV1_LIBRARY and @b
|
||||||
|
_GLFW_GLESV2_LIBRARY. Otherwise, GLFW will use the built-in default names.
|
||||||
|
|
||||||
|
@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
|
||||||
|
applied to the GLFW sources.
|
||||||
|
|
@ -1,8 +1,6 @@
|
|||||||
/*!
|
# Context guide {#context_guide}
|
||||||
|
|
||||||
@page context_guide Context guide
|
[TOC]
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide introduces the OpenGL and OpenGL ES context related functions of
|
This guide introduces the OpenGL and OpenGL ES context related functions of
|
||||||
GLFW. For details on a specific function in this category, see the @ref
|
GLFW. For details on a specific function in this category, see the @ref
|
||||||
@ -15,7 +13,7 @@ context. There are also guides for the other areas of the GLFW API.
|
|||||||
- @ref input_guide
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
@section context_object Context objects
|
## Context objects {#context_object}
|
||||||
|
|
||||||
A window object encapsulates both a top-level window and an OpenGL or OpenGL ES
|
A window object encapsulates both a top-level window and an OpenGL or OpenGL ES
|
||||||
context. It is created with @ref glfwCreateWindow and destroyed with @ref
|
context. It is created with @ref glfwCreateWindow and destroyed with @ref
|
||||||
@ -30,51 +28,51 @@ the `glfwinfo` test program.
|
|||||||
|
|
||||||
@note Vulkan does not have a context and the Vulkan instance is created via the
|
@note Vulkan does not have a context and the Vulkan instance is created via the
|
||||||
Vulkan API itself. If you will be using Vulkan to render to a window, disable
|
Vulkan API itself. If you will be using Vulkan to render to a window, disable
|
||||||
context creation by setting the [GLFW_CLIENT_API](@ref window_hints_ctx) hint to
|
context creation by setting the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint)
|
||||||
`GLFW_NO_API`. For more information, see the @ref vulkan_guide.
|
hint to `GLFW_NO_API`. For more information, see the @ref vulkan_guide.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_hints Context creation hints
|
### Context creation hints {#context_hints}
|
||||||
|
|
||||||
There are a number of hints, specified using @ref glfwWindowHint, related to
|
There are a number of hints, specified using @ref glfwWindowHint, related to
|
||||||
what kind of context is created. See
|
what kind of context is created. See
|
||||||
[context related hints](@ref window_hints_ctx) in the window guide.
|
[context related hints](@ref window_hints_ctx) in the window guide.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_sharing Context object sharing
|
### Context object sharing {#context_sharing}
|
||||||
|
|
||||||
When creating a window and its OpenGL or OpenGL ES context with @ref
|
When creating a window and its OpenGL or OpenGL ES context with @ref
|
||||||
glfwCreateWindow, you can specify another window whose context the new one
|
glfwCreateWindow, you can specify another window whose context the new one
|
||||||
should share its objects (textures, vertex and element buffers, etc.) with.
|
should share its objects (textures, vertex and element buffers, etc.) with.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
GLFWwindow* second_window = glfwCreateWindow(640, 480, "Second Window", NULL, first_window);
|
GLFWwindow* second_window = glfwCreateWindow(640, 480, "Second Window", NULL, first_window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Object sharing is implemented by the operating system and graphics driver. On
|
Object sharing is implemented by the operating system and graphics driver. On
|
||||||
platforms where it is possible to choose which types of objects are shared, GLFW
|
platforms where it is possible to choose which types of objects are shared, GLFW
|
||||||
requests that all types are shared.
|
requests that all types are shared.
|
||||||
|
|
||||||
See the relevant chapter of the [OpenGL](https://www.opengl.org/registry/) or
|
See the relevant chapter of the [OpenGL](https://www.opengl.org/registry/) or
|
||||||
[OpenGL ES](http://www.khronos.org/opengles/) reference documents for more
|
[OpenGL ES](https://www.khronos.org/opengles/) reference documents for more
|
||||||
information. The name and number of this chapter unfortunately varies between
|
information. The name and number of this chapter unfortunately varies between
|
||||||
versions and APIs, but has at times been named _Shared Objects and Multiple
|
versions and APIs, but has at times been named _Shared Objects and Multiple
|
||||||
Contexts_.
|
Contexts_.
|
||||||
|
|
||||||
GLFW comes with a simple object sharing test program called `sharing`.
|
GLFW comes with a bare-bones object sharing example program called `sharing`.
|
||||||
|
|
||||||
|
|
||||||
@subsection context_offscreen Offscreen contexts
|
### Offscreen contexts {#context_offscreen}
|
||||||
|
|
||||||
GLFW doesn't support creating contexts without an associated window. However,
|
GLFW doesn't support creating contexts without an associated window. However,
|
||||||
contexts with hidden windows can be created with the
|
contexts with hidden windows can be created with the
|
||||||
[GLFW_VISIBLE](@ref window_hints_wnd) window hint.
|
[GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
||||||
|
|
||||||
GLFWwindow* offscreen_context = glfwCreateWindow(640, 480, "", NULL, NULL);
|
GLFWwindow* offscreen_context = glfwCreateWindow(640, 480, "", NULL, NULL);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The window never needs to be shown and its context can be used as a plain
|
The window never needs to be shown and its context can be used as a plain
|
||||||
offscreen context. Depending on the window manager, the size of a hidden
|
offscreen context. Depending on the window manager, the size of a hidden
|
||||||
@ -84,37 +82,36 @@ objects are recommended for rendering with such contexts.
|
|||||||
You should still [process events](@ref events) as long as you have at least one
|
You should still [process events](@ref events) as long as you have at least one
|
||||||
window, even if none of them are visible.
|
window, even if none of them are visible.
|
||||||
|
|
||||||
__OS X:__ The first time a window is created the menu bar is populated with
|
|
||||||
common commands like Hide, Quit and About. This is not desirable for example
|
|
||||||
when writing a command-line only application. The menu bar setup can be
|
|
||||||
disabled with a [compile-time option](@ref compile_options_osx).
|
|
||||||
|
|
||||||
|
### Windows without contexts {#context_less}
|
||||||
@subsection context_less Windows without contexts
|
|
||||||
|
|
||||||
You can disable context creation by setting the
|
You can disable context creation by setting the
|
||||||
[GLFW_CLIENT_API](@ref window_hints_ctx) hint to `GLFW_NO_API`. Windows without
|
[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_NO_API`.
|
||||||
contexts must not be passed to @ref glfwMakeContextCurrent or @ref
|
|
||||||
glfwSwapBuffers.
|
Windows without contexts should not be passed to @ref glfwMakeContextCurrent or
|
||||||
|
@ref glfwSwapBuffers. Doing this generates a @ref GLFW_NO_WINDOW_CONTEXT error.
|
||||||
|
|
||||||
|
|
||||||
@section context_current Current context
|
## Current context {#context_current}
|
||||||
|
|
||||||
Before you can make OpenGL or OpenGL ES calls, you need to have a current
|
Before you can make OpenGL or OpenGL ES calls, you need to have a current
|
||||||
context of the correct type. A context can only be current for a single thread
|
context of the correct type. A context can only be current for a single thread
|
||||||
at a time, and a thread can only have a single context current at a time.
|
at a time, and a thread can only have a single context current at a time.
|
||||||
|
|
||||||
|
When moving a context between threads, you must make it non-current on the old
|
||||||
|
thread before making it current on the new one.
|
||||||
|
|
||||||
The context of a window is made current with @ref glfwMakeContextCurrent.
|
The context of a window is made current with @ref glfwMakeContextCurrent.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The window of the current context is returned by @ref glfwGetCurrentContext.
|
The window of the current context is returned by @ref glfwGetCurrentContext.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
GLFWwindow* window = glfwGetCurrentContext();
|
GLFWwindow* window = glfwGetCurrentContext();
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The following GLFW functions require a context to be current. Calling any these
|
The following GLFW functions require a context to be current. Calling any these
|
||||||
functions without a current context will generate a @ref GLFW_NO_CURRENT_CONTEXT
|
functions without a current context will generate a @ref GLFW_NO_CURRENT_CONTEXT
|
||||||
@ -125,13 +122,12 @@ error.
|
|||||||
- @ref glfwGetProcAddress
|
- @ref glfwGetProcAddress
|
||||||
|
|
||||||
|
|
||||||
@section context_swap Buffer swapping
|
## Buffer swapping {#context_swap}
|
||||||
|
|
||||||
Buffer swapping is part of the window and framebuffer, not the context. See
|
See @ref buffer_swap in the window guide.
|
||||||
@ref buffer_swap.
|
|
||||||
|
|
||||||
|
|
||||||
@section context_glext OpenGL and OpenGL ES extensions
|
## OpenGL and OpenGL ES extensions {#context_glext}
|
||||||
|
|
||||||
One of the benefits of OpenGL and OpenGL ES is their extensibility.
|
One of the benefits of OpenGL and OpenGL ES is their extensibility.
|
||||||
Hardware vendors may include extensions in their implementations that extend the
|
Hardware vendors may include extensions in their implementations that extend the
|
||||||
@ -141,26 +137,26 @@ 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
|
||||||
are many different affixes, like `NV` for Nvidia and `AMD` for, well, AMD. Any
|
are many different affixes, like `NV` for Nvidia and `AMD` for, well, AMD. Any
|
||||||
group may also use the generic `EXT` affix. Lists of extensions, together with
|
group may also use the generic `EXT` affix. Lists of extensions, together with
|
||||||
their specifications, can be found at the
|
their specifications, can be found at the
|
||||||
[OpenGL Registry](http://www.opengl.org/registry/) and
|
[OpenGL Registry](https://www.opengl.org/registry/) and
|
||||||
[OpenGL ES Registry](https://www.khronos.org/registry/gles/).
|
[OpenGL ES Registry](https://www.khronos.org/registry/gles/).
|
||||||
|
|
||||||
|
|
||||||
@subsection context_glext_auto Loading extension with a loader library
|
### Loading extension with a loader library {#context_glext_auto}
|
||||||
|
|
||||||
An extension loader library is the easiest and best way to access both OpenGL and
|
An extension loader library is the easiest and best way to access both OpenGL and
|
||||||
OpenGL ES extensions and modern versions of the core OpenGL or OpenGL ES APIs.
|
OpenGL ES extensions and modern versions of the core OpenGL or OpenGL ES APIs.
|
||||||
They will take care of all the details of declaring and loading everything you
|
They will take care of all the details of declaring and loading everything you
|
||||||
need. One such library is [glad](https://github.com/Dav1dde/glad) and there are
|
need. One such library is [glad](https://github.com/Dav1dde/glad) and there are
|
||||||
several others.
|
several others.
|
||||||
|
|
||||||
The following example will use glad but all extension loader libraries work
|
The following example will use glad but all extension loader libraries work
|
||||||
similarly.
|
similarly.
|
||||||
@ -171,9 +167,9 @@ both GLFW and glad, but loaders for OpenGL ES, as well as loaders for specific
|
|||||||
API versions and extension sets can be generated. The generated files are
|
API versions and extension sets can be generated. The generated files are
|
||||||
written to the `output` directory.
|
written to the `output` directory.
|
||||||
|
|
||||||
@code{.sh}
|
```sh
|
||||||
python main.py --generator c --no-loader --out-path output
|
python main.py --generator c --no-loader --out-path output
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The `--no-loader` option is added because GLFW already provides a function for
|
The `--no-loader` option is added because GLFW already provides a function for
|
||||||
loading OpenGL and OpenGL ES function pointers, one that automatically uses the
|
loading OpenGL and OpenGL ES function pointers, one that automatically uses the
|
||||||
@ -187,14 +183,14 @@ include the glad header file, which will replace the OpenGL header of your
|
|||||||
development environment. By including the glad header before the GLFW header,
|
development environment. By including the glad header before the GLFW header,
|
||||||
it suppresses the development environment's OpenGL or OpenGL ES header.
|
it suppresses the development environment's OpenGL or OpenGL ES header.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Finally you need to initialize glad once you have a suitable current context.
|
Finally, you need to initialize glad once you have a suitable current context.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
window = glfwCreateWindow(640, 480, "My Window", NULL, NULL);
|
window = glfwCreateWindow(640, 480, "My Window", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
@ -204,11 +200,11 @@ if (!window)
|
|||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Once glad has been loaded, you have access to all OpenGL core and extension
|
Once glad has been loaded, you have access to all OpenGL core and extension
|
||||||
functions supported by both the context you created and the glad loader you
|
functions supported by both the context you created and the glad loader you
|
||||||
generated and you are ready to start rendering.
|
generated. After that, you are ready to start rendering.
|
||||||
|
|
||||||
You can specify a minimum required OpenGL or OpenGL ES version with
|
You can specify a minimum required OpenGL or OpenGL ES version with
|
||||||
[context hints](@ref window_hints_ctx). If your needs are more complex, you can
|
[context hints](@ref window_hints_ctx). If your needs are more complex, you can
|
||||||
@ -217,25 +213,25 @@ check the actual OpenGL or OpenGL ES version with
|
|||||||
a specific version is supported by the current context with the
|
a specific version is supported by the current context with the
|
||||||
`GLAD_GL_VERSION_x_x` booleans.
|
`GLAD_GL_VERSION_x_x` booleans.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
if (GLAD_GL_VERSION_3_2)
|
if (GLAD_GL_VERSION_3_2)
|
||||||
{
|
{
|
||||||
// Call OpenGL 3.2+ specific code
|
// Call OpenGL 3.2+ specific code
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
To check whether a specific extension is supported, use the `GLAD_GL_xxx`
|
To check whether a specific extension is supported, use the `GLAD_GL_xxx`
|
||||||
booleans.
|
booleans.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
if (GLAD_GL_ARB_debug_output)
|
if (GLAD_GL_ARB_gl_spirv)
|
||||||
{
|
{
|
||||||
// Use GL_ARB_debug_output
|
// Use GL_ARB_gl_spirv
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection context_glext_manual Loading extensions manually
|
### Loading extensions manually {#context_glext_manual}
|
||||||
|
|
||||||
__Do not use this technique__ unless it is absolutely necessary. An
|
__Do not use this technique__ unless it is absolutely necessary. An
|
||||||
[extension loader library](@ref context_glext_auto) will save you a ton of
|
[extension loader library](@ref context_glext_auto) will save you a ton of
|
||||||
@ -250,11 +246,11 @@ This section will demonstrate manual loading of OpenGL extensions. The loading
|
|||||||
of OpenGL ES extensions is identical except for the name of the extension header.
|
of OpenGL ES extensions is identical except for the name of the extension header.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection context_glext_header The glext.h header
|
#### The glext.h header {#context_glext_header}
|
||||||
|
|
||||||
The `glext.h` extension header is a continually updated file that defines the
|
The `glext.h` extension header is a continually updated file that defines the
|
||||||
interfaces for all OpenGL extensions. The latest version of this can always be
|
interfaces for all OpenGL extensions. The latest version of this can always be
|
||||||
found at the [OpenGL Registry](http://www.opengl.org/registry/). There are also
|
found at the [OpenGL Registry](https://www.opengl.org/registry/). There are also
|
||||||
extension headers for the various versions of OpenGL ES at the
|
extension headers for the various versions of OpenGL ES at the
|
||||||
[OpenGL ES Registry](https://www.khronos.org/registry/gles/). It it strongly
|
[OpenGL ES Registry](https://www.khronos.org/registry/gles/). It it strongly
|
||||||
recommended that you use your own copy of the extension header, as the one
|
recommended that you use your own copy of the extension header, as the one
|
||||||
@ -262,48 +258,48 @@ 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 [GLFW_INCLUDE_GLEXT](@ref build_macros)
|
To include the extension header, define @ref GLFW_INCLUDE_GLEXT before including
|
||||||
before including the GLFW header.
|
the GLFW header.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
#define GLFW_INCLUDE_GLEXT
|
#define GLFW_INCLUDE_GLEXT
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsubsection context_glext_string Checking for extensions
|
#### Checking for extensions {#context_glext_string}
|
||||||
|
|
||||||
A given machine may not actually support the extension (it may have older
|
A given machine may not actually support the extension (it may have older
|
||||||
drivers or a graphics card that lacks the necessary hardware features), so it
|
drivers or a graphics card that lacks the necessary hardware features), so it
|
||||||
is necessary to check at run-time whether the context supports the extension.
|
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
|
```c
|
||||||
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
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The argument is a null terminated ASCII string with the extension name. If the
|
The argument is a null terminated ASCII string with the extension name. If the
|
||||||
extension is supported, @ref glfwExtensionSupported returns `GLFW_TRUE`,
|
extension is supported, @ref glfwExtensionSupported returns `GLFW_TRUE`,
|
||||||
otherwise it returns `GLFW_FALSE`.
|
otherwise it returns `GLFW_FALSE`.
|
||||||
|
|
||||||
|
|
||||||
@subsubsection context_glext_proc Fetching function pointers
|
#### Fetching function pointers {#context_glext_proc}
|
||||||
|
|
||||||
Many extensions, though not all, require the use of new OpenGL functions.
|
Many extensions, though not all, require the use of new OpenGL functions.
|
||||||
These functions often do not have entry points in the client API libraries of
|
These functions often do not have entry points in the client API libraries of
|
||||||
your operating system, making it necessary to fetch them at run time. You can
|
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
|
```c
|
||||||
PFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog = glfwGetProcAddress("glGetDebugMessageLogARB");
|
PFNGLSPECIALIZESHADERARBPROC pfnSpecializeShaderARB = glfwGetProcAddress("glSpecializeShaderARB");
|
||||||
@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)
|
||||||
same name as the function, as this may confuse your linker. Instead, you can
|
same name as the function, as this may confuse your linker. Instead, you can
|
||||||
@ -312,34 +308,33 @@ use a different prefix, like above, or some other naming scheme.
|
|||||||
Now that all the pieces have been introduced, here is what they might look like
|
Now that all the pieces have been introduced, here is what they might look like
|
||||||
when used together.
|
when used together.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
#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
|
```
|
||||||
|
|
||||||
*/
|
|
File diff suppressed because one or more lines are too long
7
docs/extra.css.map
Normal file
7
docs/extra.css.map
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"mappings": "AA8EA,2GAA4G,CAC3G,UAAU,CAAC,IAAI,CACf,WAAW,CAAC,IAAI,CAGjB,wBAAyB,CACxB,YAAY,CAAC,2CAAsD,CAGpE,4HAA6H,CAC5H,YAAY,CAAC,wCAAuD,CAGrE,wIAAyI,CACxI,YAAY,CAAC,wCAAuD,CAGrE,kBAAmB,CAClB,UAAU,CA9EgB,IAAa,CA+EvC,WAAW,CAAC,IAAI,CAGjB,sBAAuB,CACtB,KAAK,CAzFe,OAAa,CA0FjC,WAAW,CAAC,IAAI,CAGjB,4UAA6U,CAC5U,UAAU,CAAC,IAAI,CAGhB,kJAAmJ,CAClJ,MAAM,CAAC,IAAI,CAGZ,wHAAyH,CACxH,WAAW,CAAC,IAAI,CAGjB,qBAAsB,CACrB,UAAU,CAAC,IAAI,CAGhB,2LAA4L,CAC3L,OAAO,CAAC,CAAC,CAGV,wCAAyC,CACxC,OAAO,CAAC,IAAI,CAGb,iMAAkM,CACjM,UAAU,CApGW,OAA+B,CAuGrD,IAAK,CACJ,KAAK,CA1He,OAAa,CA6HlC,SAAU,CACN,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,aAAa,CAGzB,qDAAsD,CACrD,KAAK,CApHU,OAAa,CAqH5B,aAAa,CAAC,IAAI,CAGnB,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,SAAS,CAAC,IAAI,CAGf,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,aAAa,CAAC,CAAC,CACf,SAAS,CAAC,IAAI,CAGf,EAAG,CACF,WAAW,CAAC,KAAK,CACjB,aAAa,CAAC,CAAC,CACf,SAAS,CAAC,IAAI,CAGf,WAAY,CACX,SAAS,CAAC,IAAI,CACd,UAAU,CAAC,IAAI,CACf,SAAS,CAAC,KAAK,CACf,OAAO,CAAC,MAAM,CACd,MAAM,CAAC,MAAM,CAEb,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,SAAS,CAAE,IAAI,CACf,eAAe,CAAE,UAAU,CAC3B,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,OAAO,CAGvB,SAAU,CACT,WAAW,CAAC,IAAI,CAChB,aAAa,CAAC,IAAI,CAClB,KAAK,CApKqB,IAAa,CAqKvC,SAAS,CAAC,KAAK,CACf,UAAU,CAAC,yDAAyD,CAGrE,WAAY,CACX,eAAe,CAAC,IAAI,CACpB,MAAM,CAAC,UAAU,CACjB,KAAK,CAAC,KAAK,CAGZ,wBAAyB,CACxB,KAAK,CAAC,IAAI,CAGX,mCAAoC,CACnC,WAAW,CAAC,IAAI,CAChB,WAAW,CAAC,GAAG,CACf,OAAO,CAAC,KAAK,CACb,KAAK,CAvLqB,IAAa,CA0LxC,WAAY,CACX,YAAY,CAAE,CAAC,CAGhB,6CAA8C,CAC7C,UAAU,CAAC,SAAS,CAGrB,kBAAmB,CAClB,KAAK,CAnMqB,IAAa,CAsMxC,cAAe,CACd,UAAU,CAAC,MAAM,CACjB,OAAO,CAAC,GAAG,CACX,UAAU,CAAC,GAAG,CAGf,IAAK,CACJ,UAAU,CA7MgB,IAAa,CAgNxC,SAAU,CACT,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,SAAS,CAAC,IAAI,CAGf,UAAW,CACV,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,SAAS,CAAC,IAAI,CAGf,SAAU,CACT,OAAO,CAAC,IAAI,CAGb,kBAAmB,CAClB,WAAW,CAAC,IAAI,CAChB,WAAW,CAAC,IAAI,CAGjB,UAAW,CACV,UAAU,CAAC,IAAI,CACf,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,SAAS,CAAE,IAAI,CACf,eAAe,CAAE,UAAU,CAC3B,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,OAAO,CAGvB,kBAAmB,CACf,aAAa,CAAE,IAAI,CAGvB,kEAAmE,CAClE,KAAK,CAxOgB,OAA+B,CA2OrD,+BAAgC,CAC/B,KAAK,CA9Pe,OAAa,CAiQlC,qCAAsC,CACrC,KAAK,CA9NoB,IAAsB,CAiOhD,wBAA2B,CAC1B,MAAM,CAAE,UAAU,CAGnB,SAAU,CACT,UAAU,CAAC,KAAK,CAGjB,uBAAwB,CACvB,SAAS,CAAC,KAAK,CACf,MAAM,CAAC,MAAM,CACb,OAAO,CAAC,MAAM,CACd,UAAU,CAAC,SAA8B,CAG1C,sDAAuD,CACtD,UAAU,CAAC,iDAAoF,CAC/F,UAAU,CAAC,mBAAuC,CAClD,WAAW,CAAC,kBAAgD,CAC5D,UAAU,CAAC,IAAI,CACf,KAAK,CAtPa,IAAe,CAyPlC,kBAAmB,CAClB,KAAK,CAzPoB,IAAsB,CA0P/C,OAAO,CAAC,IAAI,CACZ,aAAa,CAAC,GAAG,CACjB,gBAAgB,CAAC,OAAiC,CAGnD,OAAQ,CACP,KAAK,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAGV,oCAAoC,CACnC,OAAQ,CACP,KAAK,CAAC,IAAI,CACV,KAAK,CAAC,OAAO,CACb,MAAM,CAAC,CAAC,EAIV,UAAW,CACV,SAAS,CAAC,MAAM,CAGjB,UAAW,CACV,YAAY,CAAC,KAAK,CAGnB,UAAW,CACV,SAAS,CAAC,GAAG,CACb,YAAY,CAAC,CAAC,CACd,eAAe,CAAC,IAAI,CAIjB,mCAAqB,CACjB,WAAW,CAAC,KAAK,CAIzB,mCAAoC,CACnC,UAAU,CAAC,oDAAgF,CAC3F,UAAU,CAAC,sBAAqC,CAChD,WAAW,CAAC,cAA8C,CAC1D,KAAK,CAzTU,OAAa,CA0T5B,MAAM,CAAC,iBAAgC,CACvC,aAAa,CAAC,GAAG,CAGlB,UAAW,CACV,KAAK,CAlSkB,OAAgC,CAqSxD,aAAc,CACb,MAAM,CAAC,cAA+B,CACtC,sBAAsB,CAAC,GAAG,CAC1B,uBAAuB,CAAC,GAAG,CAC3B,aAAa,CAAC,IAAI,CAGnB,aAAc,CACb,MAAM,CAAC,cAA+B,CACtC,0BAA0B,CAAC,GAAG,CAC9B,yBAAyB,CAAC,GAAG,CAC7B,UAAU,CAAC,IAAI,CAGhB,kCAAmC,CAClC,eAAe,CAAC,OAAO,CACvB,cAAc,CAAC,CAAC,CAChB,MAAM,CAAC,cAA+B,CACtC,aAAa,CAAC,GAAG,CAGlB,+HAAgI,CAC/H,KAAK,CAnUoB,IAAsB,CAoU/C,eAAe,CAAC,IAAI,CAGrB,aAAc,CACb,eAAe,CAAC,OAAO,CACvB,cAAc,CAAC,CAAC,CAChB,MAAM,CAAC,cAA+B,CACtC,aAAa,CAAC,GAAG,CAGlB,gBAAiB,CAChB,MAAM,CAAC,GAAG,CACV,UAAU,CAAC,gEAAiH,CAG7H,mCAAoC,CA3TnC,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CA4T3D,uBAAwB,CA/TvB,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAgU3D,oBAAqB,CAnUpB,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAoU3D,eAAgB,CAvUf,UAAU,CAAC,oDAAuE,CAClF,UAAU,CAAC,sBAAsC,CACjD,KAAK,CAAC,OAAwB,CAC9B,MAAM,CAAC,iBAAmD,CAwU3D,gGAAiG,CAChG,aAAa,CAAC,GAAG,CACjB,OAAO,CAAC,GAAG,CACX,WAAW,CAAC,cAAwB,CACpC,MAAM,CAAC,KAAK,CAGb,iRAAkR,CACjR,KAAK,CAAC,OAAO,CAGd,QAAS,CACR,WAAW,CAAC,OAAO,CAGpB,yBAA0B,CACzB,UAAU,CAAC,OAAa,CACxB,aAAa,CAAC,GAAG,CACjB,MAAM,CAAC,IAAI,CACX,OAAO,CAAC,GAAG,CACX,QAAQ,CAAC,IAAI,CACb,WAAW,CAAC,cAAuB,CACnC,MAAM,CAAC,KAAK,CAGb,8CAA+C,CAC9C,KAAK,CAjae,OAAa,CAoalC,8BAA+B,CAC9B,KAAK,CAAC,OAAiB,CAGxB,qBAAsB,CACrB,KAAK,CAAC,OAAgB,CAGvB,8CAA+C,CAC9C,KAAK,CAAC,OAA+B,CACrC,WAAW,CAAC,IAAI,CAGjB,kBAAmB,CAClB,KAAK,CAAC,OAAiB,CAGxB,IAAK,CACJ,OAAO,CAAC,IAAI,CACZ,aAAa,CAAC,GAAG",
|
||||||
|
"sources": ["extra.scss"],
|
||||||
|
"names": [],
|
||||||
|
"file": "extra.css"
|
||||||
|
}
|
370
docs/extra.less
370
docs/extra.less
@ -1,370 +0,0 @@
|
|||||||
// NOTE: Please use this file to perform modifications on default style sheets.
|
|
||||||
//
|
|
||||||
// You need to install a few Ruby gems to generate extra.css from this file:
|
|
||||||
// gem install less therubyracer
|
|
||||||
//
|
|
||||||
// Run this command to regenerate extra.css after you're finished with changes:
|
|
||||||
// lessc --compress extra.less > extra.css
|
|
||||||
//
|
|
||||||
// Alternatively you can use online services to regenerate extra.css.
|
|
||||||
|
|
||||||
|
|
||||||
// Default text color for page contents
|
|
||||||
@default-text-color: hsl(0,0%,30%);
|
|
||||||
|
|
||||||
// Page header, footer, table rows, inline codes and definition lists
|
|
||||||
@header-footer-background-color: hsl(0,0%,95%);
|
|
||||||
|
|
||||||
// Page header, footer links and navigation bar background
|
|
||||||
@header-footer-link-color: hsl(0,0%,40%);
|
|
||||||
|
|
||||||
// Doxygen navigation bar links
|
|
||||||
@navbar-link-color: @header-footer-background-color;
|
|
||||||
|
|
||||||
// Page content background color
|
|
||||||
@content-background-color: hsl(0,0%,100%);
|
|
||||||
|
|
||||||
// Bold, italic, h1, h2, ... and table of contents
|
|
||||||
@heading-color: hsl(0,0%,10%);
|
|
||||||
|
|
||||||
// Function, enum and macro definition separator
|
|
||||||
@def-separator-color: @header-footer-background-color;
|
|
||||||
|
|
||||||
// Base color hue
|
|
||||||
@base-hue: 24;
|
|
||||||
|
|
||||||
// Default color used for links
|
|
||||||
@default-link-color: hsl(@base-hue,100%,50%);
|
|
||||||
|
|
||||||
// Doxygen navigation bar active tab
|
|
||||||
@tab-text-color: hsl(0,0%,100%);
|
|
||||||
@tab-background-color1: @default-link-color;
|
|
||||||
@tab-background-color2: lighten(spin(@tab-background-color1, 10), 10%);
|
|
||||||
|
|
||||||
// Table borders
|
|
||||||
@default-border-color: @default-link-color;
|
|
||||||
|
|
||||||
// Table header
|
|
||||||
@table-text-color: @tab-text-color;
|
|
||||||
@table-background-color1: @tab-background-color1;
|
|
||||||
@table-background-color2: @tab-background-color2;
|
|
||||||
|
|
||||||
// Table of contents, data structure index and prototypes
|
|
||||||
@toc-background-color1: hsl(0,0%,90%);
|
|
||||||
@toc-background-color2: lighten(@toc-background-color1, 5%);
|
|
||||||
|
|
||||||
// Function prototype parameters color
|
|
||||||
@prototype-param-color: darken(@default-link-color, 25%);
|
|
||||||
|
|
||||||
// Message box color: note, pre, post and invariant
|
|
||||||
@box-note-color: hsl(103,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: warning and attention
|
|
||||||
@box-warning-color: hsl(34,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: deprecated and bug
|
|
||||||
@box-bug-color: hsl(333,80%,85%);
|
|
||||||
|
|
||||||
// Message box color: todo and test
|
|
||||||
@box-todo-color: hsl(200,80%,85%);
|
|
||||||
|
|
||||||
// Message box helper function
|
|
||||||
.message-box(@base-color) {
|
|
||||||
background:linear-gradient(to bottom,lighten(@base-color, 5%) 0%,@base-color 100%);
|
|
||||||
box-shadow:inset 0 0 32px darken(@base-color, 5%);
|
|
||||||
color:darken(@base-color, 67%);
|
|
||||||
border:2px solid desaturate(darken(@base-color, 10%), 20%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#navrow1,#navrow2,#navrow3,#navrow4,.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code {
|
|
||||||
background:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,hr,.memSeparator {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a,.reflist dt a.el,.levels span,.directory .levels span {
|
|
||||||
text-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.memdoc,dl.reflist dd {
|
|
||||||
box-shadow:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code {
|
|
||||||
padding:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav-path,.directory .levels,span.lineno {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
html,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code {
|
|
||||||
background:@header-footer-background-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color:@default-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
|
|
||||||
color:@heading-color;
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
font-size:180%;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
margin-bottom:0;
|
|
||||||
font-size:140%;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
padding-top:0.5em;
|
|
||||||
margin-bottom:0;
|
|
||||||
font-size:110%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwheader {
|
|
||||||
font-size:16px;
|
|
||||||
height:64px;
|
|
||||||
max-width:920px;
|
|
||||||
min-width:800px;
|
|
||||||
padding:0 32px;
|
|
||||||
margin:0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome {
|
|
||||||
line-height:64px;
|
|
||||||
padding-right:48px;
|
|
||||||
color:@header-footer-link-color;
|
|
||||||
font-size:2.5em;
|
|
||||||
background:url("http://www.glfw.org/css/arrow.png") no-repeat right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwnavbar {
|
|
||||||
list-style-type:none;
|
|
||||||
margin:0 auto;
|
|
||||||
float:right;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome,.glfwnavbar li {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glfwnavbar a,.glfwnavbar a:visited {
|
|
||||||
line-height:64px;
|
|
||||||
margin-left:2em;
|
|
||||||
display:block;
|
|
||||||
color:@header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
|
|
||||||
transition:.35s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#titlearea,.footer {
|
|
||||||
color:@header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
address.footer {
|
|
||||||
text-align:center;
|
|
||||||
padding:2em;
|
|
||||||
margin-top:3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#top {
|
|
||||||
background:@header-footer-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
#navrow1,#navrow2,#navrow3,#navrow4 {
|
|
||||||
max-width:920px;
|
|
||||||
min-width:800px;
|
|
||||||
margin:0 auto;
|
|
||||||
font-size:13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tablist {
|
|
||||||
height:36px;
|
|
||||||
display:block;
|
|
||||||
position:relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tablist a,.tablist a:visited,.tablist a:hover,.tablist li,.tablist li.current a {
|
|
||||||
color:@navbar-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tablist li.current a {
|
|
||||||
background:linear-gradient(to bottom,@tab-background-color2 0%,@tab-background-color1 100%);
|
|
||||||
box-shadow:inset 0 0 32px @tab-background-color1;
|
|
||||||
text-shadow:0 -1px 1px darken(@tab-background-color1, 15%);
|
|
||||||
color:@tab-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contents {
|
|
||||||
min-height:590px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.contents,div.header {
|
|
||||||
max-width:920px;
|
|
||||||
margin:0 auto;
|
|
||||||
padding:0 32px;
|
|
||||||
background:@content-background-color none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.doxtable th,dl.reflist dt {
|
|
||||||
background:linear-gradient(to bottom,@table-background-color2 0%,@table-background-color1 100%);
|
|
||||||
box-shadow:inset 0 0 32px @table-background-color1;
|
|
||||||
text-shadow:0 -1px 1px darken(@table-background-color1, 15%);
|
|
||||||
color:@table-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dt a.el {
|
|
||||||
color:@default-link-color;
|
|
||||||
padding:.2em;
|
|
||||||
border-radius:4px;
|
|
||||||
background-color:lighten(@default-link-color, 40%);
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc {
|
|
||||||
float:none;
|
|
||||||
width:auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc h3 {
|
|
||||||
font-size:1.17em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc ul {
|
|
||||||
padding-left:1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc li {
|
|
||||||
font-size:1em;
|
|
||||||
padding-left:0;
|
|
||||||
list-style-type:disc;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.toc,.memproto,div.qindex,div.ah {
|
|
||||||
background:linear-gradient(to bottom,@toc-background-color2 0%,@toc-background-color1 100%);
|
|
||||||
box-shadow:inset 0 0 32px @toc-background-color1;
|
|
||||||
text-shadow:0 1px 1px lighten(@toc-background-color2, 10%);
|
|
||||||
color:@heading-color;
|
|
||||||
border:2px solid @toc-background-color1;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paramname {
|
|
||||||
color:@prototype-param-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dt {
|
|
||||||
border:2px solid @default-border-color;
|
|
||||||
border-top-left-radius:4px;
|
|
||||||
border-top-right-radius:4px;
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.reflist dd {
|
|
||||||
border:2px solid @default-border-color;
|
|
||||||
border-bottom-right-radius:4px;
|
|
||||||
border-bottom-left-radius:4px;
|
|
||||||
border-top:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.doxtable {
|
|
||||||
border-collapse:inherit;
|
|
||||||
border-spacing:0;
|
|
||||||
border:2px solid @default-border-color;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,.tablist a:hover,span.lineno a:hover {
|
|
||||||
color:@default-link-color;
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.directory {
|
|
||||||
border-collapse:inherit;
|
|
||||||
border-spacing:0;
|
|
||||||
border:2px solid @default-border-color;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr,.memSeparator {
|
|
||||||
height:2px;
|
|
||||||
background:linear-gradient(to right,@def-separator-color 0%,darken(@def-separator-color, 10%) 50%,@def-separator-color 100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.note,dl.pre,dl.post,dl.invariant {
|
|
||||||
.message-box(@box-note-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.warning,dl.attention {
|
|
||||||
.message-box(@box-warning-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.deprecated,dl.bug {
|
|
||||||
.message-box(@box-bug-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.todo,dl.test {
|
|
||||||
.message-box(@box-todo-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {
|
|
||||||
border-radius:4px;
|
|
||||||
padding:1em;
|
|
||||||
text-shadow:0 1px 1px hsl(0,0%,100%);
|
|
||||||
margin:1em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited {
|
|
||||||
color:inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.line {
|
|
||||||
line-height:inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.fragment,pre.fragment {
|
|
||||||
background:hsl(0,0%,95%);
|
|
||||||
border-radius:4px;
|
|
||||||
border:none;
|
|
||||||
padding:1em;
|
|
||||||
overflow:auto;
|
|
||||||
border-left:4px solid hsl(0,0%,80%);
|
|
||||||
margin:1em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lineno a,.lineno a:visited,.line,pre.fragment {
|
|
||||||
color:@default-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
span.preprocessor,span.comment {
|
|
||||||
color:hsl(193,100%,30%);
|
|
||||||
}
|
|
||||||
|
|
||||||
a.code,a.code:visited {
|
|
||||||
color:hsl(18,100%,45%);
|
|
||||||
}
|
|
||||||
|
|
||||||
span.keyword,span.keywordtype,span.keywordflow {
|
|
||||||
color:darken(@default-text-color, 5%);
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
span.stringliteral {
|
|
||||||
color:hsl(261,100%,30%);
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
padding:.1em;
|
|
||||||
border-radius:4px;
|
|
||||||
}
|
|
453
docs/extra.scss
Normal file
453
docs/extra.scss
Normal file
@ -0,0 +1,453 @@
|
|||||||
|
// NOTE: Please use this file to perform modifications on default style sheets.
|
||||||
|
//
|
||||||
|
// You need to install the official Sass CLI tool:
|
||||||
|
// npm install -g sass
|
||||||
|
//
|
||||||
|
// Run this command to regenerate extra.css after you're finished with changes:
|
||||||
|
// sass --style=compressed extra.scss extra.css
|
||||||
|
//
|
||||||
|
// Alternatively you can use online services to regenerate extra.css.
|
||||||
|
|
||||||
|
|
||||||
|
// Default text color for page contents
|
||||||
|
$default-text-color: hsl(0,0%,30%);
|
||||||
|
|
||||||
|
// Page header, footer, table rows, inline codes and definition lists
|
||||||
|
$header-footer-background-color: hsl(0,0%,95%);
|
||||||
|
|
||||||
|
// Page header, footer links and navigation bar background
|
||||||
|
$header-footer-link-color: hsl(0,0%,40%);
|
||||||
|
|
||||||
|
// Doxygen navigation bar links
|
||||||
|
$navbar-link-color: $header-footer-background-color;
|
||||||
|
|
||||||
|
// Page content background color
|
||||||
|
$content-background-color: hsl(0,0%,100%);
|
||||||
|
|
||||||
|
// Bold, italic, h1, h2, ... and table of contents
|
||||||
|
$heading-color: hsl(0,0%,10%);
|
||||||
|
|
||||||
|
// Function, enum and macro definition separator
|
||||||
|
$def-separator-color: $header-footer-background-color;
|
||||||
|
|
||||||
|
// Base color hue
|
||||||
|
$base-hue: 24;
|
||||||
|
|
||||||
|
// Default color used for links
|
||||||
|
$default-link-color: hsl($base-hue,100%,50%);
|
||||||
|
|
||||||
|
// Doxygen navigation bar active tab
|
||||||
|
$tab-text-color: hsl(0,0%,100%);
|
||||||
|
$tab-background-color1: $default-link-color;
|
||||||
|
$tab-background-color2: lighten(adjust-hue($tab-background-color1, 10), 10%);
|
||||||
|
|
||||||
|
// Table borders
|
||||||
|
$default-border-color: $default-link-color;
|
||||||
|
|
||||||
|
// Table header
|
||||||
|
$table-text-color: $tab-text-color;
|
||||||
|
$table-background-color1: $tab-background-color1;
|
||||||
|
$table-background-color2: $tab-background-color2;
|
||||||
|
|
||||||
|
// Table of contents, data structure index and prototypes
|
||||||
|
$toc-background-color1: hsl(0,0%,90%);
|
||||||
|
$toc-background-color2: lighten($toc-background-color1, 5%);
|
||||||
|
|
||||||
|
// Function prototype parameters color
|
||||||
|
$prototype-param-color: darken($default-link-color, 25%);
|
||||||
|
|
||||||
|
// Message box color: note, pre, post and invariant
|
||||||
|
$box-note-color: hsl(103,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: warning and attention
|
||||||
|
$box-warning-color: hsl(34,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: deprecated and bug
|
||||||
|
$box-bug-color: hsl(333,80%,85%);
|
||||||
|
|
||||||
|
// Message box color: todo and test
|
||||||
|
$box-todo-color: hsl(200,80%,85%);
|
||||||
|
|
||||||
|
// Message box helper function
|
||||||
|
@mixin message-box($base-color){
|
||||||
|
background:linear-gradient(to bottom,lighten($base-color, 5%) 0%,$base-color 100%);
|
||||||
|
box-shadow:inset 0 0 32px darken($base-color, 5%);
|
||||||
|
color:darken($base-color, 67%);
|
||||||
|
border:2px solid desaturate(darken($base-color, 10%), 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox,.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted,.sm-dox ul a:hover {
|
||||||
|
background:none;
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox a span.sub-arrow {
|
||||||
|
border-color:$navbar-link-color transparent transparent transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox a span.sub-arrow:active,.sm-dox a span.sub-arrow:focus,.sm-dox a span.sub-arrow:hover,.sm-dox a:hover span.sub-arrow {
|
||||||
|
border-color:$default-link-color transparent transparent transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox ul a span.sub-arrow:active,.sm-dox ul a span.sub-arrow:focus,.sm-dox ul a span.sub-arrow:hover,.sm-dox ul a:hover span.sub-arrow {
|
||||||
|
border-color:transparent transparent transparent $default-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox ul a:hover {
|
||||||
|
background:$header-footer-link-color;
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox ul.sm-nowrap a {
|
||||||
|
color:$default-text-color;
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-nav,#main-menu,#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code,.markdownTable code {
|
||||||
|
background:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,table.markdownTable td,table.markdownTable th,hr,.memSeparator {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.reflist dt a.el,.levels span,.directory .levels span {
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.memdoc,dl.reflist dd {
|
||||||
|
box-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code,table.markdownTable code {
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-path,.directory .levels,span.lineno {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),tr.markdownTableBody:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code,.markdownTableRowEven {
|
||||||
|
background:$header-footer-background-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color:$default-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.title {
|
||||||
|
font-size: 170%;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
|
||||||
|
color:$heading-color;
|
||||||
|
border-bottom:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
font-size:150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
margin-bottom:0;
|
||||||
|
font-size:130%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
padding-top:0.5em;
|
||||||
|
margin-bottom:0;
|
||||||
|
font-size:110%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwheader {
|
||||||
|
font-size:16px;
|
||||||
|
min-height:64px;
|
||||||
|
max-width:920px;
|
||||||
|
padding:0 32px;
|
||||||
|
margin:0 auto;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
align-content: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome {
|
||||||
|
line-height:64px;
|
||||||
|
padding-right:48px;
|
||||||
|
color:$header-footer-link-color;
|
||||||
|
font-size:2.5em;
|
||||||
|
background:url("https://www.glfw.org/css/arrow.png") no-repeat right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwnavbar {
|
||||||
|
list-style-type:none;
|
||||||
|
margin:0 0 0 auto;
|
||||||
|
float:right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome,.glfwnavbar li {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwnavbar a,.glfwnavbar a:visited {
|
||||||
|
line-height:64px;
|
||||||
|
margin-left:2em;
|
||||||
|
display:block;
|
||||||
|
color:$header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glfwnavbar {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
|
||||||
|
transition:.35s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#titlearea,.footer {
|
||||||
|
color:$header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
address.footer {
|
||||||
|
text-align:center;
|
||||||
|
padding:2em;
|
||||||
|
margin-top:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top {
|
||||||
|
background:$header-footer-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-nav {
|
||||||
|
max-width:960px;
|
||||||
|
margin:0 auto;
|
||||||
|
font-size:13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu {
|
||||||
|
max-width:920px;
|
||||||
|
margin:0 auto;
|
||||||
|
font-size:13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.memtitle {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.memproto,.memname {
|
||||||
|
font-weight:bold;
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu {
|
||||||
|
min-height:36px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
align-content: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu a:focus {
|
||||||
|
outline-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li {
|
||||||
|
color:$navbar-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu li ul.sm-nowrap li a {
|
||||||
|
color:$default-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu li ul.sm-nowrap li a:hover {
|
||||||
|
color:$default-link-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-menu > li:last-child {
|
||||||
|
margin: 0 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contents {
|
||||||
|
min-height:590px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.contents,div.header {
|
||||||
|
max-width:920px;
|
||||||
|
margin:0 auto;
|
||||||
|
padding:0 32px;
|
||||||
|
background:$content-background-color none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.doxtable th,table.markdownTable th,dl.reflist dt {
|
||||||
|
background:linear-gradient(to bottom,$table-background-color2 0%,$table-background-color1 100%);
|
||||||
|
box-shadow:inset 0 0 32px $table-background-color1;
|
||||||
|
text-shadow:0 -1px 1px darken($table-background-color1, 15%);
|
||||||
|
text-align:left;
|
||||||
|
color:$table-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dt a.el {
|
||||||
|
color:$default-link-color;
|
||||||
|
padding:.2em;
|
||||||
|
border-radius:4px;
|
||||||
|
background-color:lighten($default-link-color, 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc {
|
||||||
|
float:right;
|
||||||
|
width:35%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width:600px) {
|
||||||
|
div.toc {
|
||||||
|
float:none;
|
||||||
|
width:inherit;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc h3 {
|
||||||
|
font-size:1.17em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc ul {
|
||||||
|
padding-left:1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc li {
|
||||||
|
font-size:1em;
|
||||||
|
padding-left:0;
|
||||||
|
list-style-type:disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc {
|
||||||
|
li.level2, li.level3 {
|
||||||
|
margin-left:0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toc,.memproto,div.qindex,div.ah {
|
||||||
|
background:linear-gradient(to bottom,$toc-background-color2 0%,$toc-background-color1 100%);
|
||||||
|
box-shadow:inset 0 0 32px $toc-background-color1;
|
||||||
|
text-shadow:0 1px 1px lighten($toc-background-color2, 10%);
|
||||||
|
color:$heading-color;
|
||||||
|
border:2px solid $toc-background-color1;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paramname {
|
||||||
|
color:$prototype-param-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dt {
|
||||||
|
border:2px solid $default-border-color;
|
||||||
|
border-top-left-radius:4px;
|
||||||
|
border-top-right-radius:4px;
|
||||||
|
border-bottom:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.reflist dd {
|
||||||
|
border:2px solid $default-border-color;
|
||||||
|
border-bottom-right-radius:4px;
|
||||||
|
border-bottom-left-radius:4px;
|
||||||
|
border-top:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.doxtable,table.markdownTable {
|
||||||
|
border-collapse:inherit;
|
||||||
|
border-spacing:0;
|
||||||
|
border:2px solid $default-border-color;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,#main-menu a:hover,span.lineno a:hover {
|
||||||
|
color:$default-link-color;
|
||||||
|
text-decoration:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.directory {
|
||||||
|
border-collapse:inherit;
|
||||||
|
border-spacing:0;
|
||||||
|
border:2px solid $default-border-color;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr,.memSeparator {
|
||||||
|
height:2px;
|
||||||
|
background:linear-gradient(to right,$def-separator-color 0%,darken($def-separator-color, 10%) 50%,$def-separator-color 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.note,dl.pre,dl.post,dl.invariant {
|
||||||
|
@include message-box($box-note-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.warning,dl.attention {
|
||||||
|
@include message-box($box-warning-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.deprecated,dl.bug {
|
||||||
|
@include message-box($box-bug-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.todo,dl.test {
|
||||||
|
@include message-box($box-todo-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {
|
||||||
|
border-radius:4px;
|
||||||
|
padding:1em;
|
||||||
|
text-shadow:0 1px 1px hsl(0,0%,100%);
|
||||||
|
margin:1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited {
|
||||||
|
color:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.line {
|
||||||
|
line-height:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.fragment,pre.fragment {
|
||||||
|
background:hsl(0,0%,95%);
|
||||||
|
border-radius:4px;
|
||||||
|
border:none;
|
||||||
|
padding:1em;
|
||||||
|
overflow:auto;
|
||||||
|
border-left:4px solid hsl(0,0%,80%);
|
||||||
|
margin:1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lineno a,.lineno a:visited,.line,pre.fragment {
|
||||||
|
color:$default-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.preprocessor,span.comment {
|
||||||
|
color:hsl(193,100%,30%);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.code,a.code:visited {
|
||||||
|
color:hsl(18,100%,45%);
|
||||||
|
}
|
||||||
|
|
||||||
|
span.keyword,span.keywordtype,span.keywordflow {
|
||||||
|
color:darken($default-text-color, 5%);
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.stringliteral {
|
||||||
|
color:hsl(261,100%,30%);
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
padding:.1em;
|
||||||
|
border-radius:4px;
|
||||||
|
}
|
@ -1,7 +1,8 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html>
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
@ -21,12 +22,11 @@ $extrastylesheet
|
|||||||
<!--BEGIN TITLEAREA-->
|
<!--BEGIN TITLEAREA-->
|
||||||
<div id="titlearea">
|
<div id="titlearea">
|
||||||
<div class="glfwheader">
|
<div class="glfwheader">
|
||||||
<a href="http://www.glfw.org/" id="glfwhome">GLFW</a>
|
<a href="https://www.glfw.org/" id="glfwhome">GLFW</a>
|
||||||
<ul class="glfwnavbar">
|
<ul class="glfwnavbar">
|
||||||
<li><a href="http://www.glfw.org/documentation.html">Documentation</a></li>
|
<li><a href="https://www.glfw.org/documentation.html">Documentation</a></li>
|
||||||
<li><a href="http://www.glfw.org/download.html">Download</a></li>
|
<li><a href="https://www.glfw.org/download.html">Download</a></li>
|
||||||
<li><a href="http://www.glfw.org/media.html">Media</a></li>
|
<li><a href="https://www.glfw.org/community.html">Community</a></li>
|
||||||
<li><a href="http://www.glfw.org/community.html">Community</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
665
docs/input.dox
665
docs/input.dox
@ -1,665 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page input_guide Input guide
|
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide introduces the input related functions of GLFW. For details on
|
|
||||||
a specific function in this category, see the @ref input. There are also guides
|
|
||||||
for the other areas of GLFW.
|
|
||||||
|
|
||||||
- @ref intro_guide
|
|
||||||
- @ref window_guide
|
|
||||||
- @ref context_guide
|
|
||||||
- @ref vulkan_guide
|
|
||||||
- @ref monitor_guide
|
|
||||||
|
|
||||||
GLFW provides many kinds of input. While some can only be polled, like time, or
|
|
||||||
only received via callbacks, like scrolling, there are those that provide both
|
|
||||||
callbacks and polling. Where a callback is provided, that is the recommended
|
|
||||||
way to receive that kind of input. The more you can use callbacks the less time
|
|
||||||
your users' machines will need to spend polling.
|
|
||||||
|
|
||||||
All input callbacks receive a window handle. By using the
|
|
||||||
[window user pointer](@ref window_userptr), you can access non-global structures
|
|
||||||
or objects from your callbacks.
|
|
||||||
|
|
||||||
To get a better feel for how the various events callbacks behave, run the
|
|
||||||
`events` test program. It register every callback supported by GLFW and prints
|
|
||||||
out all arguments provided for every event, along with time and sequence
|
|
||||||
information.
|
|
||||||
|
|
||||||
|
|
||||||
@section events Event processing
|
|
||||||
|
|
||||||
GLFW needs to communicate regularly with the window system both in order to
|
|
||||||
receive events and to show that the application hasn't locked up. Event
|
|
||||||
processing must be done regularly while you have any windows and is normally
|
|
||||||
done each frame after [buffer swapping](@ref buffer_swap). Even when you have
|
|
||||||
no windows, event polling needs to be done in order to receive monitor
|
|
||||||
connection events.
|
|
||||||
|
|
||||||
There are two functions for processing pending events. @ref glfwPollEvents,
|
|
||||||
processes only those events that have already been received and then returns
|
|
||||||
immediately.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwPollEvents();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This is the best choice when rendering continually, like most games do.
|
|
||||||
|
|
||||||
If you only need to update the contents of the window when you receive new
|
|
||||||
input, @ref glfwWaitEvents is a better choice.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwWaitEvents();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
It puts the thread to sleep until at least one event has been received and then
|
|
||||||
processes all received events. This saves a great deal of CPU cycles and is
|
|
||||||
useful for, for example, editing tools. There must be at least one GLFW window
|
|
||||||
for this function to sleep.
|
|
||||||
|
|
||||||
If you want to wait for events but have UI elements that need periodic updates,
|
|
||||||
call @ref glfwWaitEventsTimeout.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwWaitEventsTimeout(0.7);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
It puts the thread to sleep until at least one event has been received, or until
|
|
||||||
the specified number of seconds have elapsed. It then processes any received
|
|
||||||
events.
|
|
||||||
|
|
||||||
If the main thread is sleeping in @ref glfwWaitEvents, you can wake it from
|
|
||||||
another thread by posting an empty event to the event queue with @ref
|
|
||||||
glfwPostEmptyEvent.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwPostEmptyEvent();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Do not assume that callbacks will _only_ be called through either of the above
|
|
||||||
functions. While it is necessary to process events in the event queue, some
|
|
||||||
window systems will send some events directly to the application, which in turn
|
|
||||||
causes callbacks to be called outside of regular event processing.
|
|
||||||
|
|
||||||
|
|
||||||
@section input_keyboard Keyboard input
|
|
||||||
|
|
||||||
GLFW divides keyboard input into two categories; key events and character
|
|
||||||
events. Key events relate to actual physical keyboard keys, whereas character
|
|
||||||
events relate to the Unicode code points generated by pressing some of them.
|
|
||||||
|
|
||||||
Keys and characters do not map 1:1. A single key press may produce several
|
|
||||||
characters, and a single character may require several keys to produce. This
|
|
||||||
may not be the case on your machine, but your users are likely not all using the
|
|
||||||
same keyboard layout, input method or even operating system as you.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection input_key Key input
|
|
||||||
|
|
||||||
If you wish to be notified when a physical key is pressed or released or when it
|
|
||||||
repeats, set a key callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives the [keyboard key](@ref keys), platform-specific
|
|
||||||
scancode, key action and [modifier bits](@ref mods).
|
|
||||||
|
|
||||||
@code
|
|
||||||
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
|
||||||
{
|
|
||||||
if (key == GLFW_KEY_E && action == GLFW_PRESS)
|
|
||||||
activate_airship();
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The action is one of `GLFW_PRESS`, `GLFW_REPEAT` or `GLFW_RELEASE`. The key
|
|
||||||
will be `GLFW_KEY_UNKNOWN` if GLFW lacks a key token for it, for example
|
|
||||||
_E-mail_ and _Play_ keys.
|
|
||||||
|
|
||||||
The scancode is unique for every key, regardless of whether it has a key token.
|
|
||||||
Scancodes are platform-specific but consistent over time, so keys will have
|
|
||||||
different scancodes depending on the platform but they are safe to save to disk.
|
|
||||||
|
|
||||||
Key states for [named keys](@ref keys) are also saved in per-window state arrays
|
|
||||||
that can be polled with @ref glfwGetKey.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int state = glfwGetKey(window, GLFW_KEY_E);
|
|
||||||
if (state == GLFW_PRESS)
|
|
||||||
activate_airship();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
|
||||||
|
|
||||||
This function only returns cached key event state. It does not poll the
|
|
||||||
system for the current state of the key.
|
|
||||||
|
|
||||||
Whenever you poll state, you risk missing the state change you are looking for.
|
|
||||||
If a pressed key is released again before you poll its state, you will have
|
|
||||||
missed the key press. The recommended solution for this is to use a
|
|
||||||
key callback, but there is also the `GLFW_STICKY_KEYS` input mode.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetInputMode(window, GLFW_STICKY_KEYS, 1);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
When sticky keys mode is enabled, the pollable state of a key will remain
|
|
||||||
`GLFW_PRESS` until the state of that key is polled with @ref glfwGetKey. Once
|
|
||||||
it has been polled, if a key release event had been processed in the meantime,
|
|
||||||
the state will reset to `GLFW_RELEASE`, otherwise it will remain `GLFW_PRESS`.
|
|
||||||
|
|
||||||
The `GLFW_KEY_LAST` constant holds the highest value of any
|
|
||||||
[named key](@ref keys).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection input_char Text input
|
|
||||||
|
|
||||||
GLFW supports text input in the form of a stream of
|
|
||||||
[Unicode code points](https://en.wikipedia.org/wiki/Unicode), as produced by the
|
|
||||||
operating system text input system. Unlike key input, text input obeys keyboard
|
|
||||||
layouts and modifier keys and supports composing characters using
|
|
||||||
[dead keys](https://en.wikipedia.org/wiki/Dead_key). Once received, you can
|
|
||||||
encode the code points into
|
|
||||||
[UTF-8](https://en.wikipedia.org/wiki/UTF-8) or any other encoding you prefer.
|
|
||||||
|
|
||||||
Because an `unsigned int` is 32 bits long on all platforms supported by GLFW,
|
|
||||||
you can treat the code point argument as native endian
|
|
||||||
[UTF-32](https://en.wikipedia.org/wiki/UTF-32).
|
|
||||||
|
|
||||||
There are two callbacks for receiving Unicode code points. If you wish to
|
|
||||||
offer regular text input, set a character callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCharCallback(window, character_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives Unicode code points for key events that would
|
|
||||||
have led to regular text input and generally behaves as a standard text field on
|
|
||||||
that platform.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void character_callback(GLFWwindow* window, unsigned int codepoint)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If you wish to receive even those Unicode code points generated with modifier
|
|
||||||
key combinations that a plain text field would ignore, or just want to know
|
|
||||||
exactly what modifier keys were used, set a character with modifiers callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCharModsCallback(window, charmods_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives Unicode code points and
|
|
||||||
[modifier bits](@ref mods).
|
|
||||||
|
|
||||||
@code
|
|
||||||
void charmods_callback(GLFWwindow* window, unsigned int codepoint, int mods)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection input_key_name Key names
|
|
||||||
|
|
||||||
If you wish to refer to keys by name, you can query the keyboard layout
|
|
||||||
dependent name of printable keys with @ref glfwGetKeyName.
|
|
||||||
|
|
||||||
@code
|
|
||||||
const char* key_name = glfwGetKeyName(GLFW_KEY_W, 0);
|
|
||||||
show_tutorial_hint("Press %s to move forward", key_name);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This function can handle both [keys and scancodes](@ref input_key). If the
|
|
||||||
specified key is `GLFW_KEY_UNKNOWN` then the scancode is used, otherwise it is
|
|
||||||
ignored. This matches the behavior of the key callback, meaning the callback
|
|
||||||
arguments can always be passed unmodified to this function.
|
|
||||||
|
|
||||||
|
|
||||||
@section input_mouse Mouse input
|
|
||||||
|
|
||||||
Mouse input comes in many forms, including cursor motion, button presses and
|
|
||||||
scrolling offsets. The cursor appearance can also be changed, either to
|
|
||||||
a custom image or a standard cursor shape from the system theme.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_pos Cursor position
|
|
||||||
|
|
||||||
If you wish to be notified when the cursor moves over the window, set a cursor
|
|
||||||
position callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCursorPosCallback(window, cursor_pos_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback functions receives the cursor position, measured in screen
|
|
||||||
coordinates but relative to the top-left corner of the window client area. On
|
|
||||||
platforms that provide it, the full sub-pixel cursor position is passed on.
|
|
||||||
|
|
||||||
@code
|
|
||||||
static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The cursor position is also saved per-window and can be polled with @ref
|
|
||||||
glfwGetCursorPos.
|
|
||||||
|
|
||||||
@code
|
|
||||||
double xpos, ypos;
|
|
||||||
glfwGetCursorPos(window, &xpos, &ypos);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_mode Cursor modes
|
|
||||||
|
|
||||||
The `GLFW_CURSOR` input mode provides several cursor modes for special forms of
|
|
||||||
mouse motion input. By default, the cursor mode is `GLFW_CURSOR_NORMAL`,
|
|
||||||
meaning the regular arrow cursor (or another cursor set with @ref glfwSetCursor)
|
|
||||||
is used and cursor motion is not limited.
|
|
||||||
|
|
||||||
If you wish to implement mouse motion based camera controls or other input
|
|
||||||
schemes that require unlimited mouse movement, set the cursor mode to
|
|
||||||
`GLFW_CURSOR_DISABLED`.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This will hide the cursor and lock it to the specified window. GLFW will then
|
|
||||||
take care of all the details of cursor re-centering and offset calculation and
|
|
||||||
providing the application with a virtual cursor position. This virtual position
|
|
||||||
is provided normally via both the cursor position callback and through polling.
|
|
||||||
|
|
||||||
@note You should not implement your own version of this functionality using
|
|
||||||
other features of GLFW. It is not supported and will not work as robustly as
|
|
||||||
`GLFW_CURSOR_DISABLED`.
|
|
||||||
|
|
||||||
If you just wish the cursor to become hidden when it is over a window, set
|
|
||||||
the cursor mode to `GLFW_CURSOR_HIDDEN`.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This mode puts no limit on the motion of the cursor.
|
|
||||||
|
|
||||||
To exit out of either of these special modes, restore the `GLFW_CURSOR_NORMAL`
|
|
||||||
cursor mode.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_object Cursor objects
|
|
||||||
|
|
||||||
GLFW supports creating both custom and system theme cursor images, encapsulated
|
|
||||||
as @ref GLFWcursor objects. They are created with @ref glfwCreateCursor or @ref
|
|
||||||
glfwCreateStandardCursor and destroyed with @ref glfwDestroyCursor, or @ref
|
|
||||||
glfwTerminate, if any remain.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_custom Custom cursor creation
|
|
||||||
|
|
||||||
A custom cursor is created with @ref glfwCreateCursor, which returns a handle to
|
|
||||||
the created cursor object. For example, this creates a 16x16 white square
|
|
||||||
cursor with the hot-spot in the upper-left corner:
|
|
||||||
|
|
||||||
@code
|
|
||||||
unsigned char pixels[16 * 16 * 4];
|
|
||||||
memset(pixels, 0xff, sizeof(pixels));
|
|
||||||
|
|
||||||
GLFWimage image;
|
|
||||||
image.width = 16;
|
|
||||||
image.height = 16;
|
|
||||||
image.pixels = pixels;
|
|
||||||
|
|
||||||
GLFWcursor* cursor = glfwCreateCursor(&image, 0, 0);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If cursor creation fails, `NULL` will be returned, so it is necessary to check
|
|
||||||
the return value.
|
|
||||||
|
|
||||||
The image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits
|
|
||||||
per channel. The pixels are arranged canonically as sequential rows, starting
|
|
||||||
from the top-left corner.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_standard Standard cursor creation
|
|
||||||
|
|
||||||
A cursor with a [standard shape](@ref shapes) from the current system cursor
|
|
||||||
theme can be can be created with @ref glfwCreateStandardCursor.
|
|
||||||
|
|
||||||
@code
|
|
||||||
GLFWcursor* cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
These cursor objects behave in the exact same way as those created with @ref
|
|
||||||
glfwCreateCursor except that the system cursor theme provides the actual image.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_destruction Cursor destruction
|
|
||||||
|
|
||||||
When a cursor is no longer needed, destroy it with @ref glfwDestroyCursor.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwDestroyCursor(cursor);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Cursor destruction always succeeds. All cursors remaining when @ref
|
|
||||||
glfwTerminate is called are destroyed as well.
|
|
||||||
|
|
||||||
|
|
||||||
@subsubsection cursor_set Cursor setting
|
|
||||||
|
|
||||||
A cursor can be set as current for a window with @ref glfwSetCursor.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCursor(window, cursor);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Once set, the cursor image will be used as long as the system cursor is over the
|
|
||||||
client area of the window and the [cursor mode](@ref cursor_mode) is set
|
|
||||||
to `GLFW_CURSOR_NORMAL`.
|
|
||||||
|
|
||||||
A single cursor may be set for any number of windows.
|
|
||||||
|
|
||||||
To remove a cursor from a window, set the cursor of that window to `NULL`.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCursor(window, NULL);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
When a cursor is destroyed, it is removed from any window where it is set. This
|
|
||||||
does not affect the cursor modes of those windows.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection cursor_enter Cursor enter/leave events
|
|
||||||
|
|
||||||
If you wish to be notified when the cursor enters or leaves the client area of
|
|
||||||
a window, set a cursor enter/leave callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetCursorEnterCallback(window, cursor_enter_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives the new classification of the cursor.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void cursor_enter_callback(GLFWwindow* window, int entered)
|
|
||||||
{
|
|
||||||
if (entered)
|
|
||||||
{
|
|
||||||
// The cursor entered the client area of the window
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The cursor left the client area of the window
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection input_mouse_button Mouse button input
|
|
||||||
|
|
||||||
If you wish to be notified when a mouse button is pressed or released, set
|
|
||||||
a mouse button callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives the [mouse button](@ref buttons), button action
|
|
||||||
and [modifier bits](@ref mods).
|
|
||||||
|
|
||||||
@code
|
|
||||||
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
|
||||||
{
|
|
||||||
if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS)
|
|
||||||
popup_menu();
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The action is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
|
||||||
|
|
||||||
Mouse button states for [named buttons](@ref buttons) are also saved in
|
|
||||||
per-window state arrays that can be polled with @ref glfwGetMouseButton.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
|
|
||||||
if (state == GLFW_PRESS)
|
|
||||||
upgrade_cow();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.
|
|
||||||
|
|
||||||
This function only returns cached mouse button event state. It does not poll
|
|
||||||
the system for the current state of the mouse button.
|
|
||||||
|
|
||||||
Whenever you poll state, you risk missing the state change you are looking for.
|
|
||||||
If a pressed mouse button is released again before you poll its state, you will have
|
|
||||||
missed the button press. The recommended solution for this is to use a
|
|
||||||
mouse button callback, but there is also the `GLFW_STICKY_MOUSE_BUTTONS`
|
|
||||||
input mode.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
When sticky mouse buttons mode is enabled, the pollable state of a mouse button
|
|
||||||
will remain `GLFW_PRESS` until the state of that button is polled with @ref
|
|
||||||
glfwGetMouseButton. Once it has been polled, if a mouse button release event
|
|
||||||
had been processed in the meantime, the state will reset to `GLFW_RELEASE`,
|
|
||||||
otherwise it will remain `GLFW_PRESS`.
|
|
||||||
|
|
||||||
The `GLFW_MOUSE_BUTTON_LAST` constant holds the highest value of any
|
|
||||||
[named button](@ref buttons).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection scrolling Scroll input
|
|
||||||
|
|
||||||
If you wish to be notified when the user scrolls, whether with a mouse wheel or
|
|
||||||
touchpad gesture, set a scroll callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetScrollCallback(window, scroll_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives two-dimensional scroll offsets.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
A simple mouse wheel, being vertical, provides offsets along the Y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
@section joystick Joystick input
|
|
||||||
|
|
||||||
The joystick functions expose connected joysticks and controllers, with both
|
|
||||||
referred to as joysticks. It supports up to sixteen joysticks, ranging from
|
|
||||||
`GLFW_JOYSTICK_1`, `GLFW_JOYSTICK_2` up to `GLFW_JOYSTICK_LAST`. You can test
|
|
||||||
whether a [joystick](@ref joysticks) is present with @ref glfwJoystickPresent.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int present = glfwJoystickPresent(GLFW_JOYSTICK_1);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
When GLFW is initialized, detected joysticks are added to to the beginning of
|
|
||||||
the array, starting with `GLFW_JOYSTICK_1`. Once a joystick is detected, it
|
|
||||||
keeps its assigned index until it is disconnected, so as joysticks are connected
|
|
||||||
and disconnected, they will become spread out.
|
|
||||||
|
|
||||||
Joystick state is updated as needed when a joystick function is called and does
|
|
||||||
not require a window to be created or @ref glfwPollEvents or @ref glfwWaitEvents
|
|
||||||
to be called.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_axis Joystick axis states
|
|
||||||
|
|
||||||
The positions of all axes of a joystick are returned by @ref
|
|
||||||
glfwGetJoystickAxes. See the reference documentation for the lifetime of the
|
|
||||||
returned array.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int count;
|
|
||||||
const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &count);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Each element in the returned array is a value between -1.0 and 1.0.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_button Joystick button states
|
|
||||||
|
|
||||||
The states of all buttons of a joystick are returned by @ref
|
|
||||||
glfwGetJoystickButtons. See the reference documentation for the lifetime of the
|
|
||||||
returned array.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int count;
|
|
||||||
const unsigned char* axes = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &count);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Each element in the returned array is either `GLFW_PRESS` or `GLFW_RELEASE`.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_name Joystick name
|
|
||||||
|
|
||||||
The human-readable, UTF-8 encoded name of a joystick is returned by @ref
|
|
||||||
glfwGetJoystickName. See the reference documentation for the lifetime of the
|
|
||||||
returned string.
|
|
||||||
|
|
||||||
@code
|
|
||||||
const char* name = glfwGetJoystickName(GLFW_JOYSTICK_1);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Joystick names are not guaranteed to be unique. Two joysticks of the same model
|
|
||||||
and make may have the same name. Only the [joystick token](@ref joysticks) is
|
|
||||||
guaranteed to be unique, and only until that joystick is disconnected.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection joystick_event Joystick configuration changes
|
|
||||||
|
|
||||||
If you wish to be notified when a joystick is connected or disconnected, set
|
|
||||||
a joystick callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetJoystickCallback(joystick_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives the ID of the joystick that has been connected
|
|
||||||
and disconnected and the event that occurred.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void joystick_callback(int joy, int event)
|
|
||||||
{
|
|
||||||
if (event == GLFW_CONNECTED)
|
|
||||||
{
|
|
||||||
// The joystick was connected
|
|
||||||
}
|
|
||||||
else if (event == GLFW_DISCONNECTED)
|
|
||||||
{
|
|
||||||
// The joystick was disconnected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@section time Time input
|
|
||||||
|
|
||||||
GLFW provides high-resolution time input, in seconds, with @ref glfwGetTime.
|
|
||||||
|
|
||||||
@code
|
|
||||||
double seconds = glfwGetTime();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
It returns the number of seconds since the timer was started when the library
|
|
||||||
was initialized with @ref glfwInit. The platform-specific time sources used
|
|
||||||
usually have micro- or nanosecond resolution.
|
|
||||||
|
|
||||||
You can modify the reference time with @ref glfwSetTime.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetTime(4.0);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This sets the timer to the specified time, in seconds.
|
|
||||||
|
|
||||||
You can also access the raw timer value, measured in 1 / frequency
|
|
||||||
seconds, with @ref glfwGetTimerValue.
|
|
||||||
|
|
||||||
@code
|
|
||||||
uint64_t value = glfwGetTimerValue();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The frequency of the raw timer varies depending on what time sources are
|
|
||||||
available on the machine. You can query its frequency, in Hz, with @ref
|
|
||||||
glfwGetTimerFrequency.
|
|
||||||
|
|
||||||
@code
|
|
||||||
uint64_t freqency = glfwGetTimerFrequency();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@section clipboard Clipboard input and output
|
|
||||||
|
|
||||||
If the system clipboard contains a UTF-8 encoded string or if it can be
|
|
||||||
converted to one, you can retrieve it with @ref glfwGetClipboardString. See the
|
|
||||||
reference documentation for the lifetime of the returned string.
|
|
||||||
|
|
||||||
@code
|
|
||||||
const char* text = glfwGetClipboardString(window);
|
|
||||||
if (text)
|
|
||||||
insert_text(text);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If the clipboard is empty or if its contents could not be converted, `NULL` is
|
|
||||||
returned.
|
|
||||||
|
|
||||||
The contents of the system clipboard can be set to a UTF-8 encoded string with
|
|
||||||
@ref glfwSetClipboardString.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetClipboardString(window, "A string with words in it");
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The clipboard functions take a window handle argument because some window
|
|
||||||
systems require a window to communicate with the system clipboard. Any valid
|
|
||||||
window may be used.
|
|
||||||
|
|
||||||
|
|
||||||
@section path_drop Path drop input
|
|
||||||
|
|
||||||
If you wish to receive the paths of files and/or directories dropped on
|
|
||||||
a window, set a file drop callback.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetDropCallback(window, drop_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The callback function receives an array of paths encoded as UTF-8.
|
|
||||||
|
|
||||||
@code
|
|
||||||
void drop_callback(GLFWwindow* window, int count, const char** paths)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
handle_dropped_file(paths[i]);
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The path array and its strings are only valid until the file drop callback
|
|
||||||
returns, as they may have been generated specifically for that event. You need
|
|
||||||
to make a deep copy of the array if you want to keep the paths.
|
|
||||||
|
|
||||||
*/
|
|
1000
docs/input.md
Normal file
1000
docs/input.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,12 @@
|
|||||||
/*!
|
# Internal structure {#internals_guide}
|
||||||
|
|
||||||
@page internals_guide Internal structure
|
[TOC]
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
There are several interfaces inside GLFW. Each interface has its own area of
|
There are several interfaces inside GLFW. Each interface has its own area of
|
||||||
responsibility and its own naming conventions.
|
responsibility and its own naming conventions.
|
||||||
|
|
||||||
|
|
||||||
@section internals_public Public interface
|
## Public interface {#internals_public}
|
||||||
|
|
||||||
The most well-known is the public interface, described in the glfw3.h header
|
The most well-known is the public interface, described in the glfw3.h header
|
||||||
file. This is implemented in source files shared by all platforms and these
|
file. This is implemented in source files shared by all platforms and these
|
||||||
@ -19,11 +17,10 @@ The public interface uses the OpenGL naming conventions except with GLFW and
|
|||||||
glfw instead of GL and gl. For struct members, where OpenGL sets no precedent,
|
glfw instead of GL and gl. For struct members, where OpenGL sets no precedent,
|
||||||
it use headless camel case.
|
it use headless camel case.
|
||||||
|
|
||||||
Examples: @ref glfwCreateWindow, @ref GLFWwindow, @ref GLFWvidmode.redBits,
|
Examples: `glfwCreateWindow`, `GLFWwindow`, `GLFW_RED_BITS`
|
||||||
`GLFW_RED_BITS`
|
|
||||||
|
|
||||||
|
|
||||||
@section internals_native Native interface
|
## Native interface {#internals_native}
|
||||||
|
|
||||||
The [native interface](@ref native) is a small set of publicly available
|
The [native interface](@ref native) is a small set of publicly available
|
||||||
but platform-specific functions, described in the glfw3native.h header file and
|
but platform-specific functions, described in the glfw3native.h header file and
|
||||||
@ -34,10 +31,10 @@ The function names of the native interface are similar to those of the public
|
|||||||
interface, but embeds the name of the interface that the returned handle is
|
interface, but embeds the name of the interface that the returned handle is
|
||||||
from.
|
from.
|
||||||
|
|
||||||
Examples: @ref glfwGetX11Window, @ref glfwGetWGLContext
|
Examples: `glfwGetX11Window`, `glfwGetWGLContext`
|
||||||
|
|
||||||
|
|
||||||
@section internals_internal Internal interface
|
## Internal interface {#internals_internal}
|
||||||
|
|
||||||
The internal interface consists of utility functions used by all other
|
The internal interface consists of utility functions used by all other
|
||||||
interfaces. It is shared code implemented in the same shared source files as
|
interfaces. It is shared code implemented in the same shared source files as
|
||||||
@ -50,10 +47,10 @@ a `_GLFWlibrary` struct named `_glfw`.
|
|||||||
The internal interface uses the same style as the public interface, except all
|
The internal interface uses the same style as the public interface, except all
|
||||||
global names have a leading underscore.
|
global names have a leading underscore.
|
||||||
|
|
||||||
Examples: @ref _glfwIsValidContextConfig, @ref _GLFWwindow, `_glfw.currentRamp`
|
Examples: `_glfwIsValidContextConfig`, `_GLFWwindow`, `_glfw.monitorCount`
|
||||||
|
|
||||||
|
|
||||||
@section internals_platform Platform interface
|
## Platform interface {#internals_platform}
|
||||||
|
|
||||||
The platform interface implements all platform-specific operations as a service
|
The platform interface implements all platform-specific operations as a service
|
||||||
to the public interface. This includes event processing. The platform
|
to the public interface. This includes event processing. The platform
|
||||||
@ -62,12 +59,21 @@ application-provided callbacks. It is also prohibited from modifying the
|
|||||||
platform-independent part of the internal structs. Instead, it calls the event
|
platform-independent part of the internal structs. Instead, it calls the event
|
||||||
interface when events interesting to GLFW are received.
|
interface when events interesting to GLFW are received.
|
||||||
|
|
||||||
The platform interface mirrors those parts of the public interface that needs to
|
The platform interface mostly mirrors those parts of the public interface that needs to
|
||||||
perform platform-specific operations on some or all platforms. The are also
|
perform platform-specific operations on some or all platforms.
|
||||||
named the same except that the glfw function prefix is replaced by
|
|
||||||
_glfwPlatform.
|
|
||||||
|
|
||||||
Examples: @ref _glfwPlatformCreateWindow
|
The window system bits of the platform API is called through the `_GLFWplatform` struct of
|
||||||
|
function pointers, to allow runtime selection of platform. This includes the window and
|
||||||
|
context creation, input and event processing, monitor and Vulkan surface creation parts of
|
||||||
|
GLFW. This is located in the global `_glfw` struct.
|
||||||
|
|
||||||
|
Examples: `_glfw.platform.createWindow`
|
||||||
|
|
||||||
|
The timer, threading and module loading bits of the platform API are plain functions with
|
||||||
|
a `_glfwPlatform` prefix, as these things are independent of what window system is being
|
||||||
|
used.
|
||||||
|
|
||||||
|
Examples: `_glfwPlatformGetTimerValue`
|
||||||
|
|
||||||
The platform interface also defines structs that contain platform-specific
|
The platform interface also defines structs that contain platform-specific
|
||||||
global and per-object state. Their names mirror those of the internal
|
global and per-object state. Their names mirror those of the internal
|
||||||
@ -79,10 +85,10 @@ These structs are incorporated as members into the internal interface structs
|
|||||||
using special macros that name them after the specific interface used. This
|
using special macros that name them after the specific interface used. This
|
||||||
prevents shared code from accidentally using these members.
|
prevents shared code from accidentally using these members.
|
||||||
|
|
||||||
Examples: `window.win32.handle`, `_glfw.x11.display`
|
Examples: `window->win32.handle`, `_glfw.x11.display`
|
||||||
|
|
||||||
|
|
||||||
@section internals_event Event interface
|
## Event interface {#internals_event}
|
||||||
|
|
||||||
The event interface is implemented in the same shared source files as the public
|
The event interface is implemented in the same shared source files as the public
|
||||||
interface and is responsible for delivering the events it receives to the
|
interface and is responsible for delivering the events it receives to the
|
||||||
@ -91,26 +97,24 @@ application, either via callbacks, via window state changes or both.
|
|||||||
The function names of the event interface use a `_glfwInput` prefix and the
|
The function names of the event interface use a `_glfwInput` prefix and the
|
||||||
ObjectEvent pattern.
|
ObjectEvent pattern.
|
||||||
|
|
||||||
Examples: @ref _glfwInputWindowFocus, @ref _glfwInputCursorMotion
|
Examples: `_glfwInputWindowFocus`, `_glfwInputCursorPos`
|
||||||
|
|
||||||
|
|
||||||
@section internals_static Static functions
|
## Static functions {#internals_static}
|
||||||
|
|
||||||
Static functions may be used by any interface and have no prefixes or suffixes.
|
Static functions may be used by any interface and have no prefixes or suffixes.
|
||||||
These use headless camel case.
|
These use headless camel case.
|
||||||
|
|
||||||
Examples: `clearScrollOffsets`
|
Examples: `isValidElementForJoystick`
|
||||||
|
|
||||||
|
|
||||||
@section internals_config Configuration macros
|
## Configuration macros {#internals_config}
|
||||||
|
|
||||||
GLFW uses a number of configuration macros to select at compile time which
|
GLFW uses a number of configuration macros to select at compile time which
|
||||||
interfaces and code paths to use. They are defined in the glfw_config.h header file,
|
interfaces and code paths to use. They are defined in the GLFW CMake target.
|
||||||
which is generated from the `glfw_config.h.in` file by CMake.
|
|
||||||
|
|
||||||
Configuration macros the same style as tokens in the public interface, except
|
Configuration macros the same style as tokens in the public interface, except
|
||||||
with a leading underscore.
|
with a leading underscore.
|
||||||
|
|
||||||
Examples: `_GLFW_HAS_XF86VM`
|
Examples: `_GLFW_WIN32`, `_GLFW_BUILD_DLL`
|
||||||
|
|
||||||
*/
|
|
372
docs/intro.dox
372
docs/intro.dox
@ -1,372 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page intro_guide Introduction to the API
|
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide introduces the basic concepts of GLFW and describes initialization,
|
|
||||||
error handling and API guarantees and limitations. For a broad but shallow
|
|
||||||
tutorial, see @ref quick_guide instead. For details on a specific function in
|
|
||||||
this category, see the @ref init.
|
|
||||||
|
|
||||||
There are also guides for the other areas of GLFW.
|
|
||||||
|
|
||||||
- @ref window_guide
|
|
||||||
- @ref context_guide
|
|
||||||
- @ref vulkan_guide
|
|
||||||
- @ref monitor_guide
|
|
||||||
- @ref input_guide
|
|
||||||
|
|
||||||
|
|
||||||
@section intro_init Initialization and termination
|
|
||||||
|
|
||||||
Before most GLFW functions may be called, the library must be initialized.
|
|
||||||
This initialization checks what features are available on the machine,
|
|
||||||
enumerates monitors and joysticks, initializes the timer and performs any
|
|
||||||
required platform-specific initialization.
|
|
||||||
|
|
||||||
Only the following functions may be called before the library has been
|
|
||||||
successfully initialized, and only from the main thread.
|
|
||||||
|
|
||||||
- @ref glfwGetVersion
|
|
||||||
- @ref glfwGetVersionString
|
|
||||||
- @ref glfwSetErrorCallback
|
|
||||||
- @ref glfwInit
|
|
||||||
- @ref glfwTerminate
|
|
||||||
|
|
||||||
Calling any other function before successful initialization will cause a @ref
|
|
||||||
GLFW_NOT_INITIALIZED error.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_init_init Initializing GLFW
|
|
||||||
|
|
||||||
The library is initialized with @ref glfwInit, which returns `GLFW_FALSE` if an
|
|
||||||
error occurred.
|
|
||||||
|
|
||||||
@code
|
|
||||||
if (!glfwInit())
|
|
||||||
{
|
|
||||||
// Handle initialization failure
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
If any part of initialization fails, any parts that succeeded are terminated as
|
|
||||||
if @ref glfwTerminate had been called. The library only needs to be initialized
|
|
||||||
once and additional calls to an already initialized library will simply return
|
|
||||||
`GLFW_TRUE` immediately.
|
|
||||||
|
|
||||||
Once the library has been successfully initialized, it should be terminated
|
|
||||||
before the application exits. Modern systems are very good at freeing resources
|
|
||||||
allocated by programs that simply exit, but GLFW sometimes has to change global
|
|
||||||
system settings and these might not be restored without termination.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_init_terminate Terminating GLFW
|
|
||||||
|
|
||||||
Before your application exits, you should terminate the GLFW library if it has
|
|
||||||
been initialized. This is done with @ref glfwTerminate.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwTerminate();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
This will destroy any remaining window, monitor and cursor objects, restore any
|
|
||||||
modified gamma ramps, re-enable the screensaver if it had been disabled and free
|
|
||||||
any other resources allocated by GLFW.
|
|
||||||
|
|
||||||
Once the library is terminated, it is as if it had never been initialized and
|
|
||||||
you will need to initialize it again before being able to use GLFW. If the
|
|
||||||
library was not initialized or had already been terminated, it return
|
|
||||||
immediately.
|
|
||||||
|
|
||||||
|
|
||||||
@section error_handling Error handling
|
|
||||||
|
|
||||||
Some GLFW functions have return values that indicate an error, but this is often
|
|
||||||
not very helpful when trying to figure out _why_ the error occurred. Some
|
|
||||||
functions also return otherwise valid values on error. Finally, far from all
|
|
||||||
GLFW functions have return values.
|
|
||||||
|
|
||||||
This is where the error callback comes in. This callback is called whenever an
|
|
||||||
error occurs. It is set with @ref glfwSetErrorCallback, a function that may be
|
|
||||||
called regardless of whether GLFW is initialized.
|
|
||||||
|
|
||||||
@code
|
|
||||||
glfwSetErrorCallback(error_callback);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The error callback receives a human-readable description of the error and (when
|
|
||||||
possible) its cause. The description encoded as UTF-8. The callback is also
|
|
||||||
provided with an [error code](@ref errors).
|
|
||||||
|
|
||||||
@code
|
|
||||||
void error_callback(int error, const char* description)
|
|
||||||
{
|
|
||||||
puts(description);
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
The error code indicates the general category of the error. Some error codes,
|
|
||||||
such as @ref GLFW_NOT_INITIALIZED has only a single meaning, whereas others like
|
|
||||||
@ref GLFW_PLATFORM_ERROR are used for many different errors.
|
|
||||||
|
|
||||||
The description string is only valid until the error callback returns, as it may
|
|
||||||
have been generated specifically for that error. This lets GLFW provide much
|
|
||||||
more specific error descriptions but means you must make a copy if you want to
|
|
||||||
keep the description string.
|
|
||||||
|
|
||||||
@note Relying on erroneous behavior is not forward compatible. In other words,
|
|
||||||
do not rely on a currently invalid call to generate a specific error, as that
|
|
||||||
same call may in future versions generate a different error or become valid.
|
|
||||||
|
|
||||||
|
|
||||||
@section coordinate_systems Coordinate systems
|
|
||||||
|
|
||||||
GLFW has two primary coordinate systems: the _virtual screen_ and the window
|
|
||||||
_client area_ or _content area_. Both use the same unit: _virtual screen
|
|
||||||
coordinates_, or just _screen coordinates_, which don't necessarily correspond
|
|
||||||
to pixels.
|
|
||||||
|
|
||||||
<img src="spaces.svg" width="90%" />
|
|
||||||
|
|
||||||
Both the virtual screen and the client area coordinate systems have the X-axis
|
|
||||||
pointing to the right and the Y-axis pointing down.
|
|
||||||
|
|
||||||
Window and monitor positions are specified as the position of the upper-left
|
|
||||||
corners of their content areas relative to the virtual screen, while cursor
|
|
||||||
positions are specified relative to a window's client area.
|
|
||||||
|
|
||||||
Because the origin of the window's client area coordinate system is also the
|
|
||||||
point from which the window position is specified, you can translate client area
|
|
||||||
coordinates to the virtual screen by adding the window position. The window
|
|
||||||
frame, when present, extends out from the client area but does not affect the
|
|
||||||
window position.
|
|
||||||
|
|
||||||
Almost all positions and sizes in GLFW are measured in screen coordinates
|
|
||||||
relative to one of the two origins above. This includes cursor positions,
|
|
||||||
window positions and sizes, window frame sizes, monitor positions and video mode
|
|
||||||
resolutions.
|
|
||||||
|
|
||||||
Two exceptions are the [monitor physical size](@ref monitor_size), which is
|
|
||||||
measured in millimetres, and [framebuffer size](@ref window_fbsize), which is
|
|
||||||
measured in pixels.
|
|
||||||
|
|
||||||
Pixels and screen coordinates may map 1:1 on your machine, but they won't on
|
|
||||||
every other machine, for example on a Mac with a Retina display. The ratio
|
|
||||||
between screen coordinates and pixels may also change at run-time depending on
|
|
||||||
which monitor the window is currently considered to be on.
|
|
||||||
|
|
||||||
|
|
||||||
@section guarantees_limitations Guarantees and limitations
|
|
||||||
|
|
||||||
This section describes the conditions under which GLFW can be expected to
|
|
||||||
function, barring bugs in the operating system or drivers. Use of GLFW outside
|
|
||||||
of these limits may work on some platforms, or on some machines, or some of the
|
|
||||||
time, or on some versions of GLFW, but it may break at any time and this will
|
|
||||||
not be considered a bug.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection lifetime Pointer lifetimes
|
|
||||||
|
|
||||||
GLFW will never free any pointer you provide to it and you must never free any
|
|
||||||
pointer it provides to you.
|
|
||||||
|
|
||||||
Many GLFW functions return pointers to dynamically allocated structures, strings
|
|
||||||
or arrays, and some callbacks are provided with strings or arrays. These are
|
|
||||||
always managed by GLFW and should never be freed by the application. The
|
|
||||||
lifetime of these pointers is documented for each GLFW function and callback.
|
|
||||||
If you need to keep this data, you must copy it before its lifetime expires.
|
|
||||||
|
|
||||||
Many GLFW functions accept pointers to structures or strings allocated by the
|
|
||||||
application. These are never freed by GLFW and are always the responsibility of
|
|
||||||
the application. If GLFW needs to keep the data in these structures or strings,
|
|
||||||
it is copied before the function returns.
|
|
||||||
|
|
||||||
Pointer lifetimes are guaranteed not to be shortened in future minor or patch
|
|
||||||
releases.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection reentrancy Reentrancy
|
|
||||||
|
|
||||||
GLFW event processing and object creation and destruction are not reentrant.
|
|
||||||
This means that the following functions must not be called from any callback
|
|
||||||
function:
|
|
||||||
|
|
||||||
- @ref glfwCreateWindow
|
|
||||||
- @ref glfwDestroyWindow
|
|
||||||
- @ref glfwCreateCursor
|
|
||||||
- @ref glfwCreateStandardCursor
|
|
||||||
- @ref glfwDestroyCursor
|
|
||||||
- @ref glfwPollEvents
|
|
||||||
- @ref glfwWaitEvents
|
|
||||||
- @ref glfwWaitEventsTimeout
|
|
||||||
- @ref glfwTerminate
|
|
||||||
|
|
||||||
These functions may be made reentrant in future minor or patch releases, but
|
|
||||||
functions not on this list will not be made non-reentrant.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection thread_safety Thread safety
|
|
||||||
|
|
||||||
Most GLFW functions must only be called from the main thread, but some may be
|
|
||||||
called from any thread. However, no GLFW function may be called from any thread
|
|
||||||
but the main thread until GLFW has been successfully initialized, including
|
|
||||||
functions that may called before initialization.
|
|
||||||
|
|
||||||
The reference documentation for every GLFW function states whether it is limited
|
|
||||||
to the main thread.
|
|
||||||
|
|
||||||
Initialization and termination, event processing and the creation and
|
|
||||||
destruction of windows, contexts and cursors are all limited to the main thread
|
|
||||||
due to limitations of one or several platforms.
|
|
||||||
|
|
||||||
Because event processing must be performed on the main thread, all callbacks
|
|
||||||
except for the error callback will only be called on that thread. The error
|
|
||||||
callback may be called on any thread, as any GLFW function may generate errors.
|
|
||||||
|
|
||||||
The posting of empty events may be done from any thread. The window user
|
|
||||||
pointer and close flag may also be accessed and modified from any thread, but
|
|
||||||
this is not synchronized by GLFW. The following window related functions may
|
|
||||||
be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwPostEmptyEvent
|
|
||||||
- @ref glfwGetWindowUserPointer
|
|
||||||
- @ref glfwSetWindowUserPointer
|
|
||||||
- @ref glfwWindowShouldClose
|
|
||||||
- @ref glfwSetWindowShouldClose
|
|
||||||
|
|
||||||
Rendering may be done on any thread. The following context related functions
|
|
||||||
may be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwMakeContextCurrent
|
|
||||||
- @ref glfwGetCurrentContext
|
|
||||||
- @ref glfwSwapBuffers
|
|
||||||
- @ref glfwSwapInterval
|
|
||||||
- @ref glfwExtensionSupported
|
|
||||||
- @ref glfwGetProcAddress
|
|
||||||
|
|
||||||
The raw timer may be queried from any thread. The following raw timer related
|
|
||||||
functions may be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwGetTimerFrequency
|
|
||||||
- @ref glfwGetTimerValue
|
|
||||||
|
|
||||||
The regular timer may be used from any thread, but the reading and writing of
|
|
||||||
the timer offset is not synchronized by GLFW. The following timer related
|
|
||||||
functions may be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwGetTime
|
|
||||||
- @ref glfwSetTime
|
|
||||||
|
|
||||||
Library version information may be queried from any thread. The following
|
|
||||||
version related functions may be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwGetVersion
|
|
||||||
- @ref glfwGetVersionString
|
|
||||||
|
|
||||||
Vulkan objects may be created and information queried from any thread. The
|
|
||||||
following Vulkan related functions may be called from any thread:
|
|
||||||
|
|
||||||
- @ref glfwVulkanSupported
|
|
||||||
- @ref glfwGetRequiredInstanceExtensions
|
|
||||||
- @ref glfwGetInstanceProcAddress
|
|
||||||
- @ref glfwGetPhysicalDevicePresentationSupport
|
|
||||||
- @ref glfwCreateWindowSurface
|
|
||||||
|
|
||||||
GLFW uses no synchronization objects internally except for thread-local storage
|
|
||||||
to keep track of the current context for each thread. Synchronization is left
|
|
||||||
to the application.
|
|
||||||
|
|
||||||
Functions that may currently be called from any thread will always remain so,
|
|
||||||
but functions that are currently limited to the main thread may be updated to
|
|
||||||
allow calls from any thread in future releases.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection compatibility Version compatibility
|
|
||||||
|
|
||||||
GLFW guarantees source and binary backward compatibility with earlier minor
|
|
||||||
versions of the API. This means that you can drop in a newer version of the
|
|
||||||
library and existing programs will continue to compile and existing binaries
|
|
||||||
will continue to run.
|
|
||||||
|
|
||||||
Once a function or constant has been added, the signature of that function or
|
|
||||||
value of that constant will remain unchanged until the next major version of
|
|
||||||
GLFW. No compatibility of any kind is guaranteed between major versions.
|
|
||||||
|
|
||||||
Undocumented behavior, i.e. behavior that is not described in the documentation,
|
|
||||||
may change at any time until it is documented.
|
|
||||||
|
|
||||||
If the reference documentation and the implementation differ, the reference
|
|
||||||
documentation is correct and the implementation will be fixed in the next
|
|
||||||
release.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection event_order Event order
|
|
||||||
|
|
||||||
The order of arrival of related events is not guaranteed to be consistent
|
|
||||||
across platforms. The exception is synthetic key and mouse button release
|
|
||||||
events, which are always delivered after the window defocus event.
|
|
||||||
|
|
||||||
|
|
||||||
@section intro_version Version management
|
|
||||||
|
|
||||||
GLFW provides mechanisms for identifying what version of GLFW your application
|
|
||||||
was compiled against as well as what version it is currently running against.
|
|
||||||
If you are loading GLFW dynamically (not just linking dynamically), you can use
|
|
||||||
this to verify that the library binary is compatible with your application.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_version_compile Compile-time version
|
|
||||||
|
|
||||||
The compile-time version of GLFW is provided by the GLFW header with the
|
|
||||||
`GLFW_VERSION_MAJOR`, `GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` macros.
|
|
||||||
|
|
||||||
@code
|
|
||||||
printf("Compiled against GLFW %i.%i.%i\n",
|
|
||||||
GLFW_VERSION_MAJOR,
|
|
||||||
GLFW_VERSION_MINOR,
|
|
||||||
GLFW_VERSION_REVISION);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_version_runtime Run-time version
|
|
||||||
|
|
||||||
The run-time version can be retrieved with @ref glfwGetVersion, a function that
|
|
||||||
may be called regardless of whether GLFW is initialized.
|
|
||||||
|
|
||||||
@code
|
|
||||||
int major, minor, revision;
|
|
||||||
glfwGetVersion(&major, &minor, &revision);
|
|
||||||
|
|
||||||
printf("Running against GLFW %i.%i.%i\n", major, minor, revision);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection intro_version_string Version string
|
|
||||||
|
|
||||||
GLFW 3 also provides a compile-time generated version string that describes the
|
|
||||||
version, platform, compiler and any platform-specific compile-time options.
|
|
||||||
This is primarily intended for submitting bug reports, to allow developers to
|
|
||||||
see which code paths are enabled in a binary.
|
|
||||||
|
|
||||||
The version string is returned by @ref glfwGetVersionString, a function that may
|
|
||||||
be called regardless of whether GLFW is initialized.
|
|
||||||
|
|
||||||
__Do not use the version string__ to parse the GLFW library version. The @ref
|
|
||||||
glfwGetVersion function already provides the version of the running library
|
|
||||||
binary.
|
|
||||||
|
|
||||||
The format of the string is as follows:
|
|
||||||
- The version of GLFW
|
|
||||||
- The name of the window system API
|
|
||||||
- The name of the context creation API
|
|
||||||
- Any additional options or APIs
|
|
||||||
|
|
||||||
For example, when compiling GLFW 3.0 with MinGW using the Win32 and WGL
|
|
||||||
back ends, the version string may look something like this:
|
|
||||||
|
|
||||||
@code
|
|
||||||
3.0.0 Win32 WGL MinGW
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
*/
|
|
637
docs/intro.md
Normal file
637
docs/intro.md
Normal file
@ -0,0 +1,637 @@
|
|||||||
|
# Introduction to the API {#intro_guide}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
This guide introduces the basic concepts of GLFW and describes initialization,
|
||||||
|
error handling and API guarantees and limitations. For a broad but shallow
|
||||||
|
tutorial, see @ref quick_guide instead. For details on a specific function in
|
||||||
|
this category, see the @ref init.
|
||||||
|
|
||||||
|
There are also guides for the other areas of GLFW.
|
||||||
|
|
||||||
|
- @ref window_guide
|
||||||
|
- @ref context_guide
|
||||||
|
- @ref vulkan_guide
|
||||||
|
- @ref monitor_guide
|
||||||
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
|
## Initialization and termination {#intro_init}
|
||||||
|
|
||||||
|
Before most GLFW functions may be called, the library must be initialized.
|
||||||
|
This initialization checks what features are available on the machine,
|
||||||
|
enumerates monitors, initializes the timer and performs any required
|
||||||
|
platform-specific initialization.
|
||||||
|
|
||||||
|
Only the following functions may be called before the library has been
|
||||||
|
successfully initialized, and only from the main thread.
|
||||||
|
|
||||||
|
- @ref glfwGetVersion
|
||||||
|
- @ref glfwGetVersionString
|
||||||
|
- @ref glfwPlatformSupported
|
||||||
|
- @ref glfwGetError
|
||||||
|
- @ref glfwSetErrorCallback
|
||||||
|
- @ref glfwInitHint
|
||||||
|
- @ref glfwInitAllocator
|
||||||
|
- @ref glfwInitVulkanLoader
|
||||||
|
- @ref glfwInit
|
||||||
|
- @ref glfwTerminate
|
||||||
|
|
||||||
|
Calling any other function before successful initialization will cause a @ref
|
||||||
|
GLFW_NOT_INITIALIZED error.
|
||||||
|
|
||||||
|
|
||||||
|
### Initializing GLFW {#intro_init_init}
|
||||||
|
|
||||||
|
The library is initialized with @ref glfwInit, which returns `GLFW_FALSE` if an
|
||||||
|
error occurred.
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
// Handle initialization failure
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If any part of initialization fails, any parts that succeeded are terminated as
|
||||||
|
if @ref glfwTerminate had been called. The library only needs to be initialized
|
||||||
|
once and additional calls to an already initialized library will return
|
||||||
|
`GLFW_TRUE` immediately.
|
||||||
|
|
||||||
|
Once the library has been successfully initialized, it should be terminated
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
### Initialization hints {#init_hints}
|
||||||
|
|
||||||
|
Initialization hints are set before @ref glfwInit and affect how the library
|
||||||
|
behaves until termination. Hints are set with @ref glfwInitHint.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE);
|
||||||
|
```
|
||||||
|
|
||||||
|
The values you set hints to are never reset by GLFW, but they only take effect
|
||||||
|
during initialization. Once GLFW has been initialized, any values you set will
|
||||||
|
be ignored until the library is terminated and initialized again.
|
||||||
|
|
||||||
|
Some hints are platform specific. These may be set on any platform but they
|
||||||
|
will only affect their specific platform. Other platforms will ignore them.
|
||||||
|
Setting these hints requires no platform specific headers or functions.
|
||||||
|
|
||||||
|
|
||||||
|
#### Shared init hints {#init_hints_shared}
|
||||||
|
|
||||||
|
@anchor GLFW_PLATFORM
|
||||||
|
__GLFW_PLATFORM__ specifies the platform to use for windowing and input.
|
||||||
|
Possible values are `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`,
|
||||||
|
`GLFW_PLATFORM_COCOA`, `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` and
|
||||||
|
`GLFW_PLATFORM_NULL`. The default value is `GLFW_ANY_PLATFORM`, which will
|
||||||
|
choose any platform the library includes support for except for the Null
|
||||||
|
backend.
|
||||||
|
|
||||||
|
|
||||||
|
@anchor GLFW_JOYSTICK_HAT_BUTTONS
|
||||||
|
__GLFW_JOYSTICK_HAT_BUTTONS__ specifies whether to also expose joystick hats as
|
||||||
|
buttons, for compatibility with earlier versions of GLFW that did not have @ref
|
||||||
|
glfwGetJoystickHats. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||||
|
|
||||||
|
@anchor GLFW_ANGLE_PLATFORM_TYPE_hint
|
||||||
|
__GLFW_ANGLE_PLATFORM_TYPE__ specifies the platform type (rendering backend) to
|
||||||
|
request when using OpenGL ES and EGL via [ANGLE][]. 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`.
|
||||||
|
|
||||||
|
[ANGLE]: https://chromium.googlesource.com/angle/angle/
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
#### macOS specific init hints {#init_hints_osx}
|
||||||
|
|
||||||
|
@anchor GLFW_COCOA_CHDIR_RESOURCES_hint
|
||||||
|
__GLFW_COCOA_CHDIR_RESOURCES__ specifies whether to set the current directory to
|
||||||
|
the application to the `Contents/Resources` subdirectory of the application's
|
||||||
|
bundle, if present. Possible values are `GLFW_TRUE` and `GLFW_FALSE`. This is
|
||||||
|
ignored on other platforms.
|
||||||
|
|
||||||
|
@anchor GLFW_COCOA_MENUBAR_hint
|
||||||
|
__GLFW_COCOA_MENUBAR__ specifies whether to create the menu bar and dock icon
|
||||||
|
when GLFW is initialized. This applies whether the menu bar is created from
|
||||||
|
a nib or manually by GLFW. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||||
|
This is ignored on other platforms.
|
||||||
|
|
||||||
|
|
||||||
|
#### Wayland specific init hints {#init_hints_wayland}
|
||||||
|
|
||||||
|
@anchor GLFW_WAYLAND_LIBDECOR_hint
|
||||||
|
__GLFW_WAYLAND_LIBDECOR__ specifies whether to use [libdecor][] for window
|
||||||
|
decorations where available. Possible values are `GLFW_WAYLAND_PREFER_LIBDECOR`
|
||||||
|
and `GLFW_WAYLAND_DISABLE_LIBDECOR`. This is ignored on other platforms.
|
||||||
|
|
||||||
|
[libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor
|
||||||
|
|
||||||
|
|
||||||
|
#### X11 specific init hints {#init_hints_x11}
|
||||||
|
|
||||||
|
@anchor GLFW_X11_XCB_VULKAN_SURFACE_hint
|
||||||
|
__GLFW_X11_XCB_VULKAN_SURFACE__ specifies whether to prefer the
|
||||||
|
`VK_KHR_xcb_surface` extension for creating Vulkan surfaces, or whether to use
|
||||||
|
the `VK_KHR_xlib_surface` extension. Possible values are `GLFW_TRUE` and
|
||||||
|
`GLFW_FALSE`. This is ignored on other platforms.
|
||||||
|
|
||||||
|
|
||||||
|
#### Supported and default values {#init_hints_values}
|
||||||
|
|
||||||
|
Initialization hint | Default value | Supported values
|
||||||
|
-------------------------------- | ------------------------------- | ----------------
|
||||||
|
@ref GLFW_PLATFORM | `GLFW_ANY_PLATFORM` | `GLFW_ANY_PLATFORM`, `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`
|
||||||
|
@ref GLFW_JOYSTICK_HAT_BUTTONS | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
|
@ref GLFW_ANGLE_PLATFORM_TYPE | `GLFW_ANGLE_PLATFORM_TYPE_NONE` | `GLFW_ANGLE_PLATFORM_TYPE_NONE`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGL`, `GLFW_ANGLE_PLATFORM_TYPE_OPENGLES`, `GLFW_ANGLE_PLATFORM_TYPE_D3D9`, `GLFW_ANGLE_PLATFORM_TYPE_D3D11`, `GLFW_ANGLE_PLATFORM_TYPE_VULKAN` or `GLFW_ANGLE_PLATFORM_TYPE_METAL`
|
||||||
|
@ref GLFW_COCOA_CHDIR_RESOURCES | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
|
@ref GLFW_COCOA_MENUBAR | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
|
@ref GLFW_WAYLAND_LIBDECOR | `GLFW_WAYLAND_PREFER_LIBDECOR` | `GLFW_WAYLAND_PREFER_LIBDECOR` or `GLFW_WAYLAND_DISABLE_LIBDECOR`
|
||||||
|
@ref GLFW_X11_XCB_VULKAN_SURFACE | `GLFW_TRUE` | `GLFW_TRUE` or `GLFW_FALSE`
|
||||||
|
|
||||||
|
|
||||||
|
### Runtime platform selection {#platform}
|
||||||
|
|
||||||
|
GLFW can be compiled for more than one platform (window system) at once. This lets
|
||||||
|
a single library binary support both Wayland and X11 on Linux and other Unix-like systems.
|
||||||
|
|
||||||
|
You can control platform selection via the @ref GLFW_PLATFORM initialization hint. By
|
||||||
|
default, this is set to @ref GLFW_ANY_PLATFORM, which will look for supported window
|
||||||
|
systems in order of priority and select the first one it finds. It can also be set to any
|
||||||
|
specific platform to have GLFW only look for that one.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11);
|
||||||
|
```
|
||||||
|
|
||||||
|
This mechanism also provides the Null platform, which is always supported but needs to be
|
||||||
|
explicitly requested. This platform is effectively a stub, emulating a window system on
|
||||||
|
a single 1080p monitor, but will not interact with any actual window system.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_NULL);
|
||||||
|
```
|
||||||
|
|
||||||
|
You can test whether a library binary was compiled with support for a specific platform
|
||||||
|
with @ref glfwPlatformSupported.
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (glfwPlatformSupported(GLFW_PLATFORM_WAYLAND))
|
||||||
|
glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WAYLAND);
|
||||||
|
```
|
||||||
|
|
||||||
|
Once GLFW has been initialized, you can query which platform was selected with @ref
|
||||||
|
glfwGetPlatform.
|
||||||
|
|
||||||
|
```c
|
||||||
|
int platform = glfwGetPlatform();
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using any [native access functions](@ref native), especially on Linux and other
|
||||||
|
Unix-like systems, then you may need to check that you are calling the ones matching the
|
||||||
|
selected platform.
|
||||||
|
|
||||||
|
|
||||||
|
### Custom heap memory allocator {#init_allocator}
|
||||||
|
|
||||||
|
The heap memory allocator can be customized before initialization with @ref
|
||||||
|
glfwInitAllocator.
|
||||||
|
|
||||||
|
```c
|
||||||
|
GLFWallocator allocator;
|
||||||
|
allocator.allocate = my_malloc;
|
||||||
|
allocator.reallocate = my_realloc;
|
||||||
|
allocator.deallocate = my_free;
|
||||||
|
allocator.user = NULL;
|
||||||
|
|
||||||
|
glfwInitAllocator(&allocator);
|
||||||
|
```
|
||||||
|
|
||||||
|
The allocator will be made active at the beginning of initialization and will be used by
|
||||||
|
GLFW until the library has been fully terminated. Any allocator set after initialization
|
||||||
|
will be picked up only at the next initialization.
|
||||||
|
|
||||||
|
The allocator will only be used for allocations that would have been made with
|
||||||
|
the C standard library. Memory allocations that must be made with platform
|
||||||
|
specific APIs will still use those.
|
||||||
|
|
||||||
|
The allocation function must have a signature matching @ref GLFWallocatefun. It receives
|
||||||
|
the desired size, in bytes, and the user pointer passed to @ref glfwInitAllocator and
|
||||||
|
returns the address to the allocated memory block.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void* my_malloc(size_t size, void* user)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The documentation for @ref GLFWallocatefun also lists the requirements and limitations for
|
||||||
|
an allocation function. If the active one does not meet all of these, GLFW may fail.
|
||||||
|
|
||||||
|
The reallocation function must have a function signature matching @ref GLFWreallocatefun.
|
||||||
|
It receives the memory block to be reallocated, the new desired size, in bytes, and the user
|
||||||
|
pointer passed to @ref glfwInitAllocator and returns the address to the resized memory
|
||||||
|
block.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void* my_realloc(void* block, size_t size, void* user)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The documentation for @ref GLFWreallocatefun also lists the requirements and limitations
|
||||||
|
for a reallocation function. If the active one does not meet all of these, GLFW may fail.
|
||||||
|
|
||||||
|
The deallocation function must have a function signature matching @ref GLFWdeallocatefun.
|
||||||
|
It receives the memory block to be deallocated and the user pointer passed to @ref
|
||||||
|
glfwInitAllocator.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void my_free(void* block, void* user)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The documentation for @ref GLFWdeallocatefun also lists the requirements and limitations
|
||||||
|
for a deallocation function. If the active one does not meet all of these, GLFW may fail.
|
||||||
|
|
||||||
|
|
||||||
|
### Terminating GLFW {#intro_init_terminate}
|
||||||
|
|
||||||
|
Before your application exits, you should terminate the GLFW library if it has
|
||||||
|
been initialized. This is done with @ref glfwTerminate.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwTerminate();
|
||||||
|
```
|
||||||
|
|
||||||
|
This will destroy any remaining window, monitor and cursor objects, restore any
|
||||||
|
modified gamma ramps, re-enable the screensaver if it had been disabled and free
|
||||||
|
any other resources allocated by GLFW.
|
||||||
|
|
||||||
|
Once the library is terminated, it is as if it had never been initialized, therefore
|
||||||
|
you will need to initialize it again before being able to use GLFW. If the
|
||||||
|
library was not initialized or had already been terminated, it returns
|
||||||
|
immediately.
|
||||||
|
|
||||||
|
|
||||||
|
## Error handling {#error_handling}
|
||||||
|
|
||||||
|
Some GLFW functions have return values that indicate an error, but this is often
|
||||||
|
not very helpful when trying to figure out what happened or why it occurred.
|
||||||
|
Other functions have no return value reserved for errors, so error notification
|
||||||
|
needs a separate channel. Finally, far from all GLFW functions have return
|
||||||
|
values.
|
||||||
|
|
||||||
|
The last [error code](@ref errors) for the calling thread can be queried at any
|
||||||
|
time with @ref glfwGetError.
|
||||||
|
|
||||||
|
```c
|
||||||
|
int code = glfwGetError(NULL);
|
||||||
|
|
||||||
|
if (code != GLFW_NO_ERROR)
|
||||||
|
handle_error(code);
|
||||||
|
```
|
||||||
|
|
||||||
|
If no error has occurred since the last call, @ref GLFW_NO_ERROR (zero) is
|
||||||
|
returned. The error is cleared before the function returns.
|
||||||
|
|
||||||
|
The error code indicates the general category of the error. Some error codes,
|
||||||
|
such as @ref GLFW_NOT_INITIALIZED has only a single meaning, whereas others like
|
||||||
|
@ref GLFW_PLATFORM_ERROR are used for many different errors.
|
||||||
|
|
||||||
|
GLFW often has more information about an error than its general category. You
|
||||||
|
can retrieve a UTF-8 encoded human-readable description along with the error
|
||||||
|
code. If no error has occurred since the last call, the description is set to
|
||||||
|
`NULL`.
|
||||||
|
|
||||||
|
```c
|
||||||
|
const char* description;
|
||||||
|
int code = glfwGetError(&description);
|
||||||
|
|
||||||
|
if (description)
|
||||||
|
display_error_message(code, description);
|
||||||
|
```
|
||||||
|
|
||||||
|
The retrieved description string is only valid until the next error occurs.
|
||||||
|
This means you must make a copy of it if you want to keep it.
|
||||||
|
|
||||||
|
You can also set an error callback, which will be called each time an error
|
||||||
|
occurs. It is set with @ref glfwSetErrorCallback.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwSetErrorCallback(error_callback);
|
||||||
|
```
|
||||||
|
|
||||||
|
The error callback receives the same error code and human-readable description
|
||||||
|
returned by @ref glfwGetError.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void error_callback(int code, const char* description)
|
||||||
|
{
|
||||||
|
display_error_message(code, description);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The error callback is called after the error is stored, so calling @ref
|
||||||
|
glfwGetError from within the error callback returns the same values as the
|
||||||
|
callback argument.
|
||||||
|
|
||||||
|
The description string passed to the callback is only valid until the error
|
||||||
|
callback returns. This means you must make a copy of it if you want to keep it.
|
||||||
|
|
||||||
|
__Reported errors are never fatal.__ As long as GLFW was successfully
|
||||||
|
initialized, it will remain initialized and in a safe state until terminated
|
||||||
|
regardless of how many errors occur. If an error occurs during initialization
|
||||||
|
that causes @ref glfwInit to fail, any part of the library that was initialized
|
||||||
|
will be safely terminated.
|
||||||
|
|
||||||
|
Do not rely on a currently invalid call to generate a specific error, as in the
|
||||||
|
future that same call may generate a different error or become valid.
|
||||||
|
|
||||||
|
|
||||||
|
## Coordinate systems {#coordinate_systems}
|
||||||
|
|
||||||
|
GLFW has two primary coordinate systems: the _virtual screen_ and the window
|
||||||
|
_content area_ or _content area_. Both use the same unit: _virtual screen
|
||||||
|
coordinates_, or just _screen coordinates_, which don't necessarily correspond
|
||||||
|
to pixels.
|
||||||
|
|
||||||
|
<img src="spaces.svg" width="90%" />
|
||||||
|
|
||||||
|
Both the virtual screen and the content area coordinate systems have the X-axis
|
||||||
|
pointing to the right and the Y-axis pointing down.
|
||||||
|
|
||||||
|
Window and monitor positions are specified as the position of the upper-left
|
||||||
|
corners of their content areas relative to the virtual screen, while cursor
|
||||||
|
positions are specified relative to a window's content area.
|
||||||
|
|
||||||
|
Because the origin of the window's content area coordinate system is also the
|
||||||
|
point from which the window position is specified, you can translate content
|
||||||
|
area coordinates to the virtual screen by adding the window position. The
|
||||||
|
window frame, when present, extends out from the content area but does not
|
||||||
|
affect the window position.
|
||||||
|
|
||||||
|
Almost all positions and sizes in GLFW are measured in screen coordinates
|
||||||
|
relative to one of the two origins above. This includes cursor positions,
|
||||||
|
window positions and sizes, window frame sizes, monitor positions and video mode
|
||||||
|
resolutions.
|
||||||
|
|
||||||
|
Two exceptions are the [monitor physical size](@ref monitor_size), which is
|
||||||
|
measured in millimetres, and [framebuffer size](@ref window_fbsize), which is
|
||||||
|
measured in pixels.
|
||||||
|
|
||||||
|
Pixels and screen coordinates may map 1:1 on your machine, but they won't on
|
||||||
|
every other machine, for example on a Mac with a Retina display. The ratio
|
||||||
|
between screen coordinates and pixels may also change at run-time depending on
|
||||||
|
which monitor the window is currently considered to be on.
|
||||||
|
|
||||||
|
|
||||||
|
## Guarantees and limitations {#guarantees_limitations}
|
||||||
|
|
||||||
|
This section describes the conditions under which GLFW can be expected to
|
||||||
|
function, barring bugs in the operating system or drivers. Use of GLFW outside
|
||||||
|
these limits may work on some platforms, or on some machines, or some of the
|
||||||
|
time, or on some versions of GLFW, but it may break at any time and this will
|
||||||
|
not be considered a bug.
|
||||||
|
|
||||||
|
|
||||||
|
### Pointer lifetimes {#lifetime}
|
||||||
|
|
||||||
|
GLFW will never free any pointer you provide to it, and you must never free any
|
||||||
|
pointer it provides to you.
|
||||||
|
|
||||||
|
Many GLFW functions return pointers to dynamically allocated structures, strings
|
||||||
|
or arrays, and some callbacks are provided with strings or arrays. These are
|
||||||
|
always managed by GLFW and should never be freed by the application. The
|
||||||
|
lifetime of these pointers is documented for each GLFW function and callback.
|
||||||
|
If you need to keep this data, you must copy it before its lifetime expires.
|
||||||
|
|
||||||
|
Many GLFW functions accept pointers to structures or strings allocated by the
|
||||||
|
application. These are never freed by GLFW and are always the responsibility of
|
||||||
|
the application. If GLFW needs to keep the data in these structures or strings,
|
||||||
|
it is copied before the function returns.
|
||||||
|
|
||||||
|
Pointer lifetimes are guaranteed not to be shortened in future minor or patch
|
||||||
|
releases.
|
||||||
|
|
||||||
|
|
||||||
|
### Reentrancy {#reentrancy}
|
||||||
|
|
||||||
|
GLFW event processing and object destruction are not reentrant. This means that
|
||||||
|
the following functions must not be called from any callback function:
|
||||||
|
|
||||||
|
- @ref glfwDestroyWindow
|
||||||
|
- @ref glfwDestroyCursor
|
||||||
|
- @ref glfwPollEvents
|
||||||
|
- @ref glfwWaitEvents
|
||||||
|
- @ref glfwWaitEventsTimeout
|
||||||
|
- @ref glfwTerminate
|
||||||
|
|
||||||
|
These functions may be made reentrant in future minor or patch releases, but
|
||||||
|
functions not on this list will not be made non-reentrant.
|
||||||
|
|
||||||
|
|
||||||
|
### Thread safety {#thread_safety}
|
||||||
|
|
||||||
|
Most GLFW functions must only be called from the main thread (the thread that
|
||||||
|
calls main), but some may be called from any thread once the library has been
|
||||||
|
initialized. Before initialization the whole library is thread-unsafe.
|
||||||
|
|
||||||
|
The reference documentation for every GLFW function states whether it is limited
|
||||||
|
to the main thread.
|
||||||
|
|
||||||
|
Initialization, termination, event processing and the creation and
|
||||||
|
destruction of windows, cursors and OpenGL and OpenGL ES contexts are all
|
||||||
|
restricted to the main thread due to limitations of one or several platforms.
|
||||||
|
|
||||||
|
Because event processing must be performed on the main thread, all callbacks
|
||||||
|
except for the error callback will only be called on that thread. The error
|
||||||
|
callback may be called on any thread, as any GLFW function may generate errors.
|
||||||
|
|
||||||
|
The error code and description may be queried from any thread.
|
||||||
|
|
||||||
|
- @ref glfwGetError
|
||||||
|
|
||||||
|
Empty events may be posted from any thread.
|
||||||
|
|
||||||
|
- @ref glfwPostEmptyEvent
|
||||||
|
|
||||||
|
The window user pointer and close flag may be read and written from any thread,
|
||||||
|
but this is not synchronized by GLFW.
|
||||||
|
|
||||||
|
- @ref glfwGetWindowUserPointer
|
||||||
|
- @ref glfwSetWindowUserPointer
|
||||||
|
- @ref glfwWindowShouldClose
|
||||||
|
- @ref glfwSetWindowShouldClose
|
||||||
|
|
||||||
|
These functions for working with OpenGL and OpenGL ES contexts may be called
|
||||||
|
from any thread, but the window object is not synchronized by GLFW.
|
||||||
|
|
||||||
|
- @ref glfwMakeContextCurrent
|
||||||
|
- @ref glfwGetCurrentContext
|
||||||
|
- @ref glfwSwapBuffers
|
||||||
|
- @ref glfwSwapInterval
|
||||||
|
- @ref glfwExtensionSupported
|
||||||
|
- @ref glfwGetProcAddress
|
||||||
|
|
||||||
|
The raw timer functions may be called from any thread.
|
||||||
|
|
||||||
|
- @ref glfwGetTimerFrequency
|
||||||
|
- @ref glfwGetTimerValue
|
||||||
|
|
||||||
|
The regular timer may be used from any thread, but reading and writing the timer
|
||||||
|
offset is not synchronized by GLFW.
|
||||||
|
|
||||||
|
- @ref glfwGetTime
|
||||||
|
- @ref glfwSetTime
|
||||||
|
|
||||||
|
Library version information may be queried from any thread.
|
||||||
|
|
||||||
|
- @ref glfwGetVersion
|
||||||
|
- @ref glfwGetVersionString
|
||||||
|
|
||||||
|
Platform information may be queried from any thread.
|
||||||
|
|
||||||
|
- @ref glfwPlatformSupported
|
||||||
|
- @ref glfwGetPlatform
|
||||||
|
|
||||||
|
All Vulkan related functions may be called from any thread.
|
||||||
|
|
||||||
|
- @ref glfwVulkanSupported
|
||||||
|
- @ref glfwGetRequiredInstanceExtensions
|
||||||
|
- @ref glfwGetInstanceProcAddress
|
||||||
|
- @ref glfwGetPhysicalDevicePresentationSupport
|
||||||
|
- @ref glfwCreateWindowSurface
|
||||||
|
|
||||||
|
GLFW uses synchronization objects internally only to manage the per-thread
|
||||||
|
context and error states. Additional synchronization is left to the
|
||||||
|
application.
|
||||||
|
|
||||||
|
Functions that may currently be called from any thread will always remain so,
|
||||||
|
but functions that are currently limited to the main thread may be updated to
|
||||||
|
allow calls from any thread in future releases.
|
||||||
|
|
||||||
|
|
||||||
|
### Version compatibility {#compatibility}
|
||||||
|
|
||||||
|
GLFW uses [Semantic Versioning](https://semver.org/). This guarantees source
|
||||||
|
and binary backward compatibility with earlier minor versions of the API. This
|
||||||
|
means that you can drop in a newer version of the library and existing programs
|
||||||
|
will continue to compile and existing binaries will continue to run.
|
||||||
|
|
||||||
|
Once a function or constant has been added, the signature of that function or
|
||||||
|
value of that constant will remain unchanged until the next major version of
|
||||||
|
GLFW. No compatibility of any kind is guaranteed between major versions.
|
||||||
|
|
||||||
|
Undocumented behavior, i.e. behavior that is not described in the documentation,
|
||||||
|
may change at any time until it is documented.
|
||||||
|
|
||||||
|
If the reference documentation and the implementation differ, the reference
|
||||||
|
documentation will almost always take precedence and the implementation will be
|
||||||
|
fixed in the next release. The reference documentation will also take
|
||||||
|
precedence over anything stated in a guide.
|
||||||
|
|
||||||
|
|
||||||
|
### Event order {#event_order}
|
||||||
|
|
||||||
|
The order of arrival of related events is not guaranteed to be consistent
|
||||||
|
across platforms. The exception is synthetic key and mouse button release
|
||||||
|
events, which are always delivered after the window defocus event.
|
||||||
|
|
||||||
|
|
||||||
|
## Version management {#intro_version}
|
||||||
|
|
||||||
|
GLFW provides mechanisms for identifying what version of GLFW your application
|
||||||
|
was compiled against as well as what version it is currently running against.
|
||||||
|
If you are loading GLFW dynamically (not just linking dynamically), you can use
|
||||||
|
this to verify that the library binary is compatible with your application.
|
||||||
|
|
||||||
|
|
||||||
|
### Compile-time version {#intro_version_compile}
|
||||||
|
|
||||||
|
The compile-time version of GLFW is provided by the GLFW header with the
|
||||||
|
`GLFW_VERSION_MAJOR`, `GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` macros.
|
||||||
|
|
||||||
|
```c
|
||||||
|
printf("Compiled against GLFW %i.%i.%i\n",
|
||||||
|
GLFW_VERSION_MAJOR,
|
||||||
|
GLFW_VERSION_MINOR,
|
||||||
|
GLFW_VERSION_REVISION);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Run-time version {#intro_version_runtime}
|
||||||
|
|
||||||
|
The run-time version can be retrieved with @ref glfwGetVersion, a function that
|
||||||
|
may be called regardless of whether GLFW is initialized.
|
||||||
|
|
||||||
|
```c
|
||||||
|
int major, minor, revision;
|
||||||
|
glfwGetVersion(&major, &minor, &revision);
|
||||||
|
|
||||||
|
printf("Running against GLFW %i.%i.%i\n", major, minor, revision);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Version string {#intro_version_string}
|
||||||
|
|
||||||
|
GLFW 3 also provides a compile-time generated version string that describes the
|
||||||
|
version, platform, compiler and any platform-specific compile-time options.
|
||||||
|
This is primarily intended for submitting bug reports, to allow developers to
|
||||||
|
see which code paths are enabled in a binary.
|
||||||
|
|
||||||
|
The version string is returned by @ref glfwGetVersionString, a function that may
|
||||||
|
be called regardless of whether GLFW is initialized.
|
||||||
|
|
||||||
|
__Do not use the version string__ to parse the GLFW library version. The @ref
|
||||||
|
glfwGetVersion function already provides the version of the running library
|
||||||
|
binary.
|
||||||
|
|
||||||
|
__Do not use the version string__ to parse what platforms are supported. The @ref
|
||||||
|
glfwPlatformSupported function lets you query platform support.
|
||||||
|
|
||||||
|
__GLFW 3.4:__ The format of this string was changed to support the addition of
|
||||||
|
[runtime platform selection](@ref platform).
|
||||||
|
|
||||||
|
The format of the string is as follows:
|
||||||
|
- The version of GLFW
|
||||||
|
- For each supported platform:
|
||||||
|
- The name of the window system API
|
||||||
|
- The name of the window system specific context creation API, if applicable
|
||||||
|
- The names of the always supported context creation APIs EGL and OSMesa
|
||||||
|
- Any additional compile-time options, APIs and (on Windows) what compiler was used
|
||||||
|
|
||||||
|
For example, compiling GLFW 3.5 with MinGW as a DLL for Windows, may result in a version string
|
||||||
|
like this:
|
||||||
|
|
||||||
|
```c
|
||||||
|
3.5.0 Win32 WGL Null EGL OSMesa MinGW DLL
|
||||||
|
```
|
||||||
|
|
||||||
|
Compiling GLFW as a static library for Linux, with both Wayland and X11 enabled, may
|
||||||
|
result in a version string like this:
|
||||||
|
|
||||||
|
```c
|
||||||
|
3.5.0 Wayland X11 GLX Null EGL OSMesa monotonic
|
||||||
|
```
|
||||||
|
|
@ -1,15 +1,10 @@
|
|||||||
/*!
|
# Introduction {#mainpage}
|
||||||
|
|
||||||
@mainpage notitle
|
|
||||||
|
|
||||||
@section main_intro Introduction
|
|
||||||
|
|
||||||
GLFW is a free, Open Source, multi-platform library for OpenGL, OpenGL ES and
|
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.
|
||||||
|
|
||||||
See @ref news_32 for release highlights or the
|
@ref news list new features, caveats and deprecations.
|
||||||
[version history](http://www.glfw.org/changelog.html) for details.
|
|
||||||
|
|
||||||
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
@ref quick_guide is a guide for users new to GLFW. It takes you through how to
|
||||||
write a small but complete program.
|
write a small but complete program.
|
||||||
@ -34,14 +29,10 @@ use the new API.
|
|||||||
There is a section on @ref guarantees_limitations for pointer lifetimes,
|
There is a section on @ref guarantees_limitations for pointer lifetimes,
|
||||||
reentrancy, thread safety, event order and backward and forward compatibility.
|
reentrancy, thread safety, event order and backward and forward compatibility.
|
||||||
|
|
||||||
The [FAQ](http://www.glfw.org/faq.html) answers many common questions about the
|
|
||||||
design, implementation and use of GLFW.
|
|
||||||
|
|
||||||
Finally, @ref compat_guide explains what APIs, standards and protocols GLFW uses
|
Finally, @ref compat_guide explains what APIs, standards and protocols GLFW uses
|
||||||
and what happens when they are not present on a given machine.
|
and what happens when they are not present on a given machine.
|
||||||
|
|
||||||
This documentation was generated with Doxygen. The sources for it are available
|
This documentation was generated with Doxygen. The sources for it are available
|
||||||
in both the [source distribution](http://www.glfw.org/download.html) and
|
in both the [source distribution](https://www.glfw.org/download.html) and
|
||||||
[GitHub repository](https://github.com/glfw/glfw).
|
[GitHub repository](https://github.com/glfw/glfw).
|
||||||
|
|
||||||
*/
|
|
@ -1,8 +1,6 @@
|
|||||||
/*!
|
# Monitor guide {#monitor_guide}
|
||||||
|
|
||||||
@page monitor_guide Monitor guide
|
[TOC]
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide introduces the monitor related functions of GLFW. For details on
|
This guide introduces the monitor related functions of GLFW. For details on
|
||||||
a specific function in this category, see the @ref monitor. There are also
|
a specific function in this category, see the @ref monitor. There are also
|
||||||
@ -15,7 +13,7 @@ guides for the other areas of GLFW.
|
|||||||
- @ref input_guide
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
@section monitor_object Monitor objects
|
## Monitor objects {#monitor_object}
|
||||||
|
|
||||||
A monitor object represents a currently connected monitor and is represented as
|
A monitor object represents a currently connected monitor and is represented as
|
||||||
a pointer to the [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type
|
a pointer to the [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type
|
||||||
@ -36,42 +34,42 @@ To see how GLFW views your monitor setup and its available video modes, run the
|
|||||||
`monitors` test program.
|
`monitors` test program.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_monitors Retrieving monitors
|
### Retrieving monitors {#monitor_monitors}
|
||||||
|
|
||||||
The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is the user's
|
The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is the user's
|
||||||
preferred monitor and is usually the one with global UI elements like task bar
|
preferred monitor and is usually the one with global UI elements like task bar
|
||||||
or menu bar.
|
or menu bar.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
GLFWmonitor* primary = glfwGetPrimaryMonitor();
|
GLFWmonitor* primary = glfwGetPrimaryMonitor();
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
You can retrieve all currently connected monitors with @ref glfwGetMonitors.
|
You can retrieve all currently connected monitors with @ref glfwGetMonitors.
|
||||||
See the reference documentation for the lifetime of the returned array.
|
See the reference documentation for the lifetime of the returned array.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
int count;
|
int count;
|
||||||
GLFWmonitor** monitors = glfwGetMonitors(&count);
|
GLFWmonitor** monitors = glfwGetMonitors(&count);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The primary monitor is always the first monitor in the returned array, but other
|
The primary monitor is always the first monitor in the returned array, but other
|
||||||
monitors may be moved to a different index when a monitor is connected or
|
monitors may be moved to a different index when a monitor is connected or
|
||||||
disconnected.
|
disconnected.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_event Monitor configuration changes
|
### Monitor configuration changes {#monitor_event}
|
||||||
|
|
||||||
If you wish to be notified when a monitor is connected or disconnected, set
|
If you wish to be notified when a monitor is connected or disconnected, set
|
||||||
a monitor callback.
|
a monitor callback.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSetMonitorCallback(monitor_callback);
|
glfwSetMonitorCallback(monitor_callback);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The callback function receives the handle for the monitor that has been
|
The callback function receives the handle for the monitor that has been
|
||||||
connected or disconnected and the event that occurred.
|
connected or disconnected and the event that occurred.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
void monitor_callback(GLFWmonitor* monitor, int event)
|
void monitor_callback(GLFWmonitor* monitor, int event)
|
||||||
{
|
{
|
||||||
if (event == GLFW_CONNECTED)
|
if (event == GLFW_CONNECTED)
|
||||||
@ -83,23 +81,25 @@ void monitor_callback(GLFWmonitor* monitor, int event)
|
|||||||
// The monitor was disconnected
|
// The monitor was disconnected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
If a monitor is disconnected, any windows that are full screen on it get forced
|
If a monitor is disconnected, all windows that are full screen on it will be
|
||||||
into windowed mode.
|
switched to windowed mode before the callback is called. Only @ref
|
||||||
|
glfwGetMonitorName and @ref glfwGetMonitorUserPointer will return useful values
|
||||||
|
for a disconnected monitor and only before the monitor callback returns.
|
||||||
|
|
||||||
|
|
||||||
@section monitor_properties Monitor properties
|
## Monitor properties {#monitor_properties}
|
||||||
|
|
||||||
Each monitor has a current video mode, a list of supported video modes,
|
Each monitor has a current video mode, a list of supported video modes,
|
||||||
a virtual position, a human-readable name, an estimated physical size and
|
a virtual position, a content scale, a human-readable name, a user pointer, an
|
||||||
a gamma ramp.
|
estimated physical size and a gamma ramp.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_modes Video modes
|
### Video modes {#monitor_modes}
|
||||||
|
|
||||||
GLFW generally does a good job selecting a suitable video mode when you create
|
GLFW generally does a good job selecting a suitable video mode when you create
|
||||||
a full screen window, change its video mode or or make a windowed one full
|
a full screen window, change its video mode or make a windowed one full
|
||||||
screen, but it is sometimes useful to know exactly which video modes are
|
screen, but it is sometimes useful to know exactly which video modes are
|
||||||
supported.
|
supported.
|
||||||
|
|
||||||
@ -107,75 +107,109 @@ Video modes are represented as @ref GLFWvidmode structures. You can get an
|
|||||||
array of the video modes supported by a monitor with @ref glfwGetVideoModes.
|
array of the video modes supported by a monitor with @ref glfwGetVideoModes.
|
||||||
See the reference documentation for the lifetime of the returned array.
|
See the reference documentation for the lifetime of the returned array.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
int count;
|
int count;
|
||||||
GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);
|
GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
To get the current video mode of a monitor call @ref glfwGetVideoMode. See the
|
To get the current video mode of a monitor call @ref glfwGetVideoMode. See the
|
||||||
reference documentation for the lifetime of the returned pointer.
|
reference documentation for the lifetime of the returned pointer.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The resolution of a video mode is specified in
|
The resolution of a video mode is specified in
|
||||||
[screen coordinates](@ref coordinate_systems), not pixels.
|
[screen coordinates](@ref coordinate_systems), not pixels.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_size Physical size
|
### Physical size {#monitor_size}
|
||||||
|
|
||||||
The physical size of a monitor in millimetres, or an estimation of it, can be
|
The physical size of a monitor in millimetres, or an estimation of it, can be
|
||||||
retrieved with @ref glfwGetMonitorPhysicalSize. This has no relation to its
|
retrieved with @ref glfwGetMonitorPhysicalSize. This has no relation to its
|
||||||
current _resolution_, i.e. the width and height of its current
|
current _resolution_, i.e. the width and height of its current
|
||||||
[video mode](@ref monitor_modes).
|
[video mode](@ref monitor_modes).
|
||||||
|
|
||||||
@code
|
```c
|
||||||
int widthMM, heightMM;
|
int width_mm, height_mm;
|
||||||
glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);
|
glfwGetMonitorPhysicalSize(monitor, &width_mm, &height_mm);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This can, for example, be used together with the current video mode to calculate
|
While this can be used to calculate the raw DPI of a monitor, this is often not
|
||||||
the DPI of a monitor.
|
useful. Instead, use the [monitor content scale](@ref monitor_scale) and
|
||||||
|
[window content scale](@ref window_scale) to scale your content.
|
||||||
@code
|
|
||||||
const double dpi = mode->width / (widthMM / 25.4);
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_pos Virtual position
|
### Content scale {#monitor_scale}
|
||||||
|
|
||||||
|
The content scale for a monitor can be retrieved with @ref
|
||||||
|
glfwGetMonitorContentScale.
|
||||||
|
|
||||||
|
```c
|
||||||
|
float xscale, yscale;
|
||||||
|
glfwGetMonitorContentScale(monitor, &xscale, &yscale);
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information on what the content scale is and how to use it, see
|
||||||
|
[window content scale](@ref window_scale).
|
||||||
|
|
||||||
|
|
||||||
|
### Virtual position {#monitor_pos}
|
||||||
|
|
||||||
The position of the monitor on the virtual desktop, in
|
The position of the monitor on the virtual desktop, in
|
||||||
[screen coordinates](@ref coordinate_systems), can be retrieved with @ref
|
[screen coordinates](@ref coordinate_systems), can be retrieved with @ref
|
||||||
glfwGetMonitorPos.
|
glfwGetMonitorPos.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
int xpos, ypos;
|
int xpos, ypos;
|
||||||
glfwGetMonitorPos(monitor, &xpos, &ypos);
|
glfwGetMonitorPos(monitor, &xpos, &ypos);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_name Human-readable name
|
### Work area {#monitor_workarea}
|
||||||
|
|
||||||
|
The area of a monitor not occupied by global task bars or menu bars is the work
|
||||||
|
area. This is specified in [screen coordinates](@ref coordinate_systems) and
|
||||||
|
can be retrieved with @ref glfwGetMonitorWorkarea.
|
||||||
|
|
||||||
|
```c
|
||||||
|
int xpos, ypos, width, height;
|
||||||
|
glfwGetMonitorWorkarea(monitor, &xpos, &ypos, &width, &height);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Human-readable name {#monitor_name}
|
||||||
|
|
||||||
The human-readable, UTF-8 encoded name of a monitor is returned by @ref
|
The human-readable, UTF-8 encoded name of a monitor is returned by @ref
|
||||||
glfwGetMonitorName. See the reference documentation for the lifetime of the
|
glfwGetMonitorName. See the reference documentation for the lifetime of the
|
||||||
returned string.
|
returned string.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
const char* name = glfwGetMonitorName(monitor);
|
const char* name = glfwGetMonitorName(monitor);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Monitor names are not guaranteed to be unique. Two monitors of the same model
|
Monitor names are not guaranteed to be unique. Two monitors of the same model
|
||||||
and make may have the same name. Only the monitor handle is guaranteed to be
|
and make may have the same name. Only the monitor handle is guaranteed to be
|
||||||
unique, and only until that monitor is disconnected.
|
unique, and only until that monitor is disconnected.
|
||||||
|
|
||||||
|
|
||||||
@subsection monitor_gamma Gamma ramp
|
### User pointer {#monitor_userptr}
|
||||||
|
|
||||||
|
Each monitor has a user pointer that can be set with @ref
|
||||||
|
glfwSetMonitorUserPointer and queried with @ref glfwGetMonitorUserPointer. This
|
||||||
|
can be used for any purpose you need and will not be modified by GLFW. The
|
||||||
|
value will be kept until the monitor is disconnected or until the library is
|
||||||
|
terminated.
|
||||||
|
|
||||||
|
The initial value of the pointer is `NULL`.
|
||||||
|
|
||||||
|
|
||||||
|
### Gamma ramp {#monitor_gamma}
|
||||||
|
|
||||||
The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts
|
The gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts
|
||||||
a monitor handle and a pointer to a @ref GLFWgammaramp structure.
|
a monitor handle and a pointer to a @ref GLFWgammaramp structure.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
GLFWgammaramp ramp;
|
GLFWgammaramp ramp;
|
||||||
unsigned short red[256], green[256], blue[256];
|
unsigned short red[256], green[256], blue[256];
|
||||||
|
|
||||||
@ -190,27 +224,34 @@ for (i = 0; i < ramp.size; i++)
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwSetGammaRamp(monitor, &ramp);
|
glfwSetGammaRamp(monitor, &ramp);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The gamma ramp data is copied before the function returns, so there is no need
|
The gamma ramp data is copied before the function returns, so there is no need
|
||||||
to keep it around once the ramp has been set.
|
to keep it around once the ramp has been set.
|
||||||
|
|
||||||
@note It is recommended to use gamma ramps of size 256, as that is the size
|
It is recommended that your gamma ramp have the same size as the current gamma
|
||||||
supported by all graphics cards on all platforms.
|
ramp for that monitor.
|
||||||
|
|
||||||
The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See
|
The current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp. See
|
||||||
the reference documentation for the lifetime of the returned structure.
|
the reference documentation for the lifetime of the returned structure.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);
|
const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
If you wish to set a regular gamma ramp, you can have GLFW calculate it for you
|
If you wish to set a regular gamma ramp, you can have GLFW calculate it for you
|
||||||
from the desired exponent with @ref glfwSetGamma, which in turn calls @ref
|
from the desired exponent with @ref glfwSetGamma, which in turn calls @ref
|
||||||
glfwSetGammaRamp with the resulting ramp.
|
glfwSetGammaRamp with the resulting ramp.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSetGamma(monitor, 1.0);
|
glfwSetGamma(monitor, 1.0);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
To experiment with gamma correction via the @ref glfwSetGamma function, run the
|
||||||
|
`gamma` test program.
|
||||||
|
|
||||||
|
@note The software controlled gamma ramp is applied _in addition_ to the
|
||||||
|
hardware gamma correction, which today is typically an approximation of sRGB
|
||||||
|
gamma. This means that setting a perfectly linear ramp, or gamma 1.0, will
|
||||||
|
produce the default (usually sRGB-like) behavior.
|
||||||
|
|
||||||
*/
|
|
@ -1,8 +1,6 @@
|
|||||||
/*!
|
# Moving from GLFW 2 to 3 {#moving_guide}
|
||||||
|
|
||||||
@page moving_guide Moving from GLFW 2 to 3
|
[TOC]
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This is a transition guide for moving from GLFW 2 to 3. It describes what has
|
This is a transition guide for moving from GLFW 2 to 3. It describes what has
|
||||||
changed or been removed, but does _not_ include
|
changed or been removed, but does _not_ include
|
||||||
@ -11,61 +9,64 @@ base onto the new API. For example, the new multi-monitor functions are
|
|||||||
required to create full screen windows with GLFW 3.
|
required to create full screen windows with GLFW 3.
|
||||||
|
|
||||||
|
|
||||||
@section moving_removed Changed and removed features
|
## Changed and removed features {#moving_removed}
|
||||||
|
|
||||||
@subsection moving_renamed_files Renamed library and header file
|
### Renamed library and header file {#moving_renamed_files}
|
||||||
|
|
||||||
The GLFW 3 header is named @ref glfw3.h and moved to the `GLFW` directory, to
|
The GLFW 3 header is named @ref glfw3.h and moved to the `GLFW` directory, to
|
||||||
avoid collisions with the headers of other major versions. Similarly, the GLFW
|
avoid collisions with the headers of other major versions. Similarly, the GLFW
|
||||||
3 library is named `glfw3,` except when it's installed as a shared library on
|
3 library is named `glfw3,` except when it's installed as a shared library on
|
||||||
Unix-like systems, where it uses the
|
Unix-like systems, where it uses the [soname][] `libglfw.so.3`.
|
||||||
[soname](https://en.wikipedia.org/wiki/soname) `libglfw.so.3`.
|
|
||||||
|
|
||||||
@par Old syntax
|
[soname]: https://en.wikipedia.org/wiki/soname
|
||||||
@code
|
|
||||||
|
__Old syntax__
|
||||||
|
```c
|
||||||
#include <GL/glfw.h>
|
#include <GL/glfw.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_threads Removal of threading functions
|
### Removal of threading functions {#moving_threads}
|
||||||
|
|
||||||
The threading functions have been removed, including the per-thread sleep
|
The threading functions have been removed, including the per-thread sleep
|
||||||
function. They were fairly primitive, under-used, poorly integrated and took
|
function. They were fairly primitive, under-used, poorly integrated and took
|
||||||
time away from the focus of GLFW (i.e. context, input and window). There are
|
time away from the focus of GLFW (i.e. context, input and window). There are
|
||||||
better threading libraries available and native threading support is available
|
better threading libraries available and native threading support is available
|
||||||
in both [C++11](http://en.cppreference.com/w/cpp/thread) and
|
in both [C++11][] and [C11][], both of which are gaining traction.
|
||||||
[C11](http://en.cppreference.com/w/c/thread), both of which are gaining
|
|
||||||
traction.
|
[C++11]: https://en.cppreference.com/w/cpp/thread
|
||||||
|
[C11]: https://en.cppreference.com/w/c/thread
|
||||||
|
|
||||||
If you wish to use the C++11 or C11 facilities but your compiler doesn't yet
|
If you wish to use the C++11 or C11 facilities but your compiler doesn't yet
|
||||||
support them, see the
|
support them, see the [TinyThread++][] and [TinyCThread][] projects created by
|
||||||
[TinyThread++](https://gitorious.org/tinythread/tinythreadpp) and
|
|
||||||
[TinyCThread](https://github.com/tinycthread/tinycthread) projects created by
|
|
||||||
the original author of GLFW. These libraries implement a usable subset of the
|
the original author of GLFW. These libraries implement a usable subset of the
|
||||||
threading APIs in C++11 and C11, and in fact some GLFW 3 test programs use
|
threading APIs in C++11 and C11, and in fact some GLFW 3 test programs use
|
||||||
TinyCThread.
|
TinyCThread.
|
||||||
|
|
||||||
|
[TinyThread++]: https://gitorious.org/tinythread/tinythreadpp
|
||||||
|
[TinyCThread]: https://github.com/tinycthread/tinycthread
|
||||||
|
|
||||||
However, GLFW 3 has better support for _use from multiple threads_ than GLFW
|
However, GLFW 3 has better support for _use from multiple threads_ than GLFW
|
||||||
2 had. Contexts can be made current on any thread, although only a single
|
2 had. Contexts can be made current on any thread, although only a single
|
||||||
thread at a time, and the documentation explicitly states which functions may be
|
thread at a time, and the documentation explicitly states which functions may be
|
||||||
used from any thread and which must only be used from the main thread.
|
used from any thread and which must only be used from the main thread.
|
||||||
|
|
||||||
@par Removed functions
|
__Removed functions__
|
||||||
`glfwSleep`, `glfwCreateThread`, `glfwDestroyThread`, `glfwWaitThread`,
|
> `glfwSleep`, `glfwCreateThread`, `glfwDestroyThread`, `glfwWaitThread`,
|
||||||
`glfwGetThreadID`, `glfwCreateMutex`, `glfwDestroyMutex`, `glfwLockMutex`,
|
> `glfwGetThreadID`, `glfwCreateMutex`, `glfwDestroyMutex`, `glfwLockMutex`,
|
||||||
`glfwUnlockMutex`, `glfwCreateCond`, `glfwDestroyCond`, `glfwWaitCond`,
|
> `glfwUnlockMutex`, `glfwCreateCond`, `glfwDestroyCond`, `glfwWaitCond`,
|
||||||
`glfwSignalCond`, `glfwBroadcastCond` and `glfwGetNumberOfProcessors`.
|
> `glfwSignalCond`, `glfwBroadcastCond` and `glfwGetNumberOfProcessors`.
|
||||||
|
|
||||||
@par Removed types
|
__Removed types__
|
||||||
`GLFWthreadfun`
|
> `GLFWthreadfun`
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_image Removal of image and texture loading
|
### Removal of image and texture loading {#moving_image}
|
||||||
|
|
||||||
The image and texture loading functions have been removed. They only supported
|
The image and texture loading functions have been removed. They only supported
|
||||||
the Targa image format, making them mostly useful for beginner level examples.
|
the Targa image format, making them mostly useful for beginner level examples.
|
||||||
@ -73,100 +74,103 @@ To become of sufficiently high quality to warrant keeping them in GLFW 3, they
|
|||||||
would need not only to support other formats, but also modern extensions to
|
would need not only to support other formats, but also modern extensions to
|
||||||
OpenGL texturing. This would either add a number of external
|
OpenGL texturing. This would either add a number of external
|
||||||
dependencies (libjpeg, libpng, etc.), or force GLFW to ship with inline versions
|
dependencies (libjpeg, libpng, etc.), or force GLFW to ship with inline versions
|
||||||
of these libraries.
|
of these libraries.
|
||||||
|
|
||||||
As there already are libraries doing this, it is unnecessary both to duplicate
|
As there already are libraries doing this, it is unnecessary both to duplicate
|
||||||
the work and to tie the duplicate to GLFW. The resulting library would also be
|
the work and to tie the duplicate to GLFW. The resulting library would also be
|
||||||
platform-independent, as both OpenGL and stdio are available wherever GLFW is.
|
platform-independent, as both OpenGL and stdio are available wherever GLFW is.
|
||||||
|
|
||||||
@par Removed functions
|
__Removed functions__
|
||||||
`glfwReadImage`, `glfwReadMemoryImage`, `glfwFreeImage`, `glfwLoadTexture2D`,
|
> `glfwReadImage`, `glfwReadMemoryImage`, `glfwFreeImage`, `glfwLoadTexture2D`,
|
||||||
`glfwLoadMemoryTexture2D` and `glfwLoadTextureImage2D`.
|
> `glfwLoadMemoryTexture2D` and `glfwLoadTextureImage2D`.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_stdcall Removal of GLFWCALL macro
|
### Removal of GLFWCALL macro {#moving_stdcall}
|
||||||
|
|
||||||
The `GLFWCALL` macro, which made callback functions use
|
The `GLFWCALL` macro, which made callback functions use [\_\_stdcall][stdcall]
|
||||||
[__stdcall](http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) on Windows,
|
on Windows, has been removed. GLFW is written in C, not Pascal. Removing this
|
||||||
has been removed. GLFW is written in C, not Pascal. Removing this macro means
|
macro means there's one less thing for application programmers to remember, i.e.
|
||||||
there's one less thing for application programmers to remember, i.e. the
|
the requirement to mark all callback functions with `GLFWCALL`. It also
|
||||||
requirement to mark all callback functions with `GLFWCALL`. It also simplifies
|
simplifies the creation of DLLs and DLL link libraries, as there's no need to
|
||||||
the creation of DLLs and DLL link libraries, as there's no need to explicitly
|
explicitly disable `@n` entry point suffixes.
|
||||||
disable `@n` entry point suffixes.
|
|
||||||
|
|
||||||
@par Old syntax
|
[stdcall]: https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx
|
||||||
@code
|
|
||||||
|
__Old syntax__
|
||||||
|
```c
|
||||||
void GLFWCALL callback_function(...);
|
void GLFWCALL callback_function(...);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
void callback_function(...);
|
void callback_function(...);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_window_handles Window handle parameters
|
### Window handle parameters {#moving_window_handles}
|
||||||
|
|
||||||
Because GLFW 3 supports multiple windows, window handle parameters have been
|
Because GLFW 3 supports multiple windows, window handle parameters have been
|
||||||
added to all window-related GLFW functions and callbacks. The handle of
|
added to all window-related GLFW functions and callbacks. The handle of
|
||||||
a newly created window is returned by @ref glfwCreateWindow (formerly
|
a newly created window is returned by @ref glfwCreateWindow (formerly
|
||||||
`glfwOpenWindow`). Window handles are pointers to the
|
`glfwOpenWindow`). Window handles are pointers to the
|
||||||
[opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWwindow.
|
[opaque][opaque-type] type @ref GLFWwindow.
|
||||||
|
|
||||||
@par Old syntax
|
[opaque-type]: https://en.wikipedia.org/wiki/Opaque_data_type
|
||||||
@code
|
|
||||||
|
__Old syntax__
|
||||||
|
```c
|
||||||
glfwSetWindowTitle("New Window Title");
|
glfwSetWindowTitle("New Window Title");
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
glfwSetWindowTitle(window, "New Window Title");
|
glfwSetWindowTitle(window, "New Window Title");
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_monitor Explicit monitor selection
|
### Explicit monitor selection {#moving_monitor}
|
||||||
|
|
||||||
GLFW 3 provides support for multiple monitors. To request a full screen mode window,
|
GLFW 3 provides support for multiple monitors. To request a full screen mode window,
|
||||||
instead of passing `GLFW_FULLSCREEN` you specify which monitor you wish the
|
instead of passing `GLFW_FULLSCREEN` you specify which monitor you wish the
|
||||||
window to use. The @ref glfwGetPrimaryMonitor function returns the monitor that
|
window to use. The @ref glfwGetPrimaryMonitor function returns the monitor that
|
||||||
GLFW 2 would have selected, but there are many other
|
GLFW 2 would have selected, but there are many other
|
||||||
[monitor functions](@ref monitor_guide). Monitor handles are pointers to the
|
[monitor functions](@ref monitor_guide). Monitor handles are pointers to the
|
||||||
[opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWmonitor.
|
[opaque][opaque-type] type @ref GLFWmonitor.
|
||||||
|
|
||||||
@par Old basic full screen
|
__Old basic full screen__
|
||||||
@code
|
```c
|
||||||
glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_FULLSCREEN);
|
glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_FULLSCREEN);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New basic full screen
|
__New basic full screen__
|
||||||
@code
|
```c
|
||||||
window = glfwCreateWindow(640, 480, "My Window", glfwGetPrimaryMonitor(), NULL);
|
window = glfwCreateWindow(640, 480, "My Window", glfwGetPrimaryMonitor(), NULL);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@note The framebuffer bit depth parameters of `glfwOpenWindow` have been turned
|
@note The framebuffer bit depth parameters of `glfwOpenWindow` have been turned
|
||||||
into [window hints](@ref window_hints), but as they have been given
|
into [window hints](@ref window_hints), but as they have been given
|
||||||
[sane defaults](@ref window_hints_values) you rarely need to set these hints.
|
[sane defaults](@ref window_hints_values) you rarely need to set these hints.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_autopoll Removal of automatic event polling
|
### Removal of automatic event polling {#moving_autopoll}
|
||||||
|
|
||||||
GLFW 3 does not automatically poll for events in @ref glfwSwapBuffers, meaning
|
GLFW 3 does not automatically poll for events in @ref glfwSwapBuffers, meaning
|
||||||
you need to call @ref glfwPollEvents or @ref glfwWaitEvents yourself. Unlike
|
you need to call @ref glfwPollEvents or @ref glfwWaitEvents yourself. Unlike
|
||||||
buffer swap, which acts on a single window, the event processing functions act
|
buffer swap, which acts on a single window, the event processing functions act
|
||||||
on all windows at once.
|
on all windows at once.
|
||||||
|
|
||||||
@par Old basic main loop
|
__Old basic main loop__
|
||||||
@code
|
```c
|
||||||
while (...)
|
while (...)
|
||||||
{
|
{
|
||||||
// Process input
|
// Process input
|
||||||
// Render output
|
// Render output
|
||||||
glfwSwapBuffers();
|
glfwSwapBuffers();
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New basic main loop
|
__New basic main loop__
|
||||||
@code
|
```c
|
||||||
while (...)
|
while (...)
|
||||||
{
|
{
|
||||||
// Process input
|
// Process input
|
||||||
@ -174,10 +178,10 @@ while (...)
|
|||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_context Explicit context management
|
### Explicit context management {#moving_context}
|
||||||
|
|
||||||
Each GLFW 3 window has its own OpenGL context and only you, the application
|
Each GLFW 3 window has its own OpenGL context and only you, the application
|
||||||
programmer, can know which context should be current on which thread at any
|
programmer, can know which context should be current on which thread at any
|
||||||
@ -187,7 +191,7 @@ This means that you need to call @ref glfwMakeContextCurrent after creating
|
|||||||
a window before you can call any OpenGL functions.
|
a window before you can call any OpenGL functions.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_hidpi Separation of window and framebuffer sizes
|
### Separation of window and framebuffer sizes {#moving_hidpi}
|
||||||
|
|
||||||
Window positions and sizes now use screen coordinates, which may not be the same
|
Window positions and sizes now use screen coordinates, which may not be the same
|
||||||
as pixels on machines with high-DPI monitors. This is important as OpenGL uses
|
as pixels on machines with high-DPI monitors. This is important as OpenGL uses
|
||||||
@ -197,20 +201,20 @@ been added. You can retrieve the size of the framebuffer of a window with @ref
|
|||||||
glfwGetFramebufferSize function. A framebuffer size callback has also been
|
glfwGetFramebufferSize function. A framebuffer size callback has also been
|
||||||
added, which can be set with @ref glfwSetFramebufferSizeCallback.
|
added, which can be set with @ref glfwSetFramebufferSizeCallback.
|
||||||
|
|
||||||
@par Old basic viewport setup
|
__Old basic viewport setup__
|
||||||
@code
|
```c
|
||||||
glfwGetWindowSize(&width, &height);
|
glfwGetWindowSize(&width, &height);
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New basic viewport setup
|
__New basic viewport setup__
|
||||||
@code
|
```c
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_window_close Window closing changes
|
### Window closing changes {#moving_window_close}
|
||||||
|
|
||||||
The `GLFW_OPENED` window parameter has been removed. As long as the window has
|
The `GLFW_OPENED` window parameter has been removed. As long as the window has
|
||||||
not been destroyed, whether through @ref glfwDestroyWindow or @ref
|
not been destroyed, whether through @ref glfwDestroyWindow or @ref
|
||||||
@ -221,48 +225,48 @@ GLFW 2, windows and contexts created with GLFW 3 will never be destroyed unless
|
|||||||
you choose them to be. Each window now has a close flag that is set to
|
you choose them to be. Each window now has a close flag that is set to
|
||||||
`GLFW_TRUE` when the user attempts to close that window. By default, nothing else
|
`GLFW_TRUE` when the user attempts to close that window. By default, nothing else
|
||||||
happens and the window stays visible. It is then up to you to either destroy
|
happens and the window stays visible. It is then up to you to either destroy
|
||||||
the window, take some other action or simply ignore the request.
|
the window, take some other action or ignore the request.
|
||||||
|
|
||||||
You can query the close flag at any time with @ref glfwWindowShouldClose and set
|
You can query the close flag at any time with @ref glfwWindowShouldClose and set
|
||||||
it at any time with @ref glfwSetWindowShouldClose.
|
it at any time with @ref glfwSetWindowShouldClose.
|
||||||
|
|
||||||
@par Old basic main loop
|
__Old basic main loop__
|
||||||
@code
|
```c
|
||||||
while (glfwGetWindowParam(GLFW_OPENED))
|
while (glfwGetWindowParam(GLFW_OPENED))
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New basic main loop
|
__New basic main loop__
|
||||||
@code
|
```c
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The close callback no longer returns a value. Instead, it is called after the
|
The close callback no longer returns a value. Instead, it is called after the
|
||||||
close flag has been set so it can override its value, if it chooses to, before
|
close flag has been set, so it can optionally override its value, before
|
||||||
event processing completes. You may however not call @ref glfwDestroyWindow
|
event processing completes. You may however not call @ref glfwDestroyWindow
|
||||||
from the close callback (or any other window related callback).
|
from the close callback (or any other window related callback).
|
||||||
|
|
||||||
@par Old syntax
|
__Old syntax__
|
||||||
@code
|
```c
|
||||||
int GLFWCALL window_close_callback(void);
|
int GLFWCALL window_close_callback(void);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
void window_close_callback(GLFWwindow* window);
|
void window_close_callback(GLFWwindow* window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@note GLFW never clears the close flag to `GLFW_FALSE`, meaning you can use it
|
@note GLFW never clears the close flag to `GLFW_FALSE`, meaning you can use it
|
||||||
for other reasons to close the window as well, for example the user choosing
|
for other reasons to close the window as well, for example the user choosing
|
||||||
Quit from an in-game menu.
|
Quit from an in-game menu.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_hints Persistent window hints
|
### Persistent window hints {#moving_hints}
|
||||||
|
|
||||||
The `glfwOpenWindowHint` function has been renamed to @ref glfwWindowHint.
|
The `glfwOpenWindowHint` function has been renamed to @ref glfwWindowHint.
|
||||||
|
|
||||||
@ -271,7 +275,7 @@ instead retain their values until modified by @ref glfwWindowHint or @ref
|
|||||||
glfwDefaultWindowHints, or until the library is terminated and re-initialized.
|
glfwDefaultWindowHints, or until the library is terminated and re-initialized.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_video_modes Video mode enumeration
|
### Video mode enumeration {#moving_video_modes}
|
||||||
|
|
||||||
Video mode enumeration is now per-monitor. The @ref glfwGetVideoModes function
|
Video mode enumeration is now per-monitor. The @ref glfwGetVideoModes function
|
||||||
now returns all available modes for a specific monitor instead of requiring you
|
now returns all available modes for a specific monitor instead of requiring you
|
||||||
@ -280,7 +284,7 @@ had poorly defined behavior, has been replaced by @ref glfwGetVideoMode, which
|
|||||||
returns the current mode of a monitor.
|
returns the current mode of a monitor.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_char_up Removal of character actions
|
### Removal of character actions {#moving_char_up}
|
||||||
|
|
||||||
The action parameter of the [character callback](@ref GLFWcharfun) has been
|
The action parameter of the [character callback](@ref GLFWcharfun) has been
|
||||||
removed. This was an artefact of the origin of GLFW, i.e. being developed in
|
removed. This was an artefact of the origin of GLFW, i.e. being developed in
|
||||||
@ -288,18 +292,18 @@ English by a Swede. However, many keyboard layouts require more than one key to
|
|||||||
produce characters with diacritical marks. Even the Swedish keyboard layout
|
produce characters with diacritical marks. Even the Swedish keyboard layout
|
||||||
requires this for uncommon cases like ü.
|
requires this for uncommon cases like ü.
|
||||||
|
|
||||||
@par Old syntax
|
__Old syntax__
|
||||||
@code
|
```c
|
||||||
void GLFWCALL character_callback(int character, int action);
|
void GLFWCALL character_callback(int character, int action);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
void character_callback(GLFWwindow* window, int character);
|
void character_callback(GLFWwindow* window, int character);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_cursorpos Cursor position changes
|
### Cursor position changes {#moving_cursorpos}
|
||||||
|
|
||||||
The `glfwGetMousePos` function has been renamed to @ref glfwGetCursorPos,
|
The `glfwGetMousePos` function has been renamed to @ref glfwGetCursorPos,
|
||||||
`glfwSetMousePos` to @ref glfwSetCursorPos and `glfwSetMousePosCallback` to @ref
|
`glfwSetMousePos` to @ref glfwSetCursorPos and `glfwSetMousePosCallback` to @ref
|
||||||
@ -315,7 +319,7 @@ glfwSetCursorPos (formerly `glfwSetMousePos`) when that window is active.
|
|||||||
Unless the window is active, the function fails silently.
|
Unless the window is active, the function fails silently.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_wheel Wheel position replaced by scroll offsets
|
### Wheel position replaced by scroll offsets {#moving_wheel}
|
||||||
|
|
||||||
The `glfwGetMouseWheel` function has been removed. Scrolling is the input of
|
The `glfwGetMouseWheel` function has been removed. Scrolling is the input of
|
||||||
offsets and has no absolute position. The mouse wheel callback has been
|
offsets and has no absolute position. The mouse wheel callback has been
|
||||||
@ -323,21 +327,21 @@ replaced by a [scroll callback](@ref GLFWscrollfun) that receives
|
|||||||
two-dimensional floating point scroll offsets. This allows you to receive
|
two-dimensional floating point scroll offsets. This allows you to receive
|
||||||
precise scroll data from for example modern touchpads.
|
precise scroll data from for example modern touchpads.
|
||||||
|
|
||||||
@par Old syntax
|
__Old syntax__
|
||||||
@code
|
```c
|
||||||
void GLFWCALL mouse_wheel_callback(int position);
|
void GLFWCALL mouse_wheel_callback(int position);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
|
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par Removed functions
|
__Removed functions__
|
||||||
`glfwGetMouseWheel`
|
> `glfwGetMouseWheel`
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_repeat Key repeat action
|
### Key repeat action {#moving_repeat}
|
||||||
|
|
||||||
The `GLFW_KEY_REPEAT` enable has been removed and key repeat is always enabled
|
The `GLFW_KEY_REPEAT` enable has been removed and key repeat is always enabled
|
||||||
for both keys and characters. A new key action, `GLFW_REPEAT`, has been added
|
for both keys and characters. A new key action, `GLFW_REPEAT`, has been added
|
||||||
@ -346,15 +350,15 @@ from a repeat. Note that @ref glfwGetKey still returns only `GLFW_PRESS` or
|
|||||||
`GLFW_RELEASE`.
|
`GLFW_RELEASE`.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_keys Physical key input
|
### Physical key input {#moving_keys}
|
||||||
|
|
||||||
GLFW 3 key tokens map to physical keys, unlike in GLFW 2 where they mapped to
|
GLFW 3 key tokens map to physical keys, unlike in GLFW 2 where they mapped to
|
||||||
the values generated by the current keyboard layout. The tokens are named
|
the values generated by the current keyboard layout. The tokens are named
|
||||||
according to the values they would have using the standard US layout, but this
|
according to the values they would have in the standard US layout, but this
|
||||||
is only a convenience, as most programmers are assumed to know that layout.
|
is only a convenience, as most programmers are assumed to know that layout.
|
||||||
This means that (for example) `GLFW_KEY_LEFT_BRACKET` is always a single key and
|
This means that (for example) `GLFW_KEY_LEFT_BRACKET` is always a single key and
|
||||||
is the same key in the same place regardless of what keyboard layouts the users
|
is the same key in the same place regardless of what keyboard layouts the users
|
||||||
of your program has.
|
of your program have.
|
||||||
|
|
||||||
The key input facility was never meant for text input, although using it that
|
The key input facility was never meant for text input, although using it that
|
||||||
way worked slightly better in GLFW 2. If you were using it to input text, you
|
way worked slightly better in GLFW 2. If you were using it to input text, you
|
||||||
@ -362,11 +366,11 @@ should be using the character callback instead, on both GLFW 2 and 3. This will
|
|||||||
give you the characters being input, as opposed to the keys being pressed.
|
give you the characters being input, as opposed to the keys being pressed.
|
||||||
|
|
||||||
GLFW 3 has key tokens for all keys on a standard 105 key keyboard, so instead of
|
GLFW 3 has key tokens for all keys on a standard 105 key keyboard, so instead of
|
||||||
having to remember whether to check for `'a'` or `'A'`, you now check for
|
having to remember whether to check for `a` or `A`, you now check for
|
||||||
`GLFW_KEY_A`.
|
@ref GLFW_KEY_A.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_joystick Joystick function changes
|
### Joystick function changes {#moving_joystick}
|
||||||
|
|
||||||
The `glfwGetJoystickPos` function has been renamed to @ref glfwGetJoystickAxes.
|
The `glfwGetJoystickPos` function has been renamed to @ref glfwGetJoystickAxes.
|
||||||
|
|
||||||
@ -376,18 +380,19 @@ function as well as axis and button counts returned by the @ref
|
|||||||
glfwGetJoystickAxes and @ref glfwGetJoystickButtons functions.
|
glfwGetJoystickAxes and @ref glfwGetJoystickButtons functions.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_mbcs Win32 MBCS support
|
### Win32 MBCS support {#moving_mbcs}
|
||||||
|
|
||||||
The Win32 port of GLFW 3 will not compile in
|
The Win32 port of GLFW 3 will not compile in [MBCS mode][MBCS]. However,
|
||||||
[MBCS mode](http://msdn.microsoft.com/en-us/library/5z097dxa.aspx).
|
because the use of the Unicode version of the Win32 API doesn't affect the
|
||||||
However, because the use of the Unicode version of the Win32 API doesn't affect
|
process as a whole, but only those windows created using it, it's perfectly
|
||||||
the process as a whole, but only those windows created using it, it's perfectly
|
|
||||||
possible to call MBCS functions from other parts of the same application.
|
possible to call MBCS functions from other parts of the same application.
|
||||||
Therefore, even if an application using GLFW has MBCS mode code, there's no need
|
Therefore, even if an application using GLFW has MBCS mode code, there's no need
|
||||||
for GLFW itself to support it.
|
for GLFW itself to support it.
|
||||||
|
|
||||||
|
[MBCS]: https://msdn.microsoft.com/en-us/library/5z097dxa.aspx
|
||||||
|
|
||||||
@subsection moving_windows Support for versions of Windows older than XP
|
|
||||||
|
### Support for versions of Windows older than XP {#moving_windows}
|
||||||
|
|
||||||
All explicit support for version of Windows older than XP has been removed.
|
All explicit support for version of Windows older than XP has been removed.
|
||||||
There is no code that actively prevents GLFW 3 from running on these earlier
|
There is no code that actively prevents GLFW 3 from running on these earlier
|
||||||
@ -407,7 +412,7 @@ runtime checking for a number of functions that are present only on modern
|
|||||||
version of Windows.
|
version of Windows.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_syskeys Capture of system-wide hotkeys
|
### Capture of system-wide hotkeys {#moving_syskeys}
|
||||||
|
|
||||||
The ability to disable and capture system-wide hotkeys like Alt+Tab has been
|
The ability to disable and capture system-wide hotkeys like Alt+Tab has been
|
||||||
removed. Modern applications, whether they're games, scientific visualisations
|
removed. Modern applications, whether they're games, scientific visualisations
|
||||||
@ -415,7 +420,7 @@ or something else, are nowadays expected to be good desktop citizens and allow
|
|||||||
these hotkeys to function even when running in full screen mode.
|
these hotkeys to function even when running in full screen mode.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_terminate Automatic termination
|
### Automatic termination {#moving_terminate}
|
||||||
|
|
||||||
GLFW 3 does not register @ref glfwTerminate with `atexit` at initialization,
|
GLFW 3 does not register @ref glfwTerminate with `atexit` at initialization,
|
||||||
because `exit` calls registered functions from the calling thread and while it
|
because `exit` calls registered functions from the calling thread and while it
|
||||||
@ -428,30 +433,41 @@ destroys all windows not already destroyed with @ref glfwDestroyWindow,
|
|||||||
invalidating any window handles you may still have.
|
invalidating any window handles you may still have.
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_glu GLU header inclusion
|
### GLU header inclusion {#moving_glu}
|
||||||
|
|
||||||
GLFW 3 does not by default include the GLU header and GLU itself has been
|
GLFW 3 does not by default include the GLU header and GLU itself has been
|
||||||
deprecated by [Khronos](https://en.wikipedia.org/wiki/Khronos_Group). __New
|
deprecated by [Khronos][]. __New projects should not use GLU__, but if you need
|
||||||
projects should not use GLU__, but if you need it for legacy code that
|
it for legacy code that has been moved to GLFW 3, you can request that the GLFW
|
||||||
has been moved to GLFW 3, you can request that the GLFW header includes it by
|
header includes it by defining @ref GLFW_INCLUDE_GLU before the inclusion of the
|
||||||
defining `GLFW_INCLUDE_GLU` before the inclusion of the GLFW header.
|
GLFW header.
|
||||||
|
|
||||||
@par Old syntax
|
[Khronos]: https://en.wikipedia.org/wiki/Khronos_Group
|
||||||
@code
|
|
||||||
|
__Old syntax__
|
||||||
|
```c
|
||||||
#include <GL/glfw.h>
|
#include <GL/glfw.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
@par New syntax
|
__New syntax__
|
||||||
@code
|
```c
|
||||||
#define GLFW_INCLUDE_GLU
|
#define GLFW_INCLUDE_GLU
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
There are many libraries that offer replacements for the functionality offered
|
||||||
|
by GLU. For the matrix helper functions, see math libraries like [GLM][] (for
|
||||||
|
C++), [linmath.h][] (for C) and others. For the tessellation functions, see for
|
||||||
|
example [libtess2][].
|
||||||
|
|
||||||
|
[GLM]: https://github.com/g-truc/glm
|
||||||
|
[linmath.h]: https://github.com/datenwolf/linmath.h
|
||||||
|
[libtess2]: https://github.com/memononen/libtess2
|
||||||
|
|
||||||
|
|
||||||
@section moving_tables Name change tables
|
## Name change tables {#moving_tables}
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_renamed_functions Renamed functions
|
### Renamed functions {#moving_renamed_functions}
|
||||||
|
|
||||||
| GLFW 2 | GLFW 3 | Notes |
|
| GLFW 2 | GLFW 3 | Notes |
|
||||||
| --------------------------- | ----------------------------- | ----- |
|
| --------------------------- | ----------------------------- | ----- |
|
||||||
@ -471,7 +487,7 @@ defining `GLFW_INCLUDE_GLU` before the inclusion of the GLFW header.
|
|||||||
| `glfwGetJoystickParam` | @ref glfwJoystickPresent | The axis and button counts are provided by @ref glfwGetJoystickAxes and @ref glfwGetJoystickButtons |
|
| `glfwGetJoystickParam` | @ref glfwJoystickPresent | The axis and button counts are provided by @ref glfwGetJoystickAxes and @ref glfwGetJoystickButtons |
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_renamed_types Renamed types
|
### Renamed types {#moving_renamed_types}
|
||||||
|
|
||||||
| GLFW 2 | GLFW 3 | Notes |
|
| GLFW 2 | GLFW 3 | Notes |
|
||||||
| ------------------- | --------------------- | |
|
| ------------------- | --------------------- | |
|
||||||
@ -479,7 +495,7 @@ defining `GLFW_INCLUDE_GLU` before the inclusion of the GLFW header.
|
|||||||
| `GLFWmouseposfun` | @ref GLFWcursorposfun | |
|
| `GLFWmouseposfun` | @ref GLFWcursorposfun | |
|
||||||
|
|
||||||
|
|
||||||
@subsection moving_renamed_tokens Renamed tokens
|
### Renamed tokens {#moving_renamed_tokens}
|
||||||
|
|
||||||
| GLFW 2 | GLFW 3 | Notes |
|
| GLFW 2 | GLFW 3 | Notes |
|
||||||
| --------------------------- | ---------------------------- | ----- |
|
| --------------------------- | ---------------------------- | ----- |
|
||||||
@ -503,4 +519,3 @@ defining `GLFW_INCLUDE_GLU` before the inclusion of the GLFW header.
|
|||||||
| `GLFW_KEY_RALT` | `GLFW_KEY_RIGHT_ALT` | |
|
| `GLFW_KEY_RALT` | `GLFW_KEY_RIGHT_ALT` | |
|
||||||
| `GLFW_KEY_RSUPER` | `GLFW_KEY_RIGHT_SUPER` | |
|
| `GLFW_KEY_RSUPER` | `GLFW_KEY_RIGHT_SUPER` | |
|
||||||
|
|
||||||
*/
|
|
376
docs/news.dox
376
docs/news.dox
@ -1,376 +0,0 @@
|
|||||||
/*!
|
|
||||||
|
|
||||||
@page news New features
|
|
||||||
|
|
||||||
@section news_32 New features in 3.2
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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
|
|
||||||
[GLFW_INCLUDE_VULKAN](@ref build_macros).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_maximize Window maxmimization support
|
|
||||||
|
|
||||||
GLFW now supports window maximization with @ref glfwMaximizeWindow and the
|
|
||||||
[GLFW_MAXIMIZED](@ref window_attribs_wnd) window hint and attribute.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_focus Window input focus control
|
|
||||||
|
|
||||||
GLFW now supports giving windows input focus with @ref glfwFocusWindow.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_sizelimits Window size limit support
|
|
||||||
|
|
||||||
GLFW now supports setting both absolute and relative window size limits with
|
|
||||||
@ref glfwSetWindowSizeLimits and @ref glfwSetWindowAspectRatio.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_waittimeout Wait for events with timeout
|
|
||||||
|
|
||||||
GLFW now supports waiting for events for a set amount of time with @ref
|
|
||||||
glfwWaitEventsTimeout.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_icon Window icon support
|
|
||||||
|
|
||||||
GLFW now supports setting the icon of windows with @ref glfwSetWindowIcon.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_timer Raw timer access
|
|
||||||
|
|
||||||
GLFW now supports raw timer values with @ref glfwGetTimerValue and @ref
|
|
||||||
glfwGetTimerFrequency.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_joystick Joystick connection callback
|
|
||||||
|
|
||||||
GLFW now supports notifying when a joystick has been connected or disconnected
|
|
||||||
with @ref glfwSetJoystickCallback.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_noapi Context-less windows
|
|
||||||
|
|
||||||
GLFW now supports creating windows without a OpenGL or OpenGL ES context with
|
|
||||||
[GLFW_NO_API](@ref window_hints_ctx).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_contextapi Run-time context creation API selection
|
|
||||||
|
|
||||||
GLFW now supports selecting the context creation API at run-time with the
|
|
||||||
[GLFW_CONTEXT_CREATION_API](@ref window_hints_ctx) window hint value.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_noerror Error-free context creation
|
|
||||||
|
|
||||||
GLFW now supports creating OpenGL and OpenGL ES contexts that do not emit errors
|
|
||||||
with the [GLFW_CONTEXT_NO_ERROR](@ref window_hints_ctx) window hint, provided
|
|
||||||
the machine supports the `GL_KHR_no_error` extension.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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 New features in 3.1
|
|
||||||
|
|
||||||
These are the release highlights. For a full list of changes see the
|
|
||||||
[version history](http://www.glfw.org/changelog.html).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_framesize Window frame size query
|
|
||||||
|
|
||||||
GLFW now supports querying the size, on each side, of the frame around the
|
|
||||||
client area of a window, with @ref glfwGetWindowFrameSize.
|
|
||||||
|
|
||||||
@see [Window size](@ref window_size)
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_autoiconify Simultaneous multi-monitor rendering
|
|
||||||
|
|
||||||
GLFW now supports disabling auto-iconification of full screen windows with
|
|
||||||
the [GLFW_AUTO_ICONIFY](@ref window_hints_wnd) window hint. This is intended
|
|
||||||
for people building multi-monitor installations, where you need windows to stay
|
|
||||||
in full screen despite losing input focus.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_floating Floating windows
|
|
||||||
|
|
||||||
GLFW now supports floating windows, also called topmost or always on top, for
|
|
||||||
easier debugging with the [GLFW_FLOATING](@ref window_hints_wnd) window hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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 window_hints_wnd) window hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_single Single buffered framebuffers
|
|
||||||
|
|
||||||
GLFW now supports the creation of single buffered windows, with the
|
|
||||||
[GLFW_DOUBLEBUFFER](@ref window_hints_fb) window hint.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_glext Macro for including extension header
|
|
||||||
|
|
||||||
GLFW now includes the extension header appropriate for the chosen OpenGL or
|
|
||||||
OpenGL ES header when [GLFW_INCLUDE_GLEXT](@ref build_macros) is defined. GLFW
|
|
||||||
does not provide these headers. They must be provided by your development
|
|
||||||
environment or your OpenGL or OpenGL ES SDK.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_release Context release behaviors
|
|
||||||
|
|
||||||
GLFW now supports controlling whether the pipeline is flushed when a context is
|
|
||||||
made non-current, with the
|
|
||||||
[GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint, provided the
|
|
||||||
machine supports the `GL_KHR_context_flush_control` extension.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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 New features in 3.0
|
|
||||||
|
|
||||||
These are the release highlights. For a full list of changes see the
|
|
||||||
[version history](http://www.glfw.org/changelog.html).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection 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](http://cmake.org/cmake/help/documentation.html).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_multiwnd Multi-window support
|
|
||||||
|
|
||||||
GLFW now supports the creation of multiple windows, each with their own OpenGL
|
|
||||||
or OpenGL ES context, and all window functions now take a window handle. Event
|
|
||||||
callbacks are now per-window and are provided with the handle of the window that
|
|
||||||
received the event. The @ref glfwMakeContextCurrent function has been added to
|
|
||||||
select which context is current on a given thread.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_multimon Multi-monitor support
|
|
||||||
|
|
||||||
GLFW now explicitly supports multiple monitors. They can be enumerated with
|
|
||||||
@ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref
|
|
||||||
glfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize,
|
|
||||||
and specified at window creation to make the newly created window full screen on
|
|
||||||
that specific monitor.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_unicode Unicode support
|
|
||||||
|
|
||||||
All string arguments to GLFW functions and all strings returned by GLFW now use
|
|
||||||
the UTF-8 encoding. This includes the window title, error string, clipboard
|
|
||||||
text, monitor and joystick names as well as the extension function arguments (as
|
|
||||||
ASCII is a subset of UTF-8).
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_clipboard Clipboard text I/O
|
|
||||||
|
|
||||||
GLFW now supports reading and writing plain text to and from the system
|
|
||||||
clipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString
|
|
||||||
functions.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_gamma Gamma ramp support
|
|
||||||
|
|
||||||
GLFW now supports setting and reading back the gamma ramp of monitors, with the
|
|
||||||
@ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions. There is also @ref
|
|
||||||
glfwSetGamma, which generates a ramp from a gamma value and then sets it.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_gles OpenGL ES support
|
|
||||||
|
|
||||||
GLFW now supports the creation of OpenGL ES contexts, by setting the
|
|
||||||
`GLFW_CLIENT_API` window hint to `GLFW_OPENGL_ES_API`, where creation of such
|
|
||||||
contexts are supported. Note that GLFW _does not implement_ OpenGL ES, so your
|
|
||||||
driver must provide support in a way usable by GLFW. Modern Nvidia and Intel
|
|
||||||
drivers support creation of OpenGL ES context using the GLX and WGL APIs, while
|
|
||||||
AMD provides an EGL implementation instead.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_egl (Experimental) EGL support
|
|
||||||
|
|
||||||
GLFW now has an experimental EGL context creation back end that can be selected
|
|
||||||
through CMake options.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_hidpi High-DPI support
|
|
||||||
|
|
||||||
GLFW now supports high-DPI monitors on both Windows and OS X, giving windows full
|
|
||||||
resolution framebuffers where other UI elements are scaled up. To achieve this,
|
|
||||||
@ref glfwGetFramebufferSize and @ref glfwSetFramebufferSizeCallback have been
|
|
||||||
added. These work with pixels, while the rest of the GLFW API works with screen
|
|
||||||
coordinates. This is important as OpenGL uses pixels, not screen coordinates.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_error Error callback
|
|
||||||
|
|
||||||
GLFW now has an error callback, which can provide your application with much
|
|
||||||
more detailed diagnostics than was previously possible. The callback is passed
|
|
||||||
an error code and a description string.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_wndptr Per-window user pointer
|
|
||||||
|
|
||||||
Each window now has a user-defined pointer, retrieved with @ref
|
|
||||||
glfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it
|
|
||||||
easier to integrate GLFW into C++ code.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_iconifyfun Window iconification callback
|
|
||||||
|
|
||||||
Each window now has a callback for iconification and restoration events,
|
|
||||||
which is set with @ref glfwSetWindowIconifyCallback.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_wndposfun Window position callback
|
|
||||||
|
|
||||||
Each window now has a callback for position events, which is set with @ref
|
|
||||||
glfwSetWindowPosCallback.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_wndpos Window position query
|
|
||||||
|
|
||||||
The position of a window can now be retrieved using @ref glfwGetWindowPos.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_focusfun Window focus callback
|
|
||||||
|
|
||||||
Each windows now has a callback for focus events, which is set with @ref
|
|
||||||
glfwSetWindowFocusCallback.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_enterleave Cursor enter/leave callback
|
|
||||||
|
|
||||||
Each window now has a callback for when the mouse cursor enters or leaves its
|
|
||||||
client area, which is set with @ref glfwSetCursorEnterCallback.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_wndtitle Initial window title
|
|
||||||
|
|
||||||
The title of a window is now specified at creation time, as one of the arguments
|
|
||||||
to @ref glfwCreateWindow.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_hidden Hidden windows
|
|
||||||
|
|
||||||
Windows can now be hidden with @ref glfwHideWindow, shown using @ref
|
|
||||||
glfwShowWindow and created initially hidden with the `GLFW_VISIBLE` window hint.
|
|
||||||
This allows for off-screen rendering in a way compatible with most drivers, as
|
|
||||||
well as moving a window to a specific position before showing it.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_undecorated Undecorated windows
|
|
||||||
|
|
||||||
Windowed mode windows can now be created without decorations, e.g. things like
|
|
||||||
a frame, a title bar, with the `GLFW_DECORATED` window hint. This allows for
|
|
||||||
the creation of things like splash screens.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_keymods Modifier key bit masks
|
|
||||||
|
|
||||||
[Modifier key bit mask](@ref mods) parameters have been added to the
|
|
||||||
[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_scancode Platform-specific scancodes
|
|
||||||
|
|
||||||
A scancode parameter has been added to the [key callback](@ref GLFWkeyfun). Keys
|
|
||||||
that don't have a [key token](@ref keys) still get passed on with the key
|
|
||||||
parameter set to `GLFW_KEY_UNKNOWN`. These scancodes will vary between machines
|
|
||||||
and are intended to be used for key bindings.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_jsname Joystick names
|
|
||||||
|
|
||||||
The name of a joystick can now be retrieved using @ref glfwGetJoystickName.
|
|
||||||
|
|
||||||
|
|
||||||
@subsection news_30_doxygen Doxygen documentation
|
|
||||||
|
|
||||||
You are reading it.
|
|
||||||
|
|
||||||
*/
|
|
40
docs/news.md
Normal file
40
docs/news.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Release notes for version 3.5 {#news}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
|
||||||
|
## New features {#features}
|
||||||
|
|
||||||
|
### Unlimited mouse buttons {#unlimited_mouse_buttons}
|
||||||
|
|
||||||
|
GLFW now has an input mode which allows an unlimited number of mouse buttons to
|
||||||
|
be reported by the mouse buttton callback, rather than just the associated
|
||||||
|
[mouse button tokens](@ref buttons). This allows using mouse buttons with
|
||||||
|
values over 8. For compatibility with older versions, the
|
||||||
|
@ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode needs to be set to make use of
|
||||||
|
this.
|
||||||
|
|
||||||
|
## Caveats {#caveats}
|
||||||
|
|
||||||
|
## Deprecations {#deprecations}
|
||||||
|
|
||||||
|
## Removals {#removals}
|
||||||
|
|
||||||
|
## New symbols {#new_symbols}
|
||||||
|
|
||||||
|
### New functions {#new_functions}
|
||||||
|
|
||||||
|
### New types {#new_types}
|
||||||
|
|
||||||
|
### New constants {#new_constants}
|
||||||
|
|
||||||
|
- @ref GLFW_UNLIMITED_MOUSE_BUTTONS
|
||||||
|
|
||||||
|
## Release notes for earlier versions {#news_archive}
|
||||||
|
|
||||||
|
- [Release notes for 3.4](https://www.glfw.org/docs/3.4/news.html)
|
||||||
|
- [Release notes for 3.3](https://www.glfw.org/docs/3.3/news.html)
|
||||||
|
- [Release notes for 3.2](https://www.glfw.org/docs/3.2/news.html)
|
||||||
|
- [Release notes for 3.1](https://www.glfw.org/docs/3.1/news.html)
|
||||||
|
- [Release notes for 3.0](https://www.glfw.org/docs/3.0/news.html)
|
||||||
|
|
@ -1,10 +1,8 @@
|
|||||||
/*!
|
# Getting started {#quick_guide}
|
||||||
|
|
||||||
@page quick_guide Getting started
|
[TOC]
|
||||||
|
|
||||||
@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.
|
||||||
@ -14,117 +12,114 @@ have used GLFW 2 in the past, read @ref moving_guide, as some functions
|
|||||||
behave differently in GLFW 3.
|
behave differently in GLFW 3.
|
||||||
|
|
||||||
|
|
||||||
@section quick_steps Step by step
|
## Step by step {#quick_steps}
|
||||||
|
|
||||||
@subsection quick_include Including the GLFW header
|
### Including the GLFW header {#quick_include}
|
||||||
|
|
||||||
In the source files of your application where you use OpenGL or GLFW, you need
|
In the source files of your application where you use GLFW, you need to include
|
||||||
to include the GLFW 3 header file.
|
its header file.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This defines all the constants, types and function prototypes of the GLFW API.
|
This header provides all the constants, types and function prototypes of the
|
||||||
It also includes the OpenGL header from your development environment and
|
GLFW API.
|
||||||
defines all the constants and types necessary for it to work on your platform
|
|
||||||
without including any platform-specific headers.
|
|
||||||
|
|
||||||
In other words:
|
By default it also includes the OpenGL header from your development environment.
|
||||||
|
On some platforms this header only supports older versions of OpenGL. The most
|
||||||
|
extreme case is Windows, where it typically only supports OpenGL 1.2.
|
||||||
|
|
||||||
- Do _not_ include the OpenGL header yourself, as GLFW does this for you in
|
Most programs will instead use an
|
||||||
a platform-independent way
|
[extension loader library](@ref context_glext_auto) and include its header.
|
||||||
- Do _not_ include `windows.h` or other platform-specific headers unless
|
This example uses files generated by [glad](https://gen.glad.sh/). The GLFW
|
||||||
you plan on using those APIs yourself
|
header can detect most such headers if they are included first and will then not
|
||||||
- If you _do_ need to include such headers, include them _before_ the GLFW
|
include the one from your development environment.
|
||||||
header and it will detect this
|
|
||||||
|
|
||||||
On some platforms supported by GLFW the OpenGL header and link library only
|
```c
|
||||||
expose older versions of OpenGL. The most extreme case is Windows, which only
|
#include <glad/gl.h>
|
||||||
exposes OpenGL 1.2. The easiest way to work around this is to use an
|
|
||||||
[extension loader library](@ref context_glext_auto).
|
|
||||||
|
|
||||||
If you are using such a library then you should include its header _before_ the
|
|
||||||
GLFW header. This lets it replace the OpenGL header included by GLFW without
|
|
||||||
conflicts. This example uses
|
|
||||||
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
|
||||||
libraries.
|
|
||||||
|
|
||||||
@code
|
|
||||||
#include <glad/glad.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
To make sure there will be no header conflicts, you can define @ref
|
||||||
|
GLFW_INCLUDE_NONE before the GLFW header to explicitly disable inclusion of the
|
||||||
|
development environment header. This also allows the two headers to be included
|
||||||
|
in any order.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <glad/gl.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_init_term Initializing and terminating GLFW
|
### Initializing and terminating GLFW {#quick_init_term}
|
||||||
|
|
||||||
Before you can use most GLFW functions, the library must be initialized. On
|
Before you can use most GLFW functions, the library must be initialized. On
|
||||||
successful initialization, `GLFW_TRUE` is returned. If an error occurred,
|
successful initialization, `GLFW_TRUE` is returned. If an error occurred,
|
||||||
`GLFW_FALSE` is returned.
|
`GLFW_FALSE` is returned.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
{
|
{
|
||||||
// Initialization failed
|
// Initialization failed
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Note that `GLFW_TRUE` and `GLFW_FALSE` are and will always be just one and zero.
|
Note that `GLFW_TRUE` and `GLFW_FALSE` are and will always be one and zero.
|
||||||
|
|
||||||
When you are done using GLFW, typically just before the application exits, you
|
When you are done using GLFW, typically just before the application exits, you
|
||||||
need to terminate GLFW.
|
need to terminate GLFW.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This destroys any remaining windows and releases any other resources allocated by
|
This destroys any remaining windows and releases any other resources allocated by
|
||||||
GLFW. After this call, you must initialize GLFW again before using any GLFW
|
GLFW. After this call, you must initialize GLFW again before using any GLFW
|
||||||
functions that require it.
|
functions that require it.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_capture_error Setting an error callback
|
### Setting an error callback {#quick_capture_error}
|
||||||
|
|
||||||
Most events are reported through callbacks, whether it's a key being pressed,
|
Most events are reported through callbacks, whether it's a key being pressed,
|
||||||
a GLFW window being moved, or an error occurring. Callbacks are simply
|
a GLFW window being moved, or an error occurring. Callbacks are C functions (or
|
||||||
C functions (or C++ static methods) that are called by GLFW with arguments
|
C++ static methods) that are called by GLFW with arguments describing the event.
|
||||||
describing the event.
|
|
||||||
|
|
||||||
In case a GLFW function fails, an error is reported to the GLFW error callback.
|
In case a GLFW function fails, an error is reported to the GLFW error callback.
|
||||||
You can receive these reports with an error callback. This function must have
|
You can receive these reports with an error callback. This function must have
|
||||||
the signature below. This simple error callback just prints the error
|
the signature below but may do anything permitted in other callbacks.
|
||||||
description to `stderr`.
|
|
||||||
|
|
||||||
@code
|
```c
|
||||||
void error_callback(int error, const char* description)
|
void error_callback(int error, const char* description)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error: %s\n", description);
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Callback functions must be set, so GLFW knows to call them. The function to set
|
Callback functions must be set, so GLFW knows to call them. The function to set
|
||||||
the error callback is one of the few GLFW functions that may be called before
|
the error callback is one of the few GLFW functions that may be called before
|
||||||
initialization, which lets you be notified of errors both during and after
|
initialization, which lets you be notified of errors both during and after
|
||||||
initialization.
|
initialization.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_create_window Creating a window and context
|
### Creating a window and context {#quick_create_window}
|
||||||
|
|
||||||
The window and its OpenGL context are created with a single call to @ref
|
The window and its OpenGL context are created with a single call to @ref
|
||||||
glfwCreateWindow, which returns a handle to the created combined window and
|
glfwCreateWindow, which returns a handle to the created combined window and
|
||||||
context object
|
context object
|
||||||
|
|
||||||
@code
|
```c
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
// Window or OpenGL context creation failed
|
// Window or OpenGL context creation failed
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This creates a 640 by 480 windowed mode window with an OpenGL context. If
|
This creates a 640 by 480 windowed mode window with an OpenGL context. If
|
||||||
window or OpenGL context creation fails, `NULL` will be returned. You should
|
window or OpenGL context creation fails, `NULL` will be returned. You should
|
||||||
@ -137,37 +132,38 @@ 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.
|
||||||
|
|
||||||
@code
|
You can select the OpenGL profile by setting the `GLFW_OPENGL_PROFILE` hint.
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
This program uses the core profile as that is the only profile macOS supports
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
for OpenGL 3.x and 4.x.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
// Window or context creation failed
|
// Window or context creation failed
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The window handle is passed to all window related functions and is provided to
|
|
||||||
along to all window related callbacks, so they can tell which window received
|
|
||||||
the event.
|
|
||||||
|
|
||||||
When a window and context is no longer needed, destroy it.
|
When a window and context is no longer needed, destroy it.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Once this function is called, no more events will be delivered for that window
|
Once this function is called, no more events will be delivered for that window
|
||||||
and its handle becomes invalid.
|
and its handle becomes invalid.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_context_current Making the OpenGL context current
|
### Making the OpenGL context current {#quick_context_current}
|
||||||
|
|
||||||
Before you can use the OpenGL API, you must have a current OpenGL context.
|
Before you can use the OpenGL API, you must have a current OpenGL context.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The context will remain current until you make another context current or until
|
The context will remain current until you make another context current or until
|
||||||
the window owning the current context is destroyed.
|
the window owning the current context is destroyed.
|
||||||
@ -176,14 +172,14 @@ If you are using an [extension loader library](@ref context_glext_auto) to
|
|||||||
access modern OpenGL then this is when to initialize it, as the loader needs
|
access modern OpenGL then this is when to initialize it, as the loader needs
|
||||||
a current context to load from. This example uses
|
a current context to load from. This example uses
|
||||||
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such
|
||||||
libraries.
|
libraries.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_window_close Checking the window close flag
|
### Checking the window close flag {#quick_window_close}
|
||||||
|
|
||||||
Each window has a flag indicating whether the window should be closed.
|
Each window has a flag indicating whether the window should be closed.
|
||||||
|
|
||||||
@ -193,12 +189,12 @@ Note that __the window isn't actually closed__, so you are expected to monitor
|
|||||||
this flag and either destroy the window or give some kind of feedback to the
|
this flag and either destroy the window or give some kind of feedback to the
|
||||||
user.
|
user.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
// Keep running
|
// Keep running
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
You can be notified when the user is attempting to close the window by setting
|
You can be notified when the user is attempting to close the window by setting
|
||||||
a close callback with @ref glfwSetWindowCloseCallback. The callback will be
|
a close callback with @ref glfwSetWindowCloseCallback. The callback will be
|
||||||
@ -209,66 +205,70 @@ useful if you want to interpret other kinds of input as closing the window, like
|
|||||||
for example pressing the _Escape_ key.
|
for example pressing the _Escape_ key.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_key_input Receiving input events
|
### Receiving input events {#quick_key_input}
|
||||||
|
|
||||||
Each window has a large number of callbacks that can be set to receive all the
|
Each window has a large number of callbacks that can be set to receive all the
|
||||||
various kinds of events. To receive key press and release events, create a key
|
various kinds of events. To receive key press and release events, create a key
|
||||||
callback function.
|
callback function.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
{
|
{
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The key callback, like other window related callbacks, are set per-window.
|
The key callback, like other window related callbacks, are set per-window.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
In order for event callbacks to be called when events occur, you need to process
|
In order for event callbacks to be called when events occur, you need to process
|
||||||
events as described below.
|
events as described below.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_render Rendering with OpenGL
|
### Rendering with OpenGL {#quick_render}
|
||||||
|
|
||||||
Once you have a current OpenGL context, you can use OpenGL normally. In this
|
Once you have a current OpenGL context, you can use OpenGL normally. In this
|
||||||
tutorial, a multi-colored rotating triangle will be rendered. The framebuffer
|
tutorial, a multicolored rotating triangle will be rendered. The framebuffer
|
||||||
size needs to be retrieved for `glViewport`.
|
size needs to be retrieved for `glViewport`.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
int width, height;
|
int width, height;
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
You can also set a framebuffer size callback using @ref
|
You can also set a framebuffer size callback using @ref
|
||||||
glfwSetFramebufferSizeCallback and be notified when the size changes.
|
glfwSetFramebufferSizeCallback and be notified when the size changes.
|
||||||
|
|
||||||
Actual rendering with OpenGL is outside the scope of this tutorial, but there
|
The details of how to render with OpenGL is outside the scope of this tutorial,
|
||||||
are [many](https://open.gl/) [excellent](http://learnopengl.com/)
|
but there are many excellent resources for learning modern OpenGL. Here are
|
||||||
[tutorial](http://openglbook.com/) [sites](http://ogldev.atspace.co.uk/) that
|
a few of them:
|
||||||
teach modern OpenGL. Some of them use GLFW to create the context and window
|
|
||||||
while others use GLUT or SDL, but remember that OpenGL itself always works the
|
- [Anton's OpenGL 4 Tutorials](https://antongerdelan.net/opengl/)
|
||||||
same.
|
- [Learn OpenGL](https://learnopengl.com/)
|
||||||
|
- [Open.GL](https://open.gl/)
|
||||||
|
|
||||||
|
These all happen to use GLFW, but OpenGL itself works the same whatever API you
|
||||||
|
use to create the window and context.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_timer Reading the timer
|
### Reading the timer {#quick_timer}
|
||||||
|
|
||||||
To create smooth animation, a time source is needed. GLFW provides a timer that
|
To create smooth animation, a time source is needed. GLFW provides a timer that
|
||||||
returns the number of seconds since initialization. The time source used is the
|
returns the number of seconds since initialization. The time source used is the
|
||||||
most accurate on each platform and generally has micro- or nanosecond
|
most accurate on each platform and generally has micro- or nanosecond
|
||||||
resolution.
|
resolution.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
double time = glfwGetTime();
|
double time = glfwGetTime();
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_swap_buffers Swapping buffers
|
### Swapping buffers {#quick_swap_buffers}
|
||||||
|
|
||||||
GLFW windows by default use double buffering. That means that each window has
|
GLFW windows by default use double buffering. That means that each window has
|
||||||
two rendering buffers; a front buffer and a back buffer. The front buffer is
|
two rendering buffers; a front buffer and a back buffer. The front buffer is
|
||||||
@ -277,9 +277,9 @@ the one being displayed and the back buffer the one you render to.
|
|||||||
When the entire frame has been rendered, the buffers need to be swapped with one
|
When the entire frame has been rendered, the buffers need to be swapped with one
|
||||||
another, so the back buffer becomes the front buffer and vice versa.
|
another, so the back buffer becomes the front buffer and vice versa.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The swap interval indicates how many frames to wait until swapping the buffers,
|
The swap interval indicates how many frames to wait until swapping the buffers,
|
||||||
commonly known as _vsync_. By default, the swap interval is zero, meaning
|
commonly known as _vsync_. By default, the swap interval is zero, meaning
|
||||||
@ -294,15 +294,15 @@ For these reasons, applications will typically want to set the swap interval to
|
|||||||
one. It can be set to higher values, but this is usually not recommended,
|
one. It can be set to higher values, but this is usually not recommended,
|
||||||
because of the input latency it leads to.
|
because of the input latency it leads to.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This function acts on the current context and will fail unless a context is
|
This function acts on the current context and will fail unless a context is
|
||||||
current.
|
current.
|
||||||
|
|
||||||
|
|
||||||
@subsection quick_process_events Processing events
|
### Processing events {#quick_process_events}
|
||||||
|
|
||||||
GLFW needs to communicate regularly with the window system both in order to
|
GLFW needs to communicate regularly with the window system both in order to
|
||||||
receive events and to show that the application hasn't locked up. Event
|
receive events and to show that the application hasn't locked up. Event
|
||||||
@ -311,11 +311,11 @@ done each frame after buffer swapping.
|
|||||||
|
|
||||||
There are two methods for processing pending events; polling and waiting. This
|
There are two methods for processing pending events; polling and waiting. This
|
||||||
example will use event polling, which processes only those events that have
|
example will use event polling, which processes only those events that have
|
||||||
already been received and then returns immediately.
|
already been received and then returns immediately.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This is the best choice when rendering continually, like most games do. If
|
This is the best choice when rendering continually, like most games do. If
|
||||||
instead you only need to update your rendering once you have received new input,
|
instead you only need to update your rendering once you have received new input,
|
||||||
@ -325,22 +325,24 @@ all received events. This saves a great deal of CPU cycles and is useful for,
|
|||||||
for example, many kinds of editing tools.
|
for example, many kinds of editing tools.
|
||||||
|
|
||||||
|
|
||||||
@section quick_example Putting it together
|
## Putting it together {#quick_example}
|
||||||
|
|
||||||
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 simple program.
|
keyboard input, it's possible to create a small 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 simple.c code
|
@snippet triangle-opengl.c code
|
||||||
|
|
||||||
The program above can be found in the
|
The program above can be found in the [source package][download] as
|
||||||
[source package](http://www.glfw.org/download.html) as `examples/simple.c`
|
`examples/triangle-opengl.c` and is compiled along with all other examples when
|
||||||
and is compiled along with all other examples when you build GLFW. If you
|
you build GLFW. If you built GLFW from the source package then you already have
|
||||||
built GLFW from the source package then already have this as `simple.exe` on
|
this as `triangle-opengl.exe` on Windows, `triangle-opengl` on Linux or
|
||||||
Windows, `simple` on Linux or `simple.app` on OS X.
|
`triangle-opengl.app` on macOS.
|
||||||
|
|
||||||
|
[download]: https://www.glfw.org/download.html
|
||||||
|
|
||||||
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
|
||||||
@ -361,4 +363,3 @@ environment you are using and is best explained by the documentation for that
|
|||||||
environment. To learn about the details that are specific to GLFW, see
|
environment. To learn about the details that are specific to GLFW, see
|
||||||
@ref build_guide.
|
@ref build_guide.
|
||||||
|
|
||||||
*/
|
|
157
docs/spaces.svg
157
docs/spaces.svg
@ -13,7 +13,7 @@
|
|||||||
height="327.98221"
|
height="327.98221"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.4 r9939"
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||||
sodipodi:docname="spaces.svg">
|
sodipodi:docname="spaces.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs4">
|
id="defs4">
|
||||||
@ -38,11 +38,11 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="2.5611424"
|
inkscape:zoom="1.8110012"
|
||||||
inkscape:cx="344.24359"
|
inkscape:cx="320.68941"
|
||||||
inkscape:cy="163.9911"
|
inkscape:cy="159.80509"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="svg2"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1021"
|
inkscape:window-height="1021"
|
||||||
@ -475,18 +475,18 @@
|
|||||||
inkscape:export-ydpi="109.89113" />
|
inkscape:export-ydpi="109.89113" />
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||||
x="21.213203"
|
x="21.213203"
|
||||||
y="340.20465"
|
y="340.20465"
|
||||||
id="text3803"
|
id="text3803"
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
inkscape:export-filename="/home/elmindreda/projects/glfw/glfw/docs/spaces.png"
|
inkscape:export-filename="/home/elmindreda/projects/glfw/glfw/docs/spaces.png"
|
||||||
inkscape:export-xdpi="109.89113"
|
inkscape:export-xdpi="109.89113"
|
||||||
inkscape:export-ydpi="109.89113"><tspan
|
inkscape:export-ydpi="109.89113"><tspan
|
||||||
sodipodi:role="line"
|
sodipodi:role="line"
|
||||||
id="tspan3805"
|
id="tspan3805"
|
||||||
x="21.213203"
|
x="21.213203"
|
||||||
y="340.20465" /></text>
|
y="340.20465"
|
||||||
|
style="font-size:12px;line-height:1.25;font-family:sans-serif"> </tspan></text>
|
||||||
<g
|
<g
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
id="text3807">
|
id="text3807">
|
||||||
@ -647,74 +647,6 @@
|
|||||||
style="font-size:10px"
|
style="font-size:10px"
|
||||||
id="path3239" />
|
id="path3239" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
|
||||||
id="text3826">
|
|
||||||
<path
|
|
||||||
d="m 172.22728,456.1171 0,1.04004 c -0.33204,-0.30924 -0.68686,-0.54036 -1.06445,-0.69336 -0.37436,-0.15299 -0.77312,-0.22949 -1.19629,-0.2295 -0.83334,10e-6 -1.47136,0.25554 -1.91407,0.76661 -0.44271,0.50781 -0.66406,1.24349 -0.66406,2.20703 0,0.96029 0.22135,1.69596 0.66406,2.20703 0.44271,0.50781 1.08073,0.76172 1.91407,0.76172 0.42317,0 0.82193,-0.0765 1.19629,-0.2295 0.37759,-0.15299 0.73241,-0.38411 1.06445,-0.69336 l 0,1.03028 c -0.34506,0.23437 -0.71127,0.41015 -1.09863,0.52734 -0.38412,0.11719 -0.79102,0.17578 -1.22071,0.17578 -1.10351,0 -1.97265,-0.33691 -2.60742,-1.01074 -0.63476,-0.67708 -0.95215,-1.59993 -0.95215,-2.76855 0,-1.17187 0.31739,-2.09472 0.95215,-2.76856 0.63477,-0.67707 1.50391,-1.01562 2.60742,-1.01562 0.4362,0 0.84635,0.0586 1.23047,0.17578 0.38737,0.11394 0.75032,0.28646 1.08887,0.51758"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3108" />
|
|
||||||
<path
|
|
||||||
d="m 173.72142,455.24796 0.89844,0 0,7.59765 -0.89844,0 0,-7.59765"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3110" />
|
|
||||||
<path
|
|
||||||
d="m 176.49486,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3112" />
|
|
||||||
<path
|
|
||||||
d="m 183.94603,459.88663 0,0.43945 -4.13086,0 c 0.0391,0.61849 0.22461,1.0905 0.55664,1.41602 0.33528,0.32226 0.80078,0.4834 1.39649,0.48339 0.34504,1e-5 0.6787,-0.0423 1.00097,-0.12695 0.32552,-0.0846 0.64778,-0.21159 0.9668,-0.38086 l 0,0.84961 c -0.32227,0.13672 -0.65268,0.24089 -0.99121,0.3125 -0.33855,0.0716 -0.68197,0.10742 -1.03028,0.10742 -0.87239,0 -1.56413,-0.2539 -2.07519,-0.76172 -0.50781,-0.50781 -0.76172,-1.19466 -0.76172,-2.06054 0,-0.89518 0.24088,-1.60482 0.72266,-2.12891 0.48502,-0.52734 1.13769,-0.79101 1.958,-0.79101 0.73568,0 1.31673,0.23763 1.74317,0.71289 0.42968,0.47201 0.64452,1.11491 0.64453,1.92871 m -0.89844,-0.26367 c -0.007,-0.49154 -0.14486,-0.88379 -0.41504,-1.17676 -0.26693,-0.29297 -0.62175,-0.43945 -1.06445,-0.43946 -0.5013,1e-5 -0.90332,0.14161 -1.20605,0.42481 -0.29949,0.28321 -0.47201,0.68197 -0.51758,1.19629 l 3.20312,-0.005"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3114" />
|
|
||||||
<path
|
|
||||||
d="m 189.96654,459.54483 0,3.30078 -0.89844,0 0,-3.27148 c 0,-0.51758 -0.10092,-0.90495 -0.30273,-1.16211 -0.20183,-0.25716 -0.50457,-0.38574 -0.90821,-0.38574 -0.48503,0 -0.86751,0.15462 -1.14746,0.46386 -0.27995,0.30925 -0.41992,0.7308 -0.41992,1.26465 l 0,3.09082 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.21484,-0.32877 0.46712,-0.57454 0.75684,-0.7373 0.29296,-0.16276 0.62988,-0.24414 1.01074,-0.24414 0.62825,0 1.10351,0.19531 1.42578,0.58593 0.32226,0.38738 0.48339,0.95867 0.4834,1.71387"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3116" />
|
|
||||||
<path
|
|
||||||
d="m 192.65697,455.82413 0,1.55273 1.85058,0 0,0.69824 -1.85058,0 0,2.96875 c 0,0.44597 0.0602,0.73243 0.18066,0.85938 0.1237,0.12695 0.37272,0.19043 0.74707,0.19043 l 0.92285,0 0,0.75195 -0.92285,0 c -0.69336,0 -1.17188,-0.12858 -1.43555,-0.38574 -0.26367,-0.26042 -0.3955,-0.73242 -0.3955,-1.41602 l 0,-2.96875 -0.65918,0 0,-0.69824 0.65918,0 0,-1.55273 0.90332,0"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3118" />
|
|
||||||
<path
|
|
||||||
d="m 201.36302,460.09659 c -0.72591,0 -1.22884,0.083 -1.50879,0.24902 -0.27995,0.16602 -0.41992,0.44922 -0.41992,0.84961 0,0.31901 0.10417,0.57292 0.3125,0.76172 0.21159,0.18555 0.49805,0.27832 0.85938,0.27832 0.49804,0 0.8968,-0.17578 1.19628,-0.52734 0.30274,-0.35482 0.4541,-0.8252 0.45411,-1.41114 l 0,-0.20019 -0.89356,0 m 1.79199,-0.3711 0,3.12012 -0.89843,0 0,-0.83008 c -0.20509,0.33204 -0.46062,0.5778 -0.76661,0.73731 -0.30599,0.15625 -0.68034,0.23437 -1.12304,0.23437 -0.5599,0 -1.00586,-0.15625 -1.33789,-0.46875 -0.32878,-0.31575 -0.49317,-0.7373 -0.49317,-1.26465 0,-0.61523 0.20508,-1.07909 0.61524,-1.3916 0.41341,-0.31249 1.02864,-0.46874 1.8457,-0.46875 l 1.25977,0 0,-0.0879 c -1e-5,-0.4134 -0.13673,-0.73242 -0.41016,-0.95703 -0.27019,-0.22786 -0.65104,-0.34179 -1.14258,-0.3418 -0.3125,1e-5 -0.61686,0.0374 -0.91308,0.11231 -0.29623,0.0749 -0.58106,0.18718 -0.8545,0.33691 l 0,-0.83007 c 0.32878,-0.12695 0.64779,-0.22135 0.95704,-0.28321 0.30924,-0.0651 0.61034,-0.0976 0.90332,-0.0976 0.79101,0 1.38183,0.20508 1.77246,0.61523 0.39062,0.41016 0.58593,1.03191 0.58593,1.86523"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3120" />
|
|
||||||
<path
|
|
||||||
d="m 208.17943,458.21671 c -0.10092,-0.0586 -0.21159,-0.10091 -0.33203,-0.12696 -0.11719,-0.0293 -0.2474,-0.0439 -0.39063,-0.0439 -0.50781,0 -0.89844,0.16602 -1.17187,0.49804 -0.27019,0.32878 -0.40528,0.80242 -0.40528,1.4209 l 0,2.88086 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.1888,-0.33203 0.43457,-0.57779 0.73731,-0.7373 0.30273,-0.16276 0.67057,-0.24414 1.10351,-0.24414 0.0618,0 0.13021,0.005 0.20508,0.0146 0.0749,0.007 0.15788,0.0179 0.24903,0.0342 l 0.005,0.92286"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3122" />
|
|
||||||
<path
|
|
||||||
d="m 213.59447,459.88663 0,0.43945 -4.13086,0 c 0.0391,0.61849 0.22461,1.0905 0.55664,1.41602 0.33528,0.32226 0.80078,0.4834 1.39648,0.48339 0.34505,1e-5 0.67871,-0.0423 1.00098,-0.12695 0.32552,-0.0846 0.64778,-0.21159 0.9668,-0.38086 l 0,0.84961 c -0.32227,0.13672 -0.65268,0.24089 -0.99121,0.3125 -0.33855,0.0716 -0.68197,0.10742 -1.03028,0.10742 -0.8724,0 -1.56413,-0.2539 -2.07519,-0.76172 -0.50782,-0.50781 -0.76172,-1.19466 -0.76172,-2.06054 0,-0.89518 0.24088,-1.60482 0.72265,-2.12891 0.48503,-0.52734 1.1377,-0.79101 1.95801,-0.79101 0.73567,0 1.31673,0.23763 1.74317,0.71289 0.42968,0.47201 0.64452,1.11491 0.64453,1.92871 m -0.89844,-0.26367 c -0.007,-0.49154 -0.14486,-0.88379 -0.41504,-1.17676 -0.26693,-0.29297 -0.62175,-0.43945 -1.06445,-0.43946 -0.50131,1e-5 -0.90333,0.14161 -1.20606,0.42481 -0.29948,0.28321 -0.472,0.68197 -0.51758,1.19629 l 3.20313,-0.005"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3124" />
|
|
||||||
<path
|
|
||||||
d="m 217.55443,460.09659 c -0.72592,0 -1.22885,0.083 -1.50879,0.24902 -0.27995,0.16602 -0.41992,0.44922 -0.41992,0.84961 0,0.31901 0.10416,0.57292 0.3125,0.76172 0.21158,0.18555 0.49804,0.27832 0.85937,0.27832 0.49805,0 0.89681,-0.17578 1.19629,-0.52734 0.30273,-0.35482 0.4541,-0.8252 0.4541,-1.41114 l 0,-0.20019 -0.89355,0 m 1.79199,-0.3711 0,3.12012 -0.89844,0 0,-0.83008 c -0.20508,0.33204 -0.46061,0.5778 -0.7666,0.73731 -0.30599,0.15625 -0.68034,0.23437 -1.12305,0.23437 -0.55989,0 -1.00586,-0.15625 -1.33789,-0.46875 -0.32877,-0.31575 -0.49316,-0.7373 -0.49316,-1.26465 0,-0.61523 0.20508,-1.07909 0.61523,-1.3916 0.41341,-0.31249 1.02865,-0.46874 1.84571,-0.46875 l 1.25976,0 0,-0.0879 c 0,-0.4134 -0.13672,-0.73242 -0.41015,-0.95703 -0.27019,-0.22786 -0.65105,-0.34179 -1.14258,-0.3418 -0.3125,1e-5 -0.61687,0.0374 -0.91309,0.11231 -0.29622,0.0749 -0.58105,0.18718 -0.85449,0.33691 l 0,-0.83007 c 0.32877,-0.12695 0.64779,-0.22135 0.95703,-0.28321 0.30924,-0.0651 0.61035,-0.0976 0.90332,-0.0976 0.79101,0 1.38183,0.20508 1.77246,0.61523 0.39062,0.41016 0.58594,1.03191 0.58594,1.86523"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3126" />
|
|
||||||
<path
|
|
||||||
d="m 226.50462,458.00674 c -0.48177,1e-5 -0.86263,0.18881 -1.14257,0.56641 -0.27995,0.37435 -0.41993,0.88868 -0.41993,1.54297 0,0.6543 0.13835,1.17025 0.41504,1.54785 0.27995,0.37435 0.66243,0.56153 1.14746,0.56152 0.47852,1e-5 0.85775,-0.1888 1.1377,-0.5664 0.27994,-0.3776 0.41992,-0.89193 0.41992,-1.54297 0,-0.64778 -0.13998,-1.16048 -0.41992,-1.53809 -0.27995,-0.38085 -0.65918,-0.57128 -1.1377,-0.57129 m 0,-0.76171 c 0.78125,0 1.39486,0.25391 1.84082,0.76171 0.44596,0.50782 0.66894,1.21095 0.66895,2.10938 -1e-5,0.89518 -0.22299,1.59831 -0.66895,2.10937 -0.44596,0.50782 -1.05957,0.76172 -1.84082,0.76172 -0.7845,0 -1.39974,-0.2539 -1.8457,-0.76172 -0.44271,-0.51106 -0.66406,-1.21419 -0.66406,-2.10937 0,-0.89843 0.22135,-1.60156 0.66406,-2.10938 0.44596,-0.5078 1.0612,-0.76171 1.8457,-0.76171"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3128" />
|
|
||||||
<path
|
|
||||||
d="m 233.66771,458.21671 c -0.10092,-0.0586 -0.21159,-0.10091 -0.33203,-0.12696 -0.11719,-0.0293 -0.2474,-0.0439 -0.39063,-0.0439 -0.50781,0 -0.89844,0.16602 -1.17187,0.49804 -0.27019,0.32878 -0.40528,0.80242 -0.40528,1.4209 l 0,2.88086 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.1888,-0.33203 0.43457,-0.57779 0.73731,-0.7373 0.30273,-0.16276 0.67057,-0.24414 1.10351,-0.24414 0.0618,0 0.13021,0.005 0.20508,0.0146 0.0749,0.007 0.15788,0.0179 0.24903,0.0342 l 0.005,0.92286"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3130" />
|
|
||||||
<path
|
|
||||||
d="m 234.61986,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3132" />
|
|
||||||
<path
|
|
||||||
d="m 240.99193,460.04776 c -1e-5,-0.65104 -0.1351,-1.15559 -0.40528,-1.51367 -0.26693,-0.35807 -0.6429,-0.53711 -1.12793,-0.53711 -0.48177,0 -0.85774,0.17904 -1.12792,0.53711 -0.26693,0.35808 -0.4004,0.86263 -0.4004,1.51367 0,0.64779 0.13347,1.15072 0.4004,1.50879 0.27018,0.35807 0.64615,0.53711 1.12792,0.53711 0.48503,0 0.861,-0.17904 1.12793,-0.53711 0.27018,-0.35807 0.40527,-0.861 0.40528,-1.50879 m 0.89844,2.11914 c -1e-5,0.93099 -0.20672,1.62272 -0.62012,2.0752 -0.41342,0.45572 -1.04655,0.68359 -1.89942,0.68359 -0.31575,0 -0.6136,-0.0244 -0.89355,-0.0732 -0.27995,-0.0456 -0.55176,-0.11719 -0.81543,-0.21485 l 0,-0.87402 c 0.26367,0.14323 0.52409,0.24902 0.78125,0.31738 0.25716,0.0684 0.5192,0.10254 0.78613,0.10254 0.58919,0 1.03027,-0.15462 1.32324,-0.46386 0.29297,-0.306 0.43945,-0.76986 0.43946,-1.39161 l 0,-0.44433 c -0.18555,0.32226 -0.42318,0.56315 -0.71289,0.72265 -0.28972,0.15951 -0.6364,0.23926 -1.04004,0.23926 -0.67058,0 -1.21094,-0.25553 -1.6211,-0.7666 -0.41015,-0.51107 -0.61523,-1.18815 -0.61523,-2.03125 0,-0.84635 0.20508,-1.52506 0.61523,-2.03613 0.41016,-0.51107 0.95052,-0.7666 1.6211,-0.7666 0.40364,0 0.75032,0.0797 1.04004,0.23925 0.28971,0.15951 0.52734,0.4004 0.71289,0.72266 l 0,-0.83008 0.89844,0 0,4.79004"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3134" />
|
|
||||||
<path
|
|
||||||
d="m 243.74095,457.37686 0.89844,0 0,5.46875 -0.89844,0 0,-5.46875 m 0,-2.1289 0.89844,0 0,1.13769 -0.89844,0 0,-1.13769"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3136" />
|
|
||||||
<path
|
|
||||||
d="m 251.06029,459.54483 0,3.30078 -0.89844,0 0,-3.27148 c 0,-0.51758 -0.10092,-0.90495 -0.30273,-1.16211 -0.20183,-0.25716 -0.50457,-0.38574 -0.90821,-0.38574 -0.48503,0 -0.86751,0.15462 -1.14746,0.46386 -0.27995,0.30925 -0.41992,0.7308 -0.41992,1.26465 l 0,3.09082 -0.90332,0 0,-5.46875 0.90332,0 0,0.84961 c 0.21484,-0.32877 0.46712,-0.57454 0.75684,-0.7373 0.29296,-0.16276 0.62988,-0.24414 1.01074,-0.24414 0.62825,0 1.10351,0.19531 1.42578,0.58593 0.32226,0.38738 0.48339,0.95867 0.4834,1.71387"
|
|
||||||
style="font-size:10px"
|
|
||||||
id="path3138" />
|
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
id="text3017">
|
id="text3017">
|
||||||
@ -868,5 +800,78 @@
|
|||||||
style="font-size:5px"
|
style="font-size:5px"
|
||||||
id="path3161" />
|
id="path3161" />
|
||||||
</g>
|
</g>
|
||||||
|
<g
|
||||||
|
aria-label="Content area origin"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||||
|
id="text4089">
|
||||||
|
<path
|
||||||
|
d="m 172.21587,456.09125 v 1.04004 q -0.49805,-0.46387 -1.06446,-0.69336 -0.56152,-0.22949 -1.19629,-0.22949 -1.25,0 -1.91406,0.7666 -0.66406,0.76172 -0.66406,2.20703 0,1.44043 0.66406,2.20703 0.66406,0.76172 1.91406,0.76172 0.63477,0 1.19629,-0.22949 0.56641,-0.2295 1.06446,-0.69336 v 1.03027 q -0.51758,0.35156 -1.09864,0.52734 -0.57617,0.17578 -1.2207,0.17578 -1.65527,0 -2.60742,-1.01074 -0.95215,-1.01562 -0.95215,-2.76855 0,-1.75781 0.95215,-2.76856 0.95215,-1.01562 2.60742,-1.01562 0.6543,0 1.23047,0.17578 0.58105,0.1709 1.08887,0.51758 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4091" />
|
||||||
|
<path
|
||||||
|
d="m 175.82915,457.9809 q -0.72266,0 -1.14258,0.5664 -0.41992,0.56153 -0.41992,1.54297 0,0.98145 0.41504,1.54785 0.41992,0.56153 1.14746,0.56153 0.71777,0 1.13769,-0.56641 0.41992,-0.56641 0.41992,-1.54297 0,-0.97168 -0.41992,-1.53808 -0.41992,-0.57129 -1.13769,-0.57129 z m 0,-0.76172 q 1.17187,0 1.84082,0.76172 0.66894,0.76171 0.66894,2.10937 0,1.34277 -0.66894,2.10938 -0.66895,0.76171 -1.84082,0.76171 -1.17676,0 -1.84571,-0.76171 -0.66406,-0.76661 -0.66406,-2.10938 0,-1.34766 0.66406,-2.10937 0.66895,-0.76172 1.84571,-0.76172 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4093" />
|
||||||
|
<path
|
||||||
|
d="m 184.36919,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30274,-1.16211 -0.30273,-0.38574 -0.9082,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32226,-0.49316 0.75683,-0.7373 0.43946,-0.24414 1.01075,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4095" />
|
||||||
|
<path
|
||||||
|
d="m 187.05962,455.79828 v 1.55273 h 1.85058 v 0.69825 h -1.85058 v 2.96875 q 0,0.66894 0.18066,0.85937 0.18555,0.19043 0.74707,0.19043 h 0.92285 v 0.75195 h -0.92285 q -1.04004,0 -1.43555,-0.38574 -0.3955,-0.39062 -0.3955,-1.41601 v -2.96875 h -0.65918 v -0.69825 h 0.65918 v -1.55273 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4097" />
|
||||||
|
<path
|
||||||
|
d="m 194.77446,459.86078 v 0.43945 h -4.13086 q 0.0586,0.92774 0.55664,1.41602 0.50293,0.4834 1.39649,0.4834 0.51757,0 1.00097,-0.12696 0.48828,-0.12695 0.9668,-0.38086 v 0.84961 q -0.4834,0.20508 -0.99121,0.3125 -0.50781,0.10742 -1.03028,0.10742 -1.30859,0 -2.07519,-0.76171 -0.76172,-0.76172 -0.76172,-2.06055 0,-1.34277 0.72266,-2.12891 0.72754,-0.79101 1.958,-0.79101 1.10352,0 1.74317,0.71289 0.64453,0.70801 0.64453,1.92871 z m -0.89844,-0.26367 q -0.01,-0.73731 -0.41504,-1.17676 -0.40039,-0.43945 -1.06445,-0.43945 -0.75195,0 -1.20605,0.4248 -0.44922,0.42481 -0.51758,1.19629 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4099" />
|
||||||
|
<path
|
||||||
|
d="m 200.79497,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30273,-1.16211 -0.30274,-0.38574 -0.90821,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32227,-0.49316 0.75684,-0.7373 0.43945,-0.24414 1.01074,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4101" />
|
||||||
|
<path
|
||||||
|
d="m 203.4854,455.79828 v 1.55273 h 1.85058 v 0.69825 h -1.85058 v 2.96875 q 0,0.66894 0.18066,0.85937 0.18555,0.19043 0.74707,0.19043 h 0.92285 v 0.75195 h -0.92285 q -1.04004,0 -1.43555,-0.38574 -0.3955,-0.39062 -0.3955,-1.41601 v -2.96875 h -0.65918 v -0.69825 h 0.65918 v -1.55273 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4103" />
|
||||||
|
<path
|
||||||
|
d="m 212.19145,460.07074 q -1.08887,0 -1.50879,0.24902 -0.41992,0.24903 -0.41992,0.84961 0,0.47852 0.3125,0.76172 0.31738,0.27832 0.85938,0.27832 0.74707,0 1.19629,-0.52734 0.4541,-0.53223 0.4541,-1.41113 v -0.2002 z m 1.79199,-0.37109 v 3.12011 h -0.89843 v -0.83007 q -0.30762,0.49804 -0.7666,0.7373 -0.45899,0.23437 -1.12305,0.23437 -0.83985,0 -1.33789,-0.46875 -0.49317,-0.47363 -0.49317,-1.26464 0,-0.92286 0.61524,-1.39161 0.62012,-0.46875 1.8457,-0.46875 h 1.25977 v -0.0879 q 0,-0.62011 -0.41016,-0.95703 -0.40527,-0.34179 -1.14258,-0.34179 -0.46875,0 -0.91308,0.1123 -0.44434,0.11231 -0.8545,0.33691 v -0.83007 q 0.49317,-0.19043 0.95704,-0.28321 0.46386,-0.0976 0.90332,-0.0976 1.18652,0 1.77246,0.61523 0.58593,0.61524 0.58593,1.86524 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4105" />
|
||||||
|
<path
|
||||||
|
d="m 219.00786,458.19086 q -0.15137,-0.0879 -0.33203,-0.12696 -0.17578,-0.0439 -0.39063,-0.0439 -0.76172,0 -1.17187,0.49805 -0.40528,0.49316 -0.40528,1.42089 v 2.88086 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.28321,-0.49804 0.73731,-0.7373 0.4541,-0.24414 1.10351,-0.24414 0.0928,0 0.20508,0.0147 0.11231,0.01 0.24903,0.0342 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4107" />
|
||||||
|
<path
|
||||||
|
d="m 224.4229,459.86078 v 0.43945 h -4.13086 q 0.0586,0.92774 0.55664,1.41602 0.50293,0.4834 1.39648,0.4834 0.51758,0 1.00098,-0.12696 0.48828,-0.12695 0.9668,-0.38086 v 0.84961 q -0.4834,0.20508 -0.99121,0.3125 -0.50782,0.10742 -1.03028,0.10742 -1.30859,0 -2.07519,-0.76171 -0.76172,-0.76172 -0.76172,-2.06055 0,-1.34277 0.72265,-2.12891 0.72754,-0.79101 1.95801,-0.79101 1.10352,0 1.74317,0.71289 0.64453,0.70801 0.64453,1.92871 z m -0.89844,-0.26367 q -0.01,-0.73731 -0.41504,-1.17676 -0.40039,-0.43945 -1.06445,-0.43945 -0.75196,0 -1.20606,0.4248 -0.44922,0.42481 -0.51758,1.19629 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4109" />
|
||||||
|
<path
|
||||||
|
d="m 228.38286,460.07074 q -1.08887,0 -1.50879,0.24902 -0.41992,0.24903 -0.41992,0.84961 0,0.47852 0.3125,0.76172 0.31738,0.27832 0.85937,0.27832 0.74707,0 1.19629,-0.52734 0.4541,-0.53223 0.4541,-1.41113 v -0.2002 z m 1.79199,-0.37109 v 3.12011 h -0.89844 v -0.83007 q -0.30761,0.49804 -0.7666,0.7373 -0.45898,0.23437 -1.12305,0.23437 -0.83984,0 -1.33789,-0.46875 -0.49316,-0.47363 -0.49316,-1.26464 0,-0.92286 0.61523,-1.39161 0.62012,-0.46875 1.84571,-0.46875 h 1.25976 v -0.0879 q 0,-0.62011 -0.41015,-0.95703 -0.40528,-0.34179 -1.14258,-0.34179 -0.46875,0 -0.91309,0.1123 -0.44433,0.11231 -0.85449,0.33691 v -0.83007 q 0.49316,-0.19043 0.95703,-0.28321 0.46387,-0.0976 0.90332,-0.0976 1.18653,0 1.77246,0.61523 0.58594,0.61524 0.58594,1.86524 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4111" />
|
||||||
|
<path
|
||||||
|
d="m 237.33305,457.9809 q -0.72265,0 -1.14257,0.5664 -0.41993,0.56153 -0.41993,1.54297 0,0.98145 0.41504,1.54785 0.41992,0.56153 1.14746,0.56153 0.71778,0 1.1377,-0.56641 0.41992,-0.56641 0.41992,-1.54297 0,-0.97168 -0.41992,-1.53808 -0.41992,-0.57129 -1.1377,-0.57129 z m 0,-0.76172 q 1.17188,0 1.84082,0.76172 0.66895,0.76171 0.66895,2.10937 0,1.34277 -0.66895,2.10938 -0.66894,0.76171 -1.84082,0.76171 -1.17675,0 -1.8457,-0.76171 -0.66406,-0.76661 -0.66406,-2.10938 0,-1.34766 0.66406,-2.10937 0.66895,-0.76172 1.8457,-0.76172 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4113" />
|
||||||
|
<path
|
||||||
|
d="m 244.49614,458.19086 q -0.15137,-0.0879 -0.33203,-0.12696 -0.17578,-0.0439 -0.39063,-0.0439 -0.76172,0 -1.17187,0.49805 -0.40528,0.49316 -0.40528,1.42089 v 2.88086 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.28321,-0.49804 0.73731,-0.7373 0.4541,-0.24414 1.10352,-0.24414 0.0928,0 0.20507,0.0147 0.11231,0.01 0.24903,0.0342 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4115" />
|
||||||
|
<path
|
||||||
|
d="m 245.44829,457.35101 h 0.89844 v 5.46875 h -0.89844 z m 0,-2.1289 h 0.89844 v 1.13769 h -0.89844 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4117" />
|
||||||
|
<path
|
||||||
|
d="m 251.82036,460.02191 q 0,-0.97656 -0.40528,-1.51367 -0.40039,-0.53711 -1.12792,-0.53711 -0.72266,0 -1.12793,0.53711 -0.4004,0.53711 -0.4004,1.51367 0,0.97168 0.4004,1.50879 0.40527,0.53711 1.12793,0.53711 0.72753,0 1.12792,-0.53711 0.40528,-0.53711 0.40528,-1.50879 z m 0.89844,2.11914 q 0,1.39649 -0.62012,2.0752 -0.62012,0.68359 -1.89942,0.68359 -0.47363,0 -0.89355,-0.0732 -0.41992,-0.0684 -0.81543,-0.21484 v -0.87403 q 0.39551,0.21485 0.78125,0.31738 0.38574,0.10254 0.78613,0.10254 0.88379,0 1.32325,-0.46386 0.43945,-0.45899 0.43945,-1.3916 v -0.44434 q -0.27832,0.4834 -0.71289,0.72266 -0.43457,0.23925 -1.04004,0.23925 -1.00586,0 -1.6211,-0.7666 -0.61523,-0.7666 -0.61523,-2.03125 0,-1.26953 0.61523,-2.03613 0.61524,-0.7666 1.6211,-0.7666 0.60547,0 1.04004,0.23926 0.43457,0.23925 0.71289,0.72265 v -0.83008 h 0.89844 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4119" />
|
||||||
|
<path
|
||||||
|
d="m 254.56938,457.35101 h 0.89844 v 5.46875 h -0.89844 z m 0,-2.1289 h 0.89844 v 1.13769 h -0.89844 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4121" />
|
||||||
|
<path
|
||||||
|
d="m 261.88872,459.51898 v 3.30078 h -0.89844 v -3.27148 q 0,-0.77637 -0.30273,-1.16211 -0.30274,-0.38574 -0.90821,-0.38574 -0.72754,0 -1.14746,0.46386 -0.41992,0.46387 -0.41992,1.26465 v 3.09082 h -0.90332 v -5.46875 h 0.90332 v 0.84961 q 0.32227,-0.49316 0.75684,-0.7373 0.43945,-0.24414 1.01074,-0.24414 0.94238,0 1.42578,0.58593 0.4834,0.58106 0.4834,1.71387 z"
|
||||||
|
style="font-size:10px"
|
||||||
|
id="path4123" />
|
||||||
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 108 KiB |
@ -1,24 +1,23 @@
|
|||||||
/*!
|
# Vulkan guide {#vulkan_guide}
|
||||||
|
|
||||||
@page vulkan_guide Vulkan guide
|
[TOC]
|
||||||
|
|
||||||
@tableofcontents
|
|
||||||
|
|
||||||
This guide is intended to fill the gaps between the [Vulkan
|
This guide is intended to fill the gaps between the official [Vulkan
|
||||||
documentation](https://www.khronos.org/vulkan/) and the rest of the GLFW
|
resources](https://www.khronos.org/vulkan/) and the rest of the GLFW
|
||||||
documentation and is not a replacement for either. It assumes some familiarity
|
documentation and is not a replacement for either. It assumes some familiarity
|
||||||
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to
|
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to
|
||||||
the Vulkan documentation to explain the details of Vulkan functions.
|
the Vulkan documentation to explain the details of Vulkan functions.
|
||||||
|
|
||||||
To develop for Vulkan you should install an SDK for your platform, for example
|
To develop for Vulkan you should download the [LunarG Vulkan
|
||||||
the [LunarG Vulkan SDK](https://vulkan.lunarg.com/). Apart from the headers and
|
SDK](https://vulkan.lunarg.com/) for your platform. Apart from headers and link
|
||||||
libraries, it also provides the validation layers necessary for development.
|
libraries, they also provide the validation layers necessary for development.
|
||||||
|
|
||||||
The GLFW library does not need the Vulkan SDK to enable support for Vulkan.
|
The [Vulkan Tutorial](https://vulkan-tutorial.com/) has more information on how
|
||||||
However, any Vulkan-specific test and example programs are built only if the
|
to use GLFW and Vulkan. The [Khronos Vulkan
|
||||||
CMake files find a Vulkan SDK.
|
Samples](https://github.com/KhronosGroup/Vulkan-Samples) also use GLFW, although
|
||||||
|
with a small framework in between.
|
||||||
|
|
||||||
For details on a specific function in this category, see the @ref vulkan. There
|
For details on a specific Vulkan support function, see the @ref vulkan. There
|
||||||
are also guides for the other areas of the GLFW API.
|
are also guides for the other areas of the GLFW API.
|
||||||
|
|
||||||
- @ref intro_guide
|
- @ref intro_guide
|
||||||
@ -28,73 +27,103 @@ are also guides for the other areas of the GLFW API.
|
|||||||
- @ref input_guide
|
- @ref input_guide
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_include Including the Vulkan and GLFW header files
|
## Finding the Vulkan loader {#vulkan_loader}
|
||||||
|
|
||||||
To include the Vulkan header, define [GLFW_INCLUDE_VULKAN](@ref build_macros)
|
GLFW itself does not ever need to be linked against the Vulkan loader.
|
||||||
before including the GLFW header.
|
|
||||||
|
|
||||||
@code
|
By default, GLFW will load the Vulkan loader dynamically at runtime via its standard name:
|
||||||
|
`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other Unix-like systems and
|
||||||
|
`libvulkan.1.dylib` on macOS.
|
||||||
|
|
||||||
|
@macos GLFW will also look up and search the `Frameworks` subdirectory of your
|
||||||
|
application bundle.
|
||||||
|
|
||||||
|
If your code is using a Vulkan loader with a different name or in a non-standard location
|
||||||
|
you will need to direct GLFW to it. Pass your version of `vkGetInstanceProcAddr` to @ref
|
||||||
|
glfwInitVulkanLoader before initializing GLFW and it will use that function for all Vulkan
|
||||||
|
entry point retrieval. This prevents GLFW from dynamically loading the Vulkan loader.
|
||||||
|
|
||||||
|
```c
|
||||||
|
glfwInitVulkanLoader(vkGetInstanceProcAddr);
|
||||||
|
```
|
||||||
|
|
||||||
|
@macos To make your application be redistributable you will need to set up the application
|
||||||
|
bundle according to the LunarG SDK documentation. This is explained in more detail in the
|
||||||
|
[SDK documentation for macOS](https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html).
|
||||||
|
|
||||||
|
|
||||||
|
## Including the Vulkan header file {#vulkan_include}
|
||||||
|
|
||||||
|
To have GLFW include the Vulkan header, define @ref GLFW_INCLUDE_VULKAN before including
|
||||||
|
the GLFW header.
|
||||||
|
|
||||||
|
```c
|
||||||
#define GLFW_INCLUDE_VULKAN
|
#define GLFW_INCLUDE_VULKAN
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
If you instead want to include the Vulkan header from a custom location or use
|
If you instead want to include the Vulkan header from a custom location or use
|
||||||
your own custom Vulkan header then do this before the GLFW header.
|
your own custom Vulkan header then do this before the GLFW header.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
#include <path/to/vulkan.h>
|
#include <path/to/vulkan.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Unless a Vulkan header is included, either by the GLFW header or above it, any
|
Unless a Vulkan header is included, either by the GLFW header or above it, the following
|
||||||
GLFW functions that take or return Vulkan types will not be declared.
|
GLFW functions will not be declared, as depend on Vulkan types.
|
||||||
|
|
||||||
|
- @ref glfwInitVulkanLoader
|
||||||
|
- @ref glfwGetInstanceProcAddress
|
||||||
|
- @ref glfwGetPhysicalDevicePresentationSupport
|
||||||
|
- @ref glfwCreateWindowSurface
|
||||||
|
|
||||||
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part
|
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part
|
||||||
of GLFW to work. Define them only if you are using these extensions directly.
|
of GLFW to work. Define them only if you are using these extensions directly.
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_support Querying for Vulkan support
|
## Querying for Vulkan support {#vulkan_support}
|
||||||
|
|
||||||
If you are linking directly against the Vulkan loader then you can skip this
|
If you are linking directly against the Vulkan loader then you can skip this
|
||||||
section. The canonical desktop loader library exports all Vulkan core and
|
section. The canonical desktop loader library exports all Vulkan core and
|
||||||
Khronos extension functions, allowing them to be called directly.
|
Khronos extension functions, allowing them to be called directly.
|
||||||
|
|
||||||
If you are loading the Vulkan loader dynamically instead of linking directly
|
If you are loading the Vulkan loader dynamically instead of linking directly
|
||||||
against it, you can check for the availability of a loader with @ref
|
against it, you can check for the availability of a loader and ICD with @ref
|
||||||
glfwVulkanSupported.
|
glfwVulkanSupported.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
if (glfwVulkanSupported())
|
if (glfwVulkanSupported())
|
||||||
{
|
{
|
||||||
// Vulkan is available, at least for compute
|
// Vulkan is available, at least for compute
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This function returns `GLFW_TRUE` if the Vulkan loader was found. This check is
|
This function returns `GLFW_TRUE` if the Vulkan loader and any minimally
|
||||||
performed by @ref glfwInit.
|
functional ICD was found.
|
||||||
|
|
||||||
If no loader was found, calling any other Vulkan related GLFW function will
|
If one or both were not found, calling any other Vulkan related GLFW function
|
||||||
generate a @ref GLFW_API_UNAVAILABLE error.
|
will generate a @ref GLFW_API_UNAVAILABLE error.
|
||||||
|
|
||||||
|
|
||||||
@subsection vulkan_proc Querying Vulkan function pointers
|
### Querying Vulkan function pointers {#vulkan_proc}
|
||||||
|
|
||||||
To load any Vulkan core or extension function from the found loader, call @ref
|
To load any Vulkan core or extension function from the found loader, call @ref
|
||||||
glfwGetInstanceProcAddress. To load functions needed for instance creation,
|
glfwGetInstanceProcAddress. To load functions needed for instance creation,
|
||||||
pass `NULL` as the instance.
|
pass `NULL` as the instance.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
PFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance)
|
PFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance)
|
||||||
glfwGetInstanceProcAddress(NULL, "vkCreateInstance");
|
glfwGetInstanceProcAddress(NULL, "vkCreateInstance");
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Once you have created an instance, you can load from it all other Vulkan core
|
Once you have created an instance, you can load from it all other Vulkan core
|
||||||
functions and functions from any instance extensions you enabled.
|
functions and functions from any instance extensions you enabled.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
PFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice)
|
PFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice)
|
||||||
glfwGetInstanceProcAddress(instance, "vkCreateDevice");
|
glfwGetInstanceProcAddress(instance, "vkCreateDevice");
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
This function in turn calls `vkGetInstanceProcAddr`. If that fails, the
|
This function in turn calls `vkGetInstanceProcAddr`. If that fails, the
|
||||||
function falls back to a platform-specific query of the Vulkan loader (i.e.
|
function falls back to a platform-specific query of the Vulkan loader (i.e.
|
||||||
@ -106,17 +135,17 @@ Vulkan also provides `vkGetDeviceProcAddr` for loading device-specific versions
|
|||||||
of Vulkan function. This function can be retrieved from an instance with @ref
|
of Vulkan function. This function can be retrieved from an instance with @ref
|
||||||
glfwGetInstanceProcAddress.
|
glfwGetInstanceProcAddress.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)
|
PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)
|
||||||
glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr");
|
glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr");
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Device-specific functions may execute a little bit faster, due to not having to
|
Device-specific functions may execute a little faster, due to not having to
|
||||||
dispatch internally based on the device passed to them. For more information
|
dispatch internally based on the device passed to them. For more information
|
||||||
about `vkGetDeviceProcAddr`, see the Vulkan documentation.
|
about `vkGetDeviceProcAddr`, see the Vulkan documentation.
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_ext Querying required Vulkan extensions
|
## Querying required Vulkan extensions {#vulkan_ext}
|
||||||
|
|
||||||
To do anything useful with Vulkan you need to create an instance. If you want
|
To do anything useful with Vulkan you need to create an instance. If you want
|
||||||
to use Vulkan to render to a window, you must enable the instance extensions
|
to use Vulkan to render to a window, you must enable the instance extensions
|
||||||
@ -125,10 +154,10 @@ GLFW requires to create Vulkan surfaces.
|
|||||||
To query the instance extensions required, call @ref
|
To query the instance extensions required, call @ref
|
||||||
glfwGetRequiredInstanceExtensions.
|
glfwGetRequiredInstanceExtensions.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
const char** extensions = glfwGetRequiredInstanceExtensions(&count);
|
const char** extensions = glfwGetRequiredInstanceExtensions(&count);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
These extensions must all be enabled when creating instances that are going to
|
These extensions must all be enabled when creating instances that are going to
|
||||||
be passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref
|
be passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref
|
||||||
@ -139,73 +168,83 @@ If it fails it will return `NULL` and GLFW will not be able to create Vulkan
|
|||||||
window surfaces. You can still use Vulkan for off-screen rendering and compute
|
window surfaces. You can still use Vulkan for off-screen rendering and compute
|
||||||
work.
|
work.
|
||||||
|
|
||||||
The returned array will always contain `VK_KHR_surface`, so if you don't
|
If successful the returned array will always include `VK_KHR_surface`, so if
|
||||||
require any additional extensions you can pass this list directly to the
|
you don't require any additional extensions you can pass this list directly to
|
||||||
`VkInstanceCreateInfo` struct.
|
the `VkInstanceCreateInfo` struct.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
VkInstanceCreateInfo ici;
|
VkInstanceCreateInfo ici;
|
||||||
|
|
||||||
memset(&ici, 0, sizeof(ici));
|
memset(&ici, 0, sizeof(ici));
|
||||||
ici.enabledExtensionCount = count;
|
ici.enabledExtensionCount = count;
|
||||||
ici.ppEnabledExtensionNames = extensions;
|
ici.ppEnabledExtensionNames = extensions;
|
||||||
...
|
...
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
Additional extensions may be required by future versions of GLFW. You should
|
Additional extensions may be required by future versions of GLFW. You should
|
||||||
check whether any extensions you wish to enable are already in the returned
|
check whether any extensions you wish to enable are already in the returned
|
||||||
array, as it is an error to specify an extension more than once in the
|
array, as it is an error to specify an extension more than once in the
|
||||||
`VkInstanceCreateInfo` struct.
|
`VkInstanceCreateInfo` struct.
|
||||||
|
|
||||||
|
@macos MoltenVK is (as of July 2022) not yet a fully conformant implementation
|
||||||
|
of Vulkan. As of Vulkan SDK 1.3.216.0, this means you must also enable the
|
||||||
|
`VK_KHR_portability_enumeration` instance extension and set the
|
||||||
|
`VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR` bit in the instance creation
|
||||||
|
info flags for MoltenVK to show up in the list of physical devices. For more
|
||||||
|
information, see the Vulkan and MoltenVK documentation.
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_present Querying for Vulkan presentation support
|
## Querying for Vulkan presentation support {#vulkan_present}
|
||||||
|
|
||||||
Not every queue family of every Vulkan device can present images to surfaces.
|
Not every queue family of every Vulkan device can present images to surfaces.
|
||||||
To check whether a specific queue family of a physical device supports image
|
To check whether a specific queue family of a physical device supports image
|
||||||
presentation without first having to create a window and surface, call @ref
|
presentation without first having to create a window and surface, call @ref
|
||||||
glfwGetPhysicalDevicePresentationSupport.
|
glfwGetPhysicalDevicePresentationSupport.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index))
|
if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index))
|
||||||
{
|
{
|
||||||
// Queue family supports image presentation
|
// Queue family supports image presentation
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
The `VK_KHR_surface` extension additionally provides the
|
The `VK_KHR_surface` extension additionally provides the
|
||||||
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on
|
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on
|
||||||
an existing Vulkan surface.
|
an existing Vulkan surface.
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_window Creating the window
|
## Creating the window {#vulkan_window}
|
||||||
|
|
||||||
Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan,
|
Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan,
|
||||||
there is no need to create a context. You can disable context creation with the
|
there is no need to create a context. You can disable context creation with the
|
||||||
[GLFW_CLIENT_API](@ref window_hints_ctx) hint.
|
[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "Window Title", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "Window Title", NULL, NULL);
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
See @ref context_less for more information.
|
See @ref context_less for more information.
|
||||||
|
|
||||||
|
|
||||||
@section vulkan_surface Creating a Vulkan window surface
|
## Creating a Vulkan window surface {#vulkan_surface}
|
||||||
|
|
||||||
You can create a Vulkan surface (as defined by the `VK_KHR_surface` extension)
|
You can create a Vulkan surface (as defined by the `VK_KHR_surface` extension)
|
||||||
for a GLFW window with @ref glfwCreateWindowSurface.
|
for a GLFW window with @ref glfwCreateWindowSurface.
|
||||||
|
|
||||||
@code
|
```c
|
||||||
VkSurfaceKHR surface;
|
VkSurfaceKHR surface;
|
||||||
VkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface);
|
VkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
// Window surface creation failed
|
// Window surface creation failed
|
||||||
}
|
}
|
||||||
@endcode
|
```
|
||||||
|
|
||||||
|
If an OpenGL or OpenGL ES context was created on the window, the context has
|
||||||
|
ownership of the presentation on the window and a Vulkan surface cannot be
|
||||||
|
created.
|
||||||
|
|
||||||
It is your responsibility to destroy the surface. GLFW does not destroy it for
|
It is your responsibility to destroy the surface. GLFW does not destroy it for
|
||||||
you. Call `vkDestroySurfaceKHR` function from the same extension to destroy it.
|
you. Call `vkDestroySurfaceKHR` function from the same extension to destroy it.
|
||||||
|
|
||||||
*/
|
|
1008
docs/window.dox
1008
docs/window.dox
File diff suppressed because it is too large
Load Diff
1530
docs/window.md
Normal file
1530
docs/window.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,51 +1,63 @@
|
|||||||
|
|
||||||
link_libraries(glfw)
|
link_libraries(glfw)
|
||||||
|
|
||||||
include_directories(${glfw_INCLUDE_DIRS})
|
include_directories("${GLFW_SOURCE_DIR}/deps")
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS)
|
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()
|
||||||
|
|
||||||
include_directories("${GLFW_SOURCE_DIR}/deps")
|
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(ICON glfw.rc)
|
set(ICON glfw.rc)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set(ICON glfw.icns)
|
set(ICON glfw.icns)
|
||||||
set_source_files_properties(glfw.icns PROPERTIES
|
|
||||||
MAXOSX_PACKAGE_LOCATION "Resources")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(GLAD "${GLFW_SOURCE_DIR}/deps/glad/glad.h"
|
set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h")
|
||||||
"${GLFW_SOURCE_DIR}/deps/glad.c")
|
set(GLAD_GLES2 "${GLFW_SOURCE_DIR}/deps/glad/gles2.h")
|
||||||
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/getopt.c")
|
"${GLFW_SOURCE_DIR}/deps/getopt.c")
|
||||||
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
|
||||||
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
"${GLFW_SOURCE_DIR}/deps/tinycthread.c")
|
||||||
|
|
||||||
add_executable(boing WIN32 MACOSX_BUNDLE boing.c ${ICON} ${GLAD})
|
add_executable(boing WIN32 MACOSX_BUNDLE boing.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(gears WIN32 MACOSX_BUNDLE gears.c ${ICON} ${GLAD})
|
add_executable(gears WIN32 MACOSX_BUNDLE gears.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD})
|
add_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD})
|
add_executable(offscreen offscreen.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(simple WIN32 MACOSX_BUNDLE simple.c ${ICON} ${GLAD})
|
add_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD_GL})
|
||||||
add_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD})
|
add_executable(sharing WIN32 MACOSX_BUNDLE sharing.c ${ICON} ${GLAD_GL})
|
||||||
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD})
|
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(triangle-opengles WIN32 MACOSX_BUNDLE triangle-opengles.c ${ICON} ${GLAD_GLES2})
|
||||||
|
add_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD_GL})
|
||||||
|
add_executable(windows WIN32 MACOSX_BUNDLE windows.c ${ICON} ${GLAD_GL})
|
||||||
|
|
||||||
target_link_libraries(particles "${CMAKE_THREAD_LIBS_INIT}" "${RT_LIBRARY}")
|
target_link_libraries(particles Threads::Threads)
|
||||||
|
if (RT_LIBRARY)
|
||||||
|
target_link_libraries(particles "${RT_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(WINDOWS_BINARIES boing gears heightmap particles simple splitview wave)
|
set(GUI_ONLY_BINARIES boing gears heightmap particles sharing splitview
|
||||||
|
triangle-opengl triangle-opengles wave windows)
|
||||||
|
set(CONSOLE_BINARIES offscreen)
|
||||||
|
|
||||||
set_target_properties(${WINDOWS_BINARIES} PROPERTIES FOLDER "GLFW3/Examples")
|
set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
|
||||||
|
C_STANDARD 99
|
||||||
|
FOLDER "GLFW3/Examples")
|
||||||
|
|
||||||
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(${WINDOWS_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)
|
||||||
@ -53,15 +65,19 @@ if (APPLE)
|
|||||||
set_target_properties(gears PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gears")
|
set_target_properties(gears PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gears")
|
||||||
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Heightmap")
|
||||||
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Particles")
|
||||||
set_target_properties(simple PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Simple")
|
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(triangle-opengles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "OpenGL ES Triangle")
|
||||||
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "SplitView")
|
||||||
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave")
|
||||||
|
set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows")
|
||||||
|
|
||||||
set_target_properties(${WINDOWS_BINARIES} PROPERTIES
|
set_source_files_properties(glfw.icns PROPERTIES
|
||||||
RESOURCE glfw.icns
|
MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
|
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_FULL}
|
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/MacOSXBundleInfo.plist.in")
|
MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/Info.plist.in")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -36,7 +36,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
@ -165,7 +167,7 @@ void CrossProduct( vertex_t a, vertex_t b, vertex_t c, vertex_t *n )
|
|||||||
v2 = c.y - a.y;
|
v2 = c.y - a.y;
|
||||||
v3 = c.z - a.z;
|
v3 = c.z - a.z;
|
||||||
|
|
||||||
n->x = u2 * v3 - v2 * v3;
|
n->x = u2 * v3 - v2 * u3;
|
||||||
n->y = u3 * v1 - v3 * u1;
|
n->y = u3 * v1 - v3 * u1;
|
||||||
n->z = u1 * v2 - v1 * u2;
|
n->z = u1 * v2 - v1 * u2;
|
||||||
}
|
}
|
||||||
@ -302,7 +304,7 @@ void cursor_position_callback( GLFWwindow* window, double x, double y )
|
|||||||
* The Boing ball is sphere in which each facet is a rectangle.
|
* The Boing ball is sphere in which each facet is a rectangle.
|
||||||
* Facet colors alternate between red and white.
|
* Facet colors alternate between red and white.
|
||||||
* The ball is built by stacking latitudinal circles. Each circle is composed
|
* The ball is built by stacking latitudinal circles. Each circle is composed
|
||||||
* of a widely-separated set of points, so that each facet is noticably large.
|
* of a widely-separated set of points, so that each facet is noticeably large.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void DrawBoingBall( void )
|
void DrawBoingBall( void )
|
||||||
{
|
{
|
||||||
@ -446,7 +448,7 @@ void DrawBoingBallBand( GLfloat long_lo,
|
|||||||
static int colorToggle = 0;
|
static int colorToggle = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iterate thru the points of a latitude circle.
|
* Iterate through the points of a latitude circle.
|
||||||
* A latitude circle is a 2D set of X,Z points.
|
* A latitude circle is a 2D set of X,Z points.
|
||||||
*/
|
*/
|
||||||
for ( lat_deg = 0;
|
for ( lat_deg = 0;
|
||||||
@ -642,7 +644,7 @@ int main( void )
|
|||||||
glfwSetCursorPosCallback(window, cursor_position_callback);
|
glfwSetCursorPosCallback(window, cursor_position_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* - Slightly modified camera that should work better for stereo viewing
|
* - Slightly modified camera that should work better for stereo viewing
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Camilla Berglund:
|
* Camilla Löwy:
|
||||||
* - Removed FPS counter (this is not a benchmark)
|
* - Removed FPS counter (this is not a benchmark)
|
||||||
* - Added a few comments
|
* - Added a few comments
|
||||||
* - Enabled vsync
|
* - Enabled vsync
|
||||||
@ -31,7 +31,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -172,6 +174,7 @@ static GLfloat angle = 0.f;
|
|||||||
/* OpenGL draw function & timing */
|
/* OpenGL draw function & timing */
|
||||||
static void draw(void)
|
static void draw(void)
|
||||||
{
|
{
|
||||||
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
@ -311,6 +314,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
glfwWindowHint(GLFW_DEPTH_BITS, 16);
|
||||||
|
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
|
||||||
|
|
||||||
window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
|
window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
|
||||||
if (!window)
|
if (!window)
|
||||||
@ -325,7 +329,7 @@ int main(int argc, char *argv[])
|
|||||||
glfwSetKeyCallback(window, key);
|
glfwSetKeyCallback(window, key);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval( 1 );
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
|
|
||||||
GLFW_ICON ICON "glfw.ico"
|
GLFW_ICON ICON "glfw.ico"
|
||||||
|
|
||||||
|
@ -29,7 +29,9 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
/* Map height updates */
|
/* Map height updates */
|
||||||
@ -291,12 +293,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
|
||||||
@ -432,7 +434,7 @@ int main(int argc, char** argv)
|
|||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
|
||||||
/* Prepare opengl resources for rendering */
|
/* Prepare opengl resources for rendering */
|
||||||
shader_program = make_shader_program(vertex_shader_text, fragment_shader_text);
|
shader_program = make_shader_program(vertex_shader_text, fragment_shader_text);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// Simple GLFW example
|
// Offscreen rendering example
|
||||||
// Copyright (c) Camilla Berglund <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
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
@ -22,9 +22,10 @@
|
|||||||
// distribution.
|
// distribution.
|
||||||
//
|
//
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//! [code]
|
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include "linmath.h"
|
#include "linmath.h"
|
||||||
@ -32,6 +33,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
#include <stb_image_write.h>
|
||||||
|
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
float x, y;
|
float x, y;
|
||||||
@ -44,6 +48,7 @@ static const struct
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const char* vertex_shader_text =
|
static const char* vertex_shader_text =
|
||||||
|
"#version 110\n"
|
||||||
"uniform mat4 MVP;\n"
|
"uniform mat4 MVP;\n"
|
||||||
"attribute vec3 vCol;\n"
|
"attribute vec3 vCol;\n"
|
||||||
"attribute vec2 vPos;\n"
|
"attribute vec2 vPos;\n"
|
||||||
@ -55,6 +60,7 @@ static const char* vertex_shader_text =
|
|||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
static const char* fragment_shader_text =
|
static const char* fragment_shader_text =
|
||||||
|
"#version 110\n"
|
||||||
"varying vec3 color;\n"
|
"varying vec3 color;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
@ -66,25 +72,26 @@ static void error_callback(int error, const char* description)
|
|||||||
fprintf(stderr, "Error: %s\n", description);
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
|
||||||
{
|
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
GLFWwindow* window;
|
GLFWwindow* window;
|
||||||
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
|
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
|
||||||
GLint mvp_location, vpos_location, vcol_location;
|
GLint mvp_location, vpos_location, vcol_location;
|
||||||
|
float ratio;
|
||||||
|
int width, height;
|
||||||
|
mat4x4 mvp;
|
||||||
|
char* buffer;
|
||||||
|
|
||||||
glfwSetErrorCallback(error_callback);
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
|
glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE);
|
||||||
|
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
|
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
||||||
|
|
||||||
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
||||||
if (!window)
|
if (!window)
|
||||||
@ -93,11 +100,8 @@ int main(void)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
|
||||||
|
|
||||||
// NOTE: OpenGL error checks have been omitted for brevity
|
// NOTE: OpenGL error checks have been omitted for brevity
|
||||||
|
|
||||||
@ -124,35 +128,34 @@ int main(void)
|
|||||||
|
|
||||||
glEnableVertexAttribArray(vpos_location);
|
glEnableVertexAttribArray(vpos_location);
|
||||||
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
sizeof(float) * 5, (void*) 0);
|
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(float) * 5, (void*) (sizeof(float) * 2));
|
sizeof(vertices[0]), (void*) (sizeof(float) * 2));
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
{
|
ratio = width / (float) height;
|
||||||
float ratio;
|
|
||||||
int width, height;
|
|
||||||
mat4x4 m, p, mvp;
|
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glViewport(0, 0, width, height);
|
||||||
ratio = width / (float) height;
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glViewport(0, 0, width, height);
|
mat4x4_ortho(mvp, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
mat4x4_identity(m);
|
glUseProgram(program);
|
||||||
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
||||||
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
mat4x4_mul(mvp, p, m);
|
glFinish();
|
||||||
|
|
||||||
glUseProgram(program);
|
buffer = calloc(4, width * height);
|
||||||
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
// Write image Y-flipped because OpenGL
|
||||||
glfwPollEvents();
|
stbi_write_png("offscreen.png",
|
||||||
}
|
width, height, 4,
|
||||||
|
buffer + (width * 4 * (height - 1)),
|
||||||
|
-width * 4);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
|
|
||||||
@ -160,4 +163,3 @@ int main(void)
|
|||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! [code]
|
|
@ -1,7 +1,7 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// A simple particle engine with threaded physics
|
// A simple particle engine with threaded physics
|
||||||
// Copyright (c) Marcus Geelnard
|
// Copyright (c) Marcus Geelnard
|
||||||
// Copyright (c) Camilla Berglund <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
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
@ -39,7 +39,9 @@
|
|||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
// Define tokens for GL_EXT_separate_specular_color if not already defined
|
// Define tokens for GL_EXT_separate_specular_color if not already defined
|
||||||
@ -443,7 +445,7 @@ static void draw_particles(GLFWwindow* window, double t, float dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set up vertex arrays. We use interleaved arrays, which is easier to
|
// Set up vertex arrays. We use interleaved arrays, which is easier to
|
||||||
// handle (in most situations) and it gives a linear memeory access
|
// handle (in most situations) and it gives a linear memory access
|
||||||
// access pattern (which may give better performance in some
|
// access pattern (which may give better performance in some
|
||||||
// situations). GL_T2F_C4UB_V3F means: 2 floats for texture coords,
|
// situations). GL_T2F_C4UB_V3F means: 2 floats for texture coords,
|
||||||
// 4 ubytes for color and 3 floats for vertex coord (in that order).
|
// 4 ubytes for color and 3 floats for vertex coord (in that order).
|
||||||
@ -457,7 +459,9 @@ static void draw_particles(GLFWwindow* window, double t, float dt)
|
|||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
ts.tv_nsec += 100000000;
|
ts.tv_nsec += 100 * 1000 * 1000;
|
||||||
|
ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);
|
||||||
|
ts.tv_nsec %= 1000 * 1000 * 1000;
|
||||||
cnd_timedwait(&thread_sync.p_done, &thread_sync.particles_lock, &ts);
|
cnd_timedwait(&thread_sync.p_done, &thread_sync.particles_lock, &ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -651,7 +655,7 @@ static void draw_fountain(void)
|
|||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Recursive function for building variable tesselated floor
|
// Recursive function for building variable tessellated floor
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
static void tessellate_floor(float x1, float y1, float x2, float y2, int depth)
|
static void tessellate_floor(float x1, float y1, float x2, float y2, int depth)
|
||||||
@ -718,7 +722,7 @@ static void draw_floor(void)
|
|||||||
glMaterialfv(GL_FRONT, GL_SPECULAR, floor_specular);
|
glMaterialfv(GL_FRONT, GL_SPECULAR, floor_specular);
|
||||||
glMaterialf(GL_FRONT, GL_SHININESS, floor_shininess);
|
glMaterialf(GL_FRONT, GL_SHININESS, floor_shininess);
|
||||||
|
|
||||||
// Draw floor as a bunch of triangle strips (high tesselation
|
// Draw floor as a bunch of triangle strips (high tessellation
|
||||||
// improves lighting)
|
// improves lighting)
|
||||||
glNormal3f(0.f, 0.f, 1.f);
|
glNormal3f(0.f, 0.f, 1.f);
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
@ -908,7 +912,9 @@ static int physics_thread_main(void* arg)
|
|||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
ts.tv_nsec += 100000000;
|
ts.tv_nsec += 100 * 1000 * 1000;
|
||||||
|
ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);
|
||||||
|
ts.tv_nsec %= 1000 * 1000 * 1000;
|
||||||
cnd_timedwait(&thread_sync.d_done, &thread_sync.particles_lock, &ts);
|
cnd_timedwait(&thread_sync.d_done, &thread_sync.particles_lock, &ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -990,7 +996,7 @@ int main(int argc, char** argv)
|
|||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwSetFramebufferSizeCallback(window, resize_callback);
|
glfwSetFramebufferSizeCallback(window, resize_callback);
|
||||||
|
234
examples/sharing.c
Normal file
234
examples/sharing.c
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
//========================================================================
|
||||||
|
// Context sharing example
|
||||||
|
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "linmath.h"
|
||||||
|
|
||||||
|
static const char* vertex_shader_text =
|
||||||
|
"#version 110\n"
|
||||||
|
"uniform mat4 MVP;\n"
|
||||||
|
"attribute vec2 vPos;\n"
|
||||||
|
"varying vec2 texcoord;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
||||||
|
" texcoord = vPos;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static const char* fragment_shader_text =
|
||||||
|
"#version 110\n"
|
||||||
|
"uniform sampler2D texture;\n"
|
||||||
|
"uniform vec3 color;\n"
|
||||||
|
"varying vec2 texcoord;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_FragColor = vec4(color * texture2D(texture, texcoord).rgb, 1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static const vec2 vertices[4] =
|
||||||
|
{
|
||||||
|
{ 0.f, 0.f },
|
||||||
|
{ 1.f, 0.f },
|
||||||
|
{ 1.f, 1.f },
|
||||||
|
{ 0.f, 1.f }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void error_callback(int error, const char* description)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)
|
||||||
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
GLFWwindow* windows[2];
|
||||||
|
GLuint texture, program, vertex_buffer;
|
||||||
|
GLint mvp_location, vpos_location, color_location, texture_location;
|
||||||
|
|
||||||
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
|
|
||||||
|
windows[0] = glfwCreateWindow(400, 400, "First", NULL, NULL);
|
||||||
|
if (!windows[0])
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(windows[0], key_callback);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(windows[0]);
|
||||||
|
|
||||||
|
// Only enable vsync for the first of the windows to be swapped to
|
||||||
|
// avoid waiting out the interval for each window
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
// The contexts are created with the same APIs so the function
|
||||||
|
// pointers should be re-usable between them
|
||||||
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
|
||||||
|
// Create the OpenGL objects inside the first context, created above
|
||||||
|
// All objects will be shared with the second context, created below
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
char pixels[16 * 16];
|
||||||
|
GLuint vertex_shader, fragment_shader;
|
||||||
|
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
|
||||||
|
srand((unsigned int) glfwGetTimerValue());
|
||||||
|
|
||||||
|
for (y = 0; y < 16; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < 16; x++)
|
||||||
|
pixels[y * 16 + x] = rand() % 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
|
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
||||||
|
glCompileShader(vertex_shader);
|
||||||
|
|
||||||
|
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
||||||
|
glCompileShader(fragment_shader);
|
||||||
|
|
||||||
|
program = glCreateProgram();
|
||||||
|
glAttachShader(program, vertex_shader);
|
||||||
|
glAttachShader(program, fragment_shader);
|
||||||
|
glLinkProgram(program);
|
||||||
|
|
||||||
|
mvp_location = glGetUniformLocation(program, "MVP");
|
||||||
|
color_location = glGetUniformLocation(program, "color");
|
||||||
|
texture_location = glGetUniformLocation(program, "texture");
|
||||||
|
vpos_location = glGetAttribLocation(program, "vPos");
|
||||||
|
|
||||||
|
glGenBuffers(1, &vertex_buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
glUseProgram(program);
|
||||||
|
glUniform1i(texture_location, 0);
|
||||||
|
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glEnableVertexAttribArray(vpos_location);
|
||||||
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(vertices[0]), (void*) 0);
|
||||||
|
|
||||||
|
windows[1] = glfwCreateWindow(400, 400, "Second", NULL, windows[0]);
|
||||||
|
if (!windows[1])
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place the second window to the right of the first
|
||||||
|
{
|
||||||
|
int xpos, ypos, left, right, width;
|
||||||
|
|
||||||
|
glfwGetWindowSize(windows[0], &width, NULL);
|
||||||
|
glfwGetWindowFrameSize(windows[0], &left, NULL, &right, NULL);
|
||||||
|
glfwGetWindowPos(windows[0], &xpos, &ypos);
|
||||||
|
|
||||||
|
glfwSetWindowPos(windows[1], xpos + width + left + right, ypos);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(windows[1], key_callback);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(windows[1]);
|
||||||
|
|
||||||
|
// While objects are shared, the global context state is not and will
|
||||||
|
// need to be set up for each context
|
||||||
|
|
||||||
|
glUseProgram(program);
|
||||||
|
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glEnableVertexAttribArray(vpos_location);
|
||||||
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(vertices[0]), (void*) 0);
|
||||||
|
|
||||||
|
while (!glfwWindowShouldClose(windows[0]) &&
|
||||||
|
!glfwWindowShouldClose(windows[1]))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const vec3 colors[2] =
|
||||||
|
{
|
||||||
|
{ 0.8f, 0.4f, 1.f },
|
||||||
|
{ 0.3f, 0.4f, 1.f }
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
mat4x4 mvp;
|
||||||
|
|
||||||
|
glfwGetFramebufferSize(windows[i], &width, &height);
|
||||||
|
glfwMakeContextCurrent(windows[i]);
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
mat4x4_ortho(mvp, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f);
|
||||||
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
|
||||||
|
glUniform3fv(color_location, 1, colors[i]);
|
||||||
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||||
|
|
||||||
|
glfwSwapBuffers(windows[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwWaitEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
@ -2,15 +2,17 @@
|
|||||||
// 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 separete the four different rendering areas from
|
// demo uses scissors to separate the four different rendering areas from
|
||||||
// each other.
|
// each other.
|
||||||
//
|
//
|
||||||
// (If the code seems a little bit strange here and there, it may be
|
// (If the code seems a little bit strange here and there, it may be
|
||||||
// because I am not a friend of orthogonal projections)
|
// because I am not a friend of orthogonal projections)
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
@ -513,7 +515,7 @@ int main(void)
|
|||||||
|
|
||||||
// Enable vsync
|
// Enable vsync
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
if (GLAD_GL_ARB_multisample || GLAD_GL_VERSION_1_3)
|
if (GLAD_GL_ARB_multisample || GLAD_GL_VERSION_1_3)
|
||||||
|
171
examples/triangle-opengl.c
Normal file
171
examples/triangle-opengl.c
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
//========================================================================
|
||||||
|
// OpenGL triangle example
|
||||||
|
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//! [code]
|
||||||
|
|
||||||
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include "linmath.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct Vertex
|
||||||
|
{
|
||||||
|
vec2 pos;
|
||||||
|
vec3 col;
|
||||||
|
} Vertex;
|
||||||
|
|
||||||
|
static const Vertex vertices[3] =
|
||||||
|
{
|
||||||
|
{ { -0.6f, -0.4f }, { 1.f, 0.f, 0.f } },
|
||||||
|
{ { 0.6f, -0.4f }, { 0.f, 1.f, 0.f } },
|
||||||
|
{ { 0.f, 0.6f }, { 0.f, 0.f, 1.f } }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* vertex_shader_text =
|
||||||
|
"#version 330\n"
|
||||||
|
"uniform mat4 MVP;\n"
|
||||||
|
"in vec3 vCol;\n"
|
||||||
|
"in vec2 vPos;\n"
|
||||||
|
"out vec3 color;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
||||||
|
" color = vCol;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static const char* fragment_shader_text =
|
||||||
|
"#version 330\n"
|
||||||
|
"in vec3 color;\n"
|
||||||
|
"out vec4 fragment;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" fragment = vec4(color, 1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static void error_callback(int error, const char* description)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s\n", description);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
|
{
|
||||||
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
|
||||||
|
GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL Triangle", NULL, NULL);
|
||||||
|
if (!window)
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
// NOTE: OpenGL error checks have been omitted for brevity
|
||||||
|
|
||||||
|
GLuint vertex_buffer;
|
||||||
|
glGenBuffers(1, &vertex_buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
||||||
|
glCompileShader(vertex_shader);
|
||||||
|
|
||||||
|
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
||||||
|
glCompileShader(fragment_shader);
|
||||||
|
|
||||||
|
const GLuint program = glCreateProgram();
|
||||||
|
glAttachShader(program, vertex_shader);
|
||||||
|
glAttachShader(program, fragment_shader);
|
||||||
|
glLinkProgram(program);
|
||||||
|
|
||||||
|
const GLint mvp_location = glGetUniformLocation(program, "MVP");
|
||||||
|
const GLint vpos_location = glGetAttribLocation(program, "vPos");
|
||||||
|
const GLint vcol_location = glGetAttribLocation(program, "vCol");
|
||||||
|
|
||||||
|
GLuint vertex_array;
|
||||||
|
glGenVertexArrays(1, &vertex_array);
|
||||||
|
glBindVertexArray(vertex_array);
|
||||||
|
glEnableVertexAttribArray(vpos_location);
|
||||||
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(Vertex), (void*) offsetof(Vertex, pos));
|
||||||
|
glEnableVertexAttribArray(vcol_location);
|
||||||
|
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(Vertex), (void*) offsetof(Vertex, col));
|
||||||
|
|
||||||
|
while (!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
const float ratio = width / (float) height;
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
mat4x4 m, p, mvp;
|
||||||
|
mat4x4_identity(m);
|
||||||
|
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
||||||
|
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
mat4x4_mul(mvp, p, m);
|
||||||
|
|
||||||
|
glUseProgram(program);
|
||||||
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) &mvp);
|
||||||
|
glBindVertexArray(vertex_array);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwDestroyWindow(window);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! [code]
|
170
examples/triangle-opengles.c
Normal file
170
examples/triangle-opengles.c
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
//========================================================================
|
||||||
|
// OpenGL ES 2.0 triangle example
|
||||||
|
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define GLAD_GLES2_IMPLEMENTATION
|
||||||
|
#include <glad/gles2.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include "linmath.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct Vertex
|
||||||
|
{
|
||||||
|
vec2 pos;
|
||||||
|
vec3 col;
|
||||||
|
} Vertex;
|
||||||
|
|
||||||
|
static const Vertex vertices[3] =
|
||||||
|
{
|
||||||
|
{ { -0.6f, -0.4f }, { 1.f, 0.f, 0.f } },
|
||||||
|
{ { 0.6f, -0.4f }, { 0.f, 1.f, 0.f } },
|
||||||
|
{ { 0.f, 0.6f }, { 0.f, 0.f, 1.f } }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* vertex_shader_text =
|
||||||
|
"#version 100\n"
|
||||||
|
"precision mediump float;\n"
|
||||||
|
"uniform mat4 MVP;\n"
|
||||||
|
"attribute vec3 vCol;\n"
|
||||||
|
"attribute vec2 vPos;\n"
|
||||||
|
"varying vec3 color;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
|
||||||
|
" color = vCol;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static const char* fragment_shader_text =
|
||||||
|
"#version 100\n"
|
||||||
|
"precision mediump float;\n"
|
||||||
|
"varying vec3 color;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_FragColor = vec4(color, 1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static void error_callback(int error, const char* description)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GLFW Error: %s\n", description);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
|
{
|
||||||
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API);
|
||||||
|
|
||||||
|
GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL ES 2.0 Triangle (EGL)", NULL, NULL);
|
||||||
|
if (!window)
|
||||||
|
{
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);
|
||||||
|
window = glfwCreateWindow(640, 480, "OpenGL ES 2.0 Triangle", NULL, NULL);
|
||||||
|
if (!window)
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
gladLoadGLES2(glfwGetProcAddress);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
GLuint vertex_buffer;
|
||||||
|
glGenBuffers(1, &vertex_buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
|
||||||
|
glCompileShader(vertex_shader);
|
||||||
|
|
||||||
|
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
|
||||||
|
glCompileShader(fragment_shader);
|
||||||
|
|
||||||
|
const GLuint program = glCreateProgram();
|
||||||
|
glAttachShader(program, vertex_shader);
|
||||||
|
glAttachShader(program, fragment_shader);
|
||||||
|
glLinkProgram(program);
|
||||||
|
|
||||||
|
const GLint mvp_location = glGetUniformLocation(program, "MVP");
|
||||||
|
const GLint vpos_location = glGetAttribLocation(program, "vPos");
|
||||||
|
const GLint vcol_location = glGetAttribLocation(program, "vCol");
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(vpos_location);
|
||||||
|
glEnableVertexAttribArray(vcol_location);
|
||||||
|
glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(Vertex), (void*) offsetof(Vertex, pos));
|
||||||
|
glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(Vertex), (void*) offsetof(Vertex, col));
|
||||||
|
|
||||||
|
while (!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
const float ratio = width / (float) height;
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
mat4x4 m, p, mvp;
|
||||||
|
mat4x4_identity(m);
|
||||||
|
mat4x4_rotate_Z(m, m, (float) glfwGetTime());
|
||||||
|
mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
mat4x4_mul(mvp, p, m);
|
||||||
|
|
||||||
|
glUseProgram(program);
|
||||||
|
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) &mvp);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwDestroyWindow(window);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@
|
|||||||
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
||||||
* Modified for variable frame rate by Marcus Geelnard
|
* Modified for variable frame rate by Marcus Geelnard
|
||||||
* 2003-Jan-31: Minor cleanups and speedups / MG
|
* 2003-Jan-31: Minor cleanups and speedups / MG
|
||||||
* 2010-10-24: Formatting and cleanup - Camilla Berglund
|
* 2010-10-24: Formatting and cleanup - Camilla Löwy
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
@ -17,7 +17,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include <linmath.h>
|
#include <linmath.h>
|
||||||
@ -412,7 +414,7 @@ int main(int argc, char* argv[])
|
|||||||
glfwSetScrollCallback(window, scroll_callback);
|
glfwSetScrollCallback(window, scroll_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGL(glfwGetProcAddress);
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
glfwGetFramebufferSize(window, &width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
@ -455,6 +457,7 @@ int main(int argc, char* argv[])
|
|||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
106
examples/windows.c
Normal file
106
examples/windows.c
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
//========================================================================
|
||||||
|
// Simple multi-window example
|
||||||
|
// Copyright (c) Camilla Löwy <elmindreda@glfw.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include <glad/gl.h>
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int xpos, ypos, height;
|
||||||
|
const char* description;
|
||||||
|
GLFWwindow* windows[4];
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
glfwGetError(&description);
|
||||||
|
printf("Error: %s\n", description);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
||||||
|
|
||||||
|
glfwGetMonitorWorkarea(glfwGetPrimaryMonitor(), &xpos, &ypos, NULL, &height);
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
const int size = height / 5;
|
||||||
|
const struct
|
||||||
|
{
|
||||||
|
float r, g, b;
|
||||||
|
} colors[] =
|
||||||
|
{
|
||||||
|
{ 0.95f, 0.32f, 0.11f },
|
||||||
|
{ 0.50f, 0.80f, 0.16f },
|
||||||
|
{ 0.f, 0.68f, 0.94f },
|
||||||
|
{ 0.98f, 0.74f, 0.04f }
|
||||||
|
};
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE);
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_POSITION_X, xpos + size * (1 + (i & 1)));
|
||||||
|
glfwWindowHint(GLFW_POSITION_Y, ypos + size * (1 + (i >> 1)));
|
||||||
|
|
||||||
|
windows[i] = glfwCreateWindow(size, size, "Multi-Window Example", NULL, NULL);
|
||||||
|
if (!windows[i])
|
||||||
|
{
|
||||||
|
glfwGetError(&description);
|
||||||
|
printf("Error: %s\n", description);
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetInputMode(windows[i], GLFW_STICKY_KEYS, GLFW_TRUE);
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(windows[i]);
|
||||||
|
gladLoadGL(glfwGetProcAddress);
|
||||||
|
glClearColor(colors[i].r, colors[i].g, colors[i].b, 1.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
glfwMakeContextCurrent(windows[i]);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glfwSwapBuffers(windows[i]);
|
||||||
|
|
||||||
|
if (glfwWindowShouldClose(windows[i]) ||
|
||||||
|
glfwGetKey(windows[i], GLFW_KEY_ESCAPE))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwWaitEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
3463
include/GLFW/glfw3.h
3463
include/GLFW/glfw3.h
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,9 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.2 - www.glfw.org
|
* GLFW 3.5 - www.glfw.org
|
||||||
* A library for OpenGL, window and input
|
* A library for OpenGL, window and input
|
||||||
*------------------------------------------------------------------------
|
*------------------------------------------------------------------------
|
||||||
* Copyright (c) 2002-2006 Marcus Geelnard
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
* Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
* Copyright (c) 2006-2018 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
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@ -45,12 +45,13 @@ extern "C" {
|
|||||||
* more information.
|
* more information.
|
||||||
*/
|
*/
|
||||||
/*! @defgroup native Native access
|
/*! @defgroup native Native access
|
||||||
|
* @brief Functions related to accessing native handles.
|
||||||
*
|
*
|
||||||
* **By using the native access functions you assert that you know what you're
|
* **By using the native access functions you assert that you know what you're
|
||||||
* doing and how to fix problems caused by using them. If you don't, you
|
* doing and how to fix problems caused by using them. If you don't, you
|
||||||
* shouldn't be using them.**
|
* shouldn't be using them.**
|
||||||
*
|
*
|
||||||
* Before the inclusion of @ref glfw3native.h, you may define exactly one
|
* Before the inclusion of @ref glfw3native.h, you may define zero or more
|
||||||
* window system API macro and zero or more context creation API macros.
|
* window system API macro and zero or more context creation API macros.
|
||||||
*
|
*
|
||||||
* The chosen backends must match those the library was compiled for. Failure
|
* The chosen backends must match those the library was compiled for. Failure
|
||||||
@ -61,18 +62,28 @@ extern "C" {
|
|||||||
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
||||||
* * `GLFW_EXPOSE_NATIVE_X11`
|
* * `GLFW_EXPOSE_NATIVE_X11`
|
||||||
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
||||||
* * `GLFW_EXPOSE_NATIVE_MIR`
|
|
||||||
*
|
*
|
||||||
* The available context API macros are:
|
* The available context API macros are:
|
||||||
* * `GLFW_EXPOSE_NATIVE_WGL`
|
* * `GLFW_EXPOSE_NATIVE_WGL`
|
||||||
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
* * `GLFW_EXPOSE_NATIVE_NSGL`
|
||||||
* * `GLFW_EXPOSE_NATIVE_GLX`
|
* * `GLFW_EXPOSE_NATIVE_GLX`
|
||||||
* * `GLFW_EXPOSE_NATIVE_EGL`
|
* * `GLFW_EXPOSE_NATIVE_EGL`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_OSMESA`
|
||||||
*
|
*
|
||||||
* These macros select which of the native access functions that are declared
|
* These macros select which of the native access functions that are declared
|
||||||
* and which platform-specific headers to include. It is then up your (by
|
* and which platform-specific headers to include. It is then up your (by
|
||||||
* definition platform-specific) code to handle which of these should be
|
* definition platform-specific) code to handle which of these should be
|
||||||
* defined.
|
* defined.
|
||||||
|
*
|
||||||
|
* If you do not want the platform-specific headers to be included, define
|
||||||
|
* `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header.
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* #define GLFW_EXPOSE_NATIVE_WIN32
|
||||||
|
* #define GLFW_EXPOSE_NATIVE_WGL
|
||||||
|
* #define GLFW_NATIVE_INCLUDE_NONE
|
||||||
|
* #include <GLFW/glfw3native.h>
|
||||||
|
* @endcode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -80,40 +91,71 @@ extern "C" {
|
|||||||
* System headers and types
|
* System headers and types
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
|
#if !defined(GLFW_NATIVE_INCLUDE_NONE)
|
||||||
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
|
||||||
// example to allow applications to correctly declare a GL_ARB_debug_output
|
|
||||||
// callback) but windows.h assumes no one will define APIENTRY before it does
|
|
||||||
#undef APIENTRY
|
|
||||||
#include <windows.h>
|
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
|
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
|
||||||
#if defined(__OBJC__)
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#else
|
|
||||||
typedef void* id;
|
|
||||||
#endif
|
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_X11)
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/Xrandr.h>
|
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_MIR)
|
|
||||||
#include <mir_toolkit/mir_client_library.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
/* WGL is declared by windows.h */
|
/* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
|
||||||
#endif
|
* example to allow applications to correctly declare a GL_KHR_debug callback)
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
* but windows.h assumes no one will define APIENTRY before it does
|
||||||
/* NSGL is declared by Cocoa.h */
|
*/
|
||||||
#endif
|
#if defined(GLFW_APIENTRY_DEFINED)
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
#undef APIENTRY
|
||||||
#include <GL/glx.h>
|
#undef GLFW_APIENTRY_DEFINED
|
||||||
#endif
|
#endif
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
#include <windows.h>
|
||||||
#include <EGL/egl.h>
|
#endif
|
||||||
#endif
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
|
#if defined(__OBJC__)
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#else
|
||||||
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
#include <objc/objc.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/extensions/Xrandr.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
|
/* WGL is declared by windows.h */
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
|
/* NSGL is declared by Cocoa.h */
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
|
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
||||||
|
* default it also acts as an OpenGL header
|
||||||
|
* However, glx.h will include gl.h, which will define it unconditionally
|
||||||
|
*/
|
||||||
|
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
||||||
|
#undef GLAPIENTRY
|
||||||
|
#undef GLFW_GLAPIENTRY_DEFINED
|
||||||
|
#endif
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
||||||
|
/* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
|
||||||
|
* default it also acts as an OpenGL header
|
||||||
|
* However, osmesa.h will include gl.h, which will define it unconditionally
|
||||||
|
*/
|
||||||
|
#if defined(GLFW_GLAPIENTRY_DEFINED)
|
||||||
|
#undef GLAPIENTRY
|
||||||
|
#undef GLFW_GLAPIENTRY_DEFINED
|
||||||
|
#endif
|
||||||
|
#include <GL/osmesa.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*GLFW_NATIVE_INCLUDE_NONE*/
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@ -127,6 +169,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -142,6 +187,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -156,6 +204,17 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
*
|
*
|
||||||
@ -172,6 +231,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_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
*
|
*
|
||||||
@ -188,6 +258,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@ -202,6 +275,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -210,6 +286,23 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
|||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Returns the `NSView` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `NSView` of the specified window, or `nil` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.4.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI id glfwGetCocoaView(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
@ -218,6 +311,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_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -234,6 +330,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -248,6 +347,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -262,6 +364,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -276,6 +381,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -284,6 +392,56 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
|||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Sets the current primary selection to the specified string.
|
||||||
|
*
|
||||||
|
* @param[in] string A UTF-8 encoded string.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
||||||
|
*
|
||||||
|
* @pointer_lifetime The specified string is copied before this function
|
||||||
|
* returns.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref clipboard
|
||||||
|
* @sa glfwGetX11SelectionString
|
||||||
|
* @sa glfwSetClipboardString
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetX11SelectionString(const char* string);
|
||||||
|
|
||||||
|
/*! @brief Returns the contents of the current primary selection as a string.
|
||||||
|
*
|
||||||
|
* If the selection is empty or if its contents cannot be converted, `NULL`
|
||||||
|
* is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated.
|
||||||
|
*
|
||||||
|
* @return The contents of the selection as a UTF-8 encoded string, or `NULL`
|
||||||
|
* if an [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
|
||||||
|
*
|
||||||
|
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
|
||||||
|
* should not free it yourself. It is valid until the next call to @ref
|
||||||
|
* glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the
|
||||||
|
* library is terminated.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref clipboard
|
||||||
|
* @sa glfwSetX11SelectionString
|
||||||
|
* @sa glfwGetClipboardString
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI const char* glfwGetX11SelectionString(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
@ -292,6 +450,9 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
|||||||
* @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_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -306,6 +467,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_NOT_INITIALIZED, @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -322,6 +486,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -336,6 +503,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -350,6 +520,9 @@ 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 and @ref
|
||||||
|
* GLFW_PLATFORM_UNAVAILABLE.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -360,56 +533,17 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
|||||||
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_MIR)
|
|
||||||
/*! @brief Returns the `MirConnection*` used by GLFW.
|
|
||||||
*
|
|
||||||
* @return The `MirConnection*` used by GLFW, or `NULL` if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI MirConnection* glfwGetMirDisplay(void);
|
|
||||||
|
|
||||||
/*! @brief Returns the Mir output ID of the specified monitor.
|
|
||||||
*
|
|
||||||
* @return The Mir output ID of the specified monitor, or zero if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);
|
|
||||||
|
|
||||||
/*! @brief Returns the `MirSurface*` of the specified window.
|
|
||||||
*
|
|
||||||
* @return The `MirSurface*` of the specified window, or `NULL` if an
|
|
||||||
* [error](@ref error_handling) occurred.
|
|
||||||
*
|
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
|
||||||
* synchronized.
|
|
||||||
*
|
|
||||||
* @since Added in version 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup native
|
|
||||||
*/
|
|
||||||
GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
/*! @brief Returns the `EGLDisplay` used by GLFW.
|
||||||
*
|
*
|
||||||
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @remark Because EGL is initialized on demand, this function will return
|
||||||
|
* `EGL_NO_DISPLAY` until the first context has been created via EGL.
|
||||||
|
*
|
||||||
* @thread_safety This function may be called from any thread. Access is not
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
@ -424,6 +558,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_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -438,6 +575,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_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
* @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.
|
||||||
*
|
*
|
||||||
@ -448,6 +588,73 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
|||||||
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
|
||||||
|
/*! @brief Retrieves the color buffer associated with the specified window.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose color buffer to retrieve.
|
||||||
|
* @param[out] width Where to store the width of the color buffer, or `NULL`.
|
||||||
|
* @param[out] height Where to store the height of the color buffer, or `NULL`.
|
||||||
|
* @param[out] format Where to store the OSMesa pixel format of the color
|
||||||
|
* buffer, or `NULL`.
|
||||||
|
* @param[out] buffer Where to store the address of the color buffer, or
|
||||||
|
* `NULL`.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer);
|
||||||
|
|
||||||
|
/*! @brief Retrieves the depth buffer associated with the specified window.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose depth buffer to retrieve.
|
||||||
|
* @param[out] width Where to store the width of the depth buffer, or `NULL`.
|
||||||
|
* @param[out] height Where to store the height of the depth buffer, or `NULL`.
|
||||||
|
* @param[out] bytesPerValue Where to store the number of bytes per depth
|
||||||
|
* buffer element, or `NULL`.
|
||||||
|
* @param[out] buffer Where to store the address of the depth buffer, or
|
||||||
|
* `NULL`.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer);
|
||||||
|
|
||||||
|
/*! @brief Returns the `OSMesaContext` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `OSMesaContext` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_NO_WINDOW_CONTEXT.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,90 +1,296 @@
|
|||||||
|
|
||||||
set(common_HEADERS internal.h
|
add_library(glfw ${GLFW_LIBRARY_TYPE}
|
||||||
"${GLFW_BINARY_DIR}/src/glfw_config.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h"
|
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h"
|
||||||
"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h")
|
internal.h platform.h mappings.h
|
||||||
set(common_SOURCES context.c init.c input.c monitor.c vulkan.c window.c)
|
context.c init.c input.c monitor.c platform.c vulkan.c window.c
|
||||||
|
egl_context.c osmesa_context.c null_platform.h null_joystick.h
|
||||||
if (_GLFW_COCOA)
|
null_init.c null_monitor.c null_window.c null_joystick.c)
|
||||||
set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h cocoa_joystick.h
|
|
||||||
posix_tls.h nsgl_context.h)
|
|
||||||
set(glfw_SOURCES ${common_SOURCES} cocoa_init.m cocoa_joystick.m
|
|
||||||
cocoa_monitor.m cocoa_window.m cocoa_time.c posix_tls.c
|
|
||||||
nsgl_context.m)
|
|
||||||
elseif (_GLFW_WIN32)
|
|
||||||
set(glfw_HEADERS ${common_HEADERS} win32_platform.h win32_joystick.h
|
|
||||||
wgl_context.h egl_context.h)
|
|
||||||
set(glfw_SOURCES ${common_SOURCES} win32_init.c win32_joystick.c
|
|
||||||
win32_monitor.c win32_time.c win32_tls.c win32_window.c
|
|
||||||
wgl_context.c egl_context.c)
|
|
||||||
elseif (_GLFW_X11)
|
|
||||||
set(glfw_HEADERS ${common_HEADERS} x11_platform.h xkb_unicode.h
|
|
||||||
linux_joystick.h posix_time.h posix_tls.h glx_context.h
|
|
||||||
egl_context.h)
|
|
||||||
set(glfw_SOURCES ${common_SOURCES} x11_init.c x11_monitor.c x11_window.c
|
|
||||||
xkb_unicode.c linux_joystick.c posix_time.c posix_tls.c
|
|
||||||
glx_context.c egl_context.c)
|
|
||||||
elseif (_GLFW_WAYLAND)
|
|
||||||
set(glfw_HEADERS ${common_HEADERS} wl_platform.h linux_joystick.h
|
|
||||||
posix_time.h posix_tls.h xkb_unicode.h egl_context.h)
|
|
||||||
set(glfw_SOURCES ${common_SOURCES} wl_init.c wl_monitor.c wl_window.c
|
|
||||||
linux_joystick.c posix_time.c posix_tls.c xkb_unicode.c
|
|
||||||
egl_context.c)
|
|
||||||
|
|
||||||
ecm_add_wayland_client_protocol(glfw_SOURCES
|
|
||||||
PROTOCOL
|
|
||||||
${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml
|
|
||||||
BASENAME relative-pointer-unstable-v1)
|
|
||||||
ecm_add_wayland_client_protocol(glfw_SOURCES
|
|
||||||
PROTOCOL
|
|
||||||
${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
|
|
||||||
BASENAME pointer-constraints-unstable-v1)
|
|
||||||
elseif (_GLFW_MIR)
|
|
||||||
set(glfw_HEADERS ${common_HEADERS} mir_platform.h linux_joystick.h
|
|
||||||
posix_time.h posix_tls.h xkb_unicode.h egl_context.h)
|
|
||||||
set(glfw_SOURCES ${common_SOURCES} mir_init.c mir_monitor.c mir_window.c
|
|
||||||
linux_joystick.c posix_time.c posix_tls.c xkb_unicode.c
|
|
||||||
egl_context.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
# The time, thread and module code is shared between all backends on a given OS,
|
||||||
|
# including the null backend, which still needs those bits to be functional
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
# For some reason, CMake doesn't know about .m
|
target_sources(glfw PRIVATE cocoa_time.h cocoa_time.c posix_thread.h
|
||||||
set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C)
|
posix_module.c posix_thread.c)
|
||||||
|
elseif (WIN32)
|
||||||
|
target_sources(glfw PRIVATE win32_time.h win32_thread.h win32_module.c
|
||||||
|
win32_time.c win32_thread.c)
|
||||||
|
else()
|
||||||
|
target_sources(glfw PRIVATE posix_time.h posix_thread.h posix_module.c
|
||||||
|
posix_time.c posix_thread.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS})
|
add_custom_target(update_mappings
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -P "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake" mappings.h.in mappings.h
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
COMMENT "Updating gamepad mappings from upstream repository"
|
||||||
|
SOURCES mappings.h.in "${GLFW_SOURCE_DIR}/CMake/GenerateMappings.cmake"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3")
|
||||||
|
|
||||||
|
if (GLFW_BUILD_COCOA)
|
||||||
|
enable_language(OBJC)
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_COCOA)
|
||||||
|
target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h cocoa_init.m
|
||||||
|
cocoa_joystick.m cocoa_monitor.m cocoa_window.m
|
||||||
|
nsgl_context.m)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WIN32)
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_WIN32)
|
||||||
|
target_sources(glfw PRIVATE win32_platform.h win32_joystick.h win32_init.c
|
||||||
|
win32_joystick.c win32_monitor.c win32_window.c
|
||||||
|
wgl_context.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_X11)
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_X11)
|
||||||
|
target_sources(glfw PRIVATE x11_platform.h xkb_unicode.h x11_init.c
|
||||||
|
x11_monitor.c x11_window.c xkb_unicode.c
|
||||||
|
glx_context.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WAYLAND)
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_WAYLAND)
|
||||||
|
target_sources(glfw PRIVATE wl_platform.h wl_init.c
|
||||||
|
wl_monitor.c wl_window.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_X11 OR GLFW_BUILD_WAYLAND)
|
||||||
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
target_sources(glfw PRIVATE linux_joystick.h linux_joystick.c)
|
||||||
|
endif()
|
||||||
|
target_sources(glfw PRIVATE posix_poll.h posix_poll.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WAYLAND)
|
||||||
|
include(CheckIncludeFiles)
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
check_function_exists(memfd_create HAVE_MEMFD_CREATE)
|
||||||
|
if (HAVE_MEMFD_CREATE)
|
||||||
|
target_compile_definitions(glfw PRIVATE HAVE_MEMFD_CREATE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
|
||||||
|
if (NOT WAYLAND_SCANNER_EXECUTABLE)
|
||||||
|
message(FATAL_ERROR "Failed to find wayland-scanner")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
macro(generate_wayland_protocol protocol_file)
|
||||||
|
set(protocol_path "${GLFW_SOURCE_DIR}/deps/wayland/${protocol_file}")
|
||||||
|
|
||||||
|
string(REGEX REPLACE "\\.xml$" "-client-protocol.h" header_file ${protocol_file})
|
||||||
|
string(REGEX REPLACE "\\.xml$" "-client-protocol-code.h" code_file ${protocol_file})
|
||||||
|
|
||||||
|
add_custom_command(OUTPUT ${header_file}
|
||||||
|
COMMAND "${WAYLAND_SCANNER_EXECUTABLE}" client-header "${protocol_path}" ${header_file}
|
||||||
|
DEPENDS "${protocol_path}"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
add_custom_command(OUTPUT ${code_file}
|
||||||
|
COMMAND "${WAYLAND_SCANNER_EXECUTABLE}" private-code "${protocol_path}" ${code_file}
|
||||||
|
DEPENDS "${protocol_path}"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
target_sources(glfw PRIVATE ${header_file} ${code_file})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
generate_wayland_protocol("wayland.xml")
|
||||||
|
generate_wayland_protocol("viewporter.xml")
|
||||||
|
generate_wayland_protocol("xdg-shell.xml")
|
||||||
|
generate_wayland_protocol("idle-inhibit-unstable-v1.xml")
|
||||||
|
generate_wayland_protocol("pointer-constraints-unstable-v1.xml")
|
||||||
|
generate_wayland_protocol("relative-pointer-unstable-v1.xml")
|
||||||
|
generate_wayland_protocol("fractional-scale-v1.xml")
|
||||||
|
generate_wayland_protocol("xdg-activation-v1.xml")
|
||||||
|
generate_wayland_protocol("xdg-decoration-unstable-v1.xml")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32 AND GLFW_BUILD_SHARED_LIBRARY)
|
||||||
|
configure_file(glfw.rc.in glfw.rc @ONLY)
|
||||||
|
target_sources(glfw PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/glfw.rc")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (UNIX AND GLFW_BUILD_SHARED_LIBRARY)
|
||||||
|
# On Unix-like systems, shared libraries can use the soname system.
|
||||||
|
set(GLFW_LIB_NAME glfw)
|
||||||
|
else()
|
||||||
|
set(GLFW_LIB_NAME glfw3)
|
||||||
|
endif()
|
||||||
|
set(GLFW_LIB_NAME_SUFFIX "")
|
||||||
|
|
||||||
set_target_properties(glfw PROPERTIES
|
set_target_properties(glfw PROPERTIES
|
||||||
OUTPUT_NAME ${GLFW_LIB_NAME}
|
OUTPUT_NAME ${GLFW_LIB_NAME}
|
||||||
VERSION ${GLFW_VERSION}
|
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")
|
||||||
|
|
||||||
target_compile_definitions(glfw PRIVATE -D_GLFW_USE_CONFIG_H)
|
|
||||||
target_include_directories(glfw PUBLIC
|
target_include_directories(glfw PUBLIC
|
||||||
$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>
|
"$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>"
|
||||||
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>)
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
target_include_directories(glfw PRIVATE
|
target_include_directories(glfw PRIVATE
|
||||||
"${GLFW_SOURCE_DIR}/src"
|
"${GLFW_SOURCE_DIR}/src"
|
||||||
"${GLFW_BINARY_DIR}/src"
|
"${GLFW_BINARY_DIR}/src")
|
||||||
${glfw_INCLUDE_DIRS})
|
target_link_libraries(glfw PRIVATE Threads::Threads)
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WIN32)
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_COCOA)
|
||||||
|
target_link_libraries(glfw PRIVATE "-framework Cocoa"
|
||||||
|
"-framework IOKit"
|
||||||
|
"-framework CoreFoundation"
|
||||||
|
"-framework QuartzCore")
|
||||||
|
|
||||||
|
set(glfw_PKG_DEPS "")
|
||||||
|
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation -framework QuartzCore")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WAYLAND)
|
||||||
|
include(FindPkgConfig)
|
||||||
|
|
||||||
|
pkg_check_modules(Wayland REQUIRED
|
||||||
|
wayland-client>=0.2.7
|
||||||
|
wayland-cursor>=0.2.7
|
||||||
|
wayland-egl>=0.2.7
|
||||||
|
xkbcommon>=0.5.0)
|
||||||
|
|
||||||
|
target_include_directories(glfw PRIVATE ${Wayland_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
find_package(EpollShim)
|
||||||
|
if (EPOLLSHIM_FOUND)
|
||||||
|
target_include_directories(glfw PRIVATE ${EPOLLSHIM_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(glfw PRIVATE ${EPOLLSHIM_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_X11)
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_X11_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for XRandR (modern resolution switching and gamma control)
|
||||||
|
if (NOT X11_Xrandr_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "RandR headers not found; install libxrandr development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xrandr_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for Xinerama (legacy multi-monitor support)
|
||||||
|
if (NOT X11_Xinerama_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "Xinerama headers not found; install libxinerama development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xinerama_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for Xkb (X keyboard extension)
|
||||||
|
if (NOT X11_Xkb_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "XKB headers not found; install X11 development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xkb_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for Xcursor (cursor creation from RGBA images)
|
||||||
|
if (NOT X11_Xcursor_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "Xcursor headers not found; install libxcursor development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xcursor_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for XInput (modern HID input)
|
||||||
|
if (NOT X11_Xi_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "XInput headers not found; install libxi development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xi_INCLUDE_PATH}")
|
||||||
|
|
||||||
|
# Check for X Shape (custom window input shape)
|
||||||
|
if (NOT X11_Xshape_INCLUDE_PATH)
|
||||||
|
message(FATAL_ERROR "X Shape headers not found; install libxext development package")
|
||||||
|
endif()
|
||||||
|
target_include_directories(glfw PRIVATE "${X11_Xshape_INCLUDE_PATH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (UNIX AND NOT APPLE)
|
||||||
|
find_library(RT_LIBRARY rt)
|
||||||
|
mark_as_advanced(RT_LIBRARY)
|
||||||
|
if (RT_LIBRARY)
|
||||||
|
target_link_libraries(glfw PRIVATE "${RT_LIBRARY}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lrt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_library(MATH_LIBRARY m)
|
||||||
|
mark_as_advanced(MATH_LIBRARY)
|
||||||
|
if (MATH_LIBRARY)
|
||||||
|
target_link_libraries(glfw PRIVATE "${MATH_LIBRARY}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-lm")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_DL_LIBS)
|
||||||
|
target_link_libraries(glfw PRIVATE "${CMAKE_DL_LIBS}")
|
||||||
|
list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
if (GLFW_USE_HYBRID_HPG)
|
||||||
|
target_compile_definitions(glfw PRIVATE _GLFW_USE_HYBRID_HPG)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Enable a reasonable set of warnings
|
||||||
|
# NOTE: The order matters here, Clang-CL matches both MSVC and Clang
|
||||||
|
if (MSVC)
|
||||||
|
target_compile_options(glfw PRIVATE "/W3")
|
||||||
|
elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR
|
||||||
|
CMAKE_C_COMPILER_ID STREQUAL "Clang" OR
|
||||||
|
CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
|
||||||
|
|
||||||
|
target_compile_options(glfw PRIVATE "-Wall")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_WIN32)
|
||||||
|
target_compile_definitions(glfw PRIVATE UNICODE _UNICODE)
|
||||||
|
endif()
|
||||||
|
|
||||||
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
|
||||||
# the inclusion of stddef.h (by glfw3.h), which is itself included before
|
# the inclusion of stddef.h (by glfw3.h), which is itself included before
|
||||||
# win32_platform.h. We define them here until a saner solution can be found
|
# win32_platform.h. We define them here until a saner solution can be found
|
||||||
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
|
||||||
target_compile_definitions(glfw PRIVATE
|
if (MINGW)
|
||||||
"$<$<BOOL:${MINGW}>:UNICODE;WINVER=0x0501>")
|
target_compile_definitions(glfw PRIVATE WINVER=0x0501)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Enable a reasonable set of warnings (no, -Wextra is not reasonable)
|
# Workaround for legacy MinGW not providing XInput and DirectInput
|
||||||
target_compile_options(glfw PRIVATE
|
if (MINGW)
|
||||||
"$<$<C_COMPILER_ID:Clang>:-Wall>"
|
include(CheckIncludeFile)
|
||||||
"$<$<C_COMPILER_ID:GNU>:-Wall>")
|
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()
|
||||||
|
|
||||||
if (BUILD_SHARED_LIBS)
|
# Workaround for the MS CRT deprecating parts of the standard library
|
||||||
|
if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
|
||||||
|
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Workaround for -std=c99 on Linux disabling _DEFAULT_SOURCE (POSIX 2008 and more)
|
||||||
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
target_compile_definitions(glfw PRIVATE _DEFAULT_SOURCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLFW_BUILD_SHARED_LIBRARY)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
# Remove the lib prefix on the DLL (but not the import library
|
# Remove the dependency on the shared version of libgcc
|
||||||
|
# NOTE: MinGW-w64 has the correct default but MinGW needs this
|
||||||
|
target_link_libraries(glfw PRIVATE "-static-libgcc")
|
||||||
|
|
||||||
|
# Remove the lib prefix on the DLL (but not the import library)
|
||||||
set_target_properties(glfw PROPERTIES PREFIX "")
|
set_target_properties(glfw PROPERTIES PREFIX "")
|
||||||
|
|
||||||
# Add a suffix to the import library to avoid naming conflicts
|
# Add a suffix to the import library to avoid naming conflicts
|
||||||
@ -93,28 +299,65 @@ if (BUILD_SHARED_LIBS)
|
|||||||
# Add a suffix to the import library to avoid naming conflicts
|
# Add a suffix to the import library to avoid naming conflicts
|
||||||
set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib")
|
set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib")
|
||||||
endif()
|
endif()
|
||||||
elseif (APPLE)
|
set (GLFW_LIB_NAME_SUFFIX "dll")
|
||||||
# Add -fno-common to work around a bug in Apple's GCC
|
|
||||||
target_compile_options(glfw PRIVATE "-fno-common")
|
|
||||||
|
|
||||||
set_target_properties(glfw PROPERTIES
|
target_compile_definitions(glfw INTERFACE GLFW_DLL)
|
||||||
INSTALL_NAME_DIR "lib${LIB_SUFFIX}")
|
endif()
|
||||||
elseif (UNIX)
|
|
||||||
|
if (MINGW)
|
||||||
|
# Enable link-time exploit mitigation features enabled by default on MSVC
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
|
||||||
|
# Compatibility with data execution prevention (DEP)
|
||||||
|
cmake_push_check_state()
|
||||||
|
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()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
|
# Compatibility with address space layout randomization (ASLR)
|
||||||
|
cmake_push_check_state()
|
||||||
|
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()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
|
# Compatibility with 64-bit address space layout randomization (ASLR)
|
||||||
|
cmake_push_check_state()
|
||||||
|
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()
|
||||||
|
cmake_pop_check_state()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (UNIX)
|
||||||
# Hide symbols not explicitly tagged for export from the shared library
|
# Hide symbols not explicitly tagged for export from the shared library
|
||||||
target_compile_options(glfw PRIVATE "-fvisibility=hidden")
|
target_compile_options(glfw PRIVATE "-fvisibility=hidden")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_compile_definitions(glfw INTERFACE -DGLFW_DLL)
|
|
||||||
target_link_libraries(glfw PRIVATE ${glfw_LIBRARIES})
|
|
||||||
else()
|
|
||||||
target_link_libraries(glfw INTERFACE ${glfw_LIBRARIES})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
list(JOIN glfw_PKG_DEPS " " deps)
|
||||||
target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)
|
list(JOIN glfw_PKG_LIBS " " libs)
|
||||||
endif()
|
|
||||||
|
set(GLFW_PKG_CONFIG_REQUIRES_PRIVATE "${deps}" CACHE INTERNAL
|
||||||
|
"GLFW pkg-config Requires.private")
|
||||||
|
set(GLFW_PKG_CONFIG_LIBS_PRIVATE "${libs}" CACHE INTERNAL
|
||||||
|
"GLFW pkg-config Libs.private")
|
||||||
|
|
||||||
|
configure_file("${GLFW_SOURCE_DIR}/CMake/glfw3.pc.in" glfw3.pc @ONLY)
|
||||||
|
|
||||||
if (GLFW_INSTALL)
|
if (GLFW_INSTALL)
|
||||||
install(TARGETS glfw EXPORT glfwTargets DESTINATION lib${LIB_SUFFIX})
|
install(TARGETS glfw
|
||||||
|
EXPORT glfwTargets
|
||||||
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||||
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user