GLFW-b 0.1.0.5 → 3.3.9.1
raw patch · 55 files changed
Files
- GLFW-b.cabal +60/−111
- Graphics/UI/GLFW.hs +2067/−0
- Graphics/UI/GLFW/C.hs +686/−0
- Graphics/UI/GLFW/Types.hs +647/−0
- LICENSE +1/−1
- Makefile +0/−39
- README.md +36/−18
- Setup.hs +2/−105
- TODO +16/−0
- Test.hs +683/−0
- build/glfw/lib/cocoa/.build-tag +0/−0
- glfw/include/GL/glfw.h +0/−509
- glfw/lib/cocoa/cocoa_enable.m +0/−51
- glfw/lib/cocoa/cocoa_fullscreen.m +0/−102
- glfw/lib/cocoa/cocoa_glext.m +0/−63
- glfw/lib/cocoa/cocoa_init.m +0/−297
- glfw/lib/cocoa/cocoa_joystick.m +0/−65
- glfw/lib/cocoa/cocoa_thread.c +0/−416
- glfw/lib/cocoa/cocoa_time.m +0/−105
- glfw/lib/cocoa/cocoa_window.m +0/−924
- glfw/lib/cocoa/platform.h +0/−252
- glfw/lib/enable.c +0/−310
- glfw/lib/fullscreen.c +0/−94
- glfw/lib/glext.c +0/−283
- glfw/lib/image.c +0/−629
- glfw/lib/init.c +0/−110
- glfw/lib/input.c +0/−269
- glfw/lib/internal.h +0/−265
- glfw/lib/joystick.c +0/−99
- glfw/lib/stream.c +0/−195
- glfw/lib/tga.c +0/−404
- glfw/lib/thread.c +0/−341
- glfw/lib/time.c +0/−84
- glfw/lib/win32/platform.h +0/−555
- glfw/lib/win32/win32_dllmain.c +0/−49
- glfw/lib/win32/win32_enable.c +0/−155
- glfw/lib/win32/win32_fullscreen.c +0/−320
- glfw/lib/win32/win32_glext.c +0/−82
- glfw/lib/win32/win32_init.c +0/−356
- glfw/lib/win32/win32_joystick.c +0/−233
- glfw/lib/win32/win32_thread.c +0/−506
- glfw/lib/win32/win32_time.c +0/−146
- glfw/lib/win32/win32_window.c +0/−1875
- glfw/lib/window.c +0/−1005
- glfw/lib/x11/platform.h +0/−503
- glfw/lib/x11/x11_enable.c +0/−64
- glfw/lib/x11/x11_fullscreen.c +0/−569
- glfw/lib/x11/x11_glext.c +0/−89
- glfw/lib/x11/x11_init.c +0/−286
- glfw/lib/x11/x11_joystick.c +0/−367
- glfw/lib/x11/x11_keysym2unicode.c +0/−901
- glfw/lib/x11/x11_thread.c +0/−503
- glfw/lib/x11/x11_time.c +0/−154
- glfw/lib/x11/x11_window.c +0/−1891
- src/Graphics/UI/GLFW.hsc +0/−1087
GLFW-b.cabal view
@@ -1,140 +1,89 @@ name: GLFW-b-version: 0.1.0.5-+version: 3.3.9.1 category: Graphics -synopsis: GLFW bindings-description: Bindings to GLFW, a free, open source, multi-platform library for- creating OpenGL contexts and managing input, including keyboard,- mouse, joystick and time.- .- GLFW-b works on Windows, Mac OS X, and many Unix-like operating- systems.- .- Please see README.md- (<http://github.com/bsl/GLFW-b/blob/master/README.md>) for- information about how these bindings differ from the ones in the- GLFW package (<http://hackage.haskell.org/package/GLFW>).- .- For more information about the library on which these bindings- are based, please see <http://glfw.sourceforge.net>.- author: Brian Lewis <brian@lorf.org> maintainer: Brian Lewis <brian@lorf.org>+ , Schell Scivally <schell.scivally@synapsegroup.com>+ , Pavel Krajcevski <krajcevski@gmail.com> license: BSD3 license-file: LICENSE --- -- -- -- -- -- -- -- -- --+synopsis: Bindings to GLFW OpenGL library+description:+ Bindings to GLFW (<http://www.glfw.org/>), an open source, multi-platform+ library for creating windows with OpenGL contexts and managing input and+ events.+ .+ GLFW-b depends on bindings-GLFW+ (<http://hackage.haskell.org/package/bindings-GLFW>), which, as of the time+ of this writing, binds to GLFW 3.3.9, released 2023-12-13+ (<http://www.glfw.org/Version-3.3.0-released.html>+ <http://www.glfw.org/changelog.html>).+ .+ If you've used GLFW < 3 before, you should read the transition guide+ (<http://www.glfw.org/docs/3.0/moving.html>). -cabal-version: >= 1.6-build-type: Custom +cabal-version: >= 1.10+build-type: Simple --- -- -- -- -- -- -- -- -- --+-------------------------------------------------------------------------------- extra-source-files:- Makefile README.md- ./build/glfw/lib/cocoa/.build-tag- glfw/include/GL/glfw.h- glfw/lib/internal.h- glfw/lib/cocoa/platform.h- glfw/lib/win32/platform.h- glfw/lib/x11/platform.h- -- We can't explicitly list these as- -- C sources so we list them here.- glfw/lib/cocoa/cocoa_enable.m- glfw/lib/cocoa/cocoa_joystick.m- glfw/lib/cocoa/cocoa_fullscreen.m- glfw/lib/cocoa/cocoa_time.m- glfw/lib/cocoa/cocoa_glext.m- glfw/lib/cocoa/cocoa_window.m- glfw/lib/cocoa/cocoa_init.m- glfw/lib/cocoa/cocoa_thread.c--- -- -- -- -- -- -- -- -- --+ TODO +--------------------------------------------------------------------------------+ library+ default-language: Haskell2010++ ghc-options: -Wall+ if impl(ghc >= 6.8)+ ghc-options: -fwarn-tabs+ exposed-modules: Graphics.UI.GLFW+ Graphics.UI.GLFW.C - build-depends:- base == 4.*+ other-modules:+ Graphics.UI.GLFW.Types - hs-source-dirs:- src+ build-depends:+ base < 5+ , deepseq >= 1.1.0.0+ , array >= 0.5.3.0+ , bindings-GLFW >= 3.3.9.2 - include-dirs:- glfw/include- glfw/lib- if !os(darwin)- c-sources:- glfw/lib/enable.c- glfw/lib/fullscreen.c- glfw/lib/glext.c- glfw/lib/image.c- glfw/lib/init.c- glfw/lib/input.c- glfw/lib/joystick.c- glfw/lib/stream.c- glfw/lib/tga.c- glfw/lib/thread.c- glfw/lib/time.c- glfw/lib/window.c+-------------------------------------------------------------------------------- - if os(linux) || os(freebsd)- include-dirs:- glfw/lib/x11- c-sources:- glfw/lib/x11/x11_enable.c- glfw/lib/x11/x11_fullscreen.c- glfw/lib/x11/x11_glext.c- glfw/lib/x11/x11_init.c- glfw/lib/x11/x11_joystick.c- glfw/lib/x11/x11_keysym2unicode.c- glfw/lib/x11/x11_thread.c- glfw/lib/x11/x11_time.c- glfw/lib/x11/x11_window.c- cc-options:- -D_GLFW_USE_LINUX_JOYSTICKS- -D_GLFW_HAS_XRANDR--- -D_GLFW_HAS_PTHREAD--- -D_GLFW_HAS_SCHED_YIELD- -D_GLFW_HAS_GLXGETPROCADDRESS--- -D_GLFW_HAS_DLOPEN--- -D_GLFW_HAS_SYSCONF--- -pthread- extra-libraries:- GL- GLU- X11- Xrandr- else- if os(darwin)- extra-libraries: glfw- extra-lib-dirs: build- ghc-options: -fPIC- else- if os(mingw32)- include-dirs:- glfw/lib/win32- c-sources:- glfw/lib/win32/win32_dllmain.c- glfw/lib/win32/win32_enable.c- glfw/lib/win32/win32_fullscreen.c- glfw/lib/win32/win32_glext.c- glfw/lib/win32/win32_init.c- glfw/lib/win32/win32_joystick.c- glfw/lib/win32/win32_thread.c- glfw/lib/win32/win32_time.c- glfw/lib/win32/win32_window.c- extra-libraries:- opengl32+test-suite main+ default-language: Haskell2010 - ghc-options: -Wall -O2+ ghc-options: -Wall if impl(ghc >= 6.8) ghc-options: -fwarn-tabs --- -- -- -- -- -- -- -- -- --+ type: exitcode-stdio-1.0++ main-is: Test.hs++ other-modules:+ Graphics.UI.GLFW+ Graphics.UI.GLFW.Types++ build-depends:+ GLFW-b+ , HUnit >= 1.3 && < 1.7+ , base < 5+ , array >= 0.5.3.0+ , bindings-GLFW >= 3.3.9.2+ , deepseq >= 1.1.0.0+ , test-framework == 0.8.*+ , test-framework-hunit == 0.3.*++-------------------------------------------------------------------------------- source-repository head type: git
+ Graphics/UI/GLFW.hs view
@@ -0,0 +1,2067 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-|++Threading restrictions which apply to the C version of GLFW still apply when+writing @GLFW-b@ programs. See+<http://www.glfw.org/docs/3.3/intro.html#thread_safety GLFW thread safety documentation>+(applies here).++Current context restructions which apply to the C version of GLFW still apply.+See <http://www.glfw.org/docs/3.3/context.html#context_current GLFW current context documentation>+(applies here).++@GLFW-b@ wraps callbacks and schedules them to be run after 'pollEvents' and+'waitEvents' in the normal GHC runtime where they aren't subject to the usual+GLFW reentrancy restrictions. See+<http://www.glfw.org/docs/3.3/intro.html#reentrancy GLFW reentrancy documentation>+(does not apply here).++-}+module Graphics.UI.GLFW+ ( -- * Error handling+ Error (..)+ --+ , setErrorCallback, ErrorCallback++ -- * Initialization and version information+ , Version (..)+ --+ , init+ , InitHint(..)+ , initHint+ , terminate+ , getVersion+ , getVersionString+ , getError+ , clearError+ , rawMouseMotionSupported++ -- * Monitor handling+ , Monitor+ , MonitorState (..)+ , VideoMode (..)+ , GammaRamp (gammaRampRed, gammaRampGreen, gammaRampBlue)+ , makeGammaRamp+ --+ , getMonitors+ , getPrimaryMonitor+ , getMonitorPos+ , getMonitorPhysicalSize+ , getMonitorContentScale+ , getMonitorWorkarea+ , getMonitorName+ , setMonitorCallback, MonitorCallback+ , getVideoModes+ , getVideoMode+ , setGamma+ , getGammaRamp+ , setGammaRamp++ -- * Window handling+ , Window+ , WindowHint (..)+ , WindowAttrib (..)+ , ContextRobustness (..)+ , OpenGLProfile (..)+ , ClientAPI (..)+ , ContextCreationAPI (..)+ , ContextReleaseBehavior (..)+ --+ , defaultWindowHints+ , windowHint+ , setWindowAttrib+ , getWindowAttrib+ , createWindow+ , destroyWindow+ , windowShouldClose+ , setWindowShouldClose+ , getWindowOpacity+ , setWindowOpacity+ , setWindowTitle+ , getWindowPos+ , setWindowPos+ , getWindowSize+ , setWindowSize+ , setWindowSizeLimits+ , setWindowAspectRatio+ , getWindowFrameSize+ , getWindowContentScale+ , getFramebufferSize+ , setWindowIcon+ , iconifyWindow+ , restoreWindow+ , focusWindow+ , maximizeWindow+ , showWindow+ , hideWindow+ , requestWindowAttention+ , getWindowMonitor+ , setCursorPos+ , setFullscreen+ , setWindowed+ -- related to c'glfwGetWindowAttrib --.+ , getWindowFocused -- |+ , getWindowMaximized -- |+ , getWindowFloating -- |+ , getWindowIconified -- |+ , getWindowResizable -- |+ , getWindowDecorated -- |+ , getWindowVisible -- |+ , getWindowClientAPI -- |+ , getWindowContextCreationAPI -- |+ , getWindowContextVersionMajor -- |+ , getWindowContextVersionMinor -- |+ , getWindowContextVersionRevision -- |+ , getWindowContextRobustness -- |+ , getWindowContextReleaseBehavior -- |+ , getWindowContextNoError -- |+ , getWindowOpenGLForwardCompat -- |+ , getWindowOpenGLDebugContext -- |+ , getWindowOpenGLProfile --------------'+ , setWindowPosCallback, WindowPosCallback+ , setWindowSizeCallback, WindowSizeCallback+ , setWindowCloseCallback, WindowCloseCallback+ , setWindowRefreshCallback, WindowRefreshCallback+ , setWindowFocusCallback, WindowFocusCallback+ , setWindowIconifyCallback, WindowIconifyCallback+ , setFramebufferSizeCallback, FramebufferSizeCallback+ , setWindowContentScaleCallback, WindowContentScaleCallback+ , setWindowMaximizeCallback, WindowMaximizeCallback+ , pollEvents+ , waitEvents+ , waitEventsTimeout+ , postEmptyEvent++ -- * Input handling+ , Key (..)+ , KeyState (..)+ , Joystick (..)+ , JoystickState (..)+ , JoystickButtonState (..)+ , MouseButton (..)+ , MouseButtonState (..)+ , CursorState (..)+ , CursorInputMode (..)+ , StickyKeysInputMode (..)+ , StickyMouseButtonsInputMode (..)+ , ModifierKeys (..)+ , GamepadButton (..)+ , GamepadAxis (..)+ , GamepadButtonState (..)+ , GamepadState (..)+ , Image+ , mkImage+ , Cursor (..)+ , StandardCursorShape (..)+ --+ -- related to c'glfwSetInputMode ----.+ , getCursorInputMode -- |+ , setCursorInputMode -- |+ , getRawMouseMotion -- |+ , setRawMouseMotion -- |+ , getStickyKeysInputMode -- |+ , setStickyKeysInputMode -- |+ , getStickyMouseButtonsInputMode -- |+ , setStickyMouseButtonsInputMode -----'+ , getKey+ , getKeyName+ , getKeyScancode+ , getMouseButton+ , getCursorPos+ , setKeyCallback, KeyCallback+ , setCharCallback, CharCallback+ , setCharModsCallback, CharModsCallback+ , setMouseButtonCallback, MouseButtonCallback+ , setCursorPosCallback, CursorPosCallback+ , setCursorEnterCallback, CursorEnterCallback+ , createCursor+ , createStandardCursor+ , setCursor+ , destroyCursor+ , setScrollCallback, ScrollCallback+ , setDropCallback, DropCallback+ , joystickPresent+ , joystickIsGamepad+ , getJoystickAxes+ , getJoystickButtons+ , getJoystickHats, JoystickHatState(..)+ , getJoystickName+ , getJoystickGUID+ , setJoystickCallback, JoystickCallback+ , getGamepadName+ , getGamepadState+ , updateGamepadMappings++ -- * Time+ , getTime+ , setTime+ , getTimerValue+ , getTimerFrequency++ -- * Context+ , makeContextCurrent+ , getCurrentContext+ , swapBuffers+ , swapInterval+ , extensionSupported++ -- * Clipboard+ , getClipboardString+ , setClipboardString++ -- * Vulkan-related functions+ , vulkanSupported+ , getRequiredInstanceExtensions+ , getInstanceProcAddress+ , getPhysicalDevicePresentationSupport+ , createWindowSurface++ -- * Native access functions+ -- $nativeaccess+ , getWin32Adapter+ , getWin32Monitor+ , getWin32Window+ , getWGLContext+ , getCocoaMonitor+ , getCocoaWindow+ , getNSGLContext+ , getX11Display+ , getX11Adapter+ , getX11Monitor+ , getX11Window+ , getX11SelectionString+ , setX11SelectionString+ , getGLXContext+ , getGLXWindow+ , getWaylandDisplay+ , getWaylandMonitor+ , getWaylandWindow+ , getEGLDisplay+ , getEGLContext+ , getEGLSurface+ , getOSMesaContext+ , getOSMesaColorBuffer, OSMesaColorBuffer, OSMesaRGBA+ , getOSMesaDepthBuffer, OSMesaDepthBuffer+ ) where++--------------------------------------------------------------------------------++import Prelude hiding (init)++import Control.Monad (when, liftM, forM)+import Data.Array.IArray (Array, array)+import Data.Bits (shiftR, shiftL, (.&.), (.|.))+import Data.IORef (IORef, atomicModifyIORef, newIORef, readIORef)+import Data.List (foldl')+import Data.Word (Word8, Word16, Word32, Word64)+import Foreign.C.String (peekCString, withCString, CString)+import Foreign.C.Types (CUInt, CInt, CUShort, CFloat(..))+import Foreign.Marshal.Alloc (alloca, allocaBytes)+import Foreign.Marshal.Array (advancePtr, allocaArray, peekArray, withArray)+import Foreign.Ptr ( FunPtr, freeHaskellFunPtr, nullFunPtr, nullPtr+ , Ptr, castPtr, plusPtr)+import Foreign.StablePtr+import Foreign.Storable (Storable (..))+import System.IO.Unsafe (unsafePerformIO)++import Graphics.UI.GLFW.C+import Graphics.UI.GLFW.Types++import Bindings.GLFW++--------------------------------------------------------------------------------+-- Helper functions++-- C to haskell float.+hFloat :: CFloat -> Float+hFloat (CFloat f) = f++--------------------------------------------------------------------------------++-- We store FunPtrs from mk'GLFW*fun in these stored*Fun IORefs. Initialized+-- with unsafePerformIO, they are basically mutable global variables.++storedErrorFun :: IORef C'GLFWerrorfun+storedMonitorFun :: IORef C'GLFWmonitorfun+storedJoystickFun :: IORef C'GLFWjoystickfun++storedErrorFun = unsafePerformIO $ newIORef nullFunPtr+storedMonitorFun = unsafePerformIO $ newIORef nullFunPtr+storedJoystickFun = unsafePerformIO $ newIORef nullFunPtr++-- These NOINLINE pragmas are due to use of unsafePerformIO.+-- See http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-IO-Unsafe.html#v:unsafePerformIO .++{-# NOINLINE storedErrorFun #-}+{-# NOINLINE storedMonitorFun #-}+{-# NOINLINE storedJoystickFun #-}++setWindowCallback+ :: (c -> IO (FunPtr c)) -- wf wrapper function+ -> (h -> c) -- af adapter function+ -> (FunPtr c -> IO (FunPtr c)) -- gf c'glfwSet*Callback function+ -> (WindowCallbacks -> IORef (FunPtr c)) -- ior accessor for storage location+ -> Window -- win window+ -> Maybe h -- mcb Haskell callback+ -> IO ()+setWindowCallback wr af gf ior win mcb = do+ pcallbacks <- castPtrToStablePtr `liftM` c'glfwGetWindowUserPointer (unWindow win)+ callbacks <- deRefStablePtr pcallbacks+ setCallback wr af gf (ior callbacks) mcb++setCallback+ :: (c -> IO (FunPtr c)) -- wf wrapper function+ -> (h -> c) -- af adapter function+ -> (FunPtr c -> IO (FunPtr c)) -- gf c'glfwSet*Callback function+ -> IORef (FunPtr c) -- ior storage location+ -> Maybe h -- mcb Haskell callback+ -> IO ()+setCallback wf af gf ior mcb = do+ -- If mcb is Just, make ccb the FunPtr of the adapted callback. Otherwise a+ -- null FunPtr.+ ccb <- maybe (return nullFunPtr) (wf . af) mcb+ -- Call the GLFW callback-setting function.+ _ <- gf ccb+ -- Store it.+ storeCallback ior ccb++storeCallback :: IORef (FunPtr a) -> FunPtr a -> IO ()+storeCallback ior new = do+ -- Store the new FunPtr, retrieve the previous one.+ prev <- atomicModifyIORef ior (\cur -> (new, cur))+ -- Free the old FunPtr if necessary.+ when (prev /= nullFunPtr) $ freeHaskellFunPtr prev++--------------------------------------------------------------------------------++-- | The error code and also a human-readable error message.+type ErrorCallback = Error -> String -> IO ()+-- | Fires when the window position changes.+type WindowPosCallback = Window -> Int -> Int -> IO ()+-- | Fires when the window is resized (in Screen Coordinates, which might not map 1:1 with pixels).+type WindowSizeCallback = Window -> Int -> Int -> IO ()+-- | Fires when the user is attempting to close the window+type WindowCloseCallback = Window -> IO ()+-- | Fires when the contents of the window are damaged and they must be refreshed.+type WindowRefreshCallback = Window -> IO ()+-- | Fires when the window gains or loses input focus.+type WindowFocusCallback = Window -> Bool -> IO ()+-- | Fires when the window is iconified (minimized) or not.+type WindowIconifyCallback = Window -> Bool -> IO ()+-- | Fires when the size of the framebuffer for the window changes (in Pixels).+type FramebufferSizeCallback = Window -> Int -> Int -> IO ()+-- | Fires whenever a mouse button is clicked.+type MouseButtonCallback = Window -> MouseButton -> MouseButtonState -> ModifierKeys -> IO ()+-- | Fires every time the cursor position changes. Sub-pixel accuracy is used, when available.+type CursorPosCallback = Window -> Double -> Double -> IO ()+-- | Fires when the cursor enters or exits the client area of the window.+type CursorEnterCallback = Window -> CursorState -> IO ()+-- | Fires when the user scrolls the mouse wheel or via touch gesture.+type ScrollCallback = Window -> Double -> Double -> IO ()+-- | Fires for each press or repeat of keyboard keys (regardless of if it has textual meaning or not, eg Shift)+type KeyCallback = Window -> Key -> Int -> KeyState -> ModifierKeys -> IO ()+-- | Fires when a complete character codepoint is typed by the user, Shift then "b" generates "B".+type CharCallback = Window -> Char -> IO ()+-- | Similar to 'CharCallback', fires when a complete unicode codepoint is typed by the user.+type CharModsCallback = Window -> Char -> ModifierKeys -> IO ()+-- | Fires when a monitor is connected or disconnected.+type MonitorCallback = Monitor -> MonitorState -> IO ()+-- | Fires when a joystick is connected or disconnected.+type JoystickCallback = Joystick -> JoystickState -> IO ()+-- | Fires when a window is rescaled+type WindowContentScaleCallback = Window -> Float -> Float -> IO ()+-- | Fires when a window is maximized or restored. Returns True if the window+-- was maximized and False if the window was restored.+type WindowMaximizeCallback = Window -> Bool -> IO ()+--------------------------------------------------------------------------------+-- CB scheduling++data ScheduledCallbacks = ScheduledCallbacks+ { _forward :: [IO ()] -- Execution iterates this list+ , _backward :: [IO ()] -- New schedules prepend here+ }++storedScheduledCallbacks :: IORef ScheduledCallbacks+storedScheduledCallbacks = unsafePerformIO . newIORef $ ScheduledCallbacks [] []++-- This NOINLINE pragma is due to use of unsafePerformIO.+-- See http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-IO-Unsafe.html#v:unsafePerformIO .++{-# NOINLINE storedScheduledCallbacks #-}++-- This is provided in newer "base" versions. To avoid depending on+-- it, it's reimplemented here. Should remove if/when compatibility+-- with older base is not an issue:+atomicModifyIORef' :: IORef a -> (a -> (a,b)) -> IO b+atomicModifyIORef' ref f = do+ b <- atomicModifyIORef ref+ (\x -> let (a, b) = f x+ in (a, a `seq` b))+ b `seq` return b++schedule :: IO () -> IO ()+schedule act =+ atomicModifyIORef' storedScheduledCallbacks $+ \(ScheduledCallbacks oldForward oldBackward) ->+ (ScheduledCallbacks oldForward (act : oldBackward), ())++splitFirst :: [a] -> (Maybe a, [a])+splitFirst [] = (Nothing, [])+splitFirst (x:xs) = (Just x, xs)++getNextScheduled :: IO (Maybe (IO ()))+getNextScheduled =+ atomicModifyIORef storedScheduledCallbacks $+ \(ScheduledCallbacks oldForward oldBackward) ->+ case oldForward of+ [] ->+ let (mCb, newForward) = splitFirst (reverse oldBackward)+ in (ScheduledCallbacks newForward [], mCb)+ (cb:rest) -> -- Eat forward first+ (ScheduledCallbacks rest oldBackward, Just cb)++executeScheduled :: IO ()+executeScheduled = do+ mcb <- getNextScheduled+ case mcb of+ Nothing -> return ()+ Just cb -> cb >> executeScheduled++--------------------------------------------------------------------------------+-- Error handling++-- | Can (and probably should) be used before GLFW initialization.+-- See <http://www.glfw.org/docs/3.3/group__init.html#gaa5d796c3cf7c1a7f02f845486333fb5f glfwSetErrorCallback>+setErrorCallback :: Maybe ErrorCallback -> IO ()+setErrorCallback = setCallback+ mk'GLFWerrorfun+ (\cb a0 a1 -> do+ s <- peekCString a1+ schedule $ cb (fromC a0) s)+ c'glfwSetErrorCallback+ storedErrorFun++--------------------------------------------------------------------------------+-- Image utility functions++withGLFWImage :: Image -> (Ptr C'GLFWimage -> IO a) -> IO a+withGLFWImage (Image w h pxs) f =+ alloca $ \p'img ->+ withArray pxs $ \p'pxs -> do+ poke p'img $ C'GLFWimage (toC w) (toC h) p'pxs+ f p'img++--------------------------------------------------------------------------------+-- Initialization and version information++-- | Attempts to initialize the GLFW library. When the library is not initialized, the only+-- allowed functions to call are 'getVersion', 'getVersionString', 'setErrorCallback',+-- 'init', and 'terminate'. Returns if the initialization was successful or not.+-- See <http://www.glfw.org/docs/3.3/group__init.html#ga317aac130a235ab08c6db0834907d85e glfwInit>+-- and <http://www.glfw.org/docs/3.3/intro.html#intro_init Initialization and Termination>+init :: IO Bool+init = fromC `fmap` c'glfwInit++-- | This function sets hints for the next initialization of GLFW. See+-- <https://www.glfw.org/docs/3.3/group__init.html#ga110fd1d3f0412822b4f1908c026f724a glfwInitHint>+initHint :: InitHint -> Bool -> IO ()+initHint hint val = c'glfwInitHint (toC hint) (toC val)++-- | Cleans up GLFW and puts the library into an uninitialized state.+-- Once you call this, you must initilize the library again.+-- Warning: No window's context may be current in another thread when this is called.+-- See <http://www.glfw.org/docs/3.3/group__init.html#gaaae48c0a18607ea4a4ba951d939f0901 glfwTerminate>+-- and <http://www.glfw.org/docs/3.3/intro.html#intro_init Initialization and Termination>. This+-- function is not <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+terminate :: IO ()+terminate = do+ c'glfwTerminate+ -- Free all stored FunPtrs.+ storeCallback storedErrorFun nullFunPtr+ storeCallback storedMonitorFun nullFunPtr+ storeCallback storedJoystickFun nullFunPtr++-- | Gets the version of the GLFW library that's being used with the current program.+-- See <http://www.glfw.org/docs/3.3/group__init.html#ga9f8ffaacf3c269cc48eafbf8b9b71197 glfwGetVersion>+getVersion :: IO Version+getVersion =+ allocaArray 3 $ \p -> do+ let p0 = p+ p1 = p `advancePtr` 1+ p2 = p `advancePtr` 2+ c'glfwGetVersion p0 p1 p2+ v0 <- fromC `fmap` peek p0+ v1 <- fromC `fmap` peek p1+ v2 <- fromC `fmap` peek p2+ return $ Version v0 v1 v2++-- | Gets the compile-time version string of the GLFW library binary.+-- Gives extra info like platform and compile time options used, but you should not+-- attempt to parse this to get the GLFW version number. Use 'getVersion' instead.+-- See <http://www.glfw.org/docs/3.3/group__init.html#ga23d47dc013fce2bf58036da66079a657 glfwGetVersionString>+getVersionString :: IO (Maybe String)+getVersionString = do+ p'vs <- c'glfwGetVersionString+ if p'vs /= nullPtr+ then Just `fmap` peekCString p'vs+ else return Nothing++-- | Returns and clears the error code of the last error that occurred on the+-- calling thread and a UTF-8 encoded human-readable description of it. If no+-- error has occurred since the last call, it returns Nothing.+getError :: IO (Maybe (Error, String))+getError = alloca $ \errStr -> do+ err <- c'glfwGetError errStr+ if err == c'GLFW_NO_ERROR+ then return Nothing+ else peek errStr+ >>= peekCString+ >>= (\s -> return $ Just (fromC err, s))++-- | Clears the last error as would be retreived by 'getError'.+clearError :: IO ()+clearError = c'glfwGetError nullPtr >> pure ()++-- | Returns true if raw mouse motion is supported on the current system.+-- See <https://www.glfw.org/docs/3.3/group__input.html#gae4ee0dbd0d256183e1ea4026d897e1c2 glfwRawMouseMotionSupported>+rawMouseMotionSupported :: IO Bool+rawMouseMotionSupported = fromC <$> c'glfwRawMouseMotionSupported++--------------------------------------------------------------------------------+-- Monitor handling++-- | Gets the list of available monitors, if possible.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga3fba51c8bd36491d4712aa5bd074a537 glfwGetMonitors>+getMonitors :: IO (Maybe [Monitor])+getMonitors =+ alloca $ \p'n -> do+ p'mon <- c'glfwGetMonitors p'n+ n <- fromC `fmap` peek p'n+ if p'mon == nullPtr || n <= 0+ then return Nothing+ else (Just . map fromC) `fmap` peekArray n p'mon++-- | Gets the primary monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga721867d84c6d18d6790d64d2847ca0b1 glfwGetPrimaryMonitor>+getPrimaryMonitor :: IO (Maybe Monitor)+getPrimaryMonitor = do+ p'mon <- c'glfwGetPrimaryMonitor+ return $+ if p'mon == nullPtr+ then Nothing+ else Just $ fromC p'mon++-- | Gets the position of the specified monitor within the coordinate space.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga102f54e7acc9149edbcf0997152df8c9 glfwGetMonitorPos>+getMonitorPos :: Monitor -> IO (Int, Int)+getMonitorPos mon =+ allocaArray 2 $ \p -> do+ let p'x = p+ p'y = p `advancePtr` 1+ c'glfwGetMonitorPos (toC mon) p'x p'y+ x <- fromC `fmap` peek p'x+ y <- fromC `fmap` peek p'y+ return (x, y)++-- | The physical width and height of the monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga7d8bffc6c55539286a6bd20d32a8d7ea glfwGetMonitorPhysicalSize>+getMonitorPhysicalSize :: Monitor -> IO (Int, Int)+getMonitorPhysicalSize mon =+ allocaArray 2 $ \p -> do+ let p'w = p+ p'h = p `advancePtr` 1+ c'glfwGetMonitorPhysicalSize (toC mon) p'w p'h+ w <- fromC `fmap` peek p'w+ h <- fromC `fmap` peek p'h+ return (w, h)++-- | A human-readable name for the monitor specified.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga79a34ee22ff080ca954a9663e4679daf getMonitorName>+getMonitorName :: Monitor -> IO (Maybe String)+getMonitorName mon = do+ p'name <- c'glfwGetMonitorName (toC mon)+ if p'name == nullPtr+ then return Nothing+ else Just `fmap` peekCString p'name++-- | Sets a callback for when a monitor is connected or disconnected.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#gac3fe0f647f68b731f99756cd81897378 glfwSetMonitorCallback>+setMonitorCallback :: Maybe MonitorCallback -> IO ()+setMonitorCallback = setCallback+ mk'GLFWmonitorfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ c'glfwSetMonitorCallback+ storedMonitorFun++-- | Obtains the possible video modes of the monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga820b0ce9a5237d645ea7cbb4bd383458 glfwGetVideoModes>+getVideoModes :: Monitor -> IO (Maybe [VideoMode])+getVideoModes mon =+ alloca $ \p'n -> do+ p'vms <- c'glfwGetVideoModes (toC mon) p'n+ n <- fromC `fmap` peek p'n+ if p'vms == nullPtr || n <= 0+ then return Nothing+ else (Just . map fromC) `fmap` peekArray n p'vms++-- | Gets the active video mode of the monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#gafc1bb972a921ad5b3bd5d63a95fc2d52 glfwGetVideoMode>+getVideoMode :: Monitor -> IO (Maybe VideoMode)+getVideoMode mon = do+ p'vm <- c'glfwGetVideoMode (toC mon)+ if p'vm == nullPtr+ then return Nothing+ else (Just . fromC) `fmap` peek p'vm++-- | Sets the gamma of a monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga6ac582625c990220785ddd34efa3169a glfwSetGamma>+setGamma :: Monitor -> Double -> IO ()+setGamma mon e =+ c'glfwSetGamma (toC mon) (toC e)++-- | Gets the gamma ramp in use with the monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#gab7c41deb2219bde3e1eb756ddaa9ec80 glfwGetGammaRamp>+getGammaRamp :: Monitor -> IO (Maybe GammaRamp)+getGammaRamp m = do+ p'ggr <- c'glfwGetGammaRamp (toC m)+ if p'ggr == nullPtr+ then return Nothing+ else do+ ggr <- peek p'ggr+ let p'rs = c'GLFWgammaramp'red ggr+ p'gs = c'GLFWgammaramp'green ggr+ p'bs = c'GLFWgammaramp'blue ggr+ cn = c'GLFWgammaramp'size ggr+ n = fromC cn+ if n == 0 || nullPtr `elem` [p'rs, p'gs, p'bs]+ then return Nothing+ else do+ rs <- map fromC `fmap` peekArray n p'rs+ gs <- map fromC `fmap` peekArray n p'gs+ bs <- map fromC `fmap` peekArray n p'bs+ return $ Just GammaRamp+ { gammaRampRed = rs+ , gammaRampGreen = gs+ , gammaRampBlue = bs+ }++-- | Assigns a gamma ramp to use with the given monitor.+-- See <http://www.glfw.org/docs/3.3/group__monitor.html#ga583f0ffd0d29613d8cd172b996bbf0dd glfwSetGammaRamp>+setGammaRamp :: Monitor -> GammaRamp -> IO ()+setGammaRamp mon gr =+ let rs = map toC $ gammaRampRed gr :: [CUShort]+ gs = map toC $ gammaRampGreen gr :: [CUShort]+ bs = map toC $ gammaRampBlue gr :: [CUShort]+ -- GammaRamp's smart constructor ensures that the RGB lists all have+ -- equal length, so just use the number of reds.+ cn = toC $ length rs :: CUInt+ in alloca $ \p'ggr ->+ withArray rs $ \p'rs ->+ withArray gs $ \p'gs ->+ withArray bs $ \p'bs -> do+ let ggr = C'GLFWgammaramp+ { c'GLFWgammaramp'red = p'rs+ , c'GLFWgammaramp'green = p'gs+ , c'GLFWgammaramp'blue = p'bs+ , c'GLFWgammaramp'size = cn+ }+ poke p'ggr ggr+ c'glfwSetGammaRamp (toC mon) p'ggr++-- | This function retrieves the content scale for the specified monitor. The+-- content scale is the ratio between the current DPI and the platform's default+-- DPI.+-- See <https://www.glfw.org/docs/3.3/group__monitor.html#gad3152e84465fa620b601265ebfcdb21b glfwGetMonitorContentScale>+getMonitorContentScale :: Monitor -> IO (Float, Float)+getMonitorContentScale mon =+ alloca $ \p'x ->+ alloca $ \p'y -> do+ c'glfwGetMonitorContentScale (toC mon) p'x p'y+ CFloat x <- peek p'x+ CFloat y <- peek p'y+ return (x, y)++-- | This function returns the position, in screen coordinates, of the+-- upper-left corner of the work area of the specified monitor along with the+-- work area size in screen coordinates. Returned tuple is:+-- (xPos, yPos, width, height)+-- See <https://www.glfw.org/docs/3.3/group__monitor.html#ga7387a3bdb64bfe8ebf2b9e54f5b6c9d0 glfwGetMonitorWorkarea>+getMonitorWorkarea :: Monitor -> IO (Int, Int, Int, Int)+getMonitorWorkarea mon =+ alloca $ \p'x ->+ alloca $ \p'y ->+ alloca $ \p'w ->+ alloca $ \p'h -> do+ c'glfwGetMonitorWorkarea (toC mon) p'x p'y p'w p'h+ x <- fromC <$> peek p'x+ y <- fromC <$> peek p'y+ w <- fromC <$> peek p'w+ h <- fromC <$> peek p'h+ return (x, y, w, h)++--------------------------------------------------------------------------------+-- Window handling++-- | Sets all the window hints to default.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gaa77c4898dfb83344a6b4f76aa16b9a4a glfwDefaultWindowHints>+defaultWindowHints :: IO ()+defaultWindowHints =+ c'glfwDefaultWindowHints++setStringHint :: CInt -> String -> IO ()+setStringHint hint = flip withCString (c'glfwWindowHintString hint)++-- | Hints something to the GLFW windowing system.+-- See+-- <http://www.glfw.org/docs/3.3/group__window.html#ga7d9c8c62384b1e2821c4dc48952d2033 glfwWindowHint>+-- and+-- <https://www.glfw.org/docs/3.3/group__window.html#ga8cb2782861c9d997bcf2dea97f363e5f glfwWindowHintString>+windowHint :: WindowHint -> IO ()+windowHint (WindowHint'Resizable x) =+ c'glfwWindowHint c'GLFW_RESIZABLE (toC x)+windowHint (WindowHint'Visible x) =+ c'glfwWindowHint c'GLFW_VISIBLE (toC x)+windowHint (WindowHint'Decorated x) =+ c'glfwWindowHint c'GLFW_DECORATED (toC x)+windowHint (WindowHint'RedBits x) =+ c'glfwWindowHint c'GLFW_RED_BITS (toC x)+windowHint (WindowHint'GreenBits x) =+ c'glfwWindowHint c'GLFW_GREEN_BITS (toC x)+windowHint (WindowHint'BlueBits x) =+ c'glfwWindowHint c'GLFW_BLUE_BITS (toC x)+windowHint (WindowHint'AlphaBits x) =+ c'glfwWindowHint c'GLFW_ALPHA_BITS (toC x)+windowHint (WindowHint'DepthBits x) =+ c'glfwWindowHint c'GLFW_DEPTH_BITS (toC x)+windowHint (WindowHint'StencilBits x) =+ c'glfwWindowHint c'GLFW_STENCIL_BITS (toC x)+windowHint (WindowHint'AccumRedBits x) =+ c'glfwWindowHint c'GLFW_ACCUM_RED_BITS (toC x)+windowHint (WindowHint'AccumGreenBits x) =+ c'glfwWindowHint c'GLFW_ACCUM_GREEN_BITS (toC x)+windowHint (WindowHint'AccumBlueBits x) =+ c'glfwWindowHint c'GLFW_ACCUM_BLUE_BITS (toC x)+windowHint (WindowHint'AccumAlphaBits x) =+ c'glfwWindowHint c'GLFW_ACCUM_ALPHA_BITS (toC x)+windowHint (WindowHint'AuxBuffers x) =+ c'glfwWindowHint c'GLFW_AUX_BUFFERS (toC x)+windowHint (WindowHint'Samples x) =+ c'glfwWindowHint c'GLFW_SAMPLES (toC x)+windowHint (WindowHint'RefreshRate x) =+ c'glfwWindowHint c'GLFW_REFRESH_RATE (toC x)+windowHint (WindowHint'DoubleBuffer x) =+ c'glfwWindowHint c'GLFW_DOUBLEBUFFER (toC x)+windowHint (WindowHint'Stereo x) =+ c'glfwWindowHint c'GLFW_STEREO (toC x)+windowHint (WindowHint'sRGBCapable x) =+ c'glfwWindowHint c'GLFW_SRGB_CAPABLE (toC x)+windowHint (WindowHint'Floating x) =+ c'glfwWindowHint c'GLFW_FLOATING (toC x)+windowHint (WindowHint'Focused x) =+ c'glfwWindowHint c'GLFW_FOCUSED (toC x)+windowHint (WindowHint'Maximized x) =+ c'glfwWindowHint c'GLFW_MAXIMIZED (toC x)+windowHint (WindowHint'AutoIconify x) =+ c'glfwWindowHint c'GLFW_AUTO_ICONIFY (toC x)+windowHint (WindowHint'ClientAPI x) =+ c'glfwWindowHint c'GLFW_CLIENT_API (toC x)+windowHint (WindowHint'ContextCreationAPI x) =+ c'glfwWindowHint c'GLFW_CONTEXT_CREATION_API (toC x)+windowHint (WindowHint'ContextVersionMajor x) =+ c'glfwWindowHint c'GLFW_CONTEXT_VERSION_MAJOR (toC x)+windowHint (WindowHint'ContextVersionMinor x) =+ c'glfwWindowHint c'GLFW_CONTEXT_VERSION_MINOR (toC x)+windowHint (WindowHint'ContextRobustness x) =+ c'glfwWindowHint c'GLFW_CONTEXT_ROBUSTNESS (toC x)+windowHint (WindowHint'ContextReleaseBehavior x) =+ c'glfwWindowHint c'GLFW_CONTEXT_RELEASE_BEHAVIOR (toC x)+windowHint (WindowHint'ContextNoError x) =+ c'glfwWindowHint c'GLFW_CONTEXT_NO_ERROR (toC x)+windowHint (WindowHint'OpenGLForwardCompat x) =+ c'glfwWindowHint c'GLFW_OPENGL_FORWARD_COMPAT (toC x)+windowHint (WindowHint'OpenGLDebugContext x) =+ c'glfwWindowHint c'GLFW_OPENGL_DEBUG_CONTEXT (toC x)+windowHint (WindowHint'OpenGLProfile x) =+ c'glfwWindowHint c'GLFW_OPENGL_PROFILE (toC x)+windowHint (WindowHint'TransparentFramebuffer x) =+ c'glfwWindowHint c'GLFW_TRANSPARENT_FRAMEBUFFER (toC x)+windowHint (WindowHint'CenterCursor x) =+ c'glfwWindowHint c'GLFW_CENTER_CURSOR (toC x)+windowHint (WindowHint'FocusOnShow x) =+ c'glfwWindowHint c'GLFW_FOCUS_ON_SHOW (toC x)+windowHint (WindowHint'ScaleToMonitor x) =+ c'glfwWindowHint c'GLFW_SCALE_TO_MONITOR (toC x)+windowHint (WindowHint'CocoaRetinaFramebuffer x) =+ c'glfwWindowHint c'GLFW_COCOA_RETINA_FRAMEBUFFER (toC x)+windowHint (WindowHint'CocoaGraphicsSwitching x) =+ c'glfwWindowHint c'GLFW_COCOA_GRAPHICS_SWITCHING (toC x)+windowHint (WindowHint'CocoaFrameName x) = setStringHint c'GLFW_COCOA_FRAME_NAME x+windowHint (WindowHint'X11ClassName x) = setStringHint c'GLFW_X11_CLASS_NAME x+windowHint (WindowHint'X11InstanceName x) = setStringHint c'GLFW_X11_INSTANCE_NAME x++-- | Creates a new window.+-- Note: If running in GHCI don't forget to @:set -fno-ghci-sandbox@ or you+-- may run into an assertion failure, segfault or other nasty crash.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga5c336fddf2cbb5b92f65f10fb6043344 glfwCreateWindow>+createWindow :: Int -- ^ Desired width for the window.+ -> Int -- ^ Desired height for the window.+ -> String -- ^ Desired title for the window.+ -> Maybe Monitor -- ^ Monitor to use in fullscreen mode.+ -> Maybe Window -- ^ Window for context object sharing, see+ -- <http://www.glfw.org/docs/3.3/context.html#context_sharing here>.+ -> IO (Maybe Window)+createWindow w h title mmon mwin =+ withCString title $ \ptitle -> do+ charFun <- newIORef nullFunPtr+ charModsFun <- newIORef nullFunPtr+ cursorEnterFun <- newIORef nullFunPtr+ cursorPosFun <- newIORef nullFunPtr+ framebufferSizeFun <- newIORef nullFunPtr+ keyFun <- newIORef nullFunPtr+ mouseButtonFun <- newIORef nullFunPtr+ scrollFun <- newIORef nullFunPtr+ windowCloseFun <- newIORef nullFunPtr+ windowFocusFun <- newIORef nullFunPtr+ windowIconifyFun <- newIORef nullFunPtr+ windowPosFun <- newIORef nullFunPtr+ windowRefreshFun <- newIORef nullFunPtr+ windowSizeFun <- newIORef nullFunPtr+ windowContentScaleFun <- newIORef nullFunPtr+ windowMaximizeFun <- newIORef nullFunPtr+ dropFun <- newIORef nullFunPtr+ let callbacks = WindowCallbacks+ { storedCharFun = charFun+ , storedCharModsFun = charModsFun+ , storedCursorEnterFun = cursorEnterFun+ , storedCursorPosFun = cursorPosFun+ , storedFramebufferSizeFun = framebufferSizeFun+ , storedKeyFun = keyFun+ , storedMouseButtonFun = mouseButtonFun+ , storedScrollFun = scrollFun+ , storedWindowCloseFun = windowCloseFun+ , storedWindowFocusFun = windowFocusFun+ , storedWindowIconifyFun = windowIconifyFun+ , storedWindowPosFun = windowPosFun+ , storedWindowRefreshFun = windowRefreshFun+ , storedWindowSizeFun = windowSizeFun+ , storedWindowContentScaleFun = windowContentScaleFun+ , storedWindowMaximizeFun = windowMaximizeFun+ , storedDropFun = dropFun+ }+ p'win <- c'glfwCreateWindow+ (toC w)+ (toC h)+ ptitle+ (maybe nullPtr toC mmon)+ (maybe nullPtr toC mwin)+ if p'win == nullPtr+ then return Nothing+ else do callbackPtr <- newStablePtr callbacks+ c'glfwSetWindowUserPointer p'win (castStablePtrToPtr callbackPtr)+ -- Not sure why this isn't the default...+ c'glfwSetInputMode p'win c'GLFW_LOCK_KEY_MODS (toC True)+ return $ Just $ fromC p'win++-- | Cleans up a window and all associated resources+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacdf43e51376051d2c091662e9fe3d7b2 glfwDestroyWindow>.+-- This function is not <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+destroyWindow :: Window -> IO ()+destroyWindow win = do+ pcb <- castPtrToStablePtr `liftM` c'glfwGetWindowUserPointer (toC win)+ cbs <- deRefStablePtr pcb+ c'glfwDestroyWindow (toC win)++ let free callback = do funptr <- readIORef (callback cbs)+ when (funptr /= nullFunPtr) $ freeHaskellFunPtr funptr+ free storedCharFun+ free storedCharModsFun+ free storedCursorEnterFun+ free storedCursorPosFun+ free storedFramebufferSizeFun+ free storedKeyFun+ free storedMouseButtonFun+ free storedScrollFun+ free storedWindowCloseFun+ free storedWindowFocusFun+ free storedWindowIconifyFun+ free storedWindowPosFun+ free storedWindowRefreshFun+ free storedWindowSizeFun+ freeStablePtr pcb++-- | Returns the value of an attribute of the specified window or its OpenGL or+-- OpenGL ES context.+-- See <https://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowAttrib :: Window -> WindowAttrib -> IO Bool+getWindowAttrib win attrib =+ fromC <$> c'glfwGetWindowAttrib (toC win) (toC attrib)++-- | Sets the value of an attribute of the specified window.+-- See <https://www.glfw.org/docs/3.3/group__window.html#gace2afda29b4116ec012e410a6819033e glfwSetWindowAttrib>+setWindowAttrib :: Window -> WindowAttrib -> Bool -> IO ()+setWindowAttrib win attrib = c'glfwSetWindowAttrib (toC win) (toC attrib) . toC++-- | If the window should close or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga24e02fbfefbb81fc45320989f8140ab5 glfwWindowShouldClose>+windowShouldClose :: Window -> IO Bool+windowShouldClose win =+ fromC `fmap` c'glfwWindowShouldClose (toC win)++-- | Sets if the window should close or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga49c449dde2a6f87d996f4daaa09d6708 glfwSetWindowShouldClose>+setWindowShouldClose :: Window -> Bool -> IO ()+setWindowShouldClose win b =+ c'glfwSetWindowShouldClose (toC win) (toC b)++-- | Returns the opacity of the window, including any decorations.+-- See <https://www.glfw.org/docs/3.3/group__window.html#gad09f0bd7a6307c4533b7061828480a84 glfwGetWindowOpacity+getWindowOpacity :: Window -> IO Float+getWindowOpacity = fmap hFloat . c'glfwGetWindowOpacity . toC++-- | Sets the opacity of the window, including any decorations+-- See <https://www.glfw.org/docs/3.3/group__window.html#gac31caeb3d1088831b13d2c8a156802e9 glfwSetWindowOpacity>+setWindowOpacity :: Window -> Float -> IO ()+setWindowOpacity win op = c'glfwSetWindowOpacity (toC win) (CFloat op)++-- | Sets the Title string of the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga5d877f09e968cef7a360b513306f17ff glfwSetWindowTitle>+setWindowTitle :: Window -> String -> IO ()+setWindowTitle win title =+ withCString title $ c'glfwSetWindowTitle (toC win)++-- | Gets the window's position (in screen coordinates).+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga73cb526c000876fd8ddf571570fdb634 glfwGetWindowPos>+getWindowPos :: Window -> IO (Int, Int)+getWindowPos win =+ allocaArray 2 $ \p -> do+ let p'x = p+ p'y = p `advancePtr` 1+ c'glfwGetWindowPos (toC win) p'x p'y+ x <- fromC `fmap` peek p'x+ y <- fromC `fmap` peek p'y+ return (x, y)++-- | Sets the window's position (in screen coordinates).+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga1abb6d690e8c88e0c8cd1751356dbca8 glfwSetWindowPos>+setWindowPos :: Window -> Int -> Int -> IO ()+setWindowPos win x y =+ c'glfwSetWindowPos (toC win) (toC x) (toC y)++-- | Gets the size of the window (in screen coordinates).+-- See <http://www.glfw.org/docs/3.3/group__window.html#gaeea7cbc03373a41fb51cfbf9f2a5d4c6 glfwGetWindowSize>+getWindowSize :: Window -> IO (Int, Int)+getWindowSize win =+ allocaArray 2 $ \p -> do+ let p'w = p+ p'h = p `advancePtr` 1+ c'glfwGetWindowSize (toC win) p'w p'h+ w <- fromC `fmap` peek p'w+ h <- fromC `fmap` peek p'h+ return (w, h)++-- | Gets the size of the frame around the window (in screen coordinates). This+-- size includes the title bar, if the window has one. Not to be confused with+-- 'getFramebufferSize', which gets the size of the rendering area.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga1a9fd382058c53101b21cf211898f1f1 glfwGetWindowFrameSize>+getWindowFrameSize :: Window -> IO (Int, Int, Int, Int)+getWindowFrameSize win =+ allocaArray 4 $ \p -> do+ let p'l = p+ p't = p `advancePtr` 1+ p'r = p `advancePtr` 2+ p'b = p `advancePtr` 3+ c'glfwGetWindowFrameSize (toC win) p'l p't p'r p'b+ l <- fromC `fmap` peek p'l+ t <- fromC `fmap` peek p't+ r <- fromC `fmap` peek p'r+ b <- fromC `fmap` peek p'b+ return (l, t, r, b)++-- | Sets the size of the client area for the window (in screen coordinates).+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga371911f12c74c504dd8d47d832d095cb glfwSetWindowSize>+setWindowSize :: Window -> Int -> Int -> IO ()+setWindowSize win w h =+ c'glfwSetWindowSize (toC win) (toC w) (toC h)++-- | Sets the size limits of the client area of the specified window. If the+-- window is full screen, the size limits only take effect once it is made+-- windowed. If the window is not resizable this function does nothing. Pass+-- 'Nothing' in any argument to disable the limit.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gac314fa6cec7d2d307be9963e2709cc90 glfwSetWindowSizeLimits>+setWindowSizeLimits :: Window+ -> Maybe Int+ -- ^ The minimum width, in screen coordinates, of the client+ -- area.+ -> Maybe Int+ -- ^ The minimum height, in screen coordinates, of the+ -- client area.+ -> Maybe Int+ -- ^ The maximum width, in screen coordinates, of the client+ -- area.+ -> Maybe Int+ -- ^ The maximum height, in screen coordinates, of the+ -- client area.+ -> IO ()+setWindowSizeLimits win min'w min'h max'w max'h =+ c'glfwSetWindowSizeLimits (toC win) (toC min'w) (toC min'h)+ (toC max'w) (toC max'h)++-- | Sets the required aspect ratio of the client area of the specified window.+-- Pass Nothing to disable the limit.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga72ac8cb1ee2e312a878b55153d81b937 glfwSetWindowAspectRatio>+setWindowAspectRatio :: Window -> Maybe (Int, Int) -> IO ()+setWindowAspectRatio win Nothing =+ c'glfwSetWindowAspectRatio (toC win) c'GLFW_DONT_CARE c'GLFW_DONT_CARE+setWindowAspectRatio win (Just (w, h)) =+ c'glfwSetWindowAspectRatio (toC win) (toC w) (toC h)++-- | This function retrieves the content scale for the specified window. The+-- content scale is the ratio between the current DPI and the platform's+-- default DPI.+-- See <https://www.glfw.org/docs/3.3/group__window.html#gaf5d31de9c19c4f994facea64d2b3106c glfwGetWindowContentScale>+getWindowContentScale :: Window -> IO (Float, Float)+getWindowContentScale win =+ alloca $ \p'x ->+ alloca $ \p'y -> do+ c'glfwGetWindowContentScale (toC win) p'x p'y+ CFloat x <- peek p'x+ CFloat y <- peek p'y+ return (x, y)++-- | The size of the framebuffer (in Pixels)+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga0e2637a4161afb283f5300c7f94785c9 glfwGetFramebufferSize>+getFramebufferSize :: Window -> IO (Int, Int)+getFramebufferSize win =+ allocaArray 2 $ \p -> do+ let p'w = p+ p'h = p `advancePtr` 1+ c'glfwGetFramebufferSize (toC win) p'w p'h+ w <- fromC `fmap` peek p'w+ h <- fromC `fmap` peek p'h+ return (w, h)++-- | Sets the icon of the specified window. The system will try to find the+-- image with the dimensions closest to the ones required by the platform. This+-- image is then scaled and used as the icon for that size. Good sizes are+-- 16x16, 32x32, and 48x48. Pass the empty list to reset to the default icon.+-- Has no effect on OS X (See the <https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html Bundle Programming Guide>)+setWindowIcon :: Window -> [Image] -> IO ()+setWindowIcon win [] = c'glfwSetWindowIcon (toC win) 0 nullPtr+setWindowIcon win imgs =+ let arrSizeBytes = length imgs * sizeOf (undefined :: C'GLFWimage)++ addNextImage :: [Image] -> Int -> Ptr C'GLFWimage -> IO ()+ addNextImage [] numImages ptr =+ c'glfwSetWindowIcon (toC win) (toC numImages) ptr++ addNextImage (img:rest) idx ptr =+ withGLFWImage img $ \p'img -> do+ c'img <- peek p'img+ pokeElemOff ptr idx c'img+ addNextImage rest (idx + 1) ptr+ in allocaBytes arrSizeBytes $ addNextImage imgs 0++-- | Iconifies (minimizes) the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga1bb559c0ebaad63c5c05ad2a066779c4 glfwIconifyWindow>+iconifyWindow :: Window -> IO ()+iconifyWindow = c'glfwIconifyWindow . toC++-- | Restores the window from an iconified/minimized state.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga52527a5904b47d802b6b4bb519cdebc7 glfwRestoreWindow>+restoreWindow :: Window -> IO ()+restoreWindow = c'glfwRestoreWindow . toC++-- | Brings the specified window to front and sets input focus. The window+-- should already be visible and not iconified.+-- See <http://www.glfw.org/docs/latest/group__window.html#ga873780357abd3f3a081d71a40aae45a1 glfwFocusWindow>+focusWindow :: Window -> IO ()+focusWindow = c'glfwFocusWindow . toC++-- | Maximizes the specified window if it was not already maximized.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga3f541387449d911274324ae7f17ec56b glfwMaximizeWindow>+maximizeWindow :: Window -> IO ()+maximizeWindow = c'glfwMaximizeWindow . toC++-- | Shows the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga61be47917b72536a148300f46494fc66 glfwShowWindow>+showWindow :: Window -> IO ()+showWindow = c'glfwShowWindow . toC++-- | Hides the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga49401f82a1ba5f15db5590728314d47c glfwHideWindow>+hideWindow :: Window -> IO ()+hideWindow = c'glfwHideWindow . toC++-- | Requests user attention to the specified window.+-- See <https://www.glfw.org/docs/3.3/group__window.html#ga2f8d59323fc4692c1d54ba08c863a703 glfwRequestWindowAttention>+requestWindowAttention :: Window -> IO ()+requestWindowAttention = c'glfwRequestWindowAttention . toC++-- | Gets the monitor that this window is running on, provided the window is+-- fullscreen.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gaeac25e64789974ccbe0811766bd91a16 glfwGetWindowMonitor>+getWindowMonitor :: Window -> IO (Maybe Monitor)+getWindowMonitor win = do+ p'mon <- c'glfwGetWindowMonitor (toC win)+ return $ if p'mon == nullPtr+ then Nothing+ else Just $ fromC p'mon++-- | Sets the position of the cursor within the window.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga04b03af936d906ca123c8f4ee08b39e7 glfwSetCursorPos>+setCursorPos :: Window -> Double -> Double -> IO ()+setCursorPos win x y =+ c'glfwSetCursorPos (toC win) (toC x) (toC y)++-- | Makes a window fullscreen on the given monitor. The number of red, green,+-- and blue bits is ignored. Note, this shouldn't be used to update the+-- resolution of a fullscreen window. Use 'setWindowSize' instead.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga81c76c418af80a1cce7055bccb0ae0a7 glfwSetWindowMonitor>+setFullscreen :: Window -> Monitor -> VideoMode -> IO ()+setFullscreen win mon (VideoMode width height _ _ _ refresh) =+ c'glfwSetWindowMonitor (toC win) (toC mon) 0 0 (toC width) (toC height) (toC refresh)++-- | Updates a window to be windowed instead of fullscreen. Note, this shouldn't+-- be used to update the position or size of a window. Use 'setWindowPos' and+-- 'setWindowSize' instead.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga81c76c418af80a1cce7055bccb0ae0a7 glfwSetWindowMonitor>+setWindowed :: Window+ -> Int -- ^ The width of the client area+ -> Int -- ^ The height of the client area+ -> Int -- ^ The x position of the window+ -> Int -- ^ The y position of the window+ -> IO ()+setWindowed win width height x y =+ c'glfwSetWindowMonitor (toC win) nullPtr (toC x) (toC y) (toC width) (toC height) 0++-- start of functions related to c'glfwGetWindowAttrib++-- | If the window has focus or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowFocused :: Window -> IO Bool+getWindowFocused win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_FOCUSED++-- | If the window is maximized or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowMaximized :: Window -> IO Bool+getWindowMaximized win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_MAXIMIZED++-- | If the window has been set to be 'always on top' or not.+-- See <http://www.glfw.org/docs/latest/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowFloating :: Window -> IO Bool+getWindowFloating win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_FLOATING++-- | If the window is iconified (minimized) or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowIconified :: Window -> IO Bool+getWindowIconified win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_ICONIFIED++-- | If the window is resizable or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowResizable :: Window -> IO Bool+getWindowResizable win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_RESIZABLE++-- | If the window is decorated or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowDecorated :: Window -> IO Bool+getWindowDecorated win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_DECORATED++-- | If the window is visible or not.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowVisible :: Window -> IO Bool+getWindowVisible win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_VISIBLE++-- | The client api for this window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowClientAPI :: Window -> IO ClientAPI+getWindowClientAPI win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CLIENT_API++-- | Returns the context creation API used to create the specified window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextCreationAPI :: Window -> IO ContextCreationAPI+getWindowContextCreationAPI win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_CREATION_API++-- | The context's "major" version, x.0.0+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextVersionMajor :: Window -> IO Int+getWindowContextVersionMajor win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_VERSION_MAJOR++-- | The context's "minor" version, 0.y.0+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextVersionMinor :: Window -> IO Int+getWindowContextVersionMinor win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_VERSION_MINOR++-- | The context's "revision" version, 0.0.z+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextVersionRevision :: Window -> IO Int+getWindowContextVersionRevision win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_REVISION++-- | The context robustness of this window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextRobustness :: Window -> IO ContextRobustness+getWindowContextRobustness win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_ROBUSTNESS++-- | Returns the context release behavior.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowContextReleaseBehavior :: Window -> IO ContextReleaseBehavior+getWindowContextReleaseBehavior win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_RELEASE_BEHAVIOR++-- | Returns true if the window is set to NO_ERROR (see the+-- <https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_no_error.txt KHR_no_error>+-- extension.+getWindowContextNoError :: Window -> IO Bool+getWindowContextNoError win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_CONTEXT_NO_ERROR++-- | If this window is set for opengl to be forward compatible.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowOpenGLForwardCompat :: Window -> IO Bool+getWindowOpenGLForwardCompat win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_OPENGL_FORWARD_COMPAT++-- | If the window has an opengl debug context+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowOpenGLDebugContext :: Window -> IO Bool+getWindowOpenGLDebugContext win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_OPENGL_DEBUG_CONTEXT++-- | Obtains the current opengl profile.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gacccb29947ea4b16860ebef42c2cb9337 glfwGetWindowAttrib>+getWindowOpenGLProfile :: Window -> IO OpenGLProfile+getWindowOpenGLProfile win =+ fromC `fmap` c'glfwGetWindowAttrib (toC win) c'GLFW_OPENGL_PROFILE++-- end of functions related to c'glfwGetWindowAttrib++-- | Sets the callback to use when the window position changes.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga2837d4d240659feb4268fcb6530a6ba1 glfwSetWindowPosCallback>+setWindowPosCallback :: Window -> Maybe WindowPosCallback -> IO ()+setWindowPosCallback win = setWindowCallback+ mk'GLFWwindowposfun+ (\cb a0 a1 a2 ->+ schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetWindowPosCallback (toC win))+ storedWindowPosFun+ win++-- | Sets the callback to use when the window's size changes.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gaa40cd24840daa8c62f36cafc847c72b6 glfwSetWindowSizeCallback>+setWindowSizeCallback :: Window -> Maybe WindowSizeCallback -> IO ()+setWindowSizeCallback win = setWindowCallback+ mk'GLFWwindowsizefun+ (\cb a0 a1 a2 ->+ schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetWindowSizeCallback (toC win))+ storedWindowSizeFun+ win++-- | Sets the callback to use when the user attempts to close the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#gaade9264e79fae52bdb78e2df11ee8d6a glfwSetWindowCloseCallback>+setWindowCloseCallback :: Window -> Maybe WindowCloseCallback -> IO ()+setWindowCloseCallback win = setWindowCallback+ mk'GLFWwindowclosefun+ (. fromC)+ (c'glfwSetWindowCloseCallback (toC win))+ storedWindowCloseFun+ win++-- | Sets the callback to use when the window's data is partly dead and it should refresh.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga4569b76e8ac87c55b53199e6becd97eb glfwSetWindowRefreshCallback>+setWindowRefreshCallback :: Window -> Maybe WindowRefreshCallback -> IO ()+setWindowRefreshCallback win = setWindowCallback+ mk'GLFWwindowrefreshfun+ (. fromC)+ (c'glfwSetWindowRefreshCallback (toC win))+ storedWindowRefreshFun+ win++-- | Sets the callback to use when the window gains or loses focus.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga25d1c584edb375d7711c5c3548ba711f glfwSetWindowFocusCallback>+setWindowFocusCallback :: Window -> Maybe WindowFocusCallback -> IO ()+setWindowFocusCallback win = setWindowCallback+ mk'GLFWwindowfocusfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ (c'glfwSetWindowFocusCallback (toC win))+ storedWindowFocusFun+ win++-- | Sets the callback to use when the window is iconified or not (aka, minimized or not).+-- See <http://www.glfw.org/docs/3.3/group__window.html#gab1ea7263081c0e073b8d5b91d6ffd367 glfwSetWindowIconifyCallback>+setWindowIconifyCallback :: Window -> Maybe WindowIconifyCallback -> IO ()+setWindowIconifyCallback win = setWindowCallback+ mk'GLFWwindowiconifyfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ (c'glfwSetWindowIconifyCallback (toC win))+ storedWindowIconifyFun+ win++-- | Sets the callback for when the content scale of the window changes.+-- See <https://www.glfw.org/docs/3.3/window_guide.html#window_scale Window Content Scale>+setWindowContentScaleCallback :: Window -> Maybe WindowContentScaleCallback -> IO ()+setWindowContentScaleCallback win = setWindowCallback+ mk'GLFWwindowcontentscalefun+ (\cb w (CFloat f1) (CFloat f2) -> schedule $ cb (fromC w) f1 f2)+ (c'glfwSetWindowContentScaleCallback (toC win))+ storedWindowContentScaleFun+ win++-- | Sets the maximization callback of the specified window, which is called+-- when the window is maximized or restored.+-- See <https://www.glfw.org/docs/3.3/window_guide.html#window_maximize Window maximization>+setWindowMaximizeCallback :: Window -> Maybe WindowMaximizeCallback -> IO ()+setWindowMaximizeCallback win = setWindowCallback+ mk'GLFWwindowmaximizefun+ (\cb w x -> schedule $ cb (fromC w) (fromC x))+ (c'glfwSetWindowMaximizeCallback (toC win))+ storedWindowMaximizeFun+ win++-- | Sets the callback to use when the framebuffer's size changes.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga3203461a5303bf289f2e05f854b2f7cf glfwSetFramebufferSizeCallback>+setFramebufferSizeCallback :: Window -> Maybe FramebufferSizeCallback -> IO ()+setFramebufferSizeCallback win = setWindowCallback+ mk'GLFWframebuffersizefun+ (\cb a0 a1 a2 -> schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetFramebufferSizeCallback (toC win))+ storedFramebufferSizeFun+ win++-- | Checks for any pending events, processes them, and then immediately returns.+-- This is most useful for continual rendering, such as games.+-- See the <http://www.glfw.org/docs/3.3/input.html#events Event Processing Guide>. This+-- function is not <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+pollEvents :: IO ()+pollEvents = c'glfwPollEvents >> executeScheduled++-- | Waits until at least one event is in the queue then processes the queue and returns.+-- Requires at least one window to be active for it to sleep. This saves a lot of CPU, and+-- is better if you're doing only periodic rendering, such as with an editor program.+-- See the <http://www.glfw.org/docs/3.3/input.html#events Event Processing Guide>. This+-- function is not <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+waitEvents :: IO ()+waitEvents = c'glfwWaitEvents >> executeScheduled++-- | Same as 'waitEvents', with a timeout after which the function returns.+-- See the <http://www.glfw.org/docs/3.3/input.html#events Event Processing Guide>. This+-- function is not <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+waitEventsTimeout :: Double -> IO ()+waitEventsTimeout seconds =+ c'glfwWaitEventsTimeout (toC seconds) >> executeScheduled++-- | Creates an empty event within the event queue. Can be called from any+-- thread, so you can use this to wake up the main thread that's using+-- 'waitEvents' from a secondary thread.+-- See the <http://www.glfw.org/docs/3.3/input.html#events Event Processing Guide>+postEmptyEvent :: IO ()+postEmptyEvent = c'glfwPostEmptyEvent++--------------------------------------------------------------------------------+-- Input handling++-- start of glfw{GS}etInputMode-related functions++-- | Gets the current cursor input mode.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+getCursorInputMode :: Window -> IO CursorInputMode+getCursorInputMode win =+ fromC `fmap` c'glfwGetInputMode (toC win) c'GLFW_CURSOR++-- | Set the cursor input mode.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+setCursorInputMode :: Window -> CursorInputMode -> IO ()+setCursorInputMode win c =+ c'glfwSetInputMode (toC win) c'GLFW_CURSOR (toC c)++-- | Sets the cursor to receive raw input, if available (See+-- rawMouseMotionSupported and+-- <https://www.glfw.org/docs/3.3/input_guide.html#raw_mouse_motion Raw Mouse Motion>+setRawMouseMotion :: Window -> Bool -> IO ()+setRawMouseMotion win toggle = do+ supported <- rawMouseMotionSupported+ if not supported+ then putStrLn "WARNING -- Asked to set raw mouse motion but is unsupported"+ else c'glfwSetInputMode (toC win) c'GLFW_RAW_MOUSE_MOTION (toC toggle)++-- | Returns whether or not we've currently enabled raw mouse motion.+-- See <https://www.glfw.org/docs/3.3/input_guide.html#raw_mouse_motion Raw Mouse Motion>+getRawMouseMotion :: Window -> IO Bool+getRawMouseMotion win =+ fromC <$> c'glfwGetInputMode (toC win) c'GLFW_RAW_MOUSE_MOTION++-- | Gets the current sticky keys mode.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+getStickyKeysInputMode :: Window -> IO StickyKeysInputMode+getStickyKeysInputMode win =+ fromC `fmap` c'glfwGetInputMode (toC win) c'GLFW_STICKY_KEYS++-- | Sets if sticky keys should be used or not.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+setStickyKeysInputMode :: Window -> StickyKeysInputMode -> IO ()+setStickyKeysInputMode win sk =+ c'glfwSetInputMode (toC win) c'GLFW_STICKY_KEYS (toC sk)++-- | Gets if sticky mouse buttons are on or not.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+getStickyMouseButtonsInputMode :: Window -> IO StickyMouseButtonsInputMode+getStickyMouseButtonsInputMode win =+ fromC `fmap` c'glfwGetInputMode (toC win) c'GLFW_STICKY_MOUSE_BUTTONS++-- | Sets if sticky mouse buttons should be used or not.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa92336e173da9c8834558b54ee80563b glfwSetInputMode>+setStickyMouseButtonsInputMode :: Window -> StickyMouseButtonsInputMode -> IO ()+setStickyMouseButtonsInputMode win smb =+ c'glfwSetInputMode (toC win) c'GLFW_STICKY_MOUSE_BUTTONS (toC smb)++-- end of glfw{GS}etInputMode-related functions++-- | Gets the state of the specified key. If Stickey Keys isn't enabled then it's possible for+-- keyboard polling to miss individual key presses. Use the callback to avoid this.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gadd341da06bc8d418b4dc3a3518af9ad2 glfwGetKey>+getKey :: Window -> Key -> IO KeyState+getKey win k =+ fromC `fmap` c'glfwGetKey (toC win) (toC k)++-- | Returns the localized name of the specified printable key. This is intended+-- for displaying key bindings to the user. The scancode is used if the provided+-- 'Key' isn't printable. If the scancode maps to a non-printable key as well,+-- then 'Nothing' is returned.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga237a182e5ec0b21ce64543f3b5e7e2be glfwGetKeyName>+getKeyName :: Key -> Int -> IO (Maybe String)+getKeyName k scancode = do+ cstr <- c'glfwGetKeyName (toC k) (toC scancode)+ if cstr == nullPtr+ then return Nothing+ else Just `fmap` peekCString cstr++-- | This function returns the platform-specific scancode of the specified key.+-- See <https://www.glfw.org/docs/3.3/group__input.html#ga67ddd1b7dcbbaff03e4a76c0ea67103a glfwGetKeyScancode>+getKeyScancode :: Key -> IO Int+getKeyScancode = fmap fromC . c'glfwGetKeyScancode . toC++-- | Gets the state of a single specified mouse button. If sticky mouse button+-- mode isn't enabled it's possible for mouse polling to miss individual mouse events. Use+-- the call back to avoid this.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gac1473feacb5996c01a7a5a33b5066704 glfwGetMouseButton>+getMouseButton :: Window -> MouseButton -> IO MouseButtonState+getMouseButton win b =+ fromC `fmap` c'glfwGetMouseButton (toC win) (toC b)++-- | Returns the position, in screen coodinates, relative to the upper left.+-- If the 'CursorInputMode' is "disabled", then results are unbounded by the window size.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga01d37b6c40133676b9cea60ca1d7c0cc glfwGetCursorPos>+getCursorPos :: Window -> IO (Double, Double)+getCursorPos win =+ allocaArray 2 $ \p -> do+ let p'x = p+ p'y = p `advancePtr` 1+ c'glfwGetCursorPos (toC win) p'x p'y+ x <- fromC `fmap` peek p'x+ y <- fromC `fmap` peek p'y+ return (x, y)++-- | Assigns the given callback to use for all keyboard presses and repeats.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga7e496507126f35ea72f01b2e6ef6d155 glfwSetKeyCallback>+setKeyCallback :: Window -> Maybe KeyCallback -> IO ()+setKeyCallback win = setWindowCallback+ mk'GLFWkeyfun+ (\cb a0 a1 a2 a3 a4 ->+ schedule $ cb (fromC a0) (fromC a1) (fromC a2) (fromC a3) (fromC a4))+ (c'glfwSetKeyCallback (toC win))+ storedKeyFun+ win++-- | Sets the callback to use when the user types a character+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga556239421c6a5a243c66fca28da9f742 glfwSetCharCallback>+setCharCallback :: Window -> Maybe CharCallback -> IO ()+setCharCallback win = setWindowCallback+ mk'GLFWcharfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ (c'glfwSetCharCallback (toC win))+ storedCharFun+ win++-- | Sets the callback to use with Unicode characters regardless of what+-- modifier keys are used.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga3f55ef5dc03a374e567f068b13c94afc glfwSetCharModsCallback>+setCharModsCallback :: Window -> Maybe CharModsCallback -> IO ()+setCharModsCallback win = setWindowCallback+ mk'GLFWcharmodsfun+ (\cb a0 a1 a2 -> schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetCharModsCallback (toC win))+ storedCharModsFun+ win++-- | Assigns the callback to run whenver a mouse button is clicked.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaef49b72d84d615bca0a6ed65485e035d glfwSetMouseButtonCallback>+setMouseButtonCallback :: Window -> Maybe MouseButtonCallback -> IO ()+setMouseButtonCallback win = setWindowCallback+ mk'GLFWmousebuttonfun+ (\cb a0 a1 a2 a3 -> schedule $ cb (fromC a0) (fromC a1) (fromC a2) (fromC a3))+ (c'glfwSetMouseButtonCallback (toC win))+ storedMouseButtonFun+ win++-- | Assigns the callback to run whenver the cursor position changes.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga7dad39486f2c7591af7fb25134a2501d glfwSetCursorPosCallback>+setCursorPosCallback :: Window -> Maybe CursorPosCallback -> IO ()+setCursorPosCallback win = setWindowCallback+ mk'GLFWcursorposfun+ (\cb a0 a1 a2 -> schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetCursorPosCallback (toC win))+ storedCursorPosFun+ win++-- | Sets the callback for when the cursor enters or leaves the client area.+-- See <http://www.glfw.org/docs/3.3/input.html#cursor_enter Cursor Enter/Leave Events>+setCursorEnterCallback :: Window -> Maybe CursorEnterCallback -> IO ()+setCursorEnterCallback win = setWindowCallback+ mk'GLFWcursorenterfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ (c'glfwSetCursorEnterCallback (toC win))+ storedCursorEnterFun+ win++-- | Sets the callback to run when the user scrolls with the mouse wheel or a touch gesture.+-- See <http://www.glfw.org/docs/3.3/input.html#scrolling Scroll Input>+setScrollCallback :: Window -> Maybe ScrollCallback -> IO ()+setScrollCallback win = setWindowCallback+ mk'GLFWscrollfun+ (\cb a0 a1 a2 -> schedule $ cb (fromC a0) (fromC a1) (fromC a2))+ (c'glfwSetScrollCallback (toC win))+ storedScrollFun+ win++-- | Tests if the joystick is present at all+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaffcbd9ac8ee737fcdd25475123a3c790 glfwJoystickPresent>+joystickPresent :: Joystick -> IO Bool+joystickPresent = fmap fromC . c'glfwJoystickPresent . toC++-- | Returns the values of all axes of the specified joystick, normalized to between -1.0 and 1.0+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga6271d46a5901ec2c99601ccf4dd14731 glfwGetJoystickAxes>+getJoystickAxes :: Joystick -> IO (Maybe [Double])+getJoystickAxes js = alloca $ \p'n -> do+ p'axes <- c'glfwGetJoystickAxes (toC js) p'n+ n <- fromC <$> peek p'n+ if p'axes == nullPtr || n <= 0+ then return Nothing+ else (Just . map fromC) <$> peekArray n p'axes++-- | Returns a list of all joystick button states for the specified joystick.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gace54cd930dcd502e118fe4021384ce1b glfwGetJoystickButtons>+getJoystickButtons :: Joystick -> IO (Maybe [JoystickButtonState])+getJoystickButtons js = alloca $ \p'n -> do+ p'buttons <- c'glfwGetJoystickButtons (toC js) p'n+ n <- fromC <$> peek p'n+ if p'buttons == nullPtr || n <= 0+ then return Nothing+ else (Just . map fromC) <$> peekArray n p'buttons++-- | Returns a list of all hats of the specified joystick.+-- See <https://www.glfw.org/docs/3.3/group__input.html#ga2d8d0634bb81c180899aeb07477a67ea glfwGetJoystickHats>+getJoystickHats :: Joystick -> IO (Maybe [JoystickHatState])+getJoystickHats js = alloca $ \p'n -> do+ p'hats <- c'glfwGetJoystickHats (toC js) p'n+ n <- fromC <$> peek p'n+ if p'hats == nullPtr || n <= 0+ then return Nothing+ else (Just . map fromC) <$> peekArray n p'hats++-- | A human-readable name for a Joystick. Not guranteed to be unique.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gac8d7f6107e05cfd106cfba973ab51e19 glfwGetJoystickName>+getJoystickName :: Joystick -> IO (Maybe String)+getJoystickName js = do+ p'name <- c'glfwGetJoystickName (toC js)+ if p'name == nullPtr+ then return Nothing+ else Just <$> peekCString p'name++-- | Sets a callback for when a joystick is connected or disconnected.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gab1dc8379f1b82bb660a6b9c9fa06ca07 glfwSetJoystickCallback>+setJoystickCallback :: Maybe JoystickCallback -> IO ()+setJoystickCallback = setCallback+ mk'GLFWjoystickfun+ (\cb a0 a1 -> schedule $ cb (fromC a0) (fromC a1))+ c'glfwSetJoystickCallback+ storedJoystickFun++-- | Adds the specified SDL_GameControllerDB gamepad mappings.+-- See <https://www.glfw.org/docs/3.3/group__input.html#gaed5104612f2fa8e66aa6e846652ad00f glfwUpdateGamepadMappings>+updateGamepadMappings :: String -> IO Bool+updateGamepadMappings =+ flip withCString $ \s -> fromC <$> c'glfwUpdateGamepadMappings s++-- | This function returns whether the specified joystick is both present and+-- has a gamepad mapping.+-- See <https://www.glfw.org/docs/3.3/group__input.html#gad0f676860f329d80f7e47e9f06a96f00 glfwJoystickIsGamepad>+joystickIsGamepad :: Joystick -> IO Bool+joystickIsGamepad = fmap (== c'GLFW_TRUE) . c'glfwJoystickIsGamepad . toC++-- | This function returns the SDL compatible GUID of the specified joystick.+-- See <https://www.glfw.org/docs/3.3/group__input.html#gae168c2c0b8cf2a1cb67c6b3c00bdd543 glfwGetJoystickGUID>+getJoystickGUID :: Joystick -> IO (Maybe String)+getJoystickGUID js = do+ p'guid <- c'glfwGetJoystickGUID (toC js)+ if p'guid == nullPtr+ then return Nothing+ else Just <$> peekCString p'guid++-- | This function returns the human-readable name of the gamepad from the+-- gamepad mapping assigned to the specified joystick.+-- See <https://www.glfw.org/docs/3.3/group__input.html#ga5c71e3533b2d384db9317fcd7661b210 glfwGetGamepadName>+getGamepadName :: Joystick -> IO (Maybe String)+getGamepadName js = do+ p'name <- c'glfwGetGamepadName (toC js)+ if p'name == nullPtr+ then return Nothing+ else Just <$> peekCString p'name++-- | This function retrives the state of the specified joystick remapped to an+-- Xbox-like gamepad.+-- See <https://www.glfw.org/docs/3.3/group__input.html#gadccddea8bce6113fa459de379ddaf051 glfwGetGamepadState>+getGamepadState :: Joystick -> IO (Maybe GamepadState)+getGamepadState js = alloca $ \p'gps -> do+ hasGamepad <- fromC <$> c'glfwGetGamepadState (toC js) p'gps+ if hasGamepad+ then do+ gps <- peek p'gps+ return $ Just GamepadState+ { getButtonState = fromC . (c'GLFWgamepadstate'buttons gps !!)+ . (fromIntegral :: CInt -> Int)+ . toC+ , getAxisState = hFloat+ . (c'GLFWgamepadstate'axes gps !!)+ . (fromIntegral :: CInt -> Int)+ . toC+ }+ else return Nothing++--------------------------------------------------------------------------------+-- Time++-- | Returns the time (in seconds) of the GLFW timer.+-- This is the amount of time since GLFW was initialized, unless 'setTime' was used.+-- The exact resolution is system dependent.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaa6cf4e7a77158a3b8fd00328b1720a4a glfwGetTime>+getTime :: IO (Maybe Double)+getTime = do+ t <- fromC `fmap` c'glfwGetTime+ return $ if t == 0+ then Nothing+ else Just t++-- | Sets the GLFW timer to the specified value, which is measured in seconds, and must be positive.+-- The value must also be less than ~584 years in seconds (18446744073.0).+-- After this the timer begins to count upward at the normal rate.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaf59589ef6e8b8c8b5ad184b25afd4dc0 glfwSetTime>+setTime :: Double -> IO ()+setTime = c'glfwSetTime . toC++-- | Returns the current value of the raw timer, measured in 1 / frequency+-- seconds. The frequency can be queried using getTimerFrequency.+-- See <http://www.glfw.org/docs/3.3/input_guide.html#time Timer input>+getTimerValue :: IO Word64+getTimerValue = c'glfwGetTimerValue++-- | Returns the frequency, in Hz, of the raw timer.+-- See <http://www.glfw.org/docs/3.3/input_guide.html#time Timer input>+getTimerFrequency :: IO Word64+getTimerFrequency = c'glfwGetTimerFrequency++--------------------------------------------------------------------------------+-- Context++-- | Makes the context of the specified window the current one for the calling thread.+-- A context can only be made current on a single thread at a time,+-- and each thread can have only a single current context at a time.+-- See <http://www.glfw.org/docs/3.3/group__context.html#ga1c04dc242268f827290fe40aa1c91157 glfwMakeContextCurrent>+makeContextCurrent :: Maybe Window -> IO ()+makeContextCurrent =+ c'glfwMakeContextCurrent . maybe nullPtr toC++-- | Obtains which window owns the current context of the calling thread.+-- See <http://www.glfw.org/docs/3.3/group__context.html#gac84759b1f6c2d271a4fea8ae89ec980d glfwGetCurrentContext>+getCurrentContext :: IO (Maybe Window)+getCurrentContext = do+ p'win <- c'glfwGetCurrentContext+ return $ if p'win == nullPtr+ then Nothing+ else Just $ fromC p'win++-- | Swaps the front and back buffers of the window.+-- See <http://www.glfw.org/docs/3.3/group__window.html#ga15a5a1ee5b3c2ca6b15ca209a12efd14 glfwSwapBuffers>+swapBuffers :: Window -> IO ()+swapBuffers =+ c'glfwSwapBuffers . toC++-- | Sets the number of screen updates that the GPU should wait after 'swapBuffers' before actually swapping the buffers.+-- Generates 'Error'NoCurrentContext' if no context is current.+-- See <http://www.glfw.org/docs/3.3/group__context.html#ga6d4e0cdf151b5e579bd67f13202994ed glfwSwapInterval>+swapInterval :: Int -> IO ()+swapInterval =+ c'glfwSwapInterval . toC++-- | If the current OpenGL or OpenGL ES context supports the extension specified.+-- Generates 'Error'NoCurrentContext' if no context is current.+-- See <http://www.glfw.org/docs/3.3/group__context.html#ga87425065c011cef1ebd6aac75e059dfa glfwExtensionSupported>+extensionSupported :: String -> IO Bool+extensionSupported ext =+ withCString ext $ \p'ext ->+ fromC `fmap` c'glfwExtensionSupported p'ext++--------------------------------------------------------------------------------+-- Clipboard+-- http://www.glfw.org/docs/3.3/input.html#clipboard++-- | The window that will own the clipboard contents, and also the clipboard string.+-- See <http://www.glfw.org/docs/3.3/group__input.html#gaba1f022c5eb07dfac421df34cdcd31dd glfwSetClipboardString>+setClipboardString :: Window -> String -> IO ()+setClipboardString win s =+ withCString s (c'glfwSetClipboardString (toC win))++-- | Obtains the contents of the system keyboard, if possible.+-- Generates 'Error'FormatUnavailable' if the system clipboard is empty or if it's not a UTF-8 string.+-- See <http://www.glfw.org/docs/3.3/group__input.html#ga5aba1d704d9ab539282b1fbe9f18bb94 glfwGetClipboardString>+getClipboardString :: Window -> IO (Maybe String)+getClipboardString win = do+ p's <- c'glfwGetClipboardString (toC win)+ if p's == nullPtr+ then return Nothing+ else Just `fmap` peekCString p's++--------------------------------------------------------------------------------+-- 3.1 additions (http://www.glfw.org/docs/3.1/news.html#news_31)+--------------------------------------------------------------------------------++-- Cursor Objects+-- http://www.glfw.org/docs/3.3/input.html#cursor_object++-- | Creates a new cursor.+createCursor :: Image -- ^ The desired cursor image.+ -> Int -- ^ The desired x-coordinate, in pixels, of the cursor+ -- hotspot.+ -> Int -- ^ The desired y-coordinate, in pixels, of the cursor+ -- hotspot.+ -> IO Cursor+createCursor img x y =+ withGLFWImage img $ \p'img ->+ Cursor `fmap` c'glfwCreateCursor p'img (toC x) (toC y)++-- | Creates a cursor with a standard shape that can be set for a window with+-- setCursor.+createStandardCursor :: StandardCursorShape -> IO Cursor+createStandardCursor = (fmap Cursor) . c'glfwCreateStandardCursor . toC++-- | Sets the cursor image to be used when the cursor is over the client area+-- of the specified window. The set cursor will only be visible when the cursor+-- mode of the window is @GLFW_CURSOR_NORMAL@.++-- On some platforms, the set cursor may not be visible unless the window also+-- has input focus.+setCursor :: Window -> Cursor -> IO ()+setCursor (Window wptr) (Cursor cptr) = c'glfwSetCursor wptr cptr++-- | Destroys a cursor previously created with `createCursor`. Any remaining+-- cursors will be destroyed by `terminate`. This function is not+-- <https://www.glfw.org/docs/latest/intro.html#reentrancy reentrant>.+destroyCursor :: Cursor -> IO ()+destroyCursor = c'glfwDestroyCursor . unCursor++-- | A callback that allows for drag and drop support.+type DropCallback = Window -- ^ The window that received the event.+ -> [String] -- ^ The file and/or directory path names+ -> IO ()++-- | Sets the file drop callback of the specified window, which is called when+-- one or more dragged files are dropped on the window.+setDropCallback :: Window -> Maybe DropCallback -> IO ()+setDropCallback win = setWindowCallback+ mk'GLFWdropfun+ (\cb w c fs -> do+ let count = fromC c+ fps <- flip mapM [0..count-1] $ \i -> do+ let p = advancePtr fs i+ p' <- peek p+ peekCString p'+ schedule $ cb (fromC w) fps)+ (c'glfwSetDropCallback (toC win))+ storedDropFun+ win++--------------------------------------------------------------------------------+-- Vulkan-related functions+--------------------------------------------------------------------------------++-- | This function returns whether the Vulkan loader has been found.+-- This check is performed by `init`.+vulkanSupported :: IO Bool+vulkanSupported = (c'GLFW_TRUE ==) <$> c'glfwVulkanSupported++-- | Get required vulkan extensions;+-- Pointer memory is managed by GLFW, destroyed by `terminate` call.+--+-- The returned extension names are kept in `CString` type, because+-- they are expected to be consumed by vulkan device initialization functions.+getRequiredInstanceExtensions :: IO [CString]+getRequiredInstanceExtensions = alloca $ \countPtr -> do+ extsPtrPtr <- c'glfwGetRequiredInstanceExtensions countPtr+ count <- fromIntegral <$> peek countPtr+ peekArray count extsPtrPtr++-- | Returns the address of the specified Vulkan instance function.+getInstanceProcAddress :: Ptr vkInstance+ -- ^ VkInstance.+ -- Note, the returned function must be used+ -- with the same instance or its child.+ -> String+ -- ^ Function name+ -> IO (FunPtr vkProc)+getInstanceProcAddress i procName+ = withCString procName (c'glfwGetInstanceProcAddress i)++-- | Returns whether the specified queue family can present images.+getPhysicalDevicePresentationSupport ::+ Ptr vkInstance+ -- ^ VkInstance+ -> Ptr vkPhysicalDevice+ -- ^ VkPhysicalDevice+ -> Word32+ -- ^ Index of a queue family to query.+ -- This is an index in the array returned by+ -- @vkGetPhysicalDeviceQueueFamilyProperties@ function.+ -> IO Bool+getPhysicalDevicePresentationSupport inst dev i+ = (c'GLFW_TRUE ==) <$> c'glfwGetPhysicalDevicePresentationSupport inst dev i++-- | Creates a Vulkan surface for the specified window+createWindowSurface :: Enum vkResult+ => Ptr vkInstance+ -- ^ VkInstance+ -> Window+ -- ^ GLFWwindow *window+ -> Ptr vkAllocationCallbacks+ -- ^ const VkAllocationCallbacks *allocator+ -> Ptr vkSurfaceKHR+ -- ^ VkSurfaceKHR *surface+ -> IO vkResult+createWindowSurface i win acs s+ = toEnum . fromIntegral+ <$> c'glfwCreateWindowSurface i (toC win) acs s++--------------------------------------------------------------------------------+-- Native APIs+--------------------------------------------------------------------------------++-- $nativeaccess+-- The low level native-access bindings are exposed here via bindings-GLFW.+-- These must be enabled with the @ExposeNative@ flag passed to bindings-GLFW.+-- The return values of these functions are used as a best-guess and are not+-- coupled with any other implementation. They should be used with caution+-- and at your own risk.++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gac84f63a3f9db145b9435e5e0dbc4183d glfwGetWin32Adapter>+getWin32Adapter :: Window -> IO CString+getWin32Adapter = c'glfwGetWin32Adapter . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gac408b09a330749402d5d1fa1f5894dd9 glfwGetWin32Monitor>+getWin32Monitor :: Window -> IO CString+getWin32Monitor = c'glfwGetWin32Monitor . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gafe5079aa79038b0079fc09d5f0a8e667 glfwGetWin32Window>+getWin32Window :: Window -> IO (Ptr ())+getWin32Window = c'glfwGetWin32Window . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gadc4010d91d9cc1134d040eeb1202a143 glfwGetWGLContext>+getWGLContext :: Window -> IO (Ptr ())+getWGLContext = c'glfwGetWGLContext . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gaf22f429aec4b1aab316142d66d9be3e6 glfwGetCocoaMonitor>+getCocoaMonitor :: Window -> IO (Ptr Word32)+getCocoaMonitor = c'glfwGetCocoaMonitor . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gac3ed9d495d0c2bb9652de5a50c648715 glfwGetCocoaWindow>+getCocoaWindow :: Window -> IO (Ptr ())+getCocoaWindow = c'glfwGetCocoaWindow . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga559e002e3cd63c979881770cd4dc63bc glfwGetNSGLContext>+getNSGLContext :: Window -> IO (Ptr ())+getNSGLContext = c'glfwGetNSGLContext . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga8519b66594ea3ef6eeafaa2e3ee37406 glfwGetX11Display>+getX11Display :: IO (Ptr display)+getX11Display = c'glfwGetX11Display++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga088fbfa80f50569402b41be71ad66e40 glfwGetX11Adapter>+getX11Adapter :: Window -> IO Word64+getX11Adapter = c'glfwGetX11Adapter . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gab2f8cc043905e9fa9b12bfdbbcfe874c glfwGetX11Monitor>+getX11Monitor :: Window -> IO Word64+getX11Monitor = c'glfwGetX11Monitor . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga90ca676322740842db446999a1b1f21d glfwGetX11Window>+getX11Window :: Window -> IO Word64+getX11Window = c'glfwGetX11Window . toC++-- | See <https://www.glfw.org/docs/3.3/group__native.html#ga72f23e3980b83788c70aa854eca31430 glfwGetX11SelectionString>+getX11SelectionString :: IO String+getX11SelectionString = c'glfwGetX11SelectionString >>= peekCString++-- | See <https://www.glfw.org/docs/3.3/group__native.html#ga55f879ab02d93367f966186b6f0133f7 glfwSetX11SelectionString>+setX11SelectionString :: String -> IO ()+setX11SelectionString = flip withCString c'glfwSetX11SelectionString++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga62d884114b0abfcdc2930e89f20867e2 glfwGetGLXContext>+getGLXContext :: Window -> IO (Ptr ())+getGLXContext = c'glfwGetGLXContext . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga1ed27b8766e859a21381e8f8ce18d049 glfwGetGLXWindow>+getGLXWindow :: Window -> IO Word64+getGLXWindow = c'glfwGetGLXWindow . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gaaf8118a3c877f3a6bc8e7a649519de5e glfwGetWaylandDisplay>+getWaylandDisplay :: IO (Ptr wl_display)+getWaylandDisplay = c'glfwGetWaylandDisplay++-- | See <http://www.glfw.org/docs/3.3/group__native.html#gab10427a667b6cd91eec7709f7a906bd3 glfwGetWaylandMonitor>+getWaylandMonitor :: Window -> IO (Ptr wl_output)+getWaylandMonitor = c'glfwGetWaylandMonitor . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga4738d7aca4191363519a9a641c3ab64c glfwGetWaylandWindow>+getWaylandWindow :: Window -> IO (Ptr wl_surface)+getWaylandWindow = c'glfwGetWaylandWindow . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga1cd8d973f47aacb5532d368147cc3138 glfwGetEGLDisplay>+getEGLDisplay :: IO (Ptr ())+getEGLDisplay = c'glfwGetEGLDisplay++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga671c5072becd085f4ab5771a9c8efcf1 glfwGetEGLContext>+getEGLContext :: Window -> IO (Ptr ())+getEGLContext = c'glfwGetEGLContext . toC++-- | See <http://www.glfw.org/docs/3.3/group__native.html#ga2199b36117a6a695fec8441d8052eee6 glfwGetEGLSurface>+getEGLSurface :: Window -> IO (Ptr ())+getEGLSurface = c'glfwGetEGLSurface . toC++-- | See <https://www.glfw.org/docs/3.3/group__native.html#ga9e47700080094eb569cb053afaa88773 glfwGetOSMesaContext>+getOSMesaContext :: Window -> IO (Ptr ())+getOSMesaContext = c'glfwGetOSMesaContext . toC++-- | An RGBA type is a low-dynamic range representation of a color, represented+-- by a 32-bit value. The channels here are in order: R, G, B, A+type OSMesaRGBA = (Word8, Word8, Word8, Word8)++-- | A color buffer is a two dimensional array of RGBA values. The first+-- dimension is width, and the second is height.+--+-- TODO: It's a shame this is an Array and not a UArray.+type OSMesaColorBuffer = Array (Int, Int) OSMesaRGBA++-- | A depth buffer is a two dimensional array of depth values. The range is+-- usually determined by a parameter returned from the query function.+type OSMesaDepthBuffer = Array (Int, Int) Word32++-- | Returns the color buffer of the offscreen context provided by OSMesa. The+-- color buffer is returned as an array whose integers are unsigned and+-- represent the (R, G, B, A) values. For formats that do not have alpha, A+-- will always be 255.+getOSMesaColorBuffer :: Window -> IO (Maybe OSMesaColorBuffer)+getOSMesaColorBuffer win =+ alloca $ \p'width ->+ alloca $ \p'height ->+ alloca $ \p'format ->+ alloca $ \p'buf -> do+ result <- fromC <$> c'glfwGetOSMesaColorBuffer (toC win)+ p'width p'height p'format p'buf+ if not result then return Nothing else do+ w <- fromIntegral <$> peek p'width+ h <- fromIntegral <$> peek p'height+ format <- peek p'format+ buf <- peek p'buf+ Just . array ((0, 0), (w, h)) <$> sequence+ [ fmap (\rgba -> ((x, y), rgba)) $+ mkRGBA format (castPtr buf) (y * w + x)+ | x <- [0..w]+ , y <- [0..h]+ ]+ where+ getByte :: Int -> Word32 -> Word8+ getByte i x = fromIntegral $ (x `shiftR` (i * 8)) .&. 0xFF++ mkRGBA :: CInt -> Ptr Word8 -> Int -> IO OSMesaRGBA+ mkRGBA 0x1908 buf offset = do+ -- OSMESA_RGBA+ (rgba :: Word32) <- peekElemOff (castPtr buf) offset+ return (getByte 0 rgba, getByte 1 rgba, getByte 2 rgba, getByte 3 rgba)+ mkRGBA 0x1 buf offset = do+ -- OSMESA_BGRA+ (bgra :: Word32) <- peekElemOff (castPtr buf) offset+ return (getByte 2 bgra, getByte 1 bgra, getByte 0 bgra, getByte 3 bgra)+ mkRGBA 0x2 buf offset = do+ -- OSMESA_ARGB+ (argb :: Word32) <- peekElemOff (castPtr buf) offset+ return (getByte 1 argb, getByte 2 argb, getByte 3 argb, getByte 0 argb)+ mkRGBA 0x1907 buf offset = do+ -- OSMESA_RGB+ r <- peek (buf `plusPtr` (offset * 3 + 0))+ g <- peek (buf `plusPtr` (offset * 3 + 1))+ b <- peek (buf `plusPtr` (offset * 3 + 2))+ return (r, g, b, 255)+ mkRGBA 0x4 buf offset = do+ -- OSMESA_BGR+ b <- peek (buf `plusPtr` (offset * 3 + 0))+ g <- peek (buf `plusPtr` (offset * 3 + 1))+ r <- peek (buf `plusPtr` (offset * 3 + 2))+ return (r, g, b, 255)+ mkRGBA 0x5 buf offset = do+ -- OSMESA_RGB_565+ (rgb :: Word16) <- peekElemOff (castPtr buf) offset+ return (+ fromIntegral $ rgb .&. 0x1F,+ fromIntegral $ (rgb `shiftR` 5) .&. 0x3F,+ fromIntegral $ (rgb `shiftR` 11) .&. 0x1F,+ 255)+ mkRGBA fmt _ _ = error $ "Unrecognized OSMESA_FORMAT: " ++ show fmt++-- | Returns the depth buffer and maximum depth value of the offscreen render+-- target that's provided by OSMesa.+getOSMesaDepthBuffer :: Window -> IO (Maybe (OSMesaDepthBuffer, Word32))+getOSMesaDepthBuffer win =+ alloca $ \p'width ->+ alloca $ \p'height ->+ alloca $ \p'bytesPerVal ->+ alloca $ \p'buf -> do+ result <- fromC <$> c'glfwGetOSMesaDepthBuffer (toC win)+ p'width p'height p'bytesPerVal p'buf+ if not result then return Nothing else do+ w <- fromIntegral <$> peek p'width+ h <- fromIntegral <$> peek p'height+ bytesPerVal <- fromIntegral <$> peek p'bytesPerVal+ buf <- peek p'buf+ depthBuffer <- array ((0, 0), (w, h)) <$> sequence+ [ fmap (\d -> ((x, y), d)) $+ mkDepth bytesPerVal (castPtr buf) (y * w + x)+ | x <- [0..w]+ , y <- [0..h]+ ]+ return (Just (depthBuffer, (1 `shiftL` (8 * bytesPerVal)) - 1))+ where+ mkDepth :: Int -> Ptr Word8 -> Int -> IO Word32+ mkDepth bpv ptr offset = do+ -- Assumes little-endian?+ bytes <- forM [0..(bpv - 1)] $ \i -> peekElemOff ptr (offset * bpv + i)+ return $ foldl' (\d -> ((d `shiftL` 8) .|.) . fromIntegral) 0 bytes+
+ Graphics/UI/GLFW/C.hs view
@@ -0,0 +1,686 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}++--------------------------------------------------------------------------------++-- This code is generated by util/genC.hs.++--------------------------------------------------------------------------------++module Graphics.UI.GLFW.C where++--------------------------------------------------------------------------------++import Data.Bits ((.&.))+import Data.Char (chr, ord)+import Foreign.C.Types (CDouble, CFloat, CInt, CUChar, CUInt, CUShort)+import Foreign.Ptr (Ptr)++import Bindings.GLFW+import Graphics.UI.GLFW.Types++--------------------------------------------------------------------------------++class C c h where+ fromC :: c -> h+ toC :: h -> c++--------------------------------------------------------------------------------++instance (C CInt b) => C CInt (Maybe b) where+ fromC i | i == c'GLFW_DONT_CARE = Nothing+ | otherwise = Just $ fromC i+ toC = maybe c'GLFW_DONT_CARE toC++--------------------------------------------------------------------------------++instance C CInt Char where+ fromC = chr . fromIntegral+ toC = fromIntegral . ord++instance C CUInt Char where+ fromC = chr . fromIntegral+ toC = fromIntegral . ord++instance C CDouble Double where+ fromC = realToFrac+ toC = realToFrac++instance C CInt Int where+ fromC = fromIntegral+ toC = fromIntegral++instance C CUInt Int where+ fromC = fromIntegral+ toC = fromIntegral++instance C CUShort Int where+ fromC = fromIntegral+ toC = fromIntegral++instance C CFloat Double where+ fromC = realToFrac+ toC = realToFrac++instance C (Ptr C'GLFWmonitor) Monitor where+ fromC = Monitor+ toC = unMonitor++instance C (Ptr C'GLFWwindow) Window where+ fromC = Window+ toC = unWindow++instance C CInt ModifierKeys where+ fromC v = ModifierKeys+ { modifierKeysShift = (v .&. c'GLFW_MOD_SHIFT) /= 0+ , modifierKeysControl = (v .&. c'GLFW_MOD_CONTROL) /= 0+ , modifierKeysAlt = (v .&. c'GLFW_MOD_ALT) /= 0+ , modifierKeysSuper = (v .&. c'GLFW_MOD_SUPER) /= 0+ , modifierKeysCapsLock = (v .&. c'GLFW_MOD_CAPS_LOCK) /= 0+ , modifierKeysNumLock = (v .&. c'GLFW_MOD_NUM_LOCK) /= 0+ }+ toC = undefined++instance C C'GLFWvidmode VideoMode where+ fromC gvm = VideoMode+ { videoModeWidth = fromIntegral $ c'GLFWvidmode'width gvm+ , videoModeHeight = fromIntegral $ c'GLFWvidmode'height gvm+ , videoModeRedBits = fromIntegral $ c'GLFWvidmode'redBits gvm+ , videoModeGreenBits = fromIntegral $ c'GLFWvidmode'greenBits gvm+ , videoModeBlueBits = fromIntegral $ c'GLFWvidmode'blueBits gvm+ , videoModeRefreshRate = fromIntegral $ c'GLFWvidmode'refreshRate gvm+ }+ toC = undefined++instance C CInt StandardCursorShape where+ fromC v+ | v == c'GLFW_ARROW_CURSOR = StandardCursorShape'Arrow+ | v == c'GLFW_IBEAM_CURSOR = StandardCursorShape'IBeam+ | v == c'GLFW_CROSSHAIR_CURSOR = StandardCursorShape'Crosshair+ | v == c'GLFW_HAND_CURSOR = StandardCursorShape'Hand+ | v == c'GLFW_HRESIZE_CURSOR = StandardCursorShape'HResize+ | v == c'GLFW_VRESIZE_CURSOR = StandardCursorShape'VResize+ | otherwise = error $ "C CInt StandardCursorShape fromC: " ++ show v+ toC StandardCursorShape'Arrow = c'GLFW_ARROW_CURSOR+ toC StandardCursorShape'IBeam = c'GLFW_IBEAM_CURSOR+ toC StandardCursorShape'Crosshair = c'GLFW_CROSSHAIR_CURSOR+ toC StandardCursorShape'Hand = c'GLFW_HAND_CURSOR+ toC StandardCursorShape'HResize = c'GLFW_HRESIZE_CURSOR+ toC StandardCursorShape'VResize = c'GLFW_VRESIZE_CURSOR++--------------------------------------------------------------------------------++instance C CInt Bool where+ fromC v+ | v == c'GLFW_FALSE = False+ | v == c'GLFW_TRUE = True+ | otherwise = error $ "C CInt Bool fromC: " ++ show v+ toC False = c'GLFW_FALSE+ toC True = c'GLFW_TRUE++instance C CInt Error where+ fromC v+ | v == c'GLFW_NOT_INITIALIZED = Error'NotInitialized+ | v == c'GLFW_NO_CURRENT_CONTEXT = Error'NoCurrentContext+ | v == c'GLFW_INVALID_ENUM = Error'InvalidEnum+ | v == c'GLFW_INVALID_VALUE = Error'InvalidValue+ | v == c'GLFW_OUT_OF_MEMORY = Error'OutOfMemory+ | v == c'GLFW_API_UNAVAILABLE = Error'ApiUnavailable+ | v == c'GLFW_VERSION_UNAVAILABLE = Error'VersionUnavailable+ | v == c'GLFW_PLATFORM_ERROR = Error'PlatformError+ | v == c'GLFW_FORMAT_UNAVAILABLE = Error'FormatUnavailable+ | otherwise = error $ "C CInt Error fromC: " ++ show v+ toC Error'NotInitialized = c'GLFW_NOT_INITIALIZED+ toC Error'NoCurrentContext = c'GLFW_NO_CURRENT_CONTEXT+ toC Error'InvalidEnum = c'GLFW_INVALID_ENUM+ toC Error'InvalidValue = c'GLFW_INVALID_VALUE+ toC Error'OutOfMemory = c'GLFW_OUT_OF_MEMORY+ toC Error'ApiUnavailable = c'GLFW_API_UNAVAILABLE+ toC Error'VersionUnavailable = c'GLFW_VERSION_UNAVAILABLE+ toC Error'PlatformError = c'GLFW_PLATFORM_ERROR+ toC Error'FormatUnavailable = c'GLFW_FORMAT_UNAVAILABLE++instance C CInt InitHint where+ fromC v+ | v == c'GLFW_JOYSTICK_HAT_BUTTONS = InitHint'JoystickHatButtons+ | v == c'GLFW_COCOA_CHDIR_RESOURCES = InitHint'CocoaChdirResources+ | v == c'GLFW_COCOA_MENUBAR = InitHint'CocoaMenubar+ | otherwise = error $ "C CInt InitHint fromC: " ++ show v+ toC InitHint'JoystickHatButtons = c'GLFW_JOYSTICK_HAT_BUTTONS+ toC InitHint'CocoaChdirResources = c'GLFW_COCOA_CHDIR_RESOURCES+ toC InitHint'CocoaMenubar = c'GLFW_COCOA_MENUBAR++instance C CInt MonitorState where+ fromC v+ | v == c'GLFW_CONNECTED = MonitorState'Connected+ | v == c'GLFW_DISCONNECTED = MonitorState'Disconnected+ | otherwise = error $ "C CInt MonitorState fromC: " ++ show v+ toC MonitorState'Connected = c'GLFW_CONNECTED+ toC MonitorState'Disconnected = c'GLFW_DISCONNECTED++instance C CInt ContextRobustness where+ fromC v+ | v == c'GLFW_NO_ROBUSTNESS = ContextRobustness'NoRobustness+ | v == c'GLFW_NO_RESET_NOTIFICATION = ContextRobustness'NoResetNotification+ | v == c'GLFW_LOSE_CONTEXT_ON_RESET = ContextRobustness'LoseContextOnReset+ | otherwise = error $ "C CInt ContextRobustness fromC: " ++ show v+ toC ContextRobustness'NoRobustness = c'GLFW_NO_ROBUSTNESS+ toC ContextRobustness'NoResetNotification = c'GLFW_NO_RESET_NOTIFICATION+ toC ContextRobustness'LoseContextOnReset = c'GLFW_LOSE_CONTEXT_ON_RESET++instance C CInt ContextReleaseBehavior where+ fromC v+ | v == c'GLFW_ANY_RELEASE_BEHAVIOR = ContextReleaseBehavior'Any+ | v == c'GLFW_RELEASE_BEHAVIOR_NONE = ContextReleaseBehavior'None+ | v == c'GLFW_RELEASE_BEHAVIOR_FLUSH = ContextReleaseBehavior'Flush+ | otherwise = error $ "C CInt ContextReleaseBehavior fromC: " ++ show v+ toC ContextReleaseBehavior'Any = c'GLFW_ANY_RELEASE_BEHAVIOR+ toC ContextReleaseBehavior'None = c'GLFW_RELEASE_BEHAVIOR_NONE+ toC ContextReleaseBehavior'Flush = c'GLFW_RELEASE_BEHAVIOR_FLUSH++instance C CInt OpenGLProfile where+ fromC v+ | v == c'GLFW_OPENGL_ANY_PROFILE = OpenGLProfile'Any+ | v == c'GLFW_OPENGL_COMPAT_PROFILE = OpenGLProfile'Compat+ | v == c'GLFW_OPENGL_CORE_PROFILE = OpenGLProfile'Core+ | otherwise = error $ "C CInt OpenGLProfile fromC: " ++ show v+ toC OpenGLProfile'Any = c'GLFW_OPENGL_ANY_PROFILE+ toC OpenGLProfile'Compat = c'GLFW_OPENGL_COMPAT_PROFILE+ toC OpenGLProfile'Core = c'GLFW_OPENGL_CORE_PROFILE++instance C CInt ClientAPI where+ fromC v+ | v == c'GLFW_NO_API = ClientAPI'NoAPI+ | v == c'GLFW_OPENGL_API = ClientAPI'OpenGL+ | v == c'GLFW_OPENGL_ES_API = ClientAPI'OpenGLES+ | otherwise = error $ "C CInt ClientAPI fromC: " ++ show v+ toC ClientAPI'NoAPI = c'GLFW_NO_API+ toC ClientAPI'OpenGL = c'GLFW_OPENGL_API+ toC ClientAPI'OpenGLES = c'GLFW_OPENGL_ES_API++instance C CInt ContextCreationAPI where+ fromC v+ | v == c'GLFW_NATIVE_CONTEXT_API = ContextCreationAPI'Native+ | v == c'GLFW_EGL_CONTEXT_API = ContextCreationAPI'EGL+ | v == c'GLFW_OSMESA_CONTEXT_API = ContextCreationAPI'OSMesa+ | otherwise = error $ "C CInt ContextCreationAPI fromC: " ++ show v+ toC ContextCreationAPI'Native = c'GLFW_NATIVE_CONTEXT_API+ toC ContextCreationAPI'EGL = c'GLFW_EGL_CONTEXT_API+ toC ContextCreationAPI'OSMesa = c'GLFW_OSMESA_CONTEXT_API++instance C CInt Key where+ fromC v+ | v == c'GLFW_KEY_UNKNOWN = Key'Unknown+ | v == c'GLFW_KEY_SPACE = Key'Space+ | v == c'GLFW_KEY_APOSTROPHE = Key'Apostrophe+ | v == c'GLFW_KEY_COMMA = Key'Comma+ | v == c'GLFW_KEY_MINUS = Key'Minus+ | v == c'GLFW_KEY_PERIOD = Key'Period+ | v == c'GLFW_KEY_SLASH = Key'Slash+ | v == c'GLFW_KEY_0 = Key'0+ | v == c'GLFW_KEY_1 = Key'1+ | v == c'GLFW_KEY_2 = Key'2+ | v == c'GLFW_KEY_3 = Key'3+ | v == c'GLFW_KEY_4 = Key'4+ | v == c'GLFW_KEY_5 = Key'5+ | v == c'GLFW_KEY_6 = Key'6+ | v == c'GLFW_KEY_7 = Key'7+ | v == c'GLFW_KEY_8 = Key'8+ | v == c'GLFW_KEY_9 = Key'9+ | v == c'GLFW_KEY_SEMICOLON = Key'Semicolon+ | v == c'GLFW_KEY_EQUAL = Key'Equal+ | v == c'GLFW_KEY_A = Key'A+ | v == c'GLFW_KEY_B = Key'B+ | v == c'GLFW_KEY_C = Key'C+ | v == c'GLFW_KEY_D = Key'D+ | v == c'GLFW_KEY_E = Key'E+ | v == c'GLFW_KEY_F = Key'F+ | v == c'GLFW_KEY_G = Key'G+ | v == c'GLFW_KEY_H = Key'H+ | v == c'GLFW_KEY_I = Key'I+ | v == c'GLFW_KEY_J = Key'J+ | v == c'GLFW_KEY_K = Key'K+ | v == c'GLFW_KEY_L = Key'L+ | v == c'GLFW_KEY_M = Key'M+ | v == c'GLFW_KEY_N = Key'N+ | v == c'GLFW_KEY_O = Key'O+ | v == c'GLFW_KEY_P = Key'P+ | v == c'GLFW_KEY_Q = Key'Q+ | v == c'GLFW_KEY_R = Key'R+ | v == c'GLFW_KEY_S = Key'S+ | v == c'GLFW_KEY_T = Key'T+ | v == c'GLFW_KEY_U = Key'U+ | v == c'GLFW_KEY_V = Key'V+ | v == c'GLFW_KEY_W = Key'W+ | v == c'GLFW_KEY_X = Key'X+ | v == c'GLFW_KEY_Y = Key'Y+ | v == c'GLFW_KEY_Z = Key'Z+ | v == c'GLFW_KEY_LEFT_BRACKET = Key'LeftBracket+ | v == c'GLFW_KEY_BACKSLASH = Key'Backslash+ | v == c'GLFW_KEY_RIGHT_BRACKET = Key'RightBracket+ | v == c'GLFW_KEY_GRAVE_ACCENT = Key'GraveAccent+ | v == c'GLFW_KEY_WORLD_1 = Key'World1+ | v == c'GLFW_KEY_WORLD_2 = Key'World2+ | v == c'GLFW_KEY_ESCAPE = Key'Escape+ | v == c'GLFW_KEY_ENTER = Key'Enter+ | v == c'GLFW_KEY_TAB = Key'Tab+ | v == c'GLFW_KEY_BACKSPACE = Key'Backspace+ | v == c'GLFW_KEY_INSERT = Key'Insert+ | v == c'GLFW_KEY_DELETE = Key'Delete+ | v == c'GLFW_KEY_RIGHT = Key'Right+ | v == c'GLFW_KEY_LEFT = Key'Left+ | v == c'GLFW_KEY_DOWN = Key'Down+ | v == c'GLFW_KEY_UP = Key'Up+ | v == c'GLFW_KEY_PAGE_UP = Key'PageUp+ | v == c'GLFW_KEY_PAGE_DOWN = Key'PageDown+ | v == c'GLFW_KEY_HOME = Key'Home+ | v == c'GLFW_KEY_END = Key'End+ | v == c'GLFW_KEY_CAPS_LOCK = Key'CapsLock+ | v == c'GLFW_KEY_SCROLL_LOCK = Key'ScrollLock+ | v == c'GLFW_KEY_NUM_LOCK = Key'NumLock+ | v == c'GLFW_KEY_PRINT_SCREEN = Key'PrintScreen+ | v == c'GLFW_KEY_PAUSE = Key'Pause+ | v == c'GLFW_KEY_F1 = Key'F1+ | v == c'GLFW_KEY_F2 = Key'F2+ | v == c'GLFW_KEY_F3 = Key'F3+ | v == c'GLFW_KEY_F4 = Key'F4+ | v == c'GLFW_KEY_F5 = Key'F5+ | v == c'GLFW_KEY_F6 = Key'F6+ | v == c'GLFW_KEY_F7 = Key'F7+ | v == c'GLFW_KEY_F8 = Key'F8+ | v == c'GLFW_KEY_F9 = Key'F9+ | v == c'GLFW_KEY_F10 = Key'F10+ | v == c'GLFW_KEY_F11 = Key'F11+ | v == c'GLFW_KEY_F12 = Key'F12+ | v == c'GLFW_KEY_F13 = Key'F13+ | v == c'GLFW_KEY_F14 = Key'F14+ | v == c'GLFW_KEY_F15 = Key'F15+ | v == c'GLFW_KEY_F16 = Key'F16+ | v == c'GLFW_KEY_F17 = Key'F17+ | v == c'GLFW_KEY_F18 = Key'F18+ | v == c'GLFW_KEY_F19 = Key'F19+ | v == c'GLFW_KEY_F20 = Key'F20+ | v == c'GLFW_KEY_F21 = Key'F21+ | v == c'GLFW_KEY_F22 = Key'F22+ | v == c'GLFW_KEY_F23 = Key'F23+ | v == c'GLFW_KEY_F24 = Key'F24+ | v == c'GLFW_KEY_F25 = Key'F25+ | v == c'GLFW_KEY_KP_0 = Key'Pad0+ | v == c'GLFW_KEY_KP_1 = Key'Pad1+ | v == c'GLFW_KEY_KP_2 = Key'Pad2+ | v == c'GLFW_KEY_KP_3 = Key'Pad3+ | v == c'GLFW_KEY_KP_4 = Key'Pad4+ | v == c'GLFW_KEY_KP_5 = Key'Pad5+ | v == c'GLFW_KEY_KP_6 = Key'Pad6+ | v == c'GLFW_KEY_KP_7 = Key'Pad7+ | v == c'GLFW_KEY_KP_8 = Key'Pad8+ | v == c'GLFW_KEY_KP_9 = Key'Pad9+ | v == c'GLFW_KEY_KP_DECIMAL = Key'PadDecimal+ | v == c'GLFW_KEY_KP_DIVIDE = Key'PadDivide+ | v == c'GLFW_KEY_KP_MULTIPLY = Key'PadMultiply+ | v == c'GLFW_KEY_KP_SUBTRACT = Key'PadSubtract+ | v == c'GLFW_KEY_KP_ADD = Key'PadAdd+ | v == c'GLFW_KEY_KP_ENTER = Key'PadEnter+ | v == c'GLFW_KEY_KP_EQUAL = Key'PadEqual+ | v == c'GLFW_KEY_LEFT_SHIFT = Key'LeftShift+ | v == c'GLFW_KEY_LEFT_CONTROL = Key'LeftControl+ | v == c'GLFW_KEY_LEFT_ALT = Key'LeftAlt+ | v == c'GLFW_KEY_LEFT_SUPER = Key'LeftSuper+ | v == c'GLFW_KEY_RIGHT_SHIFT = Key'RightShift+ | v == c'GLFW_KEY_RIGHT_CONTROL = Key'RightControl+ | v == c'GLFW_KEY_RIGHT_ALT = Key'RightAlt+ | v == c'GLFW_KEY_RIGHT_SUPER = Key'RightSuper+ | v == c'GLFW_KEY_MENU = Key'Menu+ | otherwise = error $ "C CInt Key fromC: " ++ show v+ toC Key'Unknown = c'GLFW_KEY_UNKNOWN+ toC Key'Space = c'GLFW_KEY_SPACE+ toC Key'Apostrophe = c'GLFW_KEY_APOSTROPHE+ toC Key'Comma = c'GLFW_KEY_COMMA+ toC Key'Minus = c'GLFW_KEY_MINUS+ toC Key'Period = c'GLFW_KEY_PERIOD+ toC Key'Slash = c'GLFW_KEY_SLASH+ toC Key'0 = c'GLFW_KEY_0+ toC Key'1 = c'GLFW_KEY_1+ toC Key'2 = c'GLFW_KEY_2+ toC Key'3 = c'GLFW_KEY_3+ toC Key'4 = c'GLFW_KEY_4+ toC Key'5 = c'GLFW_KEY_5+ toC Key'6 = c'GLFW_KEY_6+ toC Key'7 = c'GLFW_KEY_7+ toC Key'8 = c'GLFW_KEY_8+ toC Key'9 = c'GLFW_KEY_9+ toC Key'Semicolon = c'GLFW_KEY_SEMICOLON+ toC Key'Equal = c'GLFW_KEY_EQUAL+ toC Key'A = c'GLFW_KEY_A+ toC Key'B = c'GLFW_KEY_B+ toC Key'C = c'GLFW_KEY_C+ toC Key'D = c'GLFW_KEY_D+ toC Key'E = c'GLFW_KEY_E+ toC Key'F = c'GLFW_KEY_F+ toC Key'G = c'GLFW_KEY_G+ toC Key'H = c'GLFW_KEY_H+ toC Key'I = c'GLFW_KEY_I+ toC Key'J = c'GLFW_KEY_J+ toC Key'K = c'GLFW_KEY_K+ toC Key'L = c'GLFW_KEY_L+ toC Key'M = c'GLFW_KEY_M+ toC Key'N = c'GLFW_KEY_N+ toC Key'O = c'GLFW_KEY_O+ toC Key'P = c'GLFW_KEY_P+ toC Key'Q = c'GLFW_KEY_Q+ toC Key'R = c'GLFW_KEY_R+ toC Key'S = c'GLFW_KEY_S+ toC Key'T = c'GLFW_KEY_T+ toC Key'U = c'GLFW_KEY_U+ toC Key'V = c'GLFW_KEY_V+ toC Key'W = c'GLFW_KEY_W+ toC Key'X = c'GLFW_KEY_X+ toC Key'Y = c'GLFW_KEY_Y+ toC Key'Z = c'GLFW_KEY_Z+ toC Key'LeftBracket = c'GLFW_KEY_LEFT_BRACKET+ toC Key'Backslash = c'GLFW_KEY_BACKSLASH+ toC Key'RightBracket = c'GLFW_KEY_RIGHT_BRACKET+ toC Key'GraveAccent = c'GLFW_KEY_GRAVE_ACCENT+ toC Key'World1 = c'GLFW_KEY_WORLD_1+ toC Key'World2 = c'GLFW_KEY_WORLD_2+ toC Key'Escape = c'GLFW_KEY_ESCAPE+ toC Key'Enter = c'GLFW_KEY_ENTER+ toC Key'Tab = c'GLFW_KEY_TAB+ toC Key'Backspace = c'GLFW_KEY_BACKSPACE+ toC Key'Insert = c'GLFW_KEY_INSERT+ toC Key'Delete = c'GLFW_KEY_DELETE+ toC Key'Right = c'GLFW_KEY_RIGHT+ toC Key'Left = c'GLFW_KEY_LEFT+ toC Key'Down = c'GLFW_KEY_DOWN+ toC Key'Up = c'GLFW_KEY_UP+ toC Key'PageUp = c'GLFW_KEY_PAGE_UP+ toC Key'PageDown = c'GLFW_KEY_PAGE_DOWN+ toC Key'Home = c'GLFW_KEY_HOME+ toC Key'End = c'GLFW_KEY_END+ toC Key'CapsLock = c'GLFW_KEY_CAPS_LOCK+ toC Key'ScrollLock = c'GLFW_KEY_SCROLL_LOCK+ toC Key'NumLock = c'GLFW_KEY_NUM_LOCK+ toC Key'PrintScreen = c'GLFW_KEY_PRINT_SCREEN+ toC Key'Pause = c'GLFW_KEY_PAUSE+ toC Key'F1 = c'GLFW_KEY_F1+ toC Key'F2 = c'GLFW_KEY_F2+ toC Key'F3 = c'GLFW_KEY_F3+ toC Key'F4 = c'GLFW_KEY_F4+ toC Key'F5 = c'GLFW_KEY_F5+ toC Key'F6 = c'GLFW_KEY_F6+ toC Key'F7 = c'GLFW_KEY_F7+ toC Key'F8 = c'GLFW_KEY_F8+ toC Key'F9 = c'GLFW_KEY_F9+ toC Key'F10 = c'GLFW_KEY_F10+ toC Key'F11 = c'GLFW_KEY_F11+ toC Key'F12 = c'GLFW_KEY_F12+ toC Key'F13 = c'GLFW_KEY_F13+ toC Key'F14 = c'GLFW_KEY_F14+ toC Key'F15 = c'GLFW_KEY_F15+ toC Key'F16 = c'GLFW_KEY_F16+ toC Key'F17 = c'GLFW_KEY_F17+ toC Key'F18 = c'GLFW_KEY_F18+ toC Key'F19 = c'GLFW_KEY_F19+ toC Key'F20 = c'GLFW_KEY_F20+ toC Key'F21 = c'GLFW_KEY_F21+ toC Key'F22 = c'GLFW_KEY_F22+ toC Key'F23 = c'GLFW_KEY_F23+ toC Key'F24 = c'GLFW_KEY_F24+ toC Key'F25 = c'GLFW_KEY_F25+ toC Key'Pad0 = c'GLFW_KEY_KP_0+ toC Key'Pad1 = c'GLFW_KEY_KP_1+ toC Key'Pad2 = c'GLFW_KEY_KP_2+ toC Key'Pad3 = c'GLFW_KEY_KP_3+ toC Key'Pad4 = c'GLFW_KEY_KP_4+ toC Key'Pad5 = c'GLFW_KEY_KP_5+ toC Key'Pad6 = c'GLFW_KEY_KP_6+ toC Key'Pad7 = c'GLFW_KEY_KP_7+ toC Key'Pad8 = c'GLFW_KEY_KP_8+ toC Key'Pad9 = c'GLFW_KEY_KP_9+ toC Key'PadDecimal = c'GLFW_KEY_KP_DECIMAL+ toC Key'PadDivide = c'GLFW_KEY_KP_DIVIDE+ toC Key'PadMultiply = c'GLFW_KEY_KP_MULTIPLY+ toC Key'PadSubtract = c'GLFW_KEY_KP_SUBTRACT+ toC Key'PadAdd = c'GLFW_KEY_KP_ADD+ toC Key'PadEnter = c'GLFW_KEY_KP_ENTER+ toC Key'PadEqual = c'GLFW_KEY_KP_EQUAL+ toC Key'LeftShift = c'GLFW_KEY_LEFT_SHIFT+ toC Key'LeftControl = c'GLFW_KEY_LEFT_CONTROL+ toC Key'LeftAlt = c'GLFW_KEY_LEFT_ALT+ toC Key'LeftSuper = c'GLFW_KEY_LEFT_SUPER+ toC Key'RightShift = c'GLFW_KEY_RIGHT_SHIFT+ toC Key'RightControl = c'GLFW_KEY_RIGHT_CONTROL+ toC Key'RightAlt = c'GLFW_KEY_RIGHT_ALT+ toC Key'RightSuper = c'GLFW_KEY_RIGHT_SUPER+ toC Key'Menu = c'GLFW_KEY_MENU++instance C CInt KeyState where+ fromC v+ | v == c'GLFW_PRESS = KeyState'Pressed+ | v == c'GLFW_RELEASE = KeyState'Released+ | v == c'GLFW_REPEAT = KeyState'Repeating+ | otherwise = error $ "C CInt KeyState fromC: " ++ show v+ toC KeyState'Pressed = c'GLFW_PRESS+ toC KeyState'Released = c'GLFW_RELEASE+ toC KeyState'Repeating = c'GLFW_REPEAT++instance C CInt Joystick where+ fromC v+ | v == c'GLFW_JOYSTICK_1 = Joystick'1+ | v == c'GLFW_JOYSTICK_2 = Joystick'2+ | v == c'GLFW_JOYSTICK_3 = Joystick'3+ | v == c'GLFW_JOYSTICK_4 = Joystick'4+ | v == c'GLFW_JOYSTICK_5 = Joystick'5+ | v == c'GLFW_JOYSTICK_6 = Joystick'6+ | v == c'GLFW_JOYSTICK_7 = Joystick'7+ | v == c'GLFW_JOYSTICK_8 = Joystick'8+ | v == c'GLFW_JOYSTICK_9 = Joystick'9+ | v == c'GLFW_JOYSTICK_10 = Joystick'10+ | v == c'GLFW_JOYSTICK_11 = Joystick'11+ | v == c'GLFW_JOYSTICK_12 = Joystick'12+ | v == c'GLFW_JOYSTICK_13 = Joystick'13+ | v == c'GLFW_JOYSTICK_14 = Joystick'14+ | v == c'GLFW_JOYSTICK_15 = Joystick'15+ | v == c'GLFW_JOYSTICK_16 = Joystick'16+ | otherwise = error $ "C CInt Joystick fromC: " ++ show v+ toC Joystick'1 = c'GLFW_JOYSTICK_1+ toC Joystick'2 = c'GLFW_JOYSTICK_2+ toC Joystick'3 = c'GLFW_JOYSTICK_3+ toC Joystick'4 = c'GLFW_JOYSTICK_4+ toC Joystick'5 = c'GLFW_JOYSTICK_5+ toC Joystick'6 = c'GLFW_JOYSTICK_6+ toC Joystick'7 = c'GLFW_JOYSTICK_7+ toC Joystick'8 = c'GLFW_JOYSTICK_8+ toC Joystick'9 = c'GLFW_JOYSTICK_9+ toC Joystick'10 = c'GLFW_JOYSTICK_10+ toC Joystick'11 = c'GLFW_JOYSTICK_11+ toC Joystick'12 = c'GLFW_JOYSTICK_12+ toC Joystick'13 = c'GLFW_JOYSTICK_13+ toC Joystick'14 = c'GLFW_JOYSTICK_14+ toC Joystick'15 = c'GLFW_JOYSTICK_15+ toC Joystick'16 = c'GLFW_JOYSTICK_16++instance C CUChar JoystickHatState where+ fromC v+ | v == c'GLFW_HAT_CENTERED = JoystickHatState'Centered+ | v == c'GLFW_HAT_UP = JoystickHatState'Up+ | v == c'GLFW_HAT_RIGHT = JoystickHatState'Right+ | v == c'GLFW_HAT_DOWN = JoystickHatState'Down+ | v == c'GLFW_HAT_LEFT = JoystickHatState'Left+ | v == c'GLFW_HAT_RIGHT_UP = JoystickHatState'RightUp+ | v == c'GLFW_HAT_RIGHT_DOWN = JoystickHatState'RightDown+ | v == c'GLFW_HAT_LEFT_UP = JoystickHatState'LeftUp+ | v == c'GLFW_HAT_LEFT_DOWN = JoystickHatState'LeftDown+ | otherwise = error $ "C CUChar JoystickHatState fromC: " ++ show v+ toC JoystickHatState'Centered = c'GLFW_HAT_CENTERED+ toC JoystickHatState'Up = c'GLFW_HAT_UP+ toC JoystickHatState'Right = c'GLFW_HAT_RIGHT+ toC JoystickHatState'Down = c'GLFW_HAT_DOWN+ toC JoystickHatState'Left = c'GLFW_HAT_LEFT+ toC JoystickHatState'RightUp = c'GLFW_HAT_RIGHT_UP+ toC JoystickHatState'RightDown = c'GLFW_HAT_RIGHT_DOWN+ toC JoystickHatState'LeftUp = c'GLFW_HAT_LEFT_UP+ toC JoystickHatState'LeftDown = c'GLFW_HAT_LEFT_DOWN++instance C CUChar JoystickButtonState where+ fromC v+ | v == c'GLFW_PRESS = JoystickButtonState'Pressed+ | v == c'GLFW_RELEASE = JoystickButtonState'Released+ | otherwise = error $ "C CUChar JoystickButtonState fromC: " ++ show v+ toC JoystickButtonState'Pressed = c'GLFW_PRESS+ toC JoystickButtonState'Released = c'GLFW_RELEASE++instance C CInt JoystickState where+ fromC v+ | v == c'GLFW_CONNECTED = JoystickState'Connected+ | v == c'GLFW_DISCONNECTED = JoystickState'Disconnected+ | otherwise = error $ "C CInt JoystickState fromC: " ++ show v+ toC JoystickState'Connected = c'GLFW_CONNECTED+ toC JoystickState'Disconnected = c'GLFW_DISCONNECTED++instance C CInt GamepadButton where+ fromC v+ | v == c'GLFW_GAMEPAD_BUTTON_A = GamepadButton'A+ | v == c'GLFW_GAMEPAD_BUTTON_B = GamepadButton'B+ | v == c'GLFW_GAMEPAD_BUTTON_X = GamepadButton'X+ | v == c'GLFW_GAMEPAD_BUTTON_Y = GamepadButton'Y+ | v == c'GLFW_GAMEPAD_BUTTON_LEFT_BUMPER = GamepadButton'LeftBumper+ | v == c'GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER = GamepadButton'RightBumper+ | v == c'GLFW_GAMEPAD_BUTTON_BACK = GamepadButton'Back+ | v == c'GLFW_GAMEPAD_BUTTON_START = GamepadButton'Start+ | v == c'GLFW_GAMEPAD_BUTTON_GUIDE = GamepadButton'Guide+ | v == c'GLFW_GAMEPAD_BUTTON_LEFT_THUMB = GamepadButton'LeftThumb+ | v == c'GLFW_GAMEPAD_BUTTON_RIGHT_THUMB = GamepadButton'RightThumb+ | v == c'GLFW_GAMEPAD_BUTTON_DPAD_UP = GamepadButton'DpadUp+ | v == c'GLFW_GAMEPAD_BUTTON_DPAD_RIGHT = GamepadButton'DpadRight+ | v == c'GLFW_GAMEPAD_BUTTON_DPAD_DOWN = GamepadButton'DpadDown+ | v == c'GLFW_GAMEPAD_BUTTON_DPAD_LEFT = GamepadButton'DpadLeft+ | v == c'GLFW_GAMEPAD_BUTTON_CROSS = GamepadButton'Cross+ | v == c'GLFW_GAMEPAD_BUTTON_CIRCLE = GamepadButton'Circle+ | v == c'GLFW_GAMEPAD_BUTTON_SQUARE = GamepadButton'Square+ | v == c'GLFW_GAMEPAD_BUTTON_TRIANGLE = GamepadButton'Triangle+ | otherwise = error $ "C CInt GamepadButton fromC: " ++ show v+ toC GamepadButton'A = c'GLFW_GAMEPAD_BUTTON_A+ toC GamepadButton'B = c'GLFW_GAMEPAD_BUTTON_B+ toC GamepadButton'X = c'GLFW_GAMEPAD_BUTTON_X+ toC GamepadButton'Y = c'GLFW_GAMEPAD_BUTTON_Y+ toC GamepadButton'LeftBumper = c'GLFW_GAMEPAD_BUTTON_LEFT_BUMPER+ toC GamepadButton'RightBumper = c'GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER+ toC GamepadButton'Back = c'GLFW_GAMEPAD_BUTTON_BACK+ toC GamepadButton'Start = c'GLFW_GAMEPAD_BUTTON_START+ toC GamepadButton'Guide = c'GLFW_GAMEPAD_BUTTON_GUIDE+ toC GamepadButton'LeftThumb = c'GLFW_GAMEPAD_BUTTON_LEFT_THUMB+ toC GamepadButton'RightThumb = c'GLFW_GAMEPAD_BUTTON_RIGHT_THUMB+ toC GamepadButton'DpadUp = c'GLFW_GAMEPAD_BUTTON_DPAD_UP+ toC GamepadButton'DpadRight = c'GLFW_GAMEPAD_BUTTON_DPAD_RIGHT+ toC GamepadButton'DpadDown = c'GLFW_GAMEPAD_BUTTON_DPAD_DOWN+ toC GamepadButton'DpadLeft = c'GLFW_GAMEPAD_BUTTON_DPAD_LEFT+ toC GamepadButton'Cross = c'GLFW_GAMEPAD_BUTTON_CROSS+ toC GamepadButton'Circle = c'GLFW_GAMEPAD_BUTTON_CIRCLE+ toC GamepadButton'Square = c'GLFW_GAMEPAD_BUTTON_SQUARE+ toC GamepadButton'Triangle = c'GLFW_GAMEPAD_BUTTON_TRIANGLE++instance C CUChar GamepadButtonState where+ fromC v+ | v == c'GLFW_PRESS = GamepadButtonState'Pressed+ | v == c'GLFW_RELEASE = GamepadButtonState'Released+ | otherwise = error $ "C CUChar GamepadButtonState fromC: " ++ show v+ toC GamepadButtonState'Pressed = c'GLFW_PRESS+ toC GamepadButtonState'Released = c'GLFW_RELEASE++instance C CInt GamepadAxis where+ fromC v+ | v == c'GLFW_GAMEPAD_AXIS_LEFT_X = GamepadAxis'LeftX+ | v == c'GLFW_GAMEPAD_AXIS_RIGHT_X = GamepadAxis'RightX+ | v == c'GLFW_GAMEPAD_AXIS_LEFT_Y = GamepadAxis'LeftY+ | v == c'GLFW_GAMEPAD_AXIS_RIGHT_Y = GamepadAxis'RightY+ | v == c'GLFW_GAMEPAD_AXIS_LEFT_TRIGGER = GamepadAxis'LeftTrigger+ | v == c'GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER = GamepadAxis'RightTrigger+ | otherwise = error $ "C CInt GamepadAxis fromC: " ++ show v+ toC GamepadAxis'LeftX = c'GLFW_GAMEPAD_AXIS_LEFT_X+ toC GamepadAxis'RightX = c'GLFW_GAMEPAD_AXIS_RIGHT_X+ toC GamepadAxis'LeftY = c'GLFW_GAMEPAD_AXIS_LEFT_Y+ toC GamepadAxis'RightY = c'GLFW_GAMEPAD_AXIS_RIGHT_Y+ toC GamepadAxis'LeftTrigger = c'GLFW_GAMEPAD_AXIS_LEFT_TRIGGER+ toC GamepadAxis'RightTrigger = c'GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER++instance C CInt MouseButton where+ fromC v+ | v == c'GLFW_MOUSE_BUTTON_1 = MouseButton'1+ | v == c'GLFW_MOUSE_BUTTON_2 = MouseButton'2+ | v == c'GLFW_MOUSE_BUTTON_3 = MouseButton'3+ | v == c'GLFW_MOUSE_BUTTON_4 = MouseButton'4+ | v == c'GLFW_MOUSE_BUTTON_5 = MouseButton'5+ | v == c'GLFW_MOUSE_BUTTON_6 = MouseButton'6+ | v == c'GLFW_MOUSE_BUTTON_7 = MouseButton'7+ | v == c'GLFW_MOUSE_BUTTON_8 = MouseButton'8+ | otherwise = error $ "C CInt MouseButton fromC: " ++ show v+ toC MouseButton'1 = c'GLFW_MOUSE_BUTTON_1+ toC MouseButton'2 = c'GLFW_MOUSE_BUTTON_2+ toC MouseButton'3 = c'GLFW_MOUSE_BUTTON_3+ toC MouseButton'4 = c'GLFW_MOUSE_BUTTON_4+ toC MouseButton'5 = c'GLFW_MOUSE_BUTTON_5+ toC MouseButton'6 = c'GLFW_MOUSE_BUTTON_6+ toC MouseButton'7 = c'GLFW_MOUSE_BUTTON_7+ toC MouseButton'8 = c'GLFW_MOUSE_BUTTON_8++instance C CInt MouseButtonState where+ fromC v+ | v == c'GLFW_PRESS = MouseButtonState'Pressed+ | v == c'GLFW_RELEASE = MouseButtonState'Released+ | otherwise = error $ "C CInt MouseButtonState fromC: " ++ show v+ toC MouseButtonState'Pressed = c'GLFW_PRESS+ toC MouseButtonState'Released = c'GLFW_RELEASE++instance C CInt CursorState where+ fromC v+ | v == c'GLFW_TRUE = CursorState'InWindow+ | v == c'GLFW_FALSE = CursorState'NotInWindow+ | otherwise = error $ "C CInt CursorState fromC: " ++ show v+ toC CursorState'InWindow = c'GLFW_TRUE+ toC CursorState'NotInWindow = c'GLFW_FALSE++instance C CInt CursorInputMode where+ fromC v+ | v == c'GLFW_CURSOR_NORMAL = CursorInputMode'Normal+ | v == c'GLFW_CURSOR_HIDDEN = CursorInputMode'Hidden+ | v == c'GLFW_CURSOR_DISABLED = CursorInputMode'Disabled+ | otherwise = error $ "C CInt CursorInputMode fromC: " ++ show v+ toC CursorInputMode'Normal = c'GLFW_CURSOR_NORMAL+ toC CursorInputMode'Hidden = c'GLFW_CURSOR_HIDDEN+ toC CursorInputMode'Disabled = c'GLFW_CURSOR_DISABLED++instance C CInt StickyKeysInputMode where+ fromC v+ | v == c'GLFW_TRUE = StickyKeysInputMode'Enabled+ | v == c'GLFW_FALSE = StickyKeysInputMode'Disabled+ | otherwise = error $ "C CInt StickyKeysInputMode fromC: " ++ show v+ toC StickyKeysInputMode'Enabled = c'GLFW_TRUE+ toC StickyKeysInputMode'Disabled = c'GLFW_FALSE++instance C CInt StickyMouseButtonsInputMode where+ fromC v+ | v == c'GLFW_TRUE = StickyMouseButtonsInputMode'Enabled+ | v == c'GLFW_FALSE = StickyMouseButtonsInputMode'Disabled+ | otherwise = error $ "C CInt StickyMouseButtonsInputMode fromC: " ++ show v+ toC StickyMouseButtonsInputMode'Enabled = c'GLFW_TRUE+ toC StickyMouseButtonsInputMode'Disabled = c'GLFW_FALSE++instance C CInt WindowAttrib where+ fromC v+ | v == c'GLFW_DECORATED = WindowAttrib'Decorated+ | v == c'GLFW_RESIZABLE = WindowAttrib'Resizable+ | v == c'GLFW_FLOATING = WindowAttrib'Floating+ | v == c'GLFW_AUTO_ICONIFY = WindowAttrib'AutoIconify+ | v == c'GLFW_FOCUS_ON_SHOW = WindowAttrib'FocusOnShow+ | v == c'GLFW_HOVERED = WindowAttrib'Hovered+ | otherwise = error $ "C CInt WindowAttrib fromC: " ++ show v+ toC WindowAttrib'Decorated = c'GLFW_DECORATED+ toC WindowAttrib'Resizable = c'GLFW_RESIZABLE+ toC WindowAttrib'Floating = c'GLFW_FLOATING+ toC WindowAttrib'AutoIconify = c'GLFW_AUTO_ICONIFY+ toC WindowAttrib'FocusOnShow = c'GLFW_FOCUS_ON_SHOW+ toC WindowAttrib'Hovered = c'GLFW_HOVERED++--------------------------------------------------------------------------------++{-# ANN module "HLint: ignore Use camelCase" #-}
+ Graphics/UI/GLFW/Types.hs view
@@ -0,0 +1,647 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++-- | The types of the package. This module is considered "internal", and the+-- types are re-exported from Graphics.UI.GLFW as necessary.+module Graphics.UI.GLFW.Types where++--------------------------------------------------------------------------------++import Control.DeepSeq (NFData)+import Data.Data (Data)+import Data.IORef (IORef)+import Data.Typeable (Typeable)+import Data.Word (Word8)+import Foreign.Ptr (Ptr)+import Foreign.C.Types (CUChar(..))+import GHC.Generics++import Bindings.GLFW++--------------------------------------------------------------------------------+-- Error handling++-- | An enum for one of the <http://www.glfw.org/docs/3.3/group__errors.html#ga196e125ef261d94184e2b55c05762f14 GLFW error codes>.+data Error =+ Error'NotInitialized -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#ga2374ee02c177f12e1fa76ff3ed15e14a doc>+ | Error'NoCurrentContext -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#gaa8290386e9528ccb9e42a3a4e16fc0d0 doc>+ | Error'InvalidEnum -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#ga76f6bb9c4eea73db675f096b404593ce doc>+ | Error'InvalidValue -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#gaaf2ef9aa8202c2b82ac2d921e554c687 doc>+ | Error'OutOfMemory -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#ga9023953a2bcb98c2906afd071d21ee7f doc>+ | Error'ApiUnavailable -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#ga56882b290db23261cc6c053c40c2d08e doc>+ | Error'VersionUnavailable -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#gad16c5565b4a69f9c2a9ac2c0dbc89462 doc>+ | Error'PlatformError -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#gad44162d78100ea5e87cdd38426b8c7a1 doc>+ | Error'FormatUnavailable -- ^ <http://www.glfw.org/docs/3.3/group__errors.html#ga196e125ef261d94184e2b55c05762f14 doc>+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData Error++--------------------------------------------------------------------------------+-- Initialization and version information++-- | Initialization hints are set before glfwInit and affect how the library+-- behaves until termination. Hints are set with glfwInitHint. See+-- <https://www.glfw.org/docs/3.3/intro_guide.html#init_hints Init Hints>+data InitHint+ = InitHint'JoystickHatButtons+ | InitHint'CocoaChdirResources+ | InitHint'CocoaMenubar+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData InitHint++-- | The library version of the GLFW implementation in use.+-- See <http://www.glfw.org/docs/3.3/intro.html#intro_version Version Management>+data Version = Version+ { versionMajor :: {-# UNPACK #-} !Int+ , versionMinor :: {-# UNPACK #-} !Int+ , versionRevision :: {-# UNPACK #-} !Int+ } deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData Version++--------------------------------------------------------------------------------+-- Monitor handling++-- | Represents a physical monitor that's currently connected.+-- See the <http://www.glfw.org/docs/3.3/monitor.html Monitor Guide>+newtype Monitor = Monitor+ { unMonitor :: Ptr C'GLFWmonitor+ } deriving (Data, Eq, Ord, Show, Typeable, Generic)++-- | Part of the t'Graphics.UI.GLFW.MonitorCallback', for when a monitor gets+-- connected or disconnected.+data MonitorState =+ MonitorState'Connected+ | MonitorState'Disconnected+ deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData MonitorState++-- | See <http://www.glfw.org/docs/3.3/monitor.html#monitor_modes Video Modes>+data VideoMode = VideoMode+ { videoModeWidth :: {-# UNPACK #-} !Int+ , videoModeHeight :: {-# UNPACK #-} !Int+ , videoModeRedBits :: {-# UNPACK #-} !Int+ , videoModeGreenBits :: {-# UNPACK #-} !Int+ , videoModeBlueBits :: {-# UNPACK #-} !Int+ , videoModeRefreshRate :: {-# UNPACK #-} !Int+ } deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData VideoMode++-- | Lets you adjust the gamma of a monitor. To ensure that only valid values are created, use 'makeGammaRamp'.+-- See <http://www.glfw.org/docs/3.3/monitor.html#monitor_gamma Gamma Ramp>.+data GammaRamp = GammaRamp+ -- NOTE: It would be bad to give clients a way to construct invalid gamma ramps+ -- with lists of unequal length, so this constructor should not be exported.+ { gammaRampRed :: [Int]+ , gammaRampGreen :: [Int]+ , gammaRampBlue :: [Int]+ } deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData GammaRamp++-- | Smart constructor for a 'GammaRamp'.+makeGammaRamp :: [Int] -> [Int] -> [Int] -> Maybe GammaRamp+makeGammaRamp rs gs bs+ | lengthsEqual = Just $ GammaRamp rs gs bs+ | otherwise = Nothing+ where+ lengthsEqual =+ let rsl = length rs+ gsl = length gs+ bsl = length bs+ in rsl == gsl && gsl == bsl++--------------------------------------------------------------------------------+-- Window handling++-- | Collects all the callbacks that can be associated with a Window into a single place.+data WindowCallbacks = WindowCallbacks+ { storedCharFun :: !(IORef C'GLFWcharfun)+ , storedCharModsFun :: !(IORef C'GLFWcharmodsfun)+ , storedCursorEnterFun :: !(IORef C'GLFWcursorenterfun)+ , storedCursorPosFun :: !(IORef C'GLFWcursorposfun)+ , storedFramebufferSizeFun :: !(IORef C'GLFWframebuffersizefun)+ , storedKeyFun :: !(IORef C'GLFWkeyfun)+ , storedMouseButtonFun :: !(IORef C'GLFWmousebuttonfun)+ , storedScrollFun :: !(IORef C'GLFWscrollfun)+ , storedWindowCloseFun :: !(IORef C'GLFWwindowclosefun)+ , storedWindowFocusFun :: !(IORef C'GLFWwindowfocusfun)+ , storedWindowIconifyFun :: !(IORef C'GLFWwindowiconifyfun)+ , storedWindowPosFun :: !(IORef C'GLFWwindowposfun)+ , storedWindowRefreshFun :: !(IORef C'GLFWwindowrefreshfun)+ , storedWindowSizeFun :: !(IORef C'GLFWwindowsizefun)+ , storedWindowContentScaleFun :: !(IORef C'GLFWwindowcontentscalefun)+ , storedWindowMaximizeFun :: !(IORef C'GLFWwindowmaximizefun)+ , storedDropFun :: !(IORef C'GLFWdropfun)+ }++-- | Represents a GLFW window value.+-- See the <http://www.glfw.org/docs/3.3/window.html Window Guide>+newtype Window = Window+ { unWindow :: Ptr C'GLFWwindow+ } deriving (Data, Eq, Ord, Show, Typeable, Generic)++-- | Lets you set various window hints before creating a 'Window'.+-- See <http://www.glfw.org/docs/3.3/window.html#window_hints Window Hints>,+-- particularly <http://www.glfw.org/docs/3.3/window.html#window_hints_values Supported and Default Values>.+data WindowHint =+ WindowHint'Resizable !Bool+ | WindowHint'Visible !Bool+ | WindowHint'Decorated !Bool+ | WindowHint'RedBits !(Maybe Int)+ | WindowHint'GreenBits !(Maybe Int)+ | WindowHint'BlueBits !(Maybe Int)+ | WindowHint'AlphaBits !(Maybe Int)+ | WindowHint'DepthBits !(Maybe Int)+ | WindowHint'StencilBits !(Maybe Int)+ | WindowHint'AccumRedBits !(Maybe Int)+ | WindowHint'AccumGreenBits !(Maybe Int)+ | WindowHint'AccumBlueBits !(Maybe Int)+ | WindowHint'AccumAlphaBits !(Maybe Int)+ | WindowHint'AuxBuffers !(Maybe Int)+ | WindowHint'Samples !(Maybe Int)+ | WindowHint'RefreshRate !(Maybe Int)+ | WindowHint'DoubleBuffer !Bool+ | WindowHint'Stereo !Bool+ | WindowHint'sRGBCapable !Bool+ | WindowHint'Floating !Bool+ | WindowHint'Focused !Bool+ | WindowHint'Maximized !Bool+ | WindowHint'AutoIconify !Bool+ | WindowHint'ClientAPI !ClientAPI+ | WindowHint'ContextCreationAPI !ContextCreationAPI+ | WindowHint'ContextVersionMajor {-# UNPACK #-} !Int+ | WindowHint'ContextVersionMinor {-# UNPACK #-} !Int+ | WindowHint'ContextRobustness !ContextRobustness+ | WindowHint'ContextReleaseBehavior !ContextReleaseBehavior+ | WindowHint'ContextNoError !Bool+ | WindowHint'OpenGLForwardCompat !Bool+ | WindowHint'OpenGLDebugContext !Bool+ | WindowHint'OpenGLProfile !OpenGLProfile+ | WindowHint'TransparentFramebuffer !Bool+ | WindowHint'CenterCursor !Bool+ | WindowHint'FocusOnShow !Bool+ | WindowHint'ScaleToMonitor !Bool+ | WindowHint'CocoaRetinaFramebuffer !Bool+ | WindowHint'CocoaGraphicsSwitching !Bool+ | WindowHint'CocoaFrameName !String+ | WindowHint'X11ClassName !String+ | WindowHint'X11InstanceName !String+ deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData WindowHint++-- | A window-specific attribute.+-- See <https://www.glfw.org/docs/3.3/window_guide.html#window_attribs Window Attributes>+data WindowAttrib+ = WindowAttrib'Decorated+ | WindowAttrib'Resizable+ | WindowAttrib'Floating+ | WindowAttrib'AutoIconify+ | WindowAttrib'FocusOnShow+ | WindowAttrib'Hovered+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData WindowAttrib++-- | The OpenGL robustness strategy.+data ContextRobustness =+ ContextRobustness'NoRobustness+ | ContextRobustness'NoResetNotification+ | ContextRobustness'LoseContextOnReset+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData ContextRobustness++-- | The OpenGL profile.+data OpenGLProfile =+ OpenGLProfile'Any+ | OpenGLProfile'Compat+ | OpenGLProfile'Core+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData OpenGLProfile++-- | The type of OpenGL to create a context for.+data ClientAPI =+ ClientAPI'NoAPI+ | ClientAPI'OpenGL+ | ClientAPI'OpenGLES+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData ClientAPI++-- | The type of API to use for context creation.+-- See the <http://www.glfw.org/docs/latest/window_guide.html Window Guide> for+-- more information.+--+-- This is a hard constraint. If no client API is requested, this hint is+-- ignored. Best practice is to stick to one API or the other, otherwise may+-- segfault on Linux. OS X does not support the EGL API and will fail if this+-- hint is used.+data ContextCreationAPI+ = ContextCreationAPI'Native+ | ContextCreationAPI'EGL+ | ContextCreationAPI'OSMesa+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData ContextCreationAPI++-- | The context release behavior.+-- See the <http://www.glfw.org/docs/latest/window_guide.html Window Guide> for+-- more information.+--+-- Context release behaviors are described in detail by the+-- <https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_context_flush_control.txt KHR_context_flush_control>+-- extension.+data ContextReleaseBehavior+ = ContextReleaseBehavior'Any+ | ContextReleaseBehavior'None+ | ContextReleaseBehavior'Flush+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData ContextReleaseBehavior++--------------------------------------------------------------------------------+-- Input handling++-- | Part of the <http://www.glfw.org/docs/3.3/input.html#input_keyboard Keyboard Input> system.+data Key =+ Key'Unknown+ | Key'Space+ | Key'Apostrophe+ | Key'Comma+ | Key'Minus+ | Key'Period+ | Key'Slash+ | Key'0+ | Key'1+ | Key'2+ | Key'3+ | Key'4+ | Key'5+ | Key'6+ | Key'7+ | Key'8+ | Key'9+ | Key'Semicolon+ | Key'Equal+ | Key'A+ | Key'B+ | Key'C+ | Key'D+ | Key'E+ | Key'F+ | Key'G+ | Key'H+ | Key'I+ | Key'J+ | Key'K+ | Key'L+ | Key'M+ | Key'N+ | Key'O+ | Key'P+ | Key'Q+ | Key'R+ | Key'S+ | Key'T+ | Key'U+ | Key'V+ | Key'W+ | Key'X+ | Key'Y+ | Key'Z+ | Key'LeftBracket+ | Key'Backslash+ | Key'RightBracket+ | Key'GraveAccent+ | Key'World1+ | Key'World2+ | Key'Escape+ | Key'Enter+ | Key'Tab+ | Key'Backspace+ | Key'Insert+ | Key'Delete+ | Key'Right+ | Key'Left+ | Key'Down+ | Key'Up+ | Key'PageUp+ | Key'PageDown+ | Key'Home+ | Key'End+ | Key'CapsLock+ | Key'ScrollLock+ | Key'NumLock+ | Key'PrintScreen+ | Key'Pause+ | Key'F1+ | Key'F2+ | Key'F3+ | Key'F4+ | Key'F5+ | Key'F6+ | Key'F7+ | Key'F8+ | Key'F9+ | Key'F10+ | Key'F11+ | Key'F12+ | Key'F13+ | Key'F14+ | Key'F15+ | Key'F16+ | Key'F17+ | Key'F18+ | Key'F19+ | Key'F20+ | Key'F21+ | Key'F22+ | Key'F23+ | Key'F24+ | Key'F25+ | Key'Pad0+ | Key'Pad1+ | Key'Pad2+ | Key'Pad3+ | Key'Pad4+ | Key'Pad5+ | Key'Pad6+ | Key'Pad7+ | Key'Pad8+ | Key'Pad9+ | Key'PadDecimal+ | Key'PadDivide+ | Key'PadMultiply+ | Key'PadSubtract+ | Key'PadAdd+ | Key'PadEnter+ | Key'PadEqual+ | Key'LeftShift+ | Key'LeftControl+ | Key'LeftAlt+ | Key'LeftSuper+ | Key'RightShift+ | Key'RightControl+ | Key'RightAlt+ | Key'RightSuper+ | Key'Menu+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData Key++-- | The state of an individual key when 'Graphics.UI.GLFW.getKey' is called.+data KeyState =+ KeyState'Pressed+ | KeyState'Released+ | KeyState'Repeating+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData KeyState++-- | For use with the <http://www.glfw.org/docs/3.3/input.html#joystick Joystick Input> system.+data Joystick =+ Joystick'1+ | Joystick'2+ | Joystick'3+ | Joystick'4+ | Joystick'5+ | Joystick'6+ | Joystick'7+ | Joystick'8+ | Joystick'9+ | Joystick'10+ | Joystick'11+ | Joystick'12+ | Joystick'13+ | Joystick'14+ | Joystick'15+ | Joystick'16+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData Joystick++-- | If a given joystick button is pressed or not when+-- 'Graphics.UI.GLFW.getJoystickButtons' is called.+data JoystickButtonState =+ JoystickButtonState'Pressed+ | JoystickButtonState'Released+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData JoystickButtonState++-- | Part of the t'Graphics.UI.GLFW.JoystickCallback', for when a monitor gets+-- connected or disconnected.+data JoystickState+ = JoystickState'Connected+ | JoystickState'Disconnected+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData JoystickState++-- | The valid hat states of a joystick. Part of the+-- <https://www.glfw.org/docs/3.3/input_guide.html#joystick_hat joystick hat>+-- system.+data JoystickHatState+ = JoystickHatState'Centered+ | JoystickHatState'Up+ | JoystickHatState'Right+ | JoystickHatState'Down+ | JoystickHatState'Left+ | JoystickHatState'RightUp+ | JoystickHatState'RightDown+ | JoystickHatState'LeftUp+ | JoystickHatState'LeftDown+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData JoystickHatState++-- | Part of the <http://www.Graphics.UI.GLFW.org/docs/3.3/input.html#input_mouse Mouse Input> system.+data MouseButton =+ MouseButton'1+ | MouseButton'2+ | MouseButton'3+ | MouseButton'4+ | MouseButton'5+ | MouseButton'6+ | MouseButton'7+ | MouseButton'8+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData MouseButton++-- | If the mouse button is pressed or not when 'Graphics.UI.GLFW.getMouseButton' is+-- called.+data MouseButtonState =+ MouseButtonState'Pressed+ | MouseButtonState'Released+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData MouseButtonState++-- | If the mouse's cursor is in the window or not.+data CursorState =+ CursorState'InWindow+ | CursorState'NotInWindow+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData CursorState++-- | Allows for special forms of mouse input.+-- See <http://www.glfw.org/docs/3.3/input.html#cursor_mode Cursor Modes>+data CursorInputMode =+ CursorInputMode'Normal+ | CursorInputMode'Hidden+ | CursorInputMode'Disabled+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData CursorInputMode++-- | When sticky keys is enabled, once a key is pressed it will remain pressed+-- at least until the state is polled with 'Graphics.UI.GLFW.getKey'. After+-- that, if the key has been released it will switch back to released. This+-- helps prevent problems with low-resolution polling missing key pressed. Note+-- that use of the callbacks to avoid this problem the the recommended route,+-- and this is just for a fallback.+data StickyKeysInputMode =+ StickyKeysInputMode'Enabled+ | StickyKeysInputMode'Disabled+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData StickyKeysInputMode++-- | This is the mouse version of "StickyKeysInputMode".+data StickyMouseButtonsInputMode =+ StickyMouseButtonsInputMode'Enabled+ | StickyMouseButtonsInputMode'Disabled+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData StickyMouseButtonsInputMode++-- | Modifier keys that were pressed as part of another keypress event.+data ModifierKeys = ModifierKeys+ { modifierKeysShift :: !Bool+ , modifierKeysControl :: !Bool+ , modifierKeysAlt :: !Bool+ , modifierKeysSuper :: !Bool+ , modifierKeysCapsLock :: !Bool+ , modifierKeysNumLock :: !Bool+ } deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData ModifierKeys++-- | The different types of buttons we can find on a Gamepad.+data GamepadButton+ = GamepadButton'A+ | GamepadButton'B+ | GamepadButton'X+ | GamepadButton'Y+ | GamepadButton'LeftBumper+ | GamepadButton'RightBumper+ | GamepadButton'Back+ | GamepadButton'Start+ | GamepadButton'Guide+ | GamepadButton'LeftThumb+ | GamepadButton'RightThumb+ | GamepadButton'DpadUp+ | GamepadButton'DpadRight+ | GamepadButton'DpadDown+ | GamepadButton'DpadLeft+ | GamepadButton'Cross+ | GamepadButton'Circle+ | GamepadButton'Square+ | GamepadButton'Triangle+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData GamepadButton++-- | The states in which the gamepad buttons are found+data GamepadButtonState+ = GamepadButtonState'Pressed+ | GamepadButtonState'Released+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData GamepadButtonState++-- | The different axes along which we can measure continuous input on a Gamepad+data GamepadAxis+ = GamepadAxis'LeftX+ | GamepadAxis'LeftY+ | GamepadAxis'RightX+ | GamepadAxis'RightY+ | GamepadAxis'LeftTrigger+ | GamepadAxis'RightTrigger+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData GamepadAxis++-- | This describes the input state of a gamepad+data GamepadState = GamepadState+ { getButtonState :: GamepadButton -> GamepadButtonState+ -- ^ Returns the current state of the given button+ , getAxisState :: GamepadAxis -> Float+ -- ^ Returns a value in the range [-1.0, 1.0] for the+ -- given game axis+ } deriving (Typeable, Generic)++instance Eq GamepadState where+ a == b =+ let compareSt f x = (&& (f a x == f b x))+ in foldr (compareSt getButtonState) True [minBound..maxBound] &&+ foldr (compareSt getAxisState) True [minBound..maxBound]++instance NFData GamepadState++deriving instance Data CUChar++-- | GLFW image data, for setting up custom mouse cursor appearnaces.+data Image = Image+ { imageWidth :: {-# UNPACK #-} !Int+ , imageHeight :: {-# UNPACK #-} !Int+ , imagePixels :: [CUChar]+ } deriving (Data, Eq, Ord, Read, Show, Typeable, Generic)++-- | Create an image given the function to generate 8-bit RGBA values based on+-- the pixel location.+mkImage :: Int -> Int -> (Int -> Int -> (Word8, Word8, Word8, Word8)) -> Image+mkImage width height gen = Image+ { imageWidth = width+ , imageHeight = height+ , imagePixels = [ CUChar channel | y <- [0..(height - 1)]+ , x <- [0..(width - 1)]+ , let (r, g, b, a) = gen x y+ , channel <- [r, g, b, a]+ ]+ }++instance NFData Image++-- | Represents a GLFW cursor.+newtype Cursor = Cursor+ { unCursor :: Ptr C'GLFWcursor+ } deriving (Data, Eq, Ord, Show, Typeable, Generic)++-- | Lets you use one of the standard cursor appearnaces that the local+-- system theme provides for.+-- See <http://www.glfw.org/docs/3.3/input.html#cursor_standard Standard Cursor Creation>.+data StandardCursorShape =+ StandardCursorShape'Arrow+ | StandardCursorShape'IBeam+ | StandardCursorShape'Crosshair+ | StandardCursorShape'Hand+ | StandardCursorShape'HResize+ | StandardCursorShape'VResize+ deriving (Bounded, Data, Enum, Eq, Ord, Read, Show, Typeable, Generic)++instance NFData StandardCursorShape++--------------------------------------------------------------------------------++{-# ANN module "HLint: ignore Use camelCase" #-}
LICENSE view
@@ -1,4 +1,4 @@-Copyright Brian Lewis <brian@lorf.org> 2009+Copyright Brian Lewis <brian@lorf.org> 2009-2013 All rights reserved.
− Makefile
@@ -1,39 +0,0 @@-GHC := ghc -ignore-dot-ghci-GCCFLAGS := $(shell $(GHC) --info | $(GHC) -e "fmap read getContents >>= \- putStrLn . unwords . read . Data.Maybe.fromJust . lookup \- \"Gcc Linker flags\"")-FRAMEWORK := -framework Cocoa -framework OpenGL-GLFW_FLAG := $(GCCFLAGS) -O2 -msse2 -fno-common -Iglfw/include -Iglfw/lib \- -Iglfw/lib/cocoa $(CFLAGS)-SRC_DIR := glfw/lib/cocoa-GLFW_DIR := glfw/lib-BUILD_DIR := build--OBJ_C_SRC := $(wildcard $(SRC_DIR)/*.m)-C_SRC := $(wildcard $(SRC_DIR)/*.c)-GLFW_SRC := $(wildcard $(GLFW_DIR)/*.c)-OBJS := $(addprefix $(BUILD_DIR)/, $(OBJ_C_SRC:.m=.o) $(C_SRC:.c=.o))--all: $(BUILD_DIR)/libglfw.dylib--$(BUILD_DIR)/libglfw.dylib: $(OBJS)- $(CC) -dynamiclib -Wl,-single_module -compatibility_version 1 \- -current_version 1 \- $(GLFW_FLAG) -o $@ $(OBJS) $(GLFW_SRC) $(FRAMEWORK)--.PHONY: $(BUILD_DIR)/$(SRC_DIR)/.build-tag--$(BUILD_DIR)/$(SRC_DIR)/.build-tag:- mkdir -p $(BUILD_DIR)/$(SRC_DIR)- touch $@--$(OBJS): $(BUILD_DIR)/$(SRC_DIR)/.build-tag--$(BUILD_DIR)/%.o : %.c- $(CC) -c $(GLFW_FLAG) $< -o $@-$(BUILD_DIR)/%.o : %.m- $(CC) -c $(GLFW_FLAG) $< -o $@--.PHONY: clean-clean:- $(RM) -rf $(BUILD_DIR)
README.md view
@@ -1,26 +1,44 @@-Differences between GLFW and GLFW-b 2011.03-===========================================+GLFW-b+======+[](http://hackage.haskell.org/package/GLFW-b) -* GLFW binds to version 2.6 of the GLFW C library. GLFW-b binds to 2.7.+## Description -* Some GLFW functions return OpenGL {Gettable,Settable}StateVars. I don't like- this because it adds an extra step to extract a value and causes GLFW to be- dependent on OpenGL. GLFW-b doesn't depend on OpenGL.+[Haskell][1] bindings to [GLFW][2], an Open Source, multi-platform library for+creating windows with OpenGL contexts and managing input and events. -* GLFW sometimes depends on GLFW C library internally defined values. GLFW-b- doesn't. For example, GLFW-b doesn't assume that GL\_FALSE = 0. I don't think- this makes a difference in practice, but it makes me feel better.+GLFW-b depends on [bindings-GLFW][3], which, as of the time of this writing,+binds to GLFW 3.3, [released 2019-04-15][4]. -* GLFW sometimes assumes that certain Haskell types are equivalent to certain C- types, e.g. Int and int. GLFW-b doesn't. GLFW-b always uses the appropriate- type from Foreign.C.Types. I don't think this makes a difference in practice,- but it makes me feel better.+For a demonstration of GLFW-b, see [GLFW-b-demo][5]. -* GLFW contains workarounds for a bugs in GHC < 6.10 FFI. GLFW-b doesn't.+When running GLFW-b in GHCI, don't forget to -* GLFW's API is pretty faithful to the C API. GLFW-b prefers to use full words- and self-explanatory function names.+ :set -fno-ghci-sandbox -* In GLFW-b, registering hints and opening a window are combined into one step.+since GHCI can (and might) run each line of your code in a fresh unbounded+thread. -* GLFW has support for loading textures and rendering strings. GLFW-b doesn't.+## Contributing++This package uses git-flow as development model, in short that means that:++1. New features should be added to "develop" branch.+2. "master" branch is reserved for stable releases.+3. Patches for bugs related with previous releases should always be done in+ "hotfixes" branch.+4. All merge commits to master from "hotfixes" should be done+ using the "--no-ff" flag and from "develop" should avoid merging commits.++Until we have a defined road-map we are going to leave out "release+"branches" and "feature branches". For more information about this development+model please refer to [this site.][6]++Thanks you, and happy coding.++[1]: http://www.haskell.org/+[2]: http://www.glfw.org/+[3]: https://github.com/bsl/bindings-GLFW+[4]: http://www.glfw.org/Version-3.3-released.html+[5]: https://github.com/bsl/GLFW-b-demo+[6]: http://nvie.com/posts/a-successful-git-branching-model/
Setup.hs view
@@ -1,109 +1,6 @@ module Main (main) where -import Distribution.System ( buildOS, OS(..) )-import Distribution.Simple.InstallDirs ( libdir )-import Distribution.Simple.Setup ( ConfigFlags, fromFlag, configVerbosity- , InstallFlags, defaultCopyFlags- , installDistPref, CleanFlags- , toFlag, CopyDest(NoCopyDest)- , installVerbosity, cleanVerbosity- , CopyFlags(..)- , configProgramArgs )-import Distribution.Simple.Utils ( rawSystemExit, installOrdinaryFile )-import Distribution.Verbosity ( verbose, Verbosity )-import Distribution.Simple ( defaultMainWithHooks- , simpleUserHooks- , buildHook, Args, confHook- , UserHooks(preConf, preClean,- postCopy, postInst) )-import Distribution.Simple.LocalBuildInfo ( absoluteInstallDirs- , LocalBuildInfo(..) )-import Distribution.PackageDescription ( emptyBuildInfo- , updatePackageDescription- , HookedBuildInfo- , BuildInfo(..)- , PackageDescription )-import System.FilePath ( (</>) )--dynamicLibDir :: FilePath-dynamicLibDir = "build"+import Distribution.Simple (defaultMain) main :: IO ()-main = defaultMainWithHooks simpleUserHooks- { preConf = \a f -> makeGlfw a f >> preConf simpleUserHooks a f- , confHook = \a cfs -> do- let pkgForce = [("ghc-pkg",["--force"]) | buildOS == OSX ]- cfs' = cfs { configProgramArgs = configProgramArgs cfs ++ pkgForce }- confHook simpleUserHooks a cfs'- , preClean = \a f -> makeClean a f >> preClean simpleUserHooks a f- , buildHook = \pkgDesc lbi h f ->- buildHook simpleUserHooks (glfwPkgDesc pkgDesc) lbi h f- , postCopy = postCopyGlfw- , postInst = postInstGlfw- }--makeGlfw :: Args -> ConfigFlags -> IO ()-makeGlfw _ flags = do- let verbosity = fromFlag $ configVerbosity flags- case buildOS of- OSX -> do- let make = rawSystemExit verbosity "env" $- "make" : (if verbosity >= verbose then [] else ["--quiet"])- make- _ -> return ()--makeClean :: Args -> CleanFlags -> IO ()-makeClean _ flags = do- let verbosity = fromFlag $ cleanVerbosity flags- case buildOS of- OSX -> do- let make = rawSystemExit verbosity "env" $- ["make"] ++ (if verbosity >= verbose then [] else ["--quiet"])- ++ ["clean"]- make- _ -> return ()--glfwPkgDesc :: PackageDescription -> PackageDescription-glfwPkgDesc pkgDesc =- case buildOS of- OSX -> updatePackageDescription libDirGlfw pkgDesc- _ -> pkgDesc--libDirGlfw :: HookedBuildInfo-libDirGlfw = (Just buildinfo, [])- where buildinfo = emptyBuildInfo- { extraLibDirs = [ dynamicLibDir ] }--postInstGlfw :: Args -> InstallFlags -> PackageDescription- -> LocalBuildInfo -> IO ()-postInstGlfw _ flags pkgDesc lbi =- case buildOS of- OSX -> do- let copyflags = defaultCopyFlags- { copyDistPref = installDistPref flags- , copyDest = toFlag NoCopyDest- , copyVerbosity = installVerbosity flags- }- postCopyGlfw undefined copyflags pkgDesc lbi- _ -> return ()--postCopyGlfw :: Args -> CopyFlags -> PackageDescription- -> LocalBuildInfo -> IO ()-postCopyGlfw _ flags pkgDesc lbi =- case buildOS of- OSX -> do- let installDirs = absoluteInstallDirs pkgDesc lbi- . fromFlag . copyDest $ flags- libPref = libdir installDirs- verbosity = fromFlag $ copyVerbosity flags- copyDynamic dest f = installOrdinaryFile verbosity (dynamicLibDir</>f) (dest</>f)- maybe (return ()) (copyDynamic libPref) (Just dynamicLibName)- install_name_tool verbosity (libPref</>dynamicLibName)- _ -> return ()--install_name_tool :: Verbosity -> FilePath -> IO ()-install_name_tool v fp = rawSystemExit v "env" $- ["install_name_tool"] ++ ["-id"] ++ [fp] ++ [fp]--dynamicLibName :: FilePath-dynamicLibName = "libglfw.dylib"+main = defaultMain
+ TODO view
@@ -0,0 +1,16 @@+Improve everything about testing.+Improve existing tests.+Add more tests.++Coordinate with GLFW C-library maintainer about any strange behavior.+1.) Cursor is in window. Left click.+ Events seen:+ cursor enter: CursorState'NotInWindow+ cursor enter: CursorState'InWindow+ mouse button: MouseButton'1 MouseButtonState'Pressed [mod keys: none]+ mouse button: MouseButton'1 MouseButtonState'Released [mod keys: none]+ The CursorState events seem spurious -- the cursor did not leave the+ window.++getPressedKeys?+getJoystickAxesN?
+ Test.hs view
@@ -0,0 +1,683 @@+-- base+import Control.Concurrent (threadDelay)+import Control.Monad (forM_)+import Data.Char (isAscii)+import Data.Bits (xor)+import Data.List (intercalate, isPrefixOf)+import Data.Maybe (isNothing)++-- HUnit+import Test.HUnit ((@?=), assertBool, assertFailure)++-- test-framework+import Test.Framework (Test, defaultMain, testGroup)++-- test-framework-hunit+import Test.Framework.Providers.HUnit (testCase)++-- GLFW-b+import qualified Graphics.UI.GLFW as GLFW++--------------------------------------------------------------------------------++main :: IO ()+main = do+ GLFW.setErrorCallback $ Just $ \e s ->+ putStrLn $ unwords ["###", show e, show s]++ GLFW.initHint GLFW.InitHint'CocoaChdirResources False+ True <- GLFW.init++ Just mon <- GLFW.getPrimaryMonitor++ GLFW.windowHint $ GLFW.WindowHint'Visible False+ GLFW.windowHint $ GLFW.WindowHint'CocoaFrameName "GLFW-b test"+ mwin@(Just win) <- GLFW.createWindow 100 100 "GLFW-b test" Nothing Nothing+ GLFW.makeContextCurrent mwin++ -- Mostly check for compiling+ GLFW.setJoystickCallback $ Just $ \j c -> putStrLn $ concat+ [ show j, " changed state: ", show c ]++ defaultMain $ tests mon win++ -- TODO because of how defaultMain works, this code is not reached+ GLFW.destroyWindow win+ GLFW.terminate++--------------------------------------------------------------------------------++versionMajor, versionMinor, versionRevision :: Int+versionMajor = 3+versionMinor = 3+versionRevision = 9++giveItTime :: IO ()+giveItTime = threadDelay 500000++joysticks :: [GLFW.Joystick]+joysticks =+ [ GLFW.Joystick'1+ , GLFW.Joystick'2+ , GLFW.Joystick'3+ , GLFW.Joystick'4+ , GLFW.Joystick'5+ , GLFW.Joystick'6+ , GLFW.Joystick'7+ , GLFW.Joystick'8+ , GLFW.Joystick'9+ , GLFW.Joystick'10+ , GLFW.Joystick'11+ , GLFW.Joystick'12+ , GLFW.Joystick'13+ , GLFW.Joystick'14+ , GLFW.Joystick'15+ , GLFW.Joystick'16+ ]++between :: Ord a => a -> (a,a) -> Bool+between n (l,h) = n >= l && n <= h++videoModeLooksValid :: GLFW.VideoMode -> Bool+videoModeLooksValid vm = and+ [ GLFW.videoModeWidth vm `between` (0,4000)+ , GLFW.videoModeHeight vm `between` (0,3000)+ , GLFW.videoModeRedBits vm `between` (0, 32)+ , GLFW.videoModeGreenBits vm `between` (0, 32)+ , GLFW.videoModeBlueBits vm `between` (0, 32)+ , GLFW.videoModeRefreshRate vm `between` (0, 120)+ ]++--------------------------------------------------------------------------------++glfwTest :: String -> IO () -> Test+glfwTest name test = testCase name $ do+ GLFW.clearError+ test+ err <- GLFW.getError+ case err of+ Nothing -> return ()+ Just e -> assertFailure $+ concat ["Test '", name, "' generated error: ", show e]++tests :: GLFW.Monitor -> GLFW.Window -> [Test]+tests mon win =+ [ testGroup "Initialization and version information"+ [ testCase "getVersion" test_getVersion+ , testCase "getVersionString" test_getVersionString+ , testCase "getError" test_getError+ ]+ , testGroup "Monitor handling"+ [ glfwTest "getMonitors" test_getMonitors+ , glfwTest "getPrimaryMonitor" test_getPrimaryMonitor+ , glfwTest "getMonitorPos" $ test_getMonitorPos mon+ , glfwTest "getMonitorPhysicalSize" $ test_getMonitorPhysicalSize mon+ , glfwTest "getMonitorWorkarea" $ test_getMonitorWorkarea mon+ , glfwTest "getMonitorName" $ test_getMonitorName mon+ , glfwTest "getVideoModes" $ test_getVideoModes mon+ , glfwTest "getVideoMode" $ test_getVideoMode mon+ , glfwTest "getGamma" $ test_getGammaRamp mon+ ]+ , testGroup "Window handling"+ [ glfwTest "defaultWindowHints" test_defaultWindowHints++ -- Test window attributes+ , glfwTest "getWindowFocused" $ test_getWindowFocused win+ , glfwTest "getWindowResizable" $ test_getWindowResizable win+ , glfwTest "getWindowDecorated" $ test_getWindowDecorated win+ , glfwTest "getWindowClientAPI" $ test_getWindowClientAPI win+ , glfwTest "window context version" $ test_window_context_version win+ , glfwTest "getWindowContextRobustness" $ test_getWindowContextRobustness win+ , glfwTest "getWindowOpenGLForwardCompat" $ test_getWindowOpenGLForwardCompat win+ , glfwTest "getWindowOpenGLDebugContext" $ test_getWindowOpenGLDebugContext win+ , glfwTest "getWindowOpenGLProfile" $ test_getWindowOpenGLProfile win+ , glfwTest "window attribs" $ test_windowAttribs win+ , glfwTest "window close flag" $ test_window_close_flag win+ , glfwTest "setWindowOpacity" $ test_window_opacity win+ , glfwTest "setWindowTitle" $ test_setWindowTitle win+ , glfwTest "window pos" $ test_window_pos win+ , glfwTest "window size" $ test_window_size win+ , glfwTest "getWindowFrameSize" $ test_getWindowFrameSize win+ , glfwTest "getFramebufferSize" $ test_getFramebufferSize win+ , glfwTest "iconification" $ test_iconification win+ -- , glfwTest "show/hide" $ test_show_hide win+ , glfwTest "getWindowMonitor" $ test_getWindowMonitor win mon+ , glfwTest "setWindowed" $ test_setWindowed win+ , glfwTest "setWindowIcon" $ test_setWindowIcon win+ , glfwTest "maximizeWindow" $ test_maximizeWindow win+ , glfwTest "setWindowSizeLimits" $ test_setWindowSizeLimits win+ , glfwTest "setWindowAspectRatio" $ test_setWindowAspectRatio win+ , glfwTest "focusWindow" $ test_focusWindow win+ , glfwTest "cursor pos" $ test_cursor_pos win+ , glfwTest "pollEvents" test_pollEvents+ , glfwTest "waitEvents" test_waitEvents+ , glfwTest "waitEventsTimeout" test_waitEventsTimeout+ ]+ , testGroup "Input handling"+ [ glfwTest "cursor input mode" $ test_cursor_input_mode win+ , glfwTest "sticky keys input mode" $ test_sticky_keys_input_mode win+ , glfwTest "sticky mouse buttons input mode" $ test_sticky_mouse_buttons_input_mode win+ , glfwTest "joystickPresent" test_joystickPresent+ , glfwTest "getJoystickAxes" test_getJoystickAxes+ , glfwTest "getJoystickButtons" test_getJoystickButtons+ , glfwTest "getJoystickName" test_getJoystickName+ , glfwTest "getKeyName" test_getKeyName+ , glfwTest "getGamepadState" test_getGamepadState+ ]+ , testGroup "Time"+ [ glfwTest "getTime" test_getTime+ , glfwTest "setTime" test_setTime+ , glfwTest "getTimerValue" test_getTimerValue+ , glfwTest "getTimerFrequency" test_getTimerFrequency+ ]+ , testGroup "Context"+ [ glfwTest "getCurrentContext" $ test_getCurrentContext win+ , glfwTest "swapBuffers" $ test_swapBuffers win+ , glfwTest "swapInterval" test_swapInterval+ , glfwTest "extensionSupported" test_extensionSupported+ ]+ , testGroup "Clipboard"+ [ glfwTest "clipboard" $ test_clipboard win+ ]+ ]++--------------------------------------------------------------------------------++test_getVersion :: IO ()+test_getVersion = do+ v <- GLFW.getVersion+ GLFW.versionMajor v @?= versionMajor+ GLFW.versionMinor v @?= versionMinor+ GLFW.versionRevision v @?= versionRevision++test_getVersionString :: IO ()+test_getVersionString = do+ mvs <- GLFW.getVersionString+ case mvs of+ Just vs -> assertBool "" $ v `isPrefixOf` vs+ Nothing -> assertFailure ""+ where+ v = intercalate "." $ map show [versionMajor, versionMinor]++test_getError :: IO ()+test_getError = GLFW.getError >>= assertBool "Got GLFW error!" . isNothing++test_getMonitors :: IO ()+test_getMonitors = do+ r <- GLFW.getMonitors+ case r of+ Just ms -> assertBool "" $ (not . null) ms+ Nothing -> assertFailure ""++test_getPrimaryMonitor :: IO ()+test_getPrimaryMonitor = do+ r <- GLFW.getPrimaryMonitor+ case r of+ Just _ -> return ()+ Nothing -> assertFailure ""++test_getMonitorPos :: GLFW.Monitor -> IO ()+test_getMonitorPos mon = do+ (x, y) <- GLFW.getMonitorPos mon+ assertBool "" $ x >= 0+ assertBool "" $ y >= 0++test_getMonitorPhysicalSize :: GLFW.Monitor -> IO ()+test_getMonitorPhysicalSize mon = do+ (w, h) <- GLFW.getMonitorPhysicalSize mon+ assertBool "" $ w `between` (0, 1000)+ assertBool "" $ h `between` (0, 500)++test_getMonitorWorkarea :: GLFW.Monitor -> IO ()+test_getMonitorWorkarea mon = do+ (x, y, w, h) <- GLFW.getMonitorWorkarea mon+ assertBool "workarea x nonnegative" $ x >= 0+ assertBool "workarea y nonnegative" $ y >= 0+ assertBool "workarea width positive" $ w > 0+ assertBool "workarea height positive" $ h > 0++test_getMonitorName :: GLFW.Monitor -> IO ()+test_getMonitorName mon = do+ mname <- GLFW.getMonitorName mon+ case mname of+ Nothing -> assertFailure ""+ Just name -> assertBool "" $ all isAscii name++test_getVideoModes :: GLFW.Monitor -> IO ()+test_getVideoModes mon = do+ mvms <- GLFW.getVideoModes mon+ case mvms of+ Nothing -> assertFailure ""+ Just vms -> assertBool "" $ all videoModeLooksValid vms++test_getVideoMode :: GLFW.Monitor -> IO ()+test_getVideoMode mon = do+ mvm <- GLFW.getVideoMode mon+ case mvm of+ Just vm -> assertBool "" $ videoModeLooksValid vm+ Nothing -> assertFailure ""++test_getGammaRamp :: GLFW.Monitor -> IO ()+test_getGammaRamp mon = do+ mgr <- GLFW.getGammaRamp mon+ case mgr of+ Nothing -> assertFailure ""+ Just gr -> assertBool "" $+ let rsl = length $ GLFW.gammaRampRed gr+ gsl = length $ GLFW.gammaRampGreen gr+ bsl = length $ GLFW.gammaRampBlue gr+ in rsl > 0 && rsl == gsl && gsl == bsl++--------------------------------------------------------------------------------++test_defaultWindowHints :: IO ()+test_defaultWindowHints =+ GLFW.defaultWindowHints++test_windowAttribs :: GLFW.Window -> IO ()+test_windowAttribs win = do+ oldRsz <- GLFW.getWindowAttrib win GLFW.WindowAttrib'Resizable++ GLFW.setWindowAttrib win GLFW.WindowAttrib'Resizable False+ GLFW.getWindowAttrib win GLFW.WindowAttrib'Resizable >>= (@?= False)++ GLFW.setWindowAttrib win GLFW.WindowAttrib'Resizable True+ rsz <- GLFW.getWindowAttrib win GLFW.WindowAttrib'Resizable+ rsz @?= True++ GLFW.setWindowAttrib win GLFW.WindowAttrib'Resizable oldRsz++test_window_close_flag :: GLFW.Window -> IO ()+test_window_close_flag win = do+ r0 <- GLFW.windowShouldClose win+ r0 @?= False++ GLFW.setWindowShouldClose win True+ r1 <- GLFW.windowShouldClose win+ r1 @?= True++ GLFW.setWindowShouldClose win False+ r2 <- GLFW.windowShouldClose win+ r2 @?= False++test_window_opacity :: GLFW.Window -> IO ()+test_window_opacity win = do+ oldOpacity <- GLFW.getWindowOpacity win++ GLFW.setWindowOpacity win 0.27+ opacity <- GLFW.getWindowOpacity win+ assertBool "Opacity is close to what we set it to." $+ (abs (opacity - 0.27)) < 0.01++ GLFW.setWindowOpacity win oldOpacity++test_setWindowTitle :: GLFW.Window -> IO ()+test_setWindowTitle win =+ GLFW.setWindowTitle win "some new title"++-- This is a little strange. Depending on your window manager, etc, after+-- setting the window position to (x,y), the actual new window position might+-- be (x+5,y+5) due to borders. So we just check for consistency.+test_window_pos :: GLFW.Window -> IO ()+test_window_pos win = do+ let x = 17+ y = 37+ xoff = 53+ yoff = 149+ (x0, y0, dx0, dy0) <- setGet x y+ (x1, y1, dx1, dy1) <- setGet (x+xoff) (y+yoff)+ dx0 @?= dx1+ dy0 @?= dy1+ x1 - x0 @?= xoff+ y1 - y0 @?= yoff+ where+ setGet x0 y0 = do+ GLFW.setWindowPos win x0 y0+ giveItTime+ (x1, y1) <- GLFW.getWindowPos win+ let (dx, dy) = (x0-x1, y0-y1)+ return (x1, y1, dx, dy)++test_window_size :: GLFW.Window -> IO ()+test_window_size win = do+ let w = 170+ h = 370+ GLFW.setWindowSize win w h+ giveItTime+ (w', h') <- GLFW.getWindowSize win+ w' @?= w+ h' @?= h++test_getWindowFrameSize :: GLFW.Window -> IO ()+test_getWindowFrameSize win = do+ -- The frame size is pretty dependent on the window manager. We can only+ -- really expect that the window has a title bar, so the top frame won't be+ -- zero...+ (_, t, _, _) <- GLFW.getWindowFrameSize win+ assertBool "Window has no frame width up top!" $ t > 0++test_getFramebufferSize :: GLFW.Window -> IO ()+test_getFramebufferSize win = do+ (w, h) <- GLFW.getWindowSize win+ (fw, fh) <- GLFW.getFramebufferSize win+ -- Window size and framebuffer size are not always equal, an example are+ -- retina screens. But maybe it's safe to assume they'll always be scaled+ -- equally in both dimensions?+ let ww = ( fromIntegral fw / fromIntegral w ) :: Double+ hh = ( fromIntegral fh / fromIntegral h ) :: Double+ ww @?= hh+ assertBool "" $ fw /= 0+ assertBool "" $ fh /= 0++test_iconification :: GLFW.Window -> IO ()+test_iconification win = do+ GLFW.showWindow win+ is0 <- GLFW.getWindowIconified win+ is0 @?= False++ GLFW.iconifyWindow win+ giveItTime+ is1 <- GLFW.getWindowIconified win+ is1 @?= True++ GLFW.restoreWindow win+ GLFW.hideWindow win++-- test_show_hide :: GLFW.Window -> IO ()+-- test_show_hide win = do+-- v0 <- GLFW.getWindowVisible win+-- v0 @?= True++-- GLFW.hideWindow win+-- giveItTime+-- v1 <- GLFW.getWindowVisible win+-- v1 @?= False++-- GLFW.showWindow win+-- giveItTime+-- v2 <- GLFW.getWindowVisible win+-- v2 @?= True++test_getWindowMonitor :: GLFW.Window -> GLFW.Monitor -> IO ()+test_getWindowMonitor win _ = do+ m <- GLFW.getWindowMonitor win+ m @?= Nothing++test_setWindowed :: GLFW.Window -> IO ()+test_setWindowed win = GLFW.setWindowed win 100 100 0 0++test_setWindowIcon :: GLFW.Window -> IO ()+test_setWindowIcon win = let+ icon1 = GLFW.mkImage 32 32 $ \x y ->+ case even ((x `div` 8) `xor` (y `div` 8)) of+ True -> (255, 0, 0, 255)+ False -> (0, 255, 0, 255)++ icon2 = GLFW.mkImage 16 16 $ \x y ->+ case even ((x `div` 8) `xor` (y `div` 8)) of+ True -> (255, 255, 255, 255)+ False -> (0, 0, 0, 255)++ in GLFW.setWindowIcon win [icon1, icon2]++test_maximizeWindow :: GLFW.Window -> IO ()+test_maximizeWindow win = do+ GLFW.showWindow win+ startsMaximized <- GLFW.getWindowMaximized win+ startsMaximized @?= False++ GLFW.maximizeWindow win+ giveItTime++ isMaximized <- GLFW.getWindowMaximized win+ isMaximized @?= True+ GLFW.hideWindow win++test_setWindowSizeLimits :: GLFW.Window -> IO ()+test_setWindowSizeLimits win = do+ GLFW.setWindowSizeLimits win (Just 640) (Just 480) (Just 1024) (Just 768)++test_setWindowAspectRatio :: GLFW.Window -> IO ()+test_setWindowAspectRatio win = do+ GLFW.setWindowAspectRatio win Nothing++test_focusWindow :: GLFW.Window -> IO ()+test_focusWindow = GLFW.focusWindow++test_cursor_pos :: GLFW.Window -> IO ()+test_cursor_pos win = do+ GLFW.showWindow win+ (w, h) <- GLFW.getWindowSize win++ -- Make sure we use integral coordinates here so that we don't run into+ -- platform-dependent differences.+ let cx :: Double+ cy :: Double+ (cx, cy) = (fromIntegral $ w `div` 2, fromIntegral $ h `div` 2)++ -- !HACK! Poll events seems to be necessary on OS X,+ -- before /and/ after glfwSetCursorPos, otherwise, the+ -- windowing system likely never receives the cursor update. This is+ -- reflected in the C version of GLFW as well, we just call it here in+ -- order to have a more robust test.++ GLFW.pollEvents+ GLFW.setCursorPos win cx cy+ GLFW.pollEvents -- !HACK! see comment above++ (cx', cy') <- GLFW.getCursorPos win+ cx' @?= cx+ cy' @?= cy+ GLFW.hideWindow win++test_getWindowFocused :: GLFW.Window -> IO ()+test_getWindowFocused win = do+ fs <- GLFW.getWindowFocused win+ fs @?= False++test_getWindowResizable :: GLFW.Window -> IO ()+test_getWindowResizable win = do+ b <- GLFW.getWindowResizable win+ b @?= True++test_getWindowDecorated :: GLFW.Window -> IO ()+test_getWindowDecorated win = do+ b <- GLFW.getWindowDecorated win+ b @?= True++test_getWindowClientAPI :: GLFW.Window -> IO ()+test_getWindowClientAPI win = do+ a <- GLFW.getWindowClientAPI win+ a @?= GLFW.ClientAPI'OpenGL++test_window_context_version :: GLFW.Window -> IO ()+test_window_context_version win = do+ v0 <- GLFW.getWindowContextVersionMajor win+ v1 <- GLFW.getWindowContextVersionMinor win+ assertBool "" $ all (`between` (0, 20)) [v0, v1]++test_getWindowContextRobustness :: GLFW.Window -> IO ()+test_getWindowContextRobustness win = do+ _ <- GLFW.getWindowContextRobustness win+ return ()++test_getWindowOpenGLForwardCompat :: GLFW.Window -> IO ()+test_getWindowOpenGLForwardCompat win = do+ _ <- GLFW.getWindowOpenGLForwardCompat win+ return ()++test_getWindowOpenGLDebugContext :: GLFW.Window -> IO ()+test_getWindowOpenGLDebugContext win = do+ _ <- GLFW.getWindowOpenGLDebugContext win+ return ()++test_getWindowOpenGLProfile :: GLFW.Window -> IO ()+test_getWindowOpenGLProfile win = do+ _ <- GLFW.getWindowOpenGLProfile win+ return ()++test_pollEvents :: IO ()+test_pollEvents =+ GLFW.pollEvents++test_waitEvents :: IO ()+test_waitEvents = GLFW.postEmptyEvent >> GLFW.waitEvents++test_waitEventsTimeout :: IO ()+test_waitEventsTimeout =+ -- to not slow down the test too much we set the timeout to 0.001 second :+ GLFW.waitEventsTimeout 0.001++--------------------------------------------------------------------------------++test_cursor_input_mode :: GLFW.Window -> IO ()+test_cursor_input_mode win = do+ modes' <- mapM setGet modes+ modes' @?= modes+ where+ modes =+ [ GLFW.CursorInputMode'Disabled+ , GLFW.CursorInputMode'Hidden+ , GLFW.CursorInputMode'Normal+ ]+ setGet m = do+ GLFW.setCursorInputMode win m+ GLFW.getCursorInputMode win++test_sticky_keys_input_mode :: GLFW.Window -> IO ()+test_sticky_keys_input_mode win = do+ modes' <- mapM setGet modes+ modes' @?= modes+ where+ modes =+ [ GLFW.StickyKeysInputMode'Enabled+ , GLFW.StickyKeysInputMode'Disabled+ ]+ setGet m = do+ GLFW.setStickyKeysInputMode win m+ GLFW.getStickyKeysInputMode win++test_sticky_mouse_buttons_input_mode :: GLFW.Window -> IO ()+test_sticky_mouse_buttons_input_mode win = do+ modes' <- mapM setGet modes+ modes' @?= modes+ where+ modes =+ [ GLFW.StickyMouseButtonsInputMode'Enabled+ , GLFW.StickyMouseButtonsInputMode'Disabled+ ]+ setGet m = do+ GLFW.setStickyMouseButtonsInputMode win m+ GLFW.getStickyMouseButtonsInputMode win++test_joystickPresent :: IO ()+test_joystickPresent = do+ _ <- GLFW.joystickPresent GLFW.Joystick'1+ r <- GLFW.joystickPresent GLFW.Joystick'16+ assertBool "" $ not r++test_getJoystickAxes :: IO ()+test_getJoystickAxes =+ mapM_ GLFW.getJoystickAxes joysticks++test_getJoystickButtons :: IO ()+test_getJoystickButtons =+ mapM_ GLFW.getJoystickButtons joysticks++test_getJoystickName :: IO ()+test_getJoystickName =+ mapM_ GLFW.getJoystickName joysticks++test_getKeyName :: IO ()+test_getKeyName =+ forM_ (zip [GLFW.Key'Slash, GLFW.Key'Period] ["/", "."]) $ \(k, n) -> do+ name <- GLFW.getKeyName k 0+ case name of+ Nothing -> return ()+ Just s -> s @?= n++test_getGamepadState :: IO ()+test_getGamepadState =+ forM_ joysticks $ \js -> do+ mst <- GLFW.getGamepadState js+ case mst of+ (Just st) -> do+ GLFW.joystickIsGamepad js >>= assertBool "Is gamepad"+ GLFW.getGamepadName js >>= assertBool "Gamepad has name" . not . null+ forM_ [minBound..maxBound] $ assertBool "Button not pressed"+ . (== GLFW.GamepadButtonState'Released)+ . GLFW.getButtonState st+ _ -> return ()++--------------------------------------------------------------------------------++test_getTime :: IO ()+test_getTime = do+ mt <- GLFW.getTime+ case mt of+ Nothing -> assertFailure ""+ Just t -> assertBool "" $ t `between` (0, 10)++test_setTime :: IO ()+test_setTime = do+ let t = 37+ GLFW.setTime t+ mt <- GLFW.getTime+ case mt of+ Just t' -> assertBool "" $ t' `between` (t, t+10)+ Nothing -> assertFailure ""++test_getTimerValue :: IO ()+test_getTimerValue = GLFW.getTimerValue >>= assertBool "" . (> 0)++test_getTimerFrequency :: IO ()+test_getTimerFrequency = GLFW.getTimerFrequency >>= assertBool "" . (> 0)++--------------------------------------------------------------------------------++test_getCurrentContext :: GLFW.Window -> IO ()+test_getCurrentContext win = do+ mwin <- GLFW.getCurrentContext+ case mwin of+ Nothing -> assertFailure ""+ Just win' -> win' @?= win++test_swapBuffers :: GLFW.Window -> IO ()+test_swapBuffers =+ GLFW.swapBuffers++test_swapInterval :: IO ()+test_swapInterval =+ GLFW.swapInterval 1++test_extensionSupported :: IO ()+test_extensionSupported = do+ b0 <- GLFW.extensionSupported "GL_ARB_multisample"+ b0 @?= True+ b1 <- GLFW.extensionSupported "bogus"+ b1 @?= False++--------------------------------------------------------------------------------++test_clipboard :: GLFW.Window -> IO ()+test_clipboard win = do+ rs <- mapM setGet ss+ rs @?= map Just ss+ where+ ss =+ [ "abc 123 ???"+ , "xyz 456 !!!"+ ]+ setGet s = do+ GLFW.setClipboardString win s+ giveItTime+ result <- GLFW.getClipboardString win++ err <- GLFW.getError+ return $ case err of+ Just (GLFW.Error'FormatUnavailable, _) -> Just s+ _ -> result++--------------------------------------------------------------------------------++{-# ANN module "HLint: ignore Use camelCase" #-}
− build/glfw/lib/cocoa/.build-tag
− glfw/include/GL/glfw.h
@@ -1,509 +0,0 @@-/************************************************************************- * GLFW - An OpenGL framework- * API version: 2.7- * WWW: http://www.glfw.org/- *------------------------------------------------------------------------- * Copyright (c) 2002-2006 Marcus Geelnard- * Copyright (c) 2006-2010 Camilla Berglund- *- * This software is provided 'as-is', without any express or implied- * warranty. In no event will the authors be held liable for any damages- * arising from the use of this software.- *- * Permission is granted to anyone to use this software for any purpose,- * including commercial applications, and to alter it and redistribute it- * freely, subject to the following restrictions:- *- * 1. The origin of this software must not be misrepresented; you must not- * claim that you wrote the original software. If you use this software- * in a product, an acknowledgment in the product documentation would- * be appreciated but is not required.- *- * 2. Altered source versions must be plainly marked as such, and must not- * be misrepresented as being the original software.- *- * 3. This notice may not be removed or altered from any source- * distribution.- *- *************************************************************************/--#ifndef __glfw_h_-#define __glfw_h_--#ifdef __cplusplus-extern "C" {-#endif---/*************************************************************************- * Global definitions- *************************************************************************/--/* We need a NULL pointer from time to time */-#ifndef NULL- #ifdef __cplusplus- #define NULL 0- #else- #define NULL ((void *)0)- #endif-#endif /* NULL */---/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */--/* Please report any probles that you find with your compiler, which may- * be solved in this section! There are several compilers that I have not- * been able to test this file with yet.- *- * First: If we are we on Windows, we want a single define for it (_WIN32)- * (Note: For Cygwin the compiler flag -mwin32 should be used, but to- * make sure that things run smoothly for Cygwin users, we add __CYGWIN__- * to the list of "valid Win32 identifiers", which removes the need for- * -mwin32)- */-#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))- #define _WIN32-#endif /* _WIN32 */--/* In order for extension support to be portable, we need to define an- * OpenGL function call method. We use the keyword APIENTRY, which is- * defined for Win32. (Note: Windows also needs this for <GL/gl.h>)- */-#ifndef APIENTRY- #ifdef _WIN32- #define APIENTRY __stdcall- #else- #define APIENTRY- #endif- #define GL_APIENTRY_DEFINED-#endif /* APIENTRY */---/* The following three defines are here solely to make some Windows-based- * <GL/gl.h> files happy. Theoretically we could include <windows.h>, but- * it has the major drawback of severely polluting our namespace.- */--/* Under Windows, we need WINGDIAPI defined */-#if !defined(WINGDIAPI) && defined(_WIN32)- #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)- /* Microsoft Visual C++, Borland C++ Builder and Pelles C */- #define WINGDIAPI __declspec(dllimport)- #elif defined(__LCC__)- /* LCC-Win32 */- #define WINGDIAPI __stdcall- #else- /* Others (e.g. MinGW, Cygwin) */- #define WINGDIAPI extern- #endif- #define GL_WINGDIAPI_DEFINED-#endif /* WINGDIAPI */--/* Some <GL/glu.h> files also need CALLBACK defined */-#if !defined(CALLBACK) && defined(_WIN32)- #if defined(_MSC_VER)- /* Microsoft Visual C++ */- #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)- #define CALLBACK __stdcall- #else- #define CALLBACK- #endif- #else- /* Other Windows compilers */- #define CALLBACK __stdcall- #endif- #define GLU_CALLBACK_DEFINED-#endif /* CALLBACK */--/* Microsoft Visual C++, Borland C++ and Pelles C <GL*glu.h> needs wchar_t */-#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED)- typedef unsigned short wchar_t;- #define _WCHAR_T_DEFINED-#endif /* _WCHAR_T_DEFINED */---/* ---------------- GLFW related system specific defines ----------------- */--#if defined(_WIN32) && defined(GLFW_BUILD_DLL)-- /* We are building a Win32 DLL */- #define GLFWAPI __declspec(dllexport)- #define GLFWAPIENTRY __stdcall- #define GLFWCALL __stdcall--#elif defined(_WIN32) && defined(GLFW_DLL)-- /* We are calling a Win32 DLL */- #if defined(__LCC__)- #define GLFWAPI extern- #else- #define GLFWAPI __declspec(dllimport)- #endif- #define GLFWAPIENTRY __stdcall- #define GLFWCALL __stdcall--#else-- /* We are either building/calling a static lib or we are non-win32 */- #define GLFWAPIENTRY- #define GLFWAPI- #define GLFWCALL--#endif--/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */--/* Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is- * convenient for the user to only have to include <GL/glfw.h>. This also- * solves the problem with Windows <GL/gl.h> and <GL/glu.h> needing some- * special defines which normally requires the user to include <windows.h>- * (which is not a nice solution for portable programs).- */-#if defined(__APPLE_CC__)- #include <OpenGL/gl.h>- #ifndef GLFW_NO_GLU- #include <OpenGL/glu.h>- #endif-#else- #include <GL/gl.h>- #ifndef GLFW_NO_GLU- #include <GL/glu.h>- #endif-#endif---/*************************************************************************- * GLFW version- *************************************************************************/--#define GLFW_VERSION_MAJOR 2-#define GLFW_VERSION_MINOR 7-#define GLFW_VERSION_REVISION 2---/*************************************************************************- * Input handling definitions- *************************************************************************/--/* Key and button state/action definitions */-#define GLFW_RELEASE 0-#define GLFW_PRESS 1--/* Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used- * for printable keys (such as A-Z, 0-9 etc), and values above 256- * represent special (non-printable) keys (e.g. F1, Page Up etc).- */-#define GLFW_KEY_UNKNOWN -1-#define GLFW_KEY_SPACE 32-#define GLFW_KEY_SPECIAL 256-#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1)-#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2)-#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3)-#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4)-#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5)-#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6)-#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7)-#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8)-#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9)-#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10)-#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11)-#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12)-#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13)-#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14)-#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15)-#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16)-#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17)-#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18)-#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19)-#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20)-#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21)-#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22)-#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23)-#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24)-#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25)-#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26)-#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27)-#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28)-#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29)-#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30)-#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31)-#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32)-#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33)-#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34)-#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35)-#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36)-#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37)-#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38)-#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39)-#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40)-#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41)-#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42)-#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43)-#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44)-#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45)-#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46)-#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47)-#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48)-#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49)-#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50)-#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51)-#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52)-#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53)-#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54)-#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55)-#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56)-#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57)-#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58)-#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59)-#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60)-#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61)-#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62)-#define GLFW_KEY_KP_NUM_LOCK (GLFW_KEY_SPECIAL+63)-#define GLFW_KEY_CAPS_LOCK (GLFW_KEY_SPECIAL+64)-#define GLFW_KEY_SCROLL_LOCK (GLFW_KEY_SPECIAL+65)-#define GLFW_KEY_PAUSE (GLFW_KEY_SPECIAL+66)-#define GLFW_KEY_LSUPER (GLFW_KEY_SPECIAL+67)-#define GLFW_KEY_RSUPER (GLFW_KEY_SPECIAL+68)-#define GLFW_KEY_MENU (GLFW_KEY_SPECIAL+69)-#define GLFW_KEY_LAST GLFW_KEY_MENU--/* Mouse button definitions */-#define GLFW_MOUSE_BUTTON_1 0-#define GLFW_MOUSE_BUTTON_2 1-#define GLFW_MOUSE_BUTTON_3 2-#define GLFW_MOUSE_BUTTON_4 3-#define GLFW_MOUSE_BUTTON_5 4-#define GLFW_MOUSE_BUTTON_6 5-#define GLFW_MOUSE_BUTTON_7 6-#define GLFW_MOUSE_BUTTON_8 7-#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8--/* Mouse button aliases */-#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1-#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2-#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3---/* Joystick identifiers */-#define GLFW_JOYSTICK_1 0-#define GLFW_JOYSTICK_2 1-#define GLFW_JOYSTICK_3 2-#define GLFW_JOYSTICK_4 3-#define GLFW_JOYSTICK_5 4-#define GLFW_JOYSTICK_6 5-#define GLFW_JOYSTICK_7 6-#define GLFW_JOYSTICK_8 7-#define GLFW_JOYSTICK_9 8-#define GLFW_JOYSTICK_10 9-#define GLFW_JOYSTICK_11 10-#define GLFW_JOYSTICK_12 11-#define GLFW_JOYSTICK_13 12-#define GLFW_JOYSTICK_14 13-#define GLFW_JOYSTICK_15 14-#define GLFW_JOYSTICK_16 15-#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16---/*************************************************************************- * Other definitions- *************************************************************************/--/* glfwOpenWindow modes */-#define GLFW_WINDOW 0x00010001-#define GLFW_FULLSCREEN 0x00010002--/* glfwGetWindowParam tokens */-#define GLFW_OPENED 0x00020001-#define GLFW_ACTIVE 0x00020002-#define GLFW_ICONIFIED 0x00020003-#define GLFW_ACCELERATED 0x00020004-#define GLFW_RED_BITS 0x00020005-#define GLFW_GREEN_BITS 0x00020006-#define GLFW_BLUE_BITS 0x00020007-#define GLFW_ALPHA_BITS 0x00020008-#define GLFW_DEPTH_BITS 0x00020009-#define GLFW_STENCIL_BITS 0x0002000A--/* The following constants are used for both glfwGetWindowParam- * and glfwOpenWindowHint- */-#define GLFW_REFRESH_RATE 0x0002000B-#define GLFW_ACCUM_RED_BITS 0x0002000C-#define GLFW_ACCUM_GREEN_BITS 0x0002000D-#define GLFW_ACCUM_BLUE_BITS 0x0002000E-#define GLFW_ACCUM_ALPHA_BITS 0x0002000F-#define GLFW_AUX_BUFFERS 0x00020010-#define GLFW_STEREO 0x00020011-#define GLFW_WINDOW_NO_RESIZE 0x00020012-#define GLFW_FSAA_SAMPLES 0x00020013-#define GLFW_OPENGL_VERSION_MAJOR 0x00020014-#define GLFW_OPENGL_VERSION_MINOR 0x00020015-#define GLFW_OPENGL_FORWARD_COMPAT 0x00020016-#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020017-#define GLFW_OPENGL_PROFILE 0x00020018--/* GLFW_OPENGL_PROFILE tokens */-#define GLFW_OPENGL_CORE_PROFILE 0x00050001-#define GLFW_OPENGL_COMPAT_PROFILE 0x00050002--/* glfwEnable/glfwDisable tokens */-#define GLFW_MOUSE_CURSOR 0x00030001-#define GLFW_STICKY_KEYS 0x00030002-#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003-#define GLFW_SYSTEM_KEYS 0x00030004-#define GLFW_KEY_REPEAT 0x00030005-#define GLFW_AUTO_POLL_EVENTS 0x00030006--/* glfwWaitThread wait modes */-#define GLFW_WAIT 0x00040001-#define GLFW_NOWAIT 0x00040002--/* glfwGetJoystickParam tokens */-#define GLFW_PRESENT 0x00050001-#define GLFW_AXES 0x00050002-#define GLFW_BUTTONS 0x00050003--/* glfwReadImage/glfwLoadTexture2D flags */-#define GLFW_NO_RESCALE_BIT 0x00000001 /* Only for glfwReadImage */-#define GLFW_ORIGIN_UL_BIT 0x00000002-#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 /* Only for glfwLoadTexture2D */-#define GLFW_ALPHA_MAP_BIT 0x00000008--/* Time spans longer than this (seconds) are considered to be infinity */-#define GLFW_INFINITY 100000.0---/*************************************************************************- * Typedefs- *************************************************************************/--/* The video mode structure used by glfwGetVideoModes() */-typedef struct {- int Width, Height;- int RedBits, BlueBits, GreenBits;-} GLFWvidmode;--/* Image/texture information */-typedef struct {- int Width, Height;- int Format;- int BytesPerPixel;- unsigned char *Data;-} GLFWimage;--/* Thread ID */-typedef int GLFWthread;--/* Mutex object */-typedef void * GLFWmutex;--/* Condition variable object */-typedef void * GLFWcond;--/* Function pointer types */-typedef void (GLFWCALL * GLFWwindowsizefun)(int,int);-typedef int (GLFWCALL * GLFWwindowclosefun)(void);-typedef void (GLFWCALL * GLFWwindowrefreshfun)(void);-typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int);-typedef void (GLFWCALL * GLFWmouseposfun)(int,int);-typedef void (GLFWCALL * GLFWmousewheelfun)(int);-typedef void (GLFWCALL * GLFWkeyfun)(int,int);-typedef void (GLFWCALL * GLFWcharfun)(int,int);-typedef void (GLFWCALL * GLFWthreadfun)(void *);---/*************************************************************************- * Prototypes- *************************************************************************/--/* GLFW initialization, termination and version querying */-GLFWAPI int GLFWAPIENTRY glfwInit( void );-GLFWAPI void GLFWAPIENTRY glfwTerminate( void );-GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev );--/* Window handling */-GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode );-GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint );-GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void );-GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title );-GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height );-GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height );-GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y );-GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void );-GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void );-GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void );-GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval );-GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param );-GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun );--/* Video mode functions */-GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount );-GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode );--/* Input handling */-GLFWAPI void GLFWAPIENTRY glfwPollEvents( void );-GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void );-GLFWAPI int GLFWAPIENTRY glfwGetKey( int key );-GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button );-GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos );-GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos );-GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void );-GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos );-GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun );--/* Joystick input */-GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param );-GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes );-GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );--/* Time */-GLFWAPI double GLFWAPIENTRY glfwGetTime( void );-GLFWAPI void GLFWAPIENTRY glfwSetTime( double time );-GLFWAPI void GLFWAPIENTRY glfwSleep( double time );--/* Extension support */-GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension );-GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname );-GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev );--/* Threading support */-GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg );-GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID );-GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode );-GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void );-GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void );-GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex );-GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex );-GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex );-GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void );-GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond );-GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout );-GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond );-GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond );-GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void );--/* Enable/disable functions */-GLFWAPI void GLFWAPIENTRY glfwEnable( int token );-GLFWAPI void GLFWAPIENTRY glfwDisable( int token );--/* Image/texture I/O support */-GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags );-GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags );-GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img );-GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags );-GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags );-GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags );---#ifdef __cplusplus-}-#endif--#endif /* __glfw_h_ */-
− glfw/lib/cocoa/cocoa_enable.m
@@ -1,51 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Enable and disable system keys-//========================================================================--void _glfwPlatformEnableSystemKeys( void )-{- // This is checked in macosx_window.m; we take no action here-}--void _glfwPlatformDisableSystemKeys( void )-{- // This is checked in macosx_window.m; we take no action here- // I don't think it's really possible to disable stuff like Exposé- // except in full-screen mode.-}-
− glfw/lib/cocoa/cocoa_fullscreen.m
@@ -1,102 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--//========================================================================-// Check whether the display mode should be included in enumeration-//========================================================================--static BOOL modeIsGood( NSDictionary *mode )-{- // This is a bit controversial, if you've got something other than an- // LCD computer monitor as an output device you might not want these- // checks. You might also want to reject modes which are interlaced,- // or TV out. There is no one-size-fits-all policy that can work here.- // This seems like a decent compromise, but certain applications may- // wish to patch this...- return [[mode objectForKey:(id)kCGDisplayBitsPerPixel] intValue] >= 15 &&- [mode objectForKey:(id)kCGDisplayModeIsSafeForHardware] != nil &&- [mode objectForKey:(id)kCGDisplayModeIsStretched] == nil;-}--//========================================================================-// Convert Core Graphics display mode to GLFW video mode-//========================================================================--static GLFWvidmode vidmodeFromCGDisplayMode( NSDictionary *mode )-{- unsigned int width = [[mode objectForKey:(id)kCGDisplayWidth] unsignedIntValue];- unsigned int height = [[mode objectForKey:(id)kCGDisplayHeight] unsignedIntValue];- unsigned int bps = [[mode objectForKey:(id)kCGDisplayBitsPerSample] unsignedIntValue];-- GLFWvidmode result;- result.Width = width;- result.Height = height;- result.RedBits = bps;- result.GreenBits = bps;- result.BlueBits = bps;- return result;-}---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Get a list of available video modes-//========================================================================--int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )-{- NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() );-- unsigned int i, j = 0, n = [modes count];- for( i = 0; i < n && j < (unsigned)maxcount; i++ )- {- NSDictionary *mode = [modes objectAtIndex:i];- if( modeIsGood( mode ) )- {- list[j++] = vidmodeFromCGDisplayMode( mode );- }- }-- return j;-}--//========================================================================-// Get the desktop video mode-//========================================================================--void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )-{- *mode = vidmodeFromCGDisplayMode( _glfwLibrary.DesktopMode );-}-
− glfw/lib/cocoa/cocoa_glext.m
@@ -1,63 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Check if an OpenGL extension is available at runtime-//========================================================================--int _glfwPlatformExtensionSupported( const char *extension )-{- // There are no AGL, CGL or NSGL extensions.- return GL_FALSE;-}--//========================================================================-// Get the function pointer to an OpenGL function-//========================================================================--void * _glfwPlatformGetProcAddress( const char *procname )-{- CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,- procname,- kCFStringEncodingASCII );-- void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.OpenGLFramework,- symbolName );-- CFRelease( symbolName );-- return symbol;-}-
− glfw/lib/cocoa/cocoa_init.m
@@ -1,297 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--// Needed for _NSGetProgname-#include <crt_externs.h>--#include "internal.h"--@interface GLFWThread : NSThread-@end--@implementation GLFWThread--- (void)main-{-}--@end--@interface GLFWApplication : NSApplication-@end--@implementation GLFWApplication--// From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost-// This works around an AppKit bug, where key up events while holding-// down the command key don't get sent to the key window.-- (void)sendEvent:(NSEvent *)event-{- if( [event type] == NSKeyUp && ( [event modifierFlags] & NSCommandKeyMask ) )- {- [[self keyWindow] sendEvent:event];- }- else- {- [super sendEvent:event];- }-}--@end--// Prior to Snow Leopard, we need to use this oddly-named semi-private API-// to get the application menu working properly. Need to be careful in-// case it goes away in a future OS update.-@interface NSApplication (NSAppleMenu)-- (void)setAppleMenu:(NSMenu *)m;-@end--// Keys to search for as potential application names-NSString *GLFWNameKeys[] =-{- @"CFBundleDisplayName",- @"CFBundleName",- @"CFBundleExecutable",-};--//========================================================================-// Try to figure out what the calling application is called-//========================================================================-static NSString *findAppName( void )-{- NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];-- unsigned int i;- for( i = 0; i < sizeof(GLFWNameKeys) / sizeof(GLFWNameKeys[0]); i++ )- {- id name = [infoDictionary objectForKey:GLFWNameKeys[i]];- if (name &&- [name isKindOfClass:[NSString class]] &&- ![@"" isEqualToString:name])- {- return name;- }- }-- // If we get here, we're unbundled- if( !_glfwLibrary.Unbundled )- {- // Could do this only if we discover we're unbundled, but it should- // do no harm...- 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 );-- _glfwLibrary.Unbundled = GL_TRUE;- }-- char **progname = _NSGetProgname();- if( progname && *progname )- {- // TODO: UTF8?- return [NSString stringWithUTF8String:*progname];- }-- // Really shouldn't get here- return @"GLFW Application";-}--//========================================================================-// Set up the menu bar (manually)-// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that-// could go away at any moment, lots of stuff that really should be-// localize(d|able), etc. Loading a nib would save us this horror, but that-// doesn't seem like a good thing to require of GLFW's clients.-//========================================================================-static void setUpMenuBar( void )-{- NSString *appName = findAppName();-- NSMenu *bar = [[NSMenu alloc] init];- [NSApp setMainMenu:bar];-- NSMenuItem *appMenuItem =- [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];- NSMenu *appMenu = [[NSMenu alloc] init];- [appMenuItem setSubmenu:appMenu];-- [appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName]- action:@selector(orderFrontStandardAboutPanel:)- keyEquivalent:@""];- [appMenu addItem:[NSMenuItem separatorItem]];- NSMenu *servicesMenu = [[NSMenu alloc] init];- [NSApp setServicesMenu:servicesMenu];- [[appMenu addItemWithTitle:@"Services"- action:NULL- keyEquivalent:@""] setSubmenu:servicesMenu];- [appMenu addItem:[NSMenuItem separatorItem]];- [appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName]- action:@selector(hide:)- keyEquivalent:@"h"];- [[appMenu addItemWithTitle:@"Hide Others"- action:@selector(hideOtherApplications:)- keyEquivalent:@"h"]- setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask];- [appMenu addItemWithTitle:@"Show All"- action:@selector(unhideAllApplications:)- keyEquivalent:@""];- [appMenu addItem:[NSMenuItem separatorItem]];- [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName]- action:@selector(terminate:)- keyEquivalent:@"q"];-- NSMenuItem *windowMenuItem =- [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];- NSMenu *windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];- [NSApp setWindowsMenu:windowMenu];- [windowMenuItem setSubmenu:windowMenu];-- [windowMenu addItemWithTitle:@"Miniaturize"- action:@selector(performMiniaturize:)- keyEquivalent:@"m"];- [windowMenu addItemWithTitle:@"Zoom"- action:@selector(performZoom:)- keyEquivalent:@""];- [windowMenu addItem:[NSMenuItem separatorItem]];- [windowMenu addItemWithTitle:@"Bring All to Front"- action:@selector(arrangeInFront:)- keyEquivalent:@""];-- // At least guard the call to private API to avoid an exception if it- // goes away. Hopefully that means the worst we'll break in future is to- // look ugly...- if( [NSApp respondsToSelector:@selector(setAppleMenu:)] )- {- [NSApp setAppleMenu:appMenu];- }-}--//========================================================================-// Terminate GLFW when exiting application-//========================================================================--static void glfw_atexit( void )-{- glfwTerminate();-}---//========================================================================-// Initialize GLFW thread package-//========================================================================--static void initThreads( void )-{- // Initialize critical section handle- (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );-- // The first thread (the main thread) has ID 0- _glfwThrd.NextID = 0;-- // Fill out information about the main thread (this thread)- _glfwThrd.First.ID = _glfwThrd.NextID ++;- _glfwThrd.First.Function = NULL;- _glfwThrd.First.PosixID = pthread_self();- _glfwThrd.First.Previous = NULL;- _glfwThrd.First.Next = NULL;-}--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Initialize the GLFW library-//========================================================================--int _glfwPlatformInit( void )-{- _glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];-- // Implicitly create shared NSApplication instance- [GLFWApplication sharedApplication];-- _glfwLibrary.OpenGLFramework =- CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) );- if( _glfwLibrary.OpenGLFramework == NULL )- {- return GL_FALSE;- }-- GLFWThread* thread = [[GLFWThread alloc] init];- [thread start];- [thread release];-- NSString* resourcePath = [[NSBundle mainBundle] resourcePath];-- if( access( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding], R_OK ) == 0 )- {- chdir( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding] );- }-- // Setting up menu bar must go exactly here else weirdness ensues- setUpMenuBar();-- [NSApp finishLaunching];-- // Install atexit routine- atexit( glfw_atexit );-- initThreads();-- _glfwPlatformSetTime( 0.0 );-- _glfwLibrary.DesktopMode =- (NSDictionary *)CGDisplayCurrentMode( CGMainDisplayID() );-- return GL_TRUE;-}--//========================================================================-// Close window, if open, and shut down GLFW-//========================================================================--int _glfwPlatformTerminate( void )-{- // TODO: Fail unless this is the main thread-- glfwCloseWindow();-- // TODO: Kill all non-main threads?- // TODO: Probably other cleanup-- [_glfwLibrary.AutoreleasePool release];- _glfwLibrary.AutoreleasePool = nil;-- return GL_TRUE;-}-
− glfw/lib/cocoa/cocoa_joystick.m
@@ -1,65 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Determine joystick capabilities-//========================================================================--int _glfwPlatformGetJoystickParam( int joy, int param )-{- // TODO: Implement this.- return 0;-}--//========================================================================-// Get joystick axis positions-//========================================================================--int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )-{- // TODO: Implement this.- return 0;-}--//========================================================================-// Get joystick button states-//========================================================================--int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )-{- // TODO: Implement this.- return 0;-}-
− glfw/lib/cocoa/cocoa_thread.c
@@ -1,416 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// File: macosx_thread.c-// Platform: Mac OS X-// API Version: 2.7-// WWW: http://glfw.sourceforge.net-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <sys/time.h>-#include <sys/sysctl.h>---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// _glfwNewThread() - This is simply a "wrapper" for calling the user-// thread function.-//========================================================================--void * _glfwNewThread( void * arg )-{- GLFWthreadfun threadfun;- _GLFWthread *t;-- // Get pointer to thread information for current thread- t = _glfwGetThreadPointer( glfwGetThreadID() );- if( t == NULL )- {- return 0;- }-- // Get user thread function pointer- threadfun = t->Function;-- // Call the user thread function- threadfun( arg );-- // Remove thread from thread list- ENTER_THREAD_CRITICAL_SECTION- _glfwRemoveThread( t );- LEAVE_THREAD_CRITICAL_SECTION-- // When the thread function returns, the thread will die...- return NULL;-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// _glfwPlatformCreateThread() - Create a new thread-//========================================================================--GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )-{- GLFWthread ID;- _GLFWthread *t;- int result;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Create a new thread information memory area- t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );- if( t == NULL )- {- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Get a new unique thread id- ID = _glfwThrd.NextID ++;-- // Store thread information in the thread list- t->Function = fun;- t->ID = ID;-- // Create thread- result = pthread_create(- &t->PosixID, // Thread handle- NULL, // Default thread attributes- _glfwNewThread, // Thread function (a wrapper function)- (void *)arg // Argument to thread is user argument- );-- // Did the thread creation fail?- if( result != 0 )- {- free( (void *) t );- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Append thread to thread list- _glfwAppendThread( t );-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the GLFW thread ID- return ID;-}---//========================================================================-// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY-// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME-// SITUATIONS!-//========================================================================--void _glfwPlatformDestroyThread( GLFWthread ID )-{- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return;- }-- // Simply murder the process, no mercy!- pthread_kill( t->PosixID, SIGKILL );-- // Remove thread from thread list- _glfwRemoveThread( t );-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-}---//========================================================================-// _glfwPlatformWaitThread() - Wait for a thread to die-//========================================================================--int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )-{- pthread_t thread;- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );-- // Is the thread already dead?- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return GL_TRUE;- }-- // If got this far, the thread is alive => polling returns FALSE- if( waitmode == GLFW_NOWAIT )- {- LEAVE_THREAD_CRITICAL_SECTION- return GL_FALSE;- }-- // Get thread handle- thread = t->PosixID;-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Wait for thread to die- (void) pthread_join( thread, NULL );-- return GL_TRUE;-}---//========================================================================-// _glfwPlatformGetThreadID() - Return the thread ID for the current-// thread-//========================================================================--GLFWthread _glfwPlatformGetThreadID( void )-{- _GLFWthread *t;- GLFWthread ID = -1;- pthread_t posixID;-- // Get current thread ID- posixID = pthread_self();-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Loop through entire list of threads to find the matching POSIX- // thread ID- for( t = &_glfwThrd.First; t != NULL; t = t->Next )- {- if( t->PosixID == posixID )- {- ID = t->ID;- break;- }- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the found GLFW thread identifier- return ID;-}---//========================================================================-// _glfwPlatformCreateMutex() - Create a mutual exclusion object-//========================================================================--GLFWmutex _glfwPlatformCreateMutex( void )-{- pthread_mutex_t *mutex;-- // Allocate memory for mutex- mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) );- if( !mutex )- {- return NULL;- }-- // Initialise a mutex object- (void) pthread_mutex_init( mutex, NULL );-- // Cast to GLFWmutex and return- return (GLFWmutex) mutex;-}---//========================================================================-// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object-//========================================================================--void _glfwPlatformDestroyMutex( GLFWmutex mutex )-{- // Destroy the mutex object- pthread_mutex_destroy( (pthread_mutex_t *) mutex );-- // Free memory for mutex object- free( (void *) mutex );-}---//========================================================================-// _glfwPlatformLockMutex() - Request access to a mutex-//========================================================================--void _glfwPlatformLockMutex( GLFWmutex mutex )-{- // Wait for mutex to be released- (void) pthread_mutex_lock( (pthread_mutex_t *) mutex );-}---//========================================================================-// _glfwPlatformUnlockMutex() - Release a mutex-//========================================================================--void _glfwPlatformUnlockMutex( GLFWmutex mutex )-{- // Release mutex- pthread_mutex_unlock( (pthread_mutex_t *) mutex );-}---//========================================================================-// _glfwPlatformCreateCond() - Create a new condition variable object-//========================================================================--GLFWcond _glfwPlatformCreateCond( void )-{- pthread_cond_t *cond;-- // Allocate memory for condition variable- cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) );- if( !cond )- {- return NULL;- }-- // Initialise condition variable- (void) pthread_cond_init( cond, NULL );-- // Cast to GLFWcond and return- return (GLFWcond) cond;-}---//========================================================================-// _glfwPlatformDestroyCond() - Destroy a condition variable object-//========================================================================--void _glfwPlatformDestroyCond( GLFWcond cond )-{- // Destroy the condition variable object- (void) pthread_cond_destroy( (pthread_cond_t *) cond );-- // Free memory for condition variable object- free( (void *) cond );-}---//========================================================================-// _glfwPlatformWaitCond() - Wait for a condition to be raised-//========================================================================--void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,- double timeout )-{- struct timeval currenttime;- struct timespec wait;- long dt_sec, dt_usec;-- // Select infinite or timed wait- if( timeout >= GLFW_INFINITY )- {- // Wait for condition (infinite wait)- (void) pthread_cond_wait( (pthread_cond_t *) cond,- (pthread_mutex_t *) mutex );- }- else- {- // Set timeout time, relatvie to current time- gettimeofday( ¤ttime, NULL );- dt_sec = (long) timeout;- dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0);- wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;- if( wait.tv_nsec > 1000000000L )- {- wait.tv_nsec -= 1000000000L;- dt_sec ++;- }- wait.tv_sec = currenttime.tv_sec + dt_sec;-- // Wait for condition (timed wait)- (void) pthread_cond_timedwait( (pthread_cond_t *) cond,- (pthread_mutex_t *) mutex, &wait );- }-}---//========================================================================-// _glfwPlatformSignalCond() - Signal a condition to one waiting thread-//========================================================================--void _glfwPlatformSignalCond( GLFWcond cond )-{- // Signal condition- (void) pthread_cond_signal( (pthread_cond_t *) cond );-}---//========================================================================-// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting-// threads-//========================================================================--void _glfwPlatformBroadcastCond( GLFWcond cond )-{- // Broadcast condition- (void) pthread_cond_broadcast( (pthread_cond_t *) cond );-}---//========================================================================-// _glfwPlatformGetNumberOfProcessors() - Return the number of processors-// in the system.-//========================================================================--int _glfwPlatformGetNumberOfProcessors( void )-{- int n;-- // Get number of processors online- _glfw_numprocessors( n );- return n;-}-
− glfw/lib/cocoa/cocoa_time.m
@@ -1,105 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <sys/time.h>--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Return timer value in seconds-//========================================================================--double _glfwPlatformGetTime( void )-{- return [NSDate timeIntervalSinceReferenceDate] - _glfwLibrary.Timer.t0;-}--//========================================================================-// Set timer value in seconds-//========================================================================--void _glfwPlatformSetTime( double time )-{- _glfwLibrary.Timer.t0 = [NSDate timeIntervalSinceReferenceDate] - time;-}--//========================================================================-// Put a thread to sleep for a specified amount of time-//========================================================================--void _glfwPlatformSleep( double time )-{- if( time == 0.0 )- {- sched_yield();- return;- }-- struct timeval currenttime;- struct timespec wait;- pthread_mutex_t mutex;- pthread_cond_t cond;- long dt_sec, dt_usec;-- // Not all pthread implementations have a pthread_sleep() function. We- // do it the portable way, using a timed wait for a condition that we- // will never signal. NOTE: The unistd functions sleep/usleep suspends- // the entire PROCESS, not a signle thread, which is why we can not- // use them to implement glfwSleep.-- // Set timeout time, relatvie to current time- gettimeofday( ¤ttime, NULL );- dt_sec = (long) time;- dt_usec = (long) ((time - (double)dt_sec) * 1000000.0);- wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;- if( wait.tv_nsec > 1000000000L )- {- wait.tv_nsec -= 1000000000L;- dt_sec ++;- }- wait.tv_sec = currenttime.tv_sec + dt_sec;-- // Initialize condition and mutex objects- pthread_mutex_init( &mutex, NULL );- pthread_cond_init( &cond, NULL );-- // Do a timed wait- pthread_mutex_lock( &mutex );- pthread_cond_timedwait( &cond, &mutex, &wait );- pthread_mutex_unlock( &mutex );-- // Destroy condition and mutex objects- pthread_mutex_destroy( &mutex );- pthread_cond_destroy( &cond );-}-
− glfw/lib/cocoa/cocoa_window.m
@@ -1,924 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <AvailabilityMacros.h>--//========================================================================-// Delegate for window related notifications-// (but also used as an application delegate)-//========================================================================--@interface GLFWWindowDelegate : NSObject-@end--@implementation GLFWWindowDelegate--- (BOOL)windowShouldClose:(id)window-{- if( _glfwWin.windowCloseCallback )- {- if( !_glfwWin.windowCloseCallback() )- {- return NO;- }- }-- // This is horribly ugly, but it works- glfwCloseWindow();- return NO;-}--- (void)windowDidResize:(NSNotification *)notification-{- [_glfwWin.context update];-- NSRect contentRect =- [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];- _glfwWin.width = contentRect.size.width;- _glfwWin.height = contentRect.size.height;-- if( _glfwWin.windowSizeCallback )- {- _glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height );- }-}--- (void)windowDidMiniaturize:(NSNotification *)notification-{- _glfwWin.iconified = GL_TRUE;-}--- (void)windowDidDeminiaturize:(NSNotification *)notification-{- _glfwWin.iconified = GL_FALSE;-}--- (void)windowDidBecomeKey:(NSNotification *)notification-{- _glfwWin.active = GL_TRUE;-}--- (void)windowDidResignKey:(NSNotification *)notification-{- _glfwWin.active = GL_FALSE;- _glfwInputDeactivation();-}--- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender-{- if( _glfwWin.windowCloseCallback )- {- if( !_glfwWin.windowCloseCallback() )- {- return NSTerminateCancel;- }- }-- // This is horribly ugly, but it works- glfwCloseWindow();- return NSTerminateCancel;-}--@end--// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject.-static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] =-{- /* 00 */ 'A',- /* 01 */ 'S',- /* 02 */ 'D',- /* 03 */ 'F',- /* 04 */ 'H',- /* 05 */ 'G',- /* 06 */ 'Z',- /* 07 */ 'X',- /* 08 */ 'C',- /* 09 */ 'V',- /* 0a */ -1,- /* 0b */ 'B',- /* 0c */ 'Q',- /* 0d */ 'W',- /* 0e */ 'E',- /* 0f */ 'R',- /* 10 */ 'Y',- /* 11 */ 'T',- /* 12 */ '1',- /* 13 */ '2',- /* 14 */ '3',- /* 15 */ '4',- /* 16 */ '6',- /* 17 */ '5',- /* 18 */ '=',- /* 19 */ '9',- /* 1a */ '7',- /* 1b */ '-',- /* 1c */ '8',- /* 1d */ '0',- /* 1e */ ']',- /* 1f */ 'O',- /* 20 */ 'U',- /* 21 */ '[',- /* 22 */ 'I',- /* 23 */ 'P',- /* 24 */ GLFW_KEY_ENTER,- /* 25 */ 'L',- /* 26 */ 'J',- /* 27 */ '\'',- /* 28 */ 'K',- /* 29 */ ';',- /* 2a */ '\\',- /* 2b */ ',',- /* 2c */ '/',- /* 2d */ 'N',- /* 2e */ 'M',- /* 2f */ '.',- /* 30 */ GLFW_KEY_TAB,- /* 31 */ GLFW_KEY_SPACE,- /* 32 */ '`',- /* 33 */ GLFW_KEY_BACKSPACE,- /* 34 */ -1,- /* 35 */ GLFW_KEY_ESC,- /* 36 */ GLFW_KEY_RSUPER,- /* 37 */ GLFW_KEY_LSUPER,- /* 38 */ GLFW_KEY_LSHIFT,- /* 39 */ GLFW_KEY_CAPS_LOCK,- /* 3a */ GLFW_KEY_LALT,- /* 3b */ GLFW_KEY_LCTRL,- /* 3c */ GLFW_KEY_RSHIFT,- /* 3d */ GLFW_KEY_RALT,- /* 3e */ GLFW_KEY_RCTRL,- /* 3f */ -1, /*Function*/- /* 40 */ GLFW_KEY_F17,- /* 41 */ GLFW_KEY_KP_DECIMAL,- /* 42 */ -1,- /* 43 */ GLFW_KEY_KP_MULTIPLY,- /* 44 */ -1,- /* 45 */ GLFW_KEY_KP_ADD,- /* 46 */ -1,- /* 47 */ -1, /*KeypadClear*/- /* 48 */ -1, /*VolumeUp*/- /* 49 */ -1, /*VolumeDown*/- /* 4a */ -1, /*Mute*/- /* 4b */ GLFW_KEY_KP_DIVIDE,- /* 4c */ GLFW_KEY_KP_ENTER,- /* 4d */ -1,- /* 4e */ GLFW_KEY_KP_SUBTRACT,- /* 4f */ GLFW_KEY_F18,- /* 50 */ GLFW_KEY_F19,- /* 51 */ GLFW_KEY_KP_EQUAL,- /* 52 */ GLFW_KEY_KP_0,- /* 53 */ GLFW_KEY_KP_1,- /* 54 */ GLFW_KEY_KP_2,- /* 55 */ GLFW_KEY_KP_3,- /* 56 */ GLFW_KEY_KP_4,- /* 57 */ GLFW_KEY_KP_5,- /* 58 */ GLFW_KEY_KP_6,- /* 59 */ GLFW_KEY_KP_7,- /* 5a */ GLFW_KEY_F20,- /* 5b */ GLFW_KEY_KP_8,- /* 5c */ GLFW_KEY_KP_9,- /* 5d */ -1,- /* 5e */ -1,- /* 5f */ -1,- /* 60 */ GLFW_KEY_F5,- /* 61 */ GLFW_KEY_F6,- /* 62 */ GLFW_KEY_F7,- /* 63 */ GLFW_KEY_F3,- /* 64 */ GLFW_KEY_F8,- /* 65 */ GLFW_KEY_F9,- /* 66 */ -1,- /* 67 */ GLFW_KEY_F11,- /* 68 */ -1,- /* 69 */ GLFW_KEY_F13,- /* 6a */ GLFW_KEY_F16,- /* 6b */ GLFW_KEY_F14,- /* 6c */ -1,- /* 6d */ GLFW_KEY_F10,- /* 6e */ -1,- /* 6f */ GLFW_KEY_F12,- /* 70 */ -1,- /* 71 */ GLFW_KEY_F15,- /* 72 */ GLFW_KEY_INSERT, /*Help*/- /* 73 */ GLFW_KEY_HOME,- /* 74 */ GLFW_KEY_PAGEUP,- /* 75 */ GLFW_KEY_DEL,- /* 76 */ GLFW_KEY_F4,- /* 77 */ GLFW_KEY_END,- /* 78 */ GLFW_KEY_F2,- /* 79 */ GLFW_KEY_PAGEDOWN,- /* 7a */ GLFW_KEY_F1,- /* 7b */ GLFW_KEY_LEFT,- /* 7c */ GLFW_KEY_RIGHT,- /* 7d */ GLFW_KEY_DOWN,- /* 7e */ GLFW_KEY_UP,- /* 7f */ -1,-};--//========================================================================-// Converts a Mac OS X keycode to a GLFW keycode-//========================================================================--static int convertMacKeyCode( unsigned int macKeyCode )-{- if( macKeyCode >= 128 )- {- return -1;- }-- // This treats keycodes as *positional*; that is, we'll return 'a'- // for the key left of 's', even on an AZERTY keyboard. The charInput- // function should still get 'q' though.- return MAC_TO_GLFW_KEYCODE_MAPPING[macKeyCode];-}--//========================================================================-// Content view class for the GLFW window-//========================================================================--@interface GLFWContentView : NSView-@end--@implementation GLFWContentView--- (BOOL)isOpaque-{- return YES;-}--- (BOOL)canBecomeKeyView-{- return YES;-}--- (BOOL)acceptsFirstResponder-{- return YES;-}--- (void)mouseDown:(NSEvent *)event-{- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );-}--- (void)mouseDragged:(NSEvent *)event-{- [self mouseMoved:event];-}--- (void)mouseUp:(NSEvent *)event-{- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE );-}--- (void)mouseMoved:(NSEvent *)event-{- if( _glfwWin.mouseLock )- {- _glfwInput.MousePosX += [event deltaX];- _glfwInput.MousePosY += [event deltaY];- }- else- {- NSPoint p = [event locationInWindow];-- // Cocoa coordinate system has origin at lower left- _glfwInput.MousePosX = p.x;- _glfwInput.MousePosY = [[_glfwWin.window contentView] bounds].size.height - p.y;- }-- if( _glfwWin.mousePosCallback )- {- _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY );- }-}--- (void)rightMouseDown:(NSEvent *)event-{- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );-}--- (void)rightMouseDragged:(NSEvent *)event-{- [self mouseMoved:event];-}--- (void)rightMouseUp:(NSEvent *)event-{- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE );-}--- (void)otherMouseDown:(NSEvent *)event-{- _glfwInputMouseClick( [event buttonNumber], GLFW_PRESS );-}--- (void)otherMouseDragged:(NSEvent *)event-{- [self mouseMoved:event];-}--- (void)otherMouseUp:(NSEvent *)event-{- _glfwInputMouseClick( [event buttonNumber], GLFW_RELEASE );-}--- (void)keyDown:(NSEvent *)event-{- NSUInteger length;- NSString* characters;- int i, code = convertMacKeyCode( [event keyCode] );-- if( code != -1 )- {- _glfwInputKey( code, GLFW_PRESS );-- if( [event modifierFlags] & NSCommandKeyMask )- {- if( !_glfwWin.sysKeysDisabled )- {- [super keyDown:event];- }- }- else- {- characters = [event characters];- length = [characters length];-- for( i = 0; i < length; i++ )- {- _glfwInputChar( [characters characterAtIndex:i], GLFW_PRESS );- }- }- }-}--- (void)flagsChanged:(NSEvent *)event-{- unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask;- int mode;-- if( newModifierFlags > _glfwWin.modifierFlags )- {- mode = GLFW_PRESS;- }- else- {- mode = GLFW_RELEASE;- }-- _glfwWin.modifierFlags = newModifierFlags;- _glfwInputKey( MAC_TO_GLFW_KEYCODE_MAPPING[[event keyCode]], mode );-}--- (void)keyUp:(NSEvent *)event-{- NSUInteger length;- NSString* characters;- int i, code = convertMacKeyCode( [event keyCode] );-- if( code != -1 )- {- _glfwInputKey( code, GLFW_RELEASE );-- characters = [event characters];- length = [characters length];-- for( i = 0; i < length; i++ )- {- _glfwInputChar( [characters characterAtIndex:i], GLFW_RELEASE );- }- }-}--- (void)scrollWheel:(NSEvent *)event-{- _glfwInput.WheelPosFloating += [event deltaY];- _glfwInput.WheelPos = lrint(_glfwInput.WheelPosFloating);-- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }-}--@end--//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Here is where the window is created, and the OpenGL rendering context is-// created-//========================================================================--int _glfwPlatformOpenWindow( int width, int height,- const _GLFWwndconfig *wndconfig,- const _GLFWfbconfig *fbconfig )-{- int colorBits;-- _glfwWin.pixelFormat = nil;- _glfwWin.window = nil;- _glfwWin.context = nil;- _glfwWin.delegate = nil;--#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070- // Fail if OpenGL 3.3 or above was requested- if( wndconfig->glMajor > 3 || wndconfig->glMajor == 3 && wndconfig->glMinor > 2 )- {- return GL_FALSE;- }-- if( wndconfig->glProfile )- {- // Fail if a profile other than core was explicitly selected- if( wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE )- {- return GL_FALSE;- }- }-#else- // Fail if OpenGL 3.0 or above was requested- if( wndconfig->glMajor > 2 )- {- return GL_FALSE;- }-#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/-- _glfwWin.delegate = [[GLFWWindowDelegate alloc] init];- if( _glfwWin.delegate == nil )- {- return GL_FALSE;- }-- [NSApp setDelegate:_glfwWin.delegate];-- // Mac OS X needs non-zero color size, so set resonable values- colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits;- if( colorBits == 0 )- {- colorBits = 24;- }- else if( colorBits < 15 )- {- colorBits = 15;- }-- // Ignored hints:- // OpenGLDebug- // pending it meaning anything on Mac OS X-- // Don't use accumulation buffer support; it's not accelerated- // Aux buffers probably aren't accelerated either-- CFDictionaryRef fullscreenMode = NULL;- if( wndconfig->mode == GLFW_FULLSCREEN )- {- fullscreenMode =- // I think it's safe to pass 0 to the refresh rate for this function- // rather than conditionalizing the code to call the version which- // doesn't specify refresh...- CGDisplayBestModeForParametersAndRefreshRateWithProperty(- CGMainDisplayID(),- colorBits + fbconfig->alphaBits,- width,- height,- wndconfig->refreshRate,- // Controversial, see macosx_fullscreen.m for discussion- kCGDisplayModeIsSafeForHardware,- NULL);-- width = [[(id)fullscreenMode objectForKey:(id)kCGDisplayWidth] intValue];- height = [[(id)fullscreenMode objectForKey:(id)kCGDisplayHeight] intValue];- }-- unsigned int styleMask = 0;- if( wndconfig->mode == GLFW_WINDOW )- {- styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask;-- if( !wndconfig->windowNoResize )- {- styleMask |= NSResizableWindowMask;- }- }- else- {- styleMask = NSBorderlessWindowMask;- }-- _glfwWin.window = [[NSWindow alloc]- initWithContentRect:NSMakeRect(0, 0, width, height)- styleMask:styleMask- backing:NSBackingStoreBuffered- defer:NO];- [_glfwWin.window setContentView:[[GLFWContentView alloc] init]];- [_glfwWin.window setDelegate:_glfwWin.delegate];- [_glfwWin.window setAcceptsMouseMovedEvents:YES];- [_glfwWin.window center];-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- CGCaptureAllDisplays();- CGDisplaySwitchToMode( CGMainDisplayID(), fullscreenMode );- }-- unsigned int attribute_count = 0;-#define ADD_ATTR(x) attributes[attribute_count++] = x-#define ADD_ATTR2(x, y) (void)({ ADD_ATTR(x); ADD_ATTR(y); })-#define MAX_ATTRS 64 // urrgh- NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS];-- ADD_ATTR( NSOpenGLPFADoubleBuffer );-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- ADD_ATTR( NSOpenGLPFAFullScreen );- ADD_ATTR( NSOpenGLPFANoRecovery );- ADD_ATTR2( NSOpenGLPFAScreenMask,- CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) );- }--#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070- if( wndconfig->glMajor > 2 )- {- ADD_ATTR2( NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core );- }-#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/-- ADD_ATTR2( NSOpenGLPFAColorSize, colorBits );-- if( fbconfig->alphaBits > 0)- {- ADD_ATTR2( NSOpenGLPFAAlphaSize, fbconfig->alphaBits );- }-- if( fbconfig->depthBits > 0)- {- ADD_ATTR2( NSOpenGLPFADepthSize, fbconfig->depthBits );- }-- if( fbconfig->stencilBits > 0)- {- ADD_ATTR2( NSOpenGLPFAStencilSize, fbconfig->stencilBits );- }-- int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits +- fbconfig->accumBlueBits + fbconfig->accumAlphaBits;-- if( accumBits > 0)- {- ADD_ATTR2( NSOpenGLPFAAccumSize, accumBits );- }-- if( fbconfig->auxBuffers > 0)- {- ADD_ATTR2( NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers );- }-- if( fbconfig->stereo)- {- ADD_ATTR( NSOpenGLPFAStereo );- }-- if( fbconfig->samples > 0)- {- ADD_ATTR2( NSOpenGLPFASampleBuffers, 1 );- ADD_ATTR2( NSOpenGLPFASamples, fbconfig->samples );- }-- ADD_ATTR(0);-- _glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];- if( _glfwWin.pixelFormat == nil )- {- return GL_FALSE;- }-- _glfwWin.context = [[NSOpenGLContext alloc] initWithFormat:_glfwWin.pixelFormat- shareContext:nil];- if( _glfwWin.context == nil )- {- return GL_FALSE;- }-- [_glfwWin.window makeKeyAndOrderFront:nil];- [_glfwWin.context setView:[_glfwWin.window contentView]];-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- // TODO: Make this work on pre-Leopard systems- [[_glfwWin.window contentView] enterFullScreenMode:[NSScreen mainScreen]- withOptions:nil];- }-- [_glfwWin.context makeCurrentContext];-- NSPoint point = [[NSCursor currentCursor] hotSpot];- _glfwInput.MousePosX = point.x;- _glfwInput.MousePosY = point.y;-- return GL_TRUE;-}--//========================================================================-// Properly kill the window / video display-//========================================================================--void _glfwPlatformCloseWindow( void )-{- [_glfwWin.window orderOut:nil];-- if( _glfwWin.fullscreen )- {- [[_glfwWin.window contentView] exitFullScreenModeWithOptions:nil];- CGDisplaySwitchToMode( CGMainDisplayID(),- (CFDictionaryRef)_glfwLibrary.DesktopMode );- CGReleaseAllDisplays();- }-- [_glfwWin.pixelFormat release];- _glfwWin.pixelFormat = nil;-- [NSOpenGLContext clearCurrentContext];- [_glfwWin.context release];- _glfwWin.context = nil;-- [_glfwWin.window setDelegate:nil];- [NSApp setDelegate:nil];- [_glfwWin.delegate release];- _glfwWin.delegate = nil;-- [_glfwWin.window close];- _glfwWin.window = nil;-- // TODO: Probably more cleanup-}--//========================================================================-// Set the window title-//========================================================================--void _glfwPlatformSetWindowTitle( const char *title )-{- [_glfwWin.window setTitle:[NSString stringWithCString:title- encoding:NSISOLatin1StringEncoding]];-}--//========================================================================-// Set the window size-//========================================================================--void _glfwPlatformSetWindowSize( int width, int height )-{- [_glfwWin.window setContentSize:NSMakeSize(width, height)];-}--//========================================================================-// Set the window position-//========================================================================--void _glfwPlatformSetWindowPos( int x, int y )-{- NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];-- // We assume here that the client code wants to position the window within the- // screen the window currently occupies- NSRect screenRect = [[_glfwWin.window screen] visibleFrame];- contentRect.origin = NSMakePoint(screenRect.origin.x + x,- screenRect.origin.y + screenRect.size.height -- y - contentRect.size.height);-- [_glfwWin.window setFrame:[_glfwWin.window frameRectForContentRect:contentRect]- display:YES];-}--//========================================================================-// Iconify the window-//========================================================================--void _glfwPlatformIconifyWindow( void )-{- [_glfwWin.window miniaturize:nil];-}--//========================================================================-// Restore (un-iconify) the window-//========================================================================--void _glfwPlatformRestoreWindow( void )-{- [_glfwWin.window deminiaturize:nil];-}--//========================================================================-// Swap buffers-//========================================================================--void _glfwPlatformSwapBuffers( void )-{- // ARP appears to be unnecessary, but this is future-proof- [_glfwWin.context flushBuffer];-}--//========================================================================-// Set double buffering swap interval-//========================================================================--void _glfwPlatformSwapInterval( int interval )-{- GLint sync = interval;- [_glfwWin.context setValues:&sync forParameter:NSOpenGLCPSwapInterval];-}--//========================================================================-// Write back window parameters into GLFW window structure-//========================================================================--void _glfwPlatformRefreshWindowParams( void )-{- GLint value;-- // Since GLFW 2.x doesn't understand screens, we use virtual screen zero-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAAccelerated- forVirtualScreen:0];- _glfwWin.accelerated = value;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAAlphaSize- forVirtualScreen:0];- _glfwWin.alphaBits = value;-- // It seems that the color size includes the size of the alpha channel- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAColorSize- forVirtualScreen:0];- value -= _glfwWin.alphaBits;- _glfwWin.redBits = value / 3;- _glfwWin.greenBits = value / 3;- _glfwWin.blueBits = value / 3;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFADepthSize- forVirtualScreen:0];- _glfwWin.depthBits = value;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAStencilSize- forVirtualScreen:0];- _glfwWin.stencilBits = value;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAAccumSize- forVirtualScreen:0];- _glfwWin.accumRedBits = value / 3;- _glfwWin.accumGreenBits = value / 3;- _glfwWin.accumBlueBits = value / 3;-- // TODO: Figure out what to set this value to- _glfwWin.accumAlphaBits = 0;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAAuxBuffers- forVirtualScreen:0];- _glfwWin.auxBuffers = value;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFAStereo- forVirtualScreen:0];- _glfwWin.stereo = value;-- [_glfwWin.pixelFormat getValues:&value- forAttribute:NSOpenGLPFASamples- forVirtualScreen:0];- _glfwWin.samples = value;-- _glfwWin.glDebug = GL_FALSE;-}--//========================================================================-// Poll for new window and input events-//========================================================================--void _glfwPlatformPollEvents( void )-{- NSEvent *event;-- do- {- event = [NSApp nextEventMatchingMask:NSAnyEventMask- untilDate:[NSDate distantPast]- inMode:NSDefaultRunLoopMode- dequeue:YES];-- if (event)- {- [NSApp sendEvent:event];- }- }- while (event);-- [_glfwLibrary.AutoreleasePool drain];- _glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];-}--//========================================================================-// Wait for new window and input events-//========================================================================--void _glfwPlatformWaitEvents( void )-{- // I wanted to pass NO to dequeue:, and rely on PollEvents to- // dequeue and send. For reasons not at all clear to me, passing- // NO to dequeue: causes this method never to return.- NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask- untilDate:[NSDate distantFuture]- inMode:NSDefaultRunLoopMode- dequeue:YES];- [NSApp sendEvent:event];-- _glfwPlatformPollEvents();-}--//========================================================================-// Hide mouse cursor (lock it)-//========================================================================--void _glfwPlatformHideMouseCursor( void )-{- [NSCursor hide];- CGAssociateMouseAndMouseCursorPosition( false );-}--//========================================================================-// Show mouse cursor (unlock it)-//========================================================================--void _glfwPlatformShowMouseCursor( void )-{- [NSCursor unhide];- CGAssociateMouseAndMouseCursorPosition( true );-}--//========================================================================-// Set physical mouse cursor position-//========================================================================--void _glfwPlatformSetMouseCursorPos( int x, int y )-{- // The library seems to assume that after calling this the mouse won't move,- // but obviously it will, and escape the app's window, and activate other apps,- // and other badness in pain. I think the API's just silly, but maybe I'm- // misunderstanding it...-- // Also, (x, y) are window coords...-- // Also, it doesn't seem possible to write this robustly without- // calculating the maximum y coordinate of all screens, since Cocoa's- // "global coordinates" are upside down from CG's...-- // Without this (once per app run, but it's convenient to do it here)- // events will be suppressed for a default of 0.25 seconds after we- // move the cursor.- CGSetLocalEventsSuppressionInterval( 0.0 );-- NSPoint localPoint = NSMakePoint( x, y );- NSPoint globalPoint = [_glfwWin.window convertBaseToScreen:localPoint];- CGPoint mainScreenOrigin = CGDisplayBounds( CGMainDisplayID() ).origin;- double mainScreenHeight = CGDisplayBounds( CGMainDisplayID() ).size.height;- CGPoint targetPoint = CGPointMake( globalPoint.x - mainScreenOrigin.x,- mainScreenHeight - globalPoint.y - mainScreenOrigin.y );- CGDisplayMoveCursorToPoint( CGMainDisplayID(), targetPoint );-}-
− glfw/lib/cocoa/platform.h
@@ -1,252 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Cocoa/NSOpenGL-// API Version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#ifndef _platform_h_-#define _platform_h_---// This is the Mac OS X version of GLFW-#define _GLFW_MAC_OS_X--#if defined(__OBJC__)-#import <Cocoa/Cocoa.h>-#else-typedef void *id;-#endif--#include <pthread.h>--#include "../../include/GL/glfw.h"---#ifndef GL_VERSION_3_0--typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);--#endif /*GL_VERSION_3_0*/---//========================================================================-// GLFW platform specific types-//========================================================================--//-------------------------------------------------------------------------// Pointer length integer-//-------------------------------------------------------------------------typedef intptr_t GLFWintptr;--//-------------------------------------------------------------------------// Window structure-//-------------------------------------------------------------------------typedef struct _GLFWwin_struct _GLFWwin;--struct _GLFWwin_struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // User callback functions- GLFWwindowsizefun windowSizeCallback;- GLFWwindowclosefun windowCloseCallback;- GLFWwindowrefreshfun windowRefreshCallback;- GLFWmousebuttonfun mouseButtonCallback;- GLFWmouseposfun mousePosCallback;- GLFWmousewheelfun mouseWheelCallback;- GLFWkeyfun keyCallback;- GLFWcharfun charCallback;-- // User selected window settings- int fullscreen; // Fullscreen flag- int mouseLock; // Mouse-lock flag- int autoPollEvents; // Auto polling flag- int sysKeysDisabled; // System keys disabled flag- int windowNoResize; // Resize- and maximize gadgets disabled flag- int refreshRate; // Vertical monitor refresh rate-- // Window status & parameters- int opened; // Flag telling if window is opened or not- int active; // Application active flag- int iconified; // Window iconified flag- int width, height; // Window width and heigth- int accelerated; // GL_TRUE if window is HW accelerated-- // Framebuffer attributes- int redBits;- int greenBits;- int blueBits;- int alphaBits;- int depthBits;- int stencilBits;- int accumRedBits;- int accumGreenBits;- int accumBlueBits;- int accumAlphaBits;- int auxBuffers;- int stereo;- int samples;-- // OpenGL extensions and context attributes- int has_GL_SGIS_generate_mipmap;- int has_GL_ARB_texture_non_power_of_two;- int glMajor, glMinor, glRevision;- int glForward, glDebug, glProfile;-- PFNGLGETSTRINGIPROC GetStringi;--// ========= PLATFORM SPECIFIC PART ======================================-- id window;- id pixelFormat;- id context;- id delegate;- unsigned int modifierFlags;-};--GLFWGLOBAL _GLFWwin _glfwWin;---//-------------------------------------------------------------------------// Library global data-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Window opening hints- _GLFWhints hints;--// ========= PLATFORM SPECIFIC PART ======================================-- // Timer data- struct {- double t0;- } Timer;-- // dlopen handle for dynamically-loading extension function pointers- void *OpenGLFramework;-- int Unbundled;-- id DesktopMode;-- id AutoreleasePool;--} _glfwLibrary;---//-------------------------------------------------------------------------// User input status (some of this should go in _GLFWwin)-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Mouse status- int MousePosX, MousePosY;- int WheelPos;- char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];-- // Keyboard status- char Key[ GLFW_KEY_LAST+1 ];- int LastChar;-- // User selected settings- int StickyKeys;- int StickyMouseButtons;- int KeyRepeat;---// ========= PLATFORM SPECIFIC PART ======================================-- double WheelPosFloating;--} _glfwInput;--//-------------------------------------------------------------------------// Thread information-//-------------------------------------------------------------------------typedef struct _GLFWthread_struct _GLFWthread;--// Thread record (one for each thread)-struct _GLFWthread_struct {-- // Pointer to previous and next threads in linked list- _GLFWthread *Previous, *Next;-- // GLFW user side thread information- GLFWthread ID;- GLFWthreadfun Function;-- // System side thread information- pthread_t PosixID;-};--// General thread information-GLFWGLOBAL struct {-- // Critical section lock- pthread_mutex_t CriticalSection;-- // Next thread ID to use (increments for every created thread)- GLFWthread NextID;-- // First thread in linked list (always the main thread)- _GLFWthread First;--} _glfwThrd;---//========================================================================-// Macros for encapsulating critical code sections (i.e. making parts-// of GLFW thread safe)-//========================================================================--// Define so we can use the same thread code as X11-#define _glfw_numprocessors(n) { \- int mib[2], ncpu; \- size_t len = 1; \- mib[0] = CTL_HW; \- mib[1] = HW_NCPU; \- n = 1; \- if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \- { \- if( len > 0 ) \- { \- n = ncpu; \- } \- } \-}--// Thread list management-#define ENTER_THREAD_CRITICAL_SECTION \-pthread_mutex_lock( &_glfwThrd.CriticalSection );-#define LEAVE_THREAD_CRITICAL_SECTION \-pthread_mutex_unlock( &_glfwThrd.CriticalSection );---#endif // _platform_h_
− glfw/lib/enable.c
@@ -1,310 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Enable (show) mouse cursor-//========================================================================--static void enableMouseCursor( void )-{- int centerPosX, centerPosY;-- if( !_glfwWin.opened || !_glfwWin.mouseLock )- {- return;- }-- // Show mouse cursor- _glfwPlatformShowMouseCursor();-- centerPosX = _glfwWin.width / 2;- centerPosY = _glfwWin.height / 2;-- if( centerPosX != _glfwInput.MousePosX || centerPosY != _glfwInput.MousePosY )- {- _glfwPlatformSetMouseCursorPos( centerPosX, centerPosY );-- _glfwInput.MousePosX = centerPosX;- _glfwInput.MousePosY = centerPosY;-- if( _glfwWin.mousePosCallback )- {- _glfwWin.mousePosCallback( _glfwInput.MousePosX,- _glfwInput.MousePosY );- }- }-- // From now on the mouse is unlocked- _glfwWin.mouseLock = GL_FALSE;-}--//========================================================================-// Disable (hide) mouse cursor-//========================================================================--static void disableMouseCursor( void )-{- if( !_glfwWin.opened || _glfwWin.mouseLock )- {- return;- }-- // Hide mouse cursor- _glfwPlatformHideMouseCursor();-- // Move cursor to the middle of the window- _glfwPlatformSetMouseCursorPos( _glfwWin.width >> 1,- _glfwWin.height >> 1 );-- // From now on the mouse is locked- _glfwWin.mouseLock = GL_TRUE;-}---//========================================================================-// Enable sticky keys-//========================================================================--static void enableStickyKeys( void )-{- _glfwInput.StickyKeys = 1;-}--//========================================================================-// Disable sticky keys-//========================================================================--static void disableStickyKeys( void )-{- int i;-- _glfwInput.StickyKeys = 0;-- // Release all sticky keys- for( i = 0; i <= GLFW_KEY_LAST; i++ )- {- if( _glfwInput.Key[ i ] == 2 )- {- _glfwInput.Key[ i ] = 0;- }- }-}---//========================================================================-// Enable sticky mouse buttons-//========================================================================--static void enableStickyMouseButtons( void )-{- _glfwInput.StickyMouseButtons = 1;-}--//========================================================================-// Disable sticky mouse buttons-//========================================================================--static void disableStickyMouseButtons( void )-{- int i;-- _glfwInput.StickyMouseButtons = 0;-- // Release all sticky mouse buttons- for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i++ )- {- if( _glfwInput.MouseButton[ i ] == 2 )- {- _glfwInput.MouseButton[ i ] = 0;- }- }-}---//========================================================================-// Enable system keys-//========================================================================--static void enableSystemKeys( void )-{- if( !_glfwWin.sysKeysDisabled )- {- return;- }-- _glfwPlatformEnableSystemKeys();-- // Indicate that system keys are no longer disabled- _glfwWin.sysKeysDisabled = GL_FALSE;-}--//========================================================================-// Disable system keys-//========================================================================--static void disableSystemKeys( void )-{- if( _glfwWin.sysKeysDisabled )- {- return;- }-- _glfwPlatformDisableSystemKeys();-- // Indicate that system keys are now disabled- _glfwWin.sysKeysDisabled = GL_TRUE;-}---//========================================================================-// Enable key repeat-//========================================================================--static void enableKeyRepeat( void )-{- _glfwInput.KeyRepeat = 1;-}--//========================================================================-// Disable key repeat-//========================================================================--static void disableKeyRepeat( void )-{- _glfwInput.KeyRepeat = 0;-}---//========================================================================-// Enable automatic event polling-//========================================================================--static void enableAutoPollEvents( void )-{- _glfwWin.autoPollEvents = 1;-}--//========================================================================-// Disable automatic event polling-//========================================================================--static void disableAutoPollEvents( void )-{- _glfwWin.autoPollEvents = 0;-}----//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Enable certain GLFW/window/system functions.-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwEnable( int token )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- switch( token )- {- case GLFW_MOUSE_CURSOR:- enableMouseCursor();- break;- case GLFW_STICKY_KEYS:- enableStickyKeys();- break;- case GLFW_STICKY_MOUSE_BUTTONS:- enableStickyMouseButtons();- break;- case GLFW_SYSTEM_KEYS:- enableSystemKeys();- break;- case GLFW_KEY_REPEAT:- enableKeyRepeat();- break;- case GLFW_AUTO_POLL_EVENTS:- enableAutoPollEvents();- break;- default:- break;- }-}---//========================================================================-// Disable certain GLFW/window/system functions.-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwDisable( int token )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- switch( token )- {- case GLFW_MOUSE_CURSOR:- disableMouseCursor();- break;- case GLFW_STICKY_KEYS:- disableStickyKeys();- break;- case GLFW_STICKY_MOUSE_BUTTONS:- disableStickyMouseButtons();- break;- case GLFW_SYSTEM_KEYS:- disableSystemKeys();- break;- case GLFW_KEY_REPEAT:- disableKeyRepeat();- break;- case GLFW_AUTO_POLL_EVENTS:- disableAutoPollEvents();- break;- default:- break;- }-}-
− glfw/lib/fullscreen.c
@@ -1,94 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Get a list of available video modes-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount )-{- int count, i, swap, res1, res2, depth1, depth2;- GLFWvidmode vm;-- if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 )- {- return 0;- }-- // Get list of video modes- count = _glfwPlatformGetVideoModes( list, maxcount );-- // Sort list (bubble sort)- do- {- swap = 0;- for( i = 0; i < count-1; ++ i )- {- res1 = list[i].Width*list[i].Height;- depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits;- res2 = list[i+1].Width*list[i+1].Height;- depth2 = list[i+1].RedBits+list[i+1].GreenBits+- list[i+1].BlueBits;- if( (depth2<depth1) || ((depth2==depth1) && (res2<res1)) )- {- vm = list[i];- list[i] = list[i+1];- list[i+1] = vm;- swap = 1;- }- }- }- while( swap );-- return count;-}---//========================================================================-// Get the desktop video mode-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode )-{- if( !_glfwInitialized || mode == (GLFWvidmode*) 0 )- {- return;- }-- _glfwPlatformGetDesktopMode( mode );-}-
− glfw/lib/glext.c
@@ -1,283 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--#ifndef GL_VERSION_3_0-#define GL_NUM_EXTENSIONS 0x821D-#define GL_CONTEXT_FLAGS 0x821E-#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001-#endif--#ifndef GL_VERSION_3_2-#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001-#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002-#define GL_CONTEXT_PROFILE_MASK 0x9126-#endif--//========================================================================-// Parses the OpenGL version string and extracts the version number-//========================================================================--void _glfwParseGLVersion( int *major, int *minor, int *rev )-{- GLuint _major, _minor = 0, _rev = 0;- const GLubyte *version;- const GLubyte *ptr;-- // Get OpenGL version string- version = glGetString( GL_VERSION );- if( !version )- {- return;- }-- // Parse string- ptr = version;- for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )- {- _major = 10*_major + (*ptr - '0');- }- if( *ptr == '.' )- {- ptr ++;- for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )- {- _minor = 10*_minor + (*ptr - '0');- }- if( *ptr == '.' )- {- ptr ++;- for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )- {- _rev = 10*_rev + (*ptr - '0');- }- }- }-- // Return parsed values- *major = _major;- *minor = _minor;- *rev = _rev;-}--//========================================================================-// Check if a string can be found in an OpenGL extension string-//========================================================================--int _glfwStringInExtensionString( const char *string,- const GLubyte *extensions )-{- const GLubyte *start;- GLubyte *where, *terminator;-- // It takes a bit of care to be fool-proof about parsing the- // OpenGL extensions string. Don't be fooled by sub-strings,- // etc.- start = extensions;- while( 1 )- {- where = (GLubyte *) strstr( (const char *) start, string );- if( !where )- {- return GL_FALSE;- }- terminator = where + strlen( string );- if( where == start || *(where - 1) == ' ' )- {- if( *terminator == ' ' || *terminator == '\0' )- {- break;- }- }- start = terminator;- }-- return GL_TRUE;-}---//========================================================================-// Reads back OpenGL context properties from the current context-//========================================================================--void _glfwRefreshContextParams( void )-{- _glfwParseGLVersion( &_glfwWin.glMajor, &_glfwWin.glMinor,- &_glfwWin.glRevision );-- _glfwWin.glProfile = 0;- _glfwWin.glForward = GL_FALSE;-- // Read back the context profile, if applicable- if( _glfwWin.glMajor >= 3 )- {- GLint flags;- glGetIntegerv( GL_CONTEXT_FLAGS, &flags );-- if( flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT )- {- _glfwWin.glForward = GL_TRUE;- }- }-- if( _glfwWin.glMajor > 3 ||- ( _glfwWin.glMajor == 3 && _glfwWin.glMinor >= 2 ) )- {- GLint mask;- glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &mask );-- if( mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT )- {- _glfwWin.glProfile = GLFW_OPENGL_COMPAT_PROFILE;- }- else if( mask & GL_CONTEXT_CORE_PROFILE_BIT )- {- _glfwWin.glProfile = GLFW_OPENGL_CORE_PROFILE;- }- }-}---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Check if an OpenGL extension is available at runtime-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension )-{- const GLubyte *extensions;- GLubyte *where;- GLint count;- int i;-- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return GL_FALSE;- }-- // Extension names should not have spaces- where = (GLubyte *) strchr( extension, ' ' );- if( where || *extension == '\0' )- {- return GL_FALSE;- }-- if( _glfwWin.glMajor < 3 )- {- // Check if extension is in the old style OpenGL extensions string-- extensions = glGetString( GL_EXTENSIONS );- if( extensions != NULL )- {- if( _glfwStringInExtensionString( extension, extensions ) )- {- return GL_TRUE;- }- }- }- else- {- // Check if extension is in the modern OpenGL extensions string list-- glGetIntegerv( GL_NUM_EXTENSIONS, &count );-- for( i = 0; i < count; i++ )- {- if( strcmp( (const char*) _glfwWin.GetStringi( GL_EXTENSIONS, i ),- extension ) == 0 )- {- return GL_TRUE;- }- }- }-- // Additional platform specific extension checking (e.g. WGL)- if( _glfwPlatformExtensionSupported( extension ) )- {- return GL_TRUE;- }-- return GL_FALSE;-}---//========================================================================-// Get the function pointer to an OpenGL function. This function can be-// used to get access to extended OpenGL functions.-//========================================================================--GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname )-{- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return NULL;- }-- return _glfwPlatformGetProcAddress( procname );-}---//========================================================================-// Returns the OpenGL version-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev )-{- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- if( major != NULL )- {- *major = _glfwWin.glMajor;- }- if( minor != NULL )- {- *minor = _glfwWin.glMinor;- }- if( rev != NULL )- {- *rev = _glfwWin.glRevision;- }-}-
− glfw/lib/image.c
@@ -1,629 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--//========================================================================-// Description:-//-// This module acts as an interface for different image file formats (the-// image file format is detected automatically).-//-// By default the loaded image is rescaled (using bilinear interpolation)-// to the next higher 2^N x 2^M resolution, unless it has a valid-// 2^N x 2^M resolution. The interpolation is quite slow, even if the-// routine has been optimized for speed (a 200x200 RGB image is scaled to-// 256x256 in ~30 ms on a P3-500).-//-// Paletted images are converted to RGB/RGBA images.-//-// A convenience function is also included (glfwLoadTexture2D), which-// loads a texture image from a file directly to OpenGL texture memory,-// with an option to generate all mipmap levels. GL_SGIS_generate_mipmap-// is used whenever available, which should give an optimal mipmap-// generation speed (possibly performed in hardware). A software fallback-// method is included when GL_SGIS_generate_mipmap is not supported (it-// generates all mipmaps of a 256x256 RGB texture in ~3 ms on a P3-500).-//-//========================================================================---#include "internal.h"---// We want to support automatic mipmap generation-#ifndef GL_SGIS_generate_mipmap- #define GL_GENERATE_MIPMAP_SGIS 0x8191- #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192- #define GL_SGIS_generate_mipmap 1-#endif // GL_SGIS_generate_mipmap---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Upsample image, from size w1 x h1 to w2 x h2-//========================================================================--static void UpsampleImage( unsigned char *src, unsigned char *dst,- int w1, int h1, int w2, int h2, int bpp )-{- int m, n, k, x, y, col8;- float dx, dy, xstep, ystep, col, col1, col2;- unsigned char *src1, *src2, *src3, *src4;-- // Calculate scaling factor- xstep = (float)(w1-1) / (float)(w2-1);- ystep = (float)(h1-1) / (float)(h2-1);-- // Copy source data to destination data with bilinear interpolation- // Note: The rather strange look of this routine is a direct result of- // my attempts at optimizing it. Improvements are welcome!- dy = 0.0f;- y = 0;- for( n = 0; n < h2; n ++ )- {- dx = 0.0f;- src1 = &src[ y*w1*bpp ];- src3 = y < (h1-1) ? src1 + w1*bpp : src1;- src2 = src1 + bpp;- src4 = src3 + bpp;- x = 0;- for( m = 0; m < w2; m ++ )- {- for( k = 0; k < bpp; k ++ )- {- col1 = *src1 ++;- col2 = *src2 ++;- col = col1 + (col2 - col1) * dx;- col1 = *src3 ++;- col2 = *src4 ++;- col2 = col1 + (col2 - col1) * dx;- col += (col2 - col) * dy;- col8 = (int) (col + 0.5);- if( col8 >= 256 ) col8 = 255;- *dst++ = (unsigned char) col8;- }- dx += xstep;- if( dx >= 1.0f )- {- x ++;- dx -= 1.0f;- if( x >= (w1-1) )- {- src2 = src1;- src4 = src3;- }- }- else- {- src1 -= bpp;- src2 -= bpp;- src3 -= bpp;- src4 -= bpp;- }- }- dy += ystep;- if( dy >= 1.0f )- {- y ++;- dy -= 1.0f;- }- }-}---//========================================================================-// Build the next mip-map level-//========================================================================--static int HalveImage( GLubyte *src, int *width, int *height,- int components )-{- int halfwidth, halfheight, m, n, k, idx1, idx2;- GLubyte *dst;-- // Last level?- if( *width <= 1 && *height <= 1 )- {- return GL_FALSE;- }-- // Calculate new width and height (handle 1D case)- halfwidth = *width > 1 ? *width / 2 : 1;- halfheight = *height > 1 ? *height / 2 : 1;-- // Downsample image with a simple box-filter- dst = src;- if( *width == 1 || *height == 1 )- {- // 1D case- for( m = 0; m < halfwidth+halfheight-1; m ++ )- {- for( k = 0; k < components; k ++ )- {- *dst ++ = (GLubyte) (((int)*src +- (int)src[components] + 1) >> 1);- src ++;- }- src += components;- }- }- else- {- // 2D case- idx1 = *width*components;- idx2 = (*width+1)*components;- for( m = 0; m < halfheight; m ++ )- {- for( n = 0; n < halfwidth; n ++ )- {- for( k = 0; k < components; k ++ )- {- *dst ++ = (GLubyte) (((int)*src +- (int)src[components] +- (int)src[idx1] +- (int)src[idx2] + 2) >> 2);- src ++;- }- src += components;- }- src += components * (*width);- }- }-- // Return new width and height- *width = halfwidth;- *height = halfheight;-- return GL_TRUE;-}---//========================================================================-// Rescales an image into power-of-two dimensions-//========================================================================--static int RescaleImage( GLFWimage* image )-{- int width, height, log2, newsize;- unsigned char *data;-- // Calculate next larger 2^N width- for( log2 = 0, width = image->Width; width > 1; width >>= 1, log2 ++ )- ;-- width = (int) 1 << log2;- if( width < image->Width )- {- width <<= 1;- }-- // Calculate next larger 2^M height- for( log2 = 0, height = image->Height; height > 1; height >>= 1, log2 ++ )- ;-- height = (int) 1 << log2;- if( height < image->Height )- {- height <<= 1;- }-- // Do we really need to rescale?- if( width != image->Width || height != image->Height )- {- // Allocate memory for new (upsampled) image data- newsize = width * height * image->BytesPerPixel;- data = (unsigned char *) malloc( newsize );- if( data == NULL )- {- free( image->Data );- return GL_FALSE;- }-- // Copy old image data to new image data with interpolation- UpsampleImage( image->Data, data, image->Width, image->Height,- width, height, image->BytesPerPixel );-- // Free memory for old image data (not needed anymore)- free( image->Data );-- // Set pointer to new image data, and set new image dimensions- image->Data = data;- image->Width = width;- image->Height = height;- }-- return GL_TRUE;-}---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Read an image from a named file-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img,- int flags )-{- _GLFWstream stream;-- // Is GLFW initialized?- if( !_glfwInitialized )- {- return GL_FALSE;- }-- // Start with an empty image descriptor- img->Width = 0;- img->Height = 0;- img->BytesPerPixel = 0;- img->Data = NULL;-- // Open file- if( !_glfwOpenFileStream( &stream, name, "rb" ) )- {- return GL_FALSE;- }-- // We only support TGA files at the moment- if( !_glfwReadTGA( &stream, img, flags ) )- {- _glfwCloseStream( &stream );- return GL_FALSE;- }-- // Close stream- _glfwCloseStream( &stream );-- // Should we rescale the image to closest 2^N x 2^M resolution?- if( !(flags & GLFW_NO_RESCALE_BIT) )- {- if( !RescaleImage( img ) )- {- return GL_FALSE;- }- }-- // Interpret BytesPerPixel as an OpenGL format- switch( img->BytesPerPixel )- {- default:- case 1:- if( flags & GLFW_ALPHA_MAP_BIT )- {- img->Format = GL_ALPHA;- }- else- {- img->Format = GL_LUMINANCE;- }- break;- case 3:- img->Format = GL_RGB;- break;- case 4:- img->Format = GL_RGBA;- break;- }-- return GL_TRUE;-}---//========================================================================-// Read an image file from a memory buffer-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags )-{- _GLFWstream stream;-- // Is GLFW initialized?- if( !_glfwInitialized )- {- return GL_FALSE;- }-- // Start with an empty image descriptor- img->Width = 0;- img->Height = 0;- img->BytesPerPixel = 0;- img->Data = NULL;-- // Open buffer- if( !_glfwOpenBufferStream( &stream, (void*) data, size ) )- {- return GL_FALSE;- }-- // We only support TGA files at the moment- if( !_glfwReadTGA( &stream, img, flags ) )- {- _glfwCloseStream( &stream );- return GL_FALSE;- }-- // Close stream- _glfwCloseStream( &stream );-- // Should we rescale the image to closest 2^N x 2^M resolution?- if( !(flags & GLFW_NO_RESCALE_BIT) )- {- if( !RescaleImage( img ) )- {- return GL_FALSE;- }- }-- // Interpret BytesPerPixel as an OpenGL format- switch( img->BytesPerPixel )- {- default:- case 1:- if( flags & GLFW_ALPHA_MAP_BIT )- {- img->Format = GL_ALPHA;- }- else- {- img->Format = GL_LUMINANCE;- }- break;- case 3:- img->Format = GL_RGB;- break;- case 4:- img->Format = GL_RGBA;- break;- }-- return GL_TRUE;-}---//========================================================================-// Free allocated memory for an image-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- // Free memory- if( img->Data != NULL )- {- free( img->Data );- img->Data = NULL;- }-- // Clear all fields- img->Width = 0;- img->Height = 0;- img->Format = 0;- img->BytesPerPixel = 0;-}---//========================================================================-// Read an image from a file, and upload it to texture memory-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags )-{- GLFWimage img;-- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return GL_FALSE;- }-- // Force rescaling if necessary- if( !_glfwWin.has_GL_ARB_texture_non_power_of_two )- {- flags &= (~GLFW_NO_RESCALE_BIT);- }-- // Read image from file- if( !glfwReadImage( name, &img, flags ) )- {- return GL_FALSE;- }-- if( !glfwLoadTextureImage2D( &img, flags ) )- {- return GL_FALSE;- }-- // Data buffer is not needed anymore- glfwFreeImage( &img );-- return GL_TRUE;-}---//========================================================================-// Read an image from a buffer, and upload it to texture memory-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags )-{- GLFWimage img;-- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return GL_FALSE;- }-- // Force rescaling if necessary- if( !_glfwWin.has_GL_ARB_texture_non_power_of_two )- {- flags &= (~GLFW_NO_RESCALE_BIT);- }-- // Read image from file- if( !glfwReadMemoryImage( data, size, &img, flags ) )- {- return GL_FALSE;- }-- if( !glfwLoadTextureImage2D( &img, flags ) )- {- return GL_FALSE;- }-- // Data buffer is not needed anymore- glfwFreeImage( &img );-- return GL_TRUE;-}---//========================================================================-// Upload an image object to texture memory-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags )-{- GLint UnpackAlignment, GenMipMap;- int level, format, AutoGen, newsize, n;- unsigned char *data, *dataptr;-- // Is GLFW initialized?- if( !_glfwInitialized || !_glfwWin.opened )- {- return GL_FALSE;- }-- // TODO: Use GL_MAX_TEXTURE_SIZE or GL_PROXY_TEXTURE_2D to determine- // whether the image size is valid.- // NOTE: May require box filter downsampling routine.-- // Do we need to convert the alpha map to RGBA format (OpenGL 1.0)?- if( (_glfwWin.glMajor == 1) && (_glfwWin.glMinor == 0) &&- (img->Format == GL_ALPHA) )- {- // We go to RGBA representation instead- img->BytesPerPixel = 4;-- // Allocate memory for new RGBA image data- newsize = img->Width * img->Height * img->BytesPerPixel;- data = (unsigned char *) malloc( newsize );- if( data == NULL )- {- free( img->Data );- return GL_FALSE;- }-- // Convert Alpha map to RGBA- dataptr = data;- for( n = 0; n < (img->Width*img->Height); ++ n )- {- *dataptr ++ = 255;- *dataptr ++ = 255;- *dataptr ++ = 255;- *dataptr ++ = img->Data[n];- }-- // Free memory for old image data (not needed anymore)- free( img->Data );-- // Set pointer to new image data- img->Data = data;- }-- // Set unpack alignment to one byte- glGetIntegerv( GL_UNPACK_ALIGNMENT, &UnpackAlignment );- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );-- // Should we use automatic mipmap generation?- AutoGen = ( flags & GLFW_BUILD_MIPMAPS_BIT ) &&- _glfwWin.has_GL_SGIS_generate_mipmap;-- // Enable automatic mipmap generation- if( AutoGen )- {- glGetTexParameteriv( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,- &GenMipMap );- glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,- GL_TRUE );- }-- // Format specification is different for OpenGL 1.0- if( _glfwWin.glMajor == 1 && _glfwWin.glMinor == 0 )- {- format = img->BytesPerPixel;- }- else- {- format = img->Format;- }-- // Upload to texture memeory- level = 0;- do- {- // Upload this mipmap level- glTexImage2D( GL_TEXTURE_2D, level, format,- img->Width, img->Height, 0, format,- GL_UNSIGNED_BYTE, (void*) img->Data );-- // Build next mipmap level manually, if required- if( ( flags & GLFW_BUILD_MIPMAPS_BIT ) && !AutoGen )- {- level = HalveImage( img->Data, &img->Width,- &img->Height, img->BytesPerPixel ) ?- level + 1 : 0;- }- }- while( level != 0 );-- // Restore old automatic mipmap generation state- if( AutoGen )- {- glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,- GenMipMap );- }-- // Restore old unpack alignment- glPixelStorei( GL_UNPACK_ALIGNMENT, UnpackAlignment );-- return GL_TRUE;-}-
− glfw/lib/init.c
@@ -1,110 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#define _init_c_-#include "internal.h"---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Initialize various GLFW state-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwInit( void )-{- // Is GLFW already initialized?- if( _glfwInitialized )- {- return GL_TRUE;- }-- memset( &_glfwLibrary, 0, sizeof( _glfwLibrary ) );- memset( &_glfwWin, 0, sizeof( _glfwWin ) );-- // Window is not yet opened- _glfwWin.opened = GL_FALSE;-- // Default enable/disable settings- _glfwWin.sysKeysDisabled = GL_FALSE;-- // Clear window hints- _glfwClearWindowHints();-- // Platform specific initialization- if( !_glfwPlatformInit() )- {- return GL_FALSE;- }-- // Form now on, GLFW state is valid- _glfwInitialized = GL_TRUE;-- return GL_TRUE;-}----//========================================================================-// Close window and kill all threads.-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwTerminate( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- // Platform specific termination- if( !_glfwPlatformTerminate() )- {- return;- }-- // GLFW is no longer initialized- _glfwInitialized = GL_FALSE;-}---//========================================================================-// Get GLFW version-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev )-{- if( major != NULL ) *major = GLFW_VERSION_MAJOR;- if( minor != NULL ) *minor = GLFW_VERSION_MINOR;- if( rev != NULL ) *rev = GLFW_VERSION_REVISION;-}-
− glfw/lib/input.c
@@ -1,269 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//========================================================================-// Return key state-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetKey( int key )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return GLFW_RELEASE;- }-- // Is it a valid key?- if( key < 0 || key > GLFW_KEY_LAST )- {- return GLFW_RELEASE;- }-- if( _glfwInput.Key[ key ] == GLFW_STICK )- {- // Sticky mode: release key now- _glfwInput.Key[ key ] = GLFW_RELEASE;- return GLFW_PRESS;- }-- return (int) _glfwInput.Key[ key ];-}---//========================================================================-// Return mouse button state-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return GLFW_RELEASE;- }-- // Is it a valid mouse button?- if( button < 0 || button > GLFW_MOUSE_BUTTON_LAST )- {- return GLFW_RELEASE;- }-- if( _glfwInput.MouseButton[ button ] == GLFW_STICK )- {- // Sticky mode: release mouse button now- _glfwInput.MouseButton[ button ] = GLFW_RELEASE;- return GLFW_PRESS;- }-- return (int) _glfwInput.MouseButton[ button ];-}---//========================================================================-// Return mouse cursor position-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Return mouse position- if( xpos != NULL )- {- *xpos = _glfwInput.MousePosX;- }- if( ypos != NULL )- {- *ypos = _glfwInput.MousePosY;- }-}---//========================================================================-// Sets the mouse cursor position-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Don't do anything if the mouse position did not change- if( xpos == _glfwInput.MousePosX && ypos == _glfwInput.MousePosY )- {- return;- }-- // Set GLFW mouse position- _glfwInput.MousePosX = xpos;- _glfwInput.MousePosY = ypos;-- // If we have a locked mouse, do not change cursor position- if( _glfwWin.mouseLock )- {- return;- }-- // Update physical cursor position- _glfwPlatformSetMouseCursorPos( xpos, ypos );-}---//========================================================================-// Return mouse wheel position-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return 0;- }-- // Return mouse wheel position- return _glfwInput.WheelPos;-}---//========================================================================-// Set mouse wheel position-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set mouse wheel position- _glfwInput.WheelPos = pos;-}---//========================================================================-// Set callback function for keyboard input-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.keyCallback = cbfun;-}---//========================================================================-// Set callback function for character input-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.charCallback = cbfun;-}---//========================================================================-// Set callback function for mouse clicks-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.mouseButtonCallback = cbfun;-}---//========================================================================-// Set callback function for mouse moves-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.mousePosCallback = cbfun;-- // Call the callback function to let the application know the current- // mouse position- if( cbfun )- {- cbfun( _glfwInput.MousePosX, _glfwInput.MousePosY );- }-}---//========================================================================-// Set callback function for mouse wheel-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.mouseWheelCallback = cbfun;-- // Call the callback function to let the application know the current- // mouse wheel position- if( cbfun )- {- cbfun( _glfwInput.WheelPos );- }-}-
− glfw/lib/internal.h
@@ -1,265 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// File: internal.h-// Platform: Any-// API version: 2.7-// WWW: http://glfw.sourceforge.net-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#ifndef _internal_h_-#define _internal_h_--//========================================================================-// GLFWGLOBAL is a macro that places all global variables in the init.c-// module (all other modules reference global variables as 'extern')-//========================================================================--#if defined( _init_c_ )-#define GLFWGLOBAL-#else-#define GLFWGLOBAL extern-#endif---//========================================================================-// Input handling definitions-//========================================================================--// Internal key and button state/action definitions-#define GLFW_STICK 2---//========================================================================-// System independent include files-//========================================================================--#include <stdlib.h>-#include <string.h>-#include <stdio.h>---//-------------------------------------------------------------------------// Window opening hints (set by glfwOpenWindowHint)-// A bucket of semi-random stuff bunched together for historical reasons-// This is used only by the platform independent code and only to store-// parameters passed to us by glfwOpenWindowHint-//-------------------------------------------------------------------------typedef struct {- int refreshRate;- int accumRedBits;- int accumGreenBits;- int accumBlueBits;- int accumAlphaBits;- int auxBuffers;- int stereo;- int windowNoResize;- int samples;- int glMajor;- int glMinor;- int glForward;- int glDebug;- int glProfile;-} _GLFWhints;---//-------------------------------------------------------------------------// Platform specific definitions goes in platform.h (which also includes-// glfw.h)-//--------------------------------------------------------------------------#include "platform.h"---//-------------------------------------------------------------------------// Parameters relating to the creation of the context and window but not-// directly related to the properties of the framebuffer-// This is used to pass window and context creation parameters from the-// platform independent code to the platform specific code-//-------------------------------------------------------------------------typedef struct {- int mode;- int refreshRate;- int windowNoResize;- int glMajor;- int glMinor;- int glForward;- int glDebug;- int glProfile;-} _GLFWwndconfig;---//-------------------------------------------------------------------------// Framebuffer configuration descriptor, i.e. buffers and their sizes-// Also a platform specific ID used to map back to the actual backend APIs-// This is used to pass framebuffer parameters from the platform independent-// code to the platform specific code, and also to enumerate and select-// available framebuffer configurations-//-------------------------------------------------------------------------typedef struct {- int redBits;- int greenBits;- int blueBits;- int alphaBits;- int depthBits;- int stencilBits;- int accumRedBits;- int accumGreenBits;- int accumBlueBits;- int accumAlphaBits;- int auxBuffers;- int stereo;- int samples;- GLFWintptr platformID;-} _GLFWfbconfig;---//========================================================================-// System independent global variables (GLFW internals)-//========================================================================--// Flag indicating if GLFW has been initialized-#if defined( _init_c_ )-int _glfwInitialized = 0;-#else-GLFWGLOBAL int _glfwInitialized;-#endif---//-------------------------------------------------------------------------// Abstract data stream (for image I/O)-//-------------------------------------------------------------------------typedef struct {- FILE* file;- void* data;- long position;- long size;-} _GLFWstream;---//========================================================================-// Prototypes for platform specific implementation functions-//========================================================================--// Init/terminate-int _glfwPlatformInit( void );-int _glfwPlatformTerminate( void );--// Enable/Disable-void _glfwPlatformEnableSystemKeys( void );-void _glfwPlatformDisableSystemKeys( void );--// Fullscreen-int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount );-void _glfwPlatformGetDesktopMode( GLFWvidmode *mode );--// OpenGL extensions-int _glfwPlatformExtensionSupported( const char *extension );-void * _glfwPlatformGetProcAddress( const char *procname );--// Joystick-int _glfwPlatformGetJoystickParam( int joy, int param );-int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes );-int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );--// Threads-GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg );-void _glfwPlatformDestroyThread( GLFWthread ID );-int _glfwPlatformWaitThread( GLFWthread ID, int waitmode );-GLFWthread _glfwPlatformGetThreadID( void );-GLFWmutex _glfwPlatformCreateMutex( void );-void _glfwPlatformDestroyMutex( GLFWmutex mutex );-void _glfwPlatformLockMutex( GLFWmutex mutex );-void _glfwPlatformUnlockMutex( GLFWmutex mutex );-GLFWcond _glfwPlatformCreateCond( void );-void _glfwPlatformDestroyCond( GLFWcond cond );-void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout );-void _glfwPlatformSignalCond( GLFWcond cond );-void _glfwPlatformBroadcastCond( GLFWcond cond );-int _glfwPlatformGetNumberOfProcessors( void );--// Time-double _glfwPlatformGetTime( void );-void _glfwPlatformSetTime( double time );-void _glfwPlatformSleep( double time );--// Window management-int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig );-void _glfwPlatformCloseWindow( void );-void _glfwPlatformSetWindowTitle( const char *title );-void _glfwPlatformSetWindowSize( int width, int height );-void _glfwPlatformSetWindowPos( int x, int y );-void _glfwPlatformIconifyWindow( void );-void _glfwPlatformRestoreWindow( void );-void _glfwPlatformSwapBuffers( void );-void _glfwPlatformSwapInterval( int interval );-void _glfwPlatformRefreshWindowParams( void );-void _glfwPlatformPollEvents( void );-void _glfwPlatformWaitEvents( void );-void _glfwPlatformHideMouseCursor( void );-void _glfwPlatformShowMouseCursor( void );-void _glfwPlatformSetMouseCursorPos( int x, int y );---//========================================================================-// Prototypes for platform independent internal functions-//========================================================================--// Window management (window.c)-void _glfwClearWindowHints( void );--// Input handling (window.c)-void _glfwClearInput( void );-void _glfwInputDeactivation( void );-void _glfwInputKey( int key, int action );-void _glfwInputChar( int character, int action );-void _glfwInputMouseClick( int button, int action );--// Threads (thread.c)-_GLFWthread * _glfwGetThreadPointer( int ID );-void _glfwAppendThread( _GLFWthread * t );-void _glfwRemoveThread( _GLFWthread * t );--// OpenGL extensions (glext.c)-void _glfwParseGLVersion( int *major, int *minor, int *rev );-int _glfwStringInExtensionString( const char *string, const GLubyte *extensions );--// Abstracted data streams (stream.c)-int _glfwOpenFileStream( _GLFWstream *stream, const char *name, const char *mode );-int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size );-long _glfwReadStream( _GLFWstream *stream, void *data, long size );-long _glfwTellStream( _GLFWstream *stream );-int _glfwSeekStream( _GLFWstream *stream, long offset, int whence );-void _glfwCloseStream( _GLFWstream *stream );--// Targa image I/O (tga.c)-int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags );--// Framebuffer configs-const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired,- const _GLFWfbconfig *alternatives,- unsigned int count );---#endif // _internal_h_
− glfw/lib/joystick.c
@@ -1,99 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Determine joystick capabilities-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param )-{- if( !_glfwInitialized )- {- return 0;- }-- return _glfwPlatformGetJoystickParam( joy, param );-}---//========================================================================-// Get joystick axis positions-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes )-{- int i;-- if( !_glfwInitialized )- {- return 0;- }-- // Clear positions- for( i = 0; i < numaxes; i++ )- {- pos[ i ] = 0.0f;- }-- return _glfwPlatformGetJoystickPos( joy, pos, numaxes );-}---//========================================================================-// Get joystick button states-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy,- unsigned char *buttons,- int numbuttons )-{- int i;-- if( !_glfwInitialized )- {- return 0;- }-- // Clear button states- for( i = 0; i < numbuttons; i++ )- {- buttons[ i ] = GLFW_RELEASE;- }-- return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons );-}-
− glfw/lib/stream.c
@@ -1,195 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#define _CRT_SECURE_NO_WARNINGS--#include "internal.h"---//========================================================================-// Opens a GLFW stream with a file-//========================================================================--int _glfwOpenFileStream( _GLFWstream *stream, const char* name, const char* mode )-{- memset( stream, 0, sizeof(_GLFWstream) );-- stream->file = fopen( name, mode );- if( stream->file == NULL )- {- return GL_FALSE;- }-- return GL_TRUE;-}---//========================================================================-// Opens a GLFW stream with a memory block-//========================================================================--int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size )-{- memset( stream, 0, sizeof(_GLFWstream) );-- stream->data = data;- stream->size = size;- return GL_TRUE;-}---//========================================================================-// Reads data from a GLFW stream-//========================================================================--long _glfwReadStream( _GLFWstream *stream, void *data, long size )-{- if( stream->file != NULL )- {- return (long) fread( data, 1, size, stream->file );- }-- if( stream->data != NULL )- {- // Check for EOF- if( stream->position == stream->size )- {- return 0;- }-- // Clamp read size to available data- if( stream->position + size > stream->size )- {- size = stream->size - stream->position;- }-- // Perform data read- memcpy( data, (unsigned char*) stream->data + stream->position, size );- stream->position += size;- return size;- }-- return 0;-}---//========================================================================-// Returns the current position of a GLFW stream-//========================================================================--long _glfwTellStream( _GLFWstream *stream )-{- if( stream->file != NULL )- {- return ftell( stream->file );- }-- if( stream->data != NULL )- {- return stream->position;- }-- return 0;-}---//========================================================================-// Sets the current position of a GLFW stream-//========================================================================--int _glfwSeekStream( _GLFWstream *stream, long offset, int whence )-{- long position;-- if( stream->file != NULL )- {- if( fseek( stream->file, offset, whence ) != 0 )- {- return GL_FALSE;- }-- return GL_TRUE;- }-- if( stream->data != NULL )- {- position = offset;-- // Handle whence parameter- if( whence == SEEK_CUR )- {- position += stream->position;- }- else if( whence == SEEK_END )- {- position += stream->size;- }- else if( whence != SEEK_SET )- {- return GL_FALSE;- }-- // Clamp offset to buffer bounds and apply it- if( position > stream->size )- {- stream->position = stream->size;- }- else if( position < 0 )- {- stream->position = 0;- }- else- {- stream->position = position;- }-- return GL_TRUE;- }-- return GL_FALSE;-}---//========================================================================-// Closes a GLFW stream-//========================================================================--void _glfwCloseStream( _GLFWstream *stream )-{- if( stream->file != NULL )- {- fclose( stream->file );- }-- // Nothing to be done about (user allocated) memory blocks-- memset( stream, 0, sizeof(_GLFWstream) );-}-
− glfw/lib/tga.c
@@ -1,404 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--//========================================================================-// Description:-//-// TGA format image file loader. This module supports version 1 Targa-// images, with these restrictions:-// - Pixel format may only be 8, 24 or 32 bits-// - Colormaps must be no longer than 256 entries-//-//========================================================================---#include "internal.h"---//************************************************************************-//**** GLFW internal functions & declarations ****-//************************************************************************--//========================================================================-// TGA file header information-//========================================================================--typedef struct {- int idlen; // 1 byte- int cmaptype; // 1 byte- int imagetype; // 1 byte- int cmapfirstidx; // 2 bytes- int cmaplen; // 2 bytes- int cmapentrysize; // 1 byte- int xorigin; // 2 bytes- int yorigin; // 2 bytes- int width; // 2 bytes- int height; // 2 bytes- int bitsperpixel; // 1 byte- int imageinfo; // 1 byte- int _alphabits; // (derived from imageinfo)- int _origin; // (derived from imageinfo)-} _tga_header_t;--#define _TGA_CMAPTYPE_NONE 0-#define _TGA_CMAPTYPE_PRESENT 1--#define _TGA_IMAGETYPE_NONE 0-#define _TGA_IMAGETYPE_CMAP 1-#define _TGA_IMAGETYPE_TC 2-#define _TGA_IMAGETYPE_GRAY 3-#define _TGA_IMAGETYPE_CMAP_RLE 9-#define _TGA_IMAGETYPE_TC_RLE 10-#define _TGA_IMAGETYPE_GRAY_RLE 11--#define _TGA_IMAGEINFO_ALPHA_MASK 0x0f-#define _TGA_IMAGEINFO_ALPHA_SHIFT 0-#define _TGA_IMAGEINFO_ORIGIN_MASK 0x30-#define _TGA_IMAGEINFO_ORIGIN_SHIFT 4--#define _TGA_ORIGIN_BL 0-#define _TGA_ORIGIN_BR 1-#define _TGA_ORIGIN_UL 2-#define _TGA_ORIGIN_UR 3---//========================================================================-// Read TGA file header (and check that it is valid)-//========================================================================--static int ReadTGAHeader( _GLFWstream *s, _tga_header_t *h )-{- unsigned char buf[ 18 ];- int pos;-- // Read TGA file header from file- pos = _glfwTellStream( s );- _glfwReadStream( s, buf, 18 );-- // Interpret header (endian independent parsing)- h->idlen = (int) buf[0];- h->cmaptype = (int) buf[1];- h->imagetype = (int) buf[2];- h->cmapfirstidx = (int) buf[3] | (((int) buf[4]) << 8);- h->cmaplen = (int) buf[5] | (((int) buf[6]) << 8);- h->cmapentrysize = (int) buf[7];- h->xorigin = (int) buf[8] | (((int) buf[9]) << 8);- h->yorigin = (int) buf[10] | (((int) buf[11]) << 8);- h->width = (int) buf[12] | (((int) buf[13]) << 8);- h->height = (int) buf[14] | (((int) buf[15]) << 8);- h->bitsperpixel = (int) buf[16];- h->imageinfo = (int) buf[17];-- // Extract alphabits and origin information- h->_alphabits = (int) (h->imageinfo & _TGA_IMAGEINFO_ALPHA_MASK) >>- _TGA_IMAGEINFO_ALPHA_SHIFT;- h->_origin = (int) (h->imageinfo & _TGA_IMAGEINFO_ORIGIN_MASK) >>- _TGA_IMAGEINFO_ORIGIN_SHIFT;-- // Validate TGA header (is this a TGA file?)- if( (h->cmaptype == 0 || h->cmaptype == 1) &&- ((h->imagetype >= 1 && h->imagetype <= 3) ||- (h->imagetype >= 9 && h->imagetype <= 11)) &&- (h->bitsperpixel == 8 || h->bitsperpixel == 24 ||- h->bitsperpixel == 32) )- {- // Skip the ID field- _glfwSeekStream( s, h->idlen, SEEK_CUR );-- // Indicate that the TGA header was valid- return GL_TRUE;- }- else- {- // Restore file position- _glfwSeekStream( s, pos, SEEK_SET );-- // Indicate that the TGA header was invalid- return GL_FALSE;- }-}--//========================================================================-// Read Run-Length Encoded data-//========================================================================--static void ReadTGA_RLE( unsigned char *buf, int size, int bpp,- _GLFWstream *s )-{- int repcount, bytes, k, n;- unsigned char pixel[ 4 ];- char c;-- // Dummy check- if( bpp > 4 )- {- return;- }-- while( size > 0 )- {- // Get repetition count- _glfwReadStream( s, &c, 1 );- repcount = (unsigned int) c;- bytes = ((repcount & 127) + 1) * bpp;- if( size < bytes )- {- bytes = size;- }-- // Run-Length packet?- if( repcount & 128 )- {- _glfwReadStream( s, pixel, bpp );- for( n = 0; n < (repcount & 127) + 1; n ++ )- {- for( k = 0; k < bpp; k ++ )- {- *buf ++ = pixel[ k ];- }- }- }- else- {- // It's a Raw packet- _glfwReadStream( s, buf, bytes );- buf += bytes;- }-- size -= bytes;- }-}---//========================================================================-// Read a TGA image from a file-//========================================================================--int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags )-{- _tga_header_t h;- unsigned char *cmap, *pix, tmp, *src, *dst;- int cmapsize, pixsize, pixsize2;- int bpp, bpp2, k, m, n, swapx, swapy;-- // Read TGA header- if( !ReadTGAHeader( s, &h ) )- {- return 0;- }-- // Is there a colormap?- cmapsize = (h.cmaptype == _TGA_CMAPTYPE_PRESENT ? 1 : 0) * h.cmaplen *- ((h.cmapentrysize+7) / 8);- if( cmapsize > 0 )- {- // Is it a colormap that we can handle?- if( (h.cmapentrysize != 24 && h.cmapentrysize != 32) ||- h.cmaplen == 0 || h.cmaplen > 256 )- {- return 0;- }-- // Allocate memory for colormap- cmap = (unsigned char *) malloc( cmapsize );- if( cmap == NULL )- {- return 0;- }-- // Read colormap from file- _glfwReadStream( s, cmap, cmapsize );- }- else- {- cmap = NULL;- }-- // Size of pixel data- pixsize = h.width * h.height * ((h.bitsperpixel + 7) / 8);-- // Bytes per pixel (pixel data - unexpanded)- bpp = (h.bitsperpixel + 7) / 8;-- // Bytes per pixel (expanded pixels - not colormap indeces)- if( cmap )- {- bpp2 = (h.cmapentrysize + 7) / 8;- }- else- {- bpp2 = bpp;- }-- // For colormaped images, the RGB/RGBA image data may use more memory- // than the stored pixel data- pixsize2 = h.width * h.height * bpp2;-- // Allocate memory for pixel data- pix = (unsigned char *) malloc( pixsize2 );- if( pix == NULL )- {- if( cmap )- {- free( cmap );- }- return 0;- }-- // Read pixel data from file- if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE )- {- ReadTGA_RLE( pix, pixsize, bpp, s );- }- else- {- _glfwReadStream( s, pix, pixsize );- }-- // If the image origin is not what we want, re-arrange the pixels- switch( h._origin )- {- default:- case _TGA_ORIGIN_UL:- swapx = 0;- swapy = 1;- break;-- case _TGA_ORIGIN_BL:- swapx = 0;- swapy = 0;- break;-- case _TGA_ORIGIN_UR:- swapx = 1;- swapy = 1;- break;-- case _TGA_ORIGIN_BR:- swapx = 1;- swapy = 0;- break;- }- if( (swapy && !(flags & GLFW_ORIGIN_UL_BIT)) ||- (!swapy && (flags & GLFW_ORIGIN_UL_BIT)) )- {- src = pix;- dst = &pix[ (h.height-1)*h.width*bpp ];- for( n = 0; n < h.height/2; n ++ )- {- for( m = 0; m < h.width ; m ++ )- {- for( k = 0; k < bpp; k ++ )- {- tmp = *src;- *src ++ = *dst;- *dst ++ = tmp;- }- }- dst -= 2*h.width*bpp;- }- }- if( swapx )- {- src = pix;- dst = &pix[ (h.width-1)*bpp ];- for( n = 0; n < h.height; n ++ )- {- for( m = 0; m < h.width/2 ; m ++ )- {- for( k = 0; k < bpp; k ++ )- {- tmp = *src;- *src ++ = *dst;- *dst ++ = tmp;- }- dst -= 2*bpp;- }- src += ((h.width+1)/2)*bpp;- dst += ((3*h.width+1)/2)*bpp;- }- }-- // Convert BGR/BGRA to RGB/RGBA, and optionally colormap indeces to- // RGB/RGBA values- if( cmap )- {- // Convert colormap pixel format (BGR -> RGB or BGRA -> RGBA)- if( bpp2 == 3 || bpp2 == 4 )- {- for( n = 0; n < h.cmaplen; n ++ )- {- tmp = cmap[ n*bpp2 ];- cmap[ n*bpp2 ] = cmap[ n*bpp2 + 2 ];- cmap[ n*bpp2 + 2 ] = tmp;- }- }-- // Convert pixel data to RGB/RGBA data- for( m = h.width * h.height - 1; m >= 0; m -- )- {- n = pix[ m ];- for( k = 0; k < bpp2; k ++ )- {- pix[ m*bpp2 + k ] = cmap[ n*bpp2 + k ];- }- }-- // Free memory for colormap (it's not needed anymore)- free( cmap );- }- else- {- // Convert image pixel format (BGR -> RGB or BGRA -> RGBA)- if( bpp2 == 3 || bpp2 == 4 )- {- src = pix;- dst = &pix[ 2 ];- for( n = 0; n < h.height * h.width; n ++ )- {- tmp = *src;- *src = *dst;- *dst = tmp;- src += bpp2;- dst += bpp2;- }- }- }-- // Fill out GLFWimage struct (the Format field will be set by- // glfwReadImage)- img->Width = h.width;- img->Height = h.height;- img->BytesPerPixel = bpp2;- img->Data = pix;-- return 1;-}-
− glfw/lib/thread.c
@@ -1,341 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Find pointer to thread with a matching ID-//========================================================================--_GLFWthread * _glfwGetThreadPointer( int ID )-{- _GLFWthread *t;-- for( t = &_glfwThrd.First; t != NULL; t = t->Next )- {- if( t->ID == ID )- {- break;- }- }-- return t;-}---//========================================================================-// Append thread to thread list-//========================================================================--void _glfwAppendThread( _GLFWthread * t )-{- _GLFWthread *t_tmp;-- t_tmp = &_glfwThrd.First;- while( t_tmp->Next != NULL )- {- t_tmp = t_tmp->Next;- }- t_tmp->Next = t;- t->Previous = t_tmp;- t->Next = NULL;-}---//========================================================================-// Remove thread from thread list-//========================================================================--void _glfwRemoveThread( _GLFWthread * t )-{- if( t->Previous != NULL )- {- t->Previous->Next = t->Next;- }- if( t->Next != NULL )- {- t->Next->Previous = t->Previous;- }- free( (void *) t );-}----//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Create a new thread-//========================================================================--GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun,- void *arg )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return -1;- }-- // Return the GLFW thread ID- return _glfwPlatformCreateThread( fun, arg );-}---//========================================================================-// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT-// BE USED EXCEPT IN EXTREME SITUATIONS!-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- // Is it a valid thread? (killing the main thread is not allowed)- if( ID < 1 )- {- return;- }-- _glfwPlatformDestroyThread( ID );-}---//========================================================================-// Wait for a thread to die-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return GL_TRUE;- }-- // Is it a valid thread? (waiting for the main thread is not allowed)- if( ID < 1 )- {- return GL_TRUE;- }-- return _glfwPlatformWaitThread( ID, waitmode );-}---//========================================================================-// Return the thread ID for the current thread-//========================================================================--GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return 0;- }-- return _glfwPlatformGetThreadID();-}---//========================================================================-// Create a mutual exclusion object-//========================================================================--GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return (GLFWmutex) 0;- }-- return _glfwPlatformCreateMutex();-}---//========================================================================-// Destroy a mutual exclusion object-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex )-{- // Initialized & valid mutex (no real way of assuring this)?- if( !_glfwInitialized || !mutex )- {- return;- }-- _glfwPlatformDestroyMutex( mutex );-}---//========================================================================-// Request access to a mutex-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex )-{- // Initialized & valid mutex (no real way of assuring this)?- if( !_glfwInitialized && !mutex )- {- return;- }-- _glfwPlatformLockMutex( mutex );-}---//========================================================================-// Release a mutex-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex )-{- // Initialized & valid mutex (no real way of assuring this)?- if( !_glfwInitialized && !mutex )- {- return;- }-- _glfwPlatformUnlockMutex( mutex );-}---//========================================================================-// Create a new condition variable object-//========================================================================--GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return (GLFWcond) 0;- }-- return _glfwPlatformCreateCond();-}---//========================================================================-// Destroy a condition variable object-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond )-{- // Initialized & valid condition variable?- if( !_glfwInitialized || !cond )- {- return;- }-- _glfwPlatformDestroyCond( cond );-}---//========================================================================-// Wait for a condition to be raised-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex,- double timeout )-{- // Initialized & valid condition variable and mutex?- if( !_glfwInitialized || !cond || !mutex )- {- return;- }-- _glfwPlatformWaitCond( cond, mutex, timeout );-}---//========================================================================-// Signal a condition to one waiting thread-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond )-{- // Initialized & valid condition variable?- if( !_glfwInitialized || !cond )- {- return;- }-- _glfwPlatformSignalCond( cond );-}---//========================================================================-// Broadcast a condition to all waiting threads-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond )-{- // Initialized & valid condition variable?- if( !_glfwInitialized || !cond )- {- return;- }-- _glfwPlatformBroadcastCond( cond );-}---//========================================================================-// Return the number of processors in the system. This information can be-// useful for determining the optimal number of threads to use for-// performing a certain task.-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return 0;- }-- return _glfwPlatformGetNumberOfProcessors();-}-
− glfw/lib/time.c
@@ -1,84 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Return timer value in seconds-//========================================================================--GLFWAPI double GLFWAPIENTRY glfwGetTime( void )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return 0.0;- }-- return _glfwPlatformGetTime();-}---//========================================================================-// Set timer value in seconds-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetTime( double time )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- _glfwPlatformSetTime( time );-}---//========================================================================-// Put a thread to sleep for a specified amount of time-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSleep( double time )-{- // Is GLFW initialized?- if( !_glfwInitialized )- {- return;- }-- _glfwPlatformSleep( time );-}-
− glfw/lib/win32/platform.h
@@ -1,555 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#ifndef _platform_h_-#define _platform_h_---// This is the Windows version of GLFW-#define _GLFW_WIN32--// We don't need all the fancy stuff-#define NOMINMAX-#define WIN32_LEAN_AND_MEAN-#define VC_EXTRALEAN--// Include files-#include <windows.h>-#include <mmsystem.h>-#include "../../include/GL/glfw.h"---//========================================================================-// Hack: Define things that some <windows.h>'s do not define-//========================================================================--// Some old versions of w32api (used by MinGW and Cygwin) define-// WH_KEYBOARD_LL without typedef:ing KBDLLHOOKSTRUCT (!)-#if defined(__MINGW32__) || defined(__CYGWIN__)-#include <w32api.h>-#if defined(WH_KEYBOARD_LL) && (__W32API_MAJOR_VERSION == 1) && (__W32API_MINOR_VERSION <= 2)-#undef WH_KEYBOARD_LL-#endif-#endif--//-------------------------------------------------------------------------// ** NOTE ** If this gives you compiler errors and you are using MinGW-// (or Dev-C++), update to w32api version 1.3 or later:-// http://sourceforge.net/project/showfiles.php?group_id=2435-//-------------------------------------------------------------------------#ifndef WH_KEYBOARD_LL-#define WH_KEYBOARD_LL 13-typedef struct tagKBDLLHOOKSTRUCT {- DWORD vkCode;- DWORD scanCode;- DWORD flags;- DWORD time;- DWORD dwExtraInfo;-} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;-#endif // WH_KEYBOARD_LL--#ifndef LLKHF_ALTDOWN-#define LLKHF_ALTDOWN 0x00000020-#endif--#ifndef SPI_SETSCREENSAVERRUNNING-#define SPI_SETSCREENSAVERRUNNING 97-#endif-#ifndef SPI_GETANIMATION-#define SPI_GETANIMATION 72-#endif-#ifndef SPI_SETANIMATION-#define SPI_SETANIMATION 73-#endif-#ifndef SPI_GETFOREGROUNDLOCKTIMEOUT-#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000-#endif-#ifndef SPI_SETFOREGROUNDLOCKTIMEOUT-#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001-#endif--#ifndef CDS_FULLSCREEN-#define CDS_FULLSCREEN 4-#endif--#ifndef PFD_GENERIC_ACCELERATED-#define PFD_GENERIC_ACCELERATED 0x00001000-#endif-#ifndef PFD_DEPTH_DONTCARE-#define PFD_DEPTH_DONTCARE 0x20000000-#endif--#ifndef ENUM_CURRENT_SETTINGS-#define ENUM_CURRENT_SETTINGS -1-#endif-#ifndef ENUM_REGISTRY_SETTINGS-#define ENUM_REGISTRY_SETTINGS -2-#endif--#ifndef WM_MOUSEWHEEL-#define WM_MOUSEWHEEL 0x020A-#endif-#ifndef WHEEL_DELTA-#define WHEEL_DELTA 120-#endif--#ifndef WM_XBUTTONDOWN-#define WM_XBUTTONDOWN 0x020B-#endif-#ifndef WM_XBUTTONUP-#define WM_XBUTTONUP 0x020C-#endif-#ifndef XBUTTON1-#define XBUTTON1 1-#endif-#ifndef XBUTTON2-#define XBUTTON2 2-#endif--#ifndef WGL_EXT_swap_control--/* Entry points */-typedef int (APIENTRY * PFNWGLSWAPINTERVALEXTPROC) (int);--#endif /*WGL_EXT_swap_control*/--#ifndef WGL_ARB_extensions_string--/* Entry points */-typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)( HDC );--#endif /*WGL_ARB_extensions_string*/--#ifndef WGL_EXT_extension_string--/* Entry points */-typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGEXTPROC)( void );--#endif /*WGL_EXT_extension_string*/--#ifndef WGL_ARB_pixel_format--/* Entry points */-typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC, int, int, UINT, const int *, int *);--/* Constants for wglGetPixelFormatAttribivARB */-#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000-#define WGL_DRAW_TO_WINDOW_ARB 0x2001-#define WGL_SUPPORT_OPENGL_ARB 0x2010-#define WGL_ACCELERATION_ARB 0x2003-#define WGL_DOUBLE_BUFFER_ARB 0x2011-#define WGL_STEREO_ARB 0x2012-#define WGL_PIXEL_TYPE_ARB 0x2013-#define WGL_COLOR_BITS_ARB 0x2014-#define WGL_RED_BITS_ARB 0x2015-#define WGL_GREEN_BITS_ARB 0x2017-#define WGL_BLUE_BITS_ARB 0x2019-#define WGL_ALPHA_BITS_ARB 0x201B-#define WGL_ACCUM_BITS_ARB 0x201D-#define WGL_ACCUM_RED_BITS_ARB 0x201E-#define WGL_ACCUM_GREEN_BITS_ARB 0x201F-#define WGL_ACCUM_BLUE_BITS_ARB 0x2020-#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021-#define WGL_DEPTH_BITS_ARB 0x2022-#define WGL_STENCIL_BITS_ARB 0x2023-#define WGL_AUX_BUFFERS_ARB 0x2024-#define WGL_SAMPLE_BUFFERS_ARB 0x2041-#define WGL_SAMPLES_ARB 0x2042--/* Constants for WGL_ACCELERATION_ARB */-#define WGL_NO_ACCELERATION_ARB 0x2025-#define WGL_GENERIC_ACCELERATION_ARB 0x2026-#define WGL_FULL_ACCELERATION_ARB 0x2027--/* Constants for WGL_PIXEL_TYPE_ARB */-#define WGL_TYPE_RGBA_ARB 0x202B-#define WGL_TYPE_COLORINDEX_ARB 0x202C--#endif /*WGL_ARB_pixel_format*/---#ifndef WGL_ARB_create_context--/* Entry points */-typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *);--/* Tokens for wglCreateContextAttribsARB attributes */-#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091-#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092-#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093-#define WGL_CONTEXT_FLAGS_ARB 0x2094-#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126--/* Bits for WGL_CONTEXT_FLAGS_ARB */-#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002--/* Bits for WGL_CONTEXT_PROFILE_MASK_ARB */-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002--#endif /*WGL_ARB_create_context*/---#ifndef GL_VERSION_3_0--typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);--#endif /*GL_VERSION_3_0*/---//========================================================================-// DLLs that are loaded at glfwInit()-//========================================================================--// gdi32.dll function pointer typedefs-#ifndef _GLFW_NO_DLOAD_GDI32-typedef int (WINAPI * CHOOSEPIXELFORMAT_T) (HDC,CONST PIXELFORMATDESCRIPTOR*);-typedef int (WINAPI * DESCRIBEPIXELFORMAT_T) (HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);-typedef int (WINAPI * GETPIXELFORMAT_T) (HDC);-typedef BOOL (WINAPI * SETPIXELFORMAT_T) (HDC,int,const PIXELFORMATDESCRIPTOR*);-typedef BOOL (WINAPI * SWAPBUFFERS_T) (HDC);-#endif // _GLFW_NO_DLOAD_GDI32--// winmm.dll function pointer typedefs-#ifndef _GLFW_NO_DLOAD_WINMM-typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT);-typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO);-typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX);-typedef DWORD (WINAPI * TIMEGETTIME_T) (void);-#endif // _GLFW_NO_DLOAD_WINMM---// gdi32.dll shortcuts-#ifndef _GLFW_NO_DLOAD_GDI32-#define _glfw_ChoosePixelFormat _glfwLibrary.Libs.ChoosePixelFormat-#define _glfw_DescribePixelFormat _glfwLibrary.Libs.DescribePixelFormat-#define _glfw_GetPixelFormat _glfwLibrary.Libs.GetPixelFormat-#define _glfw_SetPixelFormat _glfwLibrary.Libs.SetPixelFormat-#define _glfw_SwapBuffers _glfwLibrary.Libs.SwapBuffers-#else-#define _glfw_ChoosePixelFormat ChoosePixelFormat-#define _glfw_DescribePixelFormat DescribePixelFormat-#define _glfw_GetPixelFormat GetPixelFormat-#define _glfw_SetPixelFormat SetPixelFormat-#define _glfw_SwapBuffers SwapBuffers-#endif // _GLFW_NO_DLOAD_GDI32--// winmm.dll shortcuts-#ifndef _GLFW_NO_DLOAD_WINMM-#define _glfw_joyGetDevCaps _glfwLibrary.Libs.joyGetDevCapsA-#define _glfw_joyGetPos _glfwLibrary.Libs.joyGetPos-#define _glfw_joyGetPosEx _glfwLibrary.Libs.joyGetPosEx-#define _glfw_timeGetTime _glfwLibrary.Libs.timeGetTime-#else-#define _glfw_joyGetDevCaps joyGetDevCapsA-#define _glfw_joyGetPos joyGetPos-#define _glfw_joyGetPosEx joyGetPosEx-#define _glfw_timeGetTime timeGetTime-#endif // _GLFW_NO_DLOAD_WINMM---//========================================================================-// GLFW platform specific types-//========================================================================--//-------------------------------------------------------------------------// Pointer length integer-//-------------------------------------------------------------------------typedef INT_PTR GLFWintptr;---//-------------------------------------------------------------------------// Window structure-//-------------------------------------------------------------------------typedef struct _GLFWwin_struct _GLFWwin;--struct _GLFWwin_struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // User callback functions- GLFWwindowsizefun windowSizeCallback;- GLFWwindowclosefun windowCloseCallback;- GLFWwindowrefreshfun windowRefreshCallback;- GLFWmousebuttonfun mouseButtonCallback;- GLFWmouseposfun mousePosCallback;- GLFWmousewheelfun mouseWheelCallback;- GLFWkeyfun keyCallback;- GLFWcharfun charCallback;-- // User selected window settings- int fullscreen; // Fullscreen flag- int mouseLock; // Mouse-lock flag- int autoPollEvents; // Auto polling flag- int sysKeysDisabled; // System keys disabled flag- int windowNoResize; // Resize- and maximize gadgets disabled flag- int refreshRate; // Vertical monitor refresh rate-- // Window status & parameters- int opened; // Flag telling if window is opened or not- int active; // Application active flag- int iconified; // Window iconified flag- int width, height; // Window width and heigth- int accelerated; // GL_TRUE if window is HW accelerated-- // Framebuffer attributes- int redBits;- int greenBits;- int blueBits;- int alphaBits;- int depthBits;- int stencilBits;- int accumRedBits;- int accumGreenBits;- int accumBlueBits;- int accumAlphaBits;- int auxBuffers;- int stereo;- int samples;-- // OpenGL extensions and context attributes- int has_GL_SGIS_generate_mipmap;- int has_GL_ARB_texture_non_power_of_two;- int glMajor, glMinor, glRevision;- int glForward, glDebug, glProfile;-- PFNGLGETSTRINGIPROC GetStringi;---// ========= PLATFORM SPECIFIC PART ======================================-- // Platform specific window resources- HDC DC; // Private GDI device context- HGLRC context; // Permanent rendering context- HWND window; // Window handle- ATOM classAtom; // Window class atom- int modeID; // Mode ID for fullscreen mode- HHOOK keyboardHook; // Keyboard hook handle- DWORD dwStyle; // Window styles used for window creation- DWORD dwExStyle; // --"---- // Platform specific extensions (context specific)- PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT;- PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB;- PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT;- PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB;- PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;- GLboolean has_WGL_EXT_swap_control;- GLboolean has_WGL_ARB_multisample;- GLboolean has_WGL_ARB_pixel_format;- GLboolean has_WGL_ARB_create_context;- GLboolean has_WGL_ARB_create_context_profile;-- // Various platform specific internal variables- int oldMouseLock; // Old mouse-lock flag (used for remembering- // mouse-lock state when iconifying)- int oldMouseLockValid;- int desiredRefreshRate; // Desired vertical monitor refresh rate--};--GLFWGLOBAL _GLFWwin _glfwWin;---//-------------------------------------------------------------------------// User input status (most of this should go in _GLFWwin)-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Mouse status- int MousePosX, MousePosY;- int WheelPos;- char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];-- // Keyboard status- char Key[ GLFW_KEY_LAST+1 ];- int LastChar;-- // User selected settings- int StickyKeys;- int StickyMouseButtons;- int KeyRepeat;---// ========= PLATFORM SPECIFIC PART ======================================-- // Platform specific internal variables- int MouseMoved, OldMouseX, OldMouseY;--} _glfwInput;---//-------------------------------------------------------------------------// Library global data-//-------------------------------------------------------------------------GLFWGLOBAL struct {-- // Window opening hints- _GLFWhints hints;--// ========= PLATFORM SPECIFIC PART ======================================-- HINSTANCE instance; // Instance of the application-- // Timer data- struct {- int HasPerformanceCounter;- double Resolution;- unsigned int t0_32;- __int64 t0_64;- } Timer;-- // System information- struct {- int winVer;- int hasUnicode;- DWORD foregroundLockTimeout;- } Sys;--#if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32)- // Library handles and function pointers- struct {-#ifndef _GLFW_NO_DLOAD_GDI32- // gdi32.dll- HINSTANCE gdi32;- CHOOSEPIXELFORMAT_T ChoosePixelFormat;- DESCRIBEPIXELFORMAT_T DescribePixelFormat;- GETPIXELFORMAT_T GetPixelFormat;- SETPIXELFORMAT_T SetPixelFormat;- SWAPBUFFERS_T SwapBuffers;-#endif // _GLFW_NO_DLOAD_GDI32-- // winmm.dll-#ifndef _GLFW_NO_DLOAD_WINMM- HINSTANCE winmm;- JOYGETDEVCAPSA_T joyGetDevCapsA;- JOYGETPOS_T joyGetPos;- JOYGETPOSEX_T joyGetPosEx;- TIMEGETTIME_T timeGetTime;-#endif // _GLFW_NO_DLOAD_WINMM- } Libs;-#endif--} _glfwLibrary;---//-------------------------------------------------------------------------// Thread record (one for each thread)-//-------------------------------------------------------------------------typedef struct _GLFWthread_struct _GLFWthread;--struct _GLFWthread_struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Pointer to previous and next threads in linked list- _GLFWthread *Previous, *Next;-- // GLFW user side thread information- GLFWthread ID;- GLFWthreadfun Function;--// ========= PLATFORM SPECIFIC PART ======================================-- // System side thread information- HANDLE Handle;- DWORD WinID;--};---//-------------------------------------------------------------------------// General thread information-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Next thread ID to use (increments for every created thread)- GLFWthread NextID;-- // First thread in linked list (always the main thread)- _GLFWthread First;--// ========= PLATFORM SPECIFIC PART ======================================-- // Critical section lock- CRITICAL_SECTION CriticalSection;--} _glfwThrd;----//========================================================================-// Macros for encapsulating critical code sections (i.e. making parts-// of GLFW thread safe)-//========================================================================--// Thread list management-#define ENTER_THREAD_CRITICAL_SECTION \- EnterCriticalSection( &_glfwThrd.CriticalSection );-#define LEAVE_THREAD_CRITICAL_SECTION \- LeaveCriticalSection( &_glfwThrd.CriticalSection );---//========================================================================-// Various Windows version constants-//========================================================================--#define _GLFW_WIN_UNKNOWN 0x0000 // Earlier than 95 or NT4-#define _GLFW_WIN_95 0x0001-#define _GLFW_WIN_98 0x0002-#define _GLFW_WIN_ME 0x0003-#define _GLFW_WIN_UNKNOWN_9x 0x0004 // Later than ME-#define _GLFW_WIN_NT4 0x0101-#define _GLFW_WIN_2K 0x0102-#define _GLFW_WIN_XP 0x0103-#define _GLFW_WIN_NET_SERVER 0x0104-#define _GLFW_WIN_UNKNOWN_NT 0x0105 // Later than .NET Server---//========================================================================-// Prototypes for platform specific internal functions-//========================================================================--// Time-void _glfwInitTimer( void );--// Fullscreen support-int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh );-int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh );-void _glfwSetVideoModeMODE( int mode );-void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh );---#endif // _platform_h_
− glfw/lib/win32/win32_dllmain.c
@@ -1,49 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---#if defined(GLFW_BUILD_DLL)--//========================================================================-// GLFW DLL entry point-//========================================================================--BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, LPVOID reserved )-{- // NOTE: Some compilers complains about instance and x never being used -- // never mind that (we don't want to use them)!-- return TRUE;-}--#endif // GLFW_BUILD_DLL-
− glfw/lib/win32/win32_enable.c
@@ -1,155 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Low level keyboard hook (system callback) function-// Used to disable system keys under Windows NT-//========================================================================--static LRESULT CALLBACK keyboardHook( int nCode, WPARAM wParam, LPARAM lParam )-{- BOOL syskeys = FALSE;- PKBDLLHOOKSTRUCT p;-- // We are only looking for keyboard events - interpret lParam as a- // pointer to a KBDLLHOOKSTRUCT- p = (PKBDLLHOOKSTRUCT) lParam;-- if( nCode == HC_ACTION )- {- // We have a keyboard event-- switch( wParam )- {- case WM_KEYDOWN:- case WM_SYSKEYDOWN:- case WM_KEYUP:- case WM_SYSKEYUP:- // Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,- // LWIN, RWIN, APPS (mysterious menu key)- syskeys = ( p->vkCode == VK_TAB &&- p->flags & LLKHF_ALTDOWN ) ||- ( p->vkCode == VK_ESCAPE &&- p->flags & LLKHF_ALTDOWN ) ||- ( p->vkCode == VK_F4 &&- p->flags & LLKHF_ALTDOWN ) ||- ( p->vkCode == VK_ESCAPE &&- (GetKeyState(VK_CONTROL) & 0x8000)) ||- p->vkCode == VK_LWIN ||- p->vkCode == VK_RWIN ||- p->vkCode == VK_APPS;- break;-- default:- break;- }- }-- // Was it a system key combination (e.g. ALT+TAB)?- if( syskeys )- {- // Pass the key event to our window message loop- if( _glfwWin.opened )- {- PostMessage( _glfwWin.window, (UINT) wParam, p->vkCode, 0 );- }-- // We've taken care of it - don't let the system know about this- // key event- return 1;- }- else- {- // It's a harmless key press, let the system deal with it- return CallNextHookEx( _glfwWin.keyboardHook, nCode, wParam, lParam );- }-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Enable system keys-//========================================================================--void _glfwPlatformEnableSystemKeys( void )-{- BOOL dummy;-- // Use different methods depending on operating system version- if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )- {- if( _glfwWin.keyboardHook != NULL )- {- UnhookWindowsHookEx( _glfwWin.keyboardHook );- _glfwWin.keyboardHook = NULL;- }- }- else- {- (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0 );- }-}--//========================================================================-// Disable system keys-//========================================================================--void _glfwPlatformDisableSystemKeys( void )-{- BOOL dummy;-- // Use different methods depending on operating system version- if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )- {- // Under Windows NT, install a low level keyboard hook- _glfwWin.keyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,- keyboardHook,- _glfwLibrary.instance,- 0 );- }- else- {- // Under Windows 95/98/ME, fool Windows that a screensaver- // is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL- (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0 );- }-}-
− glfw/lib/win32/win32_fullscreen.c
@@ -1,320 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Convert BPP to RGB bits based on "best guess"-//========================================================================--static void bpp2rgb( int bpp, int *r, int *g, int *b )-{- int delta;-- // We assume that by 32 they really meant 24- if( bpp == 32 )- {- bpp = 24;- }-- // Convert "bits per pixel" to red, green & blue sizes-- *r = *g = *b = bpp / 3;- delta = bpp - (*r * 3);- if( delta >= 1 )- {- *g = *g + 1;- }- if( delta == 2 )- {- *r = *r + 1;- }-}---//========================================================================-// Return closest video mode by dimensions, refresh rate and bits per pixel-//========================================================================--int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh )-{- int mode, bestmode, match, bestmatch, rr, bestrr, success;- DEVMODE dm;-- // Find best match- bestmatch = 0x7fffffff;- bestrr = 0x7fffffff;- mode = bestmode = 0;- do- {- dm.dmSize = sizeof( DEVMODE );- success = EnumDisplaySettings( NULL, mode, &dm );- if( success )- {- match = dm.dmBitsPerPel - *bpp;- if( match < 0 ) match = -match;- match = ( match << 25 ) |- ( (dm.dmPelsWidth - *w) *- (dm.dmPelsWidth - *w) +- (dm.dmPelsHeight - *h) *- (dm.dmPelsHeight - *h) );- if( match < bestmatch )- {- bestmatch = match;- bestmode = mode;- bestrr = (dm.dmDisplayFrequency - *refresh) *- (dm.dmDisplayFrequency - *refresh);- }- else if( match == bestmatch && *refresh > 0 )- {- rr = (dm.dmDisplayFrequency - *refresh) *- (dm.dmDisplayFrequency - *refresh);- if( rr < bestrr )- {- bestmatch = match;- bestmode = mode;- bestrr = rr;- }- }- }- mode ++;- }- while( success );-- // Get the parameters for the best matching display mode- dm.dmSize = sizeof( DEVMODE );- (void) EnumDisplaySettings( NULL, bestmode, &dm );-- // Fill out actual width and height- *w = dm.dmPelsWidth;- *h = dm.dmPelsHeight;-- // Return bits per pixel- *bpp = dm.dmBitsPerPel;-- // Return vertical refresh rate- *refresh = dm.dmDisplayFrequency;-- return bestmode;-}---//========================================================================-// Return closest video mode by dimensions, refresh rate and channel sizes-//========================================================================--static int getClosestVideoMode( int *w, int *h,- int *r, int *g, int *b,- int *refresh )-{- int bpp, bestmode;-- // Colorbits = sum of red/green/blue bits- bpp = *r + *g + *b;-- // If colorbits < 15 (e.g. 0) or >= 24, default to 32 bpp- if( bpp < 15 || bpp >= 24 )- {- bpp = 32;- }-- // Find best match- bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh );-- // Convert "bits per pixel" to red, green & blue sizes- bpp2rgb( bpp, r, g, b );-- return bestmode;-}---//========================================================================-// Change the current video mode-//========================================================================--void _glfwSetVideoModeMODE( int mode )-{- DEVMODE dm;- int success;-- // Get the parameters for the best matching display mode- dm.dmSize = sizeof( DEVMODE );- (void) EnumDisplaySettings( NULL, mode, &dm );-- // Set which fields we want to specify- dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;-- // Do we have a prefered refresh rate?- if( _glfwWin.desiredRefreshRate > 0 )- {- dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY;- dm.dmDisplayFrequency = _glfwWin.desiredRefreshRate;- }-- // Change display setting- dm.dmSize = sizeof( DEVMODE );- success = ChangeDisplaySettings( &dm, CDS_FULLSCREEN );-- // If the mode change was not possible, query the current display- // settings (we'll use the desktop resolution for fullscreen mode)- if( success == DISP_CHANGE_SUCCESSFUL )- {- _glfwWin.modeID = mode;- }- else- {- _glfwWin.modeID = ENUM_REGISTRY_SETTINGS;- EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );- }-- // Set the window size to that of the display mode- _glfwWin.width = dm.dmPelsWidth;- _glfwWin.height = dm.dmPelsHeight;-}---//========================================================================-// Change the current video mode-//========================================================================--void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh )-{- int bestmode;-- // Find a best match mode- bestmode = getClosestVideoMode( w, h, &r, &g, &b, &refresh );-- // Change mode- _glfwSetVideoModeMODE( bestmode );-}---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Get a list of available video modes-//========================================================================--int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )-{- int count, success, mode, i, j;- int m1, m2, bpp, r, g, b;- DEVMODE dm;-- // Loop through all video modes and extract all the UNIQUE modes- count = 0;- mode = 0;- do- {- // Get video mode properties- dm.dmSize = sizeof( DEVMODE );- success = EnumDisplaySettings( NULL, mode, &dm );-- // Is it a valid mode? (only list depths >= 15 bpp)- if( success && dm.dmBitsPerPel >= 15 )- {- // Convert to RGB, and back to bpp ("mask out" alpha bits etc)- bpp2rgb( dm.dmBitsPerPel, &r, &g, &b );- bpp = r + g + b;-- // Mode "code" for this mode- m1 = (bpp << 25) | (dm.dmPelsWidth * dm.dmPelsHeight);-- // Insert mode in list (sorted), and avoid duplicates- for( i = 0; i < count; i ++ )- {- // Mode "code" for already listed mode- bpp = list[i].RedBits + list[i].GreenBits +- list[i].BlueBits;- m2 = (bpp << 25) | (list[i].Width * list[i].Height);- if( m1 <= m2 )- {- break;- }- }-- // New entry at the end of the list?- if( i >= count )- {- list[count].Width = dm.dmPelsWidth;- list[count].Height = dm.dmPelsHeight;- list[count].RedBits = r;- list[count].GreenBits = g;- list[count].BlueBits = b;- count ++;- }- // Insert new entry in the list?- else if( m1 < m2 )- {- for( j = count; j > i; j -- )- {- list[j] = list[j-1];- }- list[i].Width = dm.dmPelsWidth;- list[i].Height = dm.dmPelsHeight;- list[i].RedBits = r;- list[i].GreenBits = g;- list[i].BlueBits = b;- count ++;- }- }- mode ++;- }- while( success && (count < maxcount) );-- return count;-}---//========================================================================-// Get the desktop video mode-//========================================================================--void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )-{- DEVMODE dm;-- // Get desktop display mode- dm.dmSize = sizeof( DEVMODE );- (void) EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );-- // Return desktop mode parameters- mode->Width = dm.dmPelsWidth;- mode->Height = dm.dmPelsHeight;- bpp2rgb( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );-}-
− glfw/lib/win32/win32_glext.c
@@ -1,82 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Check if the current context supports the specified WGL extension-//========================================================================--int _glfwPlatformExtensionSupported( const char *extension )-{- const GLubyte *extensions;-- if( _glfwWin.GetExtensionsStringEXT != NULL )- {- extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT();- if( extensions != NULL )- {- if( _glfwStringInExtensionString( extension, extensions ) )- {- return GL_TRUE;- }- }- }-- if( _glfwWin.GetExtensionsStringARB != NULL )- {- extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC );- if( extensions != NULL )- {- if( _glfwStringInExtensionString( extension, extensions ) )- {- return GL_TRUE;- }- }- }-- return GL_FALSE;-}---//========================================================================-// Get the function pointer to an OpenGL function-//========================================================================--void *_glfwPlatformGetProcAddress( const char *procname )-{- return (void *) wglGetProcAddress( procname );-}-
− glfw/lib/win32/win32_init.c
@@ -1,356 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--// With the Borland C++ compiler, we want to disable FPU exceptions-#ifdef __BORLANDC__-#include <float.h>-#endif // __BORLANDC__----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Load necessary libraries (DLLs)-//========================================================================--static int _glfwInitLibraries( void )-{- // gdi32.dll (OpenGL pixel format functions & SwapBuffers)-#ifndef _GLFW_NO_DLOAD_GDI32- _glfwLibrary.Libs.gdi32 = LoadLibrary( "gdi32.dll" );- if( _glfwLibrary.Libs.gdi32 != NULL )- {- _glfwLibrary.Libs.ChoosePixelFormat = (CHOOSEPIXELFORMAT_T)- GetProcAddress( _glfwLibrary.Libs.gdi32, "ChoosePixelFormat" );- _glfwLibrary.Libs.DescribePixelFormat = (DESCRIBEPIXELFORMAT_T)- GetProcAddress( _glfwLibrary.Libs.gdi32, "DescribePixelFormat" );- _glfwLibrary.Libs.GetPixelFormat = (GETPIXELFORMAT_T)- GetProcAddress( _glfwLibrary.Libs.gdi32, "GetPixelFormat" );- _glfwLibrary.Libs.SetPixelFormat = (SETPIXELFORMAT_T)- GetProcAddress( _glfwLibrary.Libs.gdi32, "SetPixelFormat" );- _glfwLibrary.Libs.SwapBuffers = (SWAPBUFFERS_T)- GetProcAddress( _glfwLibrary.Libs.gdi32, "SwapBuffers" );- if( _glfwLibrary.Libs.ChoosePixelFormat == NULL ||- _glfwLibrary.Libs.DescribePixelFormat == NULL ||- _glfwLibrary.Libs.GetPixelFormat == NULL ||- _glfwLibrary.Libs.SetPixelFormat == NULL ||- _glfwLibrary.Libs.SwapBuffers == NULL )- {- FreeLibrary( _glfwLibrary.Libs.gdi32 );- _glfwLibrary.Libs.gdi32 = NULL;- return GL_FALSE;- }- }- else- {- return GL_FALSE;- }-#endif // _GLFW_NO_DLOAD_GDI32-- // winmm.dll (for joystick and timer support)-#ifndef _GLFW_NO_DLOAD_WINMM- _glfwLibrary.Libs.winmm = LoadLibrary( "winmm.dll" );- if( _glfwLibrary.Libs.winmm != NULL )- {- _glfwLibrary.Libs.joyGetDevCapsA = (JOYGETDEVCAPSA_T)- GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetDevCapsA" );- _glfwLibrary.Libs.joyGetPos = (JOYGETPOS_T)- GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPos" );- _glfwLibrary.Libs.joyGetPosEx = (JOYGETPOSEX_T)- GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPosEx" );- _glfwLibrary.Libs.timeGetTime = (TIMEGETTIME_T)- GetProcAddress( _glfwLibrary.Libs.winmm, "timeGetTime" );- if( _glfwLibrary.Libs.joyGetDevCapsA == NULL ||- _glfwLibrary.Libs.joyGetPos == NULL ||- _glfwLibrary.Libs.joyGetPosEx == NULL ||- _glfwLibrary.Libs.timeGetTime == NULL )- {- FreeLibrary( _glfwLibrary.Libs.winmm );- _glfwLibrary.Libs.winmm = NULL;- return GL_FALSE;- }- }- else- {- return GL_FALSE;- }-#endif // _GLFW_NO_DLOAD_WINMM-- return GL_TRUE;-}---//========================================================================-// Unload used libraries (DLLs)-//========================================================================--static void _glfwFreeLibraries( void )-{- // gdi32.dll-#ifndef _GLFW_NO_DLOAD_GDI32- if( _glfwLibrary.Libs.gdi32 != NULL )- {- FreeLibrary( _glfwLibrary.Libs.gdi32 );- _glfwLibrary.Libs.gdi32 = NULL;- }-#endif // _GLFW_NO_DLOAD_GDI32-- // winmm.dll-#ifndef _GLFW_NO_DLOAD_WINMM- if( _glfwLibrary.Libs.winmm != NULL )- {- FreeLibrary( _glfwLibrary.Libs.winmm );- _glfwLibrary.Libs.winmm = NULL;- }-#endif // _GLFW_NO_DLOAD_WINMM-}---//========================================================================-// Initialize GLFW thread package-//========================================================================--static void _glfwInitThreads( void )-{- // Initialize critical section handle- InitializeCriticalSection( &_glfwThrd.CriticalSection );-- // The first thread (the main thread) has ID 0- _glfwThrd.NextID = 0;-- // Fill out information about the main thread (this thread)- _glfwThrd.First.ID = _glfwThrd.NextID ++;- _glfwThrd.First.Function = NULL;- _glfwThrd.First.Handle = GetCurrentThread();- _glfwThrd.First.WinID = GetCurrentThreadId();- _glfwThrd.First.Previous = NULL;- _glfwThrd.First.Next = NULL;-}---//========================================================================-// Terminate GLFW thread package-//========================================================================--static void _glfwTerminateThreads( void )-{- _GLFWthread *t, *t_next;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO- // DIE, _BEFORE_ CALLING glfwTerminate()!!!)- t = _glfwThrd.First.Next;- while( t != NULL )- {- // Get pointer to next thread- t_next = t->Next;-- // Simply murder the process, no mercy!- if( TerminateThread( t->Handle, 0 ) )- {- // Close thread handle- CloseHandle( t->Handle );-- // Free memory allocated for this thread- free( (void *) t );- }-- // Select next thread in list- t = t_next;- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Delete critical section handle- DeleteCriticalSection( &_glfwThrd.CriticalSection );-}---//========================================================================-// Terminate GLFW when exiting application-//========================================================================--void _glfwTerminate_atexit( void )-{- glfwTerminate();-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Initialize various GLFW state-//========================================================================--int _glfwPlatformInit( void )-{- OSVERSIONINFO osi;-- // To make SetForegroundWindow() work as we want, we need to fiddle- // with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early- // as possible in the hope of still being the foreground process)- SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0,- &_glfwLibrary.Sys.foregroundLockTimeout, 0 );- SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,- SPIF_SENDCHANGE );-- // Check which OS version we are running- osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );- GetVersionEx( &osi );- _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN;- if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )- {- if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_95;- }- else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_98;- }- else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_ME;- }- else if( osi.dwMajorVersion >= 4 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_9x;- }- }- else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT )- {- if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_NT4;- }- else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_2K;- }- else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_XP;- }- else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_NET_SERVER;- }- else if( osi.dwMajorVersion >= 5 )- {- _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_NT;- }- }-- // Do we have Unicode support?- if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )- {- // Windows NT/2000/XP/.NET has Unicode support- _glfwLibrary.Sys.hasUnicode = GL_TRUE;- }- else- {- // Windows 9x/ME does not have Unicode support- _glfwLibrary.Sys.hasUnicode = GL_FALSE;- }-- // Load libraries (DLLs)- if( !_glfwInitLibraries() )- {- return GL_FALSE;- }-- // With the Borland C++ compiler, we want to disable FPU exceptions- // (this is recommended for OpenGL applications under Windows)-#ifdef __BORLANDC__- _control87( MCW_EM, MCW_EM );-#endif-- // Retrieve GLFW instance handle- _glfwLibrary.instance = GetModuleHandle( NULL );-- // System keys are not disabled- _glfwWin.keyboardHook = NULL;-- // Initialise thread package- _glfwInitThreads();-- // Install atexit() routine- atexit( _glfwTerminate_atexit );-- // Start the timer- _glfwInitTimer();-- return GL_TRUE;-}---//========================================================================-// Close window and kill all threads-//========================================================================--int _glfwPlatformTerminate( void )-{- // Only the main thread is allowed to do this...- if( GetCurrentThreadId() != _glfwThrd.First.WinID )- {- return GL_FALSE;- }-- // Close OpenGL window- glfwCloseWindow();-- // Kill thread package- _glfwTerminateThreads();-- // Enable system keys again (if they were disabled)- glfwEnable( GLFW_SYSTEM_KEYS );-- // Unload libraries (DLLs)- _glfwFreeLibraries();-- // Restore FOREGROUNDLOCKTIMEOUT system setting- SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,- (LPVOID) _glfwLibrary.Sys.foregroundLockTimeout,- SPIF_SENDCHANGE );-- return GL_TRUE;-}-
− glfw/lib/win32/win32_joystick.c
@@ -1,233 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Return GL_TRUE if joystick is present, else return GL_FALSE.-//========================================================================--static int _glfwJoystickPresent( int joy )-{- JOYINFO ji;-- // Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows- // versions support 16 sticks)- if( _glfwLibrary.Sys.winVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 )- {- return GL_FALSE;- }-- // Is it a valid stick ID (Windows don't support more than 16 sticks)?- if( joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_16 )- {- return GL_FALSE;- }-- // Is the joystick present?- if( _glfw_joyGetPos( joy - GLFW_JOYSTICK_1, &ji ) != JOYERR_NOERROR )- {- return GL_FALSE;- }-- return GL_TRUE;-}---//========================================================================-// Calculate joystick position-//========================================================================--static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max )-{- float fpos = (float) pos;- float fmin = (float) min;- float fmax = (float) max;- return (2.0f*(fpos - fmin) / (fmax - fmin)) - 1.0f;-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Determine joystick capabilities-//========================================================================--int _glfwPlatformGetJoystickParam( int joy, int param )-{- JOYCAPS jc;--// return 0;-- // Is joystick present?- if( !_glfwJoystickPresent( joy ) )- {- return 0;- }-- // We got this far, the joystick is present- if( param == GLFW_PRESENT )- {- return GL_TRUE;- }-- // Get joystick capabilities- _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );-- switch( param )- {- case GLFW_AXES:- // Return number of joystick axes- return jc.wNumAxes;-- case GLFW_BUTTONS:- // Return number of joystick axes- return jc.wNumButtons;-- default:- break;- }-- return 0;-}---//========================================================================-// Get joystick axis positions-//========================================================================--int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )-{- JOYCAPS jc;- JOYINFOEX ji;- int axis;--// return 0;-- // Is joystick present?- if( !_glfwJoystickPresent( joy ) )- {- return 0;- }-- // Get joystick capabilities- _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );-- // Get joystick state- ji.dwSize = sizeof( JOYINFOEX );- ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |- JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;- _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );-- // Get position values for all axes- axis = 0;- if( axis < numaxes )- {- pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin,- jc.wXmax );- }- if( axis < numaxes )- {- pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin,- jc.wYmax );- }- if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ )- {- pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin,- jc.wZmax );- }- if( axis < numaxes && jc.wCaps & JOYCAPS_HASR )- {- pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin,- jc.wRmax );- }- if( axis < numaxes && jc.wCaps & JOYCAPS_HASU )- {- pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin,- jc.wUmax );- }- if( axis < numaxes && jc.wCaps & JOYCAPS_HASV )- {- pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin,- jc.wVmax );- }-- // Return number of returned axes- return axis;-}---//========================================================================-// Get joystick button states-//========================================================================--int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,- int numbuttons )-{- JOYCAPS jc;- JOYINFOEX ji;- int button;--// return 0;-- // Is joystick present?- if( !_glfwJoystickPresent( joy ) )- {- return 0;- }-- // Get joystick capabilities- _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );-- // Get joystick state- ji.dwSize = sizeof( JOYINFOEX );- ji.dwFlags = JOY_RETURNBUTTONS;- _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );-- // Get states of all requested buttons- button = 0;- while( button < numbuttons && button < (int) jc.wNumButtons )- {- buttons[ button ] = (unsigned char)- (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);- button ++;- }-- return button;-}-
− glfw/lib/win32/win32_thread.c
@@ -1,506 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-// This is an implementation of POSIX "compatible" condition variables for-// Win32, as described by Douglas C. Schmidt and Irfan Pyarali:-// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html-//************************************************************************--enum {- _GLFW_COND_SIGNAL = 0,- _GLFW_COND_BROADCAST = 1-};--typedef struct {- // Signal and broadcast event HANDLEs- HANDLE events[ 2 ];-- // Count of the number of waiters- unsigned int waiters_count;-- // Serialize access to <waiters_count>- CRITICAL_SECTION waiters_count_lock;-} _GLFWcond;----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// This is simply a "wrapper" for calling the user thread function.-//========================================================================--DWORD WINAPI _glfwNewThread( LPVOID lpParam )-{- GLFWthreadfun threadfun;- _GLFWthread *t;-- // Get pointer to thread information for current thread- t = _glfwGetThreadPointer( _glfwPlatformGetThreadID() );- if( t == NULL )- {- return 0;- }-- // Get user thread function pointer- threadfun = t->Function;-- // Call the user thread function- threadfun( (void *) lpParam );-- // Remove thread from thread list- ENTER_THREAD_CRITICAL_SECTION- _glfwRemoveThread( t );- LEAVE_THREAD_CRITICAL_SECTION-- // When the thread function returns, the thread will die...- return 0;-}----//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Create a new thread-//========================================================================--GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )-{- GLFWthread ID;- _GLFWthread *t, *t_tmp;- HANDLE hThread;- DWORD dwThreadId;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Create a new thread information memory area- t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );- if( t == NULL )- {- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Get a new unique thread id- ID = _glfwThrd.NextID ++;-- // Store thread information in the thread list- t->Function = fun;- t->ID = ID;-- // Create thread- hThread = CreateThread(- NULL, // Default security attributes- 0, // Default stack size (1 MB)- _glfwNewThread, // Thread function (a wrapper function)- (LPVOID)arg, // Argument to thread is the user argument- 0, // Default creation flags- &dwThreadId // Returned thread identifier- );-- // Did the thread creation fail?- if( hThread == NULL )- {- free( (void *) t );- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Store more thread information in the thread list- t->Handle = hThread;- t->WinID = dwThreadId;-- // Append thread to thread list- t_tmp = &_glfwThrd.First;- while( t_tmp->Next != NULL )- {- t_tmp = t_tmp->Next;- }- t_tmp->Next = t;- t->Previous = t_tmp;- t->Next = NULL;-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the GLFW thread ID- return ID;-}---//========================================================================-// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT-// BE USED EXCEPT IN EXTREME SITUATIONS!-//========================================================================--void _glfwPlatformDestroyThread( GLFWthread ID )-{- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return;- }-- // Simply murder the process, no mercy!- if( TerminateThread( t->Handle, 0 ) )- {- // Close thread handle- CloseHandle( t->Handle );-- // Remove thread from thread list- _glfwRemoveThread( t );- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-}---//========================================================================-// Wait for a thread to die-//========================================================================--int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )-{- DWORD result;- HANDLE hThread;- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );-- // Is the thread already dead?- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return GL_TRUE;- }-- // Get thread handle- hThread = t->Handle;-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Wait for thread to die- if( waitmode == GLFW_WAIT )- {- result = WaitForSingleObject( hThread, INFINITE );- }- else if( waitmode == GLFW_NOWAIT )- {- result = WaitForSingleObject( hThread, 0 );- }- else- {- return GL_FALSE;- }-- // Did we have a time-out?- if( result == WAIT_TIMEOUT )- {- return GL_FALSE;- }- return GL_TRUE;-}---//========================================================================-// Return the thread ID for the current thread-//========================================================================--GLFWthread _glfwPlatformGetThreadID( void )-{- _GLFWthread *t;- GLFWthread ID = -1;- DWORD WinID;-- // Get Windows thread ID- WinID = GetCurrentThreadId();-- // Enter critical section (to avoid an inconsistent thread list)- ENTER_THREAD_CRITICAL_SECTION-- // Loop through entire list of threads to find the matching Windows- // thread ID- for( t = &_glfwThrd.First; t != NULL; t = t->Next )- {- if( t->WinID == WinID )- {- ID = t->ID;- break;- }- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the found GLFW thread identifier- return ID;-}---//========================================================================-// Create a mutual exclusion object-//========================================================================--GLFWmutex _glfwPlatformCreateMutex( void )-{- CRITICAL_SECTION *mutex;-- // Allocate memory for mutex- mutex = (CRITICAL_SECTION *) malloc( sizeof(CRITICAL_SECTION) );- if( !mutex )- {- return NULL;- }-- // Initialize mutex- InitializeCriticalSection( mutex );-- // Cast to GLFWmutex and return- return (GLFWmutex) mutex;-}---//========================================================================-// Destroy a mutual exclusion object-//========================================================================--void _glfwPlatformDestroyMutex( GLFWmutex mutex )-{- // Destroy mutex- DeleteCriticalSection( (CRITICAL_SECTION *) mutex );- free( mutex );-}---//========================================================================-// Request access to a mutex-//========================================================================--void _glfwPlatformLockMutex( GLFWmutex mutex )-{- // Wait for mutex to be released- EnterCriticalSection( (CRITICAL_SECTION *) mutex );-}---//========================================================================-// Release a mutex-//========================================================================--void _glfwPlatformUnlockMutex( GLFWmutex mutex )-{- // Release mutex- LeaveCriticalSection( (CRITICAL_SECTION *) mutex );-}---//========================================================================-// Create a new condition variable object-//========================================================================--GLFWcond _glfwPlatformCreateCond( void )-{- _GLFWcond *cond;-- // Allocate memory for condition variable- cond = (_GLFWcond *) malloc( sizeof(_GLFWcond) );- if( !cond )- {- return NULL;- }-- // Initialize condition variable- cond->waiters_count = 0;- cond->events[ _GLFW_COND_SIGNAL ] = CreateEvent( NULL, FALSE,- FALSE, NULL );- cond->events[ _GLFW_COND_BROADCAST ] = CreateEvent( NULL, TRUE,- FALSE, NULL );- InitializeCriticalSection( &cond->waiters_count_lock );-- // Cast to GLFWcond and return- return (GLFWcond) cond;-}---//========================================================================-// Destroy a condition variable object-//========================================================================--void _glfwPlatformDestroyCond( GLFWcond cond )-{- // Close the condition variable handles- CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_SIGNAL ] );- CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_BROADCAST ] );-- // Delete critical section- DeleteCriticalSection( &((_GLFWcond *)cond)->waiters_count_lock );-- // Free memory for condition variable- free( (void *) cond );-}---//========================================================================-// Wait for a condition to be raised-//========================================================================--void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout )-{- _GLFWcond *cv = (_GLFWcond *) cond;- int result, last_waiter;- DWORD timeout_ms;-- // Avoid race conditions- EnterCriticalSection( &cv->waiters_count_lock );- cv->waiters_count ++;- LeaveCriticalSection( &cv->waiters_count_lock );-- // It's ok to release the mutex here since Win32 manual-reset events- // maintain state when used with SetEvent()- LeaveCriticalSection( (CRITICAL_SECTION *) mutex );-- // Translate timeout into milliseconds- if( timeout >= GLFW_INFINITY )- {- timeout_ms = INFINITE;- }- else- {- timeout_ms = (DWORD) (1000.0 * timeout + 0.5);- if( timeout_ms <= 0 )- {- timeout_ms = 1;- }- }-- // Wait for either event to become signaled due to glfwSignalCond or- // glfwBroadcastCond being called- result = WaitForMultipleObjects( 2, cv->events, FALSE, timeout_ms );-- // Check if we are the last waiter- EnterCriticalSection( &cv->waiters_count_lock );- cv->waiters_count --;- last_waiter = (result == WAIT_OBJECT_0 + _GLFW_COND_BROADCAST) &&- (cv->waiters_count == 0);- LeaveCriticalSection( &cv->waiters_count_lock );-- // Some thread called glfwBroadcastCond- if( last_waiter )- {- // We're the last waiter to be notified or to stop waiting, so- // reset the manual event- ResetEvent( cv->events[ _GLFW_COND_BROADCAST ] );- }-- // Reacquire the mutex- EnterCriticalSection( (CRITICAL_SECTION *) mutex );-}---//========================================================================-// Signal a condition to one waiting thread-//========================================================================--void _glfwPlatformSignalCond( GLFWcond cond )-{- _GLFWcond *cv = (_GLFWcond *) cond;- int have_waiters;-- // Avoid race conditions- EnterCriticalSection( &cv->waiters_count_lock );- have_waiters = cv->waiters_count > 0;- LeaveCriticalSection( &cv->waiters_count_lock );-- if( have_waiters )- {- SetEvent( cv->events[ _GLFW_COND_SIGNAL ] );- }-}---//========================================================================-// Broadcast a condition to all waiting threads-//========================================================================--void _glfwPlatformBroadcastCond( GLFWcond cond )-{- _GLFWcond *cv = (_GLFWcond *) cond;- int have_waiters;-- // Avoid race conditions- EnterCriticalSection( &cv->waiters_count_lock );- have_waiters = cv->waiters_count > 0;- LeaveCriticalSection( &cv->waiters_count_lock );-- if( have_waiters )- {- SetEvent( cv->events[ _GLFW_COND_BROADCAST ] );- }-}---//========================================================================-// Return the number of processors in the system.-//========================================================================--int _glfwPlatformGetNumberOfProcessors( void )-{- SYSTEM_INFO si;-- // Get hardware system information- GetSystemInfo( &si );-- return (int) si.dwNumberOfProcessors;-}-
− glfw/lib/win32/win32_time.c
@@ -1,146 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Initialise timer-//========================================================================--void _glfwInitTimer( void )-{- __int64 freq;-- // Check if we have a performance counter- if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) )- {- // Performance counter is available => use it!- _glfwLibrary.Timer.HasPerformanceCounter = GL_TRUE;-- // Counter resolution is 1 / counter frequency- _glfwLibrary.Timer.Resolution = 1.0 / (double)freq;-- // Set start time for timer- QueryPerformanceCounter( (LARGE_INTEGER *)&_glfwLibrary.Timer.t0_64 );- }- else- {- // No performace counter available => use the tick counter- _glfwLibrary.Timer.HasPerformanceCounter = GL_FALSE;-- // Counter resolution is 1 ms- _glfwLibrary.Timer.Resolution = 0.001;-- // Set start time for timer- _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime();- }-}---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Return timer value in seconds-//========================================================================--double _glfwPlatformGetTime( void )-{- double t;- __int64 t_64;-- if( _glfwLibrary.Timer.HasPerformanceCounter )- {- QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );- t = (double)(t_64 - _glfwLibrary.Timer.t0_64);- }- else- {- t = (double)(_glfw_timeGetTime() - _glfwLibrary.Timer.t0_32);- }-- // Calculate the current time in seconds- return t * _glfwLibrary.Timer.Resolution;-}---//========================================================================-// Set timer value in seconds-//========================================================================--void _glfwPlatformSetTime( double t )-{- __int64 t_64;-- if( _glfwLibrary.Timer.HasPerformanceCounter )- {- QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );- _glfwLibrary.Timer.t0_64 = t_64 - (__int64)(t/_glfwLibrary.Timer.Resolution);- }- else- {- _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime() - (int)(t*1000.0);- }-}---//========================================================================-// Put a thread to sleep for a specified amount of time-//========================================================================--void _glfwPlatformSleep( double time )-{- DWORD t;-- if( time == 0.0 )- {- t = 0;- }- else if( time < 0.001 )- {- t = 1;- }- else if( time > 2147483647.0 )- {- t = 2147483647;- }- else- {- t = (DWORD)(time*1000.0 + 0.5);- }- Sleep( t );-}-
− glfw/lib/win32/win32_window.c
@@ -1,1875 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Win32/WGL-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--// We use versioned window class names in order not to cause conflicts-// between applications using different versions of GLFW-#define _GLFW_WNDCLASSNAME "GLFW27"---//========================================================================-// Enable/disable minimize/restore animations-//========================================================================--static int setMinMaxAnimations( int enable )-{- ANIMATIONINFO AI;- int old_enable;-- // Get old animation setting- AI.cbSize = sizeof( ANIMATIONINFO );- SystemParametersInfo( SPI_GETANIMATION, AI.cbSize, &AI, 0 );- old_enable = AI.iMinAnimate;-- // If requested, change setting- if( old_enable != enable )- {- AI.iMinAnimate = enable;- SystemParametersInfo( SPI_SETANIMATION, AI.cbSize, &AI,- SPIF_SENDCHANGE );- }-- return old_enable;-}---//========================================================================-// Focus the window and bring it to the top of the stack-// Due to some nastiness with how Win98/ME/2k/XP handles SetForegroundWindow,-// we have to go through some really bizarre measures to achieve this-//========================================================================--static void setForegroundWindow( HWND hWnd )-{- int try_count = 0;- int old_animate;-- // Try the standard approach first...- BringWindowToTop( hWnd );- SetForegroundWindow( hWnd );-- // If it worked, return now- if( hWnd == GetForegroundWindow() )- {- // Try to modify the system settings (since this is the foreground- // process, we are allowed to do this)- SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,- SPIF_SENDCHANGE );- return;- }-- // For other Windows versions than 95 & NT4.0, the standard approach- // may not work, so if we failed we have to "trick" Windows into- // making our window the foureground window: Iconify and restore- // again. It is ugly, but it seems to work (we turn off those annoying- // zoom animations to make it look a bit better at least).-- // Turn off minimize/restore animations- old_animate = setMinMaxAnimations( 0 );-- // We try this a few times, just to be on the safe side of things...- do- {- // Iconify & restore- ShowWindow( hWnd, SW_HIDE );- ShowWindow( hWnd, SW_SHOWMINIMIZED );- ShowWindow( hWnd, SW_SHOWNORMAL );-- // Try to get focus- BringWindowToTop( hWnd );- SetForegroundWindow( hWnd );-- // We do not want to keep going on forever, so we keep track of- // how many times we tried- try_count ++;- }- while( hWnd != GetForegroundWindow() && try_count <= 3 );-- // Restore the system minimize/restore animation setting- (void) setMinMaxAnimations( old_animate );-- // Try to modify the system settings (since this is now hopefully the- // foreground process, we are probably allowed to do this)- SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,- SPIF_SENDCHANGE );-}---//========================================================================-// Returns the specified attribute of the specified pixel format-// NOTE: Do not call this unless we have found WGL_ARB_pixel_format-//========================================================================--static int getPixelFormatAttrib(int pixelFormat, int attrib)-{- int value = 0;-- if( !_glfwWin.GetPixelFormatAttribivARB( _glfwWin.DC, pixelFormat, 0, 1, &attrib, &value) )- {- // NOTE: We should probably handle this error somehow- return 0;- }-- return value;-}---//========================================================================-// Return a list of available and usable framebuffer configs-//========================================================================--static _GLFWfbconfig *getFBConfigs( unsigned int *found )-{- _GLFWfbconfig *result;- PIXELFORMATDESCRIPTOR pfd;- int i, count;-- *found = 0;-- if( _glfwWin.has_WGL_ARB_pixel_format )- {- count = getPixelFormatAttrib( 1, WGL_NUMBER_PIXEL_FORMATS_ARB );- }- else- {- count = _glfw_DescribePixelFormat( _glfwWin.DC, 1, sizeof( PIXELFORMATDESCRIPTOR ), NULL );- }-- if( !count )- {- fprintf( stderr, "No Win32 pixel formats available\n" );- return NULL;- }-- result = (_GLFWfbconfig*) malloc( sizeof( _GLFWfbconfig ) * count );- if( !result )- {- fprintf(stderr, "Out of memory");- return NULL;- }-- for( i = 1; i <= count; i++ )- {- if( _glfwWin.has_WGL_ARB_pixel_format )- {- // Get pixel format attributes through WGL_ARB_pixel_format-- if( !getPixelFormatAttrib( i, WGL_SUPPORT_OPENGL_ARB ) ||- !getPixelFormatAttrib( i, WGL_DRAW_TO_WINDOW_ARB ) ||- !getPixelFormatAttrib( i, WGL_DOUBLE_BUFFER_ARB ) )- {- // Only consider doublebuffered OpenGL pixel formats for windows- continue;- }-- if( getPixelFormatAttrib( i, WGL_PIXEL_TYPE_ARB ) != WGL_TYPE_RGBA_ARB )- {- // Only consider RGBA pixel formats- continue;- }-- // Only consider "hardware-accelerated" pixel formats- if( getPixelFormatAttrib( i, WGL_ACCELERATION_ARB ) ==- WGL_NO_ACCELERATION_ARB )- {- continue;- }-- result[*found].redBits = getPixelFormatAttrib( i, WGL_RED_BITS_ARB );- result[*found].greenBits = getPixelFormatAttrib( i, WGL_GREEN_BITS_ARB );- result[*found].blueBits = getPixelFormatAttrib( i, WGL_BLUE_BITS_ARB );- result[*found].alphaBits = getPixelFormatAttrib( i, WGL_ALPHA_BITS_ARB );-- result[*found].depthBits = getPixelFormatAttrib( i, WGL_DEPTH_BITS_ARB );- result[*found].stencilBits = getPixelFormatAttrib( i, WGL_STENCIL_BITS_ARB );-- result[*found].accumRedBits = getPixelFormatAttrib( i, WGL_ACCUM_RED_BITS_ARB );- result[*found].accumGreenBits = getPixelFormatAttrib( i, WGL_ACCUM_GREEN_BITS_ARB );- result[*found].accumBlueBits = getPixelFormatAttrib( i, WGL_ACCUM_BLUE_BITS_ARB );- result[*found].accumAlphaBits = getPixelFormatAttrib( i, WGL_ACCUM_ALPHA_BITS_ARB );-- result[*found].auxBuffers = getPixelFormatAttrib( i, WGL_AUX_BUFFERS_ARB );- result[*found].stereo = getPixelFormatAttrib( i, WGL_STEREO_ARB );-- if( _glfwWin.has_WGL_ARB_multisample )- {- result[*found].samples = getPixelFormatAttrib( i, WGL_SAMPLES_ARB );- }- else- {- result[*found].samples = 0;- }- }- else- {- // Get pixel format attributes through old-fashioned PFDs-- if( !_glfw_DescribePixelFormat( _glfwWin.DC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) )- {- continue;- }-- if( !( pfd.dwFlags & PFD_DRAW_TO_WINDOW ) ||- !( pfd.dwFlags & PFD_SUPPORT_OPENGL ) ||- !( pfd.dwFlags & PFD_DOUBLEBUFFER ) )- {- // Only consider doublebuffered OpenGL pixel formats for windows- continue;- }-- if( !( pfd.dwFlags & PFD_GENERIC_ACCELERATED ) &&- ( pfd.dwFlags & PFD_GENERIC_FORMAT ) )- {- continue;- }-- if( pfd.iPixelType != PFD_TYPE_RGBA )- {- // Only RGBA pixel formats considered- continue;- }-- result[*found].redBits = pfd.cRedBits;- result[*found].greenBits = pfd.cGreenBits;- result[*found].blueBits = pfd.cBlueBits;- result[*found].alphaBits = pfd.cAlphaBits;-- result[*found].depthBits = pfd.cDepthBits;- result[*found].stencilBits = pfd.cStencilBits;-- result[*found].accumRedBits = pfd.cAccumRedBits;- result[*found].accumGreenBits = pfd.cAccumGreenBits;- result[*found].accumBlueBits = pfd.cAccumBlueBits;- result[*found].accumAlphaBits = pfd.cAccumAlphaBits;-- result[*found].auxBuffers = pfd.cAuxBuffers;- result[*found].stereo = ( pfd.dwFlags & PFD_STEREO ) ? GL_TRUE : GL_FALSE;-- // PFD pixel formats do not support FSAA- result[*found].samples = 0;- }-- result[*found].platformID = i;-- (*found)++;- }-- return result;-}---//========================================================================-// Creates an OpenGL context on the specified device context-//========================================================================--static GLboolean createContext( HDC dc, const _GLFWwndconfig* wndconfig, int pixelFormat )-{- PIXELFORMATDESCRIPTOR pfd;- int flags, i = 0, attribs[40];-- if( !_glfw_DescribePixelFormat( dc, pixelFormat, sizeof(pfd), &pfd ) )- {- return GL_FALSE;- }-- if( !_glfw_SetPixelFormat( dc, pixelFormat, &pfd ) )- {- return GL_FALSE;- }-- if( _glfwWin.has_WGL_ARB_create_context )- {- // Use the newer wglCreateContextAttribsARB-- if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 )- {- // Request an explicitly versioned context-- attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB;- attribs[i++] = wndconfig->glMajor;- attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB;- attribs[i++] = wndconfig->glMinor;- }-- if( wndconfig->glForward || wndconfig->glDebug )- {- flags = 0;-- if( wndconfig->glForward )- {- flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;- }-- if( wndconfig->glDebug )- {- flags |= WGL_CONTEXT_DEBUG_BIT_ARB;- }-- attribs[i++] = WGL_CONTEXT_FLAGS_ARB;- attribs[i++] = flags;- }-- if( wndconfig->glProfile )- {- if( !_glfwWin.has_WGL_ARB_create_context_profile )- {- return GL_FALSE;- }-- if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE )- {- flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;- }- else- {- flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;- }-- attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;- attribs[i++] = flags;- }-- attribs[i++] = 0;-- _glfwWin.context = _glfwWin.CreateContextAttribsARB( dc, NULL, attribs );- if( !_glfwWin.context )- {- return GL_FALSE;- }- }- else- {- _glfwWin.context = wglCreateContext( dc );- if( !_glfwWin.context )- {- return GL_FALSE;- }- }-- return GL_TRUE;-}---//========================================================================-// Translates a Windows key to the corresponding GLFW key-//========================================================================--static int translateKey( WPARAM wParam, LPARAM lParam )-{- MSG next_msg;- DWORD msg_time;- DWORD scan_code;-- // Check for numeric keypad keys- // Note: This way we always force "NumLock = ON", which at least- // enables GLFW users to detect numeric keypad keys- int hiFlags = HIWORD( lParam );-- if ( !( hiFlags & 0x100 ) )- {- switch( MapVirtualKey( hiFlags & 0xFF, 1 ) )- {- case VK_INSERT: return GLFW_KEY_KP_0;- case VK_END: return GLFW_KEY_KP_1;- case VK_DOWN: return GLFW_KEY_KP_2;- case VK_NEXT: return GLFW_KEY_KP_3;- case VK_LEFT: return GLFW_KEY_KP_4;- case VK_CLEAR: return GLFW_KEY_KP_5;- case VK_RIGHT: return GLFW_KEY_KP_6;- case VK_HOME: return GLFW_KEY_KP_7;- case VK_UP: return GLFW_KEY_KP_8;- case VK_PRIOR: return GLFW_KEY_KP_9;- case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE;- case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY;- case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT;- case VK_ADD: return GLFW_KEY_KP_ADD;- case VK_DELETE: return GLFW_KEY_KP_DECIMAL;- }- }-- // Check which key was pressed or released- switch( wParam )- {- // The SHIFT keys require special handling- case VK_SHIFT:- {- // Compare scan code for this key with that of VK_RSHIFT in- // order to determine which shift key was pressed (left or- // right)- scan_code = MapVirtualKey( VK_RSHIFT, 0 );- if( ((lParam & 0x01ff0000) >> 16) == scan_code )- {- return GLFW_KEY_RSHIFT;- }-- return GLFW_KEY_LSHIFT;- }-- // The CTRL keys require special handling- case VK_CONTROL:- {- // Is this an extended key (i.e. right key)?- if( lParam & 0x01000000 )- {- return GLFW_KEY_RCTRL;- }-- // Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only- // want the RALT message, so we try to see if the next message- // is a RALT message. In that case, this is a false LCTRL!- msg_time = GetMessageTime();- if( PeekMessage( &next_msg, NULL, 0, 0, PM_NOREMOVE ) )- {- if( next_msg.message == WM_KEYDOWN ||- next_msg.message == WM_SYSKEYDOWN )- {- if( next_msg.wParam == VK_MENU &&- (next_msg.lParam & 0x01000000) &&- next_msg.time == msg_time )- {- // Next message is a RALT down message, which- // means that this is NOT a proper LCTRL message!- return GLFW_KEY_UNKNOWN;- }- }- }-- return GLFW_KEY_LCTRL;- }-- // The ALT keys require special handling- case VK_MENU:- {- // Is this an extended key (i.e. right key)?- if( lParam & 0x01000000 )- {- return GLFW_KEY_RALT;- }-- return GLFW_KEY_LALT;- }-- // The ENTER keys require special handling- case VK_RETURN:- {- // Is this an extended key (i.e. right key)?- if( lParam & 0x01000000 )- {- return GLFW_KEY_KP_ENTER;- }-- return GLFW_KEY_ENTER;- }-- // Special keys (non character keys)- case VK_ESCAPE: return GLFW_KEY_ESC;- case VK_TAB: return GLFW_KEY_TAB;- case VK_BACK: return GLFW_KEY_BACKSPACE;- case VK_HOME: return GLFW_KEY_HOME;- case VK_END: return GLFW_KEY_END;- case VK_PRIOR: return GLFW_KEY_PAGEUP;- case VK_NEXT: return GLFW_KEY_PAGEDOWN;- case VK_INSERT: return GLFW_KEY_INSERT;- case VK_DELETE: return GLFW_KEY_DEL;- case VK_LEFT: return GLFW_KEY_LEFT;- case VK_UP: return GLFW_KEY_UP;- case VK_RIGHT: return GLFW_KEY_RIGHT;- case VK_DOWN: return GLFW_KEY_DOWN;- case VK_F1: return GLFW_KEY_F1;- case VK_F2: return GLFW_KEY_F2;- case VK_F3: return GLFW_KEY_F3;- case VK_F4: return GLFW_KEY_F4;- case VK_F5: return GLFW_KEY_F5;- case VK_F6: return GLFW_KEY_F6;- case VK_F7: return GLFW_KEY_F7;- case VK_F8: return GLFW_KEY_F8;- case VK_F9: return GLFW_KEY_F9;- case VK_F10: return GLFW_KEY_F10;- case VK_F11: return GLFW_KEY_F11;- case VK_F12: return GLFW_KEY_F12;- case VK_F13: return GLFW_KEY_F13;- case VK_F14: return GLFW_KEY_F14;- case VK_F15: return GLFW_KEY_F15;- case VK_F16: return GLFW_KEY_F16;- case VK_F17: return GLFW_KEY_F17;- case VK_F18: return GLFW_KEY_F18;- case VK_F19: return GLFW_KEY_F19;- case VK_F20: return GLFW_KEY_F20;- case VK_F21: return GLFW_KEY_F21;- case VK_F22: return GLFW_KEY_F22;- case VK_F23: return GLFW_KEY_F23;- case VK_F24: return GLFW_KEY_F24;- case VK_SPACE: return GLFW_KEY_SPACE;-- // Numeric keypad- case VK_NUMPAD0: return GLFW_KEY_KP_0;- case VK_NUMPAD1: return GLFW_KEY_KP_1;- case VK_NUMPAD2: return GLFW_KEY_KP_2;- case VK_NUMPAD3: return GLFW_KEY_KP_3;- case VK_NUMPAD4: return GLFW_KEY_KP_4;- case VK_NUMPAD5: return GLFW_KEY_KP_5;- case VK_NUMPAD6: return GLFW_KEY_KP_6;- case VK_NUMPAD7: return GLFW_KEY_KP_7;- case VK_NUMPAD8: return GLFW_KEY_KP_8;- case VK_NUMPAD9: return GLFW_KEY_KP_9;- case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE;- case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY;- case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT;- case VK_ADD: return GLFW_KEY_KP_ADD;- case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL;- case VK_NUMLOCK: return GLFW_KEY_KP_NUM_LOCK;-- case VK_CAPITAL: return GLFW_KEY_CAPS_LOCK;- case VK_SCROLL: return GLFW_KEY_SCROLL_LOCK;- case VK_PAUSE: return GLFW_KEY_PAUSE;-- case VK_LWIN: return GLFW_KEY_LSUPER;- case VK_RWIN: return GLFW_KEY_RSUPER;- case VK_APPS: return GLFW_KEY_MENU;-- // The rest (should be printable keys)- default:- {- // Convert to printable character (ISO-8859-1 or Unicode)- wParam = MapVirtualKey( (UINT) wParam, 2 ) & 0x0000FFFF;-- // Make sure that the character is uppercase- if( _glfwLibrary.Sys.hasUnicode )- {- wParam = (WPARAM) CharUpperW( (LPWSTR) wParam );- }- else- {- wParam = (WPARAM) CharUpperA( (LPSTR) wParam );- }-- // Valid ISO-8859-1 character?- if( (wParam >= 32 && wParam <= 126) ||- (wParam >= 160 && wParam <= 255) )- {- return (int) wParam;- }-- return GLFW_KEY_UNKNOWN;- }- }-}---//========================================================================-// Translates a Windows key to Unicode-//========================================================================--static void translateChar( DWORD wParam, DWORD lParam, int action )-{- BYTE keyboard_state[ 256 ];- UCHAR char_buf[ 10 ];- WCHAR unicode_buf[ 10 ];- UINT scan_code;- int i, num_chars, unicode;-- GetKeyboardState( keyboard_state );-- // Derive scan code from lParam and action- scan_code = (lParam & 0x01ff0000) >> 16;- if( action == GLFW_RELEASE )- {- scan_code |= 0x8000000;- }-- if( _glfwLibrary.Sys.hasUnicode )- {- num_chars = ToUnicode(- wParam, // virtual-key code- scan_code, // scan code- keyboard_state, // key-state array- unicode_buf, // buffer for translated key- 10, // size of translated key buffer- 0 // active-menu flag- );- unicode = 1;- }- else- {- // Convert to ISO-8859-1- num_chars = ToAscii(- wParam, // virtual-key code- scan_code, // scan code- keyboard_state, // key-state array- (LPWORD) char_buf, // buffer for translated key- 0 // active-menu flag- );- unicode = 0;- }-- // Report characters- for( i = 0; i < num_chars; i++ )- {- // Get next character from buffer- if( unicode )- {- _glfwInputChar( (int) unicode_buf[ i ], action );- }- else- {- _glfwInputChar( (int) char_buf[ i ], action );- }- }-}---//========================================================================-// Window callback function (handles window events)-//========================================================================--static LRESULT CALLBACK windowProc( HWND hWnd, UINT uMsg,- WPARAM wParam, LPARAM lParam )-{- int wheelDelta, iconified;-- switch( uMsg )- {- // Window activate message? (iconification?)- case WM_ACTIVATE:- {- _glfwWin.active = LOWORD(wParam) != WA_INACTIVE ? GL_TRUE : GL_FALSE;-- iconified = HIWORD(wParam) ? GL_TRUE : GL_FALSE;-- // Were we deactivated/iconified?- if( (!_glfwWin.active || iconified) && !_glfwWin.iconified )- {- _glfwInputDeactivation();-- // If we are in fullscreen mode we need to iconify- if( _glfwWin.opened && _glfwWin.fullscreen )- {- // Do we need to manually iconify?- if( !iconified )- {- // Minimize window- ShowWindow( _glfwWin.window, SW_MINIMIZE );- iconified = GL_TRUE;- }-- // Restore the original desktop resolution- ChangeDisplaySettings( NULL, CDS_FULLSCREEN );- }-- // Unlock mouse if locked- if( !_glfwWin.oldMouseLockValid )- {- _glfwWin.oldMouseLock = _glfwWin.mouseLock;- _glfwWin.oldMouseLockValid = GL_TRUE;- glfwEnable( GLFW_MOUSE_CURSOR );- }- }- else if( _glfwWin.active || !iconified )- {- // If we are in fullscreen mode we need to maximize- if( _glfwWin.opened && _glfwWin.fullscreen && _glfwWin.iconified )- {- // Change display settings to the user selected mode- _glfwSetVideoModeMODE( _glfwWin.modeID );-- // Do we need to manually restore window?- if( iconified )- {- // Restore window- ShowWindow( _glfwWin.window, SW_RESTORE );- iconified = GL_FALSE;-- // Activate window- ShowWindow( hWnd, SW_SHOW );- setForegroundWindow( _glfwWin.window );- SetFocus( _glfwWin.window );- }- }-- // Lock mouse, if necessary- if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock )- {- glfwDisable( GLFW_MOUSE_CURSOR );- }- _glfwWin.oldMouseLockValid = GL_FALSE;- }-- _glfwWin.iconified = iconified;- return 0;- }-- case WM_SYSCOMMAND:- {- switch( wParam & 0xfff0 )- {- case SC_SCREENSAVE:- case SC_MONITORPOWER:- {- if( _glfwWin.fullscreen )- {- // Disallow screen saver and screen blanking if we are- // running in fullscreen mode- return 0;- }- else- {- break;- }- }-- // User trying to access application menu using ALT?- case SC_KEYMENU:- return 0;- }- break;- }-- case WM_CLOSE:- {- // Translate this to WM_QUIT so that we can handle all cases in the- // same place- PostQuitMessage( 0 );- return 0;- }-- case WM_KEYDOWN:- case WM_SYSKEYDOWN:- {- _glfwInputKey( translateKey( wParam, lParam ), GLFW_PRESS );-- if( _glfwWin.charCallback )- {- translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_PRESS );- }- return 0;- }-- case WM_KEYUP:- case WM_SYSKEYUP:- {- // Special trick: release both shift keys on SHIFT up event- if( wParam == VK_SHIFT )- {- _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE );- _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE );- }- else- {- _glfwInputKey( translateKey( wParam, lParam ), GLFW_RELEASE );- }-- if( _glfwWin.charCallback )- {- translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_RELEASE );- }-- return 0;- }-- case WM_LBUTTONDOWN:- SetCapture(hWnd);- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );- return 0;- case WM_RBUTTONDOWN:- SetCapture(hWnd);- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );- return 0;- case WM_MBUTTONDOWN:- SetCapture(hWnd);- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );- return 0;- case WM_XBUTTONDOWN:- {- if( HIWORD(wParam) == XBUTTON1 )- {- SetCapture(hWnd);- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_PRESS );- }- else if( HIWORD(wParam) == XBUTTON2 )- {- SetCapture(hWnd);- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_PRESS );- }- return 1;- }-- case WM_LBUTTONUP:- ReleaseCapture();- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE );- return 0;- case WM_RBUTTONUP:- ReleaseCapture();- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE );- return 0;- case WM_MBUTTONUP:- ReleaseCapture();- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE );- return 0;- case WM_XBUTTONUP:- {- if( HIWORD(wParam) == XBUTTON1 )- {- ReleaseCapture();- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_RELEASE );- }- else if( HIWORD(wParam) == XBUTTON2 )- {- ReleaseCapture();- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_RELEASE );- }- return 1;- }-- case WM_MOUSEMOVE:- {- int NewMouseX, NewMouseY;-- // Get signed (!) mouse position- NewMouseX = (int)((short)LOWORD(lParam));- NewMouseY = (int)((short)HIWORD(lParam));-- if( NewMouseX != _glfwInput.OldMouseX ||- NewMouseY != _glfwInput.OldMouseY )- {- if( _glfwWin.mouseLock )- {- _glfwInput.MousePosX += NewMouseX -- _glfwInput.OldMouseX;- _glfwInput.MousePosY += NewMouseY -- _glfwInput.OldMouseY;- }- else- {- _glfwInput.MousePosX = NewMouseX;- _glfwInput.MousePosY = NewMouseY;- }- _glfwInput.OldMouseX = NewMouseX;- _glfwInput.OldMouseY = NewMouseY;- _glfwInput.MouseMoved = GL_TRUE;-- if( _glfwWin.mousePosCallback )- {- _glfwWin.mousePosCallback( _glfwInput.MousePosX,- _glfwInput.MousePosY );- }- }- return 0;- }-- case WM_MOUSEWHEEL:- {- // WM_MOUSEWHEEL is not supported under Windows 95- if( _glfwLibrary.Sys.winVer != _GLFW_WIN_95 )- {- wheelDelta = (((int)wParam) >> 16) / WHEEL_DELTA;- _glfwInput.WheelPos += wheelDelta;- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }- return 0;- }- break;- }-- case WM_SIZE:- {- _glfwWin.width = LOWORD(lParam);- _glfwWin.height = HIWORD(lParam);-- // If the mouse is locked, update the clipping rect- if( _glfwWin.mouseLock )- {- RECT ClipWindowRect;- if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) )- {- ClipCursor( &ClipWindowRect );- }- }-- if( _glfwWin.windowSizeCallback )- {- _glfwWin.windowSizeCallback( LOWORD(lParam), HIWORD(lParam) );- }- return 0;- }-- case WM_MOVE:- {- // If the mouse is locked, update the clipping rect- if( _glfwWin.mouseLock )- {- RECT ClipWindowRect;- if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) )- {- ClipCursor( &ClipWindowRect );- }- }- return 0;- }-- // Was the window contents damaged?- case WM_PAINT:- {- if( _glfwWin.windowRefreshCallback )- {- _glfwWin.windowRefreshCallback();- }- break;- }-- case WM_DISPLAYCHANGE:- {- // TODO: Do stuff here.-- break;- }- }-- // Pass all unhandled messages to DefWindowProc- return DefWindowProc( hWnd, uMsg, wParam, lParam );-}---//========================================================================-// Translate client window size to full window size (including window borders)-//========================================================================--static void getFullWindowSize( int clientWidth, int clientHeight,- int *fullWidth, int *fullHeight )-{- RECT rect;-- // Create a window rectangle- rect.left = (long)0;- rect.right = (long)clientWidth - 1;- rect.top = (long)0;- rect.bottom = (long)clientHeight - 1;-- // Adjust according to window styles- AdjustWindowRectEx( &rect, _glfwWin.dwStyle, FALSE, _glfwWin.dwExStyle );-- // Calculate width and height of full window- *fullWidth = rect.right - rect.left + 1;- *fullHeight = rect.bottom - rect.top + 1;-}---//========================================================================-// Initialize WGL-specific extensions-// This function is called once before initial context creation, i.e. before-// any WGL extensions could be present. This is done in order to have both-// extension variable clearing and loading in the same place, hopefully-// decreasing the possibility of forgetting to add one without the other.-//========================================================================--static void initWGLExtensions( void )-{- // This needs to include every function pointer loaded below- _glfwWin.SwapIntervalEXT = NULL;- _glfwWin.GetPixelFormatAttribivARB = NULL;- _glfwWin.GetExtensionsStringARB = NULL;- _glfwWin.GetExtensionsStringEXT = NULL;- _glfwWin.CreateContextAttribsARB = NULL;-- // This needs to include every extension used below except for- // WGL_ARB_extensions_string and WGL_EXT_extensions_string- _glfwWin.has_WGL_EXT_swap_control = GL_FALSE;- _glfwWin.has_WGL_ARB_pixel_format = GL_FALSE;- _glfwWin.has_WGL_ARB_multisample = GL_FALSE;- _glfwWin.has_WGL_ARB_create_context = GL_FALSE;- _glfwWin.has_WGL_ARB_create_context_profile = GL_FALSE;-- _glfwWin.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)- wglGetProcAddress( "wglGetExtensionsStringEXT" );- if( !_glfwWin.GetExtensionsStringEXT )- {- _glfwWin.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)- wglGetProcAddress( "wglGetExtensionsStringARB" );- if( !_glfwWin.GetExtensionsStringARB )- {- return;- }- }-- if( _glfwPlatformExtensionSupported( "WGL_ARB_multisample" ) )- {- _glfwWin.has_WGL_ARB_multisample = GL_TRUE;- }-- if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context" ) )- {- _glfwWin.has_WGL_ARB_create_context = GL_TRUE;- _glfwWin.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)- wglGetProcAddress( "wglCreateContextAttribsARB" );- }-- if( _glfwWin.has_WGL_ARB_create_context )- {- if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context_profile" ) )- {- _glfwWin.has_WGL_ARB_create_context_profile = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "WGL_EXT_swap_control" ) )- {- _glfwWin.has_WGL_EXT_swap_control = GL_TRUE;- _glfwWin.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)- wglGetProcAddress( "wglSwapIntervalEXT" );- }-- if( _glfwPlatformExtensionSupported( "WGL_ARB_pixel_format" ) )- {- _glfwWin.has_WGL_ARB_pixel_format = GL_TRUE;- _glfwWin.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)- wglGetProcAddress( "wglGetPixelFormatAttribivARB" );- }-}---//========================================================================-// Registers the GLFW window class-//========================================================================--static ATOM registerWindowClass( void )-{- WNDCLASS wc;-- // Set window class parameters- wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw on...- wc.lpfnWndProc = (WNDPROC)windowProc; // Message handler- wc.cbClsExtra = 0; // No extra class data- wc.cbWndExtra = 0; // No extra window data- wc.hInstance = _glfwLibrary.instance; // Set instance- wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Load arrow pointer- wc.hbrBackground = NULL; // No background- wc.lpszMenuName = NULL; // No menu- wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name-- // Load user-provided icon if available- wc.hIcon = LoadIcon( _glfwLibrary.instance, "GLFW_ICON" );- if( !wc.hIcon )- {- // Load default icon- wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );- }-- return RegisterClass( &wc );-}---//========================================================================-// Returns the closest matching pixel format, or zero on error-//========================================================================--static int choosePixelFormat( const _GLFWfbconfig *fbconfig )-{- unsigned int fbcount;- int pixelFormat;- _GLFWfbconfig *fbconfigs;- const _GLFWfbconfig *closest;-- fbconfigs = getFBConfigs( &fbcount );- if( !fbconfigs )- {- fprintf( stderr, "Failed to find any usable GLFWFBConfigs\n" );- return 0;- }-- closest = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount );- if( !closest )- {- fprintf( stderr, "Failed to select a GLFWFBConfig from the alternatives\n" );- free( fbconfigs );- return 0;- }-- pixelFormat = (int) closest->platformID;-- free( fbconfigs );- fbconfigs = NULL;- closest = NULL;-- return pixelFormat;-}---//========================================================================-// Creates the GLFW window and rendering context-//========================================================================--static int createWindow( const _GLFWwndconfig *wndconfig,- const _GLFWfbconfig *fbconfig )-{- DWORD dwStyle, dwExStyle;- int pixelFormat, fullWidth, fullHeight;- RECT wa;- POINT pos;-- _glfwWin.DC = NULL;- _glfwWin.context = NULL;- _glfwWin.window = NULL;-- // Set common window styles- dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;- dwExStyle = WS_EX_APPWINDOW;-- // Set window style, depending on fullscreen mode- if( _glfwWin.fullscreen )- {- dwStyle |= WS_POPUP;-- // Here's a trick for helping us getting window focus- // (SetForegroundWindow doesn't work properly under- // Win98/ME/2K/.NET/+)- /*- if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 &&- _glfwLibrary.Sys.WinVer != _GLFW_WIN_NT4 &&- _glfwLibrary.Sys.WinVer != _GLFW_WIN_XP )- {- dwStyle |= WS_MINIMIZE;- }- */- }- else- {- dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;-- if( !wndconfig->windowNoResize )- {- dwStyle |= ( WS_MAXIMIZEBOX | WS_SIZEBOX );- dwExStyle |= WS_EX_WINDOWEDGE;- }- }-- // Remember window styles (used by getFullWindowSize)- _glfwWin.dwStyle = dwStyle;- _glfwWin.dwExStyle = dwExStyle;-- // Adjust window size for frame and title bar- getFullWindowSize( _glfwWin.width, _glfwWin.height, &fullWidth, &fullHeight );-- // Adjust window position to working area (e.g. if the task bar is at- // the top of the display). Fullscreen windows are always opened in- // the upper left corner regardless of the desktop working area.- if( _glfwWin.fullscreen )- {- wa.left = wa.top = 0;- }- else- {- SystemParametersInfo( SPI_GETWORKAREA, 0, &wa, 0 );- }-- _glfwWin.window = CreateWindowEx( _glfwWin.dwExStyle, // Extended style- _GLFW_WNDCLASSNAME, // Class name- "GLFW Window", // Window title- _glfwWin.dwStyle, // Defined window style- wa.left, wa.top, // Window position- fullWidth, // Decorated window width- fullHeight, // Decorated window height- NULL, // No parent window- NULL, // No menu- _glfwLibrary.instance, // Instance- NULL ); // Nothing to WM_CREATE-- if( !_glfwWin.window )- {- fprintf( stderr, "Unable to create Win32 window\n" );- return GL_FALSE;- }-- _glfwWin.DC = GetDC( _glfwWin.window );- if( !_glfwWin.DC )- {- fprintf( stderr, "Unable to retrieve GLFW window DC\n" );- return GL_FALSE;- }-- pixelFormat = choosePixelFormat( fbconfig );- if( !pixelFormat )- {- fprintf( stderr, "Unable to find a usable pixel format\n" );- return GL_FALSE;- }-- if( !createContext( _glfwWin.DC, wndconfig, pixelFormat ) )- {- fprintf( stderr, "Unable to create OpenGL context\n" );- return GL_FALSE;- }-- if( !wglMakeCurrent( _glfwWin.DC, _glfwWin.context ) )- {- fprintf( stderr, "Unable to make OpenGL context current\n" );- return GL_FALSE;- }-- initWGLExtensions();-- // Initialize mouse position data- GetCursorPos( &pos );- ScreenToClient( _glfwWin.window, &pos );- _glfwInput.OldMouseX = _glfwInput.MousePosX = pos.x;- _glfwInput.OldMouseY = _glfwInput.MousePosY = pos.y;-- return GL_TRUE;-}---//========================================================================-// Destroys the GLFW window and rendering context-//========================================================================--static void destroyWindow( void )-{- if( _glfwWin.context )- {- wglMakeCurrent( NULL, NULL );- wglDeleteContext( _glfwWin.context );- _glfwWin.context = NULL;- }-- if( _glfwWin.DC )- {- ReleaseDC( _glfwWin.window, _glfwWin.DC );- _glfwWin.DC = NULL;- }-- if( _glfwWin.window )- {- if( _glfwLibrary.Sys.winVer <= _GLFW_WIN_NT4 )- {- // Note: Hiding the window first fixes an annoying W98/NT4- // remaining icon bug for fullscreen displays- ShowWindow( _glfwWin.window, SW_HIDE );- }-- DestroyWindow( _glfwWin.window );- _glfwWin.window = NULL;- }-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Here is where the window is created, and the OpenGL rendering context is-// created-//========================================================================--int _glfwPlatformOpenWindow( int width, int height,- const _GLFWwndconfig *wndconfig,- const _GLFWfbconfig *fbconfig )-{- GLboolean recreateContext = GL_FALSE;-- // Clear platform specific GLFW window state- _glfwWin.classAtom = 0;- _glfwWin.oldMouseLockValid = GL_FALSE;-- _glfwWin.desiredRefreshRate = wndconfig->refreshRate;-- _glfwWin.classAtom = registerWindowClass();- if( !_glfwWin.classAtom )- {- fprintf( stderr, "Failed to register GLFW window class\n" );- return GL_FALSE;- }-- if( _glfwWin.fullscreen )- {- _glfwSetVideoMode( &_glfwWin.width, &_glfwWin.height,- fbconfig->redBits, fbconfig->greenBits, fbconfig->blueBits,- wndconfig->refreshRate );- }-- initWGLExtensions();-- if( !createWindow( wndconfig, fbconfig ) )- {- fprintf( stderr, "Failed to create GLFW window\n" );- return GL_FALSE;- }-- _glfwRefreshContextParams();-- if( fbconfig->samples > 0 )- {- // We want FSAA, but can we get it?- // FSAA is not a hard constraint, so otherwise we just don't care-- if( _glfwWin.has_WGL_ARB_multisample && _glfwWin.has_WGL_ARB_pixel_format )- {- // We appear to have both the FSAA extension and the means to ask for it- recreateContext = GL_TRUE;- }- }-- if( wndconfig->glMajor > 2 )- {- if ( wndconfig->glMajor != _glfwWin.glMajor ||- wndconfig->glMinor != _glfwWin.glMinor )- {- // We want a different OpenGL version, but can we get it?- // Otherwise, if we got a version greater than required, that's fine,- // whereas if we got a version lesser than required, it will be dealt- // with in glfwOpenWindow-- if( _glfwWin.has_WGL_ARB_create_context )- {- recreateContext = GL_TRUE;- }- }-- if( wndconfig->glForward )- {- if( !_glfwWin.has_WGL_ARB_create_context )- {- // Forward-compatibility is a hard constraint- return GL_FALSE;- }-- recreateContext = GL_TRUE;- }-- if( wndconfig->glProfile )- {- if( !_glfwWin.has_WGL_ARB_create_context_profile )- {- // Context profile is a hard constraint- return GL_FALSE;- }-- recreateContext = GL_TRUE;- }- }-- if( recreateContext )- {- // Some window hints require us to re-create the context using WGL- // extensions retrieved through the current context, as we cannot check- // for WGL extensions or retrieve WGL entry points before we have a- // current context (actually until we have implicitly loaded the ICD)-- // Yes, this is strange, and yes, this is the proper way on Win32-- // As Windows only allows you to set the pixel format once for a- // window, we need to destroy the current window and create a new one- // to be able to use the new pixel format-- // Technically, it may be possible to keep the old window around if- // we're just creating an OpenGL 3.0+ context with the same pixel- // format, but it's not worth the potential compatibility problems-- destroyWindow();-- if( !createWindow( wndconfig, fbconfig ) )- {- fprintf( stderr, "Unable to re-create GLFW window\n" );- return GL_FALSE;- }- }-- if( _glfwWin.fullscreen )- {- // Place the window above all topmost windows- SetWindowPos( _glfwWin.window, HWND_TOPMOST, 0,0,0,0,- SWP_NOMOVE | SWP_NOSIZE );- }-- setForegroundWindow( _glfwWin.window );- SetFocus( _glfwWin.window );-- return GL_TRUE;-}---//========================================================================-// Properly kill the window / video display-//========================================================================--void _glfwPlatformCloseWindow( void )-{- destroyWindow();-- if( _glfwWin.classAtom )- {- UnregisterClass( _GLFW_WNDCLASSNAME, _glfwLibrary.instance );- _glfwWin.classAtom = 0;- }-- if( _glfwWin.fullscreen )- {- // Restore original desktop resolution- ChangeDisplaySettings( NULL, CDS_FULLSCREEN );- }-}---//========================================================================-// Set the window title-//========================================================================--void _glfwPlatformSetWindowTitle( const char *title )-{- (void) SetWindowText( _glfwWin.window, title );-}---//========================================================================-// Set the window size.-//========================================================================--void _glfwPlatformSetWindowSize( int width, int height )-{- int bpp, mode = 0, refresh;- int sizechanged = GL_FALSE;- GLint drawbuffer;- GLfloat clearcolor[4];-- if( _glfwWin.fullscreen )- {- // Get some info about the current mode-- DEVMODE dm;-- // Get current BPP settings- dm.dmSize = sizeof( DEVMODE );- if( EnumDisplaySettings( NULL, _glfwWin.modeID, &dm ) )- {- // Get bpp- bpp = dm.dmBitsPerPel;-- // Get closest match for target video mode- refresh = _glfwWin.desiredRefreshRate;- mode = _glfwGetClosestVideoModeBPP( &width, &height, &bpp,- &refresh );- }- else- {- mode = _glfwWin.modeID;- }- }- else- {- // If we are in windowed mode, adjust the window size to- // compensate for window decorations- getFullWindowSize( width, height, &width, &height );- }-- // Change window size before changing fullscreen mode?- if( _glfwWin.fullscreen && (width > _glfwWin.width) )- {- SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height,- SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER );- sizechanged = GL_TRUE;- }-- // Change fullscreen video mode?- if( _glfwWin.fullscreen && mode != _glfwWin.modeID )- {- _glfwSetVideoModeMODE( mode );-- // Clear the front buffer to black (avoid ugly desktop remains in- // our OpenGL window)- glGetIntegerv( GL_DRAW_BUFFER, &drawbuffer );- glGetFloatv( GL_COLOR_CLEAR_VALUE, clearcolor );- glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );- glClear( GL_COLOR_BUFFER_BIT );- if( drawbuffer == GL_BACK )- {- _glfw_SwapBuffers( _glfwWin.DC );- }- glClearColor( clearcolor[0], clearcolor[1], clearcolor[2],- clearcolor[3] );- }-- // Set window size (if not already changed)- if( !sizechanged )- {- SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height,- SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER );- }-}---//========================================================================-// Set the window position-//========================================================================--void _glfwPlatformSetWindowPos( int x, int y )-{- (void) SetWindowPos( _glfwWin.window, HWND_TOP, x, y, 0, 0,- SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER );-}---//========================================================================-// Window iconification-//========================================================================--void _glfwPlatformIconifyWindow( void )-{- // Iconify window- ShowWindow( _glfwWin.window, SW_MINIMIZE );- _glfwWin.iconified = GL_TRUE;-- // If we are in fullscreen mode we need to change video modes- if( _glfwWin.fullscreen )- {- // Change display settings to the desktop resolution- ChangeDisplaySettings( NULL, CDS_FULLSCREEN );- }-- // Unlock mouse- if( !_glfwWin.oldMouseLockValid )- {- _glfwWin.oldMouseLock = _glfwWin.mouseLock;- _glfwWin.oldMouseLockValid = GL_TRUE;- glfwEnable( GLFW_MOUSE_CURSOR );- }-}---//========================================================================-// Window un-iconification-//========================================================================--void _glfwPlatformRestoreWindow( void )-{- // If we are in fullscreen mode we need to change video modes- if( _glfwWin.fullscreen )- {- // Change display settings to the user selected mode- _glfwSetVideoModeMODE( _glfwWin.modeID );- }-- // Un-iconify window- ShowWindow( _glfwWin.window, SW_RESTORE );-- // Make sure that our window ends up on top of things- ShowWindow( _glfwWin.window, SW_SHOW );- setForegroundWindow( _glfwWin.window );- SetFocus( _glfwWin.window );-- // Window is no longer iconified- _glfwWin.iconified = GL_FALSE;-- // Lock mouse, if necessary- if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock )- {- glfwDisable( GLFW_MOUSE_CURSOR );- }- _glfwWin.oldMouseLockValid = GL_FALSE;-}---//========================================================================-// Swap buffers (double-buffering)-//========================================================================--void _glfwPlatformSwapBuffers( void )-{- _glfw_SwapBuffers( _glfwWin.DC );-}---//========================================================================-// Set double buffering swap interval-//========================================================================--void _glfwPlatformSwapInterval( int interval )-{- if( _glfwWin.has_WGL_EXT_swap_control )- {- _glfwWin.SwapIntervalEXT( interval );- }-}---//========================================================================-// Write back window parameters into GLFW window structure-//========================================================================--void _glfwPlatformRefreshWindowParams( void )-{- PIXELFORMATDESCRIPTOR pfd;- DEVMODE dm;- int pixelFormat, mode;-- // Obtain a detailed description of current pixel format- pixelFormat = _glfw_GetPixelFormat( _glfwWin.DC );-- if( _glfwWin.has_WGL_ARB_pixel_format )- {- if( getPixelFormatAttrib( pixelFormat, WGL_ACCELERATION_ARB ) !=- WGL_NO_ACCELERATION_ARB )- {- _glfwWin.accelerated = GL_TRUE;- }- else- {- _glfwWin.accelerated = GL_FALSE;- }-- _glfwWin.redBits = getPixelFormatAttrib( pixelFormat, WGL_RED_BITS_ARB );- _glfwWin.greenBits = getPixelFormatAttrib( pixelFormat, WGL_GREEN_BITS_ARB );- _glfwWin.blueBits = getPixelFormatAttrib( pixelFormat, WGL_BLUE_BITS_ARB );-- _glfwWin.alphaBits = getPixelFormatAttrib( pixelFormat, WGL_ALPHA_BITS_ARB );- _glfwWin.depthBits = getPixelFormatAttrib( pixelFormat, WGL_DEPTH_BITS_ARB );- _glfwWin.stencilBits = getPixelFormatAttrib( pixelFormat, WGL_STENCIL_BITS_ARB );-- _glfwWin.accumRedBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_RED_BITS_ARB );- _glfwWin.accumGreenBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_GREEN_BITS_ARB );- _glfwWin.accumBlueBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_BLUE_BITS_ARB );- _glfwWin.accumAlphaBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_ALPHA_BITS_ARB );-- _glfwWin.auxBuffers = getPixelFormatAttrib( pixelFormat, WGL_AUX_BUFFERS_ARB );- _glfwWin.stereo = getPixelFormatAttrib( pixelFormat, WGL_STEREO_ARB ) ? GL_TRUE : GL_FALSE;-- if( _glfwWin.has_WGL_ARB_multisample )- {- _glfwWin.samples = getPixelFormatAttrib( pixelFormat, WGL_SAMPLES_ARB );- // Should we force 1 to 0 here for consistency, or keep 1 for transparency?- }- else- {- _glfwWin.samples = 0;- }- }- else- {- _glfw_DescribePixelFormat( _glfwWin.DC, pixelFormat,- sizeof(PIXELFORMATDESCRIPTOR), &pfd );-- // Is current OpenGL context accelerated?- _glfwWin.accelerated = (pfd.dwFlags & PFD_GENERIC_ACCELERATED) ||- !(pfd.dwFlags & PFD_GENERIC_FORMAT) ? 1 : 0;-- // "Standard" window parameters- _glfwWin.redBits = pfd.cRedBits;- _glfwWin.greenBits = pfd.cGreenBits;- _glfwWin.blueBits = pfd.cBlueBits;- _glfwWin.alphaBits = pfd.cAlphaBits;- _glfwWin.depthBits = pfd.cDepthBits;- _glfwWin.stencilBits = pfd.cStencilBits;- _glfwWin.accumRedBits = pfd.cAccumRedBits;- _glfwWin.accumGreenBits = pfd.cAccumGreenBits;- _glfwWin.accumBlueBits = pfd.cAccumBlueBits;- _glfwWin.accumAlphaBits = pfd.cAccumAlphaBits;- _glfwWin.auxBuffers = pfd.cAuxBuffers;- _glfwWin.stereo = (pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE;-- // If we don't have WGL_ARB_pixel_format then we can't have created a- // multisampling context, so it's safe to hardcode zero here- _glfwWin.samples = 0;- }-- // Get refresh rate- mode = _glfwWin.fullscreen ? _glfwWin.modeID : ENUM_CURRENT_SETTINGS;- dm.dmSize = sizeof( DEVMODE );-- if( EnumDisplaySettings( NULL, mode, &dm ) )- {- _glfwWin.refreshRate = dm.dmDisplayFrequency;- if( _glfwWin.refreshRate <= 1 )- {- _glfwWin.refreshRate = 0;- }- }- else- {- _glfwWin.refreshRate = 0;- }-}---//========================================================================-// Poll for new window and input events-//========================================================================--void _glfwPlatformPollEvents( void )-{- MSG msg;- int winclosed = GL_FALSE;-- // Flag: mouse was not moved (will be changed by _glfwGetNextEvent if- // there was a mouse move event)- _glfwInput.MouseMoved = GL_FALSE;- if( _glfwWin.mouseLock )- {- _glfwInput.OldMouseX = _glfwWin.width/2;- _glfwInput.OldMouseY = _glfwWin.height/2;- }- else- {- _glfwInput.OldMouseX = _glfwInput.MousePosX;- _glfwInput.OldMouseY = _glfwInput.MousePosY;- }-- // Check for new window messages- while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )- {- switch( msg.message )- {- // QUIT-message (from close window)?- case WM_QUIT:- winclosed = GL_TRUE;- break;-- // Ok, send it to the window message handler- default:- DispatchMessage( &msg );- break;- }- }-- // LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)- // This is the only async event handling in GLFW, but it solves some- // nasty problems.- // Caveat: Does not work under Win 9x/ME.- if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )- {- int lshift_down, rshift_down;-- // Get current state of left and right shift keys- lshift_down = (GetAsyncKeyState( VK_LSHIFT ) >> 15) & 1;- rshift_down = (GetAsyncKeyState( VK_RSHIFT ) >> 15) & 1;-- // See if this differs from our belief of what has happened- // (we only have to check for lost key up events)- if( !lshift_down && _glfwInput.Key[ GLFW_KEY_LSHIFT ] == 1 )- {- _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE );- }- if( !rshift_down && _glfwInput.Key[ GLFW_KEY_RSHIFT ] == 1 )- {- _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE );- }- }-- // Did we have mouse movement in locked cursor mode?- if( _glfwInput.MouseMoved && _glfwWin.mouseLock )- {- _glfwPlatformSetMouseCursorPos( _glfwWin.width / 2,- _glfwWin.height / 2 );- }-- // Was there a window close request?- if( winclosed && _glfwWin.windowCloseCallback )- {- // Check if the program wants us to close the window- winclosed = _glfwWin.windowCloseCallback();- }- if( winclosed )- {- glfwCloseWindow();- }-}---//========================================================================-// Wait for new window and input events-//========================================================================--void _glfwPlatformWaitEvents( void )-{- WaitMessage();-- _glfwPlatformPollEvents();-}---//========================================================================-// Hide mouse cursor (lock it)-//========================================================================--void _glfwPlatformHideMouseCursor( void )-{- RECT ClipWindowRect;-- ShowCursor( FALSE );-- // Clip cursor to the window- if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) )- {- ClipCursor( &ClipWindowRect );- }-- // Capture cursor to user window- SetCapture( _glfwWin.window );-}---//========================================================================-// Show mouse cursor (unlock it)-//========================================================================--void _glfwPlatformShowMouseCursor( void )-{- // Un-capture cursor- ReleaseCapture();-- // Release the cursor from the window- ClipCursor( NULL );-- ShowCursor( TRUE );-}---//========================================================================-// Set physical mouse cursor position-//========================================================================--void _glfwPlatformSetMouseCursorPos( int x, int y )-{- POINT pos;-- // Convert client coordinates to screen coordinates- pos.x = x;- pos.y = y;- ClientToScreen( _glfwWin.window, &pos );-- SetCursorPos( pos.x, pos.y );-}-
− glfw/lib/window.c
@@ -1,1005 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: Any-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <limits.h>---#ifndef GL_VERSION_3_2--#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001-#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002-#define GL_CONTEXT_PROFILE_MASK 0x9126--#endif /*GL_VERSION_3_2*/----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--static int Max(int a, int b)-{- return (a > b) ? a : b;-}--//========================================================================-// Clear all open window hints-//========================================================================--void _glfwClearWindowHints( void )-{- memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) );- _glfwLibrary.hints.glMajor = 1;-}---//========================================================================-// Handle the input tracking part of window deactivation-//========================================================================--void _glfwInputDeactivation( void )-{- int i;-- // Release all keyboard keys- for( i = 0; i <= GLFW_KEY_LAST; i ++ )- {- if( _glfwInput.Key[ i ] == GLFW_PRESS )- {- _glfwInputKey( i, GLFW_RELEASE );- }- }-- // Release all mouse buttons- for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )- {- if( _glfwInput.MouseButton[ i ] == GLFW_PRESS )- {- _glfwInputMouseClick( i, GLFW_RELEASE );- }- }-}---//========================================================================-// Clear all input state-//========================================================================--void _glfwClearInput( void )-{- int i;-- // Release all keyboard keys- for( i = 0; i <= GLFW_KEY_LAST; i ++ )- {- _glfwInput.Key[ i ] = GLFW_RELEASE;- }-- // Clear last character- _glfwInput.LastChar = 0;-- // Release all mouse buttons- for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )- {- _glfwInput.MouseButton[ i ] = GLFW_RELEASE;- }-- // Set mouse position to (0,0)- _glfwInput.MousePosX = 0;- _glfwInput.MousePosY = 0;-- // Set mouse wheel position to 0- _glfwInput.WheelPos = 0;-- // The default is to use non sticky keys and mouse buttons- _glfwInput.StickyKeys = GL_FALSE;- _glfwInput.StickyMouseButtons = GL_FALSE;-- // The default is to disable key repeat- _glfwInput.KeyRepeat = GL_FALSE;-}---//========================================================================-// Register keyboard activity-//========================================================================--void _glfwInputKey( int key, int action )-{- int keyrepeat = 0;-- if( key < 0 || key > GLFW_KEY_LAST )- {- return;- }-- // Are we trying to release an already released key?- if( action == GLFW_RELEASE && _glfwInput.Key[ key ] != GLFW_PRESS )- {- return;- }-- // Register key action- if( action == GLFW_RELEASE && _glfwInput.StickyKeys )- {- _glfwInput.Key[ key ] = GLFW_STICK;- }- else- {- keyrepeat = (_glfwInput.Key[ key ] == GLFW_PRESS) &&- (action == GLFW_PRESS);- _glfwInput.Key[ key ] = (char) action;- }-- // Call user callback function- if( _glfwWin.keyCallback && (_glfwInput.KeyRepeat || !keyrepeat) )- {- _glfwWin.keyCallback( key, action );- }-}---//========================================================================-// Register (keyboard) character activity-//========================================================================--void _glfwInputChar( int character, int action )-{- int keyrepeat = 0;-- // Valid Unicode (ISO 10646) character?- if( !( (character >= 32 && character <= 126) || character >= 160 ) )- {- return;- }-- // Is this a key repeat?- if( action == GLFW_PRESS && _glfwInput.LastChar == character )- {- keyrepeat = 1;- }-- // Store this character as last character (or clear it, if released)- if( action == GLFW_PRESS )- {- _glfwInput.LastChar = character;- }- else- {- _glfwInput.LastChar = 0;- }-- if( action != GLFW_PRESS )- {- // This intentionally breaks release notifications for Unicode- // characters, partly to see if anyone cares but mostly because it's- // a nonsensical concept to begin with- //- // It will remain broken either until its removal in the 3.0 API or- // until someone explains, in a way that makes sense to people outside- // the US and Scandinavia, what "Unicode character up" actually means- //- // If what you want is "physical key up" then you should be using the- // key functions and/or the key callback, NOT the Unicode input- //- // However, if your particular application uses this misfeature for...- // something, you can re-enable it by removing this if-statement- return;- }-- if( _glfwWin.charCallback && (_glfwInput.KeyRepeat || !keyrepeat) )- {- _glfwWin.charCallback( character, action );- }-}---//========================================================================-// Register mouse button clicks-//========================================================================--void _glfwInputMouseClick( int button, int action )-{- if( button >= 0 && button <= GLFW_MOUSE_BUTTON_LAST )- {- // Register mouse button action- if( action == GLFW_RELEASE && _glfwInput.StickyMouseButtons )- {- _glfwInput.MouseButton[ button ] = GLFW_STICK;- }- else- {- _glfwInput.MouseButton[ button ] = (char) action;- }-- // Call user callback function- if( _glfwWin.mouseButtonCallback )- {- _glfwWin.mouseButtonCallback( button, action );- }- }-}---//========================================================================-// Return the available framebuffer config closest to the desired values-// This is based on the manual GLX Visual selection from 2.6-//========================================================================--const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired,- const _GLFWfbconfig *alternatives,- unsigned int count )-{- unsigned int i;- unsigned int missing, leastMissing = UINT_MAX;- unsigned int colorDiff, leastColorDiff = UINT_MAX;- unsigned int extraDiff, leastExtraDiff = UINT_MAX;- const _GLFWfbconfig *current;- const _GLFWfbconfig *closest = NULL;-- for( i = 0; i < count; i++ )- {- current = alternatives + i;-- if( desired->stereo > 0 && current->stereo == 0 )- {- // Stereo is a hard constraint- continue;- }-- // Count number of missing buffers- {- missing = 0;-- if( desired->alphaBits > 0 && current->alphaBits == 0 )- {- missing++;- }-- if( desired->depthBits > 0 && current->depthBits == 0 )- {- missing++;- }-- if( desired->stencilBits > 0 && current->stencilBits == 0 )- {- missing++;- }-- if( desired->auxBuffers > 0 && current->auxBuffers < desired->auxBuffers )- {- missing += desired->auxBuffers - current->auxBuffers;- }-- if( desired->samples > 0 && current->samples == 0 )- {- // Technically, several multisampling buffers could be- // involved, but that's a lower level implementation detail and- // not important to us here, so we count them as one- missing++;- }- }-- // These polynomials make many small channel size differences matter- // less than one large channel size difference-- // Calculate color channel size difference value- {- colorDiff = 0;-- if ( desired->redBits > 0 )- {- colorDiff += ( desired->redBits - current->redBits ) *- ( desired->redBits - current->redBits );- }-- if ( desired->greenBits > 0 )- {- colorDiff += ( desired->greenBits - current->greenBits ) *- ( desired->greenBits - current->greenBits );- }-- if ( desired->blueBits > 0 )- {- colorDiff += ( desired->blueBits - current->blueBits ) *- ( desired->blueBits - current->blueBits );- }- }-- // Calculate non-color channel size difference value- {- extraDiff = 0;-- if( desired->alphaBits > 0 )- {- extraDiff += ( desired->alphaBits - current->alphaBits ) *- ( desired->alphaBits - current->alphaBits );- }-- if( desired->depthBits > 0 )- {- extraDiff += ( desired->depthBits - current->depthBits ) *- ( desired->depthBits - current->depthBits );- }-- if( desired->stencilBits > 0 )- {- extraDiff += ( desired->stencilBits - current->stencilBits ) *- ( desired->stencilBits - current->stencilBits );- }-- if( desired->accumRedBits > 0 )- {- extraDiff += ( desired->accumRedBits - current->accumRedBits ) *- ( desired->accumRedBits - current->accumRedBits );- }-- if( desired->accumGreenBits > 0 )- {- extraDiff += ( desired->accumGreenBits - current->accumGreenBits ) *- ( desired->accumGreenBits - current->accumGreenBits );- }-- if( desired->accumBlueBits > 0 )- {- extraDiff += ( desired->accumBlueBits - current->accumBlueBits ) *- ( desired->accumBlueBits - current->accumBlueBits );- }-- if( desired->accumAlphaBits > 0 )- {- extraDiff += ( desired->accumAlphaBits - current->accumAlphaBits ) *- ( desired->accumAlphaBits - current->accumAlphaBits );- }-- if( desired->samples > 0 )- {- extraDiff += ( desired->samples - current->samples ) *- ( desired->samples - current->samples );- }- }-- // Figure out if the current one is better than the best one found so far-- if( missing < leastMissing )- {- closest = current;- }- else if( missing == leastMissing )- {- if( ( colorDiff < leastColorDiff ) ||- ( colorDiff == leastColorDiff && extraDiff < leastExtraDiff ) )- {- closest = current;- }- }-- if( current == closest )- {- leastMissing = missing;- leastColorDiff = colorDiff;- leastExtraDiff = extraDiff;- }- }-- return closest;-}---//************************************************************************-//**** GLFW user functions ****-//************************************************************************--//========================================================================-// Create the GLFW window and its associated context-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height,- int redbits, int greenbits, int bluebits, int alphabits,- int depthbits, int stencilbits, int mode )-{- _GLFWfbconfig fbconfig;- _GLFWwndconfig wndconfig;-- if( !_glfwInitialized || _glfwWin.opened )- {- return GL_FALSE;- }-- // Set up desired framebuffer config- fbconfig.redBits = Max( redbits, 0 );- fbconfig.greenBits = Max( greenbits, 0 );- fbconfig.blueBits = Max( bluebits, 0 );- fbconfig.alphaBits = Max( alphabits, 0 );- fbconfig.depthBits = Max( depthbits, 0 );- fbconfig.stencilBits = Max( stencilbits, 0 );- fbconfig.accumRedBits = Max( _glfwLibrary.hints.accumRedBits, 0 );- fbconfig.accumGreenBits = Max( _glfwLibrary.hints.accumGreenBits, 0 );- fbconfig.accumBlueBits = Max( _glfwLibrary.hints.accumBlueBits, 0 );- fbconfig.accumAlphaBits = Max( _glfwLibrary.hints.accumAlphaBits, 0 );- fbconfig.auxBuffers = Max( _glfwLibrary.hints.auxBuffers, 0 );- fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE;- fbconfig.samples = Max( _glfwLibrary.hints.samples, 0 );-- // Set up desired window config- wndconfig.mode = mode;- wndconfig.refreshRate = Max( _glfwLibrary.hints.refreshRate, 0 );- wndconfig.windowNoResize = _glfwLibrary.hints.windowNoResize ? GL_TRUE : GL_FALSE;- wndconfig.glMajor = Max( _glfwLibrary.hints.glMajor, 1 );- wndconfig.glMinor = Max( _glfwLibrary.hints.glMinor, 0 );- wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;- wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE;- wndconfig.glProfile = _glfwLibrary.hints.glProfile;-- if( wndconfig.glMajor == 1 && wndconfig.glMinor > 5 )- {- // OpenGL 1.x series ended with version 1.5- return GL_FALSE;- }- else if( wndconfig.glMajor == 2 && wndconfig.glMinor > 1 )- {- // OpenGL 2.x series ended with version 2.1- return GL_FALSE;- }- else if( wndconfig.glMajor == 3 && wndconfig.glMinor > 3 )- {- // OpenGL 3.x series ended with version 3.3- return GL_FALSE;- }- else- {- // For now, let everything else through- }-- if( wndconfig.glProfile &&- ( wndconfig.glMajor < 3 || ( wndconfig.glMajor == 3 && wndconfig.glMinor < 2 ) ) )- {- // Context profiles are only defined for OpenGL version 3.2 and above- return GL_FALSE;- }-- if( wndconfig.glForward && wndconfig.glMajor < 3 )- {- // Forward-compatible contexts are only defined for OpenGL version 3.0 and above- return GL_FALSE;- }-- // Clear for next open call- _glfwClearWindowHints();-- // Check input arguments- if( mode != GLFW_WINDOW && mode != GLFW_FULLSCREEN )- {- return GL_FALSE;- }-- // Clear GLFW window state- _glfwWin.active = GL_TRUE;- _glfwWin.iconified = GL_FALSE;- _glfwWin.mouseLock = GL_FALSE;- _glfwWin.autoPollEvents = GL_TRUE;- _glfwClearInput();-- // Unregister all callback functions- _glfwWin.windowSizeCallback = NULL;- _glfwWin.windowCloseCallback = NULL;- _glfwWin.windowRefreshCallback = NULL;- _glfwWin.keyCallback = NULL;- _glfwWin.charCallback = NULL;- _glfwWin.mousePosCallback = NULL;- _glfwWin.mouseButtonCallback = NULL;- _glfwWin.mouseWheelCallback = NULL;-- // Check width & height- if( width > 0 && height <= 0 )- {- // Set the window aspect ratio to 4:3- height = (width * 3) / 4;- }- else if( width <= 0 && height > 0 )- {- // Set the window aspect ratio to 4:3- width = (height * 4) / 3;- }- else if( width <= 0 && height <= 0 )- {- // Default window size- width = 640;- height = 480;- }-- // Remember window settings- _glfwWin.width = width;- _glfwWin.height = height;- _glfwWin.fullscreen = (mode == GLFW_FULLSCREEN ? GL_TRUE : GL_FALSE);-- // Platform specific window opening routine- if( !_glfwPlatformOpenWindow( width, height, &wndconfig, &fbconfig ) )- {- glfwCloseWindow();- return GL_FALSE;- }-- // Flag that window is now opened- _glfwWin.opened = GL_TRUE;-- // Read back window and context parameters- _glfwPlatformRefreshWindowParams();- _glfwRefreshContextParams();-- if( _glfwWin.glMajor < wndconfig.glMajor ||- ( _glfwWin.glMajor == wndconfig.glMajor &&- _glfwWin.glMinor < wndconfig.glMinor ) )- {- glfwCloseWindow();- return GL_FALSE;- }-- // Do we have non-power-of-two textures (added to core in version 2.0)?- _glfwWin.has_GL_ARB_texture_non_power_of_two =- ( _glfwWin.glMajor >= 2 ) ||- glfwExtensionSupported( "GL_ARB_texture_non_power_of_two" );-- // Do we have automatic mipmap generation (added to core in version 1.4)?- _glfwWin.has_GL_SGIS_generate_mipmap =- ( _glfwWin.glMajor >= 2 ) || ( _glfwWin.glMinor >= 4 ) ||- glfwExtensionSupported( "GL_SGIS_generate_mipmap" );-- if( _glfwWin.glMajor > 2 )- {- _glfwWin.GetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress( "glGetStringi" );- if( !_glfwWin.GetStringi )- {- // This is a very common problem among people who compile GLFW- // on X11/GLX using custom build systems, as it needs explicit- // configuration in order to work- //- // See readme.html section 2.2 for details-- glfwCloseWindow();- return GL_FALSE;- }- }-- // If full-screen mode was requested, disable mouse cursor- if( mode == GLFW_FULLSCREEN )- {- glfwDisable( GLFW_MOUSE_CURSOR );- }-- // Start by clearing the front buffer to black (avoid ugly desktop- // remains in our OpenGL window)- glClear( GL_COLOR_BUFFER_BIT );- _glfwPlatformSwapBuffers();-- return GL_TRUE;-}---//========================================================================-// Set hints for opening the window-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint )-{- if( !_glfwInitialized )- {- return;- }-- switch( target )- {- case GLFW_REFRESH_RATE:- _glfwLibrary.hints.refreshRate = hint;- break;- case GLFW_ACCUM_RED_BITS:- _glfwLibrary.hints.accumRedBits = hint;- break;- case GLFW_ACCUM_GREEN_BITS:- _glfwLibrary.hints.accumGreenBits = hint;- break;- case GLFW_ACCUM_BLUE_BITS:- _glfwLibrary.hints.accumBlueBits = hint;- break;- case GLFW_ACCUM_ALPHA_BITS:- _glfwLibrary.hints.accumAlphaBits = hint;- break;- case GLFW_AUX_BUFFERS:- _glfwLibrary.hints.auxBuffers = hint;- break;- case GLFW_STEREO:- _glfwLibrary.hints.stereo = hint;- break;- case GLFW_WINDOW_NO_RESIZE:- _glfwLibrary.hints.windowNoResize = hint;- break;- case GLFW_FSAA_SAMPLES:- _glfwLibrary.hints.samples = hint;- break;- case GLFW_OPENGL_VERSION_MAJOR:- _glfwLibrary.hints.glMajor = hint;- break;- case GLFW_OPENGL_VERSION_MINOR:- _glfwLibrary.hints.glMinor = hint;- break;- case GLFW_OPENGL_FORWARD_COMPAT:- _glfwLibrary.hints.glForward = hint;- break;- case GLFW_OPENGL_DEBUG_CONTEXT:- _glfwLibrary.hints.glDebug = hint;- break;- case GLFW_OPENGL_PROFILE:- _glfwLibrary.hints.glProfile = hint;- break;- default:- break;- }-}---//========================================================================-// Properly kill the window / video display-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void )-{- if( !_glfwInitialized )- {- return;- }-- // Show mouse pointer again (if hidden)- glfwEnable( GLFW_MOUSE_CURSOR );-- _glfwPlatformCloseWindow();-- memset( &_glfwWin, 0, sizeof(_glfwWin) );-}---//========================================================================-// Set the window title-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set window title- _glfwPlatformSetWindowTitle( title );-}---//========================================================================-// Get the window size-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- if( width != NULL )- {- *width = _glfwWin.width;- }- if( height != NULL )- {- *height = _glfwWin.height;- }-}---//========================================================================-// Set the window size-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height )-{- if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified )- {- return;- }-- // Don't do anything if the window size did not change- if( width == _glfwWin.width && height == _glfwWin.height )- {- return;- }-- // Change window size- _glfwPlatformSetWindowSize( width, height );-- // Refresh window parameters (may have changed due to changed video- // modes)- _glfwPlatformRefreshWindowParams();-}---//========================================================================-// Set the window position-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y )-{- if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.fullscreen ||- _glfwWin.iconified )- {- return;- }-- // Set window position- _glfwPlatformSetWindowPos( x, y );-}---//========================================================================-// Window iconification-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void )-{- if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified )- {- return;- }-- // Iconify window- _glfwPlatformIconifyWindow();-}---//========================================================================-// Window un-iconification-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void )-{- if( !_glfwInitialized || !_glfwWin.opened || !_glfwWin.iconified )- {- return;- }-- // Restore iconified window- _glfwPlatformRestoreWindow();-- // Refresh window parameters- _glfwPlatformRefreshWindowParams();-}---//========================================================================-// Swap buffers (double-buffering) and poll any new events-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- _glfwPlatformSwapBuffers();-- // Check for window messages- if( _glfwWin.autoPollEvents )- {- glfwPollEvents();- }-}---//========================================================================-// Set double buffering swap interval (0 = vsync off)-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set double buffering swap interval- _glfwPlatformSwapInterval( interval );-}---//========================================================================-// Get window parameter-//========================================================================--GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param )-{- if( !_glfwInitialized )- {- return 0;- }-- // Is the window opened?- if( !_glfwWin.opened )- {- if( param == GLFW_OPENED )- {- return GL_FALSE;- }- return 0;- }-- // Window parameters- switch( param )- {- case GLFW_OPENED:- return GL_TRUE;- case GLFW_ACTIVE:- return _glfwWin.active;- case GLFW_ICONIFIED:- return _glfwWin.iconified;- case GLFW_ACCELERATED:- return _glfwWin.accelerated;- case GLFW_RED_BITS:- return _glfwWin.redBits;- case GLFW_GREEN_BITS:- return _glfwWin.greenBits;- case GLFW_BLUE_BITS:- return _glfwWin.blueBits;- case GLFW_ALPHA_BITS:- return _glfwWin.alphaBits;- case GLFW_DEPTH_BITS:- return _glfwWin.depthBits;- case GLFW_STENCIL_BITS:- return _glfwWin.stencilBits;- case GLFW_ACCUM_RED_BITS:- return _glfwWin.accumRedBits;- case GLFW_ACCUM_GREEN_BITS:- return _glfwWin.accumGreenBits;- case GLFW_ACCUM_BLUE_BITS:- return _glfwWin.accumBlueBits;- case GLFW_ACCUM_ALPHA_BITS:- return _glfwWin.accumAlphaBits;- case GLFW_AUX_BUFFERS:- return _glfwWin.auxBuffers;- case GLFW_STEREO:- return _glfwWin.stereo;- case GLFW_REFRESH_RATE:- return _glfwWin.refreshRate;- case GLFW_WINDOW_NO_RESIZE:- return _glfwWin.windowNoResize;- case GLFW_FSAA_SAMPLES:- return _glfwWin.samples;- case GLFW_OPENGL_VERSION_MAJOR:- return _glfwWin.glMajor;- case GLFW_OPENGL_VERSION_MINOR:- return _glfwWin.glMinor;- case GLFW_OPENGL_FORWARD_COMPAT:- return _glfwWin.glForward;- case GLFW_OPENGL_DEBUG_CONTEXT:- return _glfwWin.glDebug;- case GLFW_OPENGL_PROFILE:- return _glfwWin.glProfile;- default:- return 0;- }-}---//========================================================================-// Set callback function for window size changes-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.windowSizeCallback = cbfun;-- // Call the callback function to let the application know the current- // window size- if( cbfun )- {- cbfun( _glfwWin.width, _glfwWin.height );- }-}--//========================================================================-// Set callback function for window close events-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.windowCloseCallback = cbfun;-}---//========================================================================-// Set callback function for window refresh events-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Set callback function- _glfwWin.windowRefreshCallback = cbfun;-}---//========================================================================-// Poll for new window and input events-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwPollEvents( void )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Poll for new events- _glfwPlatformPollEvents();-}---//========================================================================-// Wait for new window and input events-//========================================================================--GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void )-{- if( !_glfwInitialized || !_glfwWin.opened )- {- return;- }-- // Poll for new events- _glfwPlatformWaitEvents();-}-
− glfw/lib/x11/platform.h
@@ -1,503 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#ifndef _platform_h_-#define _platform_h_---// This is the X11 version of GLFW-#define _GLFW_X11---// Include files-#include <sys/time.h>-#include <unistd.h>-#include <signal.h>-#include <X11/Xlib.h>-#include <X11/keysym.h>-#include <X11/Xatom.h>-#include <GL/glx.h>-#include "../../include/GL/glfw.h"--// Do we have pthread support?-#ifdef _GLFW_HAS_PTHREAD- #include <pthread.h>- #include <sched.h>-#endif--// We need declarations for GLX version 1.3 or above even if the server doesn't-// support version 1.3-#ifndef GLX_VERSION_1_3- #error "GLX header version 1.3 or above is required"-#endif--#if defined( _GLFW_HAS_XF86VIDMODE ) && defined( _GLFW_HAS_XRANDR )- #error "Xf86VidMode and RandR extensions cannot both be enabled"-#endif--// With XFree86, we can use the XF86VidMode extension-#if defined( _GLFW_HAS_XF86VIDMODE )- #include <X11/extensions/xf86vmode.h>-#endif--#if defined( _GLFW_HAS_XRANDR )- #include <X11/extensions/Xrandr.h>-#endif--// Do we have support for dlopen/dlsym?-#if defined( _GLFW_HAS_DLOPEN )- #include <dlfcn.h>-#endif--// We support two different ways for getting the number of processors in-// the system: sysconf (POSIX) and sysctl (BSD?)-#if defined( _GLFW_HAS_SYSCONF )-- // Use a single constant for querying number of online processors using- // the sysconf function (e.g. SGI defines _SC_NPROC_ONLN instead of- // _SC_NPROCESSORS_ONLN)- #ifndef _SC_NPROCESSORS_ONLN- #ifdef _SC_NPROC_ONLN- #define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN- #else- #error POSIX constant _SC_NPROCESSORS_ONLN not defined!- #endif- #endif-- // Macro for querying the number of processors- #define _glfw_numprocessors(n) n=(int)sysconf(_SC_NPROCESSORS_ONLN)--#elif defined( _GLFW_HAS_SYSCTL )-- #include <sys/types.h>- #include <sys/sysctl.h>-- // Macro for querying the number of processors- #define _glfw_numprocessors(n) { \- int mib[2], ncpu; \- size_t len = 1; \- mib[0] = CTL_HW; \- mib[1] = HW_NCPU; \- n = 1; \- if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \- { \- if( len > 0 ) \- { \- n = ncpu; \- } \- } \- }--#else-- // If neither sysconf nor sysctl is supported, assume single processor- // system- #define _glfw_numprocessors(n) n=1--#endif--// Pointer length integer-// One day, this will most likely move into glfw.h-typedef intptr_t GLFWintptr;---#ifndef GLX_SGI_swap_control--// Function signature for GLX_SGI_swap_control-typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);--#endif /*GLX_SGI_swap_control*/---#ifndef GLX_SGIX_fbconfig--/* Type definitions for GLX_SGIX_fbconfig */-typedef XID GLXFBConfigIDSGIX;-typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;--/* Function signatures for GLX_SGIX_fbconfig */-typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);-typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements);-typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);-typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config);--/* Tokens for GLX_SGIX_fbconfig */-#define GLX_WINDOW_BIT_SGIX 0x00000001-#define GLX_PIXMAP_BIT_SGIX 0x00000002-#define GLX_RGBA_BIT_SGIX 0x00000001-#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002-#define GLX_DRAWABLE_TYPE_SGIX 0x8010-#define GLX_RENDER_TYPE_SGIX 0x8011-#define GLX_X_RENDERABLE_SGIX 0x8012-#define GLX_FBCONFIG_ID_SGIX 0x8013-#define GLX_RGBA_TYPE_SGIX 0x8014-#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015-#define GLX_SCREEN_EXT 0x800C--#endif /*GLX_SGIX_fbconfig*/---#ifndef GLX_ARB_create_context--/* Tokens for glXCreateContextAttribsARB attributes */-#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091-#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092-#define GLX_CONTEXT_FLAGS_ARB 0x2094--/* Bits for WGL_CONTEXT_FLAGS_ARB */-#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002--/* Prototype for glXCreateContextAttribs */-typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)( Display *display, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);--#endif /*GLX_ARB_create_context*/---#ifndef GLX_ARB_create_context_profile--/* Tokens for glXCreateContextAttribsARB attributes */-#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126--/* BIts for GLX_CONTEXT_PROFILE_MASK_ARB */-#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001-#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002--#endif /*GLX_ARB_create_context_profile*/---#ifndef GL_VERSION_3_0--typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);--#endif /*GL_VERSION_3_0*/----//========================================================================-// Global variables (GLFW internals)-//========================================================================--//-------------------------------------------------------------------------// Window structure-//-------------------------------------------------------------------------typedef struct _GLFWwin_struct _GLFWwin;--struct _GLFWwin_struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // User callback functions- GLFWwindowsizefun windowSizeCallback;- GLFWwindowclosefun windowCloseCallback;- GLFWwindowrefreshfun windowRefreshCallback;- GLFWmousebuttonfun mouseButtonCallback;- GLFWmouseposfun mousePosCallback;- GLFWmousewheelfun mouseWheelCallback;- GLFWkeyfun keyCallback;- GLFWcharfun charCallback;-- // User selected window settings- int fullscreen; // Fullscreen flag- int mouseLock; // Mouse-lock flag- int autoPollEvents; // Auto polling flag- int sysKeysDisabled; // System keys disabled flag- int windowNoResize; // Resize- and maximize gadgets disabled flag- int refreshRate; // Vertical monitor refresh rate-- // Window status & parameters- int opened; // Flag telling if window is opened or not- int active; // Application active flag- int iconified; // Window iconified flag- int width, height; // Window width and heigth- int accelerated; // GL_TRUE if window is HW accelerated-- // Framebuffer attributes- int redBits;- int greenBits;- int blueBits;- int alphaBits;- int depthBits;- int stencilBits;- int accumRedBits;- int accumGreenBits;- int accumBlueBits;- int accumAlphaBits;- int auxBuffers;- int stereo;- int samples;-- // OpenGL extensions and context attributes- int has_GL_SGIS_generate_mipmap;- int has_GL_ARB_texture_non_power_of_two;- int glMajor, glMinor, glRevision;- int glForward, glDebug, glProfile;-- PFNGLGETSTRINGIPROC GetStringi;---// ========= PLATFORM SPECIFIC PART ======================================-- // Platform specific window resources- Colormap colormap; // Window colormap- Window window; // Window- Window root; // Root window for screen- int screen; // Screen ID- XVisualInfo *visual; // Visual for selected GLXFBConfig- GLXFBConfigID fbconfigID; // ID of selected GLXFBConfig- GLXContext context; // OpenGL rendering context- Atom wmDeleteWindow; // WM_DELETE_WINDOW atom- Atom wmPing; // _NET_WM_PING atom- Atom wmState; // _NET_WM_STATE atom- Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom- Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom- Cursor cursor; // Invisible cursor for hidden cursor-- // GLX extensions- PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI;- PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX;- PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX;- PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX;- PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX;- PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;- GLboolean has_GLX_SGIX_fbconfig;- GLboolean has_GLX_SGI_swap_control;- GLboolean has_GLX_ARB_multisample;- GLboolean has_GLX_ARB_create_context;- GLboolean has_GLX_ARB_create_context_profile;-- // Various platform specific internal variables- GLboolean hasEWMH; // True if window manager supports EWMH- GLboolean overrideRedirect; // True if window is OverrideRedirect- GLboolean keyboardGrabbed; // True if keyboard is currently grabbed- GLboolean pointerGrabbed; // True if pointer is currently grabbed- GLboolean pointerHidden; // True if pointer is currently hidden-- // Screensaver data- struct {- int changed;- int timeout;- int interval;- int blanking;- int exposure;- } Saver;-- // Fullscreen data- struct {- int modeChanged;-#if defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeInfo oldMode;-#endif-#if defined( _GLFW_HAS_XRANDR )- SizeID oldSizeID;- int oldWidth;- int oldHeight;- Rotation oldRotation;-#endif- } FS;-};--GLFWGLOBAL _GLFWwin _glfwWin;---//-------------------------------------------------------------------------// User input status (most of this should go in _GLFWwin)-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Mouse status- int MousePosX, MousePosY;- int WheelPos;- char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];-- // Keyboard status- char Key[ GLFW_KEY_LAST+1 ];- int LastChar;-- // User selected settings- int StickyKeys;- int StickyMouseButtons;- int KeyRepeat;---// ========= PLATFORM SPECIFIC PART ======================================-- // Platform specific internal variables- int MouseMoved, CursorPosX, CursorPosY;--} _glfwInput;---//-------------------------------------------------------------------------// Library global data-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Window opening hints- _GLFWhints hints;--// ========= PLATFORM SPECIFIC PART ======================================-- Display *display;-- // Server-side GLX version- int glxMajor, glxMinor;-- struct {- int available;- int eventBase;- int errorBase;- } XF86VidMode;-- struct {- int available;- int eventBase;- int errorBase;- } XRandR;-- // Timer data- struct {- double resolution;- long long t0;- } Timer;--#if defined(_GLFW_HAS_DLOPEN)- struct {- void *libGL; // dlopen handle for libGL.so- } Libs;-#endif-} _glfwLibrary;---//-------------------------------------------------------------------------// Thread record (one for each thread)-//-------------------------------------------------------------------------typedef struct _GLFWthread_struct _GLFWthread;--struct _GLFWthread_struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Pointer to previous and next threads in linked list- _GLFWthread *Previous, *Next;-- // GLFW user side thread information- GLFWthread ID;- GLFWthreadfun Function;--// ========= PLATFORM SPECIFIC PART ======================================-- // System side thread information-#ifdef _GLFW_HAS_PTHREAD- pthread_t PosixID;-#endif--};---//-------------------------------------------------------------------------// General thread information-//-------------------------------------------------------------------------GLFWGLOBAL struct {--// ========= PLATFORM INDEPENDENT MANDATORY PART =========================-- // Next thread ID to use (increments for every created thread)- GLFWthread NextID;-- // First thread in linked list (always the main thread)- _GLFWthread First;--// ========= PLATFORM SPECIFIC PART ======================================-- // Critical section lock-#ifdef _GLFW_HAS_PTHREAD- pthread_mutex_t CriticalSection;-#endif--} _glfwThrd;---//-------------------------------------------------------------------------// Joystick information & state-//-------------------------------------------------------------------------GLFWGLOBAL struct {- int Present;- int fd;- int NumAxes;- int NumButtons;- float *Axis;- unsigned char *Button;-} _glfwJoy[ GLFW_JOYSTICK_LAST + 1 ];---//========================================================================-// Macros for encapsulating critical code sections (i.e. making parts-// of GLFW thread safe)-//========================================================================--// Thread list management-#ifdef _GLFW_HAS_PTHREAD- #define ENTER_THREAD_CRITICAL_SECTION \- pthread_mutex_lock( &_glfwThrd.CriticalSection );- #define LEAVE_THREAD_CRITICAL_SECTION \- pthread_mutex_unlock( &_glfwThrd.CriticalSection );-#else- #define ENTER_THREAD_CRITICAL_SECTION- #define LEAVE_THREAD_CRITICAL_SECTION-#endif---//========================================================================-// Prototypes for platform specific internal functions-//========================================================================--// Time-void _glfwInitTimer( void );--// Fullscreen support-int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate );-void _glfwSetVideoModeMODE( int screen, int mode, int rate );-void _glfwSetVideoMode( int screen, int *width, int *height, int *rate );-void _glfwRestoreVideoMode( void );--// Joystick input-void _glfwInitJoysticks( void );-void _glfwTerminateJoysticks( void );--// Unicode support-long _glfwKeySym2Unicode( KeySym keysym );---#endif // _platform_h_
− glfw/lib/x11/x11_enable.c
@@ -1,64 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11 (Unix)-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Enable system keys-//========================================================================--void _glfwPlatformEnableSystemKeys( void )-{- if( _glfwWin.keyboardGrabbed )- {- XUngrabKeyboard( _glfwLibrary.display, CurrentTime );- _glfwWin.keyboardGrabbed = GL_FALSE;- }-}--//========================================================================-// Disable system keys-//========================================================================--void _glfwPlatformDisableSystemKeys( void )-{- if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True,- GrabModeAsync, GrabModeAsync, CurrentTime ) ==- GrabSuccess )- {- _glfwWin.keyboardGrabbed = GL_TRUE;- }-}-
− glfw/lib/x11/x11_fullscreen.c
@@ -1,569 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <limits.h>---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Convert BPP to RGB bits (based on "best guess")-//========================================================================--static void BPP2RGB( int bpp, int *r, int *g, int *b )-{- int delta;-- // Special case: BPP = 32 (I don't think this is necessary for X11??)- if( bpp == 32 )- bpp = 24;-- // Convert "bits per pixel" to red, green & blue sizes- *r = *g = *b = bpp / 3;- delta = bpp - (*r * 3);- if( delta >= 1 )- {- *g = *g + 1;- }- if( delta == 2 )- {- *r = *r + 1;- }-}---//========================================================================-// Finds the video mode closest in size to the specified desired size-//========================================================================--int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate )-{-#if defined( _GLFW_HAS_XRANDR )- int i, match, bestmatch;- int sizecount, bestsize;- int ratecount, bestrate;- short *ratelist;- XRRScreenConfiguration *sc;- XRRScreenSize *sizelist;-- if( _glfwLibrary.XRandR.available )- {- sc = XRRGetScreenInfo( _glfwLibrary.display,- RootWindow( _glfwLibrary.display, screen ) );-- sizelist = XRRConfigSizes( sc, &sizecount );-- // Find the best matching mode- bestsize = -1;- bestmatch = INT_MAX;- for( i = 0; i < sizecount; i++ )- {- match = (*width - sizelist[i].width) *- (*width - sizelist[i].width) +- (*height - sizelist[i].height) *- (*height - sizelist[i].height);- if( match < bestmatch )- {- bestmatch = match;- bestsize = i;- }- }-- if( bestsize != -1 )- {- // Report width & height of best matching mode- *width = sizelist[bestsize].width;- *height = sizelist[bestsize].height;-- if( *rate > 0 )- {- ratelist = XRRConfigRates( sc, bestsize, &ratecount );-- bestrate = -1;- bestmatch = INT_MAX;- for( i = 0; i < ratecount; i++ )- {- match = abs( ratelist[i] - *rate );- if( match < bestmatch )- {- bestmatch = match;- bestrate = ratelist[i];- }- }-- if( bestrate != -1 )- {- *rate = bestrate;- }- }- }-- // Free modelist- XRRFreeScreenConfigInfo( sc );-- if( bestsize != -1 )- {- return bestsize;- }- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeInfo **modelist;- int modecount, i, bestmode, bestmatch, match;-- // Use the XF86VidMode extension to control video resolution- if( _glfwLibrary.XF86VidMode.available )- {- // Get a list of all available display modes- XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,- &modecount, &modelist );-- // Find the best matching mode- bestmode = -1;- bestmatch = INT_MAX;- for( i = 0; i < modecount; i++ )- {- match = (*width - modelist[i]->hdisplay) *- (*width - modelist[i]->hdisplay) +- (*height - modelist[i]->vdisplay) *- (*height - modelist[i]->vdisplay);- if( match < bestmatch )- {- bestmatch = match;- bestmode = i;- }- }-- if( bestmode != -1 )- {- // Report width & height of best matching mode- *width = modelist[ bestmode ]->hdisplay;- *height = modelist[ bestmode ]->vdisplay;- }-- // Free modelist- XFree( modelist );-- if( bestmode != -1 )- {- return bestmode;- }- }-#endif-- // Default: Simply use the screen resolution- *width = DisplayWidth( _glfwLibrary.display, screen );- *height = DisplayHeight( _glfwLibrary.display, screen );-- return 0;-}---//========================================================================-// Change the current video mode-//========================================================================--void _glfwSetVideoModeMODE( int screen, int mode, int rate )-{-#if defined( _GLFW_HAS_XRANDR )- XRRScreenConfiguration *sc;- Window root;-- if( _glfwLibrary.XRandR.available )- {- root = RootWindow( _glfwLibrary.display, screen );- sc = XRRGetScreenInfo( _glfwLibrary.display, root );-- // Remember old size and flag that we have changed the mode- if( !_glfwWin.FS.modeChanged )- {- _glfwWin.FS.oldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.oldRotation );- _glfwWin.FS.oldWidth = DisplayWidth( _glfwLibrary.display, screen );- _glfwWin.FS.oldHeight = DisplayHeight( _glfwLibrary.display, screen );-- _glfwWin.FS.modeChanged = GL_TRUE;- }-- if( rate > 0 )- {- // Set desired configuration- XRRSetScreenConfigAndRate( _glfwLibrary.display,- sc,- root,- mode,- RR_Rotate_0,- (short) rate,- CurrentTime );- }- else- {- // Set desired configuration- XRRSetScreenConfig( _glfwLibrary.display,- sc,- root,- mode,- RR_Rotate_0,- CurrentTime );- }-- XRRFreeScreenConfigInfo( sc );- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeInfo **modelist;- int modecount;-- // Use the XF86VidMode extension to control video resolution- if( _glfwLibrary.XF86VidMode.available )- {- // Get a list of all available display modes- XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,- &modecount, &modelist );-- // Unlock mode switch if necessary- if( _glfwWin.FS.modeChanged )- {- XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 0 );- }-- // Change the video mode to the desired mode- XF86VidModeSwitchToMode( _glfwLibrary.display, screen,- modelist[ mode ] );-- // Set viewport to upper left corner (where our window will be)- XF86VidModeSetViewPort( _glfwLibrary.display, screen, 0, 0 );-- // Lock mode switch- XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 1 );-- // Remember old mode and flag that we have changed the mode- if( !_glfwWin.FS.modeChanged )- {- _glfwWin.FS.oldMode = *modelist[ 0 ];- _glfwWin.FS.modeChanged = GL_TRUE;- }-- // Free mode list- XFree( modelist );- }-#endif-}---//========================================================================-// Change the current video mode-//========================================================================--void _glfwSetVideoMode( int screen, int *width, int *height, int *rate )-{- int bestmode;-- // Find a best match mode- bestmode = _glfwGetClosestVideoMode( screen, width, height, rate );-- // Change mode- _glfwSetVideoModeMODE( screen, bestmode, *rate );-}---//========================================================================-// Restore the previously saved (original) video mode-//========================================================================--void _glfwRestoreVideoMode( void )-{- if( _glfwWin.FS.modeChanged )- {-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- XRRScreenConfiguration *sc;-- sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root );-- XRRSetScreenConfig( _glfwLibrary.display,- sc,- _glfwWin.root,- _glfwWin.FS.oldSizeID,- _glfwWin.FS.oldRotation,- CurrentTime );-- XRRFreeScreenConfigInfo( sc );- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- if( _glfwLibrary.XF86VidMode.available )- {- // Unlock mode switch- XF86VidModeLockModeSwitch( _glfwLibrary.display, _glfwWin.screen, 0 );-- // Change the video mode back to the old mode- XF86VidModeSwitchToMode( _glfwLibrary.display,- _glfwWin.screen,- &_glfwWin.FS.oldMode );- }-#endif- _glfwWin.FS.modeChanged = GL_FALSE;- }-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--struct _glfwResolution-{- int width;- int height;-};--//========================================================================-// List available video modes-//========================================================================--int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )-{- int count, k, l, r, g, b, rgba, gl;- int depth, screen;- Display *dpy;- XVisualInfo *vislist, dummy;- int viscount, rgbcount, rescount;- int *rgbarray;- struct _glfwResolution *resarray;-#if defined( _GLFW_HAS_XRANDR )- XRRScreenConfiguration *sc;- XRRScreenSize *sizelist;- int sizecount;-#elif defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeInfo **modelist;- int modecount, width, height;-#endif-- // Get display and screen- dpy = _glfwLibrary.display;- screen = DefaultScreen( dpy );-- // Get list of visuals- vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount );- if( vislist == NULL )- {- return 0;- }-- rgbarray = (int*) malloc( sizeof(int) * viscount );- rgbcount = 0;-- // Build RGB array- for( k = 0; k < viscount; k++ )- {- // Does the visual support OpenGL & true color?- glXGetConfig( dpy, &vislist[k], GLX_USE_GL, &gl );- glXGetConfig( dpy, &vislist[k], GLX_RGBA, &rgba );- if( gl && rgba )- {- // Get color depth for this visual- depth = vislist[k].depth;-- // Convert to RGB- BPP2RGB( depth, &r, &g, &b );- depth = (r<<16) | (g<<8) | b;-- // Is this mode unique?- for( l = 0; l < rgbcount; l++ )- {- if( depth == rgbarray[ l ] )- {- break;- }- }- if( l >= rgbcount )- {- rgbarray[ rgbcount ] = depth;- rgbcount++;- }- }- }-- rescount = 0;- resarray = NULL;-- // Build resolution array-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) );- sizelist = XRRConfigSizes( sc, &sizecount );-- resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount );-- for( k = 0; k < sizecount; k++ )- {- resarray[ rescount ].width = sizelist[ k ].width;- resarray[ rescount ].height = sizelist[ k ].height;- rescount++;- }-- XRRFreeScreenConfigInfo( sc );- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- if( _glfwLibrary.XF86VidMode.available )- {- XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist );-- resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount );-- for( k = 0; k < modecount; k++ )- {- width = modelist[ k ]->hdisplay;- height = modelist[ k ]->vdisplay;-- // Is this mode unique?- for( l = 0; l < rescount; l++ )- {- if( width == resarray[ l ].width && height == resarray[ l ].height )- {- break;- }- }-- if( l >= rescount )- {- resarray[ rescount ].width = width;- resarray[ rescount ].height = height;- rescount++;- }- }-- XFree( modelist );- }-#endif-- if( !resarray )- {- rescount = 1;- resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount );-- resarray[ 0 ].width = DisplayWidth( dpy, screen );- resarray[ 0 ].height = DisplayHeight( dpy, screen );- }-- // Build permutations of colors and resolutions- count = 0;- for( k = 0; k < rgbcount && count < maxcount; k++ )- {- for( l = 0; l < rescount && count < maxcount; l++ )- {- list[count].Width = resarray[ l ].width;- list[count].Height = resarray[ l ].height;- list[count].RedBits = (rgbarray[ k ] >> 16) & 255;- list[count].GreenBits = (rgbarray[ k ] >> 8) & 255;- list[count].BlueBits = rgbarray[ k ] & 255;- count++;- }- }-- // Free visuals list- XFree( vislist );-- free( resarray );- free( rgbarray );-- return count;-}---//========================================================================-// Get the desktop video mode-//========================================================================--void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )-{- Display *dpy;- int bpp, screen;-#if defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeInfo **modelist;- int modecount;-#endif-- // Get display and screen- dpy = _glfwLibrary.display;- screen = DefaultScreen( dpy );-- // Get display depth- bpp = DefaultDepth( dpy, screen );-- // Convert BPP to RGB bits- BPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );--#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- if( _glfwWin.FS.modeChanged )- {- mode->Width = _glfwWin.FS.oldWidth;- mode->Height = _glfwWin.FS.oldHeight;- return;- }- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- if( _glfwLibrary.XF86VidMode.available )- {- if( _glfwWin.FS.modeChanged )- {- // The old (desktop) mode is stored in _glfwWin.FS.oldMode- mode->Width = _glfwWin.FS.oldMode.hdisplay;- mode->Height = _glfwWin.FS.oldMode.vdisplay;- }- else- {- // Use the XF86VidMode extension to get list of video modes- XF86VidModeGetAllModeLines( dpy, screen, &modecount,- &modelist );-- // The first mode in the list is the current (desktio) mode- mode->Width = modelist[ 0 ]->hdisplay;- mode->Height = modelist[ 0 ]->vdisplay;-- // Free list- XFree( modelist );- }-- return;- }-#endif-- // Get current display width and height- mode->Width = DisplayWidth( dpy, screen );- mode->Height = DisplayHeight( dpy, screen );-}-
− glfw/lib/x11/x11_glext.c
@@ -1,89 +0,0 @@-//==================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---void (*glXGetProcAddress(const GLubyte *procName))();-void (*glXGetProcAddressARB(const GLubyte *procName))();-void (*glXGetProcAddressEXT(const GLubyte *procName))();--// We support four different ways for getting addresses for GL/GLX-// extension functions: glXGetProcAddress, glXGetProcAddressARB,-// glXGetProcAddressEXT, and dlsym-#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB )- #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x)-#elif defined( _GLFW_HAS_GLXGETPROCADDRESS )- #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x)-#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT )- #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x)-#elif defined( _GLFW_HAS_DLOPEN )- #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.Libs.libGL,x)-#else-#define _glfw_glXGetProcAddress(x) NULL-#endif---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Check if an OpenGL extension is available at runtime-//========================================================================--int _glfwPlatformExtensionSupported( const char *extension )-{- const GLubyte *extensions;-- // Get list of GLX extensions- extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.display,- _glfwWin.screen );- if( extensions != NULL )- {- if( _glfwStringInExtensionString( extension, extensions ) )- {- return GL_TRUE;- }- }-- return GL_FALSE;-}---//========================================================================-// Get the function pointer to an OpenGL function-//========================================================================--void * _glfwPlatformGetProcAddress( const char *procname )-{- return (void *) _glfw_glXGetProcAddress( (const GLubyte *) procname );-}-
− glfw/lib/x11/x11_init.c
@@ -1,286 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Initialize GLFW thread package-//========================================================================--static void initThreads( void )-{- // Initialize critical section handle-#ifdef _GLFW_HAS_PTHREAD- (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );-#endif-- // The first thread (the main thread) has ID 0- _glfwThrd.NextID = 0;-- // Fill out information about the main thread (this thread)- _glfwThrd.First.ID = _glfwThrd.NextID++;- _glfwThrd.First.Function = NULL;- _glfwThrd.First.Previous = NULL;- _glfwThrd.First.Next = NULL;-#ifdef _GLFW_HAS_PTHREAD- _glfwThrd.First.PosixID = pthread_self();-#endif-}---//========================================================================-// Terminate GLFW thread package-//========================================================================--static void terminateThreads( void )-{-#ifdef _GLFW_HAS_PTHREAD-- _GLFWthread *t, *t_next;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO- // DIE, _BEFORE_ CALLING glfwTerminate()!!!)- t = _glfwThrd.First.Next;- while( t != NULL )- {- // Get pointer to next thread- t_next = t->Next;-- // Simply murder the process, no mercy!- pthread_kill( t->PosixID, SIGKILL );-- // Free memory allocated for this thread- free( (void *) t );-- // Select next thread in list- t = t_next;- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Delete critical section handle- pthread_mutex_destroy( &_glfwThrd.CriticalSection );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Dynamically load libraries-//========================================================================--static void initLibraries( void )-{-#ifdef _GLFW_DLOPEN_LIBGL- int i;- char *libGL_names[ ] =- {- "libGL.so",- "libGL.so.1",- "/usr/lib/libGL.so",- "/usr/lib/libGL.so.1",- NULL- };-- _glfwLibrary.Libs.libGL = NULL;- for( i = 0; !libGL_names[ i ] != NULL; i ++ )- {- _glfwLibrary.Libs.libGL = dlopen( libGL_names[ i ],- RTLD_LAZY | RTLD_GLOBAL );- if( _glfwLibrary.Libs.libGL )- break;- }-#endif-}---//========================================================================-// Terminate GLFW when exiting application-//========================================================================--static void glfw_atexit( void )-{- glfwTerminate();-}---//========================================================================-// Initialize X11 display-//========================================================================--static int initDisplay( void )-{- // Open display- _glfwLibrary.display = XOpenDisplay( 0 );- if( !_glfwLibrary.display )- {- fprintf(stderr, "Failed to open X display\n");- return GL_FALSE;- }-- // Check for XF86VidMode extension-#ifdef _GLFW_HAS_XF86VIDMODE- _glfwLibrary.XF86VidMode.available =- XF86VidModeQueryExtension( _glfwLibrary.display,- &_glfwLibrary.XF86VidMode.eventBase,- &_glfwLibrary.XF86VidMode.errorBase);-#else- _glfwLibrary.XF86VidMode.available = 0;-#endif-- // Check for XRandR extension-#ifdef _GLFW_HAS_XRANDR- _glfwLibrary.XRandR.available =- XRRQueryExtension( _glfwLibrary.display,- &_glfwLibrary.XRandR.eventBase,- &_glfwLibrary.XRandR.errorBase );-#else- _glfwLibrary.XRandR.available = 0;-#endif-- // Fullscreen & screen saver settings- // Check if GLX is supported on this display- if( !glXQueryExtension( _glfwLibrary.display, NULL, NULL ) )- {- fprintf(stderr, "GLX not supported\n");- return GL_FALSE;- }-- // Retrieve GLX version- if( !glXQueryVersion( _glfwLibrary.display,- &_glfwLibrary.glxMajor,- &_glfwLibrary.glxMinor ) )- {- fprintf(stderr, "Unable to query GLX version\n");- return GL_FALSE;- }-- return GL_TRUE;-}---//========================================================================-// Terminate X11 display-//========================================================================--static void terminateDisplay( void )-{- // Open display- if( _glfwLibrary.display )- {- XCloseDisplay( _glfwLibrary.display );- _glfwLibrary.display = NULL;- }-}---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Initialize various GLFW state-//========================================================================--int _glfwPlatformInit( void )-{- // Initialize display- if( !initDisplay() )- {- return GL_FALSE;- }-- // Initialize thread package- initThreads();-- // Try to load libGL.so if necessary- initLibraries();-- // Install atexit() routine- atexit( glfw_atexit );-- // Initialize joysticks- _glfwInitJoysticks();-- // Start the timer- _glfwInitTimer();-- return GL_TRUE;-}---//========================================================================-// Close window and kill all threads-//========================================================================--int _glfwPlatformTerminate( void )-{-#ifdef _GLFW_HAS_PTHREAD- // Only the main thread is allowed to do this...- if( pthread_self() != _glfwThrd.First.PosixID )- {- return GL_FALSE;- }-#endif // _GLFW_HAS_PTHREAD-- // Close OpenGL window- glfwCloseWindow();-- // Kill thread package- terminateThreads();-- // Terminate display- terminateDisplay();-- // Terminate joysticks- _glfwTerminateJoysticks();-- // Unload libGL.so if necessary-#ifdef _GLFW_DLOPEN_LIBGL- if( _glfwLibrary.Libs.libGL != NULL )- {- dlclose( _glfwLibrary.Libs.libGL );- _glfwLibrary.Libs.libGL = NULL;- }-#endif-- return GL_TRUE;-}-
− glfw/lib/x11/x11_joystick.c
@@ -1,367 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//========================================================================-// Note: Only Linux joystick input is supported at the moment. Other-// systems will behave as if there are no joysticks connected.-//========================================================================---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--#ifdef _GLFW_USE_LINUX_JOYSTICKS--//-------------------------------------------------------------------------// Here are the Linux joystick driver v1.x interface definitions that we-// use (we do not want to rely on <linux/joystick.h>):-//--------------------------------------------------------------------------#include <sys/ioctl.h>-#include <fcntl.h>-#include <errno.h>--// Joystick event types-#define JS_EVENT_BUTTON 0x01 /* button pressed/released */-#define JS_EVENT_AXIS 0x02 /* joystick moved */-#define JS_EVENT_INIT 0x80 /* initial state of device */--// Joystick event structure-struct js_event {- unsigned int time; /* (u32) event timestamp in milliseconds */- signed short value; /* (s16) value */- unsigned char type; /* (u8) event type */- unsigned char number; /* (u8) axis/button number */-};--// Joystick IOCTL commands-#define JSIOCGVERSION _IOR('j', 0x01, int) /* get driver version (u32) */-#define JSIOCGAXES _IOR('j', 0x11, char) /* get number of axes (u8) */-#define JSIOCGBUTTONS _IOR('j', 0x12, char) /* get number of buttons (u8) */--#endif // _GLFW_USE_LINUX_JOYSTICKS---//========================================================================-// Initialize joystick interface-//========================================================================--void _glfwInitJoysticks( void )-{-#ifdef _GLFW_USE_LINUX_JOYSTICKS- int k, n, fd, joy_count;- char *joy_base_name, joy_dev_name[ 20 ];- int driver_version = 0x000800;- char ret_data;-#endif // _GLFW_USE_LINUX_JOYSTICKS- int i;-- // Start by saying that there are no sticks- for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )- {- _glfwJoy[ i ].Present = GL_FALSE;- }--#ifdef _GLFW_USE_LINUX_JOYSTICKS-- // Try to open joysticks (nonblocking)- joy_count = 0;- for( k = 0; k <= 1 && joy_count <= GLFW_JOYSTICK_LAST; ++ k )- {- // Pick joystick base name- switch( k )- {- case 0:- joy_base_name = "/dev/input/js"; // USB sticks- break;- case 1:- joy_base_name = "/dev/js"; // "Legacy" sticks- break;- default:- continue; // (should never happen)- }-- // Try to open a few of these sticks- for( i = 0; i <= 50 && joy_count <= GLFW_JOYSTICK_LAST; ++ i )- {- sprintf( joy_dev_name, "%s%d", joy_base_name, i );- fd = open( joy_dev_name, O_NONBLOCK );- if( fd != -1 )- {- // Remember fd- _glfwJoy[ joy_count ].fd = fd;-- // Check that the joystick driver version is 1.0+- ioctl( fd, JSIOCGVERSION, &driver_version );- if( driver_version < 0x010000 )- {- // It's an old 0.x interface (we don't support it)- close( fd );- continue;- }-- // Get number of joystick axes- ioctl( fd, JSIOCGAXES, &ret_data );- _glfwJoy[ joy_count ].NumAxes = (int) ret_data;-- // Get number of joystick buttons- ioctl( fd, JSIOCGBUTTONS, &ret_data );- _glfwJoy[ joy_count ].NumButtons = (int) ret_data;-- // Allocate memory for joystick state- _glfwJoy[ joy_count ].Axis =- (float *) malloc( sizeof(float) *- _glfwJoy[ joy_count ].NumAxes );- if( _glfwJoy[ joy_count ].Axis == NULL )- {- close( fd );- continue;- }- _glfwJoy[ joy_count ].Button =- (unsigned char *) malloc( sizeof(char) *- _glfwJoy[ joy_count ].NumButtons );- if( _glfwJoy[ joy_count ].Button == NULL )- {- free( _glfwJoy[ joy_count ].Axis );- close( fd );- continue;- }-- // Clear joystick state- for( n = 0; n < _glfwJoy[ joy_count ].NumAxes; ++ n )- {- _glfwJoy[ joy_count ].Axis[ n ] = 0.0f;- }- for( n = 0; n < _glfwJoy[ joy_count ].NumButtons; ++ n )- {- _glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE;- }-- // The joystick is supported and connected- _glfwJoy[ joy_count ].Present = GL_TRUE;- joy_count ++;- }- }- }--#endif // _GLFW_USE_LINUX_JOYSTICKS--}---//========================================================================-// Close all opened joystick handles-//========================================================================--void _glfwTerminateJoysticks( void )-{--#ifdef _GLFW_USE_LINUX_JOYSTICKS-- int i;-- // Close any opened joysticks- for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )- {- if( _glfwJoy[ i ].Present )- {- close( _glfwJoy[ i ].fd );- free( _glfwJoy[ i ].Axis );- free( _glfwJoy[ i ].Button );- _glfwJoy[ i ].Present = GL_FALSE;- }- }--#endif // _GLFW_USE_LINUX_JOYSTICKS--}---//========================================================================-// Empty joystick event queue-//========================================================================--static void pollJoystickEvents( void )-{--#ifdef _GLFW_USE_LINUX_JOYSTICKS-- struct js_event e;- int i;-- // Get joystick events for all GLFW joysticks- for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )- {- // Is the stick present?- if( _glfwJoy[ i ].Present )- {- // Read all queued events (non-blocking)- while( read(_glfwJoy[i].fd, &e, sizeof(struct js_event)) > 0 )- {- // We don't care if it's an init event or not- e.type &= ~JS_EVENT_INIT;-- // Check event type- switch( e.type )- {- case JS_EVENT_AXIS:- _glfwJoy[ i ].Axis[ e.number ] = (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 )- {- _glfwJoy[ i ].Axis[ e.number ] =- -_glfwJoy[ i ].Axis[ e.number ];- }- break;-- case JS_EVENT_BUTTON:- _glfwJoy[ i ].Button[ e.number ] =- e.value ? GLFW_PRESS : GLFW_RELEASE;- break;-- default:- break;- }- }- }- }--#endif // _GLFW_USE_LINUX_JOYSTICKS--}---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Determine joystick capabilities-//========================================================================--int _glfwPlatformGetJoystickParam( int joy, int param )-{- // Is joystick present?- if( !_glfwJoy[ joy ].Present )- {- return 0;- }-- switch( param )- {- case GLFW_PRESENT:- return GL_TRUE;-- case GLFW_AXES:- return _glfwJoy[ joy ].NumAxes;-- case GLFW_BUTTONS:- return _glfwJoy[ joy ].NumButtons;-- default:- break;- }-- return 0;-}---//========================================================================-// Get joystick axis positions-//========================================================================--int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )-{- int i;-- // Is joystick present?- if( !_glfwJoy[ joy ].Present )- {- return 0;- }-- // Update joystick state- pollJoystickEvents();-- // Does the joystick support less axes than requested?- if( _glfwJoy[ joy ].NumAxes < numaxes )- {- numaxes = _glfwJoy[ joy ].NumAxes;- }-- // Copy axis positions from internal state- for( i = 0; i < numaxes; ++ i )- {- pos[ i ] = _glfwJoy[ joy ].Axis[ i ];- }-- return numaxes;-}---//========================================================================-// Get joystick button states-//========================================================================--int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,- int numbuttons )-{- int i;-- // Is joystick present?- if( !_glfwJoy[ joy ].Present )- {- return 0;- }-- // Update joystick state- pollJoystickEvents();-- // Does the joystick support less buttons than requested?- if( _glfwJoy[ joy ].NumButtons < numbuttons )- {- numbuttons = _glfwJoy[ joy ].NumButtons;- }-- // Copy button states from internal state- for( i = 0; i < numbuttons; ++ i )- {- buttons[ i ] = _glfwJoy[ joy ].Button[ i ];- }-- return numbuttons;-}-
− glfw/lib/x11/x11_keysym2unicode.c
@@ -1,901 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---/*- * Marcus: This code was originally written by Markus G. Kuhn.- * I have made some slight changes (trimmed it down a bit from >60 KB to- * 20 KB), but the functionality is the same.- */--/*- * This module converts keysym values into the corresponding ISO 10646- * (UCS, Unicode) values.- *- * The array keysymtab[] contains pairs of X11 keysym values for graphical- * characters and the corresponding Unicode value. The function- * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary- * search, therefore keysymtab[] must remain SORTED by keysym value.- *- * We allow to represent any UCS character in the range U-00000000 to- * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.- * This admittedly does not cover the entire 31-bit space of UCS, but- * it does cover all of the characters up to U-10FFFF, which can be- * represented by UTF-16, and more, and it is very unlikely that higher- * UCS codes will ever be assigned by ISO. So to get Unicode character- * U+ABCD you can directly use keysym 0x0100abcd.- *- * Original author: Markus G. Kuhn <mkuhn@acm.org>, University of- * Cambridge, April 2001- *- * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing- * an initial draft of the mapping table.- *- */---//************************************************************************-//**** KeySym to Unicode mapping table ****-//************************************************************************--static struct codepair {- unsigned short keysym;- unsigned short ucs;-} keysymtab[] = {- { 0x01a1, 0x0104 },- { 0x01a2, 0x02d8 },- { 0x01a3, 0x0141 },- { 0x01a5, 0x013d },- { 0x01a6, 0x015a },- { 0x01a9, 0x0160 },- { 0x01aa, 0x015e },- { 0x01ab, 0x0164 },- { 0x01ac, 0x0179 },- { 0x01ae, 0x017d },- { 0x01af, 0x017b },- { 0x01b1, 0x0105 },- { 0x01b2, 0x02db },- { 0x01b3, 0x0142 },- { 0x01b5, 0x013e },- { 0x01b6, 0x015b },- { 0x01b7, 0x02c7 },- { 0x01b9, 0x0161 },- { 0x01ba, 0x015f },- { 0x01bb, 0x0165 },- { 0x01bc, 0x017a },- { 0x01bd, 0x02dd },- { 0x01be, 0x017e },- { 0x01bf, 0x017c },- { 0x01c0, 0x0154 },- { 0x01c3, 0x0102 },- { 0x01c5, 0x0139 },- { 0x01c6, 0x0106 },- { 0x01c8, 0x010c },- { 0x01ca, 0x0118 },- { 0x01cc, 0x011a },- { 0x01cf, 0x010e },- { 0x01d0, 0x0110 },- { 0x01d1, 0x0143 },- { 0x01d2, 0x0147 },- { 0x01d5, 0x0150 },- { 0x01d8, 0x0158 },- { 0x01d9, 0x016e },- { 0x01db, 0x0170 },- { 0x01de, 0x0162 },- { 0x01e0, 0x0155 },- { 0x01e3, 0x0103 },- { 0x01e5, 0x013a },- { 0x01e6, 0x0107 },- { 0x01e8, 0x010d },- { 0x01ea, 0x0119 },- { 0x01ec, 0x011b },- { 0x01ef, 0x010f },- { 0x01f0, 0x0111 },- { 0x01f1, 0x0144 },- { 0x01f2, 0x0148 },- { 0x01f5, 0x0151 },- { 0x01f8, 0x0159 },- { 0x01f9, 0x016f },- { 0x01fb, 0x0171 },- { 0x01fe, 0x0163 },- { 0x01ff, 0x02d9 },- { 0x02a1, 0x0126 },- { 0x02a6, 0x0124 },- { 0x02a9, 0x0130 },- { 0x02ab, 0x011e },- { 0x02ac, 0x0134 },- { 0x02b1, 0x0127 },- { 0x02b6, 0x0125 },- { 0x02b9, 0x0131 },- { 0x02bb, 0x011f },- { 0x02bc, 0x0135 },- { 0x02c5, 0x010a },- { 0x02c6, 0x0108 },- { 0x02d5, 0x0120 },- { 0x02d8, 0x011c },- { 0x02dd, 0x016c },- { 0x02de, 0x015c },- { 0x02e5, 0x010b },- { 0x02e6, 0x0109 },- { 0x02f5, 0x0121 },- { 0x02f8, 0x011d },- { 0x02fd, 0x016d },- { 0x02fe, 0x015d },- { 0x03a2, 0x0138 },- { 0x03a3, 0x0156 },- { 0x03a5, 0x0128 },- { 0x03a6, 0x013b },- { 0x03aa, 0x0112 },- { 0x03ab, 0x0122 },- { 0x03ac, 0x0166 },- { 0x03b3, 0x0157 },- { 0x03b5, 0x0129 },- { 0x03b6, 0x013c },- { 0x03ba, 0x0113 },- { 0x03bb, 0x0123 },- { 0x03bc, 0x0167 },- { 0x03bd, 0x014a },- { 0x03bf, 0x014b },- { 0x03c0, 0x0100 },- { 0x03c7, 0x012e },- { 0x03cc, 0x0116 },- { 0x03cf, 0x012a },- { 0x03d1, 0x0145 },- { 0x03d2, 0x014c },- { 0x03d3, 0x0136 },- { 0x03d9, 0x0172 },- { 0x03dd, 0x0168 },- { 0x03de, 0x016a },- { 0x03e0, 0x0101 },- { 0x03e7, 0x012f },- { 0x03ec, 0x0117 },- { 0x03ef, 0x012b },- { 0x03f1, 0x0146 },- { 0x03f2, 0x014d },- { 0x03f3, 0x0137 },- { 0x03f9, 0x0173 },- { 0x03fd, 0x0169 },- { 0x03fe, 0x016b },- { 0x047e, 0x203e },- { 0x04a1, 0x3002 },- { 0x04a2, 0x300c },- { 0x04a3, 0x300d },- { 0x04a4, 0x3001 },- { 0x04a5, 0x30fb },- { 0x04a6, 0x30f2 },- { 0x04a7, 0x30a1 },- { 0x04a8, 0x30a3 },- { 0x04a9, 0x30a5 },- { 0x04aa, 0x30a7 },- { 0x04ab, 0x30a9 },- { 0x04ac, 0x30e3 },- { 0x04ad, 0x30e5 },- { 0x04ae, 0x30e7 },- { 0x04af, 0x30c3 },- { 0x04b0, 0x30fc },- { 0x04b1, 0x30a2 },- { 0x04b2, 0x30a4 },- { 0x04b3, 0x30a6 },- { 0x04b4, 0x30a8 },- { 0x04b5, 0x30aa },- { 0x04b6, 0x30ab },- { 0x04b7, 0x30ad },- { 0x04b8, 0x30af },- { 0x04b9, 0x30b1 },- { 0x04ba, 0x30b3 },- { 0x04bb, 0x30b5 },- { 0x04bc, 0x30b7 },- { 0x04bd, 0x30b9 },- { 0x04be, 0x30bb },- { 0x04bf, 0x30bd },- { 0x04c0, 0x30bf },- { 0x04c1, 0x30c1 },- { 0x04c2, 0x30c4 },- { 0x04c3, 0x30c6 },- { 0x04c4, 0x30c8 },- { 0x04c5, 0x30ca },- { 0x04c6, 0x30cb },- { 0x04c7, 0x30cc },- { 0x04c8, 0x30cd },- { 0x04c9, 0x30ce },- { 0x04ca, 0x30cf },- { 0x04cb, 0x30d2 },- { 0x04cc, 0x30d5 },- { 0x04cd, 0x30d8 },- { 0x04ce, 0x30db },- { 0x04cf, 0x30de },- { 0x04d0, 0x30df },- { 0x04d1, 0x30e0 },- { 0x04d2, 0x30e1 },- { 0x04d3, 0x30e2 },- { 0x04d4, 0x30e4 },- { 0x04d5, 0x30e6 },- { 0x04d6, 0x30e8 },- { 0x04d7, 0x30e9 },- { 0x04d8, 0x30ea },- { 0x04d9, 0x30eb },- { 0x04da, 0x30ec },- { 0x04db, 0x30ed },- { 0x04dc, 0x30ef },- { 0x04dd, 0x30f3 },- { 0x04de, 0x309b },- { 0x04df, 0x309c },- { 0x05ac, 0x060c },- { 0x05bb, 0x061b },- { 0x05bf, 0x061f },- { 0x05c1, 0x0621 },- { 0x05c2, 0x0622 },- { 0x05c3, 0x0623 },- { 0x05c4, 0x0624 },- { 0x05c5, 0x0625 },- { 0x05c6, 0x0626 },- { 0x05c7, 0x0627 },- { 0x05c8, 0x0628 },- { 0x05c9, 0x0629 },- { 0x05ca, 0x062a },- { 0x05cb, 0x062b },- { 0x05cc, 0x062c },- { 0x05cd, 0x062d },- { 0x05ce, 0x062e },- { 0x05cf, 0x062f },- { 0x05d0, 0x0630 },- { 0x05d1, 0x0631 },- { 0x05d2, 0x0632 },- { 0x05d3, 0x0633 },- { 0x05d4, 0x0634 },- { 0x05d5, 0x0635 },- { 0x05d6, 0x0636 },- { 0x05d7, 0x0637 },- { 0x05d8, 0x0638 },- { 0x05d9, 0x0639 },- { 0x05da, 0x063a },- { 0x05e0, 0x0640 },- { 0x05e1, 0x0641 },- { 0x05e2, 0x0642 },- { 0x05e3, 0x0643 },- { 0x05e4, 0x0644 },- { 0x05e5, 0x0645 },- { 0x05e6, 0x0646 },- { 0x05e7, 0x0647 },- { 0x05e8, 0x0648 },- { 0x05e9, 0x0649 },- { 0x05ea, 0x064a },- { 0x05eb, 0x064b },- { 0x05ec, 0x064c },- { 0x05ed, 0x064d },- { 0x05ee, 0x064e },- { 0x05ef, 0x064f },- { 0x05f0, 0x0650 },- { 0x05f1, 0x0651 },- { 0x05f2, 0x0652 },- { 0x06a1, 0x0452 },- { 0x06a2, 0x0453 },- { 0x06a3, 0x0451 },- { 0x06a4, 0x0454 },- { 0x06a5, 0x0455 },- { 0x06a6, 0x0456 },- { 0x06a7, 0x0457 },- { 0x06a8, 0x0458 },- { 0x06a9, 0x0459 },- { 0x06aa, 0x045a },- { 0x06ab, 0x045b },- { 0x06ac, 0x045c },- { 0x06ae, 0x045e },- { 0x06af, 0x045f },- { 0x06b0, 0x2116 },- { 0x06b1, 0x0402 },- { 0x06b2, 0x0403 },- { 0x06b3, 0x0401 },- { 0x06b4, 0x0404 },- { 0x06b5, 0x0405 },- { 0x06b6, 0x0406 },- { 0x06b7, 0x0407 },- { 0x06b8, 0x0408 },- { 0x06b9, 0x0409 },- { 0x06ba, 0x040a },- { 0x06bb, 0x040b },- { 0x06bc, 0x040c },- { 0x06be, 0x040e },- { 0x06bf, 0x040f },- { 0x06c0, 0x044e },- { 0x06c1, 0x0430 },- { 0x06c2, 0x0431 },- { 0x06c3, 0x0446 },- { 0x06c4, 0x0434 },- { 0x06c5, 0x0435 },- { 0x06c6, 0x0444 },- { 0x06c7, 0x0433 },- { 0x06c8, 0x0445 },- { 0x06c9, 0x0438 },- { 0x06ca, 0x0439 },- { 0x06cb, 0x043a },- { 0x06cc, 0x043b },- { 0x06cd, 0x043c },- { 0x06ce, 0x043d },- { 0x06cf, 0x043e },- { 0x06d0, 0x043f },- { 0x06d1, 0x044f },- { 0x06d2, 0x0440 },- { 0x06d3, 0x0441 },- { 0x06d4, 0x0442 },- { 0x06d5, 0x0443 },- { 0x06d6, 0x0436 },- { 0x06d7, 0x0432 },- { 0x06d8, 0x044c },- { 0x06d9, 0x044b },- { 0x06da, 0x0437 },- { 0x06db, 0x0448 },- { 0x06dc, 0x044d },- { 0x06dd, 0x0449 },- { 0x06de, 0x0447 },- { 0x06df, 0x044a },- { 0x06e0, 0x042e },- { 0x06e1, 0x0410 },- { 0x06e2, 0x0411 },- { 0x06e3, 0x0426 },- { 0x06e4, 0x0414 },- { 0x06e5, 0x0415 },- { 0x06e6, 0x0424 },- { 0x06e7, 0x0413 },- { 0x06e8, 0x0425 },- { 0x06e9, 0x0418 },- { 0x06ea, 0x0419 },- { 0x06eb, 0x041a },- { 0x06ec, 0x041b },- { 0x06ed, 0x041c },- { 0x06ee, 0x041d },- { 0x06ef, 0x041e },- { 0x06f0, 0x041f },- { 0x06f1, 0x042f },- { 0x06f2, 0x0420 },- { 0x06f3, 0x0421 },- { 0x06f4, 0x0422 },- { 0x06f5, 0x0423 },- { 0x06f6, 0x0416 },- { 0x06f7, 0x0412 },- { 0x06f8, 0x042c },- { 0x06f9, 0x042b },- { 0x06fa, 0x0417 },- { 0x06fb, 0x0428 },- { 0x06fc, 0x042d },- { 0x06fd, 0x0429 },- { 0x06fe, 0x0427 },- { 0x06ff, 0x042a },- { 0x07a1, 0x0386 },- { 0x07a2, 0x0388 },- { 0x07a3, 0x0389 },- { 0x07a4, 0x038a },- { 0x07a5, 0x03aa },- { 0x07a7, 0x038c },- { 0x07a8, 0x038e },- { 0x07a9, 0x03ab },- { 0x07ab, 0x038f },- { 0x07ae, 0x0385 },- { 0x07af, 0x2015 },- { 0x07b1, 0x03ac },- { 0x07b2, 0x03ad },- { 0x07b3, 0x03ae },- { 0x07b4, 0x03af },- { 0x07b5, 0x03ca },- { 0x07b6, 0x0390 },- { 0x07b7, 0x03cc },- { 0x07b8, 0x03cd },- { 0x07b9, 0x03cb },- { 0x07ba, 0x03b0 },- { 0x07bb, 0x03ce },- { 0x07c1, 0x0391 },- { 0x07c2, 0x0392 },- { 0x07c3, 0x0393 },- { 0x07c4, 0x0394 },- { 0x07c5, 0x0395 },- { 0x07c6, 0x0396 },- { 0x07c7, 0x0397 },- { 0x07c8, 0x0398 },- { 0x07c9, 0x0399 },- { 0x07ca, 0x039a },- { 0x07cb, 0x039b },- { 0x07cc, 0x039c },- { 0x07cd, 0x039d },- { 0x07ce, 0x039e },- { 0x07cf, 0x039f },- { 0x07d0, 0x03a0 },- { 0x07d1, 0x03a1 },- { 0x07d2, 0x03a3 },- { 0x07d4, 0x03a4 },- { 0x07d5, 0x03a5 },- { 0x07d6, 0x03a6 },- { 0x07d7, 0x03a7 },- { 0x07d8, 0x03a8 },- { 0x07d9, 0x03a9 },- { 0x07e1, 0x03b1 },- { 0x07e2, 0x03b2 },- { 0x07e3, 0x03b3 },- { 0x07e4, 0x03b4 },- { 0x07e5, 0x03b5 },- { 0x07e6, 0x03b6 },- { 0x07e7, 0x03b7 },- { 0x07e8, 0x03b8 },- { 0x07e9, 0x03b9 },- { 0x07ea, 0x03ba },- { 0x07eb, 0x03bb },- { 0x07ec, 0x03bc },- { 0x07ed, 0x03bd },- { 0x07ee, 0x03be },- { 0x07ef, 0x03bf },- { 0x07f0, 0x03c0 },- { 0x07f1, 0x03c1 },- { 0x07f2, 0x03c3 },- { 0x07f3, 0x03c2 },- { 0x07f4, 0x03c4 },- { 0x07f5, 0x03c5 },- { 0x07f6, 0x03c6 },- { 0x07f7, 0x03c7 },- { 0x07f8, 0x03c8 },- { 0x07f9, 0x03c9 },- { 0x08a1, 0x23b7 },- { 0x08a2, 0x250c },- { 0x08a3, 0x2500 },- { 0x08a4, 0x2320 },- { 0x08a5, 0x2321 },- { 0x08a6, 0x2502 },- { 0x08a7, 0x23a1 },- { 0x08a8, 0x23a3 },- { 0x08a9, 0x23a4 },- { 0x08aa, 0x23a6 },- { 0x08ab, 0x239b },- { 0x08ac, 0x239d },- { 0x08ad, 0x239e },- { 0x08ae, 0x23a0 },- { 0x08af, 0x23a8 },- { 0x08b0, 0x23ac },- { 0x08bc, 0x2264 },- { 0x08bd, 0x2260 },- { 0x08be, 0x2265 },- { 0x08bf, 0x222b },- { 0x08c0, 0x2234 },- { 0x08c1, 0x221d },- { 0x08c2, 0x221e },- { 0x08c5, 0x2207 },- { 0x08c8, 0x223c },- { 0x08c9, 0x2243 },- { 0x08cd, 0x21d4 },- { 0x08ce, 0x21d2 },- { 0x08cf, 0x2261 },- { 0x08d6, 0x221a },- { 0x08da, 0x2282 },- { 0x08db, 0x2283 },- { 0x08dc, 0x2229 },- { 0x08dd, 0x222a },- { 0x08de, 0x2227 },- { 0x08df, 0x2228 },- { 0x08ef, 0x2202 },- { 0x08f6, 0x0192 },- { 0x08fb, 0x2190 },- { 0x08fc, 0x2191 },- { 0x08fd, 0x2192 },- { 0x08fe, 0x2193 },- { 0x09e0, 0x25c6 },- { 0x09e1, 0x2592 },- { 0x09e2, 0x2409 },- { 0x09e3, 0x240c },- { 0x09e4, 0x240d },- { 0x09e5, 0x240a },- { 0x09e8, 0x2424 },- { 0x09e9, 0x240b },- { 0x09ea, 0x2518 },- { 0x09eb, 0x2510 },- { 0x09ec, 0x250c },- { 0x09ed, 0x2514 },- { 0x09ee, 0x253c },- { 0x09ef, 0x23ba },- { 0x09f0, 0x23bb },- { 0x09f1, 0x2500 },- { 0x09f2, 0x23bc },- { 0x09f3, 0x23bd },- { 0x09f4, 0x251c },- { 0x09f5, 0x2524 },- { 0x09f6, 0x2534 },- { 0x09f7, 0x252c },- { 0x09f8, 0x2502 },- { 0x0aa1, 0x2003 },- { 0x0aa2, 0x2002 },- { 0x0aa3, 0x2004 },- { 0x0aa4, 0x2005 },- { 0x0aa5, 0x2007 },- { 0x0aa6, 0x2008 },- { 0x0aa7, 0x2009 },- { 0x0aa8, 0x200a },- { 0x0aa9, 0x2014 },- { 0x0aaa, 0x2013 },- { 0x0aae, 0x2026 },- { 0x0aaf, 0x2025 },- { 0x0ab0, 0x2153 },- { 0x0ab1, 0x2154 },- { 0x0ab2, 0x2155 },- { 0x0ab3, 0x2156 },- { 0x0ab4, 0x2157 },- { 0x0ab5, 0x2158 },- { 0x0ab6, 0x2159 },- { 0x0ab7, 0x215a },- { 0x0ab8, 0x2105 },- { 0x0abb, 0x2012 },- { 0x0abc, 0x2329 },- { 0x0abe, 0x232a },- { 0x0ac3, 0x215b },- { 0x0ac4, 0x215c },- { 0x0ac5, 0x215d },- { 0x0ac6, 0x215e },- { 0x0ac9, 0x2122 },- { 0x0aca, 0x2613 },- { 0x0acc, 0x25c1 },- { 0x0acd, 0x25b7 },- { 0x0ace, 0x25cb },- { 0x0acf, 0x25af },- { 0x0ad0, 0x2018 },- { 0x0ad1, 0x2019 },- { 0x0ad2, 0x201c },- { 0x0ad3, 0x201d },- { 0x0ad4, 0x211e },- { 0x0ad6, 0x2032 },- { 0x0ad7, 0x2033 },- { 0x0ad9, 0x271d },- { 0x0adb, 0x25ac },- { 0x0adc, 0x25c0 },- { 0x0add, 0x25b6 },- { 0x0ade, 0x25cf },- { 0x0adf, 0x25ae },- { 0x0ae0, 0x25e6 },- { 0x0ae1, 0x25ab },- { 0x0ae2, 0x25ad },- { 0x0ae3, 0x25b3 },- { 0x0ae4, 0x25bd },- { 0x0ae5, 0x2606 },- { 0x0ae6, 0x2022 },- { 0x0ae7, 0x25aa },- { 0x0ae8, 0x25b2 },- { 0x0ae9, 0x25bc },- { 0x0aea, 0x261c },- { 0x0aeb, 0x261e },- { 0x0aec, 0x2663 },- { 0x0aed, 0x2666 },- { 0x0aee, 0x2665 },- { 0x0af0, 0x2720 },- { 0x0af1, 0x2020 },- { 0x0af2, 0x2021 },- { 0x0af3, 0x2713 },- { 0x0af4, 0x2717 },- { 0x0af5, 0x266f },- { 0x0af6, 0x266d },- { 0x0af7, 0x2642 },- { 0x0af8, 0x2640 },- { 0x0af9, 0x260e },- { 0x0afa, 0x2315 },- { 0x0afb, 0x2117 },- { 0x0afc, 0x2038 },- { 0x0afd, 0x201a },- { 0x0afe, 0x201e },- { 0x0ba3, 0x003c },- { 0x0ba6, 0x003e },- { 0x0ba8, 0x2228 },- { 0x0ba9, 0x2227 },- { 0x0bc0, 0x00af },- { 0x0bc2, 0x22a5 },- { 0x0bc3, 0x2229 },- { 0x0bc4, 0x230a },- { 0x0bc6, 0x005f },- { 0x0bca, 0x2218 },- { 0x0bcc, 0x2395 },- { 0x0bce, 0x22a4 },- { 0x0bcf, 0x25cb },- { 0x0bd3, 0x2308 },- { 0x0bd6, 0x222a },- { 0x0bd8, 0x2283 },- { 0x0bda, 0x2282 },- { 0x0bdc, 0x22a2 },- { 0x0bfc, 0x22a3 },- { 0x0cdf, 0x2017 },- { 0x0ce0, 0x05d0 },- { 0x0ce1, 0x05d1 },- { 0x0ce2, 0x05d2 },- { 0x0ce3, 0x05d3 },- { 0x0ce4, 0x05d4 },- { 0x0ce5, 0x05d5 },- { 0x0ce6, 0x05d6 },- { 0x0ce7, 0x05d7 },- { 0x0ce8, 0x05d8 },- { 0x0ce9, 0x05d9 },- { 0x0cea, 0x05da },- { 0x0ceb, 0x05db },- { 0x0cec, 0x05dc },- { 0x0ced, 0x05dd },- { 0x0cee, 0x05de },- { 0x0cef, 0x05df },- { 0x0cf0, 0x05e0 },- { 0x0cf1, 0x05e1 },- { 0x0cf2, 0x05e2 },- { 0x0cf3, 0x05e3 },- { 0x0cf4, 0x05e4 },- { 0x0cf5, 0x05e5 },- { 0x0cf6, 0x05e6 },- { 0x0cf7, 0x05e7 },- { 0x0cf8, 0x05e8 },- { 0x0cf9, 0x05e9 },- { 0x0cfa, 0x05ea },- { 0x0da1, 0x0e01 },- { 0x0da2, 0x0e02 },- { 0x0da3, 0x0e03 },- { 0x0da4, 0x0e04 },- { 0x0da5, 0x0e05 },- { 0x0da6, 0x0e06 },- { 0x0da7, 0x0e07 },- { 0x0da8, 0x0e08 },- { 0x0da9, 0x0e09 },- { 0x0daa, 0x0e0a },- { 0x0dab, 0x0e0b },- { 0x0dac, 0x0e0c },- { 0x0dad, 0x0e0d },- { 0x0dae, 0x0e0e },- { 0x0daf, 0x0e0f },- { 0x0db0, 0x0e10 },- { 0x0db1, 0x0e11 },- { 0x0db2, 0x0e12 },- { 0x0db3, 0x0e13 },- { 0x0db4, 0x0e14 },- { 0x0db5, 0x0e15 },- { 0x0db6, 0x0e16 },- { 0x0db7, 0x0e17 },- { 0x0db8, 0x0e18 },- { 0x0db9, 0x0e19 },- { 0x0dba, 0x0e1a },- { 0x0dbb, 0x0e1b },- { 0x0dbc, 0x0e1c },- { 0x0dbd, 0x0e1d },- { 0x0dbe, 0x0e1e },- { 0x0dbf, 0x0e1f },- { 0x0dc0, 0x0e20 },- { 0x0dc1, 0x0e21 },- { 0x0dc2, 0x0e22 },- { 0x0dc3, 0x0e23 },- { 0x0dc4, 0x0e24 },- { 0x0dc5, 0x0e25 },- { 0x0dc6, 0x0e26 },- { 0x0dc7, 0x0e27 },- { 0x0dc8, 0x0e28 },- { 0x0dc9, 0x0e29 },- { 0x0dca, 0x0e2a },- { 0x0dcb, 0x0e2b },- { 0x0dcc, 0x0e2c },- { 0x0dcd, 0x0e2d },- { 0x0dce, 0x0e2e },- { 0x0dcf, 0x0e2f },- { 0x0dd0, 0x0e30 },- { 0x0dd1, 0x0e31 },- { 0x0dd2, 0x0e32 },- { 0x0dd3, 0x0e33 },- { 0x0dd4, 0x0e34 },- { 0x0dd5, 0x0e35 },- { 0x0dd6, 0x0e36 },- { 0x0dd7, 0x0e37 },- { 0x0dd8, 0x0e38 },- { 0x0dd9, 0x0e39 },- { 0x0dda, 0x0e3a },- { 0x0ddf, 0x0e3f },- { 0x0de0, 0x0e40 },- { 0x0de1, 0x0e41 },- { 0x0de2, 0x0e42 },- { 0x0de3, 0x0e43 },- { 0x0de4, 0x0e44 },- { 0x0de5, 0x0e45 },- { 0x0de6, 0x0e46 },- { 0x0de7, 0x0e47 },- { 0x0de8, 0x0e48 },- { 0x0de9, 0x0e49 },- { 0x0dea, 0x0e4a },- { 0x0deb, 0x0e4b },- { 0x0dec, 0x0e4c },- { 0x0ded, 0x0e4d },- { 0x0df0, 0x0e50 },- { 0x0df1, 0x0e51 },- { 0x0df2, 0x0e52 },- { 0x0df3, 0x0e53 },- { 0x0df4, 0x0e54 },- { 0x0df5, 0x0e55 },- { 0x0df6, 0x0e56 },- { 0x0df7, 0x0e57 },- { 0x0df8, 0x0e58 },- { 0x0df9, 0x0e59 },- { 0x0ea1, 0x3131 },- { 0x0ea2, 0x3132 },- { 0x0ea3, 0x3133 },- { 0x0ea4, 0x3134 },- { 0x0ea5, 0x3135 },- { 0x0ea6, 0x3136 },- { 0x0ea7, 0x3137 },- { 0x0ea8, 0x3138 },- { 0x0ea9, 0x3139 },- { 0x0eaa, 0x313a },- { 0x0eab, 0x313b },- { 0x0eac, 0x313c },- { 0x0ead, 0x313d },- { 0x0eae, 0x313e },- { 0x0eaf, 0x313f },- { 0x0eb0, 0x3140 },- { 0x0eb1, 0x3141 },- { 0x0eb2, 0x3142 },- { 0x0eb3, 0x3143 },- { 0x0eb4, 0x3144 },- { 0x0eb5, 0x3145 },- { 0x0eb6, 0x3146 },- { 0x0eb7, 0x3147 },- { 0x0eb8, 0x3148 },- { 0x0eb9, 0x3149 },- { 0x0eba, 0x314a },- { 0x0ebb, 0x314b },- { 0x0ebc, 0x314c },- { 0x0ebd, 0x314d },- { 0x0ebe, 0x314e },- { 0x0ebf, 0x314f },- { 0x0ec0, 0x3150 },- { 0x0ec1, 0x3151 },- { 0x0ec2, 0x3152 },- { 0x0ec3, 0x3153 },- { 0x0ec4, 0x3154 },- { 0x0ec5, 0x3155 },- { 0x0ec6, 0x3156 },- { 0x0ec7, 0x3157 },- { 0x0ec8, 0x3158 },- { 0x0ec9, 0x3159 },- { 0x0eca, 0x315a },- { 0x0ecb, 0x315b },- { 0x0ecc, 0x315c },- { 0x0ecd, 0x315d },- { 0x0ece, 0x315e },- { 0x0ecf, 0x315f },- { 0x0ed0, 0x3160 },- { 0x0ed1, 0x3161 },- { 0x0ed2, 0x3162 },- { 0x0ed3, 0x3163 },- { 0x0ed4, 0x11a8 },- { 0x0ed5, 0x11a9 },- { 0x0ed6, 0x11aa },- { 0x0ed7, 0x11ab },- { 0x0ed8, 0x11ac },- { 0x0ed9, 0x11ad },- { 0x0eda, 0x11ae },- { 0x0edb, 0x11af },- { 0x0edc, 0x11b0 },- { 0x0edd, 0x11b1 },- { 0x0ede, 0x11b2 },- { 0x0edf, 0x11b3 },- { 0x0ee0, 0x11b4 },- { 0x0ee1, 0x11b5 },- { 0x0ee2, 0x11b6 },- { 0x0ee3, 0x11b7 },- { 0x0ee4, 0x11b8 },- { 0x0ee5, 0x11b9 },- { 0x0ee6, 0x11ba },- { 0x0ee7, 0x11bb },- { 0x0ee8, 0x11bc },- { 0x0ee9, 0x11bd },- { 0x0eea, 0x11be },- { 0x0eeb, 0x11bf },- { 0x0eec, 0x11c0 },- { 0x0eed, 0x11c1 },- { 0x0eee, 0x11c2 },- { 0x0eef, 0x316d },- { 0x0ef0, 0x3171 },- { 0x0ef1, 0x3178 },- { 0x0ef2, 0x317f },- { 0x0ef3, 0x3181 },- { 0x0ef4, 0x3184 },- { 0x0ef5, 0x3186 },- { 0x0ef6, 0x318d },- { 0x0ef7, 0x318e },- { 0x0ef8, 0x11eb },- { 0x0ef9, 0x11f0 },- { 0x0efa, 0x11f9 },- { 0x0eff, 0x20a9 },- { 0x13a4, 0x20ac },- { 0x13bc, 0x0152 },- { 0x13bd, 0x0153 },- { 0x13be, 0x0178 },- { 0x20ac, 0x20ac },- // Numeric keypad with numlock on- { XK_KP_Space, ' ' },- { XK_KP_Equal, '=' },- { XK_KP_Multiply, '*' },- { XK_KP_Add, '+' },- { XK_KP_Separator, ',' },- { XK_KP_Subtract, '-' },- { XK_KP_Decimal, '.' },- { XK_KP_Divide, '/' },- { XK_KP_0, 0x0030 },- { XK_KP_1, 0x0031 },- { XK_KP_2, 0x0032 },- { XK_KP_3, 0x0033 },- { XK_KP_4, 0x0034 },- { XK_KP_5, 0x0035 },- { XK_KP_6, 0x0036 },- { XK_KP_7, 0x0037 },- { XK_KP_8, 0x0038 },- { XK_KP_9, 0x0039 }-};---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Convert X11 KeySym to Unicode-//========================================================================--long _glfwKeySym2Unicode( KeySym keysym )-{- int min = 0;- int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;- int mid;-- /* First check for Latin-1 characters (1:1 mapping) */- if( (keysym >= 0x0020 && keysym <= 0x007e) ||- (keysym >= 0x00a0 && keysym <= 0x00ff) )- { return keysym;- }-- /* Also check for directly encoded 24-bit UCS characters */- if( (keysym & 0xff000000) == 0x01000000 )- {- return keysym & 0x00ffffff;- }-- /* Binary search in table */- while( max >= min )- {- mid = (min + max) / 2;- if( keysymtab[mid].keysym < keysym )- {- min = mid + 1;- }- else if( keysymtab[mid].keysym > keysym )- {- max = mid - 1;- }- else- {- /* Found it! */- return keysymtab[mid].ucs;- }- }-- /* No matching Unicode value found */- return -1;-}
− glfw/lib/x11/x11_thread.c
@@ -1,503 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--#ifdef _GLFW_HAS_PTHREAD--//========================================================================-// This is simply a "wrapper" for calling the user thread function.-//========================================================================--void * _glfwNewThread( void * arg )-{- GLFWthreadfun threadfun;- _GLFWthread *t;- pthread_t posixID;-- // Get current thread ID- posixID = pthread_self();-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Loop through entire list of threads to find the matching POSIX- // thread ID- for( t = &_glfwThrd.First; t != NULL; t = t->Next )- {- if( t->PosixID == posixID )- {- break;- }- }- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return NULL;- }-- // Get user thread function pointer- threadfun = t->Function;-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Call the user thread function- threadfun( arg );-- // Remove thread from thread list- ENTER_THREAD_CRITICAL_SECTION- _glfwRemoveThread( t );- LEAVE_THREAD_CRITICAL_SECTION-- // When the thread function returns, the thread will die...- return NULL;-}--#endif // _GLFW_HAS_PTHREAD----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Create a new thread-//========================================================================--GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )-{-#ifdef _GLFW_HAS_PTHREAD-- GLFWthread ID;- _GLFWthread *t;- int result;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Create a new thread information memory area- t = (_GLFWthread *) malloc( sizeof(_GLFWthread) );- if( t == NULL )- {- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Get a new unique thread id- ID = _glfwThrd.NextID ++;-- // Store thread information in the thread list- t->Function = fun;- t->ID = ID;-- // Create thread- result = pthread_create(- &t->PosixID, // Thread handle- NULL, // Default thread attributes- _glfwNewThread, // Thread function (a wrapper function)- (void *)arg // Argument to thread is user argument- );-- // Did the thread creation fail?- if( result != 0 )- {- free( (void *) t );- LEAVE_THREAD_CRITICAL_SECTION- return -1;- }-- // Append thread to thread list- _glfwAppendThread( t );-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the GLFW thread ID- return ID;--#else-- return -1;--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT-// BE USED EXCEPT IN EXTREME SITUATIONS!-//========================================================================--void _glfwPlatformDestroyThread( GLFWthread ID )-{-#ifdef _GLFW_HAS_PTHREAD-- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return;- }-- // Simply murder the process, no mercy!- pthread_kill( t->PosixID, SIGKILL );-- // Remove thread from thread list- _glfwRemoveThread( t );-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Wait for a thread to die-//========================================================================--int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )-{-#ifdef _GLFW_HAS_PTHREAD-- pthread_t thread;- _GLFWthread *t;-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Get thread information pointer- t = _glfwGetThreadPointer( ID );-- // Is the thread already dead?- if( t == NULL )- {- LEAVE_THREAD_CRITICAL_SECTION- return GL_TRUE;- }-- // If got this far, the thread is alive => polling returns FALSE- if( waitmode == GLFW_NOWAIT )- {- LEAVE_THREAD_CRITICAL_SECTION- return GL_FALSE;- }-- // Get thread handle- thread = t->PosixID;-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Wait for thread to die- (void) pthread_join( thread, NULL );-- return GL_TRUE;--#else-- return GL_TRUE;--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Return the thread ID for the current thread-//========================================================================--GLFWthread _glfwPlatformGetThreadID( void )-{-#ifdef _GLFW_HAS_PTHREAD-- _GLFWthread *t;- GLFWthread ID = -1;- pthread_t posixID;-- // Get current thread ID- posixID = pthread_self();-- // Enter critical section- ENTER_THREAD_CRITICAL_SECTION-- // Loop through entire list of threads to find the matching POSIX- // thread ID- for( t = &_glfwThrd.First; t != NULL; t = t->Next )- {- if( t->PosixID == posixID )- {- ID = t->ID;- break;- }- }-- // Leave critical section- LEAVE_THREAD_CRITICAL_SECTION-- // Return the found GLFW thread identifier- return ID;--#else-- return 0;--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Create a mutual exclusion object-//========================================================================--GLFWmutex _glfwPlatformCreateMutex( void )-{-#ifdef _GLFW_HAS_PTHREAD-- pthread_mutex_t *mutex;-- // Allocate memory for mutex- mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) );- if( !mutex )- {- return NULL;- }-- // Initialise a mutex object- (void) pthread_mutex_init( mutex, NULL );-- // Cast to GLFWmutex and return- return (GLFWmutex) mutex;--#else-- return (GLFWmutex) 0;--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Destroy a mutual exclusion object-//========================================================================--void _glfwPlatformDestroyMutex( GLFWmutex mutex )-{-#ifdef _GLFW_HAS_PTHREAD-- // Destroy the mutex object- pthread_mutex_destroy( (pthread_mutex_t *) mutex );-- // Free memory for mutex object- free( (void *) mutex );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Request access to a mutex-//========================================================================--void _glfwPlatformLockMutex( GLFWmutex mutex )-{-#ifdef _GLFW_HAS_PTHREAD-- // Wait for mutex to be released- (void) pthread_mutex_lock( (pthread_mutex_t *) mutex );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Release a mutex-//========================================================================--void _glfwPlatformUnlockMutex( GLFWmutex mutex )-{-#ifdef _GLFW_HAS_PTHREAD-- // Release mutex- pthread_mutex_unlock( (pthread_mutex_t *) mutex );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Create a new condition variable object-//========================================================================--GLFWcond _glfwPlatformCreateCond( void )-{-#ifdef _GLFW_HAS_PTHREAD-- pthread_cond_t *cond;-- // Allocate memory for condition variable- cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) );- if( !cond )- {- return NULL;- }-- // Initialise condition variable- (void) pthread_cond_init( cond, NULL );-- // Cast to GLFWcond and return- return (GLFWcond) cond;--#else-- return (GLFWcond) 0;--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Destroy a condition variable object-//========================================================================--void _glfwPlatformDestroyCond( GLFWcond cond )-{-#ifdef _GLFW_HAS_PTHREAD-- // Destroy the condition variable object- (void) pthread_cond_destroy( (pthread_cond_t *) cond );-- // Free memory for condition variable object- free( (void *) cond );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Wait for a condition to be raised-//========================================================================--void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,- double timeout )-{-#ifdef _GLFW_HAS_PTHREAD-- struct timeval currenttime;- struct timespec wait;- long dt_sec, dt_usec;-- // Select infinite or timed wait- if( timeout >= GLFW_INFINITY )- {- // Wait for condition (infinite wait)- (void) pthread_cond_wait( (pthread_cond_t *) cond,- (pthread_mutex_t *) mutex );- }- else- {- // Set timeout time, relatvie to current time- gettimeofday( ¤ttime, NULL );- dt_sec = (long) timeout;- dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0);- wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;- if( wait.tv_nsec > 1000000000L )- {- wait.tv_nsec -= 1000000000L;- dt_sec ++;- }- wait.tv_sec = currenttime.tv_sec + dt_sec;-- // Wait for condition (timed wait)- (void) pthread_cond_timedwait( (pthread_cond_t *) cond,- (pthread_mutex_t *) mutex, &wait );- }--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Signal a condition to one waiting thread-//========================================================================--void _glfwPlatformSignalCond( GLFWcond cond )-{-#ifdef _GLFW_HAS_PTHREAD-- // Signal condition- (void) pthread_cond_signal( (pthread_cond_t *) cond );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Broadcast a condition to all waiting threads-//========================================================================--void _glfwPlatformBroadcastCond( GLFWcond cond )-{-#ifdef _GLFW_HAS_PTHREAD-- // Broadcast condition- (void) pthread_cond_broadcast( (pthread_cond_t *) cond );--#endif // _GLFW_HAS_PTHREAD-}---//========================================================================-// Return the number of processors in the system.-//========================================================================--int _glfwPlatformGetNumberOfProcessors( void )-{- int n;-- // Get number of processors online- _glfw_numprocessors( n );- return n;-}-
− glfw/lib/x11/x11_time.c
@@ -1,154 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---//========================================================================-// Initialise timer-//========================================================================--void _glfwInitTimer( void )-{- struct timeval tv;-- // "Resolution" is 1 us- _glfwLibrary.Timer.resolution = 1e-6;-- // Set start-time for timer- gettimeofday( &tv, NULL );- _glfwLibrary.Timer.t0 = (long long) tv.tv_sec * (long long) 1000000 +- (long long) tv.tv_usec;-}---//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Return timer value in seconds-//========================================================================--double _glfwPlatformGetTime( void )-{- long long t;- struct timeval tv;-- gettimeofday( &tv, NULL );- t = (long long) tv.tv_sec * (long long) 1000000 +- (long long) tv.tv_usec;-- return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.resolution;-}---//========================================================================-// Set timer value in seconds-//========================================================================--void _glfwPlatformSetTime( double t )-{- long long t0;- struct timeval tv;-- gettimeofday( &tv, NULL );- t0 = (long long) tv.tv_sec * (long long) 1000000 +- (long long) tv.tv_usec;-- // Calulate new starting time- _glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.resolution);-}---//========================================================================-// Put a thread to sleep for a specified amount of time-//========================================================================--void _glfwPlatformSleep( double time )-{-#ifdef _GLFW_HAS_PTHREAD-- if( time == 0.0 )- {-#ifdef _GLFW_HAS_SCHED_YIELD- sched_yield();-#endif- return;- }-- struct timeval currenttime;- struct timespec wait;- pthread_mutex_t mutex;- pthread_cond_t cond;- long dt_sec, dt_usec;-- // Not all pthread implementations have a pthread_sleep() function. We- // do it the portable way, using a timed wait for a condition that we- // will never signal. NOTE: The unistd functions sleep/usleep suspends- // the entire PROCESS, not a signle thread, which is why we can not- // use them to implement glfwSleep.-- // Set timeout time, relatvie to current time- gettimeofday( ¤ttime, NULL );- dt_sec = (long) time;- dt_usec = (long) ((time - (double)dt_sec) * 1000000.0);- wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L;- if( wait.tv_nsec > 1000000000L )- {- wait.tv_nsec -= 1000000000L;- dt_sec++;- }- wait.tv_sec = currenttime.tv_sec + dt_sec;-- // Initialize condition and mutex objects- pthread_mutex_init( &mutex, NULL );- pthread_cond_init( &cond, NULL );-- // Do a timed wait- pthread_mutex_lock( &mutex );- pthread_cond_timedwait( &cond, &mutex, &wait );- pthread_mutex_unlock( &mutex );-- // Destroy condition and mutex objects- pthread_mutex_destroy( &mutex );- pthread_cond_destroy( &cond );--#else-- // For systems without PTHREAD, use unistd usleep- if( time > 0 )- {- usleep( (unsigned int) (time*1000000) );- }--#endif // _GLFW_HAS_PTHREAD-}-
− glfw/lib/x11/x11_window.c
@@ -1,1891 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// Platform: X11/GLX-// API version: 2.7-// WWW: http://www.glfw.org/-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard-// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"--#include <limits.h>---/* Define GLX 1.4 FSAA tokens if not already defined */-#ifndef GLX_VERSION_1_4--#define GLX_SAMPLE_BUFFERS 100000-#define GLX_SAMPLES 100001--#endif /*GLX_VERSION_1_4*/--// Action for EWMH client messages-#define _NET_WM_STATE_REMOVE 0-#define _NET_WM_STATE_ADD 1-#define _NET_WM_STATE_TOGGLE 2---//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Error handler for BadMatch errors when requesting context with-// unavailable OpenGL versions using the GLX_ARB_create_context extension-//========================================================================--static int errorHandler( Display *display, XErrorEvent *event )-{- return 0;-}---//========================================================================-// Checks whether the event is a MapNotify for the specified window-//========================================================================--static Bool isMapNotify( Display *d, XEvent *e, char *arg )-{- return (e->type == MapNotify) && (e->xmap.window == (Window)arg);-}---//========================================================================-// Retrieve a single window property of the specified type-// Inspired by fghGetWindowProperty from freeglut-//========================================================================--static unsigned long getWindowProperty( Window window,- Atom property,- Atom type,- unsigned char** value )-{- Atom actualType;- int actualFormat;- unsigned long itemCount, bytesAfter;-- XGetWindowProperty( _glfwLibrary.display,- window,- property,- 0,- LONG_MAX,- False,- type,- &actualType,- &actualFormat,- &itemCount,- &bytesAfter,- value );-- if( actualType != type )- {- return 0;- }-- return itemCount;-}---//========================================================================-// Check whether the specified atom is supported-//========================================================================--static Atom getSupportedAtom( Atom* supportedAtoms,- unsigned long atomCount,- const char* atomName )-{- Atom atom = XInternAtom( _glfwLibrary.display, atomName, True );- if( atom != None )- {- unsigned long i;-- for( i = 0; i < atomCount; i++ )- {- if( supportedAtoms[i] == atom )- {- return atom;- }- }- }-- return None;-}---//========================================================================-// Check whether the running window manager is EWMH-compliant-//========================================================================--static GLboolean checkForEWMH( void )-{- Window *windowFromRoot = NULL;- Window *windowFromChild = NULL;-- // Hey kids; let's see if the window manager supports EWMH!-- // First we need a couple of atoms, which should already be there- Atom supportingWmCheck = XInternAtom( _glfwLibrary.display,- "_NET_SUPPORTING_WM_CHECK",- True );- Atom wmSupported = XInternAtom( _glfwLibrary.display,- "_NET_SUPPORTED",- True );- if( supportingWmCheck == None || wmSupported == None )- {- return GL_FALSE;- }-- // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window- if( getWindowProperty( _glfwWin.root,- supportingWmCheck,- XA_WINDOW,- (unsigned char**) &windowFromRoot ) != 1 )- {- XFree( windowFromRoot );- return GL_FALSE;- }-- // It should be the ID of a child window (of the root)- // Then we look for the same property on the child window- if( getWindowProperty( *windowFromRoot,- supportingWmCheck,- XA_WINDOW,- (unsigned char**) &windowFromChild ) != 1 )- {- XFree( windowFromRoot );- XFree( windowFromChild );- return GL_FALSE;- }-- // It should be the ID of that same child window- if( *windowFromRoot != *windowFromChild )- {- XFree( windowFromRoot );- XFree( windowFromChild );- return GL_FALSE;- }-- XFree( windowFromRoot );- XFree( windowFromChild );-- // We are now fairly sure that an EWMH-compliant window manager is running-- Atom *supportedAtoms;- unsigned long atomCount;-- // Now we need to check the _NET_SUPPORTED property of the root window- atomCount = getWindowProperty( _glfwWin.root,- wmSupported,- XA_ATOM,- (unsigned char**) &supportedAtoms );-- // See which of the atoms we support that are supported by the WM-- _glfwWin.wmState = getSupportedAtom( supportedAtoms,- atomCount,- "_NET_WM_STATE" );-- _glfwWin.wmStateFullscreen = getSupportedAtom( supportedAtoms,- atomCount,- "_NET_WM_STATE_FULLSCREEN" );-- _glfwWin.wmPing = getSupportedAtom( supportedAtoms,- atomCount,- "_NET_WM_PING" );-- _glfwWin.wmActiveWindow = getSupportedAtom( supportedAtoms,- atomCount,- "_NET_ACTIVE_WINDOW" );-- XFree( supportedAtoms );-- return GL_TRUE;-}--//========================================================================-// Translates an X Window key to internal coding-//========================================================================--static int translateKey( int keycode )-{- KeySym key, key_lc, key_uc;-- // Try secondary keysym, for numeric keypad keys- // Note: This way we always force "NumLock = ON", which at least- // enables GLFW users to detect numeric keypad keys- key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 1 );- switch( key )- {- // Numeric keypad- case XK_KP_0: return GLFW_KEY_KP_0;- case XK_KP_1: return GLFW_KEY_KP_1;- case XK_KP_2: return GLFW_KEY_KP_2;- case XK_KP_3: return GLFW_KEY_KP_3;- case XK_KP_4: return GLFW_KEY_KP_4;- case XK_KP_5: return GLFW_KEY_KP_5;- case XK_KP_6: return GLFW_KEY_KP_6;- case XK_KP_7: return GLFW_KEY_KP_7;- case XK_KP_8: return GLFW_KEY_KP_8;- case XK_KP_9: return GLFW_KEY_KP_9;- case XK_KP_Separator:- case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL;- case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;- case XK_KP_Enter: return GLFW_KEY_KP_ENTER;- default: break;- }-- // Now try pimary keysym- key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 0 );- switch( key )- {- // Special keys (non character keys)- case XK_Escape: return GLFW_KEY_ESC;- case XK_Tab: return GLFW_KEY_TAB;- case XK_Shift_L: return GLFW_KEY_LSHIFT;- case XK_Shift_R: return GLFW_KEY_RSHIFT;- case XK_Control_L: return GLFW_KEY_LCTRL;- case XK_Control_R: return GLFW_KEY_RCTRL;- case XK_Meta_L:- case XK_Alt_L: return GLFW_KEY_LALT;- case XK_Mode_switch: // Mapped to Alt_R on many keyboards- case XK_Meta_R:- case XK_ISO_Level3_Shift: // AltGr on at least some machines- case XK_Alt_R: return GLFW_KEY_RALT;- case XK_Super_L: return GLFW_KEY_LSUPER;- case XK_Super_R: return GLFW_KEY_RSUPER;- case XK_Menu: return GLFW_KEY_MENU;- case XK_Num_Lock: return GLFW_KEY_KP_NUM_LOCK;- case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK;- case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK;- case XK_Pause: return GLFW_KEY_PAUSE;- case XK_KP_Delete:- case XK_Delete: return GLFW_KEY_DEL;- case XK_BackSpace: return GLFW_KEY_BACKSPACE;- case XK_Return: return GLFW_KEY_ENTER;- case XK_KP_Home:- case XK_Home: return GLFW_KEY_HOME;- case XK_KP_End:- case XK_End: return GLFW_KEY_END;- case XK_KP_Page_Up:- case XK_Page_Up: return GLFW_KEY_PAGEUP;- case XK_KP_Page_Down:- case XK_Page_Down: return GLFW_KEY_PAGEDOWN;- case XK_KP_Insert:- case XK_Insert: return GLFW_KEY_INSERT;- case XK_KP_Left:- case XK_Left: return GLFW_KEY_LEFT;- case XK_KP_Right:- case XK_Right: return GLFW_KEY_RIGHT;- case XK_KP_Down:- case XK_Down: return GLFW_KEY_DOWN;- case XK_KP_Up:- case XK_Up: return GLFW_KEY_UP;- case XK_F1: return GLFW_KEY_F1;- case XK_F2: return GLFW_KEY_F2;- case XK_F3: return GLFW_KEY_F3;- case XK_F4: return GLFW_KEY_F4;- case XK_F5: return GLFW_KEY_F5;- case XK_F6: return GLFW_KEY_F6;- case XK_F7: return GLFW_KEY_F7;- case XK_F8: return GLFW_KEY_F8;- case XK_F9: return GLFW_KEY_F9;- case XK_F10: return GLFW_KEY_F10;- case XK_F11: return GLFW_KEY_F11;- case XK_F12: return GLFW_KEY_F12;- case XK_F13: return GLFW_KEY_F13;- case XK_F14: return GLFW_KEY_F14;- case XK_F15: return GLFW_KEY_F15;- case XK_F16: return GLFW_KEY_F16;- case XK_F17: return GLFW_KEY_F17;- case XK_F18: return GLFW_KEY_F18;- case XK_F19: return GLFW_KEY_F19;- case XK_F20: return GLFW_KEY_F20;- case XK_F21: return GLFW_KEY_F21;- case XK_F22: return GLFW_KEY_F22;- case XK_F23: return GLFW_KEY_F23;- case XK_F24: return GLFW_KEY_F24;- case XK_F25: return GLFW_KEY_F25;-- // Numeric keypad (should have been detected in secondary keysym!)- case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE;- case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY;- case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT;- case XK_KP_Add: return GLFW_KEY_KP_ADD;- case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;- case XK_KP_Enter: return GLFW_KEY_KP_ENTER;-- // The rest (should be printable keys)- default:- // Make uppercase- XConvertCase( key, &key_lc, &key_uc );- key = key_uc;-- // Valid ISO 8859-1 character?- if( (key >= 32 && key <= 126) ||- (key >= 160 && key <= 255) )- {- return (int) key;- }- return GLFW_KEY_UNKNOWN;- }-}---//========================================================================-// Translates an X Window event to Unicode-//========================================================================--static int translateChar( XKeyEvent *event )-{- KeySym keysym;-- // Get X11 keysym- XLookupString( event, NULL, 0, &keysym, NULL );-- // Convert to Unicode (see x11_keysym2unicode.c)- return (int) _glfwKeySym2Unicode( keysym );-}---//========================================================================-// Create a blank cursor (for locked mouse mode)-//========================================================================--static Cursor createNULLCursor( Display *display, Window root )-{- Pixmap cursormask;- XGCValues xgc;- GC gc;- XColor col;- Cursor cursor;-- cursormask = XCreatePixmap( display, root, 1, 1, 1 );- xgc.function = GXclear;- gc = XCreateGC( display, cursormask, GCFunction, &xgc );- XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 );- col.pixel = 0;- col.red = 0;- col.flags = 4;- cursor = XCreatePixmapCursor( display, cursormask, cursormask,- &col,&col, 0,0 );- XFreePixmap( display, cursormask );- XFreeGC( display, gc );-- return cursor;-}---//========================================================================-// Returns the specified attribute of the specified GLXFBConfig-// NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig-//========================================================================--static int getFBConfigAttrib( GLXFBConfig fbconfig, int attrib )-{- int value;-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.GetFBConfigAttribSGIX( _glfwLibrary.display, fbconfig, attrib, &value );- }- else- {- glXGetFBConfigAttrib( _glfwLibrary.display, fbconfig, attrib, &value );- }-- return value;-}---//========================================================================-// Return a list of available and usable framebuffer configs-//========================================================================--static _GLFWfbconfig *getFBConfigs( unsigned int *found )-{- GLXFBConfig *fbconfigs;- _GLFWfbconfig *result;- int i, count = 0;-- *found = 0;-- if( _glfwLibrary.glxMajor == 1 && _glfwLibrary.glxMinor < 3 )- {- if( !_glfwWin.has_GLX_SGIX_fbconfig )- {- fprintf( stderr, "GLXFBConfigs are not supported by the X server\n" );- return NULL;- }- }-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfigs = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- NULL,- &count );- if( !count )- {- fprintf( stderr, "No GLXFBConfigs returned\n" );- return NULL;- }- }- else- {- fbconfigs = glXGetFBConfigs( _glfwLibrary.display, _glfwWin.screen, &count );- if( !count )- {- fprintf( stderr, "No GLXFBConfigs returned\n" );- return NULL;- }- }-- result = (_GLFWfbconfig*) malloc( sizeof(_GLFWfbconfig) * count );- if( !result )- {- fprintf( stderr, "Out of memory\n" );- return NULL;- }-- for( i = 0; i < count; i++ )- {- if( !getFBConfigAttrib( fbconfigs[i], GLX_DOUBLEBUFFER ) ||- !getFBConfigAttrib( fbconfigs[i], GLX_VISUAL_ID ) )- {- // Only consider double-buffered GLXFBConfigs with associated visuals- continue;- }-- if( !( getFBConfigAttrib( fbconfigs[i], GLX_RENDER_TYPE ) & GLX_RGBA_BIT ) )- {- // Only consider RGBA GLXFBConfigs- continue;- }-- if( !( getFBConfigAttrib( fbconfigs[i], GLX_DRAWABLE_TYPE ) & GLX_WINDOW_BIT ) )- {- // Only consider window GLXFBConfigs- continue;- }-- result[*found].redBits = getFBConfigAttrib( fbconfigs[i], GLX_RED_SIZE );- result[*found].greenBits = getFBConfigAttrib( fbconfigs[i], GLX_GREEN_SIZE );- result[*found].blueBits = getFBConfigAttrib( fbconfigs[i], GLX_BLUE_SIZE );-- result[*found].alphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ALPHA_SIZE );- result[*found].depthBits = getFBConfigAttrib( fbconfigs[i], GLX_DEPTH_SIZE );- result[*found].stencilBits = getFBConfigAttrib( fbconfigs[i], GLX_STENCIL_SIZE );-- result[*found].accumRedBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_RED_SIZE );- result[*found].accumGreenBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_GREEN_SIZE );- result[*found].accumBlueBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_BLUE_SIZE );- result[*found].accumAlphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_ALPHA_SIZE );-- result[*found].auxBuffers = getFBConfigAttrib( fbconfigs[i], GLX_AUX_BUFFERS );- result[*found].stereo = getFBConfigAttrib( fbconfigs[i], GLX_STEREO );-- if( _glfwWin.has_GLX_ARB_multisample )- {- result[*found].samples = getFBConfigAttrib( fbconfigs[i], GLX_SAMPLES );- }- else- {- result[*found].samples = 0;- }-- result[*found].platformID = (GLFWintptr) getFBConfigAttrib( fbconfigs[i], GLX_FBCONFIG_ID );-- (*found)++;- }-- XFree( fbconfigs );-- return result;-}---//========================================================================-// Create the OpenGL context-//========================================================================--#define setGLXattrib( attribs, index, attribName, attribValue ) \- attribs[index++] = attribName; \- attribs[index++] = attribValue;--static int createContext( const _GLFWwndconfig *wndconfig, GLXFBConfigID fbconfigID )-{- int attribs[40];- int flags, dummy, index;- GLXFBConfig *fbconfig;-- // Retrieve the previously selected GLXFBConfig- {- index = 0;-- setGLXattrib( attribs, index, GLX_FBCONFIG_ID, (int) fbconfigID );- setGLXattrib( attribs, index, None, None );-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }- else- {- fbconfig = glXChooseFBConfig( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }-- if( fbconfig == NULL )- {- fprintf(stderr, "Unable to retrieve the selected GLXFBConfig\n");- return GL_FALSE;- }- }-- // Retrieve the corresponding visual- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.visual = _glfwWin.GetVisualFromFBConfigSGIX( _glfwLibrary.display,- *fbconfig );- }- else- {- _glfwWin.visual = glXGetVisualFromFBConfig( _glfwLibrary.display, *fbconfig );- }-- if( _glfwWin.visual == NULL )- {- XFree( fbconfig );-- fprintf(stderr, "Unable to retrieve visual for GLXFBconfig\n");- return GL_FALSE;- }-- if( _glfwWin.has_GLX_ARB_create_context )- {- index = 0;-- if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 )- {- // Request an explicitly versioned context-- setGLXattrib( attribs, index, GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor );- setGLXattrib( attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor );- }-- if( wndconfig->glForward || wndconfig->glDebug )- {- flags = 0;-- if( wndconfig->glForward )- {- flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;- }-- if( wndconfig->glDebug )- {- flags |= GLX_CONTEXT_DEBUG_BIT_ARB;- }-- setGLXattrib( attribs, index, GLX_CONTEXT_FLAGS_ARB, flags );- }-- if( wndconfig->glProfile )- {- if( !_glfwWin.has_GLX_ARB_create_context_profile )- {- fprintf( stderr, "OpenGL profile requested but GLX_ARB_create_context_profile "- "is unavailable\n" );- return GL_FALSE;- }-- if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE )- {- flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB;- }- else- {- flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;- }-- setGLXattrib( attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags );- }-- setGLXattrib( attribs, index, None, None );-- // This is the only place we set an Xlib error handler, and we only do- // it because glXCreateContextAttribsARB generates a BadMatch error if- // the requested OpenGL version is unavailable (instead of a civilized- // response like returning NULL)- XSetErrorHandler( errorHandler );-- _glfwWin.context = _glfwWin.CreateContextAttribsARB( _glfwLibrary.display,- *fbconfig,- NULL,- True,- attribs );-- // We are done, so unset the error handler again (see above)- XSetErrorHandler( NULL );- }- else- {- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.context = _glfwWin.CreateContextWithConfigSGIX( _glfwLibrary.display,- *fbconfig,- GLX_RGBA_TYPE,- NULL,- True );- }- else- {- _glfwWin.context = glXCreateNewContext( _glfwLibrary.display,- *fbconfig,- GLX_RGBA_TYPE,- NULL,- True );- }- }-- XFree( fbconfig );-- if( _glfwWin.context == NULL )- {- fprintf(stderr, "Unable to create OpenGL context\n");- return GL_FALSE;- }-- _glfwWin.fbconfigID = fbconfigID;-- return GL_TRUE;-}--#undef setGLXattrib---//========================================================================-// Initialize GLX-specific extensions-//========================================================================--static void initGLXExtensions( void )-{- // This needs to include every function pointer loaded below- _glfwWin.SwapIntervalSGI = NULL;- _glfwWin.GetFBConfigAttribSGIX = NULL;- _glfwWin.ChooseFBConfigSGIX = NULL;- _glfwWin.CreateContextWithConfigSGIX = NULL;- _glfwWin.GetVisualFromFBConfigSGIX = NULL;- _glfwWin.CreateContextAttribsARB = NULL;-- // This needs to include every extension used below- _glfwWin.has_GLX_SGIX_fbconfig = GL_FALSE;- _glfwWin.has_GLX_SGI_swap_control = GL_FALSE;- _glfwWin.has_GLX_ARB_multisample = GL_FALSE;- _glfwWin.has_GLX_ARB_create_context = GL_FALSE;- _glfwWin.has_GLX_ARB_create_context_profile = GL_FALSE;-- if( _glfwPlatformExtensionSupported( "GLX_SGI_swap_control" ) )- {- _glfwWin.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)- _glfwPlatformGetProcAddress( "glXSwapIntervalSGI" );-- if( _glfwWin.SwapIntervalSGI )- {- _glfwWin.has_GLX_SGI_swap_control = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_SGIX_fbconfig" ) )- {- _glfwWin.GetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)- _glfwPlatformGetProcAddress( "glXGetFBConfigAttribSGIX" );- _glfwWin.ChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXChooseFBConfigSGIX" );- _glfwWin.CreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXCreateContextWithConfigSGIX" );- _glfwWin.GetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXGetVisualFromFBConfigSGIX" );-- if( _glfwWin.GetFBConfigAttribSGIX &&- _glfwWin.ChooseFBConfigSGIX &&- _glfwWin.CreateContextWithConfigSGIX &&- _glfwWin.GetVisualFromFBConfigSGIX )- {- _glfwWin.has_GLX_SGIX_fbconfig = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_multisample" ) )- {- _glfwWin.has_GLX_ARB_multisample = GL_TRUE;- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context" ) )- {- _glfwWin.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)- _glfwPlatformGetProcAddress( "glXCreateContextAttribsARB" );-- if( _glfwWin.CreateContextAttribsARB )- {- _glfwWin.has_GLX_ARB_create_context = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context_profile" ) )- {- _glfwWin.has_GLX_ARB_create_context_profile = GL_TRUE;- }-}---//========================================================================-// Create the X11 window (and its colormap)-//========================================================================--static GLboolean createWindow( int width, int height,- const _GLFWwndconfig *wndconfig )-{- XEvent event;- unsigned long wamask;- XSetWindowAttributes wa;-- // Every window needs a colormap- // Create one based on the visual used by the current context-- _glfwWin.colormap = XCreateColormap( _glfwLibrary.display,- _glfwWin.root,- _glfwWin.visual->visual,- AllocNone );-- // Create the actual window- {- wamask = CWBorderPixel | CWColormap | CWEventMask;-- wa.colormap = _glfwWin.colormap;- wa.border_pixel = 0;- wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask |- PointerMotionMask | ButtonPressMask | ButtonReleaseMask |- ExposureMask | FocusChangeMask | VisibilityChangeMask;-- if( wndconfig->mode == GLFW_WINDOW )- {- // The /only/ reason we are setting the background pixel here is- // that otherwise our window wont get any decorations on systems- // using Compiz on Intel hardware- wa.background_pixel = BlackPixel( _glfwLibrary.display, _glfwWin.screen );- wamask |= CWBackPixel;- }-- _glfwWin.window = XCreateWindow(- _glfwLibrary.display,- _glfwWin.root,- 0, 0, // Upper left corner of this window on root- _glfwWin.width, _glfwWin.height,- 0, // Border width- _glfwWin.visual->depth, // Color depth- InputOutput,- _glfwWin.visual->visual,- wamask,- &wa- );- if( !_glfwWin.window )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }- }-- // Check whether an EWMH-compliant window manager is running- _glfwWin.hasEWMH = checkForEWMH();-- if( _glfwWin.fullscreen && !_glfwWin.hasEWMH )- {- // This is the butcher's way of removing window decorations- // Setting the override-redirect attribute on a window makes the window- // manager ignore the window completely (ICCCM, section 4)- // The good thing is that this makes undecorated fullscreen windows- // easy to do; the bad thing is that we have to do everything manually- // and some things (like iconify/restore) won't work at all, as they're- // usually performed by the window manager-- XSetWindowAttributes attributes;- attributes.override_redirect = True;- XChangeWindowAttributes( _glfwLibrary.display,- _glfwWin.window,- CWOverrideRedirect,- &attributes );-- _glfwWin.overrideRedirect = GL_TRUE;- }-- // Find or create the protocol atom for window close notifications- _glfwWin.wmDeleteWindow = XInternAtom( _glfwLibrary.display,- "WM_DELETE_WINDOW",- False );-- // Declare the WM protocols we support- {- int count = 0;- Atom protocols[2];-- // The WM_DELETE_WINDOW ICCCM protocol- // Basic window close notification protocol- if( _glfwWin.wmDeleteWindow != None )- {- protocols[count++] = _glfwWin.wmDeleteWindow;- }-- // The _NET_WM_PING EWMH protocol- // Tells the WM to ping our window and flag us as unresponsive if we- // don't reply within a few seconds- if( _glfwWin.wmPing != None )- {- protocols[count++] = _glfwWin.wmPing;- }-- if( count > 0 )- {- XSetWMProtocols( _glfwLibrary.display, _glfwWin.window,- protocols, count );- }- }-- // Set ICCCM WM_HINTS property- {- XWMHints *hints = XAllocWMHints();- if( !hints )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- hints->flags = StateHint;- hints->initial_state = NormalState;-- XSetWMHints( _glfwLibrary.display, _glfwWin.window, hints );- XFree( hints );- }-- // Set ICCCM WM_NORMAL_HINTS property (even if no parts are set)- {- XSizeHints *hints = XAllocSizeHints();- if( !hints )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- hints->flags = 0;-- if( wndconfig->windowNoResize && !_glfwWin.fullscreen )- {- hints->flags |= (PMinSize | PMaxSize);- hints->min_width = hints->max_width = _glfwWin.width;- hints->min_height = hints->max_height = _glfwWin.height;- }-- XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, hints );- XFree( hints );- }-- _glfwPlatformSetWindowTitle( "GLFW Window" );-- // Make sure the window is mapped before proceeding- XMapWindow( _glfwLibrary.display, _glfwWin.window );- XPeekIfEvent( _glfwLibrary.display, &event, isMapNotify,- (char*)_glfwWin.window );-- return GL_TRUE;-}---//========================================================================-// Enter fullscreen mode-//========================================================================--static void enterFullscreenMode( void )-{- if( !_glfwWin.Saver.changed )- {- // Remember old screen saver settings- XGetScreenSaver( _glfwLibrary.display,- &_glfwWin.Saver.timeout, &_glfwWin.Saver.interval,- &_glfwWin.Saver.blanking, &_glfwWin.Saver.exposure );-- // Disable screen saver- XSetScreenSaver( _glfwLibrary.display, 0, 0, DontPreferBlanking,- DefaultExposures );-- _glfwWin.Saver.changed = GL_TRUE;- }-- _glfwSetVideoMode( _glfwWin.screen,- &_glfwWin.width, &_glfwWin.height,- &_glfwWin.refreshRate );-- if( _glfwWin.hasEWMH &&- _glfwWin.wmState != None &&- _glfwWin.wmStateFullscreen != None )- {- if( _glfwWin.wmActiveWindow != None )- {- // Ask the window manager to raise and focus the GLFW window- // Only focused windows with the _NET_WM_STATE_FULLSCREEN state end- // up on top of all other windows ("Stacking order" in EWMH spec)-- XEvent event;- memset( &event, 0, sizeof(event) );-- event.type = ClientMessage;- event.xclient.window = _glfwWin.window;- event.xclient.format = 32; // Data is 32-bit longs- event.xclient.message_type = _glfwWin.wmActiveWindow;- event.xclient.data.l[0] = 1; // Sender is a normal application- event.xclient.data.l[1] = 0; // We don't really know the timestamp-- XSendEvent( _glfwLibrary.display,- _glfwWin.root,- False,- SubstructureNotifyMask | SubstructureRedirectMask,- &event );- }-- // Ask the window manager to make the GLFW window a fullscreen window- // Fullscreen windows are undecorated and, when focused, are kept- // on top of all other windows-- XEvent event;- memset( &event, 0, sizeof(event) );-- event.type = ClientMessage;- event.xclient.window = _glfwWin.window;- event.xclient.format = 32; // Data is 32-bit longs- event.xclient.message_type = _glfwWin.wmState;- event.xclient.data.l[0] = _NET_WM_STATE_ADD;- event.xclient.data.l[1] = _glfwWin.wmStateFullscreen;- event.xclient.data.l[2] = 0; // No secondary property- event.xclient.data.l[3] = 1; // Sender is a normal application-- XSendEvent( _glfwLibrary.display,- _glfwWin.root,- False,- SubstructureNotifyMask | SubstructureRedirectMask,- &event );- }- else if( _glfwWin.overrideRedirect )- {- // In override-redirect mode, we have divorced ourselves from the- // window manager, so we need to do everything manually-- XRaiseWindow( _glfwLibrary.display, _glfwWin.window );- XSetInputFocus( _glfwLibrary.display, _glfwWin.window,- RevertToParent, CurrentTime );- XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 );- XResizeWindow( _glfwLibrary.display, _glfwWin.window,- _glfwWin.width, _glfwWin.height );- }-- if( _glfwWin.mouseLock )- {- _glfwPlatformHideMouseCursor();- }-- // HACK: Try to get window inside viewport (for virtual displays) by moving- // the mouse cursor to the upper left corner (and then to the center)- // This hack should be harmless on saner systems as well- XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, 0,0 );- XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0,- _glfwWin.width / 2, _glfwWin.height / 2 );-}--//========================================================================-// Leave fullscreen mode-//========================================================================--static void leaveFullscreenMode( void )-{- _glfwRestoreVideoMode();-- // Did we change the screen saver setting?- if( _glfwWin.Saver.changed )- {- // Restore old screen saver settings- XSetScreenSaver( _glfwLibrary.display,- _glfwWin.Saver.timeout,- _glfwWin.Saver.interval,- _glfwWin.Saver.blanking,- _glfwWin.Saver.exposure );-- _glfwWin.Saver.changed = GL_FALSE;- }-- if( _glfwWin.hasEWMH &&- _glfwWin.wmState != None &&- _glfwWin.wmStateFullscreen != None )- {- // Ask the window manager to make the GLFW window a normal window- // Normal windows usually have frames and other decorations-- XEvent event;- memset( &event, 0, sizeof(event) );-- event.type = ClientMessage;- event.xclient.window = _glfwWin.window;- event.xclient.format = 32; // Data is 32-bit longs- event.xclient.message_type = _glfwWin.wmState;- event.xclient.data.l[0] = _NET_WM_STATE_REMOVE;- event.xclient.data.l[1] = _glfwWin.wmStateFullscreen;- event.xclient.data.l[2] = 0; // No secondary property- event.xclient.data.l[3] = 1; // Sender is a normal application-- XSendEvent( _glfwLibrary.display,- _glfwWin.root,- False,- SubstructureNotifyMask | SubstructureRedirectMask,- &event );- }-- if( _glfwWin.mouseLock )- {- _glfwPlatformShowMouseCursor();- }-}--//========================================================================-// Get and process next X event (called by _glfwPlatformPollEvents)-// Returns GL_TRUE if a window close request was received-//========================================================================--static GLboolean processSingleEvent( void )-{- XEvent event;- XNextEvent( _glfwLibrary.display, &event );-- switch( event.type )- {- case KeyPress:- {- // A keyboard key was pressed-- // Translate and report key press- _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_PRESS );-- // Translate and report character input- if( _glfwWin.charCallback )- {- _glfwInputChar( translateChar( &event.xkey ), GLFW_PRESS );- }- break;- }-- case KeyRelease:- {- // A keyboard key was released-- // Do not report key releases for key repeats. For key repeats we- // will get KeyRelease/KeyPress pairs with similar or identical- // time stamps. User selected key repeat filtering is handled in- // _glfwInputKey()/_glfwInputChar().- if( XEventsQueued( _glfwLibrary.display, QueuedAfterReading ) )- {- XEvent nextEvent;- XPeekEvent( _glfwLibrary.display, &nextEvent );-- if( nextEvent.type == KeyPress &&- nextEvent.xkey.window == event.xkey.window &&- nextEvent.xkey.keycode == event.xkey.keycode )- {- // This last check is a hack to work around key repeats- // leaking through due to some sort of time drift- // Toshiyuki Takahashi can press a button 16 times per- // second so it's fairly safe to assume that no human is- // pressing the key 50 times per second (value is ms)- if( ( nextEvent.xkey.time - event.xkey.time ) < 20 )- {- // Do not report anything for this event- break;- }- }- }-- // Translate and report key release- _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_RELEASE );-- // Translate and report character input- if( _glfwWin.charCallback )- {- _glfwInputChar( translateChar( &event.xkey ), GLFW_RELEASE );- }- break;- }-- case ButtonPress:- {- // A mouse button was pressed or a scrolling event occurred-- if( event.xbutton.button == Button1 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );- }- else if( event.xbutton.button == Button2 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );- }- else if( event.xbutton.button == Button3 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );- }-- // XFree86 3.3.2 and later translates mouse wheel up/down into- // mouse button 4 & 5 presses- else if( event.xbutton.button == Button4 )- {- _glfwInput.WheelPos++; // To verify: is this up or down?- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }- }- else if( event.xbutton.button == Button5 )- {- _glfwInput.WheelPos--;- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }- }- break;- }-- case ButtonRelease:- {- // A mouse button was released-- if( event.xbutton.button == Button1 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT,- GLFW_RELEASE );- }- else if( event.xbutton.button == Button2 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE,- GLFW_RELEASE );- }- else if( event.xbutton.button == Button3 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT,- GLFW_RELEASE );- }- break;- }-- case MotionNotify:- {- // The mouse cursor was moved-- if( event.xmotion.x != _glfwInput.CursorPosX ||- event.xmotion.y != _glfwInput.CursorPosY )- {- // The mouse cursor was moved and we didn't do it-- if( _glfwWin.mouseLock )- {- if( _glfwWin.pointerHidden )- {- _glfwInput.MousePosX += event.xmotion.x -- _glfwInput.CursorPosX;- _glfwInput.MousePosY += event.xmotion.y -- _glfwInput.CursorPosY;- }- }- else- {- _glfwInput.MousePosX = event.xmotion.x;- _glfwInput.MousePosY = event.xmotion.y;- }-- _glfwInput.CursorPosX = event.xmotion.x;- _glfwInput.CursorPosY = event.xmotion.y;- _glfwInput.MouseMoved = GL_TRUE;-- if( _glfwWin.mousePosCallback )- {- _glfwWin.mousePosCallback( _glfwInput.MousePosX,- _glfwInput.MousePosY );- }- }- break;- }-- case ConfigureNotify:- {- if( event.xconfigure.width != _glfwWin.width ||- event.xconfigure.height != _glfwWin.height )- {- // The window was resized-- _glfwWin.width = event.xconfigure.width;- _glfwWin.height = event.xconfigure.height;- if( _glfwWin.windowSizeCallback )- {- _glfwWin.windowSizeCallback( _glfwWin.width,- _glfwWin.height );- }- }- break;- }-- case ClientMessage:- {- if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmDeleteWindow )- {- // The window manager was asked to close the window, for example by- // the user pressing a 'close' window decoration button-- return GL_TRUE;- }- else if( _glfwWin.wmPing != None &&- (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmPing )- {- // The window manager is pinging us to make sure we are still- // responding to events-- event.xclient.window = _glfwWin.root;- XSendEvent( _glfwLibrary.display,- event.xclient.window,- False,- SubstructureNotifyMask | SubstructureRedirectMask,- &event );- }-- break;- }-- case MapNotify:- {- // The window was mapped-- _glfwWin.iconified = GL_FALSE;- break;- }-- case UnmapNotify:- {- // The window was unmapped-- _glfwWin.iconified = GL_TRUE;- break;- }-- case FocusIn:- {- // The window gained focus-- _glfwWin.active = GL_TRUE;-- if( _glfwWin.mouseLock )- {- _glfwPlatformHideMouseCursor();- }-- break;- }-- case FocusOut:- {- // The window lost focus-- _glfwWin.active = GL_FALSE;- _glfwInputDeactivation();-- if( _glfwWin.mouseLock )- {- _glfwPlatformShowMouseCursor();- }-- break;- }-- case Expose:- {- // The window's contents was damaged-- if( _glfwWin.windowRefreshCallback )- {- _glfwWin.windowRefreshCallback();- }- break;- }-- // Was the window destroyed?- case DestroyNotify:- return GL_FALSE;-- default:- {-#if defined( _GLFW_HAS_XRANDR )- switch( event.type - _glfwLibrary.XRandR.eventBase )- {- case RRScreenChangeNotify:- {- // Show XRandR that we really care- XRRUpdateConfiguration( &event );- break;- }- }-#endif- break;- }- }-- // The window was not destroyed- return GL_FALSE;-}----//************************************************************************-//**** Platform implementation functions ****-//************************************************************************--//========================================================================-// Here is where the window is created, and-// the OpenGL rendering context is created-//========================================================================--int _glfwPlatformOpenWindow( int width, int height,- const _GLFWwndconfig* wndconfig,- const _GLFWfbconfig* fbconfig )-{- _GLFWfbconfig closest;-- // Clear platform specific GLFW window state- _glfwWin.visual = (XVisualInfo*)NULL;- _glfwWin.colormap = (Colormap)0;- _glfwWin.context = (GLXContext)NULL;- _glfwWin.window = (Window)0;- _glfwWin.pointerGrabbed = GL_FALSE;- _glfwWin.pointerHidden = GL_FALSE;- _glfwWin.keyboardGrabbed = GL_FALSE;- _glfwWin.overrideRedirect = GL_FALSE;- _glfwWin.FS.modeChanged = GL_FALSE;- _glfwWin.Saver.changed = GL_FALSE;- _glfwWin.refreshRate = wndconfig->refreshRate;- _glfwWin.windowNoResize = wndconfig->windowNoResize;-- _glfwWin.wmDeleteWindow = None;- _glfwWin.wmPing = None;- _glfwWin.wmState = None;- _glfwWin.wmStateFullscreen = None;- _glfwWin.wmActiveWindow = None;-- // As the 2.x API doesn't understand multiple display devices, we hardcode- // this choice and hope for the best- _glfwWin.screen = DefaultScreen( _glfwLibrary.display );- _glfwWin.root = RootWindow( _glfwLibrary.display, _glfwWin.screen );-- // Create the invisible cursor for hidden cursor mode- _glfwWin.cursor = createNULLCursor( _glfwLibrary.display, _glfwWin.root );-- initGLXExtensions();-- // Choose the best available fbconfig- {- unsigned int fbcount;- _GLFWfbconfig *fbconfigs;- const _GLFWfbconfig *result;-- fbconfigs = getFBConfigs( &fbcount );- if( !fbconfigs )- {- return GL_FALSE;- }-- result = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount );- if( !result )- {- free( fbconfigs );- return GL_FALSE;- }-- closest = *result;- free( fbconfigs );- }-- if( !createContext( wndconfig, (GLXFBConfigID) closest.platformID ) )- {- return GL_FALSE;- }-- if( !createWindow( width, height, wndconfig ) )- {- return GL_FALSE;- }-- if( wndconfig->mode == GLFW_FULLSCREEN )- {-#if defined( _GLFW_HAS_XRANDR )- // Request screen change notifications- if( _glfwLibrary.XRandR.available )- {- XRRSelectInput( _glfwLibrary.display,- _glfwWin.window,- RRScreenChangeNotifyMask );- }-#endif- enterFullscreenMode();- }-- // Process the window map event and any other that may have arrived- _glfwPlatformPollEvents();-- // Retrieve and set initial cursor position- {- Window window, root;- int windowX, windowY, rootX, rootY;- unsigned int mask;-- XQueryPointer( _glfwLibrary.display,- _glfwWin.window,- &root,- &window,- &rootX, &rootY,- &windowX, &windowY,- &mask );-- // TODO: Probably check for some corner cases here.-- _glfwInput.MousePosX = windowX;- _glfwInput.MousePosY = windowY;- }-- // Connect the context to the window- glXMakeCurrent( _glfwLibrary.display, _glfwWin.window, _glfwWin.context );-- return GL_TRUE;-}---//========================================================================-// Properly kill the window/video display-//========================================================================--void _glfwPlatformCloseWindow( void )-{- if( _glfwWin.fullscreen )- {- leaveFullscreenMode();- }-- if( _glfwWin.context )- {- // Release and destroy the context- glXMakeCurrent( _glfwLibrary.display, None, NULL );- glXDestroyContext( _glfwLibrary.display, _glfwWin.context );- _glfwWin.context = NULL;- }-- if( _glfwWin.visual )- {- XFree( _glfwWin.visual );- _glfwWin.visual = NULL;- }-- if( _glfwWin.window )- {- XUnmapWindow( _glfwLibrary.display, _glfwWin.window );- XDestroyWindow( _glfwLibrary.display, _glfwWin.window );- _glfwWin.window = (Window) 0;- }-- if( _glfwWin.colormap )- {- XFreeColormap( _glfwLibrary.display, _glfwWin.colormap );- _glfwWin.colormap = (Colormap) 0;- }-- if( _glfwWin.cursor )- {- XFreeCursor( _glfwLibrary.display, _glfwWin.cursor );- _glfwWin.cursor = (Cursor) 0;- }-}---//========================================================================-// Set the window title-//========================================================================--void _glfwPlatformSetWindowTitle( const char *title )-{- // Set window & icon title- XStoreName( _glfwLibrary.display, _glfwWin.window, title );- XSetIconName( _glfwLibrary.display, _glfwWin.window, title );-}---//========================================================================-// Set the window size-//========================================================================--void _glfwPlatformSetWindowSize( int width, int height )-{- int mode = 0, rate, sizeChanged = GL_FALSE;- XSizeHints *sizehints;-- rate = _glfwWin.refreshRate;-- if( _glfwWin.fullscreen )- {- // Get the closest matching video mode for the specified window size- mode = _glfwGetClosestVideoMode( _glfwWin.screen, &width, &height, &rate );- }-- if( _glfwWin.windowNoResize )- {- // Update window size restrictions to match new window size-- sizehints = XAllocSizeHints();- sizehints->flags = 0;-- sizehints->min_width = sizehints->max_width = width;- sizehints->min_height = sizehints->max_height = height;-- XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints );- XFree( sizehints );- }-- // Change window size before changing fullscreen mode?- if( _glfwWin.fullscreen && (width > _glfwWin.width) )- {- XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );- sizeChanged = GL_TRUE;- }-- if( _glfwWin.fullscreen )- {- // Change video mode, keeping current refresh rate- _glfwSetVideoModeMODE( _glfwWin.screen, mode, _glfwWin.refreshRate );- }-- // Set window size (if not already changed)- if( !sizeChanged )- {- XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );- }-}---//========================================================================-// Set the window position.-//========================================================================--void _glfwPlatformSetWindowPos( int x, int y )-{- XMoveWindow( _glfwLibrary.display, _glfwWin.window, x, y );-}---//========================================================================-// Window iconification-//========================================================================--void _glfwPlatformIconifyWindow( void )-{- if( _glfwWin.overrideRedirect )- {- // We can't iconify/restore override-redirect windows, as that's- // performed by the window manager- return;- }-- XIconifyWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.screen );-}---//========================================================================-// Window un-iconification-//========================================================================--void _glfwPlatformRestoreWindow( void )-{- if( _glfwWin.overrideRedirect )- {- // We can't iconify/restore override-redirect windows, as that's- // performed by the window manager- return;- }-- XMapWindow( _glfwLibrary.display, _glfwWin.window );-}---//========================================================================-// Swap OpenGL buffers and poll any new events-//========================================================================--void _glfwPlatformSwapBuffers( void )-{- // Update display-buffer- glXSwapBuffers( _glfwLibrary.display, _glfwWin.window );-}---//========================================================================-// Set double buffering swap interval-//========================================================================--void _glfwPlatformSwapInterval( int interval )-{- if( _glfwWin.has_GLX_SGI_swap_control )- {- _glfwWin.SwapIntervalSGI( interval );- }-}---//========================================================================-// Read back framebuffer parameters from the context-//========================================================================--void _glfwPlatformRefreshWindowParams( void )-{- int dummy;- GLXFBConfig *fbconfig;-#if defined( _GLFW_HAS_XRANDR )- XRRScreenConfiguration *sc;-#elif defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeLine modeline;- int dotclock;- float pixels_per_second, pixels_per_frame;-#endif- int attribs[] = { GLX_FBCONFIG_ID, _glfwWin.fbconfigID, None };-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }- else- {- fbconfig = glXChooseFBConfig( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }-- if( fbconfig == NULL )- {- // This should never ever happen- // TODO: Figure out what to do when this happens- fprintf( stderr, "Cannot find known GLXFBConfig by ID. "- "This cannot happen. Have a nice day.\n");- abort();- }-- // There is no clear definition of an "accelerated" context on X11/GLX, and- // true sounds better than false, so we hardcode true here- _glfwWin.accelerated = GL_TRUE;-- _glfwWin.redBits = getFBConfigAttrib( *fbconfig, GLX_RED_SIZE );- _glfwWin.greenBits = getFBConfigAttrib( *fbconfig, GLX_GREEN_SIZE );- _glfwWin.blueBits = getFBConfigAttrib( *fbconfig, GLX_BLUE_SIZE );-- _glfwWin.alphaBits = getFBConfigAttrib( *fbconfig, GLX_ALPHA_SIZE );- _glfwWin.depthBits = getFBConfigAttrib( *fbconfig, GLX_DEPTH_SIZE );- _glfwWin.stencilBits = getFBConfigAttrib( *fbconfig, GLX_STENCIL_SIZE );-- _glfwWin.accumRedBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_RED_SIZE );- _glfwWin.accumGreenBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_GREEN_SIZE );- _glfwWin.accumBlueBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_BLUE_SIZE );- _glfwWin.accumAlphaBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_ALPHA_SIZE );-- _glfwWin.auxBuffers = getFBConfigAttrib( *fbconfig, GLX_AUX_BUFFERS );- _glfwWin.stereo = getFBConfigAttrib( *fbconfig, GLX_STEREO ) ? 1 : 0;-- // Get FSAA buffer sample count- if( _glfwWin.has_GLX_ARB_multisample )- {- _glfwWin.samples = getFBConfigAttrib( *fbconfig, GLX_SAMPLES );- }- else- {- _glfwWin.samples = 0;- }-- // Default to refresh rate unknown (=0 according to GLFW spec)- _glfwWin.refreshRate = 0;-- // Retrieve refresh rate if possible-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root );- _glfwWin.refreshRate = XRRConfigCurrentRate( sc );- XRRFreeScreenConfigInfo( sc );- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- if( _glfwLibrary.XF86VidMode.available )- {- // Use the XF86VidMode extension to get current video mode- XF86VidModeGetModeLine( _glfwLibrary.display, _glfwWin.screen,- &dotclock, &modeline );- pixels_per_second = 1000.0f * (float) dotclock;- pixels_per_frame = (float) modeline.htotal * modeline.vtotal;- _glfwWin.refreshRate = (int)(pixels_per_second/pixels_per_frame+0.5);- }-#endif-- XFree( fbconfig );-}---//========================================================================-// Poll for new window and input events-//========================================================================--void _glfwPlatformPollEvents( void )-{- GLboolean closeRequested = GL_FALSE;-- // Flag that the cursor has not moved- _glfwInput.MouseMoved = GL_FALSE;-- // Process all pending events- while( XPending( _glfwLibrary.display ) )- {- if( processSingleEvent() )- {- closeRequested = GL_TRUE;- }- }-- // Did we get mouse movement in fully enabled hidden cursor mode?- if( _glfwInput.MouseMoved && _glfwWin.pointerHidden )- {- _glfwPlatformSetMouseCursorPos( _glfwWin.width/2,- _glfwWin.height/2 );- }-- if( closeRequested && _glfwWin.windowCloseCallback )- {- closeRequested = _glfwWin.windowCloseCallback();- }- if( closeRequested )- {- glfwCloseWindow();- }-}---//========================================================================-// Wait for new window and input events-//========================================================================--void _glfwPlatformWaitEvents( void )-{- XEvent event;-- // Block waiting for an event to arrive- XNextEvent( _glfwLibrary.display, &event );- XPutBackEvent( _glfwLibrary.display, &event );-- _glfwPlatformPollEvents();-}---//========================================================================-// Hide mouse cursor (lock it)-//========================================================================--void _glfwPlatformHideMouseCursor( void )-{- // Hide cursor- if( !_glfwWin.pointerHidden )- {- XDefineCursor( _glfwLibrary.display, _glfwWin.window, _glfwWin.cursor );- _glfwWin.pointerHidden = GL_TRUE;- }-- // Grab cursor to user window- if( !_glfwWin.pointerGrabbed )- {- if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,- ButtonPressMask | ButtonReleaseMask |- PointerMotionMask, GrabModeAsync, GrabModeAsync,- _glfwWin.window, None, CurrentTime ) ==- GrabSuccess )- {- _glfwWin.pointerGrabbed = GL_TRUE;- }- }-}---//========================================================================-// Show mouse cursor (unlock it)-//========================================================================--void _glfwPlatformShowMouseCursor( void )-{- // Un-grab cursor (only in windowed mode: in fullscreen mode we still- // want the mouse grabbed in order to confine the cursor to the window- // area)- if( _glfwWin.pointerGrabbed )- {- XUngrabPointer( _glfwLibrary.display, CurrentTime );- _glfwWin.pointerGrabbed = GL_FALSE;- }-- // Show cursor- if( _glfwWin.pointerHidden )- {- XUndefineCursor( _glfwLibrary.display, _glfwWin.window );- _glfwWin.pointerHidden = GL_FALSE;- }-}---//========================================================================-// Set physical mouse cursor position-//========================================================================--void _glfwPlatformSetMouseCursorPos( int x, int y )-{- // Store the new position so we can recognise it later- _glfwInput.CursorPosX = x;- _glfwInput.CursorPosY = y;-- XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, x, y );-}-
− src/Graphics/UI/GLFW.hsc
@@ -1,1087 +0,0 @@-{-# LANGUAGE ForeignFunctionInterface #-}-{-# LANGUAGE MultiParamTypeClasses #-}--module Graphics.UI.GLFW- ( -- * Initialization and termination- initialize- , terminate-- -- * Video mode information- , getVideoMode- , getVideoModes- --- , VideoMode(..)-- -- * OpenGL context- , OpenGLProfile(..)- -- ** Information- , openGLContextIsForwardCompatible- , openGLContextIsDebugContext- , openGLProfile-- -- * Windows- -- ** Management- , openWindow- , closeWindow- , setWindowTitle- , setWindowDimensions- , setWindowPosition- , iconifyWindow- , restoreWindow- , swapBuffers- , setWindowBufferSwapInterval- --- , DisplayMode(..)- , DisplayOptions(..)- , defaultDisplayOptions- -- ** Information- , windowIsOpen- , windowIsActive- , windowIsIconified- , windowIsResizable- , windowIsHardwareAccelerated- , windowSupportsStereoRendering- , getWindowRefreshRate- , getWindowDimensions- , getWindowValue- , setWindowCloseCallback- , setWindowSizeCallback- , setWindowRefreshCallback- --- , WindowValue(..)- , WindowCloseCallback- , WindowSizeCallback- , WindowRefreshCallback-- -- * Input- , pollEvents- , waitEvents- , enableAutoPoll- , enableKeyRepeat- , disableKeyRepeat- , disableAutoPoll- -- ** Keyboard- , keyIsPressed- , setCharCallback- , setKeyCallback- --- , Key(..)- , CharCallback- , KeyCallback- -- ** Mouse- , mouseButtonIsPressed- , getMousePosition- , getMouseWheel- , setMousePosition- , setMouseWheel- , setMouseButtonCallback- , setMousePositionCallback- , setMouseWheelCallback- , enableMouseCursor- , disableMouseCursor- --- , MouseButton(..)- , MouseButtonCallback- , MousePositionCallback- , MouseWheelCallback- -- ** Joystick- , joystickIsPresent- , getJoystickPosition- , getNumJoystickAxes- , getNumJoystickButtons- , joystickButtonsArePressed- --- , Joystick(..)-- -- * Time- , getTime- , setTime- , resetTime- , sleep-- -- * Version information- , getGlfwVersion- , getGlVersion- ) where---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----import Control.Monad (when)-import Data.Char (chr, ord)-import Data.IORef (IORef, atomicModifyIORef, newIORef)-import Data.Maybe (fromJust, isJust)-import Data.Version (Version(..))-import Foreign.C.String (CString, withCString)-import Foreign.C.Types (CDouble(..), CFloat(..), CInt(..), CUChar(..))-import Foreign.Marshal.Alloc (alloca)-import Foreign.Marshal.Array (allocaArray, peekArray)-import Foreign.Ptr (FunPtr, Ptr, freeHaskellFunPtr)-import Foreign.Storable (Storable(..))-import System.IO.Unsafe (unsafePerformIO)---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----#include <GL/glfw.h>--foreign import ccall glfwInit :: IO CInt-foreign import ccall glfwTerminate :: IO ()-foreign import ccall glfwGetVersion :: Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()--foreign import ccall glfwOpenWindow :: CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt-foreign import ccall glfwOpenWindowHint :: CInt -> CInt -> IO ()-foreign import ccall glfwCloseWindow :: IO ()-foreign import ccall glfwSetWindowCloseCallback :: FunPtr GlfwWindowCloseCallback -> IO ()-foreign import ccall glfwSetWindowTitle :: CString -> IO ()-foreign import ccall glfwSetWindowSize :: CInt -> CInt -> IO ()-foreign import ccall glfwSetWindowPos :: CInt -> CInt -> IO ()-foreign import ccall glfwGetWindowSize :: Ptr CInt -> Ptr CInt -> IO ()-foreign import ccall glfwSetWindowSizeCallback :: FunPtr GlfwWindowSizeCallback -> IO ()-foreign import ccall glfwIconifyWindow :: IO ()-foreign import ccall glfwRestoreWindow :: IO ()-foreign import ccall glfwGetWindowParam :: CInt -> IO CInt-foreign import ccall glfwSwapBuffers :: IO ()-foreign import ccall glfwSwapInterval :: CInt -> IO ()-foreign import ccall glfwSetWindowRefreshCallback :: FunPtr GlfwWindowRefreshCallback -> IO ()--foreign import ccall glfwGetVideoModes :: Ptr VideoMode -> CInt -> IO CInt-foreign import ccall glfwGetDesktopMode :: Ptr VideoMode -> IO ()--foreign import ccall glfwPollEvents :: IO ()-foreign import ccall glfwWaitEvents :: IO ()-foreign import ccall glfwGetKey :: CInt -> IO CInt-foreign import ccall glfwGetMouseButton :: CInt -> IO CInt-foreign import ccall glfwGetMousePos :: Ptr CInt -> Ptr CInt -> IO ()-foreign import ccall glfwSetMousePos :: CInt -> CInt -> IO ()-foreign import ccall glfwGetMouseWheel :: IO CInt-foreign import ccall glfwSetMouseWheel :: CInt -> IO ()-foreign import ccall glfwSetKeyCallback :: FunPtr GlfwKeyCallback -> IO ()-foreign import ccall glfwSetCharCallback :: FunPtr GlfwCharCallback -> IO ()-foreign import ccall glfwSetMouseButtonCallback :: FunPtr GlfwMouseButtonCallback -> IO ()-foreign import ccall glfwSetMousePosCallback :: FunPtr GlfwMousePositionCallback -> IO ()-foreign import ccall glfwSetMouseWheelCallback :: FunPtr GlfwMouseWheelCallback -> IO ()-foreign import ccall glfwGetJoystickParam :: CInt -> CInt -> IO CInt-foreign import ccall glfwGetJoystickPos :: CInt -> Ptr CFloat -> CInt -> IO CInt-foreign import ccall glfwGetJoystickButtons :: CInt -> Ptr CUChar -> CInt -> IO CInt--foreign import ccall glfwGetTime :: IO CDouble-foreign import ccall glfwSetTime :: CDouble -> IO ()-foreign import ccall glfwSleep :: CDouble -> IO ()--foreign import ccall glfwGetGLVersion :: Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()--foreign import ccall glfwEnable :: CInt -> IO ()-foreign import ccall glfwDisable :: CInt -> IO ()--type GlfwCharCallback = CInt -> CInt -> IO ()-type GlfwKeyCallback = CInt -> CInt -> IO ()-type GlfwMouseButtonCallback = CInt -> CInt -> IO ()-type GlfwMousePositionCallback = CInt -> CInt -> IO ()-type GlfwMouseWheelCallback = CInt -> IO ()-type GlfwWindowCloseCallback = IO CInt-type GlfwWindowRefreshCallback = IO ()-type GlfwWindowSizeCallback = CInt -> CInt -> IO ()--type CharCallback = Char -> Bool -> IO ()-type KeyCallback = Key -> Bool -> IO ()-type MouseButtonCallback = MouseButton -> Bool -> IO ()-type MousePositionCallback = Int -> Int -> IO ()-type MouseWheelCallback = Int -> IO ()-type WindowCloseCallback = IO Bool-type WindowRefreshCallback = IO ()-type WindowSizeCallback = Int -> Int -> IO ()--foreign import ccall "wrapper" wrapCharCallback :: GlfwCharCallback -> IO (FunPtr GlfwCharCallback)-foreign import ccall "wrapper" wrapKeyCallback :: GlfwKeyCallback -> IO (FunPtr GlfwKeyCallback)-foreign import ccall "wrapper" wrapMouseButtonCallback :: GlfwMouseButtonCallback -> IO (FunPtr GlfwMouseButtonCallback)-foreign import ccall "wrapper" wrapMousePositionCallback :: GlfwMousePositionCallback -> IO (FunPtr GlfwMousePositionCallback)-foreign import ccall "wrapper" wrapMouseWheelCallback :: GlfwMouseWheelCallback -> IO (FunPtr GlfwMouseWheelCallback)-foreign import ccall "wrapper" wrapWindowCloseCallback :: GlfwWindowCloseCallback -> IO (FunPtr GlfwWindowCloseCallback)-foreign import ccall "wrapper" wrapWindowRefreshCallback :: GlfwWindowRefreshCallback -> IO (FunPtr GlfwWindowRefreshCallback)-foreign import ccall "wrapper" wrapWindowSizeCallback :: GlfwWindowSizeCallback -> IO (FunPtr GlfwWindowSizeCallback)---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Initialization and termination--initialize :: IO Bool-initialize =- fromC `fmap` glfwInit--terminate :: IO ()-terminate =- glfwTerminate---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Video mode information--getVideoMode :: IO VideoMode-getVideoMode =- alloca $ \ptr -> do- glfwGetDesktopMode ptr- peek ptr--getVideoModes :: IO [VideoMode]-getVideoModes =- allocaArray m $ \ptr -> do- n <- glfwGetVideoModes ptr (toC m)- peekArray (fromC n) ptr- where- m = 256---- -- -- -- -- -- -- -- -- ----data VideoMode = VideoMode- { videoMode_width :: Int- , videoMode_height :: Int- , videoMode_numRedBits :: Int- , videoMode_numGreenBits :: Int- , videoMode_numBlueBits :: Int- } deriving (Eq, Ord, Read, Show)--instance Storable VideoMode where- sizeOf _ = (#const sizeof(GLFWvidmode))- alignment _ = alignment (undefined :: CInt)-- peek ptr = do- w <- (#peek GLFWvidmode, Width) ptr :: IO CInt- h <- (#peek GLFWvidmode, Height) ptr :: IO CInt- r <- (#peek GLFWvidmode, RedBits) ptr :: IO CInt- g <- (#peek GLFWvidmode, GreenBits) ptr :: IO CInt- b <- (#peek GLFWvidmode, BlueBits) ptr :: IO CInt- return VideoMode- { videoMode_width = fromC w- , videoMode_height = fromC h- , videoMode_numRedBits = fromC r- , videoMode_numGreenBits = fromC g- , videoMode_numBlueBits = fromC b- }---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- OpenGL context--data OpenGLProfile- = DefaultProfile- | CoreProfile- | CompatibilityProfile- deriving (Eq, Ord, Bounded, Enum, Read, Show)--instance C OpenGLProfile CInt where- toC op = case op of- DefaultProfile -> 0- CoreProfile -> #const GLFW_OPENGL_CORE_PROFILE- CompatibilityProfile -> #const GLFW_OPENGL_COMPAT_PROFILE- fromC i = case i of- (#const GLFW_OPENGL_CORE_PROFILE) -> CoreProfile- (#const GLFW_OPENGL_COMPAT_PROFILE) -> CompatibilityProfile- (0) -> DefaultProfile- _ -> makeFromCError "OpenGLProfile" i---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- OpenGL information--openGLContextIsForwardCompatible :: IO Bool-openGLContextIsForwardCompatible =- fromC `fmap` glfwGetWindowParam (#const GLFW_OPENGL_FORWARD_COMPAT)--openGLContextIsDebugContext :: IO Bool-openGLContextIsDebugContext =- fromC `fmap` glfwGetWindowParam (#const GLFW_OPENGL_DEBUG_CONTEXT)--openGLProfile :: IO OpenGLProfile-openGLProfile =- fromC `fmap` glfwGetWindowParam (#const GLFW_OPENGL_PROFILE)---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Window management--openWindow :: DisplayOptions -> IO Bool-openWindow displayOptions = do- let DisplayOptions- { displayOptions_width = _displayOptions_width- , displayOptions_height = _displayOptions_height- , displayOptions_numRedBits = _displayOptions_numRedBits- , displayOptions_numGreenBits = _displayOptions_numGreenBits- , displayOptions_numBlueBits = _displayOptions_numBlueBits- , displayOptions_numAlphaBits = _displayOptions_numAlphaBits- , displayOptions_numDepthBits = _displayOptions_numDepthBits- , displayOptions_numStencilBits = _displayOptions_numStencilBits- , displayOptions_displayMode = _displayOptions_displayMode- , displayOptions_refreshRate = _displayOptions_refreshRate- , displayOptions_accumNumRedBits = _displayOptions_accumNumRedBits- , displayOptions_accumNumGreenBits = _displayOptions_accumNumGreenBits- , displayOptions_accumNumBlueBits = _displayOptions_accumNumBlueBits- , displayOptions_accumNumAlphaBits = _displayOptions_accumNumAlphaBits- , displayOptions_numAuxiliaryBuffers = _displayOptions_numAuxiliaryBuffers- , displayOptions_numFsaaSamples = _displayOptions_numFsaaSamples- , displayOptions_windowIsResizable = _displayOptions_windowIsResizable- , displayOptions_stereoRendering = _displayOptions_stereoRendering- , displayOptions_openGLVersion = _displayOptions_openGLVersion- , displayOptions_openGLForwardCompatible = _displayOptions_openGLForwardCompatible- , displayOptions_openGLDebugContext = _displayOptions_openGLDebugContext- , displayOptions_openGLProfile = _displayOptions_openGLProfile- } = displayOptions-- -- Add hints.- when (isJust _displayOptions_refreshRate) $ glfwOpenWindowHint (#const GLFW_REFRESH_RATE) (toC (fromJust _displayOptions_refreshRate))- when (isJust _displayOptions_accumNumRedBits) $ glfwOpenWindowHint (#const GLFW_ACCUM_RED_BITS) (toC (fromJust _displayOptions_accumNumRedBits))- when (isJust _displayOptions_accumNumGreenBits) $ glfwOpenWindowHint (#const GLFW_ACCUM_GREEN_BITS) (toC (fromJust _displayOptions_accumNumGreenBits))- when (isJust _displayOptions_accumNumBlueBits) $ glfwOpenWindowHint (#const GLFW_ACCUM_BLUE_BITS) (toC (fromJust _displayOptions_accumNumBlueBits))- when (isJust _displayOptions_accumNumAlphaBits) $ glfwOpenWindowHint (#const GLFW_ACCUM_ALPHA_BITS) (toC (fromJust _displayOptions_accumNumAlphaBits))- when (isJust _displayOptions_numAuxiliaryBuffers) $ glfwOpenWindowHint (#const GLFW_AUX_BUFFERS) (toC (fromJust _displayOptions_numAuxiliaryBuffers))- when (isJust _displayOptions_numFsaaSamples) $ glfwOpenWindowHint (#const GLFW_FSAA_SAMPLES) (toC (fromJust _displayOptions_numFsaaSamples))-- glfwOpenWindowHint (#const GLFW_WINDOW_NO_RESIZE) (toC (not _displayOptions_windowIsResizable))- glfwOpenWindowHint (#const GLFW_STEREO) (toC _displayOptions_stereoRendering)- glfwOpenWindowHint (#const GLFW_OPENGL_VERSION_MAJOR) (toC (fst _displayOptions_openGLVersion))- glfwOpenWindowHint (#const GLFW_OPENGL_VERSION_MINOR) (toC (snd _displayOptions_openGLVersion))- glfwOpenWindowHint (#const GLFW_OPENGL_FORWARD_COMPAT) (toC _displayOptions_openGLForwardCompatible)- glfwOpenWindowHint (#const GLFW_OPENGL_DEBUG_CONTEXT) (toC _displayOptions_openGLDebugContext)- glfwOpenWindowHint (#const GLFW_OPENGL_PROFILE) (toC _displayOptions_openGLProfile)-- -- Open the window.- fromC `fmap` glfwOpenWindow- (toC _displayOptions_width)- (toC _displayOptions_height)- (toC _displayOptions_numRedBits)- (toC _displayOptions_numGreenBits)- (toC _displayOptions_numBlueBits)- (toC _displayOptions_numAlphaBits)- (toC _displayOptions_numDepthBits)- (toC _displayOptions_numStencilBits)- (toC _displayOptions_displayMode)--closeWindow :: IO ()-closeWindow =- glfwCloseWindow--setWindowTitle :: String -> IO ()-setWindowTitle t =- withCString t glfwSetWindowTitle--setWindowDimensions :: Int -> Int -> IO ()-setWindowDimensions w h =- glfwSetWindowSize (toC w) (toC h)--setWindowPosition :: Int -> Int -> IO ()-setWindowPosition w h =- glfwSetWindowPos (toC w) (toC h)--iconifyWindow :: IO ()-iconifyWindow =- glfwIconifyWindow--restoreWindow :: IO ()-restoreWindow =- glfwRestoreWindow--swapBuffers :: IO ()-swapBuffers =- glfwSwapBuffers--setWindowBufferSwapInterval :: Int -> IO ()-setWindowBufferSwapInterval =- glfwSwapInterval . toC---- -- -- -- -- -- -- -- -- ----data DisplayMode- = Window- | Fullscreen- deriving (Eq, Ord, Bounded, Enum, Read, Show)--instance C DisplayMode CInt where- toC dm = case dm of- Window -> #const GLFW_WINDOW- Fullscreen -> #const GLFW_FULLSCREEN-- fromC i = case i of- (#const GLFW_WINDOW ) -> Window- (#const GLFW_FULLSCREEN) -> Fullscreen- _ -> makeFromCError "DisplayMode" i---- -- -- -- -- -- -- -- -- ----data DisplayOptions = DisplayOptions- { displayOptions_width :: Int- , displayOptions_height :: Int- , displayOptions_numRedBits :: Int- , displayOptions_numGreenBits :: Int- , displayOptions_numBlueBits :: Int- , displayOptions_numAlphaBits :: Int- , displayOptions_numDepthBits :: Int- , displayOptions_numStencilBits :: Int- , displayOptions_displayMode :: DisplayMode- , displayOptions_refreshRate :: Maybe Int- , displayOptions_accumNumRedBits :: Maybe Int- , displayOptions_accumNumGreenBits :: Maybe Int- , displayOptions_accumNumBlueBits :: Maybe Int- , displayOptions_accumNumAlphaBits :: Maybe Int- , displayOptions_numAuxiliaryBuffers :: Maybe Int- , displayOptions_numFsaaSamples :: Maybe Int- , displayOptions_windowIsResizable :: Bool- , displayOptions_stereoRendering :: Bool- , displayOptions_openGLVersion :: (Int, Int)- , displayOptions_openGLForwardCompatible :: Bool- , displayOptions_openGLDebugContext :: Bool- , displayOptions_openGLProfile :: OpenGLProfile-- } deriving (Eq, Ord, Read, Show)--defaultDisplayOptions :: DisplayOptions-defaultDisplayOptions =- DisplayOptions- { displayOptions_width = 0- , displayOptions_height = 0- , displayOptions_numRedBits = 0- , displayOptions_numGreenBits = 0- , displayOptions_numBlueBits = 0- , displayOptions_numAlphaBits = 0- , displayOptions_numDepthBits = 0- , displayOptions_numStencilBits = 0- , displayOptions_displayMode = Window- , displayOptions_refreshRate = Nothing- , displayOptions_accumNumRedBits = Nothing- , displayOptions_accumNumGreenBits = Nothing- , displayOptions_accumNumBlueBits = Nothing- , displayOptions_accumNumAlphaBits = Nothing- , displayOptions_numAuxiliaryBuffers = Nothing- , displayOptions_numFsaaSamples = Nothing- , displayOptions_windowIsResizable = True- , displayOptions_stereoRendering = False- , displayOptions_openGLVersion = (1,1)- , displayOptions_openGLForwardCompatible = False- , displayOptions_openGLDebugContext = False- , displayOptions_openGLProfile = DefaultProfile- }---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Window information--windowIsOpen :: IO Bool-windowIsOpen =- fromC `fmap` glfwGetWindowParam (#const GLFW_OPENED)--windowIsActive :: IO Bool-windowIsActive =- fromC `fmap` glfwGetWindowParam (#const GLFW_ACTIVE)--windowIsIconified :: IO Bool-windowIsIconified =- fromC `fmap` glfwGetWindowParam (#const GLFW_ICONIFIED)--windowIsResizable :: IO Bool-windowIsResizable =- (not . fromC) `fmap` glfwGetWindowParam (#const GLFW_WINDOW_NO_RESIZE)--windowIsHardwareAccelerated :: IO Bool-windowIsHardwareAccelerated =- fromC `fmap` glfwGetWindowParam (#const GLFW_ACCELERATED)--windowSupportsStereoRendering :: IO Bool-windowSupportsStereoRendering =- fromC `fmap` glfwGetWindowParam (#const GLFW_STEREO)--getWindowRefreshRate :: IO Int-getWindowRefreshRate =- fromC `fmap` glfwGetWindowParam (#const GLFW_REFRESH_RATE)--getWindowDimensions :: IO (Int, Int)-getWindowDimensions =- alloca $ \wp ->- alloca $ \hp -> do- glfwGetWindowSize wp hp- w <- peek wp- h <- peek hp- return (fromC w, fromC h)--getWindowValue :: WindowValue -> IO Int-getWindowValue wn =- fromC `fmap` glfwGetWindowParam (toC wn)--setWindowCloseCallback :: WindowCloseCallback -> IO ()-setWindowCloseCallback cb = do- ccb <- wrapWindowCloseCallback (toC `fmap` cb)- glfwSetWindowCloseCallback ccb- storeCallback windowCloseCallback ccb--setWindowSizeCallback :: WindowSizeCallback -> IO ()-setWindowSizeCallback cb = do- ccb <- wrapWindowSizeCallback (\w h -> cb (fromC w) (fromC h))- glfwSetWindowSizeCallback ccb- storeCallback windowSizeCallback ccb--setWindowRefreshCallback :: WindowRefreshCallback -> IO ()-setWindowRefreshCallback cb = do- ccb <- wrapWindowRefreshCallback cb- glfwSetWindowRefreshCallback ccb- storeCallback windowRefreshCallback ccb---- -- -- -- -- -- -- -- -- ----data WindowValue- = NumRedBits- | NumGreenBits- | NumBlueBits- | NumAlphaBits- | NumDepthBits- | NumStencilBits- | NumAccumRedBits- | NumAccumGreenBits- | NumAccumBlueBits- | NumAccumAlphaBits- | NumAuxBuffers- | NumFsaaSamples- deriving (Eq, Ord, Bounded, Enum, Read, Show)--instance C WindowValue CInt where- toC wn = case wn of- NumRedBits -> #const GLFW_RED_BITS- NumGreenBits -> #const GLFW_GREEN_BITS- NumBlueBits -> #const GLFW_BLUE_BITS- NumAlphaBits -> #const GLFW_ALPHA_BITS- NumDepthBits -> #const GLFW_DEPTH_BITS- NumStencilBits -> #const GLFW_STENCIL_BITS- NumAccumRedBits -> #const GLFW_ACCUM_RED_BITS- NumAccumGreenBits -> #const GLFW_ACCUM_GREEN_BITS- NumAccumBlueBits -> #const GLFW_ACCUM_BLUE_BITS- NumAccumAlphaBits -> #const GLFW_ACCUM_ALPHA_BITS- NumAuxBuffers -> #const GLFW_AUX_BUFFERS- NumFsaaSamples -> #const GLFW_FSAA_SAMPLES---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Input--pollEvents :: IO ()-pollEvents =- glfwPollEvents--waitEvents :: IO ()-waitEvents =- glfwWaitEvents---- Make 'swapBuffers' implicitly call 'pollEvents' (Default)-enableAutoPoll :: IO ()-enableAutoPoll = glfwEnable (#const GLFW_AUTO_POLL_EVENTS)---- Disable 'swapBuffers' implicitly calling 'pollEvents'-disableAutoPoll :: IO ()-disableAutoPoll = glfwDisable (#const GLFW_AUTO_POLL_EVENTS)--enableKeyRepeat :: IO ()-enableKeyRepeat = glfwEnable (#const GLFW_KEY_REPEAT)--disableKeyRepeat :: IO ()-disableKeyRepeat = glfwDisable (#const GLFW_KEY_REPEAT)---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Keyboard--keyIsPressed :: Key -> IO Bool-keyIsPressed k =- fromC `fmap` glfwGetKey (toC k)--setCharCallback :: CharCallback -> IO ()-setCharCallback cb = do- ccb <- wrapCharCallback (\c b -> cb (fromC c) (fromC b))- glfwSetCharCallback ccb- storeCallback charCallback ccb--setKeyCallback :: KeyCallback -> IO ()-setKeyCallback cb = do- ccb <- wrapKeyCallback (\k b -> cb (fromC k) (fromC b))- glfwSetKeyCallback ccb- storeCallback keyCallback ccb---- -- -- -- -- -- -- -- -- ----data Key- = CharKey Char- | KeyUnknown- | KeySpace- | KeySpecial- | KeyEsc- | KeyF1- | KeyF2- | KeyF3- | KeyF4- | KeyF5- | KeyF6- | KeyF7- | KeyF8- | KeyF9- | KeyF10- | KeyF11- | KeyF12- | KeyF13- | KeyF14- | KeyF15- | KeyF16- | KeyF17- | KeyF18- | KeyF19- | KeyF20- | KeyF21- | KeyF22- | KeyF23- | KeyF24- | KeyF25- | KeyUp- | KeyDown- | KeyLeft- | KeyRight- | KeyLeftShift- | KeyRightShift- | KeyLeftCtrl- | KeyRightCtrl- | KeyLeftAlt- | KeyRightAlt- | KeyTab- | KeyEnter- | KeyBackspace- | KeyInsert- | KeyDel- | KeyPageup- | KeyPagedown- | KeyHome- | KeyEnd- | KeyPad0- | KeyPad1- | KeyPad2- | KeyPad3- | KeyPad4- | KeyPad5- | KeyPad6- | KeyPad7- | KeyPad8- | KeyPad9- | KeyPadDivide- | KeyPadMultiply- | KeyPadSubtract- | KeyPadAdd- | KeyPadDecimal- | KeyPadEqual- | KeyPadEnter- deriving (Eq, Ord, Read, Show)--instance C Key CInt where- toC k = case k of- CharKey c -> fromIntegral (ord c)- KeyUnknown -> #const GLFW_KEY_UNKNOWN- KeySpace -> #const GLFW_KEY_SPACE- KeySpecial -> #const GLFW_KEY_SPECIAL- KeyEsc -> #const GLFW_KEY_ESC- KeyF1 -> #const GLFW_KEY_F1- KeyF2 -> #const GLFW_KEY_F2- KeyF3 -> #const GLFW_KEY_F3- KeyF4 -> #const GLFW_KEY_F4- KeyF5 -> #const GLFW_KEY_F5- KeyF6 -> #const GLFW_KEY_F6- KeyF7 -> #const GLFW_KEY_F7- KeyF8 -> #const GLFW_KEY_F8- KeyF9 -> #const GLFW_KEY_F9- KeyF10 -> #const GLFW_KEY_F10- KeyF11 -> #const GLFW_KEY_F11- KeyF12 -> #const GLFW_KEY_F12- KeyF13 -> #const GLFW_KEY_F13- KeyF14 -> #const GLFW_KEY_F14- KeyF15 -> #const GLFW_KEY_F15- KeyF16 -> #const GLFW_KEY_F16- KeyF17 -> #const GLFW_KEY_F17- KeyF18 -> #const GLFW_KEY_F18- KeyF19 -> #const GLFW_KEY_F19- KeyF20 -> #const GLFW_KEY_F20- KeyF21 -> #const GLFW_KEY_F21- KeyF22 -> #const GLFW_KEY_F22- KeyF23 -> #const GLFW_KEY_F23- KeyF24 -> #const GLFW_KEY_F24- KeyF25 -> #const GLFW_KEY_F25- KeyUp -> #const GLFW_KEY_UP- KeyDown -> #const GLFW_KEY_DOWN- KeyLeft -> #const GLFW_KEY_LEFT- KeyRight -> #const GLFW_KEY_RIGHT- KeyLeftShift -> #const GLFW_KEY_LSHIFT- KeyRightShift -> #const GLFW_KEY_RSHIFT- KeyLeftCtrl -> #const GLFW_KEY_LCTRL- KeyRightCtrl -> #const GLFW_KEY_RCTRL- KeyLeftAlt -> #const GLFW_KEY_LALT- KeyRightAlt -> #const GLFW_KEY_RALT- KeyTab -> #const GLFW_KEY_TAB- KeyEnter -> #const GLFW_KEY_ENTER- KeyBackspace -> #const GLFW_KEY_BACKSPACE- KeyInsert -> #const GLFW_KEY_INSERT- KeyDel -> #const GLFW_KEY_DEL- KeyPageup -> #const GLFW_KEY_PAGEUP- KeyPagedown -> #const GLFW_KEY_PAGEDOWN- KeyHome -> #const GLFW_KEY_HOME- KeyEnd -> #const GLFW_KEY_END- KeyPad0 -> #const GLFW_KEY_KP_0- KeyPad1 -> #const GLFW_KEY_KP_1- KeyPad2 -> #const GLFW_KEY_KP_2- KeyPad3 -> #const GLFW_KEY_KP_3- KeyPad4 -> #const GLFW_KEY_KP_4- KeyPad5 -> #const GLFW_KEY_KP_5- KeyPad6 -> #const GLFW_KEY_KP_6- KeyPad7 -> #const GLFW_KEY_KP_7- KeyPad8 -> #const GLFW_KEY_KP_8- KeyPad9 -> #const GLFW_KEY_KP_9- KeyPadDivide -> #const GLFW_KEY_KP_DIVIDE- KeyPadMultiply -> #const GLFW_KEY_KP_MULTIPLY- KeyPadSubtract -> #const GLFW_KEY_KP_SUBTRACT- KeyPadAdd -> #const GLFW_KEY_KP_ADD- KeyPadDecimal -> #const GLFW_KEY_KP_DECIMAL- KeyPadEqual -> #const GLFW_KEY_KP_EQUAL- KeyPadEnter -> #const GLFW_KEY_KP_ENTER-- fromC i =- if i < #const GLFW_KEY_SPECIAL- then CharKey (chr (fromIntegral i))- else case i of- (#const GLFW_KEY_UNKNOWN ) -> KeyUnknown- (#const GLFW_KEY_SPACE ) -> KeySpace- (#const GLFW_KEY_SPECIAL ) -> KeySpecial- (#const GLFW_KEY_ESC ) -> KeyEsc- (#const GLFW_KEY_F1 ) -> KeyF1- (#const GLFW_KEY_F2 ) -> KeyF2- (#const GLFW_KEY_F3 ) -> KeyF3- (#const GLFW_KEY_F4 ) -> KeyF4- (#const GLFW_KEY_F5 ) -> KeyF5- (#const GLFW_KEY_F6 ) -> KeyF6- (#const GLFW_KEY_F7 ) -> KeyF7- (#const GLFW_KEY_F8 ) -> KeyF8- (#const GLFW_KEY_F9 ) -> KeyF9- (#const GLFW_KEY_F10 ) -> KeyF10- (#const GLFW_KEY_F11 ) -> KeyF11- (#const GLFW_KEY_F12 ) -> KeyF12- (#const GLFW_KEY_F13 ) -> KeyF13- (#const GLFW_KEY_F14 ) -> KeyF14- (#const GLFW_KEY_F15 ) -> KeyF15- (#const GLFW_KEY_F16 ) -> KeyF16- (#const GLFW_KEY_F17 ) -> KeyF17- (#const GLFW_KEY_F18 ) -> KeyF18- (#const GLFW_KEY_F19 ) -> KeyF19- (#const GLFW_KEY_F20 ) -> KeyF20- (#const GLFW_KEY_F21 ) -> KeyF21- (#const GLFW_KEY_F22 ) -> KeyF22- (#const GLFW_KEY_F23 ) -> KeyF23- (#const GLFW_KEY_F24 ) -> KeyF24- (#const GLFW_KEY_F25 ) -> KeyF25- (#const GLFW_KEY_UP ) -> KeyUp- (#const GLFW_KEY_DOWN ) -> KeyDown- (#const GLFW_KEY_LEFT ) -> KeyLeft- (#const GLFW_KEY_RIGHT ) -> KeyRight- (#const GLFW_KEY_LSHIFT ) -> KeyLeftShift- (#const GLFW_KEY_RSHIFT ) -> KeyRightShift- (#const GLFW_KEY_LCTRL ) -> KeyLeftCtrl- (#const GLFW_KEY_RCTRL ) -> KeyRightCtrl- (#const GLFW_KEY_LALT ) -> KeyLeftAlt- (#const GLFW_KEY_RALT ) -> KeyRightAlt- (#const GLFW_KEY_TAB ) -> KeyTab- (#const GLFW_KEY_ENTER ) -> KeyEnter- (#const GLFW_KEY_BACKSPACE ) -> KeyBackspace- (#const GLFW_KEY_INSERT ) -> KeyInsert- (#const GLFW_KEY_DEL ) -> KeyDel- (#const GLFW_KEY_PAGEUP ) -> KeyPageup- (#const GLFW_KEY_PAGEDOWN ) -> KeyPagedown- (#const GLFW_KEY_HOME ) -> KeyHome- (#const GLFW_KEY_END ) -> KeyEnd- (#const GLFW_KEY_KP_0 ) -> KeyPad0- (#const GLFW_KEY_KP_1 ) -> KeyPad1- (#const GLFW_KEY_KP_2 ) -> KeyPad2- (#const GLFW_KEY_KP_3 ) -> KeyPad3- (#const GLFW_KEY_KP_4 ) -> KeyPad4- (#const GLFW_KEY_KP_5 ) -> KeyPad5- (#const GLFW_KEY_KP_6 ) -> KeyPad6- (#const GLFW_KEY_KP_7 ) -> KeyPad7- (#const GLFW_KEY_KP_8 ) -> KeyPad8- (#const GLFW_KEY_KP_9 ) -> KeyPad9- (#const GLFW_KEY_KP_DIVIDE ) -> KeyPadDivide- (#const GLFW_KEY_KP_MULTIPLY) -> KeyPadMultiply- (#const GLFW_KEY_KP_SUBTRACT) -> KeyPadSubtract- (#const GLFW_KEY_KP_ADD ) -> KeyPadAdd- (#const GLFW_KEY_KP_DECIMAL ) -> KeyPadDecimal- (#const GLFW_KEY_KP_EQUAL ) -> KeyPadEqual- (#const GLFW_KEY_KP_ENTER ) -> KeyPadEnter- _ -> KeyUnknown---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Mouse--mouseButtonIsPressed :: MouseButton -> IO Bool-mouseButtonIsPressed mb =- fromC `fmap` glfwGetMouseButton (toC mb)--getMousePosition :: IO (Int, Int)-getMousePosition =- alloca $ \px ->- alloca $ \py -> do- glfwGetMousePos px py- x <- peek px- y <- peek py- return (fromC x, fromC y)--getMouseWheel :: IO Int-getMouseWheel =- fromC `fmap` glfwGetMouseWheel--setMousePosition :: Int -> Int -> IO ()-setMousePosition x y =- glfwSetMousePos (toC x) (toC y)--setMouseWheel :: Int -> IO ()-setMouseWheel =- glfwSetMouseWheel . toC--setMouseButtonCallback :: MouseButtonCallback -> IO ()-setMouseButtonCallback cb = do- ccb <- wrapMouseButtonCallback (\b p -> cb (fromC b) (fromC p))- glfwSetMouseButtonCallback ccb- storeCallback mouseButtonCallback ccb--setMousePositionCallback :: MousePositionCallback -> IO ()-setMousePositionCallback cb = do- ccb <- wrapMousePositionCallback (\x y -> cb (fromC x) (fromC y))- glfwSetMousePosCallback ccb- storeCallback mousePositionCallback ccb--setMouseWheelCallback :: MouseWheelCallback -> IO ()-setMouseWheelCallback cb = do- ccb <- wrapMouseWheelCallback (cb . fromC)- glfwSetMouseWheelCallback ccb- storeCallback mouseWheelCallback ccb---- |Make the mouse cursor visible.-enableMouseCursor :: IO ()-enableMouseCursor = glfwEnable (#const GLFW_MOUSE_CURSOR)---- |Make the mouse cursor invisible.-disableMouseCursor :: IO ()-disableMouseCursor = glfwDisable (#const GLFW_MOUSE_CURSOR)---- -- -- -- -- -- -- -- -- ----data MouseButton- = MouseButton0 | MouseButton1 | MouseButton2 | MouseButton3- | MouseButton4 | MouseButton5 | MouseButton6 | MouseButton7- deriving (Bounded, Enum, Eq, Ord, Read, Show)--instance C MouseButton CInt where- toC mb = case mb of- MouseButton0 -> #const GLFW_MOUSE_BUTTON_1- MouseButton1 -> #const GLFW_MOUSE_BUTTON_2- MouseButton2 -> #const GLFW_MOUSE_BUTTON_3- MouseButton3 -> #const GLFW_MOUSE_BUTTON_4- MouseButton4 -> #const GLFW_MOUSE_BUTTON_5- MouseButton5 -> #const GLFW_MOUSE_BUTTON_6- MouseButton6 -> #const GLFW_MOUSE_BUTTON_7- MouseButton7 -> #const GLFW_MOUSE_BUTTON_8-- fromC i = case i of- (#const GLFW_MOUSE_BUTTON_1) -> MouseButton0- (#const GLFW_MOUSE_BUTTON_2) -> MouseButton1- (#const GLFW_MOUSE_BUTTON_3) -> MouseButton2- (#const GLFW_MOUSE_BUTTON_4) -> MouseButton3- (#const GLFW_MOUSE_BUTTON_5) -> MouseButton4- (#const GLFW_MOUSE_BUTTON_6) -> MouseButton5- (#const GLFW_MOUSE_BUTTON_7) -> MouseButton6- (#const GLFW_MOUSE_BUTTON_8) -> MouseButton7- _ -> makeFromCError "MouseButton" i---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Joystick--joystickIsPresent :: Joystick -> IO Bool-joystickIsPresent j =- fromC `fmap` glfwGetJoystickParam (toC j) (#const GLFW_PRESENT)--getNumJoystickAxes :: Joystick -> IO Int-getNumJoystickAxes j =- fromC `fmap` glfwGetJoystickParam (toC j) (#const GLFW_AXES)--getNumJoystickButtons :: Joystick -> IO Int-getNumJoystickButtons j =- fromC `fmap` glfwGetJoystickParam (toC j) (#const GLFW_BUTTONS)--getJoystickPosition :: Joystick -> Int -> IO [Float]-getJoystickPosition j m =- if m < 1- then return []- else allocaArray m $ \ptr -> do- n <- fromC `fmap` glfwGetJoystickPos (toC j) ptr (toC m)- a <- peekArray n ptr- return $ map fromC a--joystickButtonsArePressed :: Joystick -> Int -> IO [Bool]-joystickButtonsArePressed j m =- if m < 1- then return []- else allocaArray m $ \ptr -> do- n <- fromC `fmap` glfwGetJoystickButtons (toC j) ptr (toC m)- a <- peekArray n ptr :: IO [CUChar]- return $ map ((glfwPress ==) . fromIntegral) a---- -- -- -- -- -- -- -- -- ----data Joystick- = Joystick0 | Joystick1 | Joystick2 | Joystick3- | Joystick4 | Joystick5 | Joystick6 | Joystick7- | Joystick8 | Joystick9 | Joystick10 | Joystick11- | Joystick12 | Joystick13 | Joystick14 | Joystick15- deriving (Bounded, Enum, Eq, Ord, Read, Show)--instance C Joystick CInt where- toC j = case j of- Joystick0 -> #const GLFW_JOYSTICK_1- Joystick1 -> #const GLFW_JOYSTICK_2- Joystick2 -> #const GLFW_JOYSTICK_3- Joystick3 -> #const GLFW_JOYSTICK_4- Joystick4 -> #const GLFW_JOYSTICK_5- Joystick5 -> #const GLFW_JOYSTICK_6- Joystick6 -> #const GLFW_JOYSTICK_7- Joystick7 -> #const GLFW_JOYSTICK_8- Joystick8 -> #const GLFW_JOYSTICK_9- Joystick9 -> #const GLFW_JOYSTICK_10- Joystick10 -> #const GLFW_JOYSTICK_11- Joystick11 -> #const GLFW_JOYSTICK_12- Joystick12 -> #const GLFW_JOYSTICK_13- Joystick13 -> #const GLFW_JOYSTICK_14- Joystick14 -> #const GLFW_JOYSTICK_15- Joystick15 -> #const GLFW_JOYSTICK_16-- fromC i = case i of- (#const GLFW_JOYSTICK_1 ) -> Joystick0- (#const GLFW_JOYSTICK_2 ) -> Joystick1- (#const GLFW_JOYSTICK_3 ) -> Joystick2- (#const GLFW_JOYSTICK_4 ) -> Joystick3- (#const GLFW_JOYSTICK_5 ) -> Joystick4- (#const GLFW_JOYSTICK_6 ) -> Joystick5- (#const GLFW_JOYSTICK_7 ) -> Joystick6- (#const GLFW_JOYSTICK_8 ) -> Joystick7- (#const GLFW_JOYSTICK_9 ) -> Joystick8- (#const GLFW_JOYSTICK_10) -> Joystick9- (#const GLFW_JOYSTICK_11) -> Joystick10- (#const GLFW_JOYSTICK_12) -> Joystick11- (#const GLFW_JOYSTICK_13) -> Joystick12- (#const GLFW_JOYSTICK_14) -> Joystick13- (#const GLFW_JOYSTICK_15) -> Joystick14- (#const GLFW_JOYSTICK_16) -> Joystick15- _ -> makeFromCError "Joystick" i---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Time--getTime :: IO Double-getTime =- realToFrac `fmap` glfwGetTime--setTime :: Double -> IO ()-setTime =- glfwSetTime . realToFrac--resetTime :: IO ()-resetTime =- setTime (0 :: Double)--sleep :: Double -> IO ()-sleep =- glfwSleep . realToFrac---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----- Version information--getGlfwVersion :: IO Version-getGlfwVersion =- alloca $ \p0 ->- alloca $ \p1 ->- alloca $ \p2 -> do- glfwGetVersion p0 p1 p2- v0 <- fromC `fmap` peek p0- v1 <- fromC `fmap` peek p1- v2 <- fromC `fmap` peek p2- return $ Version [v0, v1, v2] []--getGlVersion :: IO Version-getGlVersion =- alloca $ \p0 ->- alloca $ \p1 ->- alloca $ \p2 -> do- glfwGetGLVersion p0 p1 p2- v0 <- fromC `fmap` peek p0- v1 <- fromC `fmap` peek p1- v2 <- fromC `fmap` peek p2- return $ Version [v0, v1, v2] []---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----glfwPress :: CInt-glfwPress = #const GLFW_PRESS---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----class C h c where- toC :: h -> c- fromC :: c -> h-- toC = undefined- fromC = undefined--makeFromCError :: (Show c) => String -> c -> a-makeFromCError s c = error (s ++ " fromC: no match for " ++ show c)---- -- -- -- -- -- -- -- -- ----instance C Bool CInt where- toC False = #const GL_FALSE- toC True = #const GL_TRUE-- fromC (#const GL_FALSE) = False- fromC (#const GL_TRUE) = True- fromC i = makeFromCError "Bool" i---- -- -- -- -- -- -- -- -- ----instance C Char CInt where- toC = fromIntegral . ord- fromC = chr . fromIntegral---- -- -- -- -- -- -- -- -- ----instance C Float CFloat where- toC = realToFrac- fromC = realToFrac---- -- -- -- -- -- -- -- -- ----instance C Int CInt where- toC = fromIntegral- fromC = fromIntegral---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----charCallback :: IORef (Maybe (FunPtr GlfwCharCallback))-keyCallback :: IORef (Maybe (FunPtr GlfwKeyCallback))-mouseButtonCallback :: IORef (Maybe (FunPtr GlfwMouseButtonCallback))-mousePositionCallback :: IORef (Maybe (FunPtr GlfwMousePositionCallback))-mouseWheelCallback :: IORef (Maybe (FunPtr GlfwMouseWheelCallback))-windowCloseCallback :: IORef (Maybe (FunPtr GlfwWindowCloseCallback))-windowRefreshCallback :: IORef (Maybe (FunPtr GlfwWindowRefreshCallback))-windowSizeCallback :: IORef (Maybe (FunPtr GlfwWindowSizeCallback))--charCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE charCallback #-}-keyCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE keyCallback #-}-mouseButtonCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE mouseButtonCallback #-}-mousePositionCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE mousePositionCallback #-}-mouseWheelCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE mouseWheelCallback #-}-windowCloseCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE windowCloseCallback #-}-windowRefreshCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE windowRefreshCallback #-}-windowSizeCallback = unsafePerformIO (newIORef Nothing)-{-# NOINLINE windowSizeCallback #-}--storeCallback :: IORef (Maybe (FunPtr a)) -> FunPtr a -> IO ()-storeCallback ior cb =- atomicModifyIORef ior (\mcb -> (Just cb, mcb)) >>= maybe (return ()) freeHaskellFunPtr