diff options
| -rw-r--r-- | Demos/Pong/Main.hs | 34 | ||||
| -rw-r--r-- | Demos/Pong/Pong.hs | 16 | ||||
| -rw-r--r-- | Spear/App.hs | 10 | ||||
| -rw-r--r-- | Spear/Step.hs | 42 | ||||
| -rw-r--r-- | Spear/Window.hs | 246 | 
5 files changed, 171 insertions, 177 deletions
diff --git a/Demos/Pong/Main.hs b/Demos/Pong/Main.hs index 4dbe0a3..ee0f8d8 100644 --- a/Demos/Pong/Main.hs +++ b/Demos/Pong/Main.hs  | |||
| @@ -2,20 +2,20 @@ | |||
| 2 | 2 | ||
| 3 | module Main where | 3 | module Main where | 
| 4 | 4 | ||
| 5 | import Data.Maybe (mapMaybe) | 5 | import Data.Maybe (mapMaybe) | 
| 6 | import Graphics.Rendering.OpenGL.GL (($=)) | 6 | import Graphics.Rendering.OpenGL.GL (($=)) | 
| 7 | import Graphics.Rendering.OpenGL.GL qualified as GL | 7 | import qualified Graphics.Rendering.OpenGL.GL as GL | 
| 8 | import Pong | 8 | import Pong | 
| 9 | import Spear.App | 9 | import Spear.App | 
| 10 | import Spear.Game | 10 | import Spear.Game | 
| 11 | import Spear.Math.AABB | 11 | import Spear.Math.AABB | 
| 12 | import Spear.Math.Spatial2 | 12 | import Spear.Math.Spatial2 | 
| 13 | import Spear.Math.Vector | 13 | import Spear.Math.Vector | 
| 14 | import Spear.Window | 14 | import Spear.Window | 
| 15 | 15 | ||
| 16 | data GameState = GameState | 16 | data GameState = GameState | 
| 17 | { window :: Window, | 17 | { window :: Window, | 
| 18 | world :: [GameObject] | 18 | world :: [GameObject] | 
| 19 | } | 19 | } | 
| 20 | 20 | ||
| 21 | main = | 21 | main = | 
| @@ -53,7 +53,7 @@ renderGO go = do | |||
| 53 | (xmin, ymin, xmax, ymax) = (f2d xmin', f2d ymin', f2d xmax', f2d ymax') | 53 | (xmin, ymin, xmax, ymax) = (f2d xmin', f2d ymin', f2d xmax', f2d ymax') | 
| 54 | GL.preservingMatrix $ do | 54 | GL.preservingMatrix $ do | 
| 55 | GL.translate (GL.Vector3 (f2d xcenter) (f2d ycenter) 0) | 55 | GL.translate (GL.Vector3 (f2d xcenter) (f2d ycenter) 0) | 
| 56 | GL.renderPrimitive (GL.TriangleStrip) $ do | 56 | GL.renderPrimitive GL.TriangleStrip $ do | 
| 57 | GL.vertex (GL.Vertex2 xmin ymax) | 57 | GL.vertex (GL.Vertex2 xmin ymax) | 
| 58 | GL.vertex (GL.Vertex2 xmin ymin) | 58 | GL.vertex (GL.Vertex2 xmin ymin) | 
| 59 | GL.vertex (GL.Vertex2 xmax ymax) | 59 | GL.vertex (GL.Vertex2 xmax ymax) | 
| @@ -71,13 +71,13 @@ procEvent _ = return () | |||
| 71 | 71 | ||
| 72 | translate = mapMaybe translate' | 72 | translate = mapMaybe translate' | 
| 73 | 73 | ||
| 74 | translate' (KeyDown KEY_LEFT) = Just MoveLeft | 74 | translate' (KeyDown KEY_LEFT) = Just MoveLeft | 
| 75 | translate' (KeyDown KEY_RIGHT) = Just MoveRight | 75 | translate' (KeyDown KEY_RIGHT) = Just MoveRight | 
| 76 | translate' (KeyUp KEY_LEFT) = Just StopLeft | 76 | translate' (KeyUp KEY_LEFT) = Just StopLeft | 
| 77 | translate' (KeyUp KEY_RIGHT) = Just StopRight | 77 | translate' (KeyUp KEY_RIGHT) = Just StopRight | 
| 78 | translate' _ = Nothing | 78 | translate' _ = Nothing | 
| 79 | 79 | ||
| 80 | exitRequested = any (== (KeyDown KEY_ESC)) | 80 | exitRequested = elem (KeyDown KEY_ESC) | 
| 81 | 81 | ||
| 82 | f2d :: Float -> GL.GLdouble | 82 | f2d :: Float -> GL.GLdouble | 
| 83 | f2d = realToFrac | 83 | f2d = realToFrac | 
diff --git a/Demos/Pong/Pong.hs b/Demos/Pong/Pong.hs index b048bbc..fd7fbeb 100644 --- a/Demos/Pong/Pong.hs +++ b/Demos/Pong/Pong.hs  | |||
| @@ -7,12 +7,12 @@ module Pong | |||
| 7 | ) | 7 | ) | 
| 8 | where | 8 | where | 
| 9 | 9 | ||
| 10 | import Data.Monoid (mconcat) | 10 | import Data.Monoid (mconcat) | 
| 11 | import GHC.Float (double2Float) | 11 | import GHC.Float (double2Float) | 
| 12 | import Spear.Math.AABB | 12 | import Spear.Math.AABB | 
| 13 | import Spear.Math.Spatial2 | 13 | import Spear.Math.Spatial2 | 
| 14 | import Spear.Math.Vector | 14 | import Spear.Math.Vector | 
| 15 | import Spear.Step | 15 | import Spear.Step | 
| 16 | 16 | ||
| 17 | -- Configuration | 17 | -- Configuration | 
| 18 | 18 | ||
| @@ -42,8 +42,8 @@ data GameEvent | |||
| 42 | -- Game objects | 42 | -- Game objects | 
| 43 | 43 | ||
| 44 | data GameObject = GameObject | 44 | data GameObject = GameObject | 
| 45 | { aabb :: AABB2, | 45 | { aabb :: AABB2, | 
| 46 | obj :: Obj2, | 46 | obj :: Obj2, | 
| 47 | gostep :: Step [GameObject] [GameEvent] GameObject GameObject | 47 | gostep :: Step [GameObject] [GameEvent] GameObject GameObject | 
| 48 | } | 48 | } | 
| 49 | 49 | ||
diff --git a/Spear/App.hs b/Spear/App.hs index dc17dec..ca9a355 100644 --- a/Spear/App.hs +++ b/Spear/App.hs  | |||
| @@ -6,11 +6,11 @@ module Spear.App | |||
| 6 | ) | 6 | ) | 
| 7 | where | 7 | where | 
| 8 | 8 | ||
| 9 | import Control.Monad | 9 | import Control.Monad | 
| 10 | import GHC.Float | 10 | import GHC.Float | 
| 11 | import Spear.Game | 11 | import Spear.Game | 
| 12 | import Spear.Sys.Timer as Timer | 12 | import Spear.Sys.Timer as Timer | 
| 13 | import Spear.Window | 13 | import Spear.Window | 
| 14 | 14 | ||
| 15 | maxFPS = 60 | 15 | maxFPS = 60 | 
| 16 | 16 | ||
diff --git a/Spear/Step.hs b/Spear/Step.hs index 7419d9e..609f387 100644 --- a/Spear/Step.hs +++ b/Spear/Step.hs  | |||
| @@ -26,10 +26,10 @@ module Spear.Step | |||
| 26 | ) | 26 | ) | 
| 27 | where | 27 | where | 
| 28 | 28 | ||
| 29 | import Data.List (foldl') | 29 | import Data.List (foldl') | 
| 30 | import Data.Map (Map) | 30 | import Data.Map (Map) | 
| 31 | import qualified Data.Map as Map | 31 | import qualified Data.Map as Map | 
| 32 | import Data.Monoid | 32 | import Data.Monoid | 
| 33 | 33 | ||
| 34 | type Elapsed = Double | 34 | type Elapsed = Double | 
| 35 | 35 | ||
| @@ -51,11 +51,6 @@ instance Semigroup (Step s e a a) where | |||
| 51 | instance Monoid (Step s e a a) where | 51 | instance Monoid (Step s e a a) where | 
| 52 | mempty = sid | 52 | mempty = sid | 
| 53 | 53 | ||
| 54 | mappend (Step s1) (Step s2) = Step $ \elapsed dt g e a -> | ||
| 55 | let (b, s1') = s1 elapsed dt g e a | ||
| 56 | (c, s2') = s2 elapsed dt g e b | ||
| 57 | in (c, mappend s1' s2') | ||
| 58 | |||
| 59 | -- | Construct a step from a function. | 54 | -- | Construct a step from a function. | 
| 60 | step :: (Elapsed -> Dt -> s -> e -> a -> (b, Step s e a b)) -> Step s e a b | 55 | step :: (Elapsed -> Dt -> s -> e -> a -> (b, Step s e a b)) -> Step s e a b | 
| 61 | step = Step | 56 | step = Step | 
| @@ -70,11 +65,11 @@ spure f = Step $ \_ _ _ _ x -> (f x, spure f) | |||
| 70 | 65 | ||
| 71 | -- | The step that returns the first component in the tuple. | 66 | -- | The step that returns the first component in the tuple. | 
| 72 | sfst :: Step s e (a, b) a | 67 | sfst :: Step s e (a, b) a | 
| 73 | sfst = spure $ \(a, _) -> a | 68 | sfst = spure fst | 
| 74 | 69 | ||
| 75 | -- | The step that returns the second component in the tuple. | 70 | -- | The step that returns the second component in the tuple. | 
| 76 | ssnd :: Step s e (a, b) b | 71 | ssnd :: Step s e (a, b) b | 
| 77 | ssnd = spure $ \(_, b) -> b | 72 | ssnd = spure snd | 
| 78 | 73 | ||
| 79 | -- | Construct a step that folds a given list of inputs. | 74 | -- | Construct a step that folds a given list of inputs. | 
| 80 | -- | 75 | -- | 
| @@ -97,7 +92,7 @@ sfold' :: | |||
| 97 | a -> | 92 | a -> | 
| 98 | [e] -> | 93 | [e] -> | 
| 99 | (a, Step s (Maybe e) a a) | 94 | (a, Step s (Maybe e) a a) | 
| 100 | sfold' elapsed dt g s a es = foldl' f (a', s') es | 95 | sfold' elapsed dt g s a = foldl' f (a', s') | 
| 101 | where | 96 | where | 
| 102 | f (a, s) e = runStep s elapsed dt g (Just e) a | 97 | f (a, s) e = runStep s elapsed dt g (Just e) a | 
| 103 | (a', s') = runStep s elapsed dt g Nothing a | 98 | (a', s') = runStep s elapsed dt g Nothing a | 
| @@ -128,19 +123,19 @@ szip f (Step s1) (Step s2) = Step $ \elapsed dt g e d -> | |||
| 128 | switch :: | 123 | switch :: | 
| 129 | Eq e => | 124 | Eq e => | 
| 130 | e -> | 125 | e -> | 
| 131 | (Step s (Maybe e) a a) -> | 126 | Step s (Maybe e) a a -> | 
| 132 | e -> | 127 | e -> | 
| 133 | (Step s (Maybe e) a a) -> | 128 | Step s (Maybe e) a a -> | 
| 134 | Step s (Maybe e) a a | 129 | Step s (Maybe e) a a | 
| 135 | switch flag1 s1 flag2 s2 = switch' s1 flag1 s1 flag2 s2 | 130 | switch flag1 s1 flag2 s2 = switch' s1 flag1 s1 flag2 s2 | 
| 136 | 131 | ||
| 137 | switch' :: | 132 | switch' :: | 
| 138 | Eq e => | 133 | Eq e => | 
| 139 | (Step s (Maybe e) a a) -> | 134 | Step s (Maybe e) a a -> | 
| 140 | e -> | 135 | e -> | 
| 141 | (Step s (Maybe e) a a) -> | 136 | Step s (Maybe e) a a -> | 
| 142 | e -> | 137 | e -> | 
| 143 | (Step s (Maybe e) a a) -> | 138 | Step s (Maybe e) a a -> | 
| 144 | Step s (Maybe e) a a | 139 | Step s (Maybe e) a a | 
| 145 | switch' cur flag1 s1 flag2 s2 = Step $ \elapsed dt g e a -> | 140 | switch' cur flag1 s1 flag2 s2 = Step $ \elapsed dt g e a -> | 
| 146 | case e of | 141 | case e of | 
| @@ -148,13 +143,10 @@ switch' cur flag1 s1 flag2 s2 = Step $ \elapsed dt g e a -> | |||
| 148 | let (a', s') = runStep cur elapsed dt g Nothing a | 143 | let (a', s') = runStep cur elapsed dt g Nothing a | 
| 149 | in (a', switch' s' flag1 s1 flag2 s2) | 144 | in (a', switch' s' flag1 s1 flag2 s2) | 
| 150 | Just e' -> | 145 | Just e' -> | 
| 151 | let next = | 146 | let next | 
| 152 | if e' == flag1 | 147 | | e' == flag1 = s1 | 
| 153 | then s1 | 148 | | e' == flag2 = s2 | 
| 154 | else | 149 | | otherwise = cur | 
| 155 | if e' == flag2 | ||
| 156 | then s2 | ||
| 157 | else cur | ||
| 158 | (a', s') = runStep next elapsed dt g e a | 150 | (a', s') = runStep next elapsed dt g e a | 
| 159 | in (a', switch' s' flag1 s1 flag2 s2) | 151 | in (a', switch' s' flag1 s1 flag2 s2) | 
| 160 | 152 | ||
| @@ -179,6 +171,6 @@ multiSwitch' curKey cur m = Step $ \elapsed dt g e a -> | |||
| 179 | Just s -> | 171 | Just s -> | 
| 180 | let (a', s') = runStep s elapsed dt g e a | 172 | let (a', s') = runStep s elapsed dt g e a | 
| 181 | m' = case curKey of | 173 | m' = case curKey of | 
| 182 | Nothing -> m | 174 | Nothing -> m | 
| 183 | Just key -> Map.insert key cur m | 175 | Just key -> Map.insert key cur m | 
| 184 | in (a', multiSwitch' e s' m') | 176 | in (a', multiSwitch' e s' m') | 
diff --git a/Spear/Window.hs b/Spear/Window.hs index a6471b0..ec90a2f 100644 --- a/Spear/Window.hs +++ b/Spear/Window.hs  | |||
| @@ -28,12 +28,12 @@ module Spear.Window | |||
| 28 | ) | 28 | ) | 
| 29 | where | 29 | where | 
| 30 | 30 | ||
| 31 | import Control.Concurrent.MVar | 31 | import Control.Concurrent.MVar | 
| 32 | import Control.Exception | 32 | import Control.Exception | 
| 33 | import Control.Monad (foldM, unless, void, when) | 33 | import Control.Monad (foldM, unless, void, when) | 
| 34 | import Data.Maybe (fromJust, fromMaybe, isJust) | 34 | import Data.Maybe (fromJust, fromMaybe, isJust) | 
| 35 | import qualified Graphics.UI.GLFW as GLFW | 35 | import qualified Graphics.UI.GLFW as GLFW | 
| 36 | import Spear.Game | 36 | import Spear.Game | 
| 37 | 37 | ||
| 38 | type Width = Int | 38 | type Width = Int | 
| 39 | 39 | ||
| @@ -59,9 +59,9 @@ instance Exception WindowException | |||
| 59 | 59 | ||
| 60 | -- | A window. | 60 | -- | A window. | 
| 61 | data Window = Window | 61 | data Window = Window | 
| 62 | { glfwWindow :: GLFW.Window, | 62 | { glfwWindow :: GLFW.Window, | 
| 63 | closeRequest :: CloseRequest, | 63 | closeRequest :: CloseRequest, | 
| 64 | inputEvents :: MVar [InputEvent] | 64 | inputEvents :: MVar [InputEvent] | 
| 65 | } | 65 | } | 
| 66 | 66 | ||
| 67 | withWindow :: | 67 | withWindow :: | 
| @@ -118,7 +118,7 @@ pollEvents window = do | |||
| 118 | GLFW.pollEvents | 118 | GLFW.pollEvents | 
| 119 | events <- | 119 | events <- | 
| 120 | tryTakeMVar (inputEvents window) >>= \xs -> case xs of | 120 | tryTakeMVar (inputEvents window) >>= \xs -> case xs of | 
| 121 | Nothing -> return [] | 121 | Nothing -> return [] | 
| 122 | Just events -> return events | 122 | Just events -> return events | 
| 123 | putMVar (inputEvents window) [] | 123 | putMVar (inputEvents window) [] | 
| 124 | return events | 124 | return events | 
| @@ -154,14 +154,14 @@ onMouseButton events window button GLFW.MouseButtonState'Pressed _ = addEvent ev | |||
| 154 | onMouseButton events window button GLFW.MouseButtonState'Released _ = addEvent events $ MouseUp (fromGLFWbutton button) | 154 | onMouseButton events window button GLFW.MouseButtonState'Released _ = addEvent events $ MouseUp (fromGLFWbutton button) | 
| 155 | 155 | ||
| 156 | onMouseMove :: MVar [InputEvent] -> IO GLFW.CursorPosCallback | 156 | onMouseMove :: MVar [InputEvent] -> IO GLFW.CursorPosCallback | 
| 157 | onMouseMove events = newEmptyMVar >>= return . flip onMouseMove' events | 157 | onMouseMove events = newEmptyMVar <&> flip onMouseMove' events | 
| 158 | 158 | ||
| 159 | onMouseMove' :: MVar MousePos -> MVar [InputEvent] -> GLFW.CursorPosCallback | 159 | onMouseMove' :: MVar MousePos -> MVar [InputEvent] -> GLFW.CursorPosCallback | 
| 160 | onMouseMove' oldPos events window x y = do | 160 | onMouseMove' oldPos events window x y = do | 
| 161 | (old_x, old_y) <- | 161 | (old_x, old_y) <- | 
| 162 | tryTakeMVar oldPos >>= \old -> case old of | 162 | tryTakeMVar oldPos >>= \old -> case old of | 
| 163 | Nothing -> return (x, y) | 163 | Nothing -> return (x, y) | 
| 164 | Just p -> return p | 164 | Just p -> return p | 
| 165 | let delta = (x - old_x, y - old_y) | 165 | let delta = (x - old_x, y - old_y) | 
| 166 | putMVar oldPos (x, y) | 166 | putMVar oldPos (x, y) | 
| 167 | addEvent events $ MouseMove (x, y) delta | 167 | addEvent events $ MouseMove (x, y) delta | 
| @@ -172,7 +172,7 @@ replaceMVar mvar val = tryTakeMVar mvar >> putMVar mvar val | |||
| 172 | addEvent :: MVar [a] -> a -> IO () | 172 | addEvent :: MVar [a] -> a -> IO () | 
| 173 | addEvent mvar val = | 173 | addEvent mvar val = | 
| 174 | tryTakeMVar mvar >>= \xs -> case xs of | 174 | tryTakeMVar mvar >>= \xs -> case xs of | 
| 175 | Nothing -> putMVar mvar [val] | 175 | Nothing -> putMVar mvar [val] | 
| 176 | Just events -> putMVar mvar (val : events) | 176 | Just events -> putMVar mvar (val : events) | 
| 177 | 177 | ||
| 178 | -- Input | 178 | -- Input | 
| @@ -198,7 +198,8 @@ processKeys window = foldM f [] | |||
| 198 | f acc (key, result) = do | 198 | f acc (key, result) = do | 
| 199 | isDown <- | 199 | isDown <- | 
| 200 | fmap (== GLFW.KeyState'Pressed) $ | 200 | fmap (== GLFW.KeyState'Pressed) $ | 
| 201 | gameIO . GLFW.getKey window . toGLFWkey $ key | 201 | gameIO . GLFW.getKey window . toGLFWkey $ | 
| 202 | key | ||
| 202 | return $ if isDown then result : acc else acc | 203 | return $ if isDown then result : acc else acc | 
| 203 | 204 | ||
| 204 | -- | Process the mouse buttons, returning those values for which their | 205 | -- | Process the mouse buttons, returning those values for which their | 
| @@ -209,7 +210,8 @@ processButtons window = foldM f [] | |||
| 209 | f acc (button, result) = do | 210 | f acc (button, result) = do | 
| 210 | isDown <- | 211 | isDown <- | 
| 211 | fmap (== GLFW.MouseButtonState'Pressed) $ | 212 | fmap (== GLFW.MouseButtonState'Pressed) $ | 
| 212 | gameIO . GLFW.getMouseButton window . toGLFWbutton $ button | 213 | gameIO . GLFW.getMouseButton window . toGLFWbutton $ | 
| 214 | button | ||
| 213 | return $ if isDown then result : acc else acc | 215 | return $ if isDown then result : acc else acc | 
| 214 | 216 | ||
| 215 | data InputEvent | 217 | data InputEvent | 
| @@ -290,61 +292,61 @@ type MousePos = (Double, Double) | |||
| 290 | type MouseDelta = (Double, Double) | 292 | type MouseDelta = (Double, Double) | 
| 291 | 293 | ||
| 292 | fromGLFWkey :: GLFW.Key -> Key | 294 | fromGLFWkey :: GLFW.Key -> Key | 
| 293 | fromGLFWkey GLFW.Key'A = KEY_A | 295 | fromGLFWkey GLFW.Key'A = KEY_A | 
| 294 | fromGLFWkey GLFW.Key'B = KEY_B | 296 | fromGLFWkey GLFW.Key'B = KEY_B | 
| 295 | fromGLFWkey GLFW.Key'C = KEY_C | 297 | fromGLFWkey GLFW.Key'C = KEY_C | 
| 296 | fromGLFWkey GLFW.Key'D = KEY_D | 298 | fromGLFWkey GLFW.Key'D = KEY_D | 
| 297 | fromGLFWkey GLFW.Key'E = KEY_E | 299 | fromGLFWkey GLFW.Key'E = KEY_E | 
| 298 | fromGLFWkey GLFW.Key'F = KEY_F | 300 | fromGLFWkey GLFW.Key'F = KEY_F | 
| 299 | fromGLFWkey GLFW.Key'G = KEY_G | 301 | fromGLFWkey GLFW.Key'G = KEY_G | 
| 300 | fromGLFWkey GLFW.Key'H = KEY_H | 302 | fromGLFWkey GLFW.Key'H = KEY_H | 
| 301 | fromGLFWkey GLFW.Key'I = KEY_I | 303 | fromGLFWkey GLFW.Key'I = KEY_I | 
| 302 | fromGLFWkey GLFW.Key'J = KEY_J | 304 | fromGLFWkey GLFW.Key'J = KEY_J | 
| 303 | fromGLFWkey GLFW.Key'K = KEY_K | 305 | fromGLFWkey GLFW.Key'K = KEY_K | 
| 304 | fromGLFWkey GLFW.Key'L = KEY_L | 306 | fromGLFWkey GLFW.Key'L = KEY_L | 
| 305 | fromGLFWkey GLFW.Key'M = KEY_M | 307 | fromGLFWkey GLFW.Key'M = KEY_M | 
| 306 | fromGLFWkey GLFW.Key'N = KEY_N | 308 | fromGLFWkey GLFW.Key'N = KEY_N | 
| 307 | fromGLFWkey GLFW.Key'O = KEY_O | 309 | fromGLFWkey GLFW.Key'O = KEY_O | 
| 308 | fromGLFWkey GLFW.Key'P = KEY_P | 310 | fromGLFWkey GLFW.Key'P = KEY_P | 
| 309 | fromGLFWkey GLFW.Key'Q = KEY_Q | 311 | fromGLFWkey GLFW.Key'Q = KEY_Q | 
| 310 | fromGLFWkey GLFW.Key'R = KEY_R | 312 | fromGLFWkey GLFW.Key'R = KEY_R | 
| 311 | fromGLFWkey GLFW.Key'S = KEY_S | 313 | fromGLFWkey GLFW.Key'S = KEY_S | 
| 312 | fromGLFWkey GLFW.Key'T = KEY_T | 314 | fromGLFWkey GLFW.Key'T = KEY_T | 
| 313 | fromGLFWkey GLFW.Key'U = KEY_U | 315 | fromGLFWkey GLFW.Key'U = KEY_U | 
| 314 | fromGLFWkey GLFW.Key'V = KEY_V | 316 | fromGLFWkey GLFW.Key'V = KEY_V | 
| 315 | fromGLFWkey GLFW.Key'W = KEY_W | 317 | fromGLFWkey GLFW.Key'W = KEY_W | 
| 316 | fromGLFWkey GLFW.Key'X = KEY_X | 318 | fromGLFWkey GLFW.Key'X = KEY_X | 
| 317 | fromGLFWkey GLFW.Key'Y = KEY_Y | 319 | fromGLFWkey GLFW.Key'Y = KEY_Y | 
| 318 | fromGLFWkey GLFW.Key'Z = KEY_Z | 320 | fromGLFWkey GLFW.Key'Z = KEY_Z | 
| 319 | fromGLFWkey GLFW.Key'0 = KEY_0 | 321 | fromGLFWkey GLFW.Key'0 = KEY_0 | 
| 320 | fromGLFWkey GLFW.Key'1 = KEY_1 | 322 | fromGLFWkey GLFW.Key'1 = KEY_1 | 
| 321 | fromGLFWkey GLFW.Key'2 = KEY_2 | 323 | fromGLFWkey GLFW.Key'2 = KEY_2 | 
| 322 | fromGLFWkey GLFW.Key'3 = KEY_3 | 324 | fromGLFWkey GLFW.Key'3 = KEY_3 | 
| 323 | fromGLFWkey GLFW.Key'4 = KEY_4 | 325 | fromGLFWkey GLFW.Key'4 = KEY_4 | 
| 324 | fromGLFWkey GLFW.Key'5 = KEY_5 | 326 | fromGLFWkey GLFW.Key'5 = KEY_5 | 
| 325 | fromGLFWkey GLFW.Key'6 = KEY_6 | 327 | fromGLFWkey GLFW.Key'6 = KEY_6 | 
| 326 | fromGLFWkey GLFW.Key'7 = KEY_7 | 328 | fromGLFWkey GLFW.Key'7 = KEY_7 | 
| 327 | fromGLFWkey GLFW.Key'8 = KEY_8 | 329 | fromGLFWkey GLFW.Key'8 = KEY_8 | 
| 328 | fromGLFWkey GLFW.Key'9 = KEY_9 | 330 | fromGLFWkey GLFW.Key'9 = KEY_9 | 
| 329 | fromGLFWkey GLFW.Key'Space = KEY_SPACE | 331 | fromGLFWkey GLFW.Key'Space = KEY_SPACE | 
| 330 | fromGLFWkey GLFW.Key'F1 = KEY_F1 | 332 | fromGLFWkey GLFW.Key'F1 = KEY_F1 | 
| 331 | fromGLFWkey GLFW.Key'F2 = KEY_F2 | 333 | fromGLFWkey GLFW.Key'F2 = KEY_F2 | 
| 332 | fromGLFWkey GLFW.Key'F3 = KEY_F3 | 334 | fromGLFWkey GLFW.Key'F3 = KEY_F3 | 
| 333 | fromGLFWkey GLFW.Key'F4 = KEY_F4 | 335 | fromGLFWkey GLFW.Key'F4 = KEY_F4 | 
| 334 | fromGLFWkey GLFW.Key'F5 = KEY_F5 | 336 | fromGLFWkey GLFW.Key'F5 = KEY_F5 | 
| 335 | fromGLFWkey GLFW.Key'F6 = KEY_F6 | 337 | fromGLFWkey GLFW.Key'F6 = KEY_F6 | 
| 336 | fromGLFWkey GLFW.Key'F7 = KEY_F7 | 338 | fromGLFWkey GLFW.Key'F7 = KEY_F7 | 
| 337 | fromGLFWkey GLFW.Key'F8 = KEY_F8 | 339 | fromGLFWkey GLFW.Key'F8 = KEY_F8 | 
| 338 | fromGLFWkey GLFW.Key'F9 = KEY_F9 | 340 | fromGLFWkey GLFW.Key'F9 = KEY_F9 | 
| 339 | fromGLFWkey GLFW.Key'F10 = KEY_F10 | 341 | fromGLFWkey GLFW.Key'F10 = KEY_F10 | 
| 340 | fromGLFWkey GLFW.Key'F11 = KEY_F11 | 342 | fromGLFWkey GLFW.Key'F11 = KEY_F11 | 
| 341 | fromGLFWkey GLFW.Key'F12 = KEY_F12 | 343 | fromGLFWkey GLFW.Key'F12 = KEY_F12 | 
| 342 | fromGLFWkey GLFW.Key'Escape = KEY_ESC | 344 | fromGLFWkey GLFW.Key'Escape = KEY_ESC | 
| 343 | fromGLFWkey GLFW.Key'Up = KEY_UP | 345 | fromGLFWkey GLFW.Key'Up = KEY_UP | 
| 344 | fromGLFWkey GLFW.Key'Down = KEY_DOWN | 346 | fromGLFWkey GLFW.Key'Down = KEY_DOWN | 
| 345 | fromGLFWkey GLFW.Key'Left = KEY_LEFT | 347 | fromGLFWkey GLFW.Key'Left = KEY_LEFT | 
| 346 | fromGLFWkey GLFW.Key'Right = KEY_RIGHT | 348 | fromGLFWkey GLFW.Key'Right = KEY_RIGHT | 
| 347 | fromGLFWkey _ = KEY_UNKNOWN | 349 | fromGLFWkey _ = KEY_UNKNOWN | 
| 348 | 350 | ||
| 349 | -- https://www.glfw.org/docs/3.3/group__buttons.html | 351 | -- https://www.glfw.org/docs/3.3/group__buttons.html | 
| 350 | fromGLFWbutton :: GLFW.MouseButton -> MouseButton | 352 | fromGLFWbutton :: GLFW.MouseButton -> MouseButton | 
| @@ -353,60 +355,60 @@ fromGLFWbutton GLFW.MouseButton'2 = RMB | |||
| 353 | fromGLFWbutton GLFW.MouseButton'3 = MMB | 355 | fromGLFWbutton GLFW.MouseButton'3 = MMB | 
| 354 | 356 | ||
| 355 | toGLFWkey :: Key -> GLFW.Key | 357 | toGLFWkey :: Key -> GLFW.Key | 
| 356 | toGLFWkey KEY_A = GLFW.Key'A | 358 | toGLFWkey KEY_A = GLFW.Key'A | 
| 357 | toGLFWkey KEY_B = GLFW.Key'B | 359 | toGLFWkey KEY_B = GLFW.Key'B | 
| 358 | toGLFWkey KEY_C = GLFW.Key'C | 360 | toGLFWkey KEY_C = GLFW.Key'C | 
| 359 | toGLFWkey KEY_D = GLFW.Key'D | 361 | toGLFWkey KEY_D = GLFW.Key'D | 
| 360 | toGLFWkey KEY_E = GLFW.Key'E | 362 | toGLFWkey KEY_E = GLFW.Key'E | 
| 361 | toGLFWkey KEY_F = GLFW.Key'F | 363 | toGLFWkey KEY_F = GLFW.Key'F | 
| 362 | toGLFWkey KEY_G = GLFW.Key'G | 364 | toGLFWkey KEY_G = GLFW.Key'G | 
| 363 | toGLFWkey KEY_H = GLFW.Key'H | 365 | toGLFWkey KEY_H = GLFW.Key'H | 
| 364 | toGLFWkey KEY_I = GLFW.Key'I | 366 | toGLFWkey KEY_I = GLFW.Key'I | 
| 365 | toGLFWkey KEY_J = GLFW.Key'J | 367 | toGLFWkey KEY_J = GLFW.Key'J | 
| 366 | toGLFWkey KEY_K = GLFW.Key'K | 368 | toGLFWkey KEY_K = GLFW.Key'K | 
| 367 | toGLFWkey KEY_L = GLFW.Key'L | 369 | toGLFWkey KEY_L = GLFW.Key'L | 
| 368 | toGLFWkey KEY_M = GLFW.Key'M | 370 | toGLFWkey KEY_M = GLFW.Key'M | 
| 369 | toGLFWkey KEY_N = GLFW.Key'N | 371 | toGLFWkey KEY_N = GLFW.Key'N | 
| 370 | toGLFWkey KEY_O = GLFW.Key'O | 372 | toGLFWkey KEY_O = GLFW.Key'O | 
| 371 | toGLFWkey KEY_P = GLFW.Key'P | 373 | toGLFWkey KEY_P = GLFW.Key'P | 
| 372 | toGLFWkey KEY_Q = GLFW.Key'Q | 374 | toGLFWkey KEY_Q = GLFW.Key'Q | 
| 373 | toGLFWkey KEY_R = GLFW.Key'R | 375 | toGLFWkey KEY_R = GLFW.Key'R | 
| 374 | toGLFWkey KEY_S = GLFW.Key'S | 376 | toGLFWkey KEY_S = GLFW.Key'S | 
| 375 | toGLFWkey KEY_T = GLFW.Key'T | 377 | toGLFWkey KEY_T = GLFW.Key'T | 
| 376 | toGLFWkey KEY_U = GLFW.Key'U | 378 | toGLFWkey KEY_U = GLFW.Key'U | 
| 377 | toGLFWkey KEY_V = GLFW.Key'V | 379 | toGLFWkey KEY_V = GLFW.Key'V | 
| 378 | toGLFWkey KEY_W = GLFW.Key'W | 380 | toGLFWkey KEY_W = GLFW.Key'W | 
| 379 | toGLFWkey KEY_X = GLFW.Key'X | 381 | toGLFWkey KEY_X = GLFW.Key'X | 
| 380 | toGLFWkey KEY_Y = GLFW.Key'Y | 382 | toGLFWkey KEY_Y = GLFW.Key'Y | 
| 381 | toGLFWkey KEY_Z = GLFW.Key'Z | 383 | toGLFWkey KEY_Z = GLFW.Key'Z | 
| 382 | toGLFWkey KEY_0 = GLFW.Key'0 | 384 | toGLFWkey KEY_0 = GLFW.Key'0 | 
| 383 | toGLFWkey KEY_1 = GLFW.Key'1 | 385 | toGLFWkey KEY_1 = GLFW.Key'1 | 
| 384 | toGLFWkey KEY_2 = GLFW.Key'2 | 386 | toGLFWkey KEY_2 = GLFW.Key'2 | 
| 385 | toGLFWkey KEY_3 = GLFW.Key'3 | 387 | toGLFWkey KEY_3 = GLFW.Key'3 | 
| 386 | toGLFWkey KEY_4 = GLFW.Key'4 | 388 | toGLFWkey KEY_4 = GLFW.Key'4 | 
| 387 | toGLFWkey KEY_5 = GLFW.Key'5 | 389 | toGLFWkey KEY_5 = GLFW.Key'5 | 
| 388 | toGLFWkey KEY_6 = GLFW.Key'6 | 390 | toGLFWkey KEY_6 = GLFW.Key'6 | 
| 389 | toGLFWkey KEY_7 = GLFW.Key'7 | 391 | toGLFWkey KEY_7 = GLFW.Key'7 | 
| 390 | toGLFWkey KEY_8 = GLFW.Key'8 | 392 | toGLFWkey KEY_8 = GLFW.Key'8 | 
| 391 | toGLFWkey KEY_9 = GLFW.Key'9 | 393 | toGLFWkey KEY_9 = GLFW.Key'9 | 
| 392 | toGLFWkey KEY_SPACE = GLFW.Key'Space | 394 | toGLFWkey KEY_SPACE = GLFW.Key'Space | 
| 393 | toGLFWkey KEY_F1 = GLFW.Key'F1 | 395 | toGLFWkey KEY_F1 = GLFW.Key'F1 | 
| 394 | toGLFWkey KEY_F2 = GLFW.Key'F2 | 396 | toGLFWkey KEY_F2 = GLFW.Key'F2 | 
| 395 | toGLFWkey KEY_F3 = GLFW.Key'F3 | 397 | toGLFWkey KEY_F3 = GLFW.Key'F3 | 
| 396 | toGLFWkey KEY_F4 = GLFW.Key'F4 | 398 | toGLFWkey KEY_F4 = GLFW.Key'F4 | 
| 397 | toGLFWkey KEY_F5 = GLFW.Key'F5 | 399 | toGLFWkey KEY_F5 = GLFW.Key'F5 | 
| 398 | toGLFWkey KEY_F6 = GLFW.Key'F6 | 400 | toGLFWkey KEY_F6 = GLFW.Key'F6 | 
| 399 | toGLFWkey KEY_F7 = GLFW.Key'F7 | 401 | toGLFWkey KEY_F7 = GLFW.Key'F7 | 
| 400 | toGLFWkey KEY_F8 = GLFW.Key'F8 | 402 | toGLFWkey KEY_F8 = GLFW.Key'F8 | 
| 401 | toGLFWkey KEY_F9 = GLFW.Key'F9 | 403 | toGLFWkey KEY_F9 = GLFW.Key'F9 | 
| 402 | toGLFWkey KEY_F10 = GLFW.Key'F10 | 404 | toGLFWkey KEY_F10 = GLFW.Key'F10 | 
| 403 | toGLFWkey KEY_F11 = GLFW.Key'F11 | 405 | toGLFWkey KEY_F11 = GLFW.Key'F11 | 
| 404 | toGLFWkey KEY_F12 = GLFW.Key'F12 | 406 | toGLFWkey KEY_F12 = GLFW.Key'F12 | 
| 405 | toGLFWkey KEY_ESC = GLFW.Key'Escape | 407 | toGLFWkey KEY_ESC = GLFW.Key'Escape | 
| 406 | toGLFWkey KEY_UP = GLFW.Key'Up | 408 | toGLFWkey KEY_UP = GLFW.Key'Up | 
| 407 | toGLFWkey KEY_DOWN = GLFW.Key'Down | 409 | toGLFWkey KEY_DOWN = GLFW.Key'Down | 
| 408 | toGLFWkey KEY_LEFT = GLFW.Key'Left | 410 | toGLFWkey KEY_LEFT = GLFW.Key'Left | 
| 409 | toGLFWkey KEY_RIGHT = GLFW.Key'Right | 411 | toGLFWkey KEY_RIGHT = GLFW.Key'Right | 
| 410 | toGLFWkey KEY_UNKNOWN = GLFW.Key'Unknown | 412 | toGLFWkey KEY_UNKNOWN = GLFW.Key'Unknown | 
| 411 | 413 | ||
| 412 | -- https://www.glfw.org/docs/3.3/group__buttons.html | 414 | -- https://www.glfw.org/docs/3.3/group__buttons.html | 
