packages feed

GLFW-b 0.1.0.5 → 3.3.9.1

raw patch · 55 files changed

Files

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+======+[![Hackage](https://img.shields.io/hackage/v/GLFW-b.svg)](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 &lt; 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( &currenttime, 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( &currenttime, 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( &currenttime, 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( &currenttime, 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