{-# LANGUAGE OverloadedStrings #-} module Main where import Foreign.C.Types (CInt) import Control.Monad.IO.Class (MonadIO) import Control.Exception (catch, SomeException) import Text.Pretty.Simple (pPrintNoColor) import SDL myPPrint :: (Show a, MonadIO m) => a -> m () myPPrint = pPrintNoColor checkRenderDriver :: Window -> (CInt, RendererInfo) -> IO () checkRenderDriver window driver = do maybeRenderer <- tryRenderDriver window driver case maybeRenderer of (Just renderer) -> destroyRenderer renderer Nothing -> return () tryRenderDriver :: Window -> (CInt, RendererInfo) -> IO (Maybe Renderer) tryRenderDriver window (idx, info) = catch (do putStrLn "== trying driver:" myPPrint info -- if idx is given, defaultRenderer is ignored -- the documentation of the haskell packages sdl2 doesn't mention this -- but the sdl2 documentation itself does, see: https://wiki.libsdl.org/SDL_CreateRenderer renderer <- createRenderer window idx defaultRenderer putStrLn "** success" return (Just renderer)) (\e -> do putStrLn ("-- couldn't load driver number " ++ show idx ++ ":") myPPrint (e :: SomeException) return Nothing) checkRenderDrivers :: Window -> IO () checkRenderDrivers window = do drivers <- zip [0 ..] <$> getRenderDriverInfo putStrLn ("there are " ++ show (length drivers) ++ " drivers to check") mapM_ (checkRenderDriver window) drivers main :: IO () main = do initializeAll window <- createWindow "sdl-try-drivers" defaultWindow {windowResizable = True} checkRenderDrivers window destroyWindow window