module Engine.Window.MouseButton ( Callback , callback , GLFW.MouseButton(..) , GLFW.MouseButtonState(..) , GLFW.ModifierKeys(..) , mkCallback ) where import RIO import Graphics.UI.GLFW qualified as GLFW import RIO.App (appEnv) import UnliftIO.Resource (ReleaseKey) import UnliftIO.Resource qualified as Resource import Engine.Types (GlobalHandles(..), StageRIO) type Callback st = (GLFW.ModifierKeys, GLFW.MouseButtonState, GLFW.MouseButton) -> StageRIO st () callback :: Callback st -> StageRIO st ReleaseKey callback handler = do window <- asks $ ghWindow . appEnv withUnliftIO \ul -> GLFW.setMouseButtonCallback window . Just $ mkCallback ul handler Resource.register $ GLFW.setMouseButtonCallback window Nothing mkCallback :: UnliftIO (StageRIO st) -> Callback st -> GLFW.MouseButtonCallback mkCallback (UnliftIO ul) action = \_window button buttonState mods -> ul $ action (mods, buttonState, button)