module Graphics.Gloss.Internals.Interface.Display (displayWithBackend) where import Graphics.Gloss.Data.Color import Graphics.Gloss.Data.Picture import Graphics.Gloss.Internals.Render.Picture import Graphics.Gloss.Internals.Render.ViewPort import Graphics.Gloss.Internals.Interface.Backend import Graphics.Gloss.Internals.Interface.Window import Graphics.Gloss.Internals.Interface.Common.Exit import Graphics.Gloss.Internals.Interface.ViewPort import Graphics.Gloss.Internals.Interface.ViewPort.KeyMouse import Graphics.Gloss.Internals.Interface.ViewPort.Motion import Graphics.Gloss.Internals.Interface.ViewPort.Reshape import qualified Graphics.Gloss.Internals.Render.State as RS import qualified Graphics.Gloss.Internals.Interface.ViewPort.ControlState as VPC import qualified Graphics.Gloss.Internals.Interface.Callback as Callback import Data.IORef displayWithBackend :: Backend a => a -- ^ Initial state of the backend. -> Display -- ^ Display config. -> Color -- ^ Background color. -> Picture -- ^ The picture to draw. -> IO () displayWithBackend backend displayMode background picture = do viewSR <- newIORef viewPortInit viewControlSR <- newIORef VPC.stateInit renderS <- RS.stateInit renderSR <- newIORef renderS let renderFun backendRef = do view <- readIORef viewSR options <- readIORef renderSR withViewPort backendRef view (renderPicture backendRef options view picture) let callbacks = [ Callback.Display renderFun -- Escape exits the program , callback_exit () -- Viewport control with mouse , callback_viewPort_keyMouse viewSR viewControlSR , callback_viewPort_motion viewSR viewControlSR , callback_viewPort_reshape ] createWindow backend displayMode background callbacks