packages feed

dear-imgui-impl-sdl3-1.0.0: src/DearImGui/Impl/SDL3.hs

module DearImGui.Impl.SDL3
  ( windowPtr
  , rendererPtr
  , eventPtr
  , gamepadPtr
  , initForOpenGL
  , initForVulkan
  , initForSDLRenderer
  , initForSDLGPU
  , initForOther
  , withInitForOpenGL
  , withInitForVulkan
  , withInitForSDLRenderer
  , withInitForSDLGPU
  , withInitForOther
  , processEvent
  , pollEvent
  , Raw.newFrame
  , Raw.setGamepadMode
  , Raw.setMouseCaptureMode
  , Raw.shutdown
  ) where

import Control.Monad (void, when)
import Control.Monad.IO.Unlift (MonadUnliftIO)
import Foreign.Marshal.Utils (toBool)
import Foreign.Ptr (Ptr, castPtr)
import SDL3.Sys qualified as SDL3

import DearImGui.Impl.Init (withInitOrFail)
import DearImGui.Raw.Impl.SDL3 (SDL_Event, SDL_Gamepad, SDL_Renderer, SDL_Window)
import DearImGui.Raw.Impl.SDL3 qualified as Raw

windowPtr :: Ptr SDL3.SDL_Window -> Ptr SDL_Window
windowPtr = castPtr

rendererPtr :: Ptr SDL3.SDL_Renderer -> Ptr SDL_Renderer
rendererPtr = castPtr

eventPtr :: Ptr SDL3.SDL_Event -> Ptr SDL_Event
eventPtr = castPtr

gamepadPtr :: Ptr SDL3.SDL_Gamepad -> Ptr SDL_Gamepad
gamepadPtr = castPtr

initForOpenGL :: Ptr SDL3.SDL_Window -> SDL3.SDL_GLContext -> IO Bool
initForOpenGL window (SDL3.SDL_GLContext context) =
  toBool <$> Raw.initForOpenGL (windowPtr window) (castPtr context)

initForVulkan :: Ptr SDL3.SDL_Window -> IO Bool
initForVulkan window =
  toBool <$> Raw.initForVulkan (windowPtr window)

initForSDLRenderer :: Ptr SDL3.SDL_Window -> Ptr SDL3.SDL_Renderer -> IO Bool
initForSDLRenderer window renderer =
  toBool <$> Raw.initForSDLRenderer (windowPtr window) (rendererPtr renderer)

initForSDLGPU :: Ptr SDL3.SDL_Window -> IO Bool
initForSDLGPU window =
  toBool <$> Raw.initForSDLGPU (windowPtr window)

initForOther :: Ptr SDL3.SDL_Window -> IO Bool
initForOther window =
  toBool <$> Raw.initForOther (windowPtr window)

withInitForOpenGL :: (MonadUnliftIO m) => Ptr SDL3.SDL_Window -> SDL3.SDL_GLContext -> m a -> m a
withInitForOpenGL window context =
  withInitOrFail "ImGui_ImplSDL3_InitForOpenGL" (initForOpenGL window context) Raw.shutdown

withInitForVulkan :: (MonadUnliftIO m) => Ptr SDL3.SDL_Window -> m a -> m a
withInitForVulkan window =
  withInitOrFail "ImGui_ImplSDL3_InitForVulkan" (initForVulkan window) Raw.shutdown

withInitForSDLRenderer :: (MonadUnliftIO m) => Ptr SDL3.SDL_Window -> Ptr SDL3.SDL_Renderer -> m a -> m a
withInitForSDLRenderer window renderer =
  withInitOrFail "ImGui_ImplSDL3_InitForSDLRenderer" (initForSDLRenderer window renderer) Raw.shutdown

withInitForSDLGPU :: (MonadUnliftIO m) => Ptr SDL3.SDL_Window -> m a -> m a
withInitForSDLGPU window =
  withInitOrFail "ImGui_ImplSDL3_InitForSDLGPU" (initForSDLGPU window) Raw.shutdown

withInitForOther :: (MonadUnliftIO m) => Ptr SDL3.SDL_Window -> m a -> m a
withInitForOther window =
  withInitOrFail "ImGui_ImplSDL3_InitForOther" (initForOther window) Raw.shutdown

processEvent :: Ptr SDL3.SDL_Event -> IO Bool
processEvent event =
  toBool <$> Raw.processEvent (eventPtr event)

pollEvent :: Ptr SDL3.SDL_Event -> IO Bool
pollEvent event = do
  pending <- SDL3.pollEventSafe event
  when pending $
    void (processEvent event)
  pure pending