packages feed

sdl3-bindgen-sys-0.0.1.0: src/SDL3/Sys/Bindgen/Touch.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- | SDL offers touch input, on platforms that support it. It can manage multiple touch devices and track multiple fingers on those devices.
--
--     Touches are mostly dealt with through the event system, in the SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP events, but there are also functions to query for hardware details, etc.
--
--     The touch system, by default, will also send virtual mouse events; this can be useful for making a some desktop apps work on a phone without significant changes. For apps that care about mouse and touch input separately, they should ignore mouse events that have a @which@ field of SDL_TOUCH_MOUSEID. A unique ID for a touch device.
--
--     This ID is valid for the time the device is connected to the system, and is never reused for the lifetime of the application.
--
--     The value 0 is an invalid ID.
--
--     @since 3.2.0
module SDL3.Sys.Bindgen.Touch (
  SDL3.Sys.Bindgen.Touch.SDL_TouchID (..),
  SDL3.Sys.Bindgen.Touch.SDL_FingerID (..),
  SDL3.Sys.Bindgen.Touch.SDL_TouchDeviceType (..),
  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INVALID,
  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_DIRECT,
  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE,
  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INDIRECT_RELATIVE,
  SDL3.Sys.Bindgen.Touch.SDL_Finger (..),
)
where

import Prelude (
  Bounded,
  Enum,
  Eq,
  Int,
  Integral,
  Num,
  Ord,
  Read,
  Real,
  Show,
  pure,
  (<*>),
  (>>),
  type (~),
 )

import HsBindgen.Runtime.CEnum qualified as CEnum
import HsBindgen.Runtime.HasCField qualified as HasCField
import HsBindgen.Runtime.Marshal qualified as Marshal
import HsBindgen.Runtime.Struct qualified as Struct
import HsBindgen.Runtime.Support qualified as BG
import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
import SDL3.Sys.Bindgen.Stdinc qualified

-- | [C declaration]: @SDL_TouchID@, defined at @SDL3\/SDL_touch.h 62:16@
newtype SDL_TouchID = SDL_TouchID
  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
  }
  deriving stock (BG.Generic, Eq, Ord, Read, Show)
  deriving newtype
    ( BG.Bitfield
    , BG.Bits
    , BG.FiniteBits
    , BG.HasFFIType
    , BG.Ix
    , BG.Prim
    , BG.Storable
    , Bounded
    , Enum
    , Integral
    , Marshal.ReadRaw
    , Marshal.StaticSize
    , Marshal.WriteRaw
    , Num
    , Real
    )

instance
  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
  => BG.CompatHasField.HasField "unwrap" SDL_TouchID ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_TouchID{unwrap = y1}
      , BG.getField @"unwrap" x0
      )

instance
  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
  => BG.HasField "unwrap" (BG.Ptr SDL_TouchID) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"unwrap")

instance HasCField.HasCField SDL_TouchID "unwrap" where
  type
    CFieldType SDL_TouchID "unwrap" =
      SDL3.Sys.Bindgen.Stdinc.Uint64

  offset# = \_ -> \_ -> 0

-- | A unique ID for a single finger on a touch device.
--
--     This ID is valid for the time the finger (stylus, etc) is touching and will be unique for all fingers currently in contact, so this ID tracks the lifetime of a single continuous touch. This value may represent an index, a pointer, or some other unique ID, depending on the platform.
--
--     The value 0 is an invalid ID.
--
--     @since 3.2.0
--
--     [C declaration]: @SDL_FingerID@, defined at @SDL3\/SDL_touch.h 76:16@
newtype SDL_FingerID = SDL_FingerID
  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
  }
  deriving stock (BG.Generic, Eq, Ord, Read, Show)
  deriving newtype
    ( BG.Bitfield
    , BG.Bits
    , BG.FiniteBits
    , BG.HasFFIType
    , BG.Ix
    , BG.Prim
    , BG.Storable
    , Bounded
    , Enum
    , Integral
    , Marshal.ReadRaw
    , Marshal.StaticSize
    , Marshal.WriteRaw
    , Num
    , Real
    )

instance
  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
  => BG.CompatHasField.HasField "unwrap" SDL_FingerID ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_FingerID{unwrap = y1}
      , BG.getField @"unwrap" x0
      )

instance
  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
  => BG.HasField "unwrap" (BG.Ptr SDL_FingerID) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"unwrap")

instance HasCField.HasCField SDL_FingerID "unwrap" where
  type
    CFieldType SDL_FingerID "unwrap" =
      SDL3.Sys.Bindgen.Stdinc.Uint64

  offset# = \_ -> \_ -> 0

-- | An enum that describes the type of a touch device.
--
--     @since 3.2.0
--
--     [C declaration]: @enum SDL_TouchDeviceType@, defined at @SDL3\/SDL_touch.h 83:14@
newtype SDL_TouchDeviceType = SDL_TouchDeviceType
  { unwrap :: BG.CInt
  }
  deriving stock (BG.Generic, Eq, Ord)
  deriving newtype (BG.HasFFIType)

instance Marshal.StaticSize SDL_TouchDeviceType where
  staticSizeOf = \_ -> (4 :: Int)

  staticAlignment = \_ -> (4 :: Int)

instance Marshal.ReadRaw SDL_TouchDeviceType where
  readRaw =
    \ptr0 ->
      pure SDL_TouchDeviceType
        <*> Marshal.readRawByteOff ptr0 (0 :: Int)

instance Marshal.WriteRaw SDL_TouchDeviceType where
  writeRaw =
    \ptr0 ->
      \s1 ->
        case s1 of
          SDL_TouchDeviceType unwrap2 ->
            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2

deriving via Marshal.EquivStorable SDL_TouchDeviceType instance BG.Storable SDL_TouchDeviceType

deriving via BG.CInt instance BG.Prim SDL_TouchDeviceType

instance CEnum.CEnum SDL_TouchDeviceType where
  type CEnumZ SDL_TouchDeviceType = BG.CInt

  toCEnum = SDL_TouchDeviceType

  fromCEnum = BG.getField @"unwrap"

  declaredValues =
    \_ ->
      CEnum.declaredValuesFromList
        [ (-1, BG.singleton "SDL_TOUCH_DEVICE_INVALID")
        , (0, BG.singleton "SDL_TOUCH_DEVICE_DIRECT")
        , (1, BG.singleton "SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE")
        , (2, BG.singleton "SDL_TOUCH_DEVICE_INDIRECT_RELATIVE")
        ]

  showsUndeclared =
    CEnum.showsWrappedUndeclared "SDL_TouchDeviceType"

  readPrecUndeclared =
    CEnum.readPrecWrappedUndeclared "SDL_TouchDeviceType"

  isDeclared = CEnum.seqIsDeclared

  mkDeclared = CEnum.seqMkDeclared

instance CEnum.SequentialCEnum SDL_TouchDeviceType where
  minDeclaredValue = SDL_TOUCH_DEVICE_INVALID

  maxDeclaredValue = SDL_TOUCH_DEVICE_INDIRECT_RELATIVE

instance Show SDL_TouchDeviceType where
  showsPrec = CEnum.shows

instance Read SDL_TouchDeviceType where
  readPrec = CEnum.readPrec

  readList = BG.readListDefault

  readListPrec = BG.readListPrecDefault

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "unwrap" SDL_TouchDeviceType ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_TouchDeviceType{unwrap = y1}
      , BG.getField @"unwrap" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "unwrap" (BG.Ptr SDL_TouchDeviceType) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"unwrap")

instance HasCField.HasCField SDL_TouchDeviceType "unwrap" where
  type
    CFieldType SDL_TouchDeviceType "unwrap" =
      BG.CInt

  offset# = \_ -> \_ -> 0

-- | [C declaration]: @SDL_TOUCH_DEVICE_INVALID@, defined at @SDL3\/SDL_touch.h 85:5@
pattern SDL_TOUCH_DEVICE_INVALID :: SDL_TouchDeviceType
pattern SDL_TOUCH_DEVICE_INVALID = SDL_TouchDeviceType (-1)

-- | touch screen with window-relative coordinates
--
--     [C declaration]: @SDL_TOUCH_DEVICE_DIRECT@, defined at @SDL3\/SDL_touch.h 86:5@
pattern SDL_TOUCH_DEVICE_DIRECT :: SDL_TouchDeviceType
pattern SDL_TOUCH_DEVICE_DIRECT = SDL_TouchDeviceType 0

-- | trackpad with absolute device coordinates
--
--     [C declaration]: @SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE@, defined at @SDL3\/SDL_touch.h 87:5@
pattern SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE :: SDL_TouchDeviceType
pattern SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE = SDL_TouchDeviceType 1

-- | trackpad with screen cursor-relative coordinates
--
--     [C declaration]: @SDL_TOUCH_DEVICE_INDIRECT_RELATIVE@, defined at @SDL3\/SDL_touch.h 88:5@
pattern SDL_TOUCH_DEVICE_INDIRECT_RELATIVE :: SDL_TouchDeviceType
pattern SDL_TOUCH_DEVICE_INDIRECT_RELATIVE = SDL_TouchDeviceType 2

-- | Data about a single finger in a multitouch event.
--
--     Each touch event is a collection of fingers that are simultaneously in contact with the touch device (so a \"touch\" can be a \"multitouch,\" in reality), and this struct reports details of the specific fingers.
--
--     @since 3.2.0
--
--     [See also]: 'sDL_GetTouchFingers'
--
--     [C declaration]: @struct SDL_Finger@, defined at @SDL3\/SDL_touch.h 102:16@
data SDL_Finger = SDL_Finger
  { id :: SDL_FingerID
  -- ^ the finger ID
  --
  --          [C declaration]: @id@, defined at @SDL3\/SDL_touch.h 104:18@
  , x :: BG.CFloat
  -- ^ the x-axis location of the touch event, normalized (0...1)
  --
  --          [C declaration]: @x@, defined at @SDL3\/SDL_touch.h 105:11@
  , y :: BG.CFloat
  -- ^ the y-axis location of the touch event, normalized (0...1)
  --
  --          [C declaration]: @y@, defined at @SDL3\/SDL_touch.h 106:11@
  , pressure :: BG.CFloat
  -- ^ the quantity of pressure applied, normalized (0...1)
  --
  --          [C declaration]: @pressure@, defined at @SDL3\/SDL_touch.h 107:11@
  }
  deriving stock (BG.Generic, Eq, Show)

instance Marshal.StaticSize SDL_Finger where
  staticSizeOf = \_ -> (24 :: Int)

  staticAlignment = \_ -> (8 :: Int)

instance Marshal.ReadRaw SDL_Finger where
  readRaw =
    \ptr0 ->
      pure SDL_Finger
        <*> HasCField.readRaw (BG.Proxy @"id") ptr0
        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
        <*> HasCField.readRaw (BG.Proxy @"pressure") ptr0

instance Marshal.WriteRaw SDL_Finger where
  writeRaw =
    \ptr0 ->
      \s1 ->
        case s1 of
          SDL_Finger id2 x3 y4 pressure5 ->
            HasCField.writeRaw (BG.Proxy @"id") ptr0 id2
              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x3
              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y4
              >> HasCField.writeRaw (BG.Proxy @"pressure") ptr0 pressure5

deriving via Marshal.EquivStorable SDL_Finger instance BG.Storable SDL_Finger

deriving via Struct.IsStructViaReadRaw SDL_Finger instance Struct.IsStruct SDL_Finger

-- | the finger ID
--
--     [C declaration]: @id@, defined at @SDL3\/SDL_touch.h 104:18@
instance
  (ty ~ SDL_FingerID)
  => BG.CompatHasField.HasField "id" SDL_Finger ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_Finger
            { id = y1
            , x = BG.getField @"x" x0
            , y = BG.getField @"y" x0
            , pressure = BG.getField @"pressure" x0
            }
      , BG.getField @"id" x0
      )

instance
  (ty ~ SDL_FingerID)
  => BG.HasField "id" (BG.Ptr SDL_Finger) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"id")

instance HasCField.HasCField SDL_Finger "id" where
  type CFieldType SDL_Finger "id" = SDL_FingerID

  offset# = \_ -> \_ -> 0

-- | the x-axis location of the touch event, normalized (0...1)
--
--     [C declaration]: @x@, defined at @SDL3\/SDL_touch.h 105:11@
instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "x" SDL_Finger ty where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_Finger
            { x = y1
            , id = BG.getField @"id" x0
            , y = BG.getField @"y" x0
            , pressure = BG.getField @"pressure" x0
            }
      , BG.getField @"x" x0
      )

instance
  (ty ~ BG.CFloat)
  => BG.HasField "x" (BG.Ptr SDL_Finger) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"x")

instance HasCField.HasCField SDL_Finger "x" where
  type CFieldType SDL_Finger "x" = BG.CFloat

  offset# = \_ -> \_ -> 8

-- | the y-axis location of the touch event, normalized (0...1)
--
--     [C declaration]: @y@, defined at @SDL3\/SDL_touch.h 106:11@
instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "y" SDL_Finger ty where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_Finger
            { y = y1
            , id = BG.getField @"id" x0
            , x = BG.getField @"x" x0
            , pressure = BG.getField @"pressure" x0
            }
      , BG.getField @"y" x0
      )

instance
  (ty ~ BG.CFloat)
  => BG.HasField "y" (BG.Ptr SDL_Finger) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"y")

instance HasCField.HasCField SDL_Finger "y" where
  type CFieldType SDL_Finger "y" = BG.CFloat

  offset# = \_ -> \_ -> 12

-- | the quantity of pressure applied, normalized (0...1)
--
--     [C declaration]: @pressure@, defined at @SDL3\/SDL_touch.h 107:11@
instance
  (ty ~ BG.CFloat)
  => BG.CompatHasField.HasField "pressure" SDL_Finger ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_Finger
            { pressure = y1
            , id = BG.getField @"id" x0
            , x = BG.getField @"x" x0
            , y = BG.getField @"y" x0
            }
      , BG.getField @"pressure" x0
      )

instance
  (ty ~ BG.CFloat)
  => BG.HasField "pressure" (BG.Ptr SDL_Finger) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"pressure")

instance HasCField.HasCField SDL_Finger "pressure" where
  type CFieldType SDL_Finger "pressure" = BG.CFloat

  offset# = \_ -> \_ -> 16