module Graphics.Wayland.Internal.Cursor (
  CursorTheme, CursorImage, Cursor,
  cursorImageSize, cursorImageHotspot, cursorImageDelay,
  cursorName, cursorImages,
  cursorThemeLoad, cursorThemeDestroy, cursorThemeGetCursor, cursorImageGetBuffer, cursorFrame
  ) where
import Control.Monad (liftM)
import Foreign
import Foreign.C.Types
import Foreign.C.String
import System.IO.Unsafe (unsafePerformIO)
import Graphics.Wayland.Internal.SpliceClientTypes (Shm(..), Buffer(..))
newtype CursorTheme = CursorTheme (Ptr (CursorTheme))
newtype CursorImage = CursorImage (Ptr (CursorImage))
cursorImageSize :: CursorImage -> (Word, Word)
cursorImageSize (CursorImage ci) = unsafePerformIO $ do 
  width <- (\ptr -> do {peekByteOff ptr 0 ::IO CUInt}) ci
  height <- (\ptr -> do {peekByteOff ptr 4 ::IO CUInt}) ci
  return (fromIntegral width, fromIntegral height)
cursorImageHotspot :: CursorImage -> (Word, Word)
cursorImageHotspot (CursorImage ci) = unsafePerformIO $ do 
  x <- (\ptr -> do {peekByteOff ptr 8 ::IO CUInt}) ci
  y <- (\ptr -> do {peekByteOff ptr 12 ::IO CUInt}) ci
  return (fromIntegral x, fromIntegral y)
cursorImageDelay :: CursorImage -> Word
cursorImageDelay (CursorImage ci) = unsafePerformIO $ liftM fromIntegral $ (\ptr -> do {peekByteOff ptr 16 ::IO CUInt}) ci 
newtype Cursor = Cursor (Ptr (Cursor))
cursorName :: Cursor -> String
cursorName (Cursor c) = unsafePerformIO $ do
  cstr <- (\ptr -> do {peekByteOff ptr 16 ::IO (Ptr CChar)}) c
  peekCString cstr
cursorImages :: Cursor -> [CursorImage]
cursorImages (Cursor c) = unsafePerformIO $ do
  imagesPtr <- (\ ptr -> (peekByteOff ptr (8) :: IO (Ptr (Ptr CursorImage)))) c
  count <- (\ptr -> do {peekByteOff ptr 0 ::IO CUInt}) c
  return imagesPtr
  ptrs <- peekArray (fromIntegral count) imagesPtr
  return $ map CursorImage ptrs
cursorThemeLoad :: (String) -> (Int) -> (Shm) -> IO ((CursorTheme))
cursorThemeLoad a1 a2 a3 =
  withCString a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  let {a3' = id a3} in 
  cursorThemeLoad'_ a1' a2' a3' >>= \res ->
  let {res' = id res} in
  return (res')
cursorThemeDestroy :: (CursorTheme) -> IO ()
cursorThemeDestroy a1 =
  let {a1' = id a1} in 
  cursorThemeDestroy'_ a1' >>
  return ()
cursorThemeGetCursor :: (CursorTheme) -> (String) -> IO ((Cursor))
cursorThemeGetCursor a1 a2 =
  let {a1' = id a1} in 
  withCString a2 $ \a2' -> 
  cursorThemeGetCursor'_ a1' a2' >>= \res ->
  let {res' = id res} in
  return (res')
cursorImageGetBuffer :: (CursorImage) -> IO ((Buffer))
cursorImageGetBuffer a1 =
  let {a1' = id a1} in 
  cursorImageGetBuffer'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
cursorFrame :: (Cursor) -> (Int) -> IO ((Int))
cursorFrame a1 a2 =
  let {a1' = id a1} in 
  let {a2' = fromIntegral a2} in 
  cursorFrame'_ a1' a2' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
foreign import ccall unsafe "Graphics/Wayland/Internal/Cursor.chs.h wl_cursor_theme_load"
  cursorThemeLoad'_ :: ((Ptr CChar) -> (CInt -> ((Shm) -> (IO (CursorTheme)))))
foreign import ccall unsafe "Graphics/Wayland/Internal/Cursor.chs.h wl_cursor_theme_destroy"
  cursorThemeDestroy'_ :: ((CursorTheme) -> (IO ()))
foreign import ccall unsafe "Graphics/Wayland/Internal/Cursor.chs.h wl_cursor_theme_get_cursor"
  cursorThemeGetCursor'_ :: ((CursorTheme) -> ((Ptr CChar) -> (IO (Cursor))))
foreign import ccall unsafe "Graphics/Wayland/Internal/Cursor.chs.h wl_cursor_image_get_buffer"
  cursorImageGetBuffer'_ :: ((CursorImage) -> (IO (Buffer)))
foreign import ccall unsafe "Graphics/Wayland/Internal/Cursor.chs.h wl_cursor_frame"
  cursorFrame'_ :: ((Cursor) -> (CUInt -> (IO CInt)))