summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-26 13:52:01 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-26 13:52:01 -0400
commit18e45a872079dce2edf1cc120208df7637bc947d (patch)
tree67651392b8bead1918d1bbc10a307fc267cde243
parentec5dad0999ca2b56422f4e3442a5aeee5672cb87 (diff)
MeshSketch: fullscreen toggle.
-rw-r--r--MeshSketch.hs35
1 files changed, 27 insertions, 8 deletions
diff --git a/MeshSketch.hs b/MeshSketch.hs
index 0040359..571cffe 100644
--- a/MeshSketch.hs
+++ b/MeshSketch.hs
@@ -9,7 +9,7 @@ import Data.IORef
9import Foreign.C.Types 9import Foreign.C.Types
10import GI.Gdk 10import GI.Gdk
11import GI.GObject.Functions 11import GI.GObject.Functions
12import GI.Gtk 12import GI.Gtk hiding (IsWindow,windowFullscreen,windowUnfullscreen)
13import Numeric.LinearAlgebra 13import Numeric.LinearAlgebra
14 14
15import CubeMap 15import CubeMap
@@ -31,11 +31,13 @@ data Camera = Camera
31 } 31 }
32 32
33data State = State 33data State = State
34 { stCamera :: IORef Camera 34 { stCamera :: IORef Camera
35 , stSkyboxes :: Skyboxes 35 , stSkyboxes :: Skyboxes
36 , stSkybox :: IORef Int 36 , stSkybox :: IORef Int
37 , stFullscreen :: IO ()
37 } 38 }
38 39
40initCamera :: Camera
39initCamera = Camera 41initCamera = Camera
40 { camHeightAngle = pi/6 42 { camHeightAngle = pi/6
41 , camTarget = fromList [0,0,0] 43 , camTarget = fromList [0,0,0]
@@ -76,10 +78,14 @@ onRealize mm@(MeshMaker w ref) = do
76 cam <- newIORef initCamera 78 cam <- newIORef initCamera
77 skyboxes <- loadSkyboxes 79 skyboxes <- loadSkyboxes
78 skybox <- newIORef 0 80 skybox <- newIORef 0
81 Just pwidget <- get w #parent
82 Just parent <- get pwidget #window
83 toggle <- mkFullscreenToggle parent
79 let st = State 84 let st = State
80 { stCamera = cam 85 { stCamera = cam
81 , stSkyboxes = skyboxes 86 , stSkyboxes = skyboxes
82 , stSkybox = skybox 87 , stSkybox = skybox
88 , stFullscreen = toggle
83 } 89 }
84 90
85 _ <- on w #event $ onEvent w st 91 _ <- on w #event $ onEvent w st
@@ -99,6 +105,7 @@ onRender :: MeshMaker -> GLContext -> IO Bool
99onRender (MeshMaker w ref) gl = do 105onRender (MeshMaker w ref) gl = do
100 return True 106 return True
101 107
108onEvent :: w -> State -> Event -> IO Bool
102onEvent w st ev = do 109onEvent w st ev = do
103 msrc <- eventGetSourceDevice ev 110 msrc <- eventGetSourceDevice ev
104 inputSource <- forM msrc $ \src -> do 111 inputSource <- forM msrc $ \src -> do
@@ -125,13 +132,25 @@ onEvent w st ev = do
125 EventTypeKeyPress -> do 132 EventTypeKeyPress -> do
126 kev <- get ev #key 133 kev <- get ev #key
127 val <- get kev #keyval 134 val <- get kev #keyval
128 when (val `elem` [KEY_N,KEY_n]) $ do 135 if (val `elem` [KEY_N,KEY_n]) then do
129 modifyIORef' (stSkybox st) $ \n -> (n + 1) `mod` (skyboxCount $ stSkyboxes st) 136 modifyIORef' (stSkybox st) $ \n -> (n + 1) `mod` (skyboxCount $ stSkyboxes st)
130 idx <- readIORef (stSkybox st) 137 idx <- readIORef (stSkybox st)
131 put (skyboxNames (stSkyboxes st) !! idx) 138 put (skyboxNames (stSkyboxes st) !! idx)
132 return () 139 return ()
140 else when (val `elem` [KEY_F,KEY_f]) $ do
141 put 'F'
142 stFullscreen st
133 return () 143 return ()
134 144
135 e -> return () 145 e -> return ()
136 146
137 return False 147 return False
148
149mkFullscreenToggle :: IsWindow a => a -> IO (IO ())
150mkFullscreenToggle w = do
151 full <- newIORef False
152 return $ do
153 b <- atomicModifyIORef' full $ \b -> (not b, not b)
154 if b then windowFullscreen w
155 else windowUnfullscreen w
156