brillo-1.13.3: Brillo/Internals/Interface/Window.hs
{-# OPTIONS_HADDOCK hide #-}
-- | The main display function.
module Brillo.Internals.Interface.Window (createWindow)
where
import Brillo.Data.Color
import Brillo.Internals.Color
import Brillo.Internals.Interface.Backend
import Brillo.Internals.Interface.Debug
import Control.Monad
import Data.IORef (IORef, newIORef)
import Graphics.Rendering.OpenGL (($=))
import Graphics.Rendering.OpenGL.GL qualified as GL
-- | Open a window and use the supplied callbacks to handle window events.
createWindow
:: (Backend a)
=> a
-> Display
-> Color
-- ^ Color to use when clearing.
-> [Callback]
-- ^ Callbacks to use.
-> (IORef a -> IO ())
-- ^ Give the backend back to the caller before
-- entering the main loop.
-> IO ()
createWindow
backend
display
clearColor
callbacks
eatBackend =
do
-- Turn this on to spew debugging info to stdout
let debug = False
-- Initialize backend state
backendStateRef <- newIORef backend
when debug $
do putStr $ "* displayInWindow\n"
-- Intialize backend
initializeBackend backendStateRef debug
-- Here we go!
when debug $
do putStr $ "* c window\n\n"
-- Open window
openWindow backendStateRef display
-- Setup callbacks
installDisplayCallback backendStateRef callbacks
installWindowCloseCallback backendStateRef
installReshapeCallback backendStateRef callbacks
installKeyMouseCallback backendStateRef callbacks
installMotionCallback backendStateRef callbacks
installIdleCallback backendStateRef callbacks
-- we don't need the depth buffer for 2d.
GL.depthFunc $= Just GL.Always
-- always clear the buffer to white
GL.clearColor $= glColor4OfColor clearColor
-- Dump some debugging info
when debug $
do
dumpBackendState backendStateRef
dumpFramebufferState
dumpFragmentState
eatBackend backendStateRef
when debug $
do putStr $ "* entering mainloop..\n"
-- Start the main backend loop
runMainLoop backendStateRef
when debug $
putStr $
"* all done\n"