Compare commits

..

240 Commits

Author SHA1 Message Date
Camilla Berglund eab31f228f Added description of 3.0.4 release. 2013-12-31 20:06:18 +01:00
Camilla Berglund d937b74b8f Fixed glfwSetWindowSize stealing focus. 2013-12-28 20:56:57 +01:00
Camilla Berglund 0e8dace18c Removed stray whitespace in version string. 2013-12-24 00:48:28 +01:00
Camilla Berglund b17bed28c8 Added note on gdi32 as non-defaultlib on MinGW.
Some versions of MinGW do not include gdi32 among the default libraries
for Win32 subsystem binaries.
2013-12-23 00:53:04 +01:00
Camilla Berglund 4eea3175f1 Re-worded OS X context creation limits. 2013-12-18 12:42:05 +01:00
Camilla Berglund cf458fa7a2 Formatting. 2013-12-11 14:41:51 +01:00
Camilla Berglund 8ac7cab100 Added notes on API headers. 2013-12-11 14:38:27 +01:00
Camilla Berglund 0108a6bdeb Added credit. 2013-12-10 13:45:21 +01:00
Camilla Berglund 402189ba14 Fixed pthread.h not included by GLX header. 2013-12-10 00:47:19 +01:00
Camilla Berglund 61ccb034d0 Formatting. 2013-12-09 00:27:36 +01:00
Camilla Berglund 50c694fab4 Added errors for override redirect iconification. 2013-12-08 14:59:52 +01:00
Camilla Berglund a18b187494 Expanded cursor mode descriptions. 2013-12-05 03:27:12 +01:00
Camilla Berglund 5668eb0732 Added paragraph on object sharing. 2013-12-05 03:17:45 +01:00
Camilla Berglund 56e600d7a1 Fixed iconify callback not triggered by Alt+Tab. 2013-12-05 02:19:41 +01:00
Camilla Berglund 2ae46fa90a Added notes on window refresh. 2013-12-04 19:14:33 +01:00
Camilla Berglund 0c0bb28d39 Allow setting swap interval to zero on DWM. 2013-12-04 08:00:53 +01:00
Camilla Berglund ed98e06651 Clarified WGL missing OpenGL error. 2013-12-04 05:35:36 +01:00
Camilla Berglund 06289110e7 Documented utility functions. 2013-11-24 23:31:26 +01:00
Camilla Berglund 8443848637 Updated swap interval notes. 2013-11-24 23:31:15 +01:00
Camilla Berglund 823cc38ac1 Cleanup. 2013-11-20 20:04:00 +01:00
Camilla Berglund 5ef4f77fb5 Added support for _NET_WM_BYPASS_COMPOSITOR. 2013-11-20 19:59:17 +01:00
Camilla Berglund e0ee90d50c Fixed news item tag name. 2013-11-20 15:37:08 +01:00
Camilla Berglund 171538d01c Grammar fix. 2013-11-20 15:33:40 +01:00
Camilla Berglund c21745c886 Added reference to manual compilation guide. 2013-11-20 15:28:30 +01:00
Camilla Berglund 2db0401a57 Removed excuse. 2013-11-20 15:08:53 +01:00
Camilla Berglund 9979da59e3 Manual compilation guide work. 2013-11-20 14:37:04 +01:00
Camilla Berglund 8b1b322771 Added manual compilation guide. 2013-11-20 14:27:05 +01:00
Camilla Berglund 0ccbddf767 Moved version number macro to internal.h.
This lets alternative build environments avoid having to manually keep
track of which version of GLFW is being built.
2013-11-20 13:58:57 +01:00
Camilla Berglund 23021422f3 Added explicit configuration header macro. 2013-11-20 12:06:07 +01:00
Camilla Berglund bb3f29d8bc Added note on profile detection. 2013-11-19 17:57:08 +01:00
Camilla Berglund 87e6417353 Added hack detecting ARB_compatibility. 2013-11-18 12:14:51 +01:00
Camilla Berglund 95c7029e19 Formatting. 2013-11-18 12:06:39 +01:00
Camilla Berglund 45368f410a Fixed warnings from Clang static analysis. 2013-11-14 13:42:29 +01:00
Camilla Berglund a79b93f5bc Avoid X11 video mode setting if modes match.
This matches the behavior of the Windows port.
2013-11-14 12:59:08 +01:00
Camilla Berglund 4fe88a52fa Added credit. 2013-11-13 12:59:49 +01:00
Camilla Berglund a5b6a306ae Added note. 2013-11-13 12:47:44 +01:00
Camilla Berglund 109e3d13ed Fixed reporting of negative window positions.
MSDN recommends LOWORD and HIWORD for WM_MOVE, but these do not
handle negative window positions correctly.

Fixes #172.
2013-11-13 12:39:41 +01:00
Camilla Berglund 7af99bce88 Fixed cursor centering for odd window sizes. 2013-11-13 12:39:40 +01:00
Camilla Berglund d82095d7ea Changed from PREFIX to CMAKE_INSTALL_PREFIX. 2013-11-10 15:43:25 +01:00
Camilla Berglund 76afd41727 Added X error reporting to window creation failure. 2013-11-10 14:12:07 +01:00
Camilla Berglund bc625b21b3 Removed completed todo. 2013-11-10 14:03:34 +01:00
Camilla Berglund adbd52ba27 Formatted todos and notes. 2013-11-10 14:03:07 +01:00
Camilla Berglund b9d4875f3e Improved documentation of hacks. 2013-11-10 13:56:27 +01:00
Camilla Berglund a79c844c4d Oh dear. 2013-11-10 03:31:10 +01:00
Camilla Berglund b13c84f854 Removed joystick axis value negation on OS X. 2013-11-07 20:45:29 +01:00
Camilla Berglund b410cff68c Updated change log. 2013-11-07 20:36:45 +01:00
Camilla Berglund 4013f733fe Reverted change of IOKit functions.
The previously used set of functions caused a regression where no axes
or buttons were reported.  Fixes #78.
2013-11-07 20:19:30 +01:00
Camilla Berglund cc4c7167fd Fixed joysticks test segfault. 2013-11-07 19:29:33 +01:00
Camilla Berglund 6c12ffc902 Added the GLFW_BUILD_DOCS CMake option. 2013-11-07 18:23:54 +01:00
Camilla Berglund a83d257ac6 Moved application activation to window showing.
Fixes #93.
2013-11-07 18:07:46 +01:00
Camilla Berglund ec5cb9c6f7 Moved to Cocoa for transformation and activation. 2013-11-07 18:03:39 +01:00
Camilla Berglund e7c7ebf665 Added workaround for 10.9 SDK type definitions. 2013-11-07 17:20:06 +01:00
Camilla Berglund cc7f0bd532 Fixed crash retrieving the name of some displays. 2013-11-07 16:28:07 +01:00
Camilla Berglund 97ae40496d Added reporting of extension string retrieval failure. 2013-11-07 15:17:25 +01:00
Camilla Berglund e4a87b8a1c Added Compiz to bug fix entry. 2013-11-03 16:08:35 +01:00
Camilla Berglund f18aef4aec Removed fixed @bug. 2013-11-03 14:17:03 +01:00
Camilla Berglund 1cbd06c8a2 Fixed hidden window positioning on Metacity. 2013-11-03 13:51:34 +01:00
Camilla Berglund 785e68bb0d Added flag descriptions to glfwinfo -h. 2013-11-03 13:38:45 +01:00
Camilla Berglund 86e50b1044 Placed glfwinfo version test after getopt. 2013-11-03 13:29:21 +01:00
Camilla Berglund eabbb20d17 Added NULL test for glGetStringi. 2013-11-01 13:55:33 +01:00
Camilla Berglund 0153dab346 Clarified WGL re-creation comment. 2013-10-28 14:50:33 +01:00
Camilla Berglund 1a4ffa497a Added credit. 2013-10-28 13:22:34 +01:00
Camilla Berglund 58045a5c07 Added Lion full scren menu item. 2013-10-28 13:01:58 +01:00
Camilla Berglund 7d1ae7aea7 Cleaned up Win32 timer. 2013-10-28 12:14:50 +01:00
Camilla Berglund 174c72f2c0 Moved GLFW compilation guide to docs. 2013-10-27 12:53:50 +01:00
Camilla Berglund b9fb45f408 Documentation updates. 2013-10-27 11:03:47 +01:00
Camilla Berglund 9c4b925a96 Updated extension headers. 2013-10-27 09:45:15 +01:00
Camilla Berglund 394c44ccf9 More words on window closing. 2013-10-25 15:55:24 +02:00
Camilla Berglund baf100f78c Merge pull request #159 from metajack/fix-10-7-build
Fixed build on OS X 10.7.
2013-10-24 01:31:29 -07:00
Jack Moffitt 5be45d214b Fix build on Mac OS X 10.7 Lion.
`CVDisplayLinkRef` needs an extra header file, and `NSAppKitVersionNumber10_7`
wasn't added until 10.8so use `> NSAppKitVersionNumber10_6` instead.
2013-10-24 02:24:34 -06:00
Camilla Berglund e309a784d1 Documentation work. 2013-10-21 22:39:51 +02:00
Camilla Berglund 99f40ede1b Documentation work. 2013-10-21 22:35:22 +02:00
Camilla Berglund db8e6bed7a Cross-linked build guides. 2013-10-21 22:23:15 +02:00
Camilla Berglund 6172e2cfcc Fixed change log entry. 2013-10-21 17:46:05 +02:00
Camilla Berglund bc8ff545ca Fixed mode enumeration for Thunderbolt monitors. 2013-10-17 20:43:39 +02:00
Camilla Berglund e576bdc894 Removed joystick axis value negation. 2013-10-17 20:09:00 +02:00
Camilla Berglund d78510457c Added hack for full screen focus on OS X. 2013-10-17 19:59:34 +02:00
Camilla Berglund dbdf01d4a0 Added getopt dependency to events text. 2013-10-17 15:35:01 +02:00
Camilla Berglund 7ef7beb9fb Formatting. 2013-10-17 15:16:27 +02:00
Camilla Berglund 16e63adc40 Tenative setting of install_name. 2013-10-16 20:56:59 +02:00
Camilla Berglund e85455719d Point made. 2013-10-16 20:33:28 +02:00
Camilla Berglund 23ff318f59 Replaced find_library with CMAKE_DL_LIBS. 2013-10-13 16:24:33 +02:00
Camilla Berglund 0041699048 Fixed glfw3.pc not using LIB_SUFFIX. 2013-10-12 20:22:48 +02:00
Camilla Berglund a5df39e14f Added section on user pointer to window guide. 2013-10-12 20:00:16 +02:00
Camilla Berglund 4175c9edea Merge pull request #155 from siavashserver/master
Fixed page header background image location.
2013-10-12 10:20:40 -07:00
siavash 1695fd08f0 Fixed page header background image location. 2013-10-11 23:11:11 +03:30
Camilla Berglund 2c920fbb8b Clarified character callback parameter. 2013-10-10 19:41:56 +02:00
Camilla Berglund 7dd8770e6f Added full screen option to events test. 2013-10-10 00:17:53 +02:00
Camilla Berglund 9c15e2ff86 Enabled Lion full screen. 2013-10-10 00:09:03 +02:00
Camilla Berglund 7775c87cd6 Cleanup and change log update. 2013-10-09 23:58:43 +02:00
Camilla Berglund 1047d5646d Merge pull request #139 from Pieroman/patch-1
Fixed full screen windows blanking unused monitors.
2013-10-09 14:47:41 -07:00
Camilla Berglund fa765ee719 Removed DOS line breaks. 2013-10-09 21:35:35 +02:00
Camilla Berglund 50850602b2 Clarified change log entries. 2013-10-09 21:12:03 +02:00
Camilla Berglund 553cc8ac96 Clarified change log entry. 2013-10-09 20:24:57 +02:00
Camilla Berglund f2a04a56a4 Added CoreVideo dependency to change log. 2013-10-09 20:23:20 +02:00
Camilla Berglund a8ff81fd8a Updated .gitignore. 2013-10-09 19:46:44 +02:00
Camilla Berglund aab08712dd Fixed zero refresh rate on some monitors. 2013-10-09 19:45:39 +02:00
Andri Pálsson 99784fb8f0 Fixed hidden cursor positioning corner case. 2013-10-09 19:06:03 +02:00
Camilla Berglund 0e7c6e1d82 Updated change log. 2013-10-09 11:58:08 +02:00
Camilla Berglund 4e3c990656 Updated change log. 2013-10-08 19:45:17 +02:00
Camilla Berglund e9694cca47 Merge pull request #152 from sjml/master
Fixed minor Xcode 5 warnings.
2013-10-08 10:43:55 -07:00
Shane Liesegang 9e0c07b7ba Fixing Xcode 5 warning
Xcode 5 has gotten more pedantic about undeclared selectors, by
default.
2013-10-08 10:49:00 -04:00
Shane Liesegang 209de7b56d Removing warnings when building Cocoa in 64-bit
NSInteger is defined as the native integer width, so these changes
remove implicit conversions that were causing precision warnings.
2013-10-08 10:42:17 -04:00
Camilla Berglund 16a8fafab2 Made disabled mode disable Win32 cursor image. 2013-10-07 16:28:19 +02:00
Camilla Berglund 6e68d89e0f Fixed focus for Win+D window restoration. 2013-10-07 16:12:23 +02:00
Camilla Berglund 9c5d9f8614 Fixed clip rect being set for unfocused windows. 2013-10-07 15:30:57 +02:00
Camilla Berglund 161065ac19 Clarified configuration header comments. 2013-10-06 11:45:28 +02:00
Camilla Berglund 2053767709 Added credit. 2013-10-06 11:37:16 +02:00
Camilla Berglund 55530dbd14 Merge pull request #149 from andrewcorrigan/master
Added glfw_ prefix to configuration header.
2013-10-04 08:47:29 -07:00
Camilla Berglund 12f0d8d4ca Build documentation grammar fix. 2013-10-04 17:08:04 +02:00
Andrew Corrigan 34f1c298b6 config.h.in --> glfw_config.h.in 2013-10-04 09:41:08 -04:00
Camilla Berglund 8194f1e2ae Added hack for setting WM_CLASS. 2013-10-04 13:41:19 +02:00
Camilla Berglund a7af3b2c8f Put GLFW_CLIENT_LIBRARY into correct section. 2013-10-04 13:13:16 +02:00
Camilla Berglund 6d9d85670f Clarified unit of cursor positions. 2013-09-28 22:12:50 +02:00
Camilla Berglund 521fa7d005 Added crossrefs for window and fb size. 2013-09-26 20:02:19 +02:00
Camilla Berglund 5759d0fdf2 Fixed F13 being reported as PrtSc on OS X. 2013-09-26 19:58:35 +02:00
Camilla Berglund 07db5daa61 Added note on GDI software OpenGL. 2013-09-26 19:15:45 +02:00
Camilla Berglund 201d0a78b1 Fixed Grave and World 1 being flipped. 2013-09-26 00:00:07 +02:00
Camilla Berglund 1f6696d433 Added references to build guide. 2013-09-24 22:17:35 +02:00
Camilla Berglund 59422ec980 Started 3.0.4. 2013-09-24 21:36:11 +02:00
Camilla Berglund fd3813f0d9 Updated notes referring to Mac OS X. 2013-09-24 21:34:46 +02:00
Camilla Berglund 25eb8dc277 Removed index.html from URL. 2013-09-24 21:32:21 +02:00
Camilla Berglund ebe38eedd8 Merge pull request #141 from siavashserver/doxygen-theme
Added Doxygen documentation theme.
2013-09-21 12:49:41 -07:00
siavash 96c5aea3ba Removed invisible element. 2013-09-21 15:18:49 +04:30
siavash cca61d752d New theme for doxygen generated documentations. 2013-09-21 15:14:37 +04:30
Camilla Berglund 6af51e049f Added more detailed notes on some CMake options. 2013-09-19 22:24:03 +02:00
Camilla Berglund 3af1c411ca Added notes on swap interval defaults. 2013-09-19 21:37:01 +02:00
Pieroman d3f22b8a04 Fixed Mac OS X bug where request for one fullscreen window blacks out other monitors 2013-09-19 21:33:44 +02:00
Camilla Berglund fd4ea8bc25 Added description of 3.0.3 release. 2013-09-19 14:30:47 +02:00
Camilla Berglund d3f3e2d6c5 Removed unused flag. 2013-09-19 01:12:50 +02:00
Camilla Berglund 546c794321 Fixed OS X cursor bugs #3, #72 and #88. 2013-09-19 01:05:51 +02:00
Camilla Berglund d69796d9e0 Updated menu label for minimization. 2013-09-16 15:58:05 +02:00
Camilla Berglund 4ff8095dee Workaround for libXi and CMake 2.8.7. 2013-09-13 14:42:45 +02:00
Camilla Berglund 3415f3ccde Conditionally define API version macros. 2013-09-13 12:27:43 +02:00
Camilla Berglund 6770ae0556 Added workaround for legacy MinGW.
When building on legacy MinGW, WINVER and UNICODE need to be defined
before the inclusion of stddef.h (by glfw3.h), which is itself included
before win32_platform.h.
2013-09-13 12:26:55 +02:00
Camilla Berglund bb5581690d Documentation fixes for glfwSetCursorPos. 2013-09-09 23:31:59 +02:00
Camilla Berglund 57b8be1c24 Added support for mouse buttons 4-n. 2013-09-08 16:09:23 +02:00
Camilla Berglund c93b120252 Disabled stddef.h for GLFW_INCLUDE_NONE, cleanup. 2013-09-08 16:07:34 +02:00
Camilla Berglund 5cf8587269 Merge pull request #121 from Systemcluster/patch-1
Declared unnamed typedef structs as their types.
2013-09-03 04:51:29 -07:00
Camilla Berglund b998d4fe01 Fixed _WIN32_WINNT not being set to Windows XP. 2013-09-03 13:38:16 +02:00
Systemcluster d0a0e37b2b Declared unnamed typedef structs as their types
Without defining them as structs it was impossible to forward declare `GLFWgammaramp` and `GLFWvidmode`.
2013-08-29 06:15:55 +02:00
Camilla Berglund 3f74712540 Updated NSGL error tag. 2013-08-26 22:48:07 +02:00
Camilla Berglund 124bc392ab Removed stale comment. 2013-08-26 20:18:49 +02:00
Camilla Berglund 8c1588b14e Started 3.0.3. 2013-08-26 16:22:06 +02:00
Camilla Berglund 58aef89521 Made release description match website. 2013-08-25 21:40:06 +02:00
Camilla Berglund f54b4e174d Fixed error code for missing GLES. 2013-08-21 11:56:48 +02:00
Camilla Berglund 83f57ff0ce Fixed potential segfault on init. 2013-08-21 10:15:52 +02:00
Camilla Berglund 71c07feffd Added description of 3.0.2 release. 2013-08-20 12:46:32 +02:00
Camilla Berglund 9c20737b60 Allowed characters regardless of modifier keys. 2013-08-19 13:08:35 +02:00
Camilla Berglund 951f02acf3 Fixed keypad 5 release events. 2013-08-16 17:48:11 +02:00
Camilla Berglund 735bc2d815 Added NvOptimusEnablement. 2013-08-07 18:11:58 +02:00
Camilla Berglund a024e61bf8 Build documentation improvements. 2013-08-07 17:53:19 +02:00
Camilla Berglund 082fc019c7 Build documentation improvements. 2013-08-07 17:17:15 +02:00
Camilla Berglund ffb699fb06 Build documentation improvements. 2013-08-07 17:05:32 +02:00
Camilla Berglund d318de7c00 Expanded section on X11 and Mesa packages. 2013-08-07 16:01:38 +02:00
Camilla Berglund 68bd6687d6 Formatting. 2013-08-07 15:30:15 +02:00
Camilla Berglund a3ca7ad93a Removed cursor centering XFlush hack. 2013-08-06 20:48:31 +02:00
Camilla Berglund 261f290abf Fixed original video mode being overwritten. 2013-08-06 19:52:09 +02:00
Camilla Berglund 63a191eb8d Added clearing of callbacks on terminate. 2013-07-30 17:06:06 +02:00
arturo a6a5fa937c Fixed window position being incorrect on some WMs. 2013-07-30 15:52:47 +02:00
Camilla Berglund 670070e61a Updated change log. 2013-07-30 15:02:08 +02:00
Camilla Berglund 3cfc400cf9 Simplified source file comment headers. 2013-07-30 14:46:52 +02:00
Camilla Berglund 6e85924bd3 Replaced selector test with NSAppKitVersionNumber. 2013-07-30 14:46:51 +02:00
Camilla Berglund f7282e86c0 Added pointer swap macro for callback setters. 2013-07-30 14:44:56 +02:00
Camilla Berglund 9d0e102135 Fixed glfwCreateWindow return value semantics. 2013-07-30 14:44:56 +02:00
Camilla Berglund 5b8ff4a2fc Merge pull request #102 from shurcooL/patch-1
Fixed OS X precise scrolling delta logic.
2013-07-25 03:44:36 -07:00
Dmitri Shuralyov c99b7fe7da Fixed #if-guard logic and signature for hasPreciseScrollingDeltas. 2013-07-24 23:06:58 -07:00
Camilla Berglund bd2d571c31 Added explanation for #error. 2013-07-23 13:44:39 +02:00
Camilla Berglund bea59f64b2 Enabled inclusion of stddef.h on all platforms.
The OS X gl.h defines section macros that prevents glext.h from
including stddef.h, leaving it undeclared when it's later used.
2013-07-23 00:20:23 +02:00
Camilla Berglund 00d004a528 Updated extension headers. 2013-07-23 00:12:09 +02:00
Camilla Berglund 53cf4a3b4d Merge pull request #95 from shurcooL/master
Added support for Cocoa precise scrolling deltas.
2013-07-21 14:08:50 -07:00
Camilla Berglund 7e8c7843c5 Updated extension headers. 2013-07-21 14:08:55 +02:00
Dmitri Shuralyov 5655e26315 Changed scrollWheel to use precise scrolling deltas when available.
Use precise scrolling deltas only on supported versions of OS X;
hasPreciseScrollingDeltas, scrollingDeltaX, scrollingDeltaY are
available in OS X v10.7 and later.
Replaced a single occurence of a tab character with 4 spaces for
consistency in src/socoa_window.m.
2013-07-17 19:36:43 -07:00
siavash 0463e196b4 Cleanup of size_t use. 2013-07-15 18:37:02 +02:00
siavash b12c973922 Moved X11 character translation failure test. 2013-07-15 18:28:09 +02:00
Camilla Berglund f1397843ee Added GLFW_OPENED to transition guide. 2013-07-11 14:01:06 +02:00
Camilla Berglund 6632cc7c1d Tagged close flag for use from secondary threads. 2013-07-11 02:00:48 +02:00
Camilla Berglund 45653c5549 Cleaned up X error handler work. 2013-07-11 01:32:46 +02:00
Camilla Berglund f67c7b49ab Merge pull request #86 from siavashserver/master
Added utility functions for X11 error handler.
2013-07-10 15:46:49 -07:00
Camilla Berglund 50b2961d34 Moved to auto-updated docs URLs. 2013-07-10 17:00:09 +02:00
Camilla Berglund d10eff4531 Updated OS X OpenGL compatibility docs. 2013-07-10 15:47:32 +02:00
Camilla Berglund e67ee935a2 Fixed documentation tag name. 2013-07-10 15:39:08 +02:00
Camilla Berglund 41a1374744 Updated references to OS X (previously Mac OS X). 2013-07-10 15:38:31 +02:00
Camilla Berglund c8b01f61d6 Enabled OpenGL 3.x and 4.x context on OS X 10.9. 2013-07-10 15:03:14 +02:00
siavash 3b4eb2f0a0 Added blank cursor creation error checking on X11. 2013-07-09 21:08:21 +04:30
Camilla Berglund d20aa0428a Fixed window positioning on OS X. 2013-07-09 17:08:26 +02:00
Camilla Berglund 1c80e99008 Added forcing of swap interval on DWM composition. 2013-07-08 00:32:23 +02:00
Camilla Berglund 0e12fb869c Merge pull request #84 from Nibe/cursor-fix
Fixed saved cursor position not being restored.
2013-07-07 15:31:17 -07:00
Niklas Behrens a55c3f48eb Fix incorrect cursor position
When reactivating the cursor its position was updated visually but not
internally which caused glfwGetCursorPos to return wrong values.
2013-07-07 22:05:29 +02:00
Camilla Berglund 4b7ae4918b Documentation work. 2013-07-07 12:59:30 +02:00
siavash 763ec6cbcb Cleanup. 2013-07-05 14:29:12 +02:00
Camilla Berglund dcb4d8ee32 Fixed possible X11 screensaver race condition. 2013-07-04 17:52:15 +02:00
Camilla Berglund 58c69a9ac4 Enabled compilation on OS X 10.6 SDK. 2013-07-04 15:02:01 +02:00
Camilla Berglund 7a03ca8dbc Removed superflous casts of allocated memory. 2013-07-04 14:54:07 +02:00
Camilla Berglund d7512f529c Clarified names of gamma array helper functions. 2013-07-04 14:52:58 +02:00
Camilla Berglund 209a470a5f Replaced all uses of malloc with calloc. 2013-07-04 14:20:14 +02:00
Camilla Berglund 1947557eb1 Documentation work. 2013-07-04 13:05:19 +02:00
Camilla Berglund 621753e8a8 Added credit. 2013-07-01 13:18:05 +02:00
Camilla Berglund fca5a4687c Merge pull request #73 from waywardmonkeys/typo-fixes
Fixed typo.
2013-06-30 11:47:44 -07:00
Bruce Mitchener 5f37d36d4a Fix typo. 2013-06-27 17:28:31 +07:00
Camilla Berglund 2656bf8f9f Added missing module handle freeing. 2013-06-26 14:04:07 +02:00
Camilla Berglund 194e22dbbe Fixed retrieval of OpenGL 1.0 and 1.1 on WGL. 2013-06-26 13:57:09 +02:00
Camilla Berglund 4883073b91 Cleanup. 2013-06-24 14:38:00 +02:00
Camilla Berglund a17dad4f44 Updated contact information. 2013-06-24 14:28:42 +02:00
Camilla Berglund 2ce9e8e6b2 Fixed clipboard string leaks.
The clipboard string was not by the Win32 and Cocoa ports on terminate.
2013-06-24 14:08:55 +02:00
Camilla Berglund b6b57b5249 Documentation work. 2013-06-23 15:17:43 +02:00
Camilla Berglund 659157928e Client build documentation work. 2013-06-21 13:04:47 +02:00
Camilla Berglund 933005a022 Corrected comment. 2013-06-19 13:49:51 +02:00
Camilla Berglund 3be3f58a92 Cleanup. 2013-06-19 13:47:19 +02:00
Camilla Berglund e11a5e3973 Fixed resizing for full screen override redirect. 2013-06-19 13:47:19 +02:00
Camilla Berglund 96259004be Merge pull request #60 from Cloudef/EGL
Explicitly cast default EGL display.
2013-06-19 03:09:07 -07:00
Jari Vetoniemi 5c54987285 Typecast EGL types to get rid of compile warnings 2013-06-17 19:25:41 +03:00
Camilla Berglund c10bf9ba9c Fixed incorrect hint default.
The default for the GLFW_ALPHA_BITS hint was zero instead of 8.
2013-06-17 17:42:25 +02:00
Camilla Berglund 5ae2e376a2 Added missing file to .gitignore. 2013-06-17 17:36:52 +02:00
Camilla Berglund f5f55e3ff8 Documentation work. 2013-06-17 14:15:35 +02:00
Camilla Berglund 10017b27bb Cleanup. 2013-06-17 12:46:51 +02:00
Camilla Berglund 1de60a4ff7 Started 3.0.2. 2013-06-17 12:46:44 +02:00
Camilla Berglund 01ccc56423 Added missing headers to library target. 2013-06-17 10:31:25 +02:00
Camilla Berglund 305c66db31 Cleanup. 2013-06-17 10:25:17 +02:00
Camilla Berglund 22e1aa6cfc Fixed process transform when no menu bar. 2013-06-16 20:30:36 +02:00
Camilla Berglund 1c79d8a8e4 Added release description. 2013-06-16 20:04:18 +02:00
Kyle McDonald d5cd6ec8eb Restored support for Mac OS X 10.6.
Modified during merge.
2013-06-16 18:46:20 +02:00
Camilla Berglund eba8168a03 Fixed glfwGetFramebufferSize on OS X. 2013-06-16 18:32:16 +02:00
Camilla Berglund a7ff236b32 Fixed duplicate events being reported. 2013-06-16 18:29:46 +02:00
Camilla Berglund d31322cdcd Added option for disabling install. 2013-06-16 13:31:39 +02:00
Camilla Berglund 61f7de5a25 Updated credits and changelog. 2013-06-16 12:36:56 +02:00
Camilla Berglund e4d9e03efc Merge pull request #48 from Nibe/xf86vmode-fix
Fix variable name for xf86vmode library.
2013-06-16 03:32:46 -07:00
Niklas Behrens bff77eeed1 Fix variable name for xf86vmode lib
CMake bug 0006976 has been fixed. However, the variable name is
different than expected.
2013-06-16 03:17:20 +02:00
Camilla Berglund e93bade240 Fixed docs for glfwGetJoystickButtons. 2013-06-16 02:33:33 +02:00
Camilla Berglund f1c88b41f2 Fixed bad reference in documentation. 2013-06-14 12:12:16 +02:00
Camilla Berglund 77e4c61190 Fixed broken WGL error detection.
Context creation was attempted even if no valid pixel formats had been
found during enumeration.
2013-06-13 18:29:21 +02:00
Camilla Berglund 3a5fcfba06 Removed more version noise. 2013-06-13 15:09:52 +02:00
Camilla Berglund c9bd191edb Removed version noise. 2013-06-13 15:07:28 +02:00
Camilla Berglund 77572bdf6e Fixed line terminators. 2013-06-13 12:24:07 +02:00
Camilla Berglund ccb810bed9 It's not an error. 2013-06-13 12:21:16 +02:00
Camilla Berglund fdaebdd169 Removed 'unfinished' claim. 2013-06-13 12:12:45 +02:00
Camilla Berglund 74d355fae4 News page fixes. 2013-06-13 12:12:10 +02:00
Camilla Berglund 2cc2e8acd7 Added cursor crossing callback to news. 2013-06-13 12:08:42 +02:00
Camilla Berglund dbef5ea46b Grammar fix. 2013-06-13 12:06:51 +02:00
Camilla Berglund c38f33adda Started 3.0.1. 2013-06-13 12:05:23 +02:00
79 changed files with 12839 additions and 14027 deletions
+2 -1
View File
@@ -21,7 +21,7 @@ cmake_uninstall.cmake
docs/Doxyfile docs/Doxyfile
docs/html docs/html
docs/warnings.txt docs/warnings.txt
src/config.h src/glfw_config.h
src/glfw3.pc src/glfw3.pc
src/glfwConfig.cmake src/glfwConfig.cmake
src/glfwConfigVersion.cmake src/glfwConfigVersion.cmake
@@ -38,6 +38,7 @@ src/libglfw3.a
src/glfw3.lib src/glfw3.lib
src/glfw3.dll src/glfw3.dll
src/glfw3dll.lib src/glfw3dll.lib
src/glfw3dll.a
examples/*.app examples/*.app
examples/*.exe examples/*.exe
examples/boing examples/boing
-18
View File
@@ -1,18 +0,0 @@
This directory contains a collection of toolchain definitions for
cross-compiling for Windows using MinGW on various other systems.
To use these files you add a special parameter when configuring the source tree:
cmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-file> .
The exact file to use depends on the prefix used by the MinGW binaries on your
system. You can usually see this in the /usr directory, i.e. the Ubuntu
MinGW-w64 packages have /usr/x86_64-w64-mingw32 for the 64-bit compilers, so the
correct invocation would be:
cmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .
For more details see this article:
http://www.paraview.org/Wiki/CMake_Cross_Compiling
+129 -123
View File
@@ -4,31 +4,40 @@ cmake_minimum_required(VERSION 2.8)
set(GLFW_VERSION_MAJOR "3") set(GLFW_VERSION_MAJOR "3")
set(GLFW_VERSION_MINOR "0") set(GLFW_VERSION_MINOR "0")
set(GLFW_VERSION_PATCH "0") set(GLFW_VERSION_PATCH "4")
set(GLFW_VERSION_EXTRA "") set(GLFW_VERSION_EXTRA "")
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}") set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}") 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(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib will be installed: lib or lib64")
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" ON)
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON) option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
option(GLFW_INSTALL "Generate installation target" ON)
set(DOXYGEN_SKIP_DOT TRUE)
find_package(Doxygen)
option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF) option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
if (GLFW_DOCUMENT_INTERNALS)
set(GLFW_INTERNAL_DOCS "${GLFW_SOURCE_DIR}/src/internal.h ${GLFW_SOURCE_DIR}/docs/internal.dox") if (WIN32)
option(GLFW_USE_DWM_SWAP_INTERVAL "Set swap interval even when DWM compositing is enabled" OFF)
option(GLFW_USE_OPTIMUS_HPG "Force use of high-performance GPU on Optimus systems" OFF)
endif() endif()
if (APPLE) if (APPLE)
option(GLFW_BUILD_UNIVERSAL "Build GLFW as a Universal Binary" OFF)
option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON) option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON) option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
else() else()
option(GLFW_USE_EGL "Use EGL for context creation" OFF) option(GLFW_USE_EGL "Use EGL for context creation" OFF)
endif() endif()
if (MSVC)
option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON)
endif()
if (BUILD_SHARED_LIBS)
set(_GLFW_BUILD_DLL 1)
endif()
if (GLFW_USE_EGL) if (GLFW_USE_EGL)
set(GLFW_CLIENT_LIBRARY "opengl" CACHE STRING set(GLFW_CLIENT_LIBRARY "opengl" CACHE STRING
"The client library to use; one of opengl, glesv1 or glesv2") "The client library to use; one of opengl, glesv1 or glesv2")
@@ -65,23 +74,47 @@ endif()
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
#-------------------------------------------------------------------- if (GLFW_BUILD_DOCS)
# Enable all warnings on GCC, regardless of OS set(DOXYGEN_SKIP_DOT TRUE)
#-------------------------------------------------------------------- find_package(Doxygen)
if (CMAKE_COMPILER_IS_GNUCC)
add_definitions(-Wall) if (GLFW_DOCUMENT_INTERNALS)
set(GLFW_INTERNAL_DOCS "${GLFW_SOURCE_DIR}/src/internal.h ${GLFW_SOURCE_DIR}/docs/internal.dox")
endif()
endif() endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Export shared library / dynamic library / DLL build option # Set compiler specific flags
#-------------------------------------------------------------------- #--------------------------------------------------------------------
if (BUILD_SHARED_LIBS) if (UNIX)
set(_GLFW_BUILD_DLL 1) add_definitions(-Wall)
if (UNIX)
if (BUILD_SHARED_LIBS)
add_definitions(-fvisibility=hidden) add_definitions(-fvisibility=hidden)
endif() endif()
endif() endif()
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
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()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Detect and select backend APIs # Detect and select backend APIs
#-------------------------------------------------------------------- #--------------------------------------------------------------------
@@ -120,33 +153,26 @@ endif()
# Use Win32 for window creation # Use Win32 for window creation
#-------------------------------------------------------------------- #--------------------------------------------------------------------
if (_GLFW_WIN32) if (_GLFW_WIN32)
# The DLL links against winmm; the static library loads it
if (MSVC) # That way, both code paths receive testing
option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON)
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
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()
set(_GLFW_NO_DLOAD_WINMM ${BUILD_SHARED_LIBS})
if (BUILD_SHARED_LIBS) if (BUILD_SHARED_LIBS)
set(_GLFW_NO_DLOAD_WINMM 1)
list(APPEND glfw_LIBRARIES winmm) list(APPEND glfw_LIBRARIES winmm)
endif() endif()
if (GLFW_USE_DWM_SWAP_INTERVAL)
set(_GLFW_USE_DWM_SWAP_INTERVAL 1)
endif()
if (GLFW_USE_OPTIMUS_HPG)
set(_GLFW_USE_OPTIMUS_HPG 1)
endif()
# HACK: When building on MinGW, WINVER and UNICODE need to be defined before
# the inclusion of stddef.h (by glfw3.h), which is itself included before
# win32_platform.h. We define them here until a saner solution can be found
# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.
add_definitions(-DUNICODE)
add_definitions(-DWINVER=0x0501)
endif() endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
@@ -188,7 +214,13 @@ if (_GLFW_X11)
endif() endif()
list(APPEND glfw_INCLUDE_DIRS ${X11_Xinput_INCLUDE_PATH}) list(APPEND glfw_INCLUDE_DIRS ${X11_Xinput_INCLUDE_PATH})
list(APPEND glfw_LIBRARIES ${X11_Xinput_LIB})
if (X11_Xinput_LIB)
list(APPEND glfw_LIBRARIES ${X11_Xinput_LIB})
else()
# Backwards compatibility (bug in CMake 2.8.7)
list(APPEND glfw_LIBRARIES Xi)
endif()
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xi") set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xi")
# Check for Xf86VidMode (fallback gamma control) # Check for Xf86VidMode (fallback gamma control)
@@ -199,11 +231,10 @@ if (_GLFW_X11)
list(APPEND glfw_INCLUDE_DIRS ${X11_xf86vmode_INCLUDE_PATH}) list(APPEND glfw_INCLUDE_DIRS ${X11_xf86vmode_INCLUDE_PATH})
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xxf86vm") set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xxf86vm")
# NOTE: This is a workaround for CMake bug 0006976 (missing if (X11_Xxf86vm_LIB)
# X11_xf86vmode_LIB variable) list(APPEND glfw_LIBRARIES ${X11_Xxf86vm_LIB})
if (X11_xf86vmode_LIB)
list(APPEND glfw_LIBRARIES ${X11_xf86vmode_LIB})
else() else()
# Backwards compatibility (see CMake bug 0006976)
list(APPEND glfw_LIBRARIES Xxf86vm) list(APPEND glfw_LIBRARIES Xxf86vm)
endif() endif()
@@ -243,16 +274,9 @@ if (_GLFW_GLX)
include(CheckFunctionExists) include(CheckFunctionExists)
set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY}) set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY})
check_function_exists(glXGetProcAddress _GLFW_HAS_GLXGETPROCADDRESS) check_function_exists(glXGetProcAddress _GLFW_HAS_GLXGETPROCADDRESS)
check_function_exists(glXGetProcAddressARB _GLFW_HAS_GLXGETPROCADDRESSARB)
if (NOT _GLFW_HAS_GLXGETPROCADDRESS) check_function_exists(glXGetProcAddressEXT _GLFW_HAS_GLXGETPROCADDRESSEXT)
check_function_exists(glXGetProcAddressARB _GLFW_HAS_GLXGETPROCADDRESSARB)
endif()
if (NOT _GLFW_HAS_GLXGETPROCADDRESS AND NOT _GLFW_HAS_GLXGETPROCADDRESSARB)
check_function_exists(glXGetProcAddressEXT _GLFW_HAS_GLXGETPROCADDRESSEXT)
endif()
if (NOT _GLFW_HAS_GLXGETPROCADDRESS AND if (NOT _GLFW_HAS_GLXGETPROCADDRESS AND
NOT _GLFW_HAS_GLXGETPROCADDRESSARB AND NOT _GLFW_HAS_GLXGETPROCADDRESSARB AND
@@ -261,23 +285,15 @@ if (_GLFW_GLX)
# Check for dlopen support as a fallback # Check for dlopen support as a fallback
find_library(DL_LIBRARY dl) set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
mark_as_advanced(DL_LIBRARY)
if (DL_LIBRARY)
set(CMAKE_REQUIRED_LIBRARIES ${DL_LIBRARY})
else()
set(CMAKE_REQUIRED_LIBRARIES "")
endif()
check_function_exists(dlopen _GLFW_HAS_DLOPEN) check_function_exists(dlopen _GLFW_HAS_DLOPEN)
if (NOT _GLFW_HAS_DLOPEN) if (NOT _GLFW_HAS_DLOPEN)
message(FATAL_ERROR "No entry point retrieval mechanism found") message(FATAL_ERROR "No entry point retrieval mechanism found")
endif() endif()
if (DL_LIBRARY) if (CMAKE_DL_LIBS)
list(APPEND glfw_LIBRARIES ${DL_LIBRARY}) list(APPEND glfw_LIBRARIES ${CMAKE_DL_LIBS})
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -l${CMAKE_DL_LIBS}")
endif() endif()
endif() endif()
@@ -291,8 +307,6 @@ if (_GLFW_EGL)
list(APPEND glfw_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) list(APPEND glfw_INCLUDE_DIRS ${EGL_INCLUDE_DIR})
list(APPEND glfw_LIBRARIES ${EGL_LIBRARY}) list(APPEND glfw_LIBRARIES ${EGL_LIBRARY})
set(CMAKE_REQUIRED_LIBRARIES ${EGL_LIBRARY})
if (UNIX) if (UNIX)
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl")
endif() endif()
@@ -318,8 +332,6 @@ endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
if (_GLFW_COCOA AND _GLFW_NSGL) if (_GLFW_COCOA AND _GLFW_NSGL)
option(GLFW_BUILD_UNIVERSAL "Build GLFW as a Universal Binary" OFF)
if (GLFW_USE_MENUBAR) if (GLFW_USE_MENUBAR)
set(_GLFW_USE_MENUBAR 1) set(_GLFW_USE_MENUBAR 1)
endif() endif()
@@ -328,7 +340,6 @@ if (_GLFW_COCOA AND _GLFW_NSGL)
set(_GLFW_USE_CHDIR 1) set(_GLFW_USE_CHDIR 1)
endif() endif()
# Universal build
if (GLFW_BUILD_UNIVERSAL) if (GLFW_BUILD_UNIVERSAL)
message(STATUS "Building GLFW as Universal Binaries") message(STATUS "Building GLFW as Universal Binaries")
set(CMAKE_OSX_ARCHITECTURES i386;x86_64) set(CMAKE_OSX_ARCHITECTURES i386;x86_64)
@@ -340,13 +351,15 @@ if (_GLFW_COCOA AND _GLFW_NSGL)
find_library(COCOA_FRAMEWORK Cocoa) find_library(COCOA_FRAMEWORK Cocoa)
find_library(IOKIT_FRAMEWORK IOKit) find_library(IOKIT_FRAMEWORK IOKit)
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation) find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
find_library(CORE_VIDEO_FRAMEWORK CoreVideo)
list(APPEND glfw_LIBRARIES ${COCOA_FRAMEWORK} list(APPEND glfw_LIBRARIES ${COCOA_FRAMEWORK}
${OPENGL_gl_LIBRARY} ${OPENGL_gl_LIBRARY}
${IOKIT_FRAMEWORK} ${IOKIT_FRAMEWORK}
${CORE_FOUNDATION_FRAMEWORK}) ${CORE_FOUNDATION_FRAMEWORK}
${CORE_VIDEO_FRAMEWORK})
set(GLFW_PKG_DEPS "") set(GLFW_PKG_DEPS "")
set(GLFW_PKG_LIBS "-framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation") set(GLFW_PKG_LIBS "-framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation -framework CoreVideo")
endif() endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
@@ -364,6 +377,26 @@ else()
set(GLFW_LIB_NAME glfw3) set(GLFW_LIB_NAME glfw3)
endif() endif()
#--------------------------------------------------------------------
# Create generated files
#--------------------------------------------------------------------
configure_file(${GLFW_SOURCE_DIR}/docs/Doxyfile.in
${GLFW_BINARY_DIR}/docs/Doxyfile @ONLY)
configure_file(${GLFW_SOURCE_DIR}/src/glfw_config.h.in
${GLFW_BINARY_DIR}/src/glfw_config.h @ONLY)
configure_file(${GLFW_SOURCE_DIR}/src/glfwConfig.cmake.in
${GLFW_BINARY_DIR}/src/glfwConfig.cmake @ONLY)
configure_file(${GLFW_SOURCE_DIR}/src/glfwConfigVersion.cmake.in
${GLFW_BINARY_DIR}/src/glfwConfigVersion.cmake @ONLY)
if (UNIX)
configure_file(${GLFW_SOURCE_DIR}/src/glfw3.pc.in
${GLFW_BINARY_DIR}/src/glfw3.pc @ONLY)
endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Add subdirectories # Add subdirectories
#-------------------------------------------------------------------- #--------------------------------------------------------------------
@@ -377,63 +410,36 @@ if (GLFW_BUILD_TESTS)
add_subdirectory(tests) add_subdirectory(tests)
endif() endif()
if (DOXYGEN_FOUND) if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
add_subdirectory(docs) add_subdirectory(docs)
endif() endif()
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Create generated files # Install files other than the library
# The library is installed by src/CMakeLists.txt
#-------------------------------------------------------------------- #--------------------------------------------------------------------
configure_file(${GLFW_SOURCE_DIR}/docs/Doxyfile.in if (GLFW_INSTALL)
${GLFW_BINARY_DIR}/docs/Doxyfile @ONLY) install(DIRECTORY include/GLFW DESTINATION include
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
configure_file(${GLFW_SOURCE_DIR}/src/config.h.in install(FILES ${GLFW_BINARY_DIR}/src/glfwConfig.cmake
${GLFW_BINARY_DIR}/src/config.h @ONLY) ${GLFW_BINARY_DIR}/src/glfwConfigVersion.cmake
DESTINATION lib${LIB_SUFFIX}/cmake/glfw)
#-------------------------------------------------------------------- if (UNIX)
# Install the public headers install(EXPORT glfwTargets DESTINATION lib${LIB_SUFFIX}/cmake/glfw)
# The src directory's CMakeLists.txt file installs the library install(FILES ${GLFW_BINARY_DIR}/src/glfw3.pc
#-------------------------------------------------------------------- DESTINATION lib${LIB_SUFFIX}/pkgconfig)
install(DIRECTORY include/GLFW DESTINATION include endif()
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
#-------------------------------------------------------------------- # Only generate this target if no higher-level project already has
# Create and install glfwConfig.cmake and glfwConfigVersion files if (NOT TARGET uninstall)
#-------------------------------------------------------------------- configure_file(${GLFW_SOURCE_DIR}/cmake_uninstall.cmake.in
configure_file(${GLFW_SOURCE_DIR}/src/glfwConfig.cmake.in ${GLFW_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY)
${GLFW_BINARY_DIR}/src/glfwConfig.cmake @ONLY)
configure_file(${GLFW_SOURCE_DIR}/src/glfwConfigVersion.cmake.in
${GLFW_BINARY_DIR}/src/glfwConfigVersion.cmake @ONLY)
install(FILES ${GLFW_BINARY_DIR}/src/glfwConfig.cmake add_custom_target(uninstall
${GLFW_BINARY_DIR}/src/glfwConfigVersion.cmake ${CMAKE_COMMAND} -P
DESTINATION lib${LIB_SUFFIX}/cmake/glfw) ${GLFW_BINARY_DIR}/cmake_uninstall.cmake)
endif()
if (UNIX)
install(EXPORT glfwTargets DESTINATION lib${LIB_SUFFIX}/cmake/glfw)
endif()
#--------------------------------------------------------------------
# Create and install pkg-config file on supported platforms
#--------------------------------------------------------------------
if (UNIX)
configure_file(${GLFW_SOURCE_DIR}/src/glfw3.pc.in
${GLFW_BINARY_DIR}/src/glfw3.pc @ONLY)
install(FILES ${GLFW_BINARY_DIR}/src/glfw3.pc
DESTINATION lib${LIB_SUFFIX}/pkgconfig)
endif()
#--------------------------------------------------------------------
# Uninstall operation
# Don't generate this target if a higher-level project already has
#--------------------------------------------------------------------
if (NOT TARGET uninstall)
configure_file(${GLFW_SOURCE_DIR}/cmake_uninstall.cmake.in
${GLFW_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY)
add_custom_target(uninstall
${CMAKE_COMMAND} -P
${GLFW_BINARY_DIR}/cmake_uninstall.cmake)
endif() endif()
+84 -265
View File
@@ -1,4 +1,4 @@
# GLFW 3.0 # GLFW
## Introduction ## Introduction
@@ -6,279 +6,82 @@ GLFW is a free, Open Source, portable library for OpenGL and OpenGL ES
application development. It provides a simple, platform-independent API for application development. It provides a simple, platform-independent API for
creating windows and contexts, reading input, handling events, etc. creating windows and contexts, reading input, handling events, etc.
Version 3.0 brings a new API with many new features such as multiple windows Version 3.0.4 adds better support for custom build environments and fixes for
and contexts, multi-monitor support, EGL and OpenGL ES support, clipboard text a large number of bugs that together affect all supported platforms. As this is
support, an error description callback, gamma ramp control, layout-independent a patch release, there are no API changes.
keyboard input and UTF-8 for all strings.
GLFW is now hosted on [GitHub](https://github.com/glfw/glfw).
If you are new to GLFW, you may find the If you are new to GLFW, you may find the
[introductory tutorial](http://www.glfw.org/docs/3.0/quick.html) for GLFW [introductory tutorial](http://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 guide](http://www.glfw.org/docs/latest/moving.html) for moving to
[transition guide](http://www.glfw.org/docs/3.0/moving.html) for moving to the the GLFW 3 API.
GLFW 3 API.
## Compiling GLFW ## Compiling GLFW
To compile GLFW and the accompanying example programs, you will need the See the [Compiling GLFW](http://www.glfw.org/docs/latest/compile.html) guide in
[CMake](http://www.cmake.org/) build system. the GLFW documentation.
### Dependencies
#### X11 dependencies
To compile GLFW for X11 and GLX, you need to have the X and OpenGL header
packages installed. For example, on Ubuntu and other distributions based on
Debian GNU/Linux, you need to install the `xorg-dev` and `libglu1-mesa-dev`
packages. Note that using header files from Mesa *will not* tie your binary to
the Mesa implementation of OpenGL.
### CMake options
There are a number of CMake build options for GLFW, although not all are
available on all supported platforms. Some of these are de facto standards
among CMake users and so have no `GLFW_` prefix.
#### Shared 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 `$PREFIX/lib`. If it is set to
`64`, it is installed to `$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.
#### Mac OS X specific 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_BUILD_UNIVERSAL` determines whether to build Universal Binaries.
#### Windows specific options
`USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version of the
Visual C++ runtime library.
#### EGL specific options
`GLFW_USE_EGL` determines whether to use EGL instead of the platform-specific
context creation API. Note that EGL is not yet provided on all supported
platforms.
`GLFW_CLIENT_LIBRARY` determines which client API library to use. If set to
`opengl` the OpenGL library is used, if set to `glesv1` for the OpenGL ES 1.x
library is used, or if set to `glesv2` the OpenGL ES 2.0 library is used. The
selected library and its header files must be present on the system for this to
work.
## Installing GLFW
A rudimentary installation target is provided for all supported platforms via
CMake.
## Using GLFW ## Using GLFW
See the [GLFW 3.0 documentation](http://www.glfw.org/docs/3.0/). See the
[Building programs that use GLFW](http://www.glfw.org/docs/latest/build.html)
guide in the GLFW documentation.
## Changes for version 3.0 ## Changelog
- Added `GLFWmonitor` and updated monitor-related functions to take a monitor - Added the `GLFW_BUILD_DOCS` CMake option for controlling whether the
handle documentation is built
- Added `glfwGetMonitors` and `glfwGetPrimaryMonitor` for enumerating available - Added the `_GLFW_USE_CONFIG_H` configuration macro for controlling whether to
monitors include the configuration header
- Added `glfwGetMonitorPos`, `glfwGetMonitorPhysicalSize` and - Moved version number macro to `internal.h` for easier manual compilation
`glfwGetMonitorName` for retrieving monitor properties - Renamed configuration header to `glfw_config.h` to avoid conflicts
- Added `glfwSetMonitorCallback` and `GLFWmonitorfun` for notification of - Bugfix: The `glfw3.pc` file did not respect the `LIB_SUFFIX` CMake option
changes in the set of available monitors - Bugfix: The `joysticks` test would segfault if a controller had no axes
- Added `GLFWwindow` and updated window-related functions and callbacks to take - [Win32] Allowed swap interval to be explicitly set to zero on DWM systems
a window handle - [Win32] Bugfix: Removed joystick axis value negation left over from GLFW 2
- Added `glfwSetWindowShouldClose` and `glfwWindowShouldClose` for setting and - [Win32] Bugfix: Restoring windows using the Win+D hot key did not trigger the
retrieving the window close flag focus callback
- Added `glfwGetWindowPos` for retrieving the position of a window - [Win32] Bugfix: The disabled cursor mode clip rectangle was updated for
- Added `glfwDefaultWindowHints` for resetting all window hints to their unfocused windows
default values - [Win32] Bugfix: Cursor was not properly re-centered over odd-sized windows
- Added `glfwMakeContextCurrent` for making the context of the specified window - [Win32] Bugfix: Negative window positions were reported incorrectly
current - [Win32] Bugfix: The iconify callback was not triggered when switching away
- Added `glfwSetErrorCallback`, `GLFWerrorfun` and error type tokens for from a full screen window using Alt+Tab
receiving error notifications - [Win32] Bugfix: Resizing a window with `glfwSetWindowSize` gave it focus
- Added `glfwSetWindowUserPointer` and `glfwGetWindowUserPointer` for - [Cocoa] Added dependency on CoreVideo framework for refresh rate retrieval
per-window user pointers - [Cocoa] Enabled Lion full screen for resizable windowed mode windows
- Added `glfwGetVersionString` for determining which code paths were enabled at - [Cocoa] Moved to Cocoa API for application transformation and activation
compile time - [Cocoa] Bugfix: The `GLFW_KEY_GRAVE_ACCENT` key was reported as
- Added `glfwGetWindowMonitor` for querying the monitor, if any, of the `GLFW_KEY_WORLD_1` and vice versa
specified window - [Cocoa] Bugfix: The `GLFW_KEY_F13` key was reported as
- Added `glfwGetFramebufferSize` and `glfwSetFramebufferSizeCallback` for `GLFW_KEY_PRINT_SCREEN`
receiving the current size, in pixels, of the framebuffer - [Cocoa] Bugfix: Implicit conversion from `NSUInteger` to int caused warnings
- Added `glfwSetWindowPosCallback` and `GLFWwindowposfun` for receiving window with Xcode 5
position events - [Cocoa] Bugfix: Use of undeclared selectors with `@selector` caused warnings
- Added `glfwSetWindowFocusCallback` and `GLFWwindowfocusfun` for receiving with Xcode 5
window focus events - [Cocoa] Bugfix: The cursor remained visible if moved onto client area after
- Added `glfwSetWindowIconifyCallback` and `GLFWwindowiconifyfun` for receiving having been set to hidden outside it
window iconification events - [Cocoa] Bugfix: The refresh rate was zero for all modes of certain monitors
- Added `glfwGetClipboardString` and `glfwSetClipboardString` for interacting - [Cocoa] Bugfix: The `install_name` field of the dynamic library was not set
with the system clipboard - [Cocoa] Bugfix: Full screen windows were never reported as having focus
- Added `glfwGetJoystickName` for retrieving the name of a joystick - [Cocoa] Bugfix: A superfluous I/O flag test prevented video modes from being
- Added `glfwGetCurrentContext` for retrieving the window whose OpenGL context listed for Thunderbolt monitor
is current - [Cocoa] Bugfix: Retrieving the name of some external displays caused segfault
- Added `GLFW_SRGB_CAPABLE` for requesting sRGB capable framebuffers - [Cocoa] Bugfix: The 10.9 SDK defines `GLintptrARB` and `GLsizeiptrARB`
- Added `GLFW_CLIENT_API` and its values `GLFW_OPENGL_API` and differently from the Khronos `glext.h`
`GLFW_OPENGL_ES_API` for selecting client API - [Cocoa] Bugfix: Creating hidden windows would steal application focus
- Added `GLFW_CONTEXT_ROBUSTNESS` and values `GLFW_NO_ROBUSTNESS`, - [Cocoa] Bugfix: Controllers were reported as having zero buttons and axes
`GLFW_NO_RESET_NOTIFICATION` and `GLFW_LOSE_CONTEXT_ON_RESET` for - [Cocoa] Bugfix: Removed joystick axis value negation left over from GLFW 2
`GL_ARB_robustness` support - [X11] Added setting of the `WM_CLASS` property to the initial window title
- Added `GLFW_OPENGL_REVISION` to make up for removal of `glfwGetGLVersion` - [X11] Added support for `_NET_WM_BYPASS_COMPOSITOR`
- Added `GLFW_INCLUDE_GLCOREARB` macro for including `GL/glcorearb.h` instead of - [X11] Bugfix: Removed joystick axis value negation left over from GLFW 2
`GL/gl.h` - [X11] Bugfix: The position of hidden windows was ignored by Metacity
- Added `GLFW_INCLUDE_ES1` macro for telling the GLFW header to use `GLES/gl.h` and Compiz
instead of `GL/gl.h` - [X11] Bugfix: The `pthread.h` header was not included by the GLX platform
- Added `GLFW_INCLUDE_ES2` macro for telling the GLFW header to use header.
`GLES2/gl2.h` instead of `GL/gl.h`
- Added `GLFW_INCLUDE_NONE` macro for telling the GLFW header to not include
any client API header
- Added `GLFW_VISIBLE` window hint and parameter for controlling and polling
window visibility
- Added `GLFW_REPEAT` key action for repeated keys
- Added scancode parameter to key callback
- Added `refreshRate` member to `GLFWvidmode` struct
- Added key modifier parameter to key and mouse button callbacks
- Added `windows` simple multi-window test program
- Added `sharing` simple OpenGL object sharing test program
- Added `modes` video mode enumeration and setting test program
- Added `threads` simple multi-threaded rendering test program
- Added `glfw3native.h` header and platform-specific functions for explicit
access to native display, window and context handles
- Added `glfwSetGamma`, `glfwSetGammaRamp` and `glfwGetGammaRamp` functions and
`GLFWgammaramp` type for monitor gamma ramp control
- Added window parameter to `glfwSwapBuffers`
- Changed buffer bit depth parameters of `glfwOpenWindow` to window hints
- Changed `glfwCreateWindow` and `glfwSetWindowTitle` to use UTF-8 encoded
strings
- Changed `glfwGetProcAddress` to return a (generic) function pointer
- Changed `glfwGetVideoModes` to return a dynamic, unlimited number of video
modes for the specified monitor
- Changed cursor position to double-precision floating-point
- Changed default cursor mode for fullscreen to normal
- Renamed header directory `GL` to `GLFW`
- Renamed `glfw.h` to `glfw3.h` to avoid conflicts with 2.x series
- Renamed `glfwOpenWindowHint` to `glfwWindowHint`
- Renamed `glfwGetWindowParam` to `glfwGetWindowAttrib`
- Renamed `GLFW_ACTIVE` to `GLFW_FOCUSED`
- Renamed `GLFW_FSAA_SAMPLES` to `GLFW_SAMPLES`
- Renamed `GLFW_WINDOW_NO_RESIZE` to `GLFW_RESIZABLE`
- Renamed `GLFW_BUILD_DLL` to `_GLFW_BUILD_DLL`
- Renamed `version` test to `glfwinfo`
- Renamed `GLFW_NO_GLU` to `GLFW_INCLUDE_GLU` and made it disabled by default
- Renamed `glfwGetJoystickPos` to `glfwGetJoystickAxes` to match
`glfwGetJoystickButtons`
- Renamed mouse position functions to cursor position equivalents
- Replaced `glfwOpenWindow` and `glfwCloseWindow` with `glfwCreateWindow` and
`glfwDestroyWindow`
- Replaced `glfwGetDesktopMode` width `glfwGetVideoMode`
- Replaced ad hoc build system with CMake
- Replaced layout-dependent key codes with single, platform-independent set
based on US layout
- Replaced mouse wheel interface with two-dimensional, floating point scrolling
interface
- Replaced `glfwEnable` and `glfwDisable` with `glfwGetInputMode` and
`glfwSetInputMode`
- Replaced `joystick` test with graphical version
- Replaced automatic closing of windows with the window close flag
- Removed the `GLFW_KEY_REPEAT` input option
- Removed event auto-polling and the `GLFW_AUTO_POLL_EVENTS` window enable
- Removed the Win32 port .def files
- Removed the entire threading API
- Removed the entire image loading API
- Removed deprecated Carbon port
- Removed registering `glfwTerminate` with `atexit`
- Removed `glfwSleep` function
- Removed `glfwGetNumberOfProcessors` function
- Removed `glfwGetGLVersion` function
- Removed `GLFW_OPENED` window parameter
- Removed `GLFW_WINDOW` and `GLFW_FULLSCREEN`
- Removed nonsensical key actions for Unicode character input
- Removed `GLFWCALL` and `GLFWAPIENTRY` macros for stdcall calling convention
- Removed `GLFW_ACCELERATED` window parameter
- Removed default framebuffer attributes from `glfwGetWindowParam`
- Bugfix: The default OpenGL version in the `glfwinfo` test was set to 1.1
- Bugfix: The OpenGL profile and forward-compatibility window parameters were
not saved after context creation
- Bugfix: The FSAA test did not check for the availability of
`GL_ARB_multisample`
- Bugfix: Cursor centering upon leaving captured cursor mode was reported
before the mode was changed to non-captured
- [Cocoa] Added support for OpenGL 3.2 core profile in 10.7 Lion and above
- [Cocoa] Added support for high-DPI (Retina) monitors
- [Cocoa] Added support for joysticks
- [Cocoa] Postponed menu creation to first window creation
- [Cocoa] Replaced `NSDate` time source with `mach_absolute_time`
- [Cocoa] Replaced all deprecated CoreGraphics calls with non-deprecated
counterparts
- [Cocoa] Bugfix: The `NSOpenGLPFAFullScreen` pixel format attribute caused
creation to fail on some machines
- [Cocoa] Bugfix: `glfwCreateWindow` did not properly enforce the
forward-compatible and context profile hints
- [Cocoa] Bugfix: The loop condition for saving video modes used the wrong
index variable
- [Cocoa] Bugfix: The OpenGL framework was not retrieved, making
`glfwGetProcAddress` crash
- [Cocoa] Bugfix: `glfwInit` changed the current directory for unbundled
executables
- [Cocoa] Bugfix: The `GLFW_WINDOW_NO_RESIZE` window parameter was always zero
- [Cocoa] Bugfix: The cursor position incorrectly rounded during conversion
- [Cocoa] Bugfix: Cursor positioning led to nonsensical results for fullscreen
windows
- [Cocoa] Bugfix: The GLFW window was flagged as restorable
- [X11] Added support for the `GLX_EXT_swap_control` and
`GLX_MESA_swap_control` extensions as alternatives to
`GLX_SGI_swap_control`
- [X11] Added the POSIX `CLOCK_MONOTONIC` time source as the preferred method
- [X11] Added dependency on libm, where present
- [X11] Added support for the `_NET_WM_NAME` and `_NET_WM_ICON_NAME` EWMH
window properties
- [X11] Made client-side RandR and Xf86VidMode extensions required
- [X11] Bugfix: Some window properties required by the ICCCM were not set
- [X11] Bugfix: Calling `glXCreateContextAttribsARB` with an unavailable OpenGL
version caused the application to terminate with a `BadMatch`
Xlib error
- [X11] Bugfix: A synchronization point necessary for jitter-free locked cursor
mode was incorrectly removed
- [X11] Bugfix: The window size hints were not updated when calling
`glfwSetWindowSize` on a non-resizable window
- [Win32] Added support for high-DPI monitors
- [Win32] Changed port to use Unicode mode only
- [Win32] Removed explicit support for versions of Windows older than Windows
XP
- [Win32] Bugfix: Window activation and iconification did not work as expected
- [Win32] Bugfix: Software rasterizer pixel formats were not discarded by the
`WGL_ARB_pixel_format` code path
- [Win32] Bugfix: The array for WGL context attributes was too small and could
overflow
- [Win32] Bugfix: Alt+F4 hot key was not translated into `WM_CLOSE`
- [Win32] Bugfix: The `GLFW_WINDOW_NO_RESIZE` window parameter was always zero
- [Win32] Bugfix: A test was missing for whether all available pixel formats
had been disqualified
## Contact ## Contact
@@ -292,11 +95,11 @@ If you have questions related to the use of GLFW, we have a
channel `#glfw` on [Freenode](http://freenode.net/). channel `#glfw` on [Freenode](http://freenode.net/).
If you have a bug to report, a patch to submit or a feature you'd like to If you have a bug to report, a patch to submit or a feature you'd like to
request, please file it in one of the request, please file it in the
[issue trackers](https://sourceforge.net/p/glfw/_list/tickets) on SF.net. [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, we have a porting it to your favorite platform, we have an occasionally active
[developer's mailing list](https://lists.stacken.kth.se/mailman/listinfo/glfw-dev), [developer's mailing list](https://lists.stacken.kth.se/mailman/listinfo/glfw-dev),
or you could join us on `#glfw`. or you could join us on `#glfw`.
@@ -308,24 +111,30 @@ skills.
- Bobyshev Alexander - Bobyshev Alexander
- artblanc - artblanc
- arturo
- Matt Arsenault - Matt Arsenault
- Keith Bauer - Keith Bauer
- John Bartholomew - John Bartholomew
- Niklas Behrens
- Niklas Bergström - Niklas Bergström
- Doug Binks
- blanco - blanco
- Lambert Clara - Lambert Clara
- Andrew Corrigan
- Noel Cower - Noel Cower
- Jarrod Davis - Jarrod Davis
- Olivier Delannoy - Olivier Delannoy
- Paul R. Deppe - Paul R. Deppe
- Jonathan Dummer - Jonathan Dummer
- Ralph Eastwood - Ralph Eastwood
- Michael Fogleman
- Gerald Franz - Gerald Franz
- GeO4d - GeO4d
- Marcus Geelnard - Marcus Geelnard
- Stefan Gustavson - Stefan Gustavson
- Sylvain Hellegouarch - Sylvain Hellegouarch
- heromyth - heromyth
- Paul Holden
- Toni Jovanoski - Toni Jovanoski
- Osman Keskin - Osman Keskin
- Cameron King - Cameron King
@@ -337,17 +146,24 @@ skills.
- Martins Mozeiko - Martins Mozeiko
- Tristam MacDonald - Tristam MacDonald
- Hans Mackowiak - Hans Mackowiak
- Kyle McDonald
- David Medlock - David Medlock
- Jonathan Mercier - Jonathan Mercier
- Marcel Metz - Marcel Metz
- Kenneth Miller - Kenneth Miller
- Bruce Mitchener
- Jack Moffitt
- Jeff Molofee - Jeff Molofee
- Jon Morton - Jon Morton
- Pierre Moulon
- Julian Møller - Julian Møller
- Ozzy at Orkysquad - Kamil Nowakowski
- Ozzy
- Andri Pálsson
- Peoro - Peoro
- Braden Pellett - Braden Pellett
- Arturo J. Pérez - Arturo J. Pérez
- Pieroman
- Jorge Rodriguez - Jorge Rodriguez
- Ed Ropple - Ed Ropple
- Riku Salminen - Riku Salminen
@@ -355,15 +171,18 @@ skills.
- Matt Sealey - Matt Sealey
- SephiRok - SephiRok
- Steve Sexton - Steve Sexton
- Systemcluster
- Dmitri Shuralyov - Dmitri Shuralyov
- Daniel Skorupski - Daniel Skorupski
- Bradley Smith - Bradley Smith
- Julian Squires - Julian Squires
- Johannes Stein - Johannes Stein
- Justin Stoecker
- Nathan Sweet - Nathan Sweet
- TTK-Bandit - TTK-Bandit
- Sergey Tikhomirov - Sergey Tikhomirov
- Samuli Tuomola - Samuli Tuomola
- urraka
- Jari Vetoniemi - Jari Vetoniemi
- Simon Voordouw - Simon Voordouw
- Torsten Walluhn - Torsten Walluhn
+9149 -10857
View File
File diff suppressed because it is too large Load Diff
+677 -848
View File
File diff suppressed because it is too large Load Diff
+648 -758
View File
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -1,5 +1,5 @@
add_custom_target(docs ALL ${DOXYGEN_EXECUTABLE} add_custom_target(docs ALL ${DOXYGEN_EXECUTABLE}
WORKING_DIRECTORY ${GLFW_BINARY_DIR}/docs WORKING_DIRECTORY ${GLFW_BINARY_DIR}/docs
COMMENT "Generating HTML documentation" VERBATIM) COMMENT "Generating HTML documentation" VERBATIM)
+4 -3
View File
@@ -659,6 +659,7 @@ INPUT = @GLFW_INTERNAL_DOCS@ \
@GLFW_SOURCE_DIR@/docs/news.dox \ @GLFW_SOURCE_DIR@/docs/news.dox \
@GLFW_SOURCE_DIR@/docs/quick.dox \ @GLFW_SOURCE_DIR@/docs/quick.dox \
@GLFW_SOURCE_DIR@/docs/moving.dox \ @GLFW_SOURCE_DIR@/docs/moving.dox \
@GLFW_SOURCE_DIR@/docs/compile.dox \
@GLFW_SOURCE_DIR@/docs/build.dox \ @GLFW_SOURCE_DIR@/docs/build.dox \
@GLFW_SOURCE_DIR@/docs/context.dox \ @GLFW_SOURCE_DIR@/docs/context.dox \
@GLFW_SOURCE_DIR@/docs/monitor.dox \ @GLFW_SOURCE_DIR@/docs/monitor.dox \
@@ -899,13 +900,13 @@ HTML_FILE_EXTENSION = .html
# have to redo this when upgrading to a newer version of doxygen or when # have to redo this when upgrading to a newer version of doxygen or when
# changing the value of configuration settings such as GENERATE_TREEVIEW! # changing the value of configuration settings such as GENERATE_TREEVIEW!
HTML_HEADER = HTML_HEADER = @GLFW_SOURCE_DIR@/docs/header.html
# The HTML_FOOTER tag can be used to specify a personal HTML footer for # The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a # each generated HTML page. If it is left blank doxygen will generate a
# standard footer. # standard footer.
HTML_FOOTER = HTML_FOOTER = @GLFW_SOURCE_DIR@/docs/footer.html
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading # The HTML_STYLESHEET tag can be used to specify a user-defined cascading
# style sheet that is used by each HTML page. It can be used to # style sheet that is used by each HTML page. It can be used to
@@ -924,7 +925,7 @@ HTML_STYLESHEET =
# robust against future updates. Doxygen will copy the style sheet file to # robust against future updates. Doxygen will copy the style sheet file to
# the output directory. # the output directory.
HTML_EXTRA_STYLESHEET = HTML_EXTRA_STYLESHEET = @GLFW_SOURCE_DIR@/docs/extra.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note # other source files which should be copied to the HTML output directory. Note
+106 -50
View File
@@ -1,11 +1,13 @@
/*! /*!
@page build Building programs using GLFW @page build Building programs that use GLFW
@tableofcontents @tableofcontents
This is about compiling and linking programs that use GLFW. For information on This is about compiling and linking programs that use GLFW. For information on
how to *write* such programs, start with the [introductory tutorial](@ref quick). how to write such programs, start with the [introductory tutorial](@ref quick).
For information on how to compile the GLFW library itself, see the @ref compile
guide.
@section build_include Including the GLFW header file @section build_include Including the GLFW header file
@@ -48,10 +50,12 @@ header that the GLFW header includes and GLEW will work as expected.
@subsection build_macros GLFW header option macros @subsection build_macros GLFW header option macros
These macros may be defined before the inclusion of the GLFW header and affect These macros may be defined before the inclusion of the GLFW header and affect
how that header behaves. the behavior of the header. Note that GLFW does not provide any of the OpenGL
or OpenGL ES headers mentioned below. These are provided by your development
environment or your OpenGL or OpenGL ES SDK.
`GLFW_INCLUDE_GLCOREARB` makes the header include the modern `GL/glcorearb.h` `GLFW_INCLUDE_GLCOREARB` makes the header include the modern `GL/glcorearb.h`
header (`OpenGL/gl3.h` on Mac OS X) instead of the regular OpenGL header. header (`OpenGL/gl3.h` on OS X) instead of the regular OpenGL header.
`GLFW_INCLUDE_ES1` makes the header include the OpenGL ES 1.x `GLES/gl.h` header `GLFW_INCLUDE_ES1` makes the header include the OpenGL ES 1.x `GLES/gl.h` header
instead of the regular OpenGL header. instead of the regular OpenGL header.
@@ -64,35 +68,27 @@ header instead of the regular OpenGL header.
`GLFW_INCLUDE_NONE` makes the header not include any client API header. `GLFW_INCLUDE_NONE` makes the header not include any client API header.
`GLFW_INCLUDE_GLU` makes the header include the GLU header. This only makes `GLFW_INCLUDE_GLU` makes the header include the GLU header *in addition to* the
sense if you are using OpenGL. OpenGL header. This should only be used with the default `GL/gl.h` header
(`OpenGL/gl.h` on OS X), i.e. if you are not using any of the above macros.
`GLFW_DLL` is necessary when using the GLFW DLL on Windows, in order to explain `GLFW_DLL` is necessary when using the GLFW DLL on Windows, in order to explain
to the compiler that the GLFW functions will be coming from another executable. to the compiler that the GLFW functions will be coming from another executable.
It has no function on other platforms.
@section build_link Link with the right libraries @section build_link Link with the right libraries
@subsection build_link_cmake Using GLFW from CMake @subsection build_link_win32 With MinGW or Visual C++ on Windows
The `GLFW_LIBRARIES` cache variable contains all link-time dependencies of GLFW
as it is currently configured, so to link against GLFW simply do:
target_link_libraries(myapp glfw ${GLFW_LIBRARIES})
Note that this does not include GLU, as GLFW does not use it. If your
application needs GLU, you can add it to the list of dependencies with the
`OPENGL_glu_LIBRARY` cache variable.
@subsection build_link_win32 Windows
The static version of the GLFW library is named `glfw3`. When using this The static version of the GLFW library is named `glfw3`. When using this
version, it is also necessary to link with some libraries that GLFW uses. version, it is also necessary to link with some libraries that GLFW uses.
When linking a program under Windows that uses the static version of GLFW, you When linking a program under Windows that uses the static version of GLFW, you
must link with `opengl32`. If you are using GLU, you must also link with must link with `opengl32`. On some versions of MinGW, you must also explicitly
`glu32`. 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 a program The link library for the GLFW DLL is named `glfw3dll`. When compiling a program
that uses the DLL version of GLFW, you need to define the `GLFW_DLL` macro that uses the DLL version of GLFW, you need to define the `GLFW_DLL` macro
@@ -104,12 +100,72 @@ dependencies, but you still have to link against `opengl32` if your program uses
OpenGL and `glu32` if it uses GLU. OpenGL and `glu32` if it uses GLU.
@subsection build_link_unix Unix with X11 @subsection build_link_cmake_source With CMake and GLFW source
You can use the GLFW source tree directly from a project that uses CMake. This
way, GLFW will be built along with your application as needed.
Firstly, 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.
add_subdirectory(path/to/glfw)
To be able to include the GLFW header from your code, you need to tell the
compiler where to find it.
include_directories(path/to/glfw/include)
Once GLFW has been added to the project, the `GLFW_LIBRARIES` cache variable
contains all link-time dependencies of GLFW as it is currently configured. To
link against GLFW, link against them and the `glfw` target.
target_link_libraries(myapp glfw ${GLFW_LIBRARIES})
Note that `GLFW_LIBRARIES` does not include GLU, as GLFW does not use it. If
your application needs GLU, you can add it to the list of dependencies with the
`OPENGL_glu_LIBRARY` cache variable, which is implicitly created when the GLFW
CMake files look for OpenGL.
target_link_libraries(myapp glfw ${OPENGL_glu_LIBRARY} ${GLFW_LIBRARIES})
@subsection build_link_cmake_pkgconfig With CMake on Unix and installed GLFW binaries
CMake can import settings from pkg-config, which GLFW supports. When you
installed GLFW, the pkg-config file `glfw3.pc` was installed along with it.
First you need to find the PkgConfig package. If this fails, you may need to
install the pkg-config package for your distribution.
find_package(PkgConfig REQUIRED)
This creates the CMake commands to find pkg-config packages. Then you need to
find the GLFW package.
pkg_search_module(GLFW REQUIRED glfw3)
This creates the CMake variables you need to use GLFW. To be able to include
the GLFW header, you need to tell your compiler where it is.
include_directories(${GLFW_INCLUDE_DIRS})
You also need to link against the correct libraries. If you are using the
shared library version of GLFW, use the `GLFW_LIBRARIES` variable.
target_link_libraries(simple ${GLFW_LIBRARIES})
If you are using the static library version of GLFW, use the
`GLFW_STATIC_LIBRARIES` variable instead.
target_link_libraries(simple ${GLFW_STATIC_LIBRARIES})
@subsection build_link_pkgconfig With pkg-config on OS X or other Unix
GLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/), GLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/),
and `glfw3.pc` file is generated when the library is built and installed along and the `glfw3.pc` file is generated when the GLFW library is built and installed
with it. You can use it without installation using the `PKG_CONFIG_PATH` along with it.
environment variable. See the documentation for pkg-config for more details.
A typical compile and link command-line when using the static may look like this: A typical compile and link command-line when using the static may look like this:
@@ -117,45 +173,45 @@ A typical compile and link command-line when using the static may look like this
If you are using the shared library, simply omit the `--static` flag. If you are using the shared library, simply omit the `--static` flag.
If you are using GLU, you should also add `-lGLU` to your link flags. 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.
env PKG_CONFIG_PATH=path/to/glfw/src cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --static --libs glfw3`
The dependencies do not include GLU, as GLFW does not need it. 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
`-lGLU` to your link flags.
See the manpage and other documentation for pkg-config and your compiler and
linker for more information on how to link programs.
@subsection build_link_osx Mac OS X @subsection build_link_xcode With Xcode on OS X
GLFW on Mac OS X uses the Cocoa, OpenGL and IOKit frameworks. If you are using the dynamic library version of GLFW, simply add it to the
project dependencies.
If you are using Xcode, you can simply add the GLFW library and these frameworks If you are using the static library version of GLFW, add it and the Cocoa,
as dependencies. OpenGL, IOKit and CoreVideo frameworks to the project as dependencies.
If you are building from the
command-line, it is recommended that you use pkg-config
GLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/), @subsection build_link_osx With command-line on OS X
and `glfw3.pc` file is generated when the library is built and installed along
with it. You can use it without installation using the `PKG_CONFIG_PATH`
environment variable. See the documentation for pkg-config for more details.
You can find pkg-config in most package systems such as
[Fink](http://www.finkproject.org/) and [MacPorts](http://www.macports.org/), so
if you have one of them installed, simply install pkg-config. Once you have
pkg-config available, the command-line for compiling and linking your
program is:
cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --static --libs glfw3`
If you do not wish to use pkg-config, you need to add the required frameworks If you do not wish to use pkg-config, you need to add the required frameworks
and libraries to your command-line using the `-l` and `-framework` switches, and libraries to your command-line using the `-l` and `-framework` switches,
i.e.: i.e.:
cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
Note that you do not add the `.framework` extension to a framework when adding Note that you do not add the `.framework` extension to a framework when adding
it from the command-line. it from the command-line.
The OpenGL framework contains both the OpenGL and GLU APIs, so there is no need The OpenGL framework contains both the OpenGL and GLU APIs, so there is nothing
to add additional libraries or frameworks when using GLU. Also note that even special to do when using GLU. Also note that even though your machine may have
though your machine may have `libGL`-style OpenGL libraries, they are for use `libGL`-style OpenGL libraries, they are for use with the X Window System and
with the X Window System and will *not* work with the Mac OS X native version of will *not* work with the OS X native version of GLFW.
GLFW.
*/ */
+17 -15
View File
@@ -112,24 +112,26 @@ context profiles. Where this extension is unavailable, setting the
`GLFW_OPENGL_PROFILE` hint to anything but zero will cause @ref glfwCreateWindow `GLFW_OPENGL_PROFILE` hint to anything but zero will cause @ref glfwCreateWindow
to fail. to fail.
@section cmopat_osx OpenGL 3.2 on Mac OS X @section compat_osx OpenGL 3.2 and later on OS X
Support for OpenGL 3.0 and above was introduced with Mac OS X 10.7, and even Support for OpenGL 3.2 and above was introduced with OS X 10.7 and even then
then only forward-compatible OpenGL 3.2 core profile contexts are supported. only forward-compatible, core profile contexts are supported. Support for
There is also still no mechanism for requesting debug contexts. Versions of OpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,
Mac OS X earlier than 10.7 support at most OpenGL version 2.1. 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 Mac OS X 10.7, the `GLFW_CONTEXT_VERSION_MAJOR` and Because of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 3.2, the `GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if
`GLFW_OPENGL_FORWARD_COMPAT` is required for creating OpenGL 3.2 contexts, the given version 3.0 or 3.1, the `GLFW_OPENGL_FORWARD_COMPAT` hint must be set to
`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored and setting the non-zero and the `GLFW_OPENGL_PROFILE` hint must be set to
`GLFW_OPENGL_PROFILE` hint to anything except `GLFW_OPENGL_CORE_PROFILE` will `GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts and the
cause @ref glfwCreateWindow to fail. `GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and Also, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and
`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1, the `GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,
`GLFW_OPENGL_DEBUG_CONTEXT` hint will have no effect, and setting the setting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to
`GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to a non-zero value a non-default value will cause @ref glfwCreateWindow to fail and the
will cause @ref glfwCreateWindow to fail. `GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.
*/ */
+261
View File
@@ -0,0 +1,261 @@
/*!
@page compile Compiling GLFW
@tableofcontents
This is about compiling the GLFW library itself. For information on how to
build programs that use GLFW, see the @ref build guide.
@section compile_deps Dependencies
To compile GLFW and the accompanying example programs, you will need **CMake**,
which will generate the project files or makefiles for your 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 get installers for
Windows and OS X from the [CMake website](http://www.cmake.org/).
Additional dependencies are listed below.
If you wish to compile GLFW without CMake, see @ref compile_manual.
@subsection compile_deps_msvc Dependencies using Visual C++ on Windows
The Microsoft Platform SDK that is installed along with Visual C++ contains all
the necessary headers, link libraries and tools except for CMake.
@subsection compile_deps_mingw Dependencies with MinGW or MinGW-w64 on Windows
Both the MinGW and the MinGW-w64 packages contain all the necessary headers,
link libraries and tools except for CMake.
@subsection compile_deps_mingw_cross Dependencies using 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:
cmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-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 Debian/Ubuntu and Cygwin MinGW-w64 packages
have `/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct
invocation would be:
cmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .
For more details see the article
[CMake Cross Compiling](http://www.paraview.org/Wiki/CMake_Cross_Compiling) on
the CMake wiki.
@subsection compile_deps_xcode Dependencies using Xcode on OS X
Xcode contains all necessary tools except for CMake. The necessary headers and
libraries are included in the core OS frameworks. Xcode can be downloaded from
the Mac App Store or from the ADC Member Center.
@subsection compile_deps_x11 Dependencies using Linux and X11
To compile GLFW for X11, you need to have the X11 and OpenGL header 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` and `libglu1-mesa-dev` packages. The former pulls in
all X.org header packages and the latter pulls in the Mesa OpenGL and GLU
packages. GLFW itself doesn't need or use GLU, but some of the examples do.
Note that using header files and libraries from Mesa during compilation *will
not* tie your binaries to the Mesa implementation of OpenGL.
@section compile_cmake Generating 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.
@subsection compile_cmake_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.
cd <glfw-root-dir>
cmake .
To make an out-of-tree build, make another directory, enter it and run CMake
with the (relative or absolute) path to the root of the source tree as an
argument.
cd <glfw-root-dir>
mkdir build
cd build
cmake ..
@subsection compile_cmake_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*.
@section 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 CMake users 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, use the `ccmake` tool.
Some package systems like Ubuntu and other distributions based on Debian
GNU/Linux have this tool in a separate `cmake-curses-gui` package.
@subsection 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_CLIENT_LIBRARY` determines which client API library to use. If set to
`opengl` the OpenGL library is used, if set to `glesv1` for the OpenGL ES 1.x
library is used, or if set to `glesv2` the OpenGL ES 2.0 library is used. The
selected library and its header files must be present on the system for this to
work.
`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.
@subsection 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_BUILD_UNIVERSAL` determines whether to build Universal Binaries.
@subsection compile_options_win32 Windows specific CMake options
`USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the
static library version of the Visual C++ runtime library. If set to `ON`, the
DLL version of the Visual C++ library is used. It is recommended to set this to
`ON`, as this keeps the executable smaller and benefits from security and bug
fix updates of the Visual C++ runtime.
`GLFW_USE_DWM_SWAP_INTERVAL` determines whether the swap interval is set even
when DWM compositing is enabled. If this is `ON`, the swap interval is set even
if DWM is enabled. It is recommended to set this to `OFF`, as doing otherwise
can lead to severe jitter.
`GLFW_USE_OPTIMUS_HPG` determines whether to export the `NvOptimusEnablement`
symbol, which forces the use of the high-performance GPU on nVidia Optimus
systems.
@subsection compile_options_egl EGL specific CMake options
`GLFW_USE_EGL` determines whether to use EGL instead of the platform-specific
context creation API. Note that EGL is not yet provided on all supported
platforms.
@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 number of configuration macros to be defined in order to know what it's being
compiled for and has many 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.
Three macros *must* be defined when compiling GLFW: one for selecting the window
creation API, one selecting the context creation API and one client library.
Exactly one of each kind must be defined for GLFW to compile and link.
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
The context creation API is used to enumerate pixel formats / framebuffer
configurations and to create contexts. The options are:
- `_GLFW_NSGL` to use the Cocoa OpenGL framework
- `_GLFW_WGL` to use the Win32 WGL API
- `_GLFW_GLX` to use the X11 GLX API
- `_GLFW_EGL` to use the EGL API (experimental)
The client library is the one providing the OpenGL or OpenGL ES API, which is
used by GLFW to probe the created context. This is not the same thing as the
client API, as many desktop OpenGL client libraries now expose the OpenGL ES API
through extensions. The options are:
- `_GLFW_USE_OPENGL` for the desktop OpenGL (opengl32.dll, libGL.so or
OpenGL.framework)
- `_GLFW_USE_GLESV1` for OpenGL ES 1.x (experimental)
- `_GLFW_USE_GLESV2` for OpenGL ES 2.x (experimental)
Note that `_GLFW_USE_GLESV1` and `_GLFW_USE_GLESV2` may only be used with EGL,
as the other context creation APIs do not interface with OpenGL ES client
libraries.
If you are building GLFW as a shared library / dynamic library / DLL then you
must also define `_GLFW_BUILD_DLL`. Otherwise, you may not define it.
If you are using the X11 window creation API then you *must* also select an entry
point retrieval mechanism.
- `_GLFW_HAS_GLXGETPROCADDRESS` to use `glXGetProcAddress` (recommended)
- `_GLFW_HAS_GLXGETPROCADDRESSARB` to use `glXGetProcAddressARB` (legacy)
- `_GLFW_HAS_GLXGETPROCADDRESSEXT` to use `glXGetProcAddressEXT` (legacy)
- `_GLFW_HAS_DLOPEN` to do manual retrieval with `dlopen` (fallback)
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)
*/
+9
View File
@@ -24,6 +24,15 @@ what kind of context is created. See
[context related hints](@ref window_hints_ctx) in the window handling guide. [context related hints](@ref window_hints_ctx) in the window handling guide.
@section context_sharing Context object sharing
When creating a window and context with @ref glfwCreateWindow, you can specify
another window whose context the new one should share its objects with. OpenGL
object sharing is implemented by the operating system and graphics driver and is
described in the OpenGL documentation. On platforms where it is possible to
choose which types of objects are shared, GLFW requests that all are shared.
@section context_current Current context @section context_current Current context
Before you can use the OpenGL or OpenGL ES APIs, you need to have a current Before you can use the OpenGL or OpenGL ES APIs, you need to have a current
+312
View File
@@ -0,0 +1,312 @@
html {
background-color:hsl(0,0%,95%);
}
.glfwheader {
font-size:16px;
height:64px;
max-width:920px;
margin:0em auto;
}
.glfwheader a#glfwhome {
line-height:64px;
padding-right:48px;
float:left;
color:hsl(0,0%,40%);
font-size:2.5em;
background-image:url("http://www.glfw.org/css/arrow.png");
background-position:right top;
background-repeat:no-repeat;
}
.glfwnavbar {
list-style-type:none;
margin-top:0px;
float:right;
}
.glfwnavbar li {
float:left;
}
.glfwnavbar a,.glfwnavbar a:visited {
line-height:64px;
margin-left:2em;
display:block;
color:hsl(0,0%,40%);
}
.glfwheader a#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {
transition:all 0.35s ease 0s;
}
#titlearea,address.footer {
color:hsl(0,0%,40%);
background-color:hsl(0,0%,95%);
border-bottom:none;
}
address.footer {
text-align:center;
padding:2em;
}
div#top {
background-color:hsl(0,0%,40%);
}
div#navrow1,div#navrow2,div#navrow3,div#navrow4 {
background-color:hsl(0,0%,40%);
background-image:none;
max-width:920px;
margin:0em auto;
}
ul.tablist {
min-width:700px;
}
.tablist a,.tablist a:hover,.tablist li,.tablist li.current a {
background-image:none;
text-shadow:none;
}
.tablist a,.tablist a:visited {
color:hsl(0,0%,95%);
text-shadow:none;
}
.tablist li.current a {
background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,100%,50%);
text-shadow:0px -1px 1px hsl(24,100%,35%);
color:hsl(0,0%,100%);
}
div.contents {
min-height:590px;
}
div.contents,div.header {
max-width:920px;
margin:0em auto;
padding:0em 2em 2em 2em;
background-color:hsl(0,0%,100%);
}
div.header {
background-image:none;
border-bottom:none;
}
table.doxtable th,dl.reflist dt,div.levels {
background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,100%,50%);
text-shadow:0px -1px 1px hsl(24,100%,35%);
color:hsl(0,0%,100%);
}
dl.reflist dt a.el,div.levels span {
color:hsl(24,100%,50%);
padding:0.2em;
border-radius:4px;
background-color:hsl(24,100%,90%);
text-shadow:none;
}
div.memproto,div.qindex,div.ah {
background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,0%,90%);
text-shadow:0px 1px 1px hsl(24,0%,100%);
color:hsl(0,0%,10%);
}
div.memproto a {
color:hsl(24,100%,50%);
}
div.memproto td.paramname {
text-shadow:0px 1px 1px hsl(24,0%,100%);
}
div.memproto,div.qindex,div.ah {
border:2px solid hsl(24,0%,90%);
border-radius:4px;
}
div.memdoc {
background:none;
box-shadow:none;
border:none;
}
td.paramname {
color:hsl(24,100%,25%);
}
dl.reflist dt {
border:2px solid hsl(24,100%,50%);
border-top-left-radius:4px;
border-top-right-radius:4px;
border-bottom:none;
}
dl.reflist dd {
border:2px solid hsl(24,100%,50%);
border-bottom-right-radius:4px;
border-bottom-left-radius:4px;
border-top:none;
background:none;
box-shadow:none;
}
table.doxtable {
border-collapse:inherit;
border-spacing:0px;
border:2px solid hsl(24,100%,50%);
border-radius:4px;
}
table.doxtable td,table.doxtable th {
border:none;
}
tr.even,.directory tr.even,table.doxtable tr:nth-child(even) {
background-color:hsl(0,0%,95%);
}
body {
color:hsl(0,0%,30%);
}
h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {
color:hsl(0,0%,10%);
border-bottom:none;
}
a,a:hover,a:visited,a:visited:hover,a.el,a.el:visited,.glfwheader a#glfwhome:hover,.tablist a:hover {
color:hsl(24,100%,50%);
text-decoration:none;
}
.mdescLeft,.mdescRight,.memItemLeft,.memItemRight {
background-color:hsl(0,0%,95%);
}
div.directory {
border-collapse:inherit;
border-spacing:0px;
border:2px solid hsl(24,100%,50%);
border-radius:4px;
}
.directory .levels span {
color:hsl(24,100%,50%);
padding:0.1em 0.5em;
margin:auto 0.25em;
border-radius:2px;
background-color:hsl(24,100%,90%);
text-shadow:none;
}
td.memSeparator {
height:2px;
border:0px;
background:linear-gradient(to right,hsl(0,0%,95%) 0%,hsl(0,0%,85%) 50%,hsl(0,0%,95%) 100%);
}
dl.note,dl.pre,dl.post,dl.invariant {
background:linear-gradient(to bottom,hsl(103,80%,90%) 0%,hsl(103,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(103,40%,80%);
color:hsl(103,80%,10%);
border:2px solid hsl(103,40%,75%);
}
dl.warning,dl.attention {
background:linear-gradient(to bottom,hsl(34,80%,90%) 0%,hsl(34,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(34,40%,80%);
color:hsl(34,80%,10%);
border:2px solid hsl(34,40%,75%);
}
dl.deprecated,dl.bug {
background:linear-gradient(to bottom,hsl(333,80%,90%) 0%,hsl(333,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(333,40%,80%);
color:hsl(333,80%,10%);
border:2px solid hsl(333,40%,75%);
}
dl.todo,dl.test {
background:linear-gradient(to bottom,hsl(200,80%,90%) 0%,hsl(200,80%,85%) 100%);
box-shadow:inset 0px 0px 32px hsl(200,40%,80%);
color:hsl(200,80%,10%);
border:2px solid hsl(200,40%,75%);
}
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:0px 1px 1px hsl(0,0%,100%);
}
div.toc {
background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%);
box-shadow:inset 0px 0px 32px hsl(24,0%,90%);
text-shadow:0px 1px 1px hsl(24,0%,100%);
color:hsl(0,0%,10%);
border:2px solid hsl(24,0%,90%);
border-radius:4px;
float:none;
width:auto;
}
div.toc h3 {
font-size:1.17em;
}
div.toc ul {
padding-left:1.5em;
}
div.toc li {
background:none;
font-size:1em;
padding-left:0em;
list-style-type:disc;
}
div.ah {
background-image:none;
}
div.fragment,pre.fragment {
background-color:hsl(0,0%,20%);
border-radius:4px;
border-width:0px;
padding:0.5em 2em;
overflow:auto;
border-left:4px solid hsl(0,0%,80%);
}
div.line,pre.fragment {
color:hsl(60,30%,96%);
}
a.code,a.code:visited,span.preprocessor,span.comment {
color:hsl(80,76%,53%);
}
span.keyword,span.keywordtype,span.keywordflow {
color:hsl(190,81%,67%);
}
span.stringliteral {
color:hsl(54,70%,68%);
}
code {
background-color:hsl(0,0%,95%);
padding:0.1em;
border-radius: 4px;
}
+7
View File
@@ -0,0 +1,7 @@
<address class="footer">
<p>
Last update on $date for $projectname $projectnumber
</p>
</address>
</body>
</html>
+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<div class="glfwheader">
<a href="http://www.glfw.org/" id="glfwhome">GLFW</a>
<ul class="glfwnavbar">
<li><a href="http://www.glfw.org/documentation.html">Documentation</a></li>
<li><a href="http://www.glfw.org/download.html">Download</a></li>
<li><a href="http://www.glfw.org/media.html">Media</a></li>
<li><a href="http://www.glfw.org/community.html">Community</a></li>
</ul>
</div>
</div>
<!--END TITLEAREA-->
<!-- end header part -->
+2 -2
View File
@@ -105,8 +105,8 @@ Examples: `clearScrollOffsets`
@section internals_config Configuration macros @section internals_config Configuration macros
GLFW uses a number of configuration macros to select at compile time which GLFW uses a number of configuration macros to select at compile time which
interfaces and code paths to use. They are defined in the config.h header file, interfaces and code paths to use. They are defined in the glfw_config.h header file,
which is generated from the `config.h.in` file by CMake. 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.
+3 -3
View File
@@ -11,12 +11,12 @@ existing applications and does not lay claim to the main loop.
This is the documentation for version 3.0, which has [many new features](@ref news). This is the documentation for version 3.0, which has [many new features](@ref news).
There is a [quick tutorial](@ref quick) for people new to GLFW, which shows how There is a [quick tutorial](@ref quick) for people new to GLFW, which shows how
to write a small but complete program. to write a small but complete program, and guides for
[compiling GLFW](@ref compile) and
[building programs that use GLFW](@ref build).
If you have used GLFW 2.x in the past, there is a If you have used GLFW 2.x in the past, there is a
[transition guide](@ref moving) that explains what has changed and how to update [transition guide](@ref moving) that explains what has changed and how to update
existing code to use the new API. existing code to use the new API.
As this is still unfinished software, there are still [a number of bugs](@ref bug).
*/ */
+12 -3
View File
@@ -9,6 +9,9 @@
The @ref GLFWmonitor object represents a currently connected monitor. The @ref GLFWmonitor object represents a currently connected monitor.
@section monitor_monitors Retrieving monitors
The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is usually The primary monitor is returned by @ref glfwGetPrimaryMonitor. It is usually
the user's preferred monitor and the one with global UI elements like task bar the user's preferred monitor and the one with global UI elements like task bar
or menu bar. or menu bar.
@@ -25,7 +28,7 @@ GLFWmonitor** monitors = glfwGetMonitors(&count);
@endcode @endcode
@section monitor_modes Querying video modes @section monitor_modes Retrieving video modes
Although GLFW generally does a good job at selecting a suitable video Although GLFW generally does a good job at selecting a suitable video
mode for you when you open a full screen window, it is sometimes useful to mode for you when you open a full screen window, it is sometimes useful to
@@ -49,14 +52,20 @@ const GLFWvidmode* mode = glfwGetVideoMode(monitor);
@section monitor_size Monitor physical size @section monitor_size Monitor physical size
The physical size in millimetres of a monitor, or an approximation of it, can be The physical size in millimetres of a monitor, or an approximation of it, can be
retrieved with @ref glfwGetMonitorPhysicalSize. This can, for example, be used retrieved with @ref glfwGetMonitorPhysicalSize.
together with the current video mode to calculate DPI.
@code @code
int widthMM, heightMM; int widthMM, heightMM;
glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM); glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);
@endcode @endcode
This can, for example, be used together with the current video mode to calculate
the DPI of a monitor.
@code
const double dpi = mode->width / (widthMM / 25.4);
@endcode
@section monitor_name Monitor name @section monitor_name Monitor name
+24 -5
View File
@@ -125,6 +125,14 @@ 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_opened Window open parameter
The `GLFW_OPENED` window parameter has been removed. As long as the
[window object](@ref window_object) is around, the window is "open". To detect
when the user attempts to close the window, see @ref glfwWindowShouldClose and
the [close callback](@ref GLFWwindowclosefun).
@subsection moving_autopoll Automatic polling of events @subsection moving_autopoll Automatic polling of events
GLFW 3 does not automatically poll for events on @ref glfwSwapBuffers, which GLFW 3 does not automatically poll for events on @ref glfwSwapBuffers, which
@@ -168,13 +176,24 @@ similar to that of GLFW 2.
@subsection moving_window_close Window closing @subsection moving_window_close Window closing
Window closing is now just an event like any other. GLFW 3 windows won't Window closing initiated by the user is now just an event like any other.
disappear from underfoot even when no close callback is set; instead the Unlike GLFW 2, windows and contexts created with GLFW 3 will not disappear from
window's close flag is set. You can query this flag using @ref underfoot. Each window now has a close flag, which is set when the user
glfwWindowShouldClose, or capture close events by setting a close callback. The attempts to close it. By default, nothing else happens and the window stays
close flag can be modified from any point in your program using @ref open and visible. It is then up to you to either destroy the window, take some
other action or simply ignore the request. You can query the close flag at any
time with @ref glfwWindowShouldClose and set it at any time with @ref
glfwSetWindowShouldClose. glfwSetWindowShouldClose.
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
event processing completes. You may however not call @ref glfwDestroyWindow
from the close callback (or any other window related callback).
GLFW itself never clears the close flag, allowing you to set it for other
reasons for the window to close as well, for example the user choosing Quit from
the main menu.
@subsection moving_context Explicit context management @subsection moving_context Explicit context management
+173 -164
View File
@@ -1,164 +1,173 @@
/*! /*!
@page news New features @page news New features
@tableofcontents @tableofcontents
@section news_30 New features in version 3.0 @section news_30 New features in version 3.0
@subsection news_30_cmake CMake build system @subsection news_30_cmake CMake build system
GLFW now uses the CMake build system instead of the various makefiles and 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 project files used by earlier versions. CMake is available for all platforms
supported by GLFW, is present in most package systems and can generate supported by GLFW, is present in most package systems and can generate
makefiles and/or project files for most popular development environments. makefiles and/or project files for most popular development environments.
For more information on how to use CMake, see the For more information on how to use CMake, see the
[CMake manual](http://cmake.org/cmake/help/documentation.html). [CMake manual](http://cmake.org/cmake/help/documentation.html).
@subsection new_30_multiwnd Multi-window support @subsection news_30_multiwnd Multi-window support
GLFW now supports the creation of multiple windows, each with their own OpenGL 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 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 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 received the event. The @ref glfwMakeContextCurrent function has been added to
select which context is current on a given thread. select which context is current on a given thread.
@subsection news_30_multimon Multi-monitor support @subsection news_30_multimon Multi-monitor support
GLFW now explicitly supports multiple monitors. They can be enumerated with GLFW now explicitly supports multiple monitors. They can be enumerated with
@ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref @ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref
glfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize, glfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize,
and specified at window creation to make the newly created window full screen on and specified at window creation to make the newly created window full screen on
that specific monitor. that specific monitor.
@subsection news_30_unicode Unicode support @subsection news_30_unicode Unicode support
All string arguments to GLFW functions and all strings returned by GLFW use the All string arguments to GLFW functions and all strings returned by GLFW now use
UTF-8 encoding. This includes the window title, error string, clipboard text, the UTF-8 encoding. This includes the window title, error string, clipboard
monitor and joystick names as well as the extension function arguments (as ASCII text, monitor and joystick names as well as the extension function arguments (as
is a subset of UTF-8). ASCII is a subset of UTF-8).
@subsection news_30_clipboard Clipboard text I/O @subsection news_30_clipboard Clipboard text I/O
GLFW now supports reading and writing plain text to and from the system GLFW now supports reading and writing plain text to and from the system
clipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString clipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString
functions. functions.
@subsection news_30_gamma Gamma ramp support @subsection news_30_gamma Gamma ramp support
GLFW now supports setting and reading back the gamma ramp of monitors, with the GLFW now supports setting and reading back the gamma ramp of monitors, with the
@ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions. There is also @ref @ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions. There is also @ref
glfwSetGamma, which generates a ramp from a gamma value and then sets it. glfwSetGamma, which generates a ramp from a gamma value and then sets it.
@subsection news_30_gles OpenGL ES and EGL support @subsection news_30_gles OpenGL ES support
GLFW now supports the creation of OpenGL ES contexts, by setting the 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 `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 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 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 drivers support creation of OpenGL ES context using the GLX and WGL APIs, while
AMD provides an EGL implementation instead. AMD provides an EGL implementation instead.
GLFW now has an (experimental) EGL context creation back end, which can be
selected through CMake options. @subsection news_30_egl (Experimental) EGL support
GLFW now has an experimental EGL context creation back end that can be selected
@subsection news_30_hidpi High-DPI support through CMake options.
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, @subsection news_30_hidpi High-DPI support
@ref glfwGetFramebufferSize and @ref glfwSetFramebufferSizeCallback have been
added. These work with pixels, while the rest of the GLFW API work with screen GLFW now supports high-DPI monitors on both Windows and OS X, giving windows full
coordinates. 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
@subsection news_30_error Error callback coordinates.
GLFW now has an error callback, which can provide your application with much
more detailed diagnostics than was previously possible. The callback is passed @subsection news_30_error Error callback
an error code and a description string.
GLFW now has an error callback, which can provide your application with much
more detailed diagnostics than was previously possible. The callback is passed
@subsection news_30_wndptr Per-window user pointer an error code and a description string.
Each window object has a user-defined pointer, retrieved with @ref
glfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it @subsection news_30_wndptr Per-window user pointer
easier to integrate GLFW into C++ code.
Each window now has a user-defined pointer, retrieved with @ref
glfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it
@subsection news_30_iconifyfun Window iconification callback easier to integrate GLFW into C++ code.
Each window object has a callback for iconification and restoration events,
which is set with @ref glfwSetWindowIconifyCallback. @subsection news_30_iconifyfun Window iconification callback
Each window now has a callback for iconification and restoration events,
@subsection news_30_wndposfun Window position callback which is set with @ref glfwSetWindowIconifyCallback.
Each window object has a callback for position events, which is set with @ref
glfwSetWindowPosCallback. @subsection news_30_wndposfun Window position callback
Each window now has a callback for position events, which is set with @ref
@subsection news_30_wndpos Window position query glfwSetWindowPosCallback.
The position of a window can now be retrieved using @ref glfwGetWindowPos.
@subsection news_30_wndpos Window position query
@subsection news_30_focusfun Window focus callback The position of a window can now be retrieved using @ref glfwGetWindowPos.
Windows now have a callback for focus events, which is set with @ref
glfwSetWindowFocusCallback. @subsection news_30_focusfun Window focus callback
Each windows now has a callback for focus events, which is set with @ref
@subsection news_30_wndtitle Initial window title glfwSetWindowFocusCallback.
The title of a window is now specified at creation time, as one of the arguments
to @ref glfwCreateWindow. @subsection news_30_enterleave Cursor enter/leave callback
Each window now has a callback for when the mouse cursor enters or leaves its
@subsection news_30_hidden Hidden windows client area, which is set with @ref glfwSetCursorEnterCallback.
Windows can now be hidden with @ref glfwHideWindow, shown using @ref
glfwShowWindow and created initially hidden with the `GLFW_VISIBLE` window hint. @subsection news_30_wndtitle Initial window title
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. The title of a window is now specified at creation time, as one of the arguments
to @ref glfwCreateWindow.
@subsection news_30_undecorated Undecorated windows
@subsection news_30_hidden Hidden windows
Windowed mode windows can now be created without decorations, i.e. things like
a frame, a title bar, with the `GLFW_DECORATED` window hint. This allows for Windows can now be hidden with @ref glfwHideWindow, shown using @ref
the creation of things like splash screens. 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_keymods Modifier key bit masks
[Modifier key bit mask](@ref mods) parameters have been added to the @subsection news_30_undecorated Undecorated windows
[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.
Windowed mode windows can now be created without decorations, i.e. things like
a frame, a title bar, with the `GLFW_DECORATED` window hint. This allows for
@subsection news_30_scancode Platform-specific scancodes the creation of things like splash screens.
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 @subsection news_30_keymods Modifier key bit masks
parameter set to `GLFW_KEY_UNKNOWN`. These scancodes will vary between machines
and are intended to be used for key bindings. [Modifier key bit mask](@ref mods) parameters have been added to the
[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.
@subsection news_30_jsname Joystick names
@subsection news_30_scancode Platform-specific scancodes
The name of a joystick can now be retrieved using @ref glfwGetJoystickName.
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
@subsection news_30_doxygen Doxygen documentation parameter set to `GLFW_KEY_UNKNOWN`. These scancodes will vary between machines
and are intended to be used for key bindings.
You are reading it.
*/ @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.
*/
+6 -3
View File
@@ -140,9 +140,9 @@ full screen, just pass along the monitor handle:
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL); GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL);
@endcode @endcode
Full screen windows cover the entire screen, have no border or decorations, and Full screen windows cover the entire display area of a monitor, have no border
change the monitor's resolution to the one most closely matching the requested or decorations, and change the monitor's resolution to the one most closely
window size. matching the requested window size.
When you are done with the window, destroy it with the @ref glfwDestroyWindow When you are done with the window, destroy it with the @ref glfwDestroyWindow
function. function.
@@ -302,4 +302,7 @@ the screen, rendering a triangle and processing events until the user closes the
window. It can be found in the source distribution as `examples/simple.c`, and window. It can be found in the source distribution as `examples/simple.c`, and
is by default compiled along with all other examples when you build GLFW. is by default compiled along with all other examples when you build GLFW.
To learn more about how to compile and link programs that use GLFW, see
@ref build.
*/ */
+106 -11
View File
@@ -6,7 +6,7 @@
The primary purpose of GLFW is to provide a simple interface to window The primary purpose of GLFW is to provide a simple interface to window
management and OpenGL and OpenGL ES context creation. GLFW supports multiple management and OpenGL and OpenGL ES context creation. GLFW supports multiple
windows, which can be either a normal desktop window or a fullscreen window. windows, which can be either a normal desktop window or a full screen window.
@section window_object Window handles @section window_object Window handles
@@ -17,6 +17,59 @@ created with @ref glfwCreateWindow and destroyed with @ref glfwDestroyWindow (or
linked, the object pointer is used as both a context and window handle. linked, the object pointer is used as both a context and window handle.
@section window_creation Window creation
The window and its context are created with @ref glfwCreateWindow, which
returns a handle to the created window object. For example, this creates a 640
by 480 windowed mode window:
@code
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
@endcode
If window creation fails, `NULL` will be returned, so you need to check whether
it did.
This handle is then passed to all window related functions, and is provided to
you along with input events, so you know which window received the input.
To create a full screen window, you need to specify which monitor the window
should use. In most cases, the user's primary monitor is a good choice. For
more information about monitors, see the @ref monitor.
@code
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL);
@endcode
Full screen windows cover the entire display area of a monitor, have no border
or decorations, and change the monitor's resolution to the one most closely
matching the requested window size.
For more control over how the window and its context are created, see @ref
window_hints below.
@section window_destruction Window destruction
When you are done with the window, destroy it with the @ref glfwDestroyWindow
function.
@code
glfwDestroyWindow(window);
@endcode
Once this function is called, no more events will be delivered for that window
and its handle becomes invalid.
@section window_userptr Window user pointer
Each window has a user pointer that can be set with @ref
glfwSetWindowUserPointer and fetched with @ref glfwGetWindowUserPointer. This
can be used for any purpose you need and will not modified by GLFW throughout
the life-time of the window.
@section window_hints Window creation hints @section window_hints Window creation hints
There are a number of hints that can be set before the creation of a window and There are a number of hints that can be set before the creation of a window and
@@ -54,14 +107,14 @@ Hints that do not apply to a given type of window or context are ignored.
The `GLFW_RESIZABLE` hint specifies whether the window will be resizable *by the The `GLFW_RESIZABLE` hint specifies whether the window will be resizable *by the
user*. The window will still be resizable using the @ref glfwSetWindowSize user*. The window will still be resizable using the @ref glfwSetWindowSize
function. This hint is ignored for fullscreen windows. function. This hint is ignored for full screen windows.
The `GLFW_VISIBLE` hint specifies whether the window will be initially The `GLFW_VISIBLE` hint specifies whether the window will be initially
visible. This hint is ignored for fullscreen windows. visible. This hint is ignored for full screen windows.
The `GLFW_DECORATED` hint specifies whether the window will have window The `GLFW_DECORATED` hint specifies whether the window will have window
decorations such as a border, a close widget, etc. This hint is ignored for decorations such as a border, a close widget, etc. This hint is ignored for
fullscreen windows. Note that even though a window may lack a close widget, it full screen windows. Note that even though a window may lack a close widget, it
is usually still possible for the user to generate close events. is usually still possible for the user to generate close events.
@@ -227,13 +280,11 @@ the system, you can set the size callback with @ref glfwSetWindowSizeCallback.
glfwSetWindowSizeCallback(window, window_size_callback); glfwSetWindowSizeCallback(window, window_size_callback);
@endcode @endcode
The callback function receives the new size of the client area of the window, The callback function receives the new size of the client area of the window.
which can for example be used to update the viewport.
@code @code
void window_size_callback(GLFWwindow* window, int width, int height) void window_size_callback(GLFWwindow* window, int width, int height)
{ {
glViewport(0, 0, width, height);
} }
@endcode @endcode
@@ -243,9 +294,49 @@ a window.
@code @code
int width, height; int width, height;
glfwGetWindowSize(window, &width, &height); glfwGetWindowSize(window, &width, &height);
@endcode
@section window_fbsize Window framebuffer size
While the size of a window is measured in screen coordinates, OpenGL works with
pixels. The size you pass into `glViewport`, for example, should be in pixels
and not screen coordinates. On some platforms screen coordinates and pixels are
the same, but this is not the case on all platforms supported by GLFW. There is
a second set of functions to retrieve the size in pixels of the framebuffer of
a window.
If you wish to be notified when the framebuffer of a window is resized, whether
by the user or the system, you can set the size callback with @ref
glfwSetFramebufferSizeCallback.
@code
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
@endcode
The callback function receives the new size of the client area of the window,
which can for example be used to update the OpenGL viewport.
@code
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
@endcode
There is also @ref glfwGetFramebufferSize for directly retrieving the current
size of the framebuffer of a window.
@code
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
@endcode @endcode
Note that the size of a framebuffer may change independently of the size of
a window, for example if the window is dragged between a regular monitor and
a high-DPI one.
@section window_pos Window position @section window_pos Window position
@@ -357,7 +448,9 @@ context is an OpenGL debug context, or `GL_FALSE` otherwise.
The `GLFW_OPENGL_PROFILE` attribute indicates the OpenGL profile used by the The `GLFW_OPENGL_PROFILE` attribute indicates the OpenGL profile used by the
context. This is `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE` context. This is `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE`
if the context uses a known profile, or `GLFW_OPENGL_ANY_PROFILE` if the if the context uses a known profile, or `GLFW_OPENGL_ANY_PROFILE` if the
OpenGL profile is unknown or the context is for another client API. OpenGL profile is unknown or the context is for another client API. Note that
the returned profile may not match the profile bits of the context flags, as
GLFW will try other means of detecting the profile when no bits are set.
The `GLFW_CONTEXT_ROBUSTNESS` attribute indicates the robustness strategy The `GLFW_CONTEXT_ROBUSTNESS` attribute indicates the robustness strategy
used by the context. This is `GLFW_LOSE_CONTEXT_ON_RESET` or used by the context. This is `GLFW_LOSE_CONTEXT_ON_RESET` or
@@ -394,8 +487,10 @@ zero can be useful for benchmarking purposes, when it is not desirable to
measure the time it takes to wait for the vertical retrace. However, a swap measure the time it takes to wait for the vertical retrace. However, a swap
interval of one lets you avoid tearing. interval of one lets you avoid tearing.
Note that not all OpenGL implementations properly implement this function, in Note that this may not work on all machines, as some drivers have
which case @ref glfwSwapInterval will have no effect. Some drivers also have user-controlled settings that override any swap interval the application
user settings that override requests by GLFW. requests. It is also by default disabled on Windows Vista and later when using
DWM (Aero), as using it there sometimes leads to severe jitter. You can
forcibly enable it for machines using DWM using @ref compile_options_win32.
*/ */
-4
View File
@@ -11,10 +11,6 @@ endif()
include_directories(${GLFW_SOURCE_DIR}/include include_directories(${GLFW_SOURCE_DIR}/include
${GLFW_SOURCE_DIR}/deps) ${GLFW_SOURCE_DIR}/deps)
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
if (NOT APPLE) if (NOT APPLE)
# HACK: This is NOTFOUND on OS X 10.8 # HACK: This is NOTFOUND on OS X 10.8
include_directories(${OPENGL_INCLUDE_DIR}) include_directories(${OPENGL_INCLUDE_DIR})
+1 -1
View File
@@ -644,7 +644,7 @@ int main(int argc, char** argv)
/* main loop */ /* main loop */
frame = 0; frame = 0;
iter = 0; iter = 0;
dt = last_update_time = glfwGetTime(); last_update_time = glfwGetTime();
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
{ {
+126 -83
View File
@@ -1,7 +1,6 @@
/************************************************************************* /*************************************************************************
* GLFW - An OpenGL library * GLFW 3.0 - www.glfw.org
* API version: 3.0 * A library for OpenGL, window and input
* WWW: http://www.glfw.org/
*------------------------------------------------------------------------ *------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard * Copyright (c) 2002-2006 Marcus Geelnard
* Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -45,21 +44,22 @@ extern "C" {
*/ */
/*! @defgroup error Error handling /*! @defgroup error Error handling
*/ */
/*! @defgroup gamma Gamma ramp support
*/
/*! @defgroup init Initialization and version information /*! @defgroup init Initialization and version information
*/ */
/*! @defgroup input Input handling /*! @defgroup input Input handling
*/ */
/*! @defgroup monitor Monitor handling /*! @defgroup monitor Monitor handling
*
* This is the reference documentation for monitor related functions and types.
* For more information, see the @ref monitor.
*/ */
/*! @defgroup time Time input /*! @defgroup time Time input
*/ */
/*! @defgroup window Window handling /*! @defgroup window Window handling
* *
* This is the reference documentation for the window handling API, including * This is the reference documentation for window related functions and types,
* creation, deletion and event polling. For more information, see the * including creation, deletion and event polling. For more information, see
* [article on window handling](@ref window). * the @ref window.
*/ */
@@ -131,45 +131,12 @@ extern "C" {
#define GLFW_CALLBACK_DEFINED #define GLFW_CALLBACK_DEFINED
#endif /* CALLBACK */ #endif /* CALLBACK */
/* Most <GL/glu.h> variants on Windows need wchar_t */ /* Most GL/glu.h variants on Windows need wchar_t
#if defined(_WIN32) * OpenGL/gl.h blocks the definition of ptrdiff_t by glext.h on OS X */
#if !defined(GLFW_INCLUDE_NONE)
#include <stddef.h> #include <stddef.h>
#endif #endif
/* ---------------- GLFW related system specific defines ----------------- */
#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)
#error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined"
#endif
#if defined(_WIN32) && defined(_GLFW_BUILD_DLL)
/* We are building a Win32 DLL */
#define GLFWAPI __declspec(dllexport)
#elif defined(_WIN32) && defined(GLFW_DLL)
/* We are calling a Win32 DLL */
#if defined(__LCC__)
#define GLFWAPI extern
#else
#define GLFWAPI __declspec(dllimport)
#endif
#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)
#define GLFWAPI __attribute__((visibility("default")))
#else
/* We are either building/calling a static lib or we are non-win32 */
#define GLFWAPI
#endif
/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */
/* Include the chosen client API headers. /* Include the chosen client API headers.
*/ */
#if defined(__APPLE_CC__) #if defined(__APPLE_CC__)
@@ -199,6 +166,41 @@ extern "C" {
#endif #endif
#endif #endif
#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)
/* GLFW_DLL is defined by users of GLFW when compiling programs that will link
* to the DLL version of the GLFW library. _GLFW_BUILD_DLL is defined by the
* GLFW configuration header when compiling the DLL version of the library.
*/
#error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined"
#endif
#if defined(_WIN32) && defined(_GLFW_BUILD_DLL)
/* We are building a Win32 DLL */
#define GLFWAPI __declspec(dllexport)
#elif defined(_WIN32) && defined(GLFW_DLL)
/* We are calling a Win32 DLL */
#if defined(__LCC__)
#define GLFWAPI extern
#else
#define GLFWAPI __declspec(dllimport)
#endif
#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)
#define GLFWAPI __attribute__((visibility("default")))
#else
/* We are either building/calling a static lib or we are non-win32 */
#define GLFWAPI
#endif
/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */
/************************************************************************* /*************************************************************************
* GLFW API tokens * GLFW API tokens
@@ -225,7 +227,7 @@ extern "C" {
* API changes. * API changes.
* @ingroup init * @ingroup init
*/ */
#define GLFW_VERSION_REVISION 0 #define GLFW_VERSION_REVISION 4
/*! @} */ /*! @} */
/*! @name Key and button actions /*! @name Key and button actions
@@ -704,8 +706,8 @@ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
* This is the function signature for cursor position callback functions. * This is the function signature for cursor position callback functions.
* *
* @param[in] window The window that received the event. * @param[in] window The window that received the event.
* @param[in] xpos The new x-coordinate of the cursor. * @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor.
* @param[in] ypos The new y-coordinate of the cursor. * @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor.
* *
* @sa glfwSetCursorPosCallback * @sa glfwSetCursorPosCallback
* *
@@ -763,7 +765,7 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
* This is the function signature for Unicode character callback functions. * This is the function signature for Unicode character callback functions.
* *
* @param[in] window The window that received the event. * @param[in] window The window that received the event.
* @param[in] character The Unicode code point of the character. * @param[in] codepoint The Unicode code point of the character.
* *
* @sa glfwSetCharCallback * @sa glfwSetCharCallback
* *
@@ -790,7 +792,7 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
* *
* @ingroup monitor * @ingroup monitor
*/ */
typedef struct typedef struct GLFWvidmode
{ {
/*! The width, in screen coordinates, of the video mode. /*! The width, in screen coordinates, of the video mode.
*/ */
@@ -818,9 +820,9 @@ typedef struct
* *
* @sa glfwGetGammaRamp glfwSetGammaRamp * @sa glfwGetGammaRamp glfwSetGammaRamp
* *
* @ingroup gamma * @ingroup monitor
*/ */
typedef struct typedef struct GLFWgammaramp
{ {
/*! An array of value describing the response of the red channel. /*! An array of value describing the response of the red channel.
*/ */
@@ -861,10 +863,7 @@ typedef struct
* *
* @note This function may only be called from the main thread. * @note This function may only be called from the main thread.
* *
* @note This function may take several seconds to complete on some systems, * @note **OS X:** This function will change the current directory of the
* while on other systems it may take only a fraction of a second to complete.
*
* @note **Mac OS X:** This function will change the current directory of the
* application to the `Contents/Resources` subdirectory of the application's * application to the `Contents/Resources` subdirectory of the application's
* bundle, if present. * bundle, if present.
* *
@@ -1119,12 +1118,12 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);
/*! @brief Generates a gamma ramp and sets it for the specified monitor. /*! @brief Generates a gamma ramp and sets it for the specified monitor.
* *
* This function generates a 256-element gamma ramp from the specified exponent * This function generates a 256-element gamma ramp from the specified exponent
* and then calls @ref glfwSetGamma with it. * and then calls @ref glfwSetGammaRamp with it.
* *
* @param[in] monitor The monitor whose gamma ramp to set. * @param[in] monitor The monitor whose gamma ramp to set.
* @param[in] gamma The desired exponent. * @param[in] gamma The desired exponent.
* *
* @ingroup gamma * @ingroup monitor
*/ */
GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);
@@ -1138,7 +1137,7 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);
* @note The value arrays of the returned ramp are allocated and freed by GLFW. * @note The value arrays of the returned ramp are allocated and freed by GLFW.
* You should not free them yourself. * You should not free them yourself.
* *
* @ingroup gamma * @ingroup monitor
*/ */
GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);
@@ -1151,7 +1150,7 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);
* *
* @note Gamma ramp sizes other than 256 are not supported by all hardware. * @note Gamma ramp sizes other than 256 are not supported by all hardware.
* *
* @ingroup gamma * @ingroup monitor
*/ */
GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp);
@@ -1207,10 +1206,16 @@ GLFWAPI void glfwWindowHint(int target, int hint);
* attributes of the created window and context, use queries like @ref * attributes of the created window and context, use queries like @ref
* glfwGetWindowAttrib and @ref glfwGetWindowSize. * glfwGetWindowAttrib and @ref glfwGetWindowSize.
* *
* To create a full screen window, you need to specify the monitor to use. If
* no monitor is specified, windowed mode will be used. Unless you have a way
* for the user to choose a specific monitor, it is recommended that you pick
* the primary monitor. For more information on how to retrieve monitors, see
* @ref monitor_monitors.
*
* To create the window at a specific position, make it initially invisible * To create the window at a specific position, make it initially invisible
* using the `GLFW_VISIBLE` window hint, set its position and then show it. * using the `GLFW_VISIBLE` window hint, set its position and then show it.
* *
* If a fullscreen window is active, the screensaver is prohibited from * If a full screen window is active, the screensaver is prohibited from
* starting. * starting.
* *
* @param[in] width The desired width, in screen coordinates, of the window. * @param[in] width The desired width, in screen coordinates, of the window.
@@ -1224,17 +1229,26 @@ GLFWAPI void glfwWindowHint(int target, int hint);
* to not share resources. * to not share resources.
* @return The handle of the created window, or `NULL` if an error occurred. * @return The handle of the created window, or `NULL` if an error occurred.
* *
* @remarks **Windows:** Window creation will fail if the Microsoft GDI
* software OpenGL implementation is the only one available.
*
* @remarks **Windows:** If the executable has an icon resource named * @remarks **Windows:** If the executable has an icon resource named
* `GLFW_ICON,` it will be set as the icon for the window. If no such icon is * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is
* present, the `IDI_WINLOGO` icon will be used instead. * present, the `IDI_WINLOGO` icon will be used instead.
* *
* @remarks **Mac OS X:** The GLFW window has no icon, as it is not a document * @remarks **OS X:** The GLFW window has no icon, as it is not a document
* window, but the dock icon will be the same as the application bundle's icon. * window, but the dock icon will be the same as the application bundle's icon.
* Also, the first time a window is opened the menu bar is populated with * Also, the first time a window is opened the menu bar is populated with
* common commands like Hide, Quit and About. The (minimal) about dialog uses * common commands like Hide, Quit and About. The (minimal) about dialog uses
* information from the application's bundle. For more information on bundles, * information from the application's bundle. For more information on bundles,
* see the Bundle Programming Guide provided by Apple. * see the Bundle Programming Guide provided by Apple.
* *
* @remarks **X11:** There is no mechanism for setting the window icon yet.
*
* @remarks The swap interval is not set during window creation, but is left at
* the default value for that platform. For more information, see @ref
* glfwSwapInterval.
*
* @note This function may only be called from the main thread. * @note This function may only be called from the main thread.
* *
* @sa glfwDestroyWindow * @sa glfwDestroyWindow
@@ -1272,6 +1286,8 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow* window);
* @param[in] window The window to query. * @param[in] window The window to query.
* @return The value of the close flag. * @return The value of the close flag.
* *
* @remarks This function may be called from secondary threads.
*
* @ingroup window * @ingroup window
*/ */
GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); GLFWAPI int glfwWindowShouldClose(GLFWwindow* window);
@@ -1285,6 +1301,8 @@ GLFWAPI int glfwWindowShouldClose(GLFWwindow* window);
* @param[in] window The window whose flag to change. * @param[in] window The window whose flag to change.
* @param[in] value The new value. * @param[in] value The new value.
* *
* @remarks This function may be called from secondary threads.
*
* @ingroup window * @ingroup window
*/ */
GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value);
@@ -1342,10 +1360,6 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
* *
* @note The window manager may put limits on what positions are allowed. * @note The window manager may put limits on what positions are allowed.
* *
* @bug **X11:** Some window managers ignore the set position of hidden (i.e.
* unmapped) windows, instead placing them where it thinks is appropriate once
* they are shown.
*
* @sa glfwGetWindowPos * @sa glfwGetWindowPos
* *
* @ingroup window * @ingroup window
@@ -1355,7 +1369,8 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
/*! @brief Retrieves the size of the client area of the specified window. /*! @brief Retrieves the size of the client area of the specified window.
* *
* This function retrieves the size, in screen coordinates, of the client area * This function retrieves the size, in screen coordinates, of the client area
* of the specified window. * of the specified window. If you wish to retrieve the size of the
* framebuffer in pixels, see @ref glfwGetFramebufferSize.
* *
* @param[in] window The window whose size to retrieve. * @param[in] window The window whose size to retrieve.
* @param[out] width Where to store the width, in screen coordinates, of the * @param[out] width Where to store the width, in screen coordinates, of the
@@ -1396,7 +1411,8 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height);
/*! @brief Retrieves the size of the framebuffer of the specified window. /*! @brief Retrieves the size of the framebuffer of the specified window.
* *
* This function retrieves the size, in pixels, of the framebuffer of the * This function retrieves the size, in pixels, of the framebuffer of the
* specified window. * specified window. If you wish to retrieve the size of the window in screen
* coordinates, see @ref glfwGetWindowSize.
* *
* @param[in] window The window whose framebuffer to query. * @param[in] window The window whose framebuffer to query.
* @param[out] width Where to store the width, in pixels, of the framebuffer, * @param[out] width Where to store the width, in pixels, of the framebuffer,
@@ -1579,7 +1595,10 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
* @return The previously set callback, or `NULL` if no callback was set or an * @return The previously set callback, or `NULL` if no callback was set or an
* error occurred. * error occurred.
* *
* @remarks **Mac OS X:** Selecting Quit from the application menu will * @par New in GLFW 3
* The close callback no longer returns a value.
*
* @remarks **OS X:** Selecting Quit from the application menu will
* trigger the close callback for all windows. * trigger the close callback for all windows.
* *
* @ingroup window * @ingroup window
@@ -1672,6 +1691,12 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window
* This function is no longer called by @ref glfwSwapBuffers. You need to call * This function is no longer called by @ref glfwSwapBuffers. You need to call
* it or @ref glfwWaitEvents yourself. * it or @ref glfwWaitEvents yourself.
* *
* @remarks On some platforms, a window move, resize or menu operation will
* cause event processing to block. This is due to how event processing is
* designed on those platforms. You can use the
* [window refresh callback](@ref GLFWwindowrefreshfun) to redraw the contents
* of your window when necessary during the operation.
*
* @note This function may only be called from the main thread. * @note This function may only be called from the main thread.
* *
* @note This function may not be called from a callback. * @note This function may not be called from a callback.
@@ -1688,7 +1713,7 @@ GLFWAPI void glfwPollEvents(void);
/*! @brief Waits until events are pending and processes them. /*! @brief Waits until events are pending and processes them.
* *
* This function puts the calling thread to sleep until at least one event has * This function puts the calling thread to sleep until at least one event has
* been received. Once one or more events have been recevied, it behaves as if * been received. Once one or more events have been received, it behaves as if
* @ref glfwPollEvents was called, i.e. the events are processed and the * @ref glfwPollEvents was called, i.e. the events are processed and the
* function then returns immediately. Processing events will cause the window * function then returns immediately. Processing events will cause the window
* and input callbacks associated with those events to be called. * and input callbacks associated with those events to be called.
@@ -1699,6 +1724,12 @@ GLFWAPI void glfwPollEvents(void);
* *
* This function is not required for joystick input to work. * This function is not required for joystick input to work.
* *
* @remarks On some platforms, a window move, resize or menu operation will
* cause event processing to block. This is due to how event processing is
* designed on those platforms. You can use the
* [window refresh callback](@ref GLFWwindowrefreshfun) to redraw the contents
* of your window when necessary during the operation.
*
* @note This function may only be called from the main thread. * @note This function may only be called from the main thread.
* *
* @note This function may not be called from a callback. * @note This function may not be called from a callback.
@@ -1734,9 +1765,12 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
* modes: * modes:
* - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally.
* - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client
* area of the window. * area of the window but does not restrict the cursor from leaving. This is
* - `GLFW_CURSOR_DISABLED` disables the cursor and removes any limitations on * useful if you wish to render your own cursor or have no visible cursor at
* cursor movement. * all.
* - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual
* and unlimited cursor movement. This is useful for implementing for
* example 3D camera controls.
* *
* If `mode` is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to * If `mode` is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to
* enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are
@@ -1806,7 +1840,8 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
/*! @brief Retrieves the last reported cursor position, relative to the client /*! @brief Retrieves the last reported cursor position, relative to the client
* area of the window. * area of the window.
* *
* This function returns the last reported position of the cursor to the * This function returns the last reported position of the cursor, in screen
* coordinates, relative to the upper-left corner of the client area of the
* specified window. * specified window.
* *
* If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor
@@ -1829,11 +1864,13 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
*/ */
GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
/*! @brief Sets the position of the cursor, relative to the client area of the window. /*! @brief Sets the position of the cursor, relative to the client area of the
* window.
* *
* This function sets the position of the cursor. The specified window must be * This function sets the position, in screen coordinates, of the cursor
* focused. If the window does not have focus when this function is called, it * relative to the upper-left corner of the client area of the specified
* fails silently. * window. The window must be focused. If the window does not have focus when
* this function is called, it fails silently.
* *
* If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor
* position is unbounded and limited only by the minimum and maximum values of * position is unbounded and limited only by the minimum and maximum values of
@@ -1841,9 +1878,9 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
* *
* @param[in] window The desired window. * @param[in] window The desired window.
* @param[in] xpos The desired x-coordinate, relative to the left edge of the * @param[in] xpos The desired x-coordinate, relative to the left edge of the
* client area, or `NULL`. * client area.
* @param[in] ypos The desired y-coordinate, relative to the top edge of the * @param[in] ypos The desired y-coordinate, relative to the top edge of the
* client area, or `NULL`. * client area.
* *
* @sa glfwGetCursorPos * @sa glfwGetCursorPos
* *
@@ -1929,7 +1966,8 @@ GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmo
* *
* This function sets the cursor position callback of the specified window, * This function sets the cursor position callback of the specified window,
* which is called when the cursor is moved. The callback is provided with the * which is called when the cursor is moved. The callback is provided with the
* position relative to the upper-left corner of the client area of the window. * position, in screen coordinates, relative to the upper-left corner of the
* client area of the window.
* *
* @param[in] window The window whose callback to set. * @param[in] window The window whose callback to set.
* @param[in] cbfun The new callback, or `NULL` to remove the currently set * @param[in] cbfun The new callback, or `NULL` to remove the currently set
@@ -2006,14 +2044,14 @@ GLFWAPI int glfwJoystickPresent(int joy);
*/ */
GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count);
/*! @brief Returns the values of all buttons of the specified joystick. /*! @brief Returns the state of all buttons of the specified joystick.
* *
* This function returns the values of all buttons of the specified joystick. * This function returns the state of all buttons of the specified joystick.
* *
* @param[in] joy The joystick to query. * @param[in] joy The joystick to query.
* @param[out] count Where to store the size of the returned array. This is * @param[out] count Where to store the size of the returned array. This is
* set to zero if an error occurred. * set to zero if an error occurred.
* @return An array of axis values, or `NULL` if the joystick is not present. * @return An array of button states, or `NULL` if the joystick is not present.
* *
* @note The returned array is allocated and freed by GLFW. You should not * @note The returned array is allocated and freed by GLFW. You should not
* free it yourself. * free it yourself.
@@ -2189,6 +2227,11 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window);
* *
* @remarks This function may be called from secondary threads. * @remarks This function may be called from secondary threads.
* *
* @note This function is not called during window creation, leaving the swap
* interval set to whatever is the default on that platform. This is done
* because some swap interval extensions used by GLFW do not allow the swap
* interval to be reset to zero once it has been set to a non-zero value.
*
* @note Some GPU drivers do not honor the requested swap interval, either * @note Some GPU drivers do not honor the requested swap interval, either
* because of user settings that override the request or due to bugs in the * because of user settings that override the request or due to bugs in the
* driver. * driver.
+5 -6
View File
@@ -1,7 +1,6 @@
/************************************************************************* /*************************************************************************
* GLFW - An OpenGL library * GLFW 3.0 - www.glfw.org
* API version: 3.0 * A library for OpenGL, window and input
* WWW: http://www.glfw.org/
*------------------------------------------------------------------------ *------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard * Copyright (c) 2002-2006 Marcus Geelnard
* Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -41,7 +40,7 @@ extern "C" {
/*! @defgroup native Native access /*! @defgroup native Native access
* *
* **By using the native API, you assert that you know what you are doing and * **By using the native API, you assert that you know what you're doing and
* how to fix problems caused by using it. If you don't, you shouldn't be * how to fix problems caused by using it. If you don't, you shouldn't be
* using it.** * using it.**
* *
@@ -60,8 +59,8 @@ extern "C" {
* * `GLFW_EXPOSE_NATIVE_GLX` * * `GLFW_EXPOSE_NATIVE_GLX`
* * `GLFW_EXPOSE_NATIVE_EGL` * * `GLFW_EXPOSE_NATIVE_EGL`
* *
* These macros select which of the native access functions are declared and * These macros select which of the native access functions that are declared
* 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.
*/ */
+9 -8
View File
@@ -3,11 +3,11 @@ include_directories(${GLFW_SOURCE_DIR}/src
${GLFW_BINARY_DIR}/src ${GLFW_BINARY_DIR}/src
${glfw_INCLUDE_DIRS}) ${glfw_INCLUDE_DIRS})
if (MSVC) add_definitions(-D_GLFW_USE_CONFIG_H)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h internal.h) set(common_HEADERS ${GLFW_BINARY_DIR}/src/glfw_config.h internal.h
${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h
${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h)
set(common_SOURCES clipboard.c context.c gamma.c init.c input.c joystick.c set(common_SOURCES clipboard.c context.c gamma.c init.c input.c joystick.c
monitor.c time.c window.c) monitor.c time.c window.c)
@@ -74,14 +74,15 @@ if (BUILD_SHARED_LIBS)
set(glfw_CFLAGS "") set(glfw_CFLAGS "")
endif() endif()
set_target_properties(glfw PROPERTIES set_target_properties(glfw PROPERTIES
COMPILE_FLAGS "${glfw_CFLAGS} -fno-common") COMPILE_FLAGS "${glfw_CFLAGS} -fno-common"
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")
endif() endif()
target_link_libraries(glfw ${glfw_LIBRARIES}) target_link_libraries(glfw ${glfw_LIBRARIES})
target_link_libraries(glfw LINK_INTERFACE_LIBRARIES) target_link_libraries(glfw LINK_INTERFACE_LIBRARIES)
endif() endif()
install(TARGETS glfw if (GLFW_INSTALL)
EXPORT glfwTargets install(TARGETS glfw EXPORT glfwTargets DESTINATION lib${LIB_SUFFIX})
DESTINATION lib${LIB_SUFFIX} ) endif()
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
+4 -7
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -43,7 +40,7 @@
void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
{ {
uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID); uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);
CGGammaValue* values = (CGGammaValue*) malloc(size * 3 * sizeof(CGGammaValue)); CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));
CGGetDisplayTransferByTable(monitor->ns.displayID, CGGetDisplayTransferByTable(monitor->ns.displayID,
size, size,
@@ -52,7 +49,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
values + size * 2, values + size * 2,
&size); &size);
_glfwAllocGammaRamp(ramp, size); _glfwAllocGammaArrays(ramp, size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
@@ -67,7 +64,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
{ {
int i; int i;
CGGammaValue* values = (CGGammaValue*) malloc(ramp->size * 3 * sizeof(CGGammaValue)); CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));
for (i = 0; i < ramp->size; i++) for (i = 0; i < ramp->size; i++)
{ {
+10 -13
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa/NSOpenGL
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -84,19 +81,18 @@ int _glfwPlatformInit(void)
changeToResourcesDirectory(); changeToResourcesDirectory();
#endif #endif
_glfwInitTimer();
_glfwInitJoysticks();
if (!_glfwInitContextAPI())
return GL_FALSE;
_glfw.ns.eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); _glfw.ns.eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
if (!_glfw.ns.eventSource) if (!_glfw.ns.eventSource)
return GL_FALSE; return GL_FALSE;
CGEventSourceSetLocalEventsSuppressionInterval(_glfw.ns.eventSource, 0.0); CGEventSourceSetLocalEventsSuppressionInterval(_glfw.ns.eventSource, 0.0);
if (!_glfwInitContextAPI())
return GL_FALSE;
_glfwInitTimer();
_glfwInitJoysticks();
return GL_TRUE; return GL_TRUE;
} }
@@ -118,14 +114,15 @@ void _glfwPlatformTerminate(void)
[_glfw.ns.cursor release]; [_glfw.ns.cursor release];
_glfw.ns.cursor = nil; _glfw.ns.cursor = nil;
_glfwTerminateJoysticks(); free(_glfw.ns.clipboardString);
_glfwTerminateJoysticks();
_glfwTerminateContextAPI(); _glfwTerminateContextAPI();
} }
const char* _glfwPlatformGetVersionString(void) const char* _glfwPlatformGetVersionString(void)
{ {
const char* version = _GLFW_VERSION_FULL " Cocoa" const char* version = _GLFW_VERSION_NUMBER " Cocoa"
#if defined(_GLFW_NSGL) #if defined(_GLFW_NSGL)
" NSGL" " NSGL"
#endif #endif
+19 -26
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net> // Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>
@@ -113,7 +110,7 @@ static void addJoystickElement(_GLFWjoy* joystick, CFTypeRef elementRef)
{ {
long number; long number;
CFTypeRef numberRef; CFTypeRef numberRef;
_GLFWjoyelement* element = (_GLFWjoyelement*) malloc(sizeof(_GLFWjoyelement)); _GLFWjoyelement* element = calloc(1, sizeof(_GLFWjoyelement));
CFArrayAppendValue(elementsArray, element); CFArrayAppendValue(elementsArray, element);
@@ -254,9 +251,6 @@ static void pollJoystickEvents(void)
joystick->axes[i] = value; joystick->axes[i] = value;
else else
joystick->axes[i] = (2.f * (value - axis->minReport) / readScale) - 1.f; joystick->axes[i] = (2.f * (value - axis->minReport) / readScale) - 1.f;
if (i & 1)
joystick->axes[i] = -joystick->axes[i];
} }
for (i = 0; i < CFArrayGetCount(joystick->hatElements); i++) for (i = 0; i < CFArrayGetCount(joystick->hatElements); i++)
@@ -322,8 +316,9 @@ void _glfwInitJoysticks(void)
while ((ioHIDDeviceObject = IOIteratorNext(objectIterator))) while ((ioHIDDeviceObject = IOIteratorNext(objectIterator)))
{ {
CFMutableDictionaryRef propsRef = NULL;
CFTypeRef valueRef = NULL;
kern_return_t result; kern_return_t result;
CFTypeRef valueRef = 0;
IOCFPlugInInterface** ppPlugInInterface = NULL; IOCFPlugInInterface** ppPlugInInterface = NULL;
HRESULT plugInResult = S_OK; HRESULT plugInResult = S_OK;
@@ -332,26 +327,29 @@ void _glfwInitJoysticks(void)
long usagePage, usage; long usagePage, usage;
// Check device type // Check device type
valueRef = IORegistryEntryCreateCFProperty(ioHIDDeviceObject, result = IORegistryEntryCreateCFProperties(ioHIDDeviceObject,
CFSTR(kIOHIDPrimaryUsagePageKey), &propsRef,
kCFAllocatorDefault, kCFAllocatorDefault,
kNilOptions); kNilOptions);
if (result != kIOReturnSuccess)
continue;
valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsagePageKey));
if (valueRef) if (valueRef)
{ {
CFNumberGetValue(valueRef, kCFNumberLongType, &usagePage); CFNumberGetValue(valueRef, kCFNumberLongType, &usagePage);
if (usagePage != kHIDPage_GenericDesktop) if (usagePage != kHIDPage_GenericDesktop)
{ {
// This device is not relevant to GLFW // This device is not relevant to GLFW
CFRelease(valueRef);
continue; continue;
} }
CFRelease(valueRef); CFRelease(valueRef);
} }
valueRef = IORegistryEntryCreateCFProperty(ioHIDDeviceObject, valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsageKey));
CFSTR(kIOHIDPrimaryUsageKey),
kCFAllocatorDefault,
kNilOptions);
if (valueRef) if (valueRef)
{ {
CFNumberGetValue(valueRef, kCFNumberLongType, &usage); CFNumberGetValue(valueRef, kCFNumberLongType, &usage);
@@ -361,6 +359,7 @@ void _glfwInitJoysticks(void)
usage != kHIDUsage_GD_MultiAxisController)) usage != kHIDUsage_GD_MultiAxisController))
{ {
// This device is not relevant to GLFW // This device is not relevant to GLFW
CFRelease(valueRef);
continue; continue;
} }
@@ -396,10 +395,7 @@ void _glfwInitJoysticks(void)
joystick); joystick);
// Get product string // Get product string
valueRef = IORegistryEntryCreateCFProperty(ioHIDDeviceObject, valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDProductKey));
CFSTR(kIOHIDProductKey),
kCFAllocatorDefault,
kNilOptions);
if (valueRef) if (valueRef)
{ {
CFStringGetCString(valueRef, CFStringGetCString(valueRef,
@@ -413,10 +409,7 @@ void _glfwInitJoysticks(void)
joystick->buttonElements = CFArrayCreateMutable(NULL, 0, NULL); joystick->buttonElements = CFArrayCreateMutable(NULL, 0, NULL);
joystick->hatElements = CFArrayCreateMutable(NULL, 0, NULL); joystick->hatElements = CFArrayCreateMutable(NULL, 0, NULL);
valueRef = IORegistryEntryCreateCFProperty(ioHIDDeviceObject, valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDElementKey));
CFSTR(kIOHIDElementKey),
kCFAllocatorDefault,
kNilOptions);
if (CFGetTypeID(valueRef) == CFArrayGetTypeID()) if (CFGetTypeID(valueRef) == CFArrayGetTypeID())
{ {
CFRange range = { 0, CFArrayGetCount(valueRef) }; CFRange range = { 0, CFArrayGetCount(valueRef) };
@@ -427,10 +420,10 @@ void _glfwInitJoysticks(void)
CFRelease(valueRef); CFRelease(valueRef);
} }
joystick->axes = (float*) calloc(CFArrayGetCount(joystick->axisElements), joystick->axes = calloc(CFArrayGetCount(joystick->axisElements),
sizeof(float)); sizeof(float));
joystick->buttons = (unsigned char*) calloc(CFArrayGetCount(joystick->buttonElements) + joystick->buttons = calloc(CFArrayGetCount(joystick->buttonElements) +
CFArrayGetCount(joystick->hatElements) * 4, 1); CFArrayGetCount(joystick->hatElements) * 4, 1);
joy++; joy++;
if (joy > GLFW_JOYSTICK_LAST) if (joy > GLFW_JOYSTICK_LAST)
+35 -18
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -34,6 +31,9 @@
#include <limits.h> #include <limits.h>
#include <IOKit/graphics/IOGraphicsLib.h> #include <IOKit/graphics/IOGraphicsLib.h>
#include <IOKit/graphics/IOGraphicsLib.h>
#include <CoreVideo/CVBase.h>
#include <CoreVideo/CVDisplayLink.h>
// Get the name of the specified display // Get the name of the specified display
@@ -49,16 +49,18 @@ static const char* getDisplayName(CGDirectDisplayID displayID)
kIODisplayOnlyPreferredName); kIODisplayOnlyPreferredName);
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
if (!CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
(const void**) &value)) (const void**) &value))
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, "Failed to retrieve display name");
CFRelease(info); CFRelease(info);
return strdup("Unknown"); return strdup("Unknown");
} }
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value), size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),
kCFStringEncodingUTF8); kCFStringEncodingUTF8);
name = (char*) malloc(size + 1); name = calloc(size + 1, sizeof(char));
CFStringGetCString(value, name, size, kCFStringEncodingUTF8); CFStringGetCString(value, name, size, kCFStringEncodingUTF8);
CFRelease(info); CFRelease(info);
@@ -77,9 +79,6 @@ static GLboolean modeIsGood(CGDisplayModeRef mode)
if (flags & kDisplayModeInterlacedFlag) if (flags & kDisplayModeInterlacedFlag)
return GL_FALSE; return GL_FALSE;
if (flags & kDisplayModeTelevisionFlag)
return GL_FALSE;
if (flags & kDisplayModeStretchedFlag) if (flags & kDisplayModeStretchedFlag)
return GL_FALSE; return GL_FALSE;
@@ -97,13 +96,21 @@ static GLboolean modeIsGood(CGDisplayModeRef mode)
// Convert Core Graphics display mode to GLFW video mode // Convert Core Graphics display mode to GLFW video mode
// //
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode) static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
CVDisplayLinkRef link)
{ {
GLFWvidmode result; GLFWvidmode result;
result.width = CGDisplayModeGetWidth(mode); result.width = (int) CGDisplayModeGetWidth(mode);
result.height = CGDisplayModeGetHeight(mode); result.height = (int) CGDisplayModeGetHeight(mode);
result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode); result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);
if (result.refreshRate == 0)
{
const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
if (!(time.flags & kCVTimeIsIndefinite))
result.refreshRate = (int) (time.timeScale / (double) time.timeValue);
}
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)
@@ -253,8 +260,8 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
CGGetActiveDisplayList(0, NULL, &monitorCount); CGGetActiveDisplayList(0, NULL, &monitorCount);
displays = (CGDirectDisplayID*) calloc(monitorCount, sizeof(CGDirectDisplayID)); displays = calloc(monitorCount, sizeof(CGDirectDisplayID));
monitors = (_GLFWmonitor**) calloc(monitorCount, sizeof(_GLFWmonitor*)); monitors = calloc(monitorCount, sizeof(_GLFWmonitor*));
CGGetActiveDisplayList(monitorCount, displays, &monitorCount); CGGetActiveDisplayList(monitorCount, displays, &monitorCount);
@@ -337,11 +344,14 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
CFArrayRef modes; CFArrayRef modes;
CFIndex count, i; CFIndex count, i;
GLFWvidmode* result; GLFWvidmode* result;
CVDisplayLinkRef link;
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
count = CFArrayGetCount(modes); count = CFArrayGetCount(modes);
result = (GLFWvidmode*) malloc(sizeof(GLFWvidmode) * count); result = calloc(count, sizeof(GLFWvidmode));
*found = 0; *found = 0;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
@@ -351,21 +361,28 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
if (modeIsGood(mode)) if (modeIsGood(mode))
{ {
result[*found] = vidmodeFromCGDisplayMode(mode); result[*found] = vidmodeFromCGDisplayMode(mode, link);
(*found)++; (*found)++;
} }
} }
CFRelease(modes); CFRelease(modes);
CVDisplayLinkRelease(link);
return result; return result;
} }
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode) void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)
{ {
CGDisplayModeRef displayMode; CGDisplayModeRef displayMode;
CVDisplayLinkRef link;
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
*mode = vidmodeFromCGDisplayMode(displayMode); *mode = vidmodeFromCGDisplayMode(displayMode, link);
CGDisplayModeRelease(displayMode); CGDisplayModeRelease(displayMode);
CVDisplayLinkRelease(link);
} }
+1 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -108,8 +105,6 @@ typedef struct _GLFWlibraryNS
id autoreleasePool; id autoreleasePool;
id cursor; id cursor;
GLboolean cursorHidden;
char* clipboardString; char* clipboardString;
_GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1]; _GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1];
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
+139 -79
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa/NSOpenGL
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -33,6 +30,25 @@
#include <crt_externs.h> #include <crt_externs.h>
// Center the cursor in the view of the window
//
static void centerCursor(_GLFWwindow *window)
{
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);
}
// Update the cursor to match the specified cursor mode
//
static void setModeCursor(_GLFWwindow* window, int mode)
{
if (mode == GLFW_CURSOR_NORMAL)
[[NSCursor arrowCursor] set];
else
[(NSCursor*) _glfw.ns.cursor set];
}
// Enter fullscreen mode // Enter fullscreen mode
// //
static void enterFullscreenMode(_GLFWwindow* window) static void enterFullscreenMode(_GLFWwindow* window)
@@ -42,8 +58,18 @@ static void enterFullscreenMode(_GLFWwindow* window)
_glfwSetVideoMode(window->monitor, &window->videoMode); _glfwSetVideoMode(window->monitor, &window->videoMode);
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO],
NSFullScreenModeAllScreens,
nil];
[window->ns.view enterFullScreenMode:window->monitor->ns.screen [window->ns.view enterFullScreenMode:window->monitor->ns.screen
withOptions:nil]; withOptions:options];
// HACK: Synthesize focus event as window does not become key when the view
// is made full screen
// TODO: Remove this when moving to a full screen window
_glfwInputWindowFocus(window, GL_TRUE);
} }
// Leave fullscreen mode // Leave fullscreen mode
@@ -53,6 +79,11 @@ static void leaveFullscreenMode(_GLFWwindow* window)
if (![window->ns.view isInFullScreenMode]) if (![window->ns.view isInFullScreenMode])
return; return;
// HACK: Synthesize focus event as window does not become key when the view
// is made full screen
// TODO: Remove this when moving to a full screen window
_glfwInputWindowFocus(window, GL_FALSE);
_glfwRestoreVideoMode(window->monitor); _glfwRestoreVideoMode(window->monitor);
// Exit full screen after the video restore to avoid a nasty display // Exit full screen after the video restore to avoid a nasty display
@@ -69,6 +100,18 @@ static float transformY(float y)
return height - y; return height - y;
} }
// Returns the backing rect of the specified window
//
static NSRect convertRectToBacking(_GLFWwindow* window, NSRect contentRect)
{
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
return [window->ns.view convertRectToBacking:contentRect];
else
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
return contentRect;
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Delegate for window related notifications // Delegate for window related notifications
@@ -85,13 +128,6 @@ static float transformY(float y)
@implementation GLFWWindowDelegate @implementation GLFWWindowDelegate
static void centerCursor(_GLFWwindow *window)
{
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);
}
- (id)initWithGlfwWindow:(_GLFWwindow *)initWindow - (id)initWithGlfwWindow:(_GLFWwindow *)initWindow
{ {
self = [super init]; self = [super init];
@@ -112,7 +148,7 @@ static void centerCursor(_GLFWwindow *window)
[window->nsgl.context update]; [window->nsgl.context update];
const NSRect contentRect = [window->ns.view frame]; const NSRect contentRect = [window->ns.view frame];
const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect]; const NSRect fbRect = convertRectToBacking(window, contentRect);
_glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height); _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);
_glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height); _glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height);
@@ -150,14 +186,13 @@ static void centerCursor(_GLFWwindow *window)
- (void)windowDidBecomeKey:(NSNotification *)notification - (void)windowDidBecomeKey:(NSNotification *)notification
{ {
_glfwInputWindowFocus(window, GL_TRUE); _glfwInputWindowFocus(window, GL_TRUE);
_glfwPlatformSetCursorMode(window, window->cursorMode);
if (window->cursorMode == GLFW_CURSOR_DISABLED)
centerCursor(window);
} }
- (void)windowDidResignKey:(NSNotification *)notification - (void)windowDidResignKey:(NSNotification *)notification
{ {
_glfwInputWindowFocus(window, GL_FALSE); _glfwInputWindowFocus(window, GL_FALSE);
_glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);
} }
@end @end
@@ -208,7 +243,7 @@ static void centerCursor(_GLFWwindow *window)
@end @end
// Translates Mac OS X key modifiers into GLFW ones // Translates OS X key modifiers into GLFW ones
// //
static int translateFlags(NSUInteger flags) static int translateFlags(NSUInteger flags)
{ {
@@ -226,12 +261,11 @@ static int translateFlags(NSUInteger flags)
return mods; return mods;
} }
// Translates a Mac OS X keycode to a GLFW keycode // Translates a OS X keycode to a GLFW keycode
// //
static int translateKey(unsigned int key) static int translateKey(unsigned int key)
{ {
// Keyboard symbol translation table // Keyboard symbol translation table
// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject.
static const unsigned int table[128] = static const unsigned int table[128] =
{ {
/* 00 */ GLFW_KEY_A, /* 00 */ GLFW_KEY_A,
@@ -244,7 +278,7 @@ static int translateKey(unsigned int key)
/* 07 */ GLFW_KEY_X, /* 07 */ GLFW_KEY_X,
/* 08 */ GLFW_KEY_C, /* 08 */ GLFW_KEY_C,
/* 09 */ GLFW_KEY_V, /* 09 */ GLFW_KEY_V,
/* 0a */ GLFW_KEY_GRAVE_ACCENT, /* 0a */ GLFW_KEY_WORLD_1,
/* 0b */ GLFW_KEY_B, /* 0b */ GLFW_KEY_B,
/* 0c */ GLFW_KEY_Q, /* 0c */ GLFW_KEY_Q,
/* 0d */ GLFW_KEY_W, /* 0d */ GLFW_KEY_W,
@@ -284,7 +318,7 @@ static int translateKey(unsigned int key)
/* 2f */ GLFW_KEY_PERIOD, /* 2f */ GLFW_KEY_PERIOD,
/* 30 */ GLFW_KEY_TAB, /* 30 */ GLFW_KEY_TAB,
/* 31 */ GLFW_KEY_SPACE, /* 31 */ GLFW_KEY_SPACE,
/* 32 */ GLFW_KEY_WORLD_1, /* 32 */ GLFW_KEY_GRAVE_ACCENT,
/* 33 */ GLFW_KEY_BACKSPACE, /* 33 */ GLFW_KEY_BACKSPACE,
/* 34 */ GLFW_KEY_UNKNOWN, /* 34 */ GLFW_KEY_UNKNOWN,
/* 35 */ GLFW_KEY_ESCAPE, /* 35 */ GLFW_KEY_ESCAPE,
@@ -339,7 +373,7 @@ static int translateKey(unsigned int key)
/* 66 */ GLFW_KEY_UNKNOWN, /* 66 */ GLFW_KEY_UNKNOWN,
/* 67 */ GLFW_KEY_F11, /* 67 */ GLFW_KEY_F11,
/* 68 */ GLFW_KEY_UNKNOWN, /* 68 */ GLFW_KEY_UNKNOWN,
/* 69 */ GLFW_KEY_PRINT_SCREEN, /* 69 */ GLFW_KEY_F13,
/* 6a */ GLFW_KEY_F16, /* 6a */ GLFW_KEY_F16,
/* 6b */ GLFW_KEY_F14, /* 6b */ GLFW_KEY_F14,
/* 6c */ GLFW_KEY_UNKNOWN, /* 6c */ GLFW_KEY_UNKNOWN,
@@ -436,6 +470,11 @@ static int translateKey(unsigned int key)
return YES; return YES;
} }
- (void)cursorUpdate:(NSEvent *)event
{
setModeCursor(window, window->cursorMode);
}
- (void)mouseDown:(NSEvent *)event - (void)mouseDown:(NSEvent *)event
{ {
_glfwInputMouseClick(window, _glfwInputMouseClick(window,
@@ -494,7 +533,7 @@ static int translateKey(unsigned int key)
- (void)otherMouseDown:(NSEvent *)event - (void)otherMouseDown:(NSEvent *)event
{ {
_glfwInputMouseClick(window, _glfwInputMouseClick(window,
[event buttonNumber], (int) [event buttonNumber],
GLFW_PRESS, GLFW_PRESS,
translateFlags([event modifierFlags])); translateFlags([event modifierFlags]));
} }
@@ -507,7 +546,7 @@ static int translateKey(unsigned int key)
- (void)otherMouseUp:(NSEvent *)event - (void)otherMouseUp:(NSEvent *)event
{ {
_glfwInputMouseClick(window, _glfwInputMouseClick(window,
[event buttonNumber], (int) [event buttonNumber],
GLFW_RELEASE, GLFW_RELEASE,
translateFlags([event modifierFlags])); translateFlags([event modifierFlags]));
} }
@@ -525,7 +564,7 @@ static int translateKey(unsigned int key)
- (void)viewDidChangeBackingProperties - (void)viewDidChangeBackingProperties
{ {
const NSRect contentRect = [window->ns.view frame]; const NSRect contentRect = [window->ns.view frame];
const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect]; const NSRect fbRect = convertRectToBacking(window, contentRect);
_glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height); _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);
} }
@@ -539,7 +578,8 @@ static int translateKey(unsigned int key)
} }
NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways | NSTrackingActiveInKeyWindow |
NSTrackingCursorUpdate |
NSTrackingInVisibleRect; NSTrackingInVisibleRect;
trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
@@ -548,7 +588,7 @@ static int translateKey(unsigned int key)
userInfo:nil]; userInfo:nil];
[self addTrackingArea:trackingArea]; [self addTrackingArea:trackingArea];
[super updateTrackingAreas]; [super updateTrackingAreas];
} }
- (void)keyDown:(NSEvent *)event - (void)keyDown:(NSEvent *)event
@@ -557,9 +597,6 @@ static int translateKey(unsigned int key)
const int mods = translateFlags([event modifierFlags]); const int mods = translateFlags([event modifierFlags]);
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods); _glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
if (mods & GLFW_MOD_SUPER)
return;
NSString* characters = [event characters]; NSString* characters = [event characters];
NSUInteger i, length = [characters length]; NSUInteger i, length = [characters length];
@@ -594,19 +631,31 @@ static int translateKey(unsigned int key)
- (void)scrollWheel:(NSEvent *)event - (void)scrollWheel:(NSEvent *)event
{ {
double deltaX = [event deltaX]; double deltaX, deltaY;
double deltaY = [event deltaY];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
{
deltaX = [event scrollingDeltaX];
deltaY = [event scrollingDeltaY];
if ([event hasPreciseScrollingDeltas])
{
deltaX *= 0.1;
deltaY *= 0.1;
}
}
else
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
{
deltaX = [event deltaX];
deltaY = [event deltaY];
}
if (fabs(deltaX) > 0.0 || fabs(deltaY) > 0.0) if (fabs(deltaX) > 0.0 || fabs(deltaY) > 0.0)
_glfwInputScroll(window, deltaX, deltaY); _glfwInputScroll(window, deltaX, deltaY);
} }
- (void)resetCursorRects
{
[self discardCursorRects];
[self addCursorRect:[self bounds] cursor:_glfw.ns.cursor];
}
@end @end
@@ -656,7 +705,7 @@ static int translateKey(unsigned int key)
// //
static NSString* findAppName(void) static NSString* findAppName(void)
{ {
unsigned int i; size_t i;
NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
// Keys to search for as potential application names // Keys to search for as potential application names
@@ -678,14 +727,6 @@ static NSString* findAppName(void)
} }
} }
// If we get here, the application is unbundled
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
// Having the app in front of the terminal window is also generally
// handy. There is an NSApplication API to do this, but...
SetFrontProcess(&psn);
char** progname = _NSGetProgname(); char** progname = _NSGetProgname();
if (progname && *progname) if (progname && *progname)
return [NSString stringWithUTF8String:*progname]; return [NSString stringWithUTF8String:*progname];
@@ -743,7 +784,7 @@ static void createMenuBar(void)
[NSApp setWindowsMenu:windowMenu]; [NSApp setWindowsMenu:windowMenu];
[windowMenuItem setSubmenu:windowMenu]; [windowMenuItem setSubmenu:windowMenu];
[windowMenu addItemWithTitle:@"Miniaturize" [windowMenu addItemWithTitle:@"Minimize"
action:@selector(performMiniaturize:) action:@selector(performMiniaturize:)
keyEquivalent:@"m"]; keyEquivalent:@"m"];
[windowMenu addItemWithTitle:@"Zoom" [windowMenu addItemWithTitle:@"Zoom"
@@ -754,9 +795,23 @@ static void createMenuBar(void)
action:@selector(arrangeInFront:) action:@selector(arrangeInFront:)
keyEquivalent:@""]; keyEquivalent:@""];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
{
// TODO: Make this appear at the bottom of the menu (for consistency)
[windowMenu addItem:[NSMenuItem separatorItem]];
[[windowMenu addItemWithTitle:@"Enter Full Screen"
action:@selector(toggleFullScreen:)
keyEquivalent:@"f"]
setKeyEquivalentModifierMask:NSControlKeyMask | NSCommandKeyMask];
}
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
// Prior to Snow Leopard, we need to use this oddly-named semi-private API // Prior to Snow Leopard, we need to use this oddly-named semi-private API
// to get the application menu working properly. // to get the application menu working properly.
[NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; SEL setAppleMenuSelector = NSSelectorFromString(@"setAppleMenu:");
[NSApp performSelector:setAppleMenuSelector withObject:appMenu];
} }
#endif /* _GLFW_USE_MENUBAR */ #endif /* _GLFW_USE_MENUBAR */
@@ -771,6 +826,9 @@ static GLboolean initializeAppKit(void)
// Implicitly create shared NSApplication instance // Implicitly create shared NSApplication instance
[GLFWApplication sharedApplication]; [GLFWApplication sharedApplication];
// In case we are unbundled, make us a proper UI application
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
#if defined(_GLFW_USE_MENUBAR) #if defined(_GLFW_USE_MENUBAR)
// Menu bar setup must go between sharedApplication above and // Menu bar setup must go between sharedApplication above and
// finishLaunching below, in order to properly emulate the behavior // finishLaunching below, in order to properly emulate the behavior
@@ -815,17 +873,26 @@ static GLboolean createWindow(_GLFWwindow* window,
window->ns.view = [[GLFWContentView alloc] initWithGlfwWindow:window]; window->ns.view = [[GLFWContentView alloc] initWithGlfwWindow:window];
[window->ns.view setWantsBestResolutionOpenGLSurface:YES]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
{
[window->ns.view setWantsBestResolutionOpenGLSurface:YES];
if (wndconfig->resizable)
[window->ns.object setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
}
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
[window->ns.object setTitle:[NSString stringWithUTF8String:wndconfig->title]]; [window->ns.object setTitle:[NSString stringWithUTF8String:wndconfig->title]];
[window->ns.object setContentView:window->ns.view]; [window->ns.object setContentView:window->ns.view];
[window->ns.object setDelegate:window->ns.delegate]; [window->ns.object setDelegate:window->ns.delegate];
[window->ns.object setAcceptsMouseMovedEvents:YES]; [window->ns.object setAcceptsMouseMovedEvents:YES];
[window->ns.object disableCursorRects];
[window->ns.object center]; [window->ns.object center];
if ([window->ns.object respondsToSelector:@selector(setRestorable:)]) #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
[window->ns.object setRestorable:NO]; [window->ns.object setRestorable:NO];
#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
return GL_TRUE; return GL_TRUE;
} }
@@ -920,8 +987,9 @@ void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y) void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y)
{ {
const NSRect frameRect = const NSRect contentRect = [window->ns.view frame];
[window->ns.object frameRectForContentRect:NSMakeRect(x, y, 0, 0)]; const NSRect dummyRect = NSMakeRect(x, transformY(y + contentRect.size.height), 0, 0);
const NSRect frameRect = [window->ns.object frameRectForContentRect:dummyRect];
[window->ns.object setFrameOrigin:frameRect.origin]; [window->ns.object setFrameOrigin:frameRect.origin];
} }
@@ -942,7 +1010,13 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height) void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
{ {
_glfwPlatformGetWindowSize(window, width, height); const NSRect contentRect = [window->ns.view frame];
const NSRect fbRect = convertRectToBacking(window, contentRect);
if (width)
*width = (int) fbRect.size.width;
if (height)
*height = (int) fbRect.size.height;
} }
void _glfwPlatformIconifyWindow(_GLFWwindow* window) void _glfwPlatformIconifyWindow(_GLFWwindow* window)
@@ -960,6 +1034,12 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
void _glfwPlatformShowWindow(_GLFWwindow* window) void _glfwPlatformShowWindow(_GLFWwindow* window)
{ {
// Make us the active application
// HACK: This has been moved here from initializeAppKit to prevent
// applications using only hidden windows from being activated, but
// should probably not be done every time any window is shown
[NSApp activateIgnoringOtherApps:YES];
[window->ns.object makeKeyAndOrderFront:nil]; [window->ns.object makeKeyAndOrderFront:nil];
_glfwInputWindowVisibility(window, GL_TRUE); _glfwInputWindowVisibility(window, GL_TRUE);
} }
@@ -1004,6 +1084,8 @@ void _glfwPlatformWaitEvents(void)
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
{ {
setModeCursor(window, window->cursorMode);
if (window->monitor) if (window->monitor)
{ {
CGDisplayMoveCursorToPoint(window->monitor->ns.displayID, CGDisplayMoveCursorToPoint(window->monitor->ns.displayID,
@@ -1022,37 +1104,15 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
{ {
if (mode == GLFW_CURSOR_HIDDEN) setModeCursor(window, mode);
{
[window->ns.object enableCursorRects];
[window->ns.object invalidateCursorRectsForView:window->ns.view];
}
else
{
[window->ns.object disableCursorRects];
[window->ns.object invalidateCursorRectsForView:window->ns.view];
}
if (mode == GLFW_CURSOR_DISABLED) if (mode == GLFW_CURSOR_DISABLED)
{ {
CGAssociateMouseAndMouseCursorPosition(false); CGAssociateMouseAndMouseCursorPosition(false);
centerCursor(window);
if (!_glfw.ns.cursorHidden)
{
[NSCursor hide];
_glfw.ns.cursorHidden = GL_TRUE;
}
} }
else else
{
CGAssociateMouseAndMouseCursorPosition(true); CGAssociateMouseAndMouseCursorPosition(true);
if (_glfw.ns.cursorHidden)
{
[NSCursor unhide];
_glfw.ns.cursorHidden = GL_FALSE;
}
}
} }
+32 -18
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -101,7 +98,7 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig)
if (wndconfig->clientAPI == GLFW_OPENGL_API) if (wndconfig->clientAPI == GLFW_OPENGL_API)
{ {
if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0 || if ((wndconfig->glMajor < 1 || wndconfig->glMinor < 0) ||
(wndconfig->glMajor == 1 && wndconfig->glMinor > 5) || (wndconfig->glMajor == 1 && wndconfig->glMinor > 5) ||
(wndconfig->glMajor == 2 && wndconfig->glMinor > 1) || (wndconfig->glMajor == 2 && wndconfig->glMinor > 1) ||
(wndconfig->glMajor == 3 && wndconfig->glMinor > 3)) (wndconfig->glMajor == 3 && wndconfig->glMinor > 3))
@@ -405,8 +402,8 @@ GLboolean _glfwRefreshContextAttribs(void)
else if (glfwExtensionSupported("GL_ARB_debug_output")) else if (glfwExtensionSupported("GL_ARB_debug_output"))
{ {
// HACK: This is a workaround for older drivers (pre KHR_debug) // HACK: This is a workaround for older drivers (pre KHR_debug)
// not setting the debug bit in the context flags for debug // not setting the debug bit in the context flags for
// contexts // debug contexts
window->glDebug = GL_TRUE; window->glDebug = GL_TRUE;
} }
} }
@@ -422,13 +419,21 @@ GLboolean _glfwRefreshContextAttribs(void)
window->glProfile = GLFW_OPENGL_COMPAT_PROFILE; window->glProfile = GLFW_OPENGL_COMPAT_PROFILE;
else if (mask & GL_CONTEXT_CORE_PROFILE_BIT) else if (mask & GL_CONTEXT_CORE_PROFILE_BIT)
window->glProfile = GLFW_OPENGL_CORE_PROFILE; window->glProfile = GLFW_OPENGL_CORE_PROFILE;
else if (glfwExtensionSupported("GL_ARB_compatibility"))
{
// HACK: This is a workaround for the compatibility profile bit
// not being set in the context flags if an OpenGL 3.2+
// context was created without having requested a specific
// version
window->glProfile = GLFW_OPENGL_COMPAT_PROFILE;
}
} }
// Read back robustness strategy // Read back robustness strategy
if (glfwExtensionSupported("GL_ARB_robustness")) if (glfwExtensionSupported("GL_ARB_robustness"))
{ {
// NOTE: We avoid using the context flags for detection, as they are // NOTE: We avoid using the context flags for detection, as they are
// only present from 3.0 while the extension applies from 1.1 // only present from 3.0 while the extension applies from 1.1
GLint strategy; GLint strategy;
glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy); glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy);
@@ -445,7 +450,7 @@ GLboolean _glfwRefreshContextAttribs(void)
if (glfwExtensionSupported("GL_EXT_robustness")) if (glfwExtensionSupported("GL_EXT_robustness"))
{ {
// NOTE: The values of these constants match those of the OpenGL ARB // NOTE: The values of these constants match those of the OpenGL ARB
// one, so we can reuse them here // one, so we can reuse them here
GLint strategy; GLint strategy;
glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy); glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy);
@@ -569,7 +574,7 @@ GLFWAPI int glfwExtensionSupported(const char* extension)
return GL_FALSE; return GL_FALSE;
} }
if (extension == NULL || *extension == '\0') if (!extension || *extension == '\0')
{ {
_glfwInputError(GLFW_INVALID_VALUE, NULL); _glfwInputError(GLFW_INVALID_VALUE, NULL);
return GL_FALSE; return GL_FALSE;
@@ -580,11 +585,15 @@ GLFWAPI int glfwExtensionSupported(const char* extension)
// Check if extension is in the old style OpenGL extensions string // Check if extension is in the old style OpenGL extensions string
extensions = glGetString(GL_EXTENSIONS); extensions = glGetString(GL_EXTENSIONS);
if (extensions != NULL) if (!extensions)
{ {
if (_glfwStringInExtensionString(extension, extensions)) _glfwInputError(GLFW_PLATFORM_ERROR,
return GL_TRUE; "Failed to retrieve extension string");
return GL_FALSE;
} }
if (_glfwStringInExtensionString(extension, extensions))
return GL_TRUE;
} }
#if defined(_GLFW_USE_OPENGL) #if defined(_GLFW_USE_OPENGL)
else else
@@ -598,11 +607,16 @@ GLFWAPI int glfwExtensionSupported(const char* extension)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
if (strcmp((const char*) window->GetStringi(GL_EXTENSIONS, i), const char* en = (const char*) window->GetStringi(GL_EXTENSIONS, i);
extension) == 0) if (!en)
{ {
return GL_TRUE; _glfwInputError(GLFW_PLATFORM_ERROR,
} "Failed to retrieve extension string %i", i);
return GL_FALSE;
}
if (strcmp(en, extension) == 0)
return GL_TRUE;
} }
} }
#endif // _GLFW_USE_OPENGL #endif // _GLFW_USE_OPENGL
+6 -9
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 EGL - www.glfw.org
// Platform: EGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -127,10 +124,10 @@ static GLboolean chooseFBConfigs(const _GLFWwndconfig* wndconfig,
return GL_FALSE; return GL_FALSE;
} }
nativeConfigs = (EGLConfig*) calloc(nativeCount, sizeof(EGLConfig)); nativeConfigs = calloc(nativeCount, sizeof(EGLConfig));
eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount); eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount);
usableConfigs = (_GLFWfbconfig*) calloc(nativeCount, sizeof(_GLFWfbconfig)); usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));
usableCount = 0; usableCount = 0;
for (i = 0; i < nativeCount; i++) for (i = 0; i < nativeCount; i++)
@@ -210,7 +207,7 @@ static GLboolean chooseFBConfigs(const _GLFWwndconfig* wndconfig,
// //
int _glfwInitContextAPI(void) int _glfwInitContextAPI(void)
{ {
_glfw.egl.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY); _glfw.egl.display = eglGetDisplay((EGLNativeDisplayType)_GLFW_EGL_NATIVE_DISPLAY);
if (_glfw.egl.display == EGL_NO_DISPLAY) if (_glfw.egl.display == EGL_NO_DISPLAY)
{ {
_glfwInputError(GLFW_API_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
@@ -246,7 +243,7 @@ void _glfwTerminateContextAPI(void)
{ \ { \
attribs[index++] = attribName; \ attribs[index++] = attribName; \
attribs[index++] = attribValue; \ attribs[index++] = attribValue; \
assert(index < sizeof(attribs) / sizeof(attribs[0])); \ assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \
} }
// Prepare for creation of the OpenGL context // Prepare for creation of the OpenGL context
@@ -464,7 +461,7 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window)
{ {
window->egl.surface = eglCreateWindowSurface(_glfw.egl.display, window->egl.surface = eglCreateWindowSurface(_glfw.egl.display,
window->egl.config, window->egl.config,
_GLFW_EGL_NATIVE_WINDOW, (EGLNativeWindowType)_GLFW_EGL_NATIVE_WINDOW,
NULL); NULL);
if (window->egl.surface == EGL_NO_SURFACE) if (window->egl.surface == EGL_NO_SURFACE)
{ {
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 EGL - www.glfw.org
// Platform: EGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+12 -17
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -42,15 +39,15 @@
////// GLFW internal API ////// ////// GLFW internal API //////
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
void _glfwAllocGammaRamp(GLFWgammaramp* ramp, unsigned int size) void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size)
{ {
ramp->red = (unsigned short*) malloc(size * sizeof(unsigned short)); ramp->red = calloc(size, sizeof(unsigned short));
ramp->green = (unsigned short*) malloc(size * sizeof(unsigned short)); ramp->green = calloc(size, sizeof(unsigned short));
ramp->blue = (unsigned short*) malloc(size * sizeof(unsigned short)); ramp->blue = calloc(size, sizeof(unsigned short));
ramp->size = size; ramp->size = size;
} }
void _glfwFreeGammaRamp(GLFWgammaramp* ramp) void _glfwFreeGammaArrays(GLFWgammaramp* ramp)
{ {
free(ramp->red); free(ramp->red);
free(ramp->green); free(ramp->green);
@@ -81,18 +78,16 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
float value; double value;
// Calculate intensity // Calculate intensity
value = i / 255.f; value = i / 255.0;
// Apply gamma curve // Apply gamma curve
value = (float) pow(value, 1.f / gamma) * 65535.f + 0.5f; value = pow(value, 1.0 / gamma) * 65535.0 + 0.5;
// Clamp to value range // Clamp to value range
if (value < 0.f) if (value > 65535.0)
value = 0.f; value = 65535.0;
else if (value > 65535.f)
value = 65535.f;
values[i] = (unsigned short) value; values[i] = (unsigned short) value;
} }
@@ -111,7 +106,7 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_glfwFreeGammaRamp(&monitor->currentRamp); _glfwFreeGammaArrays(&monitor->currentRamp);
_glfwPlatformGetGammaRamp(monitor, &monitor->currentRamp); _glfwPlatformGetGammaRamp(monitor, &monitor->currentRamp);
return &monitor->currentRamp; return &monitor->currentRamp;
+1 -1
View File
@@ -1,7 +1,7 @@
prefix=@CMAKE_INSTALL_PREFIX@ prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix} exec_prefix=${prefix}
includedir=${prefix}/include includedir=${prefix}/include
libdir=${exec_prefix}/lib libdir=${exec_prefix}/lib@LIB_SUFFIX@
Name: GLFW Name: GLFW
Description: A portable library for OpenGL, window and input Description: A portable library for OpenGL, window and input
+13 -13
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -26,13 +23,15 @@
// distribution. // distribution.
// //
//======================================================================== //========================================================================
// As config.h.in, this file is used by CMake to produce the config.h shared // As glfw_config.h.in, this file is used by CMake to produce the
// configuration header file. If you are adding a feature requiring // glfw_config.h configuration header file. If you are adding a feature
// conditional compilation, this is the proper place to add the macros. // requiring conditional compilation, this is where to add the macro.
//======================================================================== //========================================================================
// As config.h, this file defines compile-time build options and macros for // As glfw_config.h, this file defines compile-time option macros for a
// all platforms supported by GLFW. As this is a generated file, don't modify // specific platform and development environment. If you are using the
// it. Instead, you should modify the config.h.in file. // GLFW CMake files, modify glfw_config.h.in instead of this file. If you
// are using your own build system, make this file define the appropriate
// macros in whatever way is suitable.
//======================================================================== //========================================================================
// Define this to 1 if building GLFW for X11 // Define this to 1 if building GLFW for X11
@@ -56,6 +55,10 @@
// Define this to 1 to disable dynamic loading of winmm // Define this to 1 to disable dynamic loading of winmm
#cmakedefine _GLFW_NO_DLOAD_WINMM #cmakedefine _GLFW_NO_DLOAD_WINMM
// Define this to 1 if glfwSwapInterval should ignore DWM compositing status
#cmakedefine _GLFW_USE_DWM_SWAP_INTERVAL
// Define this to 1 to force use of high-performance GPU on Optimus systems
#cmakedefine _GLFW_USE_OPTIMUS_HPG
// Define this to 1 if glXGetProcAddress is available // Define this to 1 if glXGetProcAddress is available
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESS #cmakedefine _GLFW_HAS_GLXGETPROCADDRESS
@@ -78,6 +81,3 @@
// Define this to 1 if using OpenGL ES 2.0 as the client library // Define this to 1 if using OpenGL ES 2.0 as the client library
#cmakedefine _GLFW_USE_GLESV2 #cmakedefine _GLFW_USE_GLESV2
// The GLFW version as used by glfwGetVersionString
#define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@"
+20 -42
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 GLX - www.glfw.org
// Platform: X11/GLX
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -33,7 +30,6 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <pthread.h>
// This is the only glXGetProcAddress variant not declared by glxext.h // This is the only glXGetProcAddress variant not declared by glxext.h
@@ -45,14 +41,6 @@ void (*glXGetProcAddressEXT(const GLubyte* procName))();
#endif #endif
// Error handler used when creating a context
//
static int errorHandler(Display *display, XErrorEvent* event)
{
_glfw.glx.errorCode = event->error_code;
return 0;
}
// Returns the specified attribute of the specified GLXFBConfig // Returns the specified attribute of the specified GLXFBConfig
// NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig // NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig
// //
@@ -86,7 +74,7 @@ static GLboolean chooseFBConfig(const _GLFWfbconfig* desired, GLXFBConfig* resul
if (strcmp(vendor, "Chromium") == 0) if (strcmp(vendor, "Chromium") == 0)
{ {
// HACK: This is a (hopefully temporary) workaround for Chromium // HACK: This is a (hopefully temporary) workaround for Chromium
// (VirtualBox GL) not setting the window bit on any GLXFBConfigs // (VirtualBox GL) not setting the window bit on any GLXFBConfigs
trustWindowBit = GL_FALSE; trustWindowBit = GL_FALSE;
} }
@@ -111,7 +99,7 @@ static GLboolean chooseFBConfig(const _GLFWfbconfig* desired, GLXFBConfig* resul
return GL_FALSE; return GL_FALSE;
} }
usableConfigs = (_GLFWfbconfig*) calloc(nativeCount, sizeof(_GLFWfbconfig)); usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));
usableCount = 0; usableCount = 0;
for (i = 0; i < nativeCount; i++) for (i = 0; i < nativeCount; i++)
@@ -191,14 +179,12 @@ static GLXContext createLegacyContext(_GLFWwindow* window,
share, share,
True); True);
} }
else
{ return glXCreateNewContext(_glfw.x11.display,
return glXCreateNewContext(_glfw.x11.display, fbconfig,
fbconfig, GLX_RGBA_TYPE,
GLX_RGBA_TYPE, share,
share, True);
True);
}
} }
@@ -354,7 +340,7 @@ void _glfwTerminateContextAPI(void)
{ \ { \
attribs[index++] = attribName; \ attribs[index++] = attribName; \
attribs[index++] = attribValue; \ attribs[index++] = attribValue; \
assert(index < sizeof(attribs) / sizeof(attribs[0])); \ assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \
} }
// Prepare for creation of the OpenGL context // Prepare for creation of the OpenGL context
@@ -399,7 +385,7 @@ int _glfwCreateContext(_GLFWwindow* window,
!_glfw.glx.ARB_create_context_profile || !_glfw.glx.ARB_create_context_profile ||
!_glfw.glx.EXT_create_context_es2_profile) !_glfw.glx.EXT_create_context_es2_profile)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
"GLX: OpenGL ES requested but " "GLX: OpenGL ES requested but "
"GLX_EXT_create_context_es2_profile is unavailable"); "GLX_EXT_create_context_es2_profile is unavailable");
return GL_FALSE; return GL_FALSE;
@@ -429,8 +415,7 @@ int _glfwCreateContext(_GLFWwindow* window,
} }
} }
_glfw.glx.errorCode = Success; _glfwGrabXErrorHandler();
XSetErrorHandler(errorHandler);
if (_glfw.glx.ARB_create_context) if (_glfw.glx.ARB_create_context)
{ {
@@ -471,8 +456,8 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glMajor != 1 || wndconfig->glMinor != 0) if (wndconfig->glMajor != 1 || wndconfig->glMinor != 0)
{ {
// NOTE: Only request an explicitly versioned context when // NOTE: Only request an explicitly versioned context when
// necessary, as explicitly requesting version 1.0 does not always // necessary, as explicitly requesting version 1.0 does not
// return the highest available version // always return the highest available version
setGLXattrib(GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor); setGLXattrib(GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor);
setGLXattrib(GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor); setGLXattrib(GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor);
@@ -499,9 +484,10 @@ int _glfwCreateContext(_GLFWwindow* window,
if (window->glx.context == NULL) if (window->glx.context == NULL)
{ {
// HACK: This is a fallback for the broken Mesa implementation of // HACK: This is a fallback for the broken Mesa implementation of
// GLX_ARB_create_context_profile, which fails default 1.0 context // GLX_ARB_create_context_profile, which fails default 1.0
// creation with a GLXBadProfileARB error in violation of the spec // context creation with a GLXBadProfileARB error in violation
if (_glfw.glx.errorCode == _glfw.glx.errorBase + GLXBadProfileARB && // of the extension spec
if (_glfw.x11.errorCode == _glfw.glx.errorBase + GLXBadProfileARB &&
wndconfig->clientAPI == GLFW_OPENGL_API && wndconfig->clientAPI == GLFW_OPENGL_API &&
wndconfig->glProfile == GLFW_OPENGL_ANY_PROFILE && wndconfig->glProfile == GLFW_OPENGL_ANY_PROFILE &&
wndconfig->glForward == GL_FALSE) wndconfig->glForward == GL_FALSE)
@@ -513,19 +499,11 @@ int _glfwCreateContext(_GLFWwindow* window,
else else
window->glx.context = createLegacyContext(window, native, share); window->glx.context = createLegacyContext(window, native, share);
XSetErrorHandler(NULL); _glfwReleaseXErrorHandler();
if (window->glx.context == NULL) if (window->glx.context == NULL)
{ {
char buffer[8192]; _glfwInputXError(GLFW_PLATFORM_ERROR, "GLX: Failed to create context");
XGetErrorText(_glfw.x11.display,
_glfw.glx.errorCode,
buffer, sizeof(buffer));
_glfwInputError(GLFW_PLATFORM_ERROR,
"GLX: Failed to create context: %s",
buffer);
return GL_FALSE; return GL_FALSE;
} }
+3 -7
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 GLX - www.glfw.org
// Platform: X11/GLX
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -44,6 +41,8 @@
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif
#include <pthread.h>
// We support four different ways for getting addresses for GL/GLX // We support four different ways for getting addresses for GL/GLX
// extension functions: glXGetProcAddress, glXGetProcAddressARB, // extension functions: glXGetProcAddress, glXGetProcAddressARB,
// glXGetProcAddressEXT, and dlsym // glXGetProcAddressEXT, and dlsym
@@ -97,9 +96,6 @@ typedef struct _GLFWlibraryGLX
// TLS key for per-thread current context/window // TLS key for per-thread current context/window
pthread_key_t current; pthread_key_t current;
// GLX error code received by Xlib error callback
int errorCode;
// GLX extensions // GLX extensions
PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI;
PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT;
+6 -8
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -133,7 +130,7 @@ GLFWAPI int glfwInit(void)
_glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount); _glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount);
if (_glfw.monitors == NULL) if (_glfw.monitors == NULL)
{ {
_glfwErrorCallback(GLFW_PLATFORM_ERROR, "No monitors found"); _glfwInputError(GLFW_PLATFORM_ERROR, "No monitors found");
_glfwPlatformTerminate(); _glfwPlatformTerminate();
return GL_FALSE; return GL_FALSE;
} }
@@ -153,6 +150,8 @@ GLFWAPI void glfwTerminate(void)
if (!_glfwInitialized) if (!_glfwInitialized)
return; return;
memset(&_glfw.callbacks, 0, sizeof(_glfw.callbacks));
// Close all remaining windows // Close all remaining windows
while (_glfw.windowListHead) while (_glfw.windowListHead)
glfwDestroyWindow((GLFWwindow*) _glfw.windowListHead); glfwDestroyWindow((GLFWwindow*) _glfw.windowListHead);
@@ -192,8 +191,7 @@ GLFWAPI const char* glfwGetVersionString(void)
GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun) GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun)
{ {
GLFWerrorfun previous = _glfwErrorCallback; _GLFW_SWAP_POINTERS(_glfwErrorCallback, cbfun);
_glfwErrorCallback = cbfun; return cbfun;
return previous;
} }
+24 -50
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -38,7 +35,7 @@
// //
static void setCursorMode(_GLFWwindow* window, int newMode) static void setCursorMode(_GLFWwindow* window, int newMode)
{ {
int oldMode; const int oldMode = window->cursorMode;
if (newMode != GLFW_CURSOR_NORMAL && if (newMode != GLFW_CURSOR_NORMAL &&
newMode != GLFW_CURSOR_HIDDEN && newMode != GLFW_CURSOR_HIDDEN &&
@@ -48,14 +45,20 @@ static void setCursorMode(_GLFWwindow* window, int newMode)
return; return;
} }
oldMode = window->cursorMode;
if (oldMode == newMode) if (oldMode == newMode)
return; return;
window->cursorMode = newMode;
if (window == _glfw.focusedWindow) if (window == _glfw.focusedWindow)
{ {
if (oldMode == GLFW_CURSOR_DISABLED) if (oldMode == GLFW_CURSOR_DISABLED)
{
window->cursorPosX = _glfw.cursorPosX;
window->cursorPosY = _glfw.cursorPosY;
_glfwPlatformSetCursorPos(window, _glfw.cursorPosX, _glfw.cursorPosY); _glfwPlatformSetCursorPos(window, _glfw.cursorPosX, _glfw.cursorPosY);
}
else if (newMode == GLFW_CURSOR_DISABLED) else if (newMode == GLFW_CURSOR_DISABLED)
{ {
int width, height; int width, height;
@@ -69,8 +72,6 @@ static void setCursorMode(_GLFWwindow* window, int newMode)
_glfwPlatformSetCursorMode(window, newMode); _glfwPlatformSetCursorMode(window, newMode);
} }
window->cursorMode = newMode;
} }
// Set sticky keys mode for the specified window // Set sticky keys mode for the specified window
@@ -147,16 +148,13 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods); window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);
} }
void _glfwInputChar(_GLFWwindow* window, unsigned int character) void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint)
{ {
if (character == -1) if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
return;
if (character < 32 || (character > 126 && character < 160))
return; return;
if (window->callbacks.character) if (window->callbacks.character)
window->callbacks.character((GLFWwindow*) window, character); window->callbacks.character((GLFWwindow*) window, codepoint);
} }
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset) void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
@@ -347,76 +345,52 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* handle, double xpos, double ypos)
GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun) GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWkeyfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.key, cbfun);
previous = window->callbacks.key; return cbfun;
window->callbacks.key = cbfun;
return previous;
} }
GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun) GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWcharfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.character, cbfun);
previous = window->callbacks.character; return cbfun;
window->callbacks.character = cbfun;
return previous;
} }
GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle, GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
GLFWmousebuttonfun cbfun) GLFWmousebuttonfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWmousebuttonfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.mouseButton, cbfun);
previous = window->callbacks.mouseButton; return cbfun;
window->callbacks.mouseButton = cbfun;
return previous;
} }
GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle, GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle,
GLFWcursorposfun cbfun) GLFWcursorposfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWcursorposfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.cursorPos, cbfun);
previous = window->callbacks.cursorPos; return cbfun;
window->callbacks.cursorPos = cbfun;
return previous;
} }
GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle, GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle,
GLFWcursorenterfun cbfun) GLFWcursorenterfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWcursorenterfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.cursorEnter, cbfun);
previous = window->callbacks.cursorEnter; return cbfun;
window->callbacks.cursorEnter = cbfun;
return previous;
} }
GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* handle, GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* handle,
GLFWscrollfun cbfun) GLFWscrollfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWscrollfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.scroll, cbfun);
previous = window->callbacks.scroll; return cbfun;
window->callbacks.scroll = cbfun;
return previous;
} }
+32 -12
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -32,7 +29,11 @@
#define _internal_h_ #define _internal_h_
#include "config.h" #if defined(_GLFW_USE_CONFIG_H)
#include "glfw_config.h"
#endif
#define _GLFW_VERSION_NUMBER "3.0.4"
#if defined(_GLFW_USE_OPENGL) #if defined(_GLFW_USE_OPENGL)
// This is the default for glfw3.h // This is the default for glfw3.h
@@ -120,6 +121,15 @@ typedef struct _GLFWmonitor _GLFWmonitor;
return x; \ return x; \
} }
// Swaps the provided pointers
#define _GLFW_SWAP_POINTERS(x, y) \
{ \
void* t; \
t = x; \
x = y; \
y = t; \
}
//======================================================================== //========================================================================
// Internal types // Internal types
@@ -298,7 +308,10 @@ struct _GLFWlibrary
_GLFWmonitor** monitors; _GLFWmonitor** monitors;
int monitorCount; int monitorCount;
GLFWmonitorfun monitorCallback;
struct {
GLFWmonitorfun monitor;
} callbacks;
// This is defined in the window API's platform.h // This is defined in the window API's platform.h
_GLFW_PLATFORM_LIBRARY_WINDOW_STATE; _GLFW_PLATFORM_LIBRARY_WINDOW_STATE;
@@ -615,10 +628,10 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
/*! @brief Notifies shared code of a Unicode character input event. /*! @brief Notifies shared code of a Unicode character input event.
* @param[in] window The window that received the event. * @param[in] window The window that received the event.
* @param[in] character The Unicode code point of the input character. * @param[in] codepoint The Unicode code point of the input character.
* @ingroup event * @ingroup event
*/ */
void _glfwInputChar(_GLFWwindow* window, unsigned int character); void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint);
/*! @brief Notifies shared code of a scroll event. /*! @brief Notifies shared code of a scroll event.
* @param[in] window The window that received the event. * @param[in] window The window that received the event.
@@ -735,17 +748,24 @@ GLboolean _glfwIsValidContext(_GLFWwndconfig* wndconfig);
/*! @ingroup utility /*! @ingroup utility
*/ */
void _glfwAllocGammaRamp(GLFWgammaramp* ramp, unsigned int size); void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);
/*! @ingroup utility /*! @ingroup utility
*/ */
void _glfwFreeGammaRamp(GLFWgammaramp* ramp); void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
/*! @ingroup utility /*! @brief Allocates and returns a monitor object with the specified name
* and dimensions.
* @param[in] name The name of the monitor.
* @param[in] widthMM The width, in mm, of the monitor's display area.
* @param[in] heightMM The height, in mm, of the monitor's display area.
* @return The newly created object.
* @ingroup utility
*/ */
_GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM); _GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM);
/*! @ingroup utility /*! @brief Frees a monitor object and any data associated with it.
* @ingroup utility
*/ */
void _glfwDestroyMonitor(_GLFWmonitor* monitor); void _glfwDestroyMonitor(_GLFWmonitor* monitor);
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+10 -16
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL framework // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -144,8 +141,8 @@ void _glfwInputMonitorChange(void)
window->monitor = NULL; window->monitor = NULL;
} }
if (_glfw.monitorCallback) if (_glfw.callbacks.monitor)
_glfw.monitorCallback((GLFWmonitor*) monitors[i], GLFW_DISCONNECTED); _glfw.callbacks.monitor((GLFWmonitor*) monitors[i], GLFW_DISCONNECTED);
} }
// Find and report newly connected monitors (not in the old list) // Find and report newly connected monitors (not in the old list)
@@ -166,8 +163,8 @@ void _glfwInputMonitorChange(void)
if (j < monitorCount) if (j < monitorCount)
continue; continue;
if (_glfw.monitorCallback) if (_glfw.callbacks.monitor)
_glfw.monitorCallback((GLFWmonitor*) _glfw.monitors[i], GLFW_CONNECTED); _glfw.callbacks.monitor((GLFWmonitor*) _glfw.monitors[i], GLFW_CONNECTED);
} }
_glfwDestroyMonitors(monitors, monitorCount); _glfwDestroyMonitors(monitors, monitorCount);
@@ -180,7 +177,7 @@ void _glfwInputMonitorChange(void)
_GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM) _GLFWmonitor* _glfwCreateMonitor(const char* name, int widthMM, int heightMM)
{ {
_GLFWmonitor* monitor = (_GLFWmonitor*) calloc(1, sizeof(_GLFWmonitor)); _GLFWmonitor* monitor = calloc(1, sizeof(_GLFWmonitor));
monitor->name = strdup(name); monitor->name = strdup(name);
monitor->widthMM = widthMM; monitor->widthMM = widthMM;
monitor->heightMM = heightMM; monitor->heightMM = heightMM;
@@ -193,8 +190,8 @@ void _glfwDestroyMonitor(_GLFWmonitor* monitor)
if (monitor == NULL) if (monitor == NULL)
return; return;
_glfwFreeGammaRamp(&monitor->originalRamp); _glfwFreeGammaArrays(&monitor->originalRamp);
_glfwFreeGammaRamp(&monitor->currentRamp); _glfwFreeGammaArrays(&monitor->currentRamp);
free(monitor->modes); free(monitor->modes);
free(monitor->name); free(monitor->name);
@@ -328,12 +325,9 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)
GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun) GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun)
{ {
GLFWmonitorfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(_glfw.callbacks.monitor, cbfun);
previous = _glfw.monitorCallback; return cbfun;
_glfw.monitorCallback = cbfun;
return previous;
} }
GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count) GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)
+18 -23
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: Cocoa/NSOpenGL
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -43,7 +40,7 @@ int _glfwInitContextAPI(void)
if (pthread_key_create(&_glfw.nsgl.current, NULL) != 0) if (pthread_key_create(&_glfw.nsgl.current, NULL) != 0)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create context TLS"); "NSGL: Failed to create context TLS");
return GL_FALSE; return GL_FALSE;
} }
@@ -74,7 +71,7 @@ int _glfwCreateContext(_GLFWwindow* window,
{ {
unsigned int attributeCount = 0; unsigned int attributeCount = 0;
// Mac OS X needs non-zero color size, so set resonable values // OS X needs non-zero color size, so set resonable values
int colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits; int colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits;
if (colorBits == 0) if (colorBits == 0)
colorBits = 24; colorBits = 24;
@@ -84,18 +81,16 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: This API does not support OpenGL ES"); "NSGL: This API does not support OpenGL ES");
return GL_FALSE; return GL_FALSE;
} }
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
// Fail if any OpenGL version above 2.1 other than 3.2 was requested if (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)
if (wndconfig->glMajor > 3 ||
(wndconfig->glMajor == 3 && wndconfig->glMinor != 2))
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of Mac OS X does not " "NSGL: The targeted version of OS X does not "
"support any OpenGL version above 2.1 except 3.2"); "support OpenGL 3.0 or 3.1");
return GL_FALSE; return GL_FALSE;
} }
@@ -104,18 +99,18 @@ int _glfwCreateContext(_GLFWwindow* window,
if (!wndconfig->glForward) if (!wndconfig->glForward)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of Mac OS X only " "NSGL: The targeted version of OS X only "
"supports OpenGL 3.2 contexts if they are " "supports OpenGL 3.2 and later versions if they "
"forward-compatible"); "are forward-compatible");
return GL_FALSE; return GL_FALSE;
} }
if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE) if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of Mac OS X only " "NSGL: The targeted version of OS X only "
"supports OpenGL 3.2 contexts if they use the " "supports OpenGL 3.2 and later versions if they "
"core profile"); "use the core profile");
return GL_FALSE; return GL_FALSE;
} }
} }
@@ -124,7 +119,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glMajor > 2) if (wndconfig->glMajor > 2)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: The targeted version of Mac OS X does not " "NSGL: The targeted version of OS X does not "
"support OpenGL version 3.0 or above"); "support OpenGL version 3.0 or above");
return GL_FALSE; return GL_FALSE;
} }
@@ -134,7 +129,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (wndconfig->glRobustness) if (wndconfig->glRobustness)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_VERSION_UNAVAILABLE,
"NSOpenGL: Mac OS X does not support OpenGL robustness " "NSGL: OS X does not support OpenGL robustness "
"strategies"); "strategies");
return GL_FALSE; return GL_FALSE;
} }
@@ -183,7 +178,7 @@ int _glfwCreateContext(_GLFWwindow* window,
} }
// NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB // NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB
// frambuffer, so there's no need (and no way) to request it // frambuffer, so there's no need (and no way) to request it
ADD_ATTR(0); ADD_ATTR(0);
@@ -195,7 +190,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (window->nsgl.pixelFormat == nil) if (window->nsgl.pixelFormat == nil)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create OpenGL pixel format"); "NSGL: Failed to create OpenGL pixel format");
return GL_FALSE; return GL_FALSE;
} }
@@ -210,7 +205,7 @@ int _glfwCreateContext(_GLFWwindow* window,
if (window->nsgl.context == nil) if (window->nsgl.context == nil)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"NSOpenGL: Failed to create OpenGL context"); "NSGL: Failed to create OpenGL context");
return GL_FALSE; return GL_FALSE;
} }
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 OS X - www.glfw.org
// Platform: NSOpenGL
// API Version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+41 -16
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 WGL - www.glfw.org
// Platform: Win32/WGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -172,7 +169,7 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
return GL_FALSE; return GL_FALSE;
} }
usableConfigs = (_GLFWfbconfig*) calloc(nativeCount, sizeof(_GLFWfbconfig)); usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));
usableCount = 0; usableCount = 0;
for (i = 0; i < nativeCount; i++) for (i = 0; i < nativeCount; i++)
@@ -275,10 +272,26 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
usableCount++; usableCount++;
} }
closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount); if (!usableCount)
if (closest) {
*result = closest->wgl; _glfwInputError(GLFW_API_UNAVAILABLE,
"WGL: The driver does not appear to support OpenGL");
free(usableConfigs);
return GL_FALSE;
}
closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount);
if (!closest)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to find a suitable pixel format");
free(usableConfigs);
return GL_FALSE;
}
*result = closest->wgl;
free(usableConfigs); free(usableConfigs);
return GL_TRUE; return GL_TRUE;
@@ -293,6 +306,13 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
// //
int _glfwInitContextAPI(void) int _glfwInitContextAPI(void)
{ {
_glfw.wgl.opengl32.instance = LoadLibrary(L"opengl32.dll");
if (!_glfw.wgl.opengl32.instance)
{
_glfwInputError(GLFW_PLATFORM_ERROR, "Failed to load opengl32.dll");
return GL_FALSE;
}
_glfw.wgl.current = TlsAlloc(); _glfw.wgl.current = TlsAlloc();
if (_glfw.wgl.current == TLS_OUT_OF_INDEXES) if (_glfw.wgl.current == TLS_OUT_OF_INDEXES)
{ {
@@ -312,13 +332,16 @@ void _glfwTerminateContextAPI(void)
{ {
if (_glfw.wgl.hasTLS) if (_glfw.wgl.hasTLS)
TlsFree(_glfw.wgl.current); TlsFree(_glfw.wgl.current);
if (_glfw.wgl.opengl32.instance)
FreeLibrary(_glfw.wgl.opengl32.instance);
} }
#define setWGLattrib(attribName, attribValue) \ #define setWGLattrib(attribName, attribValue) \
{ \ { \
attribs[index++] = attribName; \ attribs[index++] = attribName; \
attribs[index++] = attribValue; \ attribs[index++] = attribValue; \
assert(index < sizeof(attribs) / sizeof(attribs[0])); \ assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \
} }
// Prepare for creation of the OpenGL context // Prepare for creation of the OpenGL context
@@ -344,11 +367,7 @@ int _glfwCreateContext(_GLFWwindow* window,
} }
if (!choosePixelFormat(window, fbconfig, &pixelFormat)) if (!choosePixelFormat(window, fbconfig, &pixelFormat))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to find a suitable pixel format");
return GL_FALSE; return GL_FALSE;
}
if (!DescribePixelFormat(window->wgl.dc, pixelFormat, sizeof(pfd), &pfd)) if (!DescribePixelFormat(window->wgl.dc, pixelFormat, sizeof(pfd), &pfd))
{ {
@@ -518,7 +537,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window,
!window->wgl.ARB_create_context_profile || !window->wgl.ARB_create_context_profile ||
!window->wgl.EXT_create_context_es2_profile) !window->wgl.EXT_create_context_es2_profile)
{ {
_glfwInputError(GLFW_VERSION_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
"WGL: OpenGL ES requested but " "WGL: OpenGL ES requested but "
"WGL_ARB_create_context_es2_profile is unavailable"); "WGL_ARB_create_context_es2_profile is unavailable");
return _GLFW_RECREATION_IMPOSSIBLE; return _GLFW_RECREATION_IMPOSSIBLE;
@@ -586,12 +605,14 @@ void _glfwPlatformSwapInterval(int interval)
{ {
_GLFWwindow* window = _glfwPlatformGetCurrentContext(); _GLFWwindow* window = _glfwPlatformGetCurrentContext();
if (_glfwIsCompositionEnabled()) #if !defined(_GLFW_USE_DWM_SWAP_INTERVAL)
if (_glfwIsCompositionEnabled() && interval)
{ {
// Don't enabled vsync when desktop compositing is enabled, as it leads // Don't enabled vsync when desktop compositing is enabled, as it leads
// to frame jitter // to frame jitter
return; return;
} }
#endif
if (window->wgl.EXT_swap_control) if (window->wgl.EXT_swap_control)
window->wgl.SwapIntervalEXT(interval); window->wgl.SwapIntervalEXT(interval);
@@ -628,7 +649,11 @@ int _glfwPlatformExtensionSupported(const char* extension)
GLFWglproc _glfwPlatformGetProcAddress(const char* procname) GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
{ {
return (GLFWglproc) wglGetProcAddress(procname); const GLFWglproc proc = (GLFWglproc) wglGetProcAddress(procname);
if (proc)
return proc;
return (GLFWglproc) GetProcAddress(_glfw.wgl.opengl32.instance, procname);
} }
+8 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 WGL - www.glfw.org
// Platform: WGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -77,8 +74,13 @@ typedef struct _GLFWcontextWGL
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWlibraryWGL typedef struct _GLFWlibraryWGL
{ {
GLboolean hasTLS; GLboolean hasTLS;
DWORD current; DWORD current;
// opengl32.dll
struct {
HINSTANCE instance;
} opengl32;
} _GLFWlibraryWGL; } _GLFWlibraryWGL;
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
+2 -5
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -50,7 +47,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
GetDeviceGammaRamp(dc, values); GetDeviceGammaRamp(dc, values);
DeleteDC(dc); DeleteDC(dc);
_glfwAllocGammaRamp(ramp, 256); _glfwAllocGammaArrays(ramp, 256);
memcpy(ramp->red, values + 0, 256 * sizeof(unsigned short)); memcpy(ramp->red, values + 0, 256 * sizeof(unsigned short));
memcpy(ramp->green, values + 256, 256 * sizeof(unsigned short)); memcpy(ramp->green, values + 256, 256 * sizeof(unsigned short));
+28 -17
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32/WGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -39,6 +36,15 @@
#endif // __BORLANDC__ #endif // __BORLANDC__
#if defined(_GLFW_USE_OPTIMUS_HPG)
// Applications exporting this symbol with this value will be automatically
// directed to the high-performance GPU on nVidia Optimus systems
//
GLFWAPI DWORD NvOptimusEnablement = 0x00000001;
#endif // _GLFW_USE_OPTIMUS_HPG
#if defined(_GLFW_BUILD_DLL) #if defined(_GLFW_BUILD_DLL)
// GLFW DLL entry point // GLFW DLL entry point
@@ -98,7 +104,7 @@ static GLboolean initLibraries(void)
// Unload used libraries (DLLs) // Unload used libraries (DLLs)
// //
static void freeLibraries(void) static void terminateLibraries(void)
{ {
#ifndef _GLFW_NO_DLOAD_WINMM #ifndef _GLFW_NO_DLOAD_WINMM
if (_glfw.win32.winmm.instance != NULL) if (_glfw.win32.winmm.instance != NULL)
@@ -107,6 +113,12 @@ static void freeLibraries(void)
_glfw.win32.winmm.instance = NULL; _glfw.win32.winmm.instance = NULL;
} }
#endif // _GLFW_NO_DLOAD_WINMM #endif // _GLFW_NO_DLOAD_WINMM
if (_glfw.win32.user32.instance)
FreeLibrary(_glfw.win32.user32.instance);
if (_glfw.win32.dwmapi.instance)
FreeLibrary(_glfw.win32.dwmapi.instance);
} }
@@ -140,7 +152,7 @@ WCHAR* _glfwCreateWideStringFromUTF8(const char* source)
if (!length) if (!length)
return NULL; return NULL;
target = (WCHAR*) malloc(sizeof(WCHAR) * (length + 1)); target = calloc(length + 1, sizeof(WCHAR));
if (!MultiByteToWideChar(CP_UTF8, 0, source, -1, target, length + 1)) if (!MultiByteToWideChar(CP_UTF8, 0, source, -1, target, length + 1))
{ {
@@ -162,7 +174,7 @@ char* _glfwCreateUTF8FromWideString(const WCHAR* source)
if (!length) if (!length)
return NULL; return NULL;
target = (char*) malloc(length + 1); target = calloc(length + 1, sizeof(char));
if (!WideCharToMultiByte(CP_UTF8, 0, source, -1, target, length + 1, NULL, NULL)) if (!WideCharToMultiByte(CP_UTF8, 0, source, -1, target, length + 1, NULL, NULL))
{ {
@@ -204,7 +216,6 @@ int _glfwPlatformInit(void)
return GL_FALSE; return GL_FALSE;
_glfwInitTimer(); _glfwInitTimer();
_glfwInitJoysticks(); _glfwInitJoysticks();
return GL_TRUE; return GL_TRUE;
@@ -218,21 +229,21 @@ void _glfwPlatformTerminate(void)
_glfw.win32.classAtom = 0; _glfw.win32.classAtom = 0;
} }
_glfwTerminateContextAPI(); // Restore previous foreground lock timeout system setting
_glfwTerminateJoysticks();
freeLibraries();
// Restore previous FOREGROUNDLOCKTIMEOUT system setting
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
UIntToPtr(_glfw.win32.foregroundLockTimeout), UIntToPtr(_glfw.win32.foregroundLockTimeout),
SPIF_SENDCHANGE); SPIF_SENDCHANGE);
free(_glfw.win32.clipboardString);
_glfwTerminateJoysticks();
_glfwTerminateContextAPI();
terminateLibraries();
} }
const char* _glfwPlatformGetVersionString(void) const char* _glfwPlatformGetVersionString(void)
{ {
const char* version = _GLFW_VERSION_FULL " Win32" const char* version = _GLFW_VERSION_NUMBER " Win32"
#if defined(_GLFW_WGL) #if defined(_GLFW_WGL)
" WGL" " WGL"
#elif defined(_GLFW_EGL) #elif defined(_GLFW_EGL)
@@ -241,7 +252,7 @@ const char* _glfwPlatformGetVersionString(void)
#if defined(__MINGW32__) #if defined(__MINGW32__)
" MinGW" " MinGW"
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
" VisualC " " VisualC"
#elif defined(__BORLANDC__) #elif defined(__BORLANDC__)
" BorlandC" " BorlandC"
#endif #endif
+3 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -100,7 +97,7 @@ const float* _glfwPlatformGetJoystickAxes(int joy, int* count)
return NULL; return NULL;
axes[(*count)++] = calcJoystickPos(ji.dwXpos, jc.wXmin, jc.wXmax); axes[(*count)++] = calcJoystickPos(ji.dwXpos, jc.wXmin, jc.wXmax);
axes[(*count)++] = -calcJoystickPos(ji.dwYpos, jc.wYmin, jc.wYmax); axes[(*count)++] = calcJoystickPos(ji.dwYpos, jc.wYmin, jc.wYmax);
if (jc.wCaps & JOYCAPS_HASZ) if (jc.wCaps & JOYCAPS_HASZ)
axes[(*count)++] = calcJoystickPos(ji.dwZpos, jc.wZmin, jc.wZmax); axes[(*count)++] = calcJoystickPos(ji.dwZpos, jc.wZmin, jc.wZmax);
@@ -112,7 +109,7 @@ const float* _glfwPlatformGetJoystickAxes(int joy, int* count)
axes[(*count)++] = calcJoystickPos(ji.dwUpos, jc.wUmin, jc.wUmax); axes[(*count)++] = calcJoystickPos(ji.dwUpos, jc.wUmin, jc.wUmax);
if (jc.wCaps & JOYCAPS_HASV) if (jc.wCaps & JOYCAPS_HASV)
axes[(*count)++] = -calcJoystickPos(ji.dwVpos, jc.wVmin, jc.wVmax); axes[(*count)++] = calcJoystickPos(ji.dwVpos, jc.wVmin, jc.wVmax);
return axes; return axes;
} }
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: X11 (Unix)
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+10 -9
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -55,10 +52,15 @@
#define UNICODE #define UNICODE
#endif #endif
// GLFW requires Windows XP // GLFW requires Windows XP or later
#ifndef WINVER #if WINVER < 0x0501
#undef WINVER
#define WINVER 0x0501 #define WINVER 0x0501
#endif #endif
#if _WIN32_WINNT < 0x0501
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <windows.h> #include <windows.h>
#include <mmsystem.h> #include <mmsystem.h>
@@ -155,7 +157,7 @@ typedef struct _GLFWwindowWin32
GLboolean cursorCentered; GLboolean cursorCentered;
GLboolean cursorInside; GLboolean cursorInside;
GLboolean cursorHidden; GLboolean cursorHidden;
double oldCursorX, oldCursorY; int oldCursorX, oldCursorY;
} _GLFWwindowWin32; } _GLFWwindowWin32;
@@ -172,8 +174,7 @@ typedef struct _GLFWlibraryWin32
struct { struct {
GLboolean hasPC; GLboolean hasPC;
double resolution; double resolution;
unsigned int t0_32; unsigned __int64 base;
__int64 t0_64;
} timer; } timer;
#ifndef _GLFW_NO_DLOAD_WINMM #ifndef _GLFW_NO_DLOAD_WINMM
+26 -31
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -31,6 +28,21 @@
#include "internal.h" #include "internal.h"
// Return raw time
//
static unsigned __int64 getRawTime(void)
{
if (_glfw.win32.timer.hasPC)
{
unsigned __int64 time;
QueryPerformanceCounter((LARGE_INTEGER*) &time);
return time;
}
else
return (unsigned __int64) _glfw_timeGetTime();
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////// GLFW internal API ////// ////// GLFW internal API //////
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@@ -39,20 +51,20 @@
// //
void _glfwInitTimer(void) void _glfwInitTimer(void)
{ {
__int64 freq; unsigned __int64 frequency;
if (QueryPerformanceFrequency((LARGE_INTEGER*) &freq)) if (QueryPerformanceFrequency((LARGE_INTEGER*) &frequency))
{ {
_glfw.win32.timer.hasPC = GL_TRUE; _glfw.win32.timer.hasPC = GL_TRUE;
_glfw.win32.timer.resolution = 1.0 / (double) freq; _glfw.win32.timer.resolution = 1.0 / (double) frequency;
QueryPerformanceCounter((LARGE_INTEGER*) &_glfw.win32.timer.t0_64);
} }
else else
{ {
_glfw.win32.timer.hasPC = GL_FALSE; _glfw.win32.timer.hasPC = GL_FALSE;
_glfw.win32.timer.resolution = 0.001; // winmm resolution is 1 ms _glfw.win32.timer.resolution = 0.001; // winmm resolution is 1 ms
_glfw.win32.timer.t0_32 = _glfw_timeGetTime();
} }
_glfw.win32.timer.base = getRawTime();
} }
@@ -62,30 +74,13 @@ void _glfwInitTimer(void)
double _glfwPlatformGetTime(void) double _glfwPlatformGetTime(void)
{ {
double t; return (double) (getRawTime() - _glfw.win32.timer.base) *
__int64 t_64; _glfw.win32.timer.resolution;
if (_glfw.win32.timer.hasPC)
{
QueryPerformanceCounter((LARGE_INTEGER*) &t_64);
t = (double)(t_64 - _glfw.win32.timer.t0_64);
}
else
t = (double)(_glfw_timeGetTime() - _glfw.win32.timer.t0_32);
return t * _glfw.win32.timer.resolution;
} }
void _glfwPlatformSetTime(double t) void _glfwPlatformSetTime(double time)
{ {
__int64 t_64; _glfw.win32.timer.base = getRawTime() -
(unsigned __int64) (time / _glfw.win32.timer.resolution);
if (_glfw.win32.timer.hasPC)
{
QueryPerformanceCounter((LARGE_INTEGER*) &t_64);
_glfw.win32.timer.t0_64 = t_64 - (__int64) (t / _glfw.win32.timer.resolution);
}
else
_glfw.win32.timer.t0_32 = _glfw_timeGetTime() - (int)(t * 1000.0);
} }
+51 -19
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 Win32 - www.glfw.org
// Platform: Win32/WGL
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -148,7 +145,7 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
{ {
// Check for numeric keypad keys // Check for numeric keypad keys
// NOTE: This way we always force "NumLock = ON", which is intentional since // NOTE: This way we always force "NumLock = ON", which is intentional since
// the returned key code should correspond to a physical location. // the returned key code should correspond to a physical location.
if ((HIWORD(lParam) & 0x100) == 0) if ((HIWORD(lParam) & 0x100) == 0)
{ {
switch (MapVirtualKey(HIWORD(lParam) & 0xFF, 1)) switch (MapVirtualKey(HIWORD(lParam) & 0xFF, 1))
@@ -391,10 +388,21 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
if (focused && iconified) if (focused && iconified)
{ {
// This is a workaround for window iconification using the if (window->iconified && _glfw.focusedWindow != window)
// taskbar leading to windows being told they're focused and {
// iconified and then never told they're defocused // This is a workaround for window restoration using the
focused = FALSE; // Win+D hot key leading to windows being told they're
// focused and iconified and then never told they're
// restored
iconified = FALSE;
}
else
{
// This is a workaround for window iconification using the
// taskbar leading to windows being told they're focused and
// iconified and then never told they're defocused
focused = FALSE;
}
} }
if (!focused && _glfw.focusedWindow == window) if (!focused && _glfw.focusedWindow == window)
@@ -434,6 +442,19 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
return 0; return 0;
} }
case WM_ACTIVATEAPP:
{
if (!wParam && IsIconic(hWnd))
{
// This is a workaround for full screen windows losing focus
// through Alt+Tab leading to windows being told they're
// unfocused and restored and then never told they're iconified
_glfwInputWindowIconify(window, GL_TRUE);
}
return 0;
}
case WM_SHOWWINDOW: case WM_SHOWWINDOW:
{ {
_glfwInputWindowVisibility(window, wParam ? GL_TRUE : GL_FALSE); _glfwInputWindowVisibility(window, wParam ? GL_TRUE : GL_FALSE);
@@ -483,6 +504,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
} }
case WM_CHAR: case WM_CHAR:
case WM_SYSCHAR:
{ {
_glfwInputChar(window, (unsigned int) wParam); _glfwInputChar(window, (unsigned int) wParam);
return 0; return 0;
@@ -595,7 +617,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
if (newCursorX != window->win32.oldCursorX || if (newCursorX != window->win32.oldCursorX ||
newCursorY != window->win32.oldCursorY) newCursorY != window->win32.oldCursorY)
{ {
double x, y; int x, y;
if (window->cursorMode == GLFW_CURSOR_DISABLED) if (window->cursorMode == GLFW_CURSOR_DISABLED)
{ {
@@ -656,8 +678,11 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_SIZE: case WM_SIZE:
{ {
if (window->cursorMode == GLFW_CURSOR_DISABLED) if (window->cursorMode == GLFW_CURSOR_DISABLED &&
_glfw.focusedWindow == window)
{
updateClipRect(window); updateClipRect(window);
}
_glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam)); _glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam));
_glfwInputWindowSize(window, LOWORD(lParam), HIWORD(lParam)); _glfwInputWindowSize(window, LOWORD(lParam), HIWORD(lParam));
@@ -666,10 +691,17 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_MOVE: case WM_MOVE:
{ {
if (window->cursorMode == GLFW_CURSOR_DISABLED) if (window->cursorMode == GLFW_CURSOR_DISABLED &&
_glfw.focusedWindow == window)
{
updateClipRect(window); updateClipRect(window);
}
_glfwInputWindowPos(window, LOWORD(lParam), HIWORD(lParam)); // NOTE: This cannot use LOWORD/HIWORD recommended by MSDN, as
// those macros do not handle negative window positions correctly
_glfwInputWindowPos(window,
GET_X_LPARAM(lParam),
GET_Y_LPARAM(lParam));
return 0; return 0;
} }
@@ -681,8 +713,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_SETCURSOR: case WM_SETCURSOR:
{ {
if (window->cursorMode == GLFW_CURSOR_HIDDEN && if (window->cursorMode != GLFW_CURSOR_NORMAL &&
window->win32.handle == GetForegroundWindow() && _glfw.focusedWindow == window &&
LOWORD(lParam) == HTCLIENT) LOWORD(lParam) == HTCLIENT)
{ {
SetCursor(NULL); SetCursor(NULL);
@@ -904,7 +936,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
// First we clear the current context (the one we just created) // First we clear the current context (the one we just created)
// This is usually done by glfwDestroyWindow, but as we're not doing // This is usually done by glfwDestroyWindow, but as we're not doing
// full window destruction, it's duplicated here // full GLFW window destruction, it's duplicated here
_glfwPlatformMakeContextCurrent(NULL); _glfwPlatformMakeContextCurrent(NULL);
// Next destroy the Win32 window and WGL context (without resetting or // Next destroy the Win32 window and WGL context (without resetting or
@@ -1002,7 +1034,7 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
SetWindowPos(window->win32.handle, HWND_TOP, SetWindowPos(window->win32.handle, HWND_TOP,
0, 0, fullWidth, fullHeight, 0, 0, fullWidth, fullHeight,
SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER); SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER);
} }
} }
@@ -1106,8 +1138,8 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos)
ClientToScreen(window->win32.handle, &pos); ClientToScreen(window->win32.handle, &pos);
SetCursorPos(pos.x, pos.y); SetCursorPos(pos.x, pos.y);
window->win32.oldCursorX = xpos; window->win32.oldCursorX = (int) xpos;
window->win32.oldCursorY = ypos; window->win32.oldCursorY = (int) ypos;
} }
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
+27 -60
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 - www.glfw.org
// Platform: Any
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -132,7 +129,7 @@ void _glfwInputWindowDamage(_GLFWwindow* window)
void _glfwInputWindowCloseRequest(_GLFWwindow* window) void _glfwInputWindowCloseRequest(_GLFWwindow* window)
{ {
window->closed = GL_TRUE; window->closed = GL_TRUE;
if (window->callbacks.close) if (window->callbacks.close)
window->callbacks.close((GLFWwindow*) window); window->callbacks.close((GLFWwindow*) window);
@@ -158,7 +155,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
if (width <= 0 || height <= 0) if (width <= 0 || height <= 0)
{ {
_glfwInputError(GLFW_INVALID_VALUE, "Invalid window size"); _glfwInputError(GLFW_INVALID_VALUE, "Invalid window size");
return GL_FALSE; return NULL;
} }
// Set up desired framebuffer config // Set up desired framebuffer config
@@ -196,9 +193,9 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
// Check the OpenGL bits of the window config // Check the OpenGL bits of the window config
if (!_glfwIsValidContextConfig(&wndconfig)) if (!_glfwIsValidContextConfig(&wndconfig))
return GL_FALSE; return NULL;
window = (_GLFWwindow*) calloc(1, sizeof(_GLFWwindow)); window = calloc(1, sizeof(_GLFWwindow));
window->next = _glfw.windowListHead; window->next = _glfw.windowListHead;
_glfw.windowListHead = window; _glfw.windowListHead = window;
@@ -216,10 +213,10 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
window->videoMode.refreshRate = Max(_glfw.hints.refreshRate, 0); window->videoMode.refreshRate = Max(_glfw.hints.refreshRate, 0);
} }
window->monitor = wndconfig.monitor; window->monitor = wndconfig.monitor;
window->resizable = wndconfig.resizable; window->resizable = wndconfig.resizable;
window->decorated = wndconfig.decorated; window->decorated = wndconfig.decorated;
window->cursorMode = GLFW_CURSOR_NORMAL; window->cursorMode = GLFW_CURSOR_NORMAL;
// Save the currently current context so it can be restored later // Save the currently current context so it can be restored later
previous = (_GLFWwindow*) glfwGetCurrentContext(); previous = (_GLFWwindow*) glfwGetCurrentContext();
@@ -229,7 +226,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
{ {
glfwDestroyWindow((GLFWwindow*) window); glfwDestroyWindow((GLFWwindow*) window);
glfwMakeContextCurrent((GLFWwindow*) previous); glfwMakeContextCurrent((GLFWwindow*) previous);
return GL_FALSE; return NULL;
} }
glfwMakeContextCurrent((GLFWwindow*) window); glfwMakeContextCurrent((GLFWwindow*) window);
@@ -239,7 +236,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
{ {
glfwDestroyWindow((GLFWwindow*) window); glfwDestroyWindow((GLFWwindow*) window);
glfwMakeContextCurrent((GLFWwindow*) previous); glfwMakeContextCurrent((GLFWwindow*) previous);
return GL_FALSE; return NULL;
} }
// Verify the context against the requested parameters // Verify the context against the requested parameters
@@ -247,7 +244,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
{ {
glfwDestroyWindow((GLFWwindow*) window); glfwDestroyWindow((GLFWwindow*) window);
glfwMakeContextCurrent((GLFWwindow*) previous); glfwMakeContextCurrent((GLFWwindow*) previous);
return GL_FALSE; return NULL;
} }
// Clearing the front buffer to black to avoid garbage pixels left over // Clearing the front buffer to black to avoid garbage pixels left over
@@ -284,6 +281,7 @@ void glfwDefaultWindowHints(void)
_glfw.hints.redBits = 8; _glfw.hints.redBits = 8;
_glfw.hints.greenBits = 8; _glfw.hints.greenBits = 8;
_glfw.hints.blueBits = 8; _glfw.hints.blueBits = 8;
_glfw.hints.alphaBits = 8;
_glfw.hints.depthBits = 24; _glfw.hints.depthBits = 24;
_glfw.hints.stencilBits = 8; _glfw.hints.stencilBits = 8;
} }
@@ -470,10 +468,7 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)
_GLFW_REQUIRE_INIT(); _GLFW_REQUIRE_INIT();
if (window->iconified) if (window->iconified)
{
// TODO: Figure out if this is an error
return; return;
}
if (window->monitor) if (window->monitor)
{ {
@@ -606,91 +601,63 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle,
GLFWwindowposfun cbfun) GLFWwindowposfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowposfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.pos, cbfun);
previous = window->callbacks.pos; return cbfun;
window->callbacks.pos = cbfun;
return previous;
} }
GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle, GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle,
GLFWwindowsizefun cbfun) GLFWwindowsizefun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowsizefun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.size, cbfun);
previous = window->callbacks.size; return cbfun;
window->callbacks.size = cbfun;
return previous;
} }
GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle, GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle,
GLFWwindowclosefun cbfun) GLFWwindowclosefun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowclosefun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.close, cbfun);
previous = window->callbacks.close; return cbfun;
window->callbacks.close = cbfun;
return previous;
} }
GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle, GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle,
GLFWwindowrefreshfun cbfun) GLFWwindowrefreshfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowrefreshfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.refresh, cbfun);
previous = window->callbacks.refresh; return cbfun;
window->callbacks.refresh = cbfun;
return previous;
} }
GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle, GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,
GLFWwindowfocusfun cbfun) GLFWwindowfocusfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowfocusfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.focus, cbfun);
previous = window->callbacks.focus; return cbfun;
window->callbacks.focus = cbfun;
return previous;
} }
GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle, GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
GLFWwindowiconifyfun cbfun) GLFWwindowiconifyfun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWwindowiconifyfun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.iconify, cbfun);
previous = window->callbacks.iconify; return cbfun;
window->callbacks.iconify = cbfun;
return previous;
} }
GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle, GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle,
GLFWframebuffersizefun cbfun) GLFWframebuffersizefun cbfun)
{ {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
GLFWframebuffersizefun previous;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.fbsize, cbfun);
previous = window->callbacks.fbsize; return cbfun;
window->callbacks.fbsize = cbfun;
return previous;
} }
GLFWAPI void glfwPollEvents(void) GLFWAPI void glfwPollEvents(void)
+3 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -273,11 +270,11 @@ void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)
const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) const char* _glfwPlatformGetClipboardString(_GLFWwindow* window)
{ {
int i; size_t i;
const Atom formats[] = { _glfw.x11.UTF8_STRING, const Atom formats[] = { _glfw.x11.UTF8_STRING,
_glfw.x11.COMPOUND_STRING, _glfw.x11.COMPOUND_STRING,
XA_STRING }; XA_STRING };
const int formatCount = sizeof(formats) / sizeof(formats[0]); const size_t formatCount = sizeof(formats) / sizeof(formats[0]);
if (_glfwFindWindowByHandle(XGetSelectionOwner(_glfw.x11.display, if (_glfwFindWindowByHandle(XGetSelectionOwner(_glfw.x11.display,
_glfw.x11.CLIPBOARD))) _glfw.x11.CLIPBOARD)))
+3 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2010 Camilla Berglund <elmindreda@elmindreda.org>
// //
@@ -79,7 +76,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
XRRCrtcGamma* gamma = XRRGetCrtcGamma(_glfw.x11.display, XRRCrtcGamma* gamma = XRRGetCrtcGamma(_glfw.x11.display,
monitor->x11.crtc); monitor->x11.crtc);
_glfwAllocGammaRamp(ramp, size); _glfwAllocGammaArrays(ramp, size);
memcpy(ramp->red, gamma->red, size * sizeof(unsigned short)); memcpy(ramp->red, gamma->red, size * sizeof(unsigned short));
memcpy(ramp->green, gamma->green, size * sizeof(unsigned short)); memcpy(ramp->green, gamma->green, size * sizeof(unsigned short));
@@ -92,7 +89,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
int size; int size;
XF86VidModeGetGammaRampSize(_glfw.x11.display, _glfw.x11.screen, &size); XF86VidModeGetGammaRampSize(_glfw.x11.display, _glfw.x11.screen, &size);
_glfwAllocGammaRamp(ramp, size); _glfwAllocGammaArrays(ramp, size);
XF86VidModeGetGammaRamp(_glfw.x11.display, XF86VidModeGetGammaRamp(_glfw.x11.display,
_glfw.x11.screen, _glfw.x11.screen,
+70 -28
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11/GLX
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -51,7 +48,7 @@ static int translateKey(int keyCode)
// Note: This way we always force "NumLock = ON", which is intentional // Note: This way we always force "NumLock = ON", which is intentional
// since the returned key code should correspond to a physical // since the returned key code should correspond to a physical
// location. // location.
keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 1, 0); keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 0, 1);
switch (keySym) switch (keySym)
{ {
case XK_KP_0: return GLFW_KEY_KP_0; case XK_KP_0: return GLFW_KEY_KP_0;
@@ -412,6 +409,8 @@ static void detectEWMH(void)
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING"); getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING");
_glfw.x11.NET_ACTIVE_WINDOW = _glfw.x11.NET_ACTIVE_WINDOW =
getSupportedAtom(supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW"); getSupportedAtom(supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW");
_glfw.x11.NET_WM_BYPASS_COMPOSITOR =
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_BYPASS_COMPOSITOR");
XFree(supportedAtoms); XFree(supportedAtoms);
@@ -420,21 +419,10 @@ static void detectEWMH(void)
// Initialize X11 display and look for supported X11 extensions // Initialize X11 display and look for supported X11 extensions
// //
static GLboolean initDisplay(void) static GLboolean initExtensions(void)
{ {
Bool supported; Bool supported;
_glfw.x11.display = XOpenDisplay(NULL);
if (!_glfw.x11.display)
{
_glfwInputError(GLFW_API_UNAVAILABLE, "X11: Failed to open X display");
return GL_FALSE;
}
_glfw.x11.screen = DefaultScreen(_glfw.x11.display);
_glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen);
_glfw.x11.context = XUniqueContext();
// Find or create window manager atoms // Find or create window manager atoms
_glfw.x11.WM_STATE = XInternAtom(_glfw.x11.display, "WM_STATE", False); _glfw.x11.WM_STATE = XInternAtom(_glfw.x11.display, "WM_STATE", False);
_glfw.x11.WM_DELETE_WINDOW = XInternAtom(_glfw.x11.display, _glfw.x11.WM_DELETE_WINDOW = XInternAtom(_glfw.x11.display,
@@ -564,7 +552,7 @@ static Cursor createNULLCursor(void)
XColor col; XColor col;
Cursor cursor; Cursor cursor;
// TODO: Add error checks _glfwGrabXErrorHandler();
cursormask = XCreatePixmap(_glfw.x11.display, _glfw.x11.root, 1, 1, 1); cursormask = XCreatePixmap(_glfw.x11.display, _glfw.x11.root, 1, 1, 1);
xgc.function = GXclear; xgc.function = GXclear;
@@ -579,6 +567,14 @@ static Cursor createNULLCursor(void)
XFreePixmap(_glfw.x11.display, cursormask); XFreePixmap(_glfw.x11.display, cursormask);
XFreeGC(_glfw.x11.display, gc); XFreeGC(_glfw.x11.display, gc);
_glfwReleaseXErrorHandler();
if (cursor == None)
{
_glfwInputXError(GLFW_PLATFORM_ERROR,
"X11: Failed to create null cursor");
}
return cursor; return cursor;
} }
@@ -593,6 +589,47 @@ static void terminateDisplay(void)
} }
} }
// X error handler
//
static int errorHandler(Display *display, XErrorEvent* event)
{
_glfw.x11.errorCode = event->error_code;
return 0;
}
//////////////////////////////////////////////////////////////////////////
////// GLFW internal API //////
//////////////////////////////////////////////////////////////////////////
// Install the X error handler
//
void _glfwGrabXErrorHandler(void)
{
_glfw.x11.errorCode = Success;
XSetErrorHandler(errorHandler);
}
// Remove the X error handler
//
void _glfwReleaseXErrorHandler(void)
{
// Synchronize to make sure all commands are processed
XSync(_glfw.x11.display, False);
XSetErrorHandler(NULL);
}
// Report X error
//
void _glfwInputXError(int error, const char* message)
{
char buffer[8192];
XGetErrorText(_glfw.x11.display, _glfw.x11.errorCode,
buffer, sizeof(buffer));
_glfwInputError(error, "%s: %s", message, buffer);
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////// GLFW platform API ////// ////// GLFW platform API //////
@@ -602,20 +639,28 @@ int _glfwPlatformInit(void)
{ {
XInitThreads(); XInitThreads();
if (!initDisplay()) _glfw.x11.display = XOpenDisplay(NULL);
if (!_glfw.x11.display)
{
_glfwInputError(GLFW_API_UNAVAILABLE, "X11: Failed to open X display");
return GL_FALSE; return GL_FALSE;
}
_glfwInitGammaRamp(); _glfw.x11.screen = DefaultScreen(_glfw.x11.display);
_glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen);
_glfw.x11.context = XUniqueContext();
if (!_glfwInitContextAPI()) if (!initExtensions())
return GL_FALSE; return GL_FALSE;
_glfw.x11.cursor = createNULLCursor(); _glfw.x11.cursor = createNULLCursor();
if (!_glfwInitJoysticks()) if (!_glfwInitContextAPI())
return GL_FALSE; return GL_FALSE;
_glfwInitTimer(); _glfwInitTimer();
_glfwInitJoysticks();
_glfwInitGammaRamp();
return GL_TRUE; return GL_TRUE;
} }
@@ -628,19 +673,16 @@ void _glfwPlatformTerminate(void)
_glfw.x11.cursor = (Cursor) 0; _glfw.x11.cursor = (Cursor) 0;
} }
free(_glfw.x11.selection.string);
_glfwTerminateJoysticks(); _glfwTerminateJoysticks();
_glfwTerminateContextAPI(); _glfwTerminateContextAPI();
terminateDisplay(); terminateDisplay();
if (_glfw.x11.selection.string)
free(_glfw.x11.selection.string);
} }
const char* _glfwPlatformGetVersionString(void) const char* _glfwPlatformGetVersionString(void)
{ {
const char* version = _GLFW_VERSION_FULL " X11" const char* version = _GLFW_VERSION_NUMBER " X11"
#if defined(_GLFW_GLX) #if defined(_GLFW_GLX)
" GLX" " GLX"
#elif defined(_GLFW_EGL) #elif defined(_GLFW_EGL)
+7 -20
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -80,8 +77,8 @@ static int openJoystickDevice(int joy, const char* path)
ioctl(fd, JSIOCGBUTTONS, &buttonCount); ioctl(fd, JSIOCGBUTTONS, &buttonCount);
_glfw.x11.joystick[joy].buttonCount = (int) buttonCount; _glfw.x11.joystick[joy].buttonCount = (int) buttonCount;
_glfw.x11.joystick[joy].axes = (float*) calloc(axisCount, sizeof(float)); _glfw.x11.joystick[joy].axes = calloc(axisCount, sizeof(float));
_glfw.x11.joystick[joy].buttons = (unsigned char*) calloc(buttonCount, 1); _glfw.x11.joystick[joy].buttons = calloc(buttonCount, 1);
_glfw.x11.joystick[joy].present = GL_TRUE; _glfw.x11.joystick[joy].present = GL_TRUE;
#endif // __linux__ #endif // __linux__
@@ -128,15 +125,6 @@ static void pollJoystickEvents(void)
case JS_EVENT_AXIS: case JS_EVENT_AXIS:
_glfw.x11.joystick[i].axes[e.number] = _glfw.x11.joystick[i].axes[e.number] =
(float) e.value / 32767.0f; (float) e.value / 32767.0f;
// We need to change the sign for the Y axes, so that
// positive = up/forward, according to the GLFW spec.
if (e.number & 1)
{
_glfw.x11.joystick[i].axes[e.number] =
-_glfw.x11.joystick[i].axes[e.number];
}
break; break;
case JS_EVENT_BUTTON: case JS_EVENT_BUTTON:
@@ -159,10 +147,11 @@ static void pollJoystickEvents(void)
// Initialize joystick interface // Initialize joystick interface
// //
int _glfwInitJoysticks(void) void _glfwInitJoysticks(void)
{ {
#ifdef __linux__ #ifdef __linux__
int i, joy = 0; int joy = 0;
size_t i;
regex_t regex; regex_t regex;
DIR* dir; DIR* dir;
const char* dirs[] = const char* dirs[] =
@@ -174,7 +163,7 @@ int _glfwInitJoysticks(void)
if (regcomp(&regex, "^js[0-9]\\+$", 0) != 0) if (regcomp(&regex, "^js[0-9]\\+$", 0) != 0)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, "X11: Failed to compile regex"); _glfwInputError(GLFW_PLATFORM_ERROR, "X11: Failed to compile regex");
return GL_FALSE; return;
} }
for (i = 0; i < sizeof(dirs) / sizeof(dirs[0]); i++) for (i = 0; i < sizeof(dirs) / sizeof(dirs[0]); i++)
@@ -203,8 +192,6 @@ int _glfwInitJoysticks(void)
regfree(&regex); regfree(&regex);
#endif // __linux__ #endif // __linux__
return GL_TRUE;
} }
// Close all opened joystick handles // Close all opened joystick handles
+15 -9
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11 (Unix)
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -114,7 +111,11 @@ void _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired)
} }
} }
monitor->x11.oldMode = ci->mode; if (bestMode == ci->mode)
return;
if (monitor->x11.oldMode == None)
monitor->x11.oldMode = ci->mode;
XRRSetCrtcConfig(_glfw.x11.display, XRRSetCrtcConfig(_glfw.x11.display,
sr, monitor->x11.crtc, sr, monitor->x11.crtc,
@@ -140,6 +141,9 @@ void _glfwRestoreVideoMode(_GLFWmonitor* monitor)
XRRScreenResources* sr; XRRScreenResources* sr;
XRRCrtcInfo* ci; XRRCrtcInfo* ci;
if (monitor->x11.oldMode == None)
return;
sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root); sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root);
ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);
@@ -154,6 +158,8 @@ void _glfwRestoreVideoMode(_GLFWmonitor* monitor)
XRRFreeCrtcInfo(ci); XRRFreeCrtcInfo(ci);
XRRFreeScreenResources(sr); XRRFreeScreenResources(sr);
monitor->x11.oldMode = None;
} }
} }
@@ -177,7 +183,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root); sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root);
primary = XRRGetOutputPrimary(_glfw.x11.display, _glfw.x11.root); primary = XRRGetOutputPrimary(_glfw.x11.display, _glfw.x11.root);
monitors = (_GLFWmonitor**) calloc(sr->ncrtc, sizeof(_GLFWmonitor*)); monitors = calloc(sr->ncrtc, sizeof(_GLFWmonitor*));
for (i = 0; i < sr->ncrtc; i++) for (i = 0; i < sr->ncrtc; i++)
{ {
@@ -247,7 +253,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count)
} }
else else
{ {
monitors = (_GLFWmonitor**) calloc(1, sizeof(_GLFWmonitor*)); monitors = calloc(1, sizeof(_GLFWmonitor*));
monitors[0] = _glfwCreateMonitor("Display", monitors[0] = _glfwCreateMonitor("Display",
DisplayWidthMM(_glfw.x11.display, DisplayWidthMM(_glfw.x11.display,
_glfw.x11.screen), _glfw.x11.screen),
@@ -312,7 +318,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root); sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root);
oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output); oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output);
result = (GLFWvidmode*) malloc(sizeof(GLFWvidmode) * oi->nmode); result = calloc(oi->nmode, sizeof(GLFWvidmode));
for (i = 0; i < oi->nmode; i++) for (i = 0; i < oi->nmode; i++)
{ {
@@ -354,7 +360,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
{ {
*found = 1; *found = 1;
result = (GLFWvidmode*) malloc(sizeof(GLFWvidmode)); result = calloc(1, sizeof(GLFWvidmode));
result[0].width = DisplayWidth(_glfw.x11.display, _glfw.x11.screen); result[0].width = DisplayWidth(_glfw.x11.display, _glfw.x11.screen);
result[0].height = DisplayHeight(_glfw.x11.display, _glfw.x11.screen); result[0].height = DisplayHeight(_glfw.x11.display, _glfw.x11.screen);
+16 -6
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -86,6 +83,10 @@ typedef struct _GLFWwindowX11
GLboolean cursorGrabbed; // True if cursor is currently grabbed GLboolean cursorGrabbed; // True if cursor is currently grabbed
GLboolean cursorHidden; // True if cursor is currently hidden GLboolean cursorHidden; // True if cursor is currently hidden
// Cached position and size used to filter out duplicate events
int width, height;
int xpos, ypos;
// The last received cursor position, regardless of source // The last received cursor position, regardless of source
double cursorPosX, cursorPosY; double cursorPosX, cursorPosY;
// The last position the cursor was warped to by GLFW // The last position the cursor was warped to by GLFW
@@ -116,6 +117,7 @@ typedef struct _GLFWlibraryX11
Atom NET_WM_PING; Atom NET_WM_PING;
Atom NET_WM_STATE; Atom NET_WM_STATE;
Atom NET_WM_STATE_FULLSCREEN; Atom NET_WM_STATE_FULLSCREEN;
Atom NET_WM_BYPASS_COMPOSITOR;
Atom NET_ACTIVE_WINDOW; Atom NET_ACTIVE_WINDOW;
Atom MOTIF_WM_HINTS; Atom MOTIF_WM_HINTS;
@@ -133,6 +135,9 @@ typedef struct _GLFWlibraryX11
// True if window manager supports EWMH // True if window manager supports EWMH
GLboolean hasEWMH; GLboolean hasEWMH;
// Error code received by the X error handler
int errorCode;
struct { struct {
GLboolean available; GLboolean available;
int eventBase; int eventBase;
@@ -169,7 +174,7 @@ typedef struct _GLFWlibraryX11
int keyCodeLUT[256]; int keyCodeLUT[256];
struct { struct {
GLboolean changed; int count;
int timeout; int timeout;
int interval; int interval;
int blanking; int blanking;
@@ -234,7 +239,7 @@ void _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired);
void _glfwRestoreVideoMode(_GLFWmonitor* monitor); void _glfwRestoreVideoMode(_GLFWmonitor* monitor);
// Joystick input // Joystick input
int _glfwInitJoysticks(void); void _glfwInitJoysticks(void);
void _glfwTerminateJoysticks(void); void _glfwTerminateJoysticks(void);
// Unicode support // Unicode support
@@ -252,4 +257,9 @@ unsigned long _glfwGetWindowProperty(Window window,
Atom type, Atom type,
unsigned char** value); unsigned char** value);
// X11 error handler
void _glfwGrabXErrorHandler(void);
void _glfwReleaseXErrorHandler(void);
void _glfwInputXError(int error, const char* message);
#endif // _x11_platform_h_ #endif // _x11_platform_h_
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+1 -4
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
+154 -79
View File
@@ -1,8 +1,5 @@
//======================================================================== //========================================================================
// GLFW - An OpenGL library // GLFW 3.0 X11 - www.glfw.org
// Platform: X11
// API version: 3.0
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
@@ -132,13 +129,15 @@ static GLboolean createWindow(_GLFWwindow* window,
if (wndconfig->monitor == NULL) if (wndconfig->monitor == NULL)
{ {
// HACK: This is a workaround for windows without a background pixel // HACK: This is a workaround for windows without a background pixel
// not getting any decorations on certain older versions of Compiz // not getting any decorations on certain older versions of
// running on Intel hardware // Compiz running on Intel hardware
wa.background_pixel = BlackPixel(_glfw.x11.display, wa.background_pixel = BlackPixel(_glfw.x11.display,
_glfw.x11.screen); _glfw.x11.screen);
wamask |= CWBackPixel; wamask |= CWBackPixel;
} }
_glfwGrabXErrorHandler();
window->x11.handle = XCreateWindow(_glfw.x11.display, window->x11.handle = XCreateWindow(_glfw.x11.display,
_glfw.x11.root, _glfw.x11.root,
0, 0, 0, 0,
@@ -150,12 +149,12 @@ static GLboolean createWindow(_GLFWwindow* window,
wamask, wamask,
&wa); &wa);
_glfwReleaseXErrorHandler();
if (!window->x11.handle) if (!window->x11.handle)
{ {
// TODO: Handle all the various error codes here and translate them _glfwInputXError(GLFW_PLATFORM_ERROR,
// to GLFW errors "X11: Failed to create window");
_glfwInputError(GLFW_PLATFORM_ERROR, "X11: Failed to create window");
return GL_FALSE; return GL_FALSE;
} }
@@ -206,13 +205,13 @@ static GLboolean createWindow(_GLFWwindow* window,
// The WM_DELETE_WINDOW ICCCM protocol // The WM_DELETE_WINDOW ICCCM protocol
// Basic window close notification protocol // Basic window close notification protocol
if (_glfw.x11.WM_DELETE_WINDOW != None) if (_glfw.x11.WM_DELETE_WINDOW)
protocols[count++] = _glfw.x11.WM_DELETE_WINDOW; protocols[count++] = _glfw.x11.WM_DELETE_WINDOW;
// The _NET_WM_PING EWMH protocol // The _NET_WM_PING EWMH protocol
// Tells the WM to ping the GLFW window and flag the application as // Tells the WM to ping the GLFW window and flag the application as
// unresponsive if the WM doesn't get a reply within a few seconds // unresponsive if the WM doesn't get a reply within a few seconds
if (_glfw.x11.NET_WM_PING != None) if (_glfw.x11.NET_WM_PING)
protocols[count++] = _glfw.x11.NET_WM_PING; protocols[count++] = _glfw.x11.NET_WM_PING;
if (count > 0) if (count > 0)
@@ -222,7 +221,7 @@ static GLboolean createWindow(_GLFWwindow* window,
} }
} }
if (_glfw.x11.NET_WM_PID != None) if (_glfw.x11.NET_WM_PID)
{ {
const pid_t pid = getpid(); const pid_t pid = getpid();
@@ -259,6 +258,14 @@ static GLboolean createWindow(_GLFWwindow* window,
hints->flags |= PPosition; hints->flags |= PPosition;
_glfwPlatformGetMonitorPos(wndconfig->monitor, &hints->x, &hints->y); _glfwPlatformGetMonitorPos(wndconfig->monitor, &hints->x, &hints->y);
} }
else
{
// HACK: Explicitly setting PPosition to any value causes some WMs,
// notably Compiz and Metacity, to honor the position of
// unmapped windows set by XMoveWindow
hints->flags |= PPosition;
hints->x = hints->y = 0;
}
if (!wndconfig->resizable) if (!wndconfig->resizable)
{ {
@@ -271,6 +278,19 @@ static GLboolean createWindow(_GLFWwindow* window,
XFree(hints); XFree(hints);
} }
// Set ICCCM WM_CLASS property
// HACK: Until a mechanism for specifying the application name is added, the
// initial window title is used as the window class name
if (strlen(wndconfig->title))
{
XClassHint* hint = XAllocClassHint();
hint->res_name = (char*) wndconfig->title;
hint->res_class = (char*) wndconfig->title;
XSetClassHint(_glfw.x11.display, window->x11.handle, hint);
XFree(hint);
}
if (_glfw.x11.xi.available) if (_glfw.x11.xi.available)
{ {
// Select for XInput2 events // Select for XInput2 events
@@ -291,6 +311,9 @@ static GLboolean createWindow(_GLFWwindow* window,
XRRSelectInput(_glfw.x11.display, window->x11.handle, XRRSelectInput(_glfw.x11.display, window->x11.handle,
RRScreenChangeNotifyMask); RRScreenChangeNotifyMask);
_glfwPlatformGetWindowPos(window, &window->x11.xpos, &window->x11.ypos);
_glfwPlatformGetWindowSize(window, &window->x11.width, &window->x11.height);
return GL_TRUE; return GL_TRUE;
} }
@@ -358,7 +381,7 @@ static void showCursor(_GLFWwindow* window)
// //
static void enterFullscreenMode(_GLFWwindow* window) static void enterFullscreenMode(_GLFWwindow* window)
{ {
if (!_glfw.x11.saver.changed) if (_glfw.x11.saver.count == 0)
{ {
// Remember old screen saver settings // Remember old screen saver settings
XGetScreenSaver(_glfw.x11.display, XGetScreenSaver(_glfw.x11.display,
@@ -370,21 +393,28 @@ static void enterFullscreenMode(_GLFWwindow* window)
// Disable screen saver // Disable screen saver
XSetScreenSaver(_glfw.x11.display, 0, 0, DontPreferBlanking, XSetScreenSaver(_glfw.x11.display, 0, 0, DontPreferBlanking,
DefaultExposures); DefaultExposures);
_glfw.x11.saver.changed = GL_TRUE;
} }
_glfw.x11.saver.count++;
_glfwSetVideoMode(window->monitor, &window->videoMode); _glfwSetVideoMode(window->monitor, &window->videoMode);
if (_glfw.x11.hasEWMH && if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
_glfw.x11.NET_WM_STATE != None && {
_glfw.x11.NET_WM_STATE_FULLSCREEN != None) const unsigned long value = 1;
XChangeProperty(_glfw.x11.display, window->x11.handle,
_glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
PropModeReplace, (unsigned char*) &value, 1);
}
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)
{ {
int x, y; int x, y;
_glfwPlatformGetMonitorPos(window->monitor, &x, &y); _glfwPlatformGetMonitorPos(window->monitor, &x, &y);
_glfwPlatformSetWindowPos(window, x, y); _glfwPlatformSetWindowPos(window, x, y);
if (_glfw.x11.NET_ACTIVE_WINDOW != None) if (_glfw.x11.NET_ACTIVE_WINDOW)
{ {
// Ask the window manager to raise and focus the GLFW window // Ask the window manager to raise and focus the GLFW window
// Only focused windows with the _NET_WM_STATE_FULLSCREEN state end // Only focused windows with the _NET_WM_STATE_FULLSCREEN state end
@@ -452,7 +482,9 @@ static void leaveFullscreenMode(_GLFWwindow* window)
{ {
_glfwRestoreVideoMode(window->monitor); _glfwRestoreVideoMode(window->monitor);
if (_glfw.x11.saver.changed) _glfw.x11.saver.count--;
if (_glfw.x11.saver.count == 0)
{ {
// Restore old screen saver settings // Restore old screen saver settings
XSetScreenSaver(_glfw.x11.display, XSetScreenSaver(_glfw.x11.display,
@@ -460,13 +492,18 @@ static void leaveFullscreenMode(_GLFWwindow* window)
_glfw.x11.saver.interval, _glfw.x11.saver.interval,
_glfw.x11.saver.blanking, _glfw.x11.saver.blanking,
_glfw.x11.saver.exposure); _glfw.x11.saver.exposure);
_glfw.x11.saver.changed = GL_FALSE;
} }
if (_glfw.x11.hasEWMH && if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
_glfw.x11.NET_WM_STATE != None && {
_glfw.x11.NET_WM_STATE_FULLSCREEN != None) const unsigned long value = 0;
XChangeProperty(_glfw.x11.display, window->x11.handle,
_glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
PropModeReplace, (unsigned char*) &value, 1);
}
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)
{ {
// Ask the window manager to make the GLFW window a normal window // Ask the window manager to make the GLFW window a normal window
// Normal windows usually have frames and other decorations // Normal windows usually have frames and other decorations
@@ -502,8 +539,7 @@ static void processEvent(XEvent *event)
window = _glfwFindWindowByHandle(event->xany.window); window = _glfwFindWindowByHandle(event->xany.window);
if (window == NULL) if (window == NULL)
{ {
// This is either an event for a destroyed GLFW window or an event // This is an event for a window that has already been destroyed
// of a type not currently supported by GLFW
return; return;
} }
} }
@@ -514,11 +550,12 @@ static void processEvent(XEvent *event)
{ {
const int key = translateKey(event->xkey.keycode); const int key = translateKey(event->xkey.keycode);
const int mods = translateState(event->xkey.state); const int mods = translateState(event->xkey.state);
const int character = translateChar(&event->xkey);
_glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods); _glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods);
if (!(mods & GLFW_MOD_CONTROL) && !(mods & GLFW_MOD_ALT)) if (character != -1)
_glfwInputChar(window, translateChar(&event->xkey)); _glfwInputChar(window, character);
break; break;
} }
@@ -553,6 +590,16 @@ static void processEvent(XEvent *event)
else if (event->xbutton.button == Button7) else if (event->xbutton.button == Button7)
_glfwInputScroll(window, 1.0, 0.0); _glfwInputScroll(window, 1.0, 0.0);
else
{
// Additional buttons after 7 are treated as regular buttons
// We subtract 4 to fill the gap left by scroll input above
_glfwInputMouseClick(window,
event->xbutton.button - 4,
GLFW_PRESS,
mods);
}
break; break;
} }
@@ -581,6 +628,15 @@ static void processEvent(XEvent *event)
GLFW_RELEASE, GLFW_RELEASE,
mods); mods);
} }
else if (event->xbutton.button > Button7)
{
// Additional buttons after 7 are treated as regular buttons
// We subtract 4 to fill the gap left by scroll input above
_glfwInputMouseClick(window,
event->xbutton.button - 4,
GLFW_RELEASE,
mods);
}
break; break;
} }
@@ -635,17 +691,31 @@ static void processEvent(XEvent *event)
case ConfigureNotify: case ConfigureNotify:
{ {
_glfwInputFramebufferSize(window, if (event->xconfigure.width != window->x11.width ||
event->xconfigure.width, event->xconfigure.height != window->x11.height)
event->xconfigure.height); {
_glfwInputFramebufferSize(window,
event->xconfigure.width,
event->xconfigure.height);
_glfwInputWindowSize(window, _glfwInputWindowSize(window,
event->xconfigure.width, event->xconfigure.width,
event->xconfigure.height); event->xconfigure.height);
_glfwInputWindowPos(window, window->x11.width = event->xconfigure.width;
event->xconfigure.x, window->x11.height = event->xconfigure.height;
event->xconfigure.y); }
if (event->xconfigure.x != window->x11.xpos ||
event->xconfigure.y != window->x11.ypos)
{
_glfwInputWindowPos(window,
event->xconfigure.x,
event->xconfigure.y);
window->x11.xpos = event->xconfigure.x;
window->x11.ypos = event->xconfigure.y;
}
break; break;
} }
@@ -661,7 +731,7 @@ static void processEvent(XEvent *event)
_glfwInputWindowCloseRequest(window); _glfwInputWindowCloseRequest(window);
} }
else if (_glfw.x11.NET_WM_PING != None && else if (_glfw.x11.NET_WM_PING &&
(Atom) event->xclient.data.l[0] == _glfw.x11.NET_WM_PING) (Atom) event->xclient.data.l[0] == _glfw.x11.NET_WM_PING)
{ {
// The window manager is pinging the application to ensure it's // The window manager is pinging the application to ensure it's
@@ -943,7 +1013,7 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
NULL, NULL, NULL); NULL, NULL, NULL);
#endif #endif
if (_glfw.x11.NET_WM_NAME != None) if (_glfw.x11.NET_WM_NAME)
{ {
XChangeProperty(_glfw.x11.display, window->x11.handle, XChangeProperty(_glfw.x11.display, window->x11.handle,
_glfw.x11.NET_WM_NAME, _glfw.x11.UTF8_STRING, 8, _glfw.x11.NET_WM_NAME, _glfw.x11.UTF8_STRING, 8,
@@ -951,7 +1021,7 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
(unsigned char*) title, strlen(title)); (unsigned char*) title, strlen(title));
} }
if (_glfw.x11.NET_WM_ICON_NAME != None) if (_glfw.x11.NET_WM_ICON_NAME)
{ {
XChangeProperty(_glfw.x11.display, window->x11.handle, XChangeProperty(_glfw.x11.display, window->x11.handle,
_glfw.x11.NET_WM_ICON_NAME, _glfw.x11.UTF8_STRING, 8, _glfw.x11.NET_WM_ICON_NAME, _glfw.x11.UTF8_STRING, 8,
@@ -968,6 +1038,17 @@ void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
XTranslateCoordinates(_glfw.x11.display, window->x11.handle, _glfw.x11.root, XTranslateCoordinates(_glfw.x11.display, window->x11.handle, _glfw.x11.root,
0, 0, &x, &y, &child); 0, 0, &x, &y, &child);
if (child)
{
int left, top;
XTranslateCoordinates(_glfw.x11.display, window->x11.handle, child,
0, 0, &left, &top, &child);
x -= left;
y -= top;
}
if (xpos) if (xpos)
*xpos = x; *xpos = x;
if (ypos) if (ypos)
@@ -993,34 +1074,36 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
{ {
if (!window->resizable)
{
// Update window size restrictions to match new window size
XSizeHints* hints = XAllocSizeHints();
hints->flags |= (PMinSize | PMaxSize);
hints->min_width = hints->max_width = width;
hints->min_height = hints->max_height = height;
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
XFree(hints);
}
if (window->monitor) if (window->monitor)
{ {
_glfwSetVideoMode(window->monitor, &window->videoMode);
if (window->x11.overrideRedirect) if (window->x11.overrideRedirect)
{ {
GLFWvidmode mode; GLFWvidmode mode;
_glfwPlatformGetVideoMode(window->monitor, &mode); _glfwPlatformGetVideoMode(window->monitor, &mode);
XResizeWindow(_glfw.x11.display, window->x11.handle, XResizeWindow(_glfw.x11.display, window->x11.handle,
window->videoMode.width, window->videoMode.height); mode.width, mode.height);
} }
_glfwSetVideoMode(window->monitor, &window->videoMode);
} }
else else
{
if (!window->resizable)
{
// Update window size restrictions to match new window size
XSizeHints* hints = XAllocSizeHints();
hints->flags |= (PMinSize | PMaxSize);
hints->min_width = hints->max_width = width;
hints->min_height = hints->max_height = height;
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
XFree(hints);
}
XResizeWindow(_glfw.x11.display, window->x11.handle, width, height); XResizeWindow(_glfw.x11.display, window->x11.handle, width, height);
}
XFlush(_glfw.x11.display); XFlush(_glfw.x11.display);
} }
@@ -1036,6 +1119,9 @@ void _glfwPlatformIconifyWindow(_GLFWwindow* window)
{ {
// Override-redirect windows cannot be iconified or restored, as those // Override-redirect windows cannot be iconified or restored, as those
// tasks are performed by the window manager // tasks are performed by the window manager
_glfwInputError(GLFW_API_UNAVAILABLE,
"X11: Iconification of full screen windows requires "
"a WM that supports EWMH");
return; return;
} }
@@ -1048,6 +1134,9 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
{ {
// Override-redirect windows cannot be iconified or restored, as those // Override-redirect windows cannot be iconified or restored, as those
// tasks are performed by the window manager // tasks are performed by the window manager
_glfwInputError(GLFW_API_UNAVAILABLE,
"X11: Iconification of full screen windows requires "
"a WM that supports EWMH");
return; return;
} }
@@ -1076,24 +1165,12 @@ void _glfwPlatformPollEvents(void)
processEvent(&event); processEvent(&event);
} }
// Check whether the cursor has moved inside an focused window that has _GLFWwindow* window = _glfw.focusedWindow;
// captured the cursor (because then it needs to be re-centered) if (window && window->cursorMode == GLFW_CURSOR_DISABLED)
_GLFWwindow* window;
window = _glfw.focusedWindow;
if (window)
{ {
if (window->cursorMode == GLFW_CURSOR_DISABLED) int width, height;
{ _glfwPlatformGetWindowSize(window, &width, &height);
int width, height; _glfwPlatformSetCursorPos(window, width / 2, height / 2);
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2, height / 2);
// NOTE: This is a temporary fix. It works as long as you use
// offsets accumulated over the course of a frame, instead of
// performing the necessary actions per callback call.
XFlush(_glfw.x11.display);
}
} }
} }
@@ -1101,10 +1178,8 @@ void _glfwPlatformWaitEvents(void)
{ {
if (!XPending(_glfw.x11.display)) if (!XPending(_glfw.x11.display))
{ {
int fd;
fd_set fds; fd_set fds;
const int fd = ConnectionNumber(_glfw.x11.display);
fd = ConnectionNumber(_glfw.x11.display);
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(fd, &fds); FD_SET(fd, &fds);
+1 -5
View File
@@ -11,10 +11,6 @@ endif()
include_directories(${GLFW_SOURCE_DIR}/include include_directories(${GLFW_SOURCE_DIR}/include
${GLFW_SOURCE_DIR}/deps) ${GLFW_SOURCE_DIR}/deps)
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
if (NOT APPLE) if (NOT APPLE)
# HACK: This is NOTFOUND on OS X 10.8 # HACK: This is NOTFOUND on OS X 10.8
include_directories(${OPENGL_INCLUDE_DIR}) include_directories(${OPENGL_INCLUDE_DIR})
@@ -27,7 +23,7 @@ set(TINYCTHREAD ${GLFW_SOURCE_DIR}/deps/tinycthread.h
add_executable(clipboard clipboard.c ${GETOPT}) add_executable(clipboard clipboard.c ${GETOPT})
add_executable(defaults defaults.c) add_executable(defaults defaults.c)
add_executable(events events.c) add_executable(events events.c ${GETOPT})
add_executable(fsaa fsaa.c ${GETOPT}) add_executable(fsaa fsaa.c ${GETOPT})
add_executable(gamma gamma.c ${GETOPT}) add_executable(gamma gamma.c ${GETOPT})
add_executable(glfwinfo glfwinfo.c ${GETOPT}) add_executable(glfwinfo glfwinfo.c ${GETOPT})
+21 -8
View File
@@ -39,6 +39,8 @@
#include <string.h> #include <string.h>
#include <locale.h> #include <locale.h>
#include "getopt.h"
// These must match the input mode defaults // These must match the input mode defaults
static GLboolean closeable = GL_TRUE; static GLboolean closeable = GL_TRUE;
@@ -226,12 +228,12 @@ static const char* get_mods_name(int mods)
return name; return name;
} }
static const char* get_character_string(int character) static const char* get_character_string(int codepoint)
{ {
// This assumes UTF-8, which is stupid // This assumes UTF-8, which is stupid
static char result[6 + 1]; static char result[6 + 1];
int length = wctomb(result, character); int length = wctomb(result, codepoint);
if (length == -1) if (length == -1)
length = 0; length = 0;
@@ -370,13 +372,13 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,
} }
} }
static void char_callback(GLFWwindow* window, unsigned int character) static void char_callback(GLFWwindow* window, unsigned int codepoint)
{ {
printf("%08x at %0.3f: Character 0x%08x (%s) input\n", printf("%08x at %0.3f: Character 0x%08x (%s) input\n",
counter++, counter++,
glfwGetTime(), glfwGetTime(),
character, codepoint,
get_character_string(character)); get_character_string(codepoint));
} }
void monitor_callback(GLFWmonitor* monitor, int event) void monitor_callback(GLFWmonitor* monitor, int event)
@@ -406,10 +408,11 @@ void monitor_callback(GLFWmonitor* monitor, int event)
} }
} }
int main(void) int main(int argc, char** argv)
{ {
GLFWwindow* window; GLFWwindow* window;
int width, height; GLFWmonitor* monitor = NULL;
int ch, width, height;
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
@@ -420,7 +423,17 @@ int main(void)
printf("Library initialized\n"); printf("Library initialized\n");
window = glfwCreateWindow(640, 480, "Event Linter", NULL, NULL); while ((ch = getopt(argc, argv, "f")) != -1)
{
switch (ch)
{
case 'f':
monitor = glfwGetPrimaryMonitor();
break;
}
}
window = glfwCreateWindow(640, 480, "Event Linter", monitor, NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();
+13 -9
View File
@@ -54,9 +54,16 @@
static void usage(void) static void usage(void)
{ {
printf("Usage: glfwinfo [-h] [-a API] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n"); printf("Usage: glfwinfo [-h] [-a API] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n");
printf("available APIs: " API_OPENGL " " API_OPENGL_ES "\n"); printf("Options:\n");
printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT "\n"); printf(" -a the client API to use (" API_OPENGL " or " API_OPENGL_ES ")\n");
printf("available strategies: " STRATEGY_NAME_NONE " " STRATEGY_NAME_LOSE "\n"); printf(" -d request a debug context\n");
printf(" -f require a forward-compatible context\n");
printf(" -h show this help\n");
printf(" -l list all client API extensions after context creation\n");
printf(" -m the major number of the requred client API version\n");
printf(" -n the minor number of the requred client API version\n");
printf(" -p the OpenGL profile to use (" PROFILE_NAME_CORE " or " PROFILE_NAME_COMPAT ")\n");
printf(" -r the robustness strategy to use (" STRATEGY_NAME_NONE " or " STRATEGY_NAME_LOSE ")\n");
} }
static void error_callback(int error, const char* description) static void error_callback(int error, const char* description)
@@ -186,9 +193,6 @@ int main(int argc, char** argv)
GLint flags, mask; GLint flags, mask;
GLFWwindow* window; GLFWwindow* window;
if (!valid_version())
exit(EXIT_FAILURE);
while ((ch = getopt(argc, argv, "a:dfhlm:n:p:r:")) != -1) while ((ch = getopt(argc, argv, "a:dfhlm:n:p:r:")) != -1)
{ {
switch (ch) switch (ch)
@@ -249,11 +253,11 @@ int main(int argc, char** argv)
} }
} }
argc -= optind;
argv += optind;
// Initialize GLFW and create window // Initialize GLFW and create window
if (!valid_version())
exit(EXIT_FAILURE);
glfwSetErrorCallback(error_callback); glfwSetErrorCallback(error_callback);
if (!glfwInit()) if (!glfwInit())
+33 -29
View File
@@ -64,43 +64,47 @@ static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
static void draw_joystick(Joystick* j, int x, int y, int width, int height) static void draw_joystick(Joystick* j, int x, int y, int width, int height)
{ {
int i; int i;
int axis_width, axis_height; const int axis_height = 3 * height / 4;
int button_width, button_height; const int button_height = height / 4;
axis_width = width / j->axis_count; if (j->axis_count)
axis_height = 3 * height / 4;
button_width = width / j->button_count;
button_height = height / 4;
for (i = 0; i < j->axis_count; i++)
{ {
float value = j->axes[i] / 2.f + 0.5f; const int axis_width = width / j->axis_count;
glColor3f(0.3f, 0.3f, 0.3f); for (i = 0; i < j->axis_count; i++)
glRecti(x + i * axis_width, {
y, float value = j->axes[i] / 2.f + 0.5f;
x + (i + 1) * axis_width,
y + axis_height);
glColor3f(1.f, 1.f, 1.f); glColor3f(0.3f, 0.3f, 0.3f);
glRecti(x + i * axis_width, glRecti(x + i * axis_width,
y + (int) (value * (axis_height - 5)), y,
x + (i + 1) * axis_width, x + (i + 1) * axis_width,
y + 5 + (int) (value * (axis_height - 5))); y + axis_height);
glColor3f(1.f, 1.f, 1.f);
glRecti(x + i * axis_width,
y + (int) (value * (axis_height - 5)),
x + (i + 1) * axis_width,
y + 5 + (int) (value * (axis_height - 5)));
}
} }
for (i = 0; i < j->button_count; i++) if (j->button_count)
{ {
if (j->buttons[i]) const int button_width = width / j->button_count;
glColor3f(1.f, 1.f, 1.f);
else
glColor3f(0.3f, 0.3f, 0.3f);
glRecti(x + i * button_width, for (i = 0; i < j->button_count; i++)
y + axis_height, {
x + (i + 1) * button_width, if (j->buttons[i])
y + axis_height + button_height); glColor3f(1.f, 1.f, 1.f);
else
glColor3f(0.3f, 0.3f, 0.3f);
glRecti(x + i * button_width,
y + axis_height,
x + (i + 1) * button_width,
y + axis_height + button_height);
}
} }
} }
-3
View File
@@ -218,9 +218,6 @@ int main(int argc, char** argv)
} }
} }
argc -= optind;
argv += optind;
glfwSetErrorCallback(error_callback); glfwSetErrorCallback(error_callback);
if (!glfwInit()) if (!glfwInit())
-5
View File
@@ -35,7 +35,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include <assert.h>
typedef struct typedef struct
{ {
@@ -57,8 +56,6 @@ static int thread_main(void* data)
const Thread* thread = (const Thread*) data; const Thread* thread = (const Thread*) data;
glfwMakeContextCurrent(thread->window); glfwMakeContextCurrent(thread->window);
assert(glfwGetCurrentContext() == thread->window);
glfwSwapInterval(1); glfwSwapInterval(1);
while (running) while (running)
@@ -118,8 +115,6 @@ int main(void)
while (running) while (running)
{ {
assert(glfwGetCurrentContext() == NULL);
glfwWaitEvents(); glfwWaitEvents();
for (i = 0; i < count; i++) for (i = 0; i < count; i++)