{-# LINE 1 "src/SFML/Window/Event.hsc" #-}
{-# LANGUAGE CPP, ForeignFunctionInterface #-}
{-# LINE 2 "src/SFML/Window/Event.hsc" #-}
module SFML.Window.Event
(
    SFEvent(..)
)
where


import SFML.Window.Joystick
import SFML.Window.Keyboard
import SFML.Window.Mouse

import Control.Applicative ((<$>), (<*>))
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable


{-# LINE 21 "src/SFML/Window/Event.hsc" #-}


data SFEvent
    = SFEvtClosed
    | SFEvtResized
    { width  :: Int
    , height :: Int
    }
    | SFEvtLostFocus
    | SFEvtGainedFocus
    | SFEvtTextEntered
    { text :: String
    }
    | SFEvtKeyPressed
    { code  :: KeyCode
    , alt   :: Bool
    , ctrl  :: Bool
    , shift :: Bool
    , sys   :: Bool
    }
    | SFEvtKeyReleased
    { code  :: KeyCode
    , alt   :: Bool
    , ctrl  :: Bool
    , shift :: Bool
    , sys   :: Bool
    }
    | SFEvtMouseWheelMoved
    { moveDelta :: Int
    , x         :: Int
    , y         :: Int
    }
    | SFEvtMouseWheelScrolled
    { wheel       :: MouseWheel
    , scrollDelta :: Float
    , x           :: Int
    , y           :: Int
    }
    | SFEvtMouseButtonPressed
    { button :: MouseButton
    , x      :: Int
    , y      :: Int
    }
    | SFEvtMouseButtonReleased
    { button :: MouseButton
    , x      :: Int
    , y      :: Int
    }
    | SFEvtMouseMoved
    { x :: Int
    , y :: Int
    }
    | SFEvtMouseEntered
    | SFEvtMouseLeft
    | SFEvtJoystickButtonPressed
    { joystickId :: Int
    , joystickBt :: Int
    }
    | SFEvtJoystickButtonReleased
    { joystickId :: Int
    , joystickBt :: Int
    }
    | SFEvtJoystickMoved
    { joystickId   :: Int
    , joystickAxis :: JoystickAxis
    , position     :: Float
    }
    | SFEvtJoystickConnected
    { joystickId :: Int
    }
    | SFEvtJoystickDisconnected
    { joystickId :: Int
    }
    deriving (Eq, Show)


sizeInt = (4)
{-# LINE 98 "src/SFML/Window/Event.hsc" #-}
sizeChar = (1)
{-# LINE 99 "src/SFML/Window/Event.hsc" #-}


instance Storable SFEvent where
    sizeOf _ = (24)
{-# LINE 103 "src/SFML/Window/Event.hsc" #-}
    alignment _ = alignment (undefined :: CInt)

    peek ptr' =
        let ptr'' = castPtr ptr' :: Ptr CInt
        in do
            let ptr = castPtr ptr''
            eventType <- peek ptr'' :: IO CInt
            case eventType of
                0  -> return SFEvtClosed
                1  -> SFEvtResized
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4)  ptr :: IO CUInt)
{-# LINE 114 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt)
{-# LINE 115 "src/SFML/Window/Event.hsc" #-}
                2  -> return SFEvtLostFocus
                3  -> return SFEvtGainedFocus
                4  -> peekCAString (plusPtr ptr sizeInt) >>= return . SFEvtTextEntered
                5  -> SFEvtKeyPressed
                   <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 120 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 121 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 122 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO CInt)
{-# LINE 123 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 20) ptr :: IO CInt)
{-# LINE 124 "src/SFML/Window/Event.hsc" #-}
                6  -> SFEvtKeyReleased
                   <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 126 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 127 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 128 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO CInt)
{-# LINE 129 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap (toEnum . fromIntegral) ((\hsc_ptr -> peekByteOff hsc_ptr 20) ptr :: IO CInt)
{-# LINE 130 "src/SFML/Window/Event.hsc" #-}
                7  -> SFEvtMouseWheelMoved
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CInt)
{-# LINE 132 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 133 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 134 "src/SFML/Window/Event.hsc" #-}
                8 -> SFEvtMouseWheelScrolled
                  <$> ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO MouseWheel)
{-# LINE 136 "src/SFML/Window/Event.hsc" #-}
                  <*> fmap realToFrac   ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CFloat)
{-# LINE 137 "src/SFML/Window/Event.hsc" #-}
                  <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 138 "src/SFML/Window/Event.hsc" #-}
                  <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO CInt)
{-# LINE 139 "src/SFML/Window/Event.hsc" #-}
                9  -> SFEvtMouseButtonPressed
                   <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 141 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 142 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 143 "src/SFML/Window/Event.hsc" #-}
                10 -> SFEvtMouseButtonReleased
                   <$> (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 145 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 146 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt)
{-# LINE 147 "src/SFML/Window/Event.hsc" #-}
                11 -> SFEvtMouseMoved
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CInt)
{-# LINE 149 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt)
{-# LINE 150 "src/SFML/Window/Event.hsc" #-}
                12 -> return SFEvtMouseEntered
                13 -> return SFEvtMouseLeft
                14 -> SFEvtJoystickButtonPressed
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt)
{-# LINE 154 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt)
{-# LINE 155 "src/SFML/Window/Event.hsc" #-}
                15 -> SFEvtJoystickButtonReleased
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt)
{-# LINE 157 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt)
{-# LINE 158 "src/SFML/Window/Event.hsc" #-}
                16 -> SFEvtJoystickMoved
                   <$> fmap fromIntegral ((\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt)
{-# LINE 160 "src/SFML/Window/Event.hsc" #-}
                   <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 161 "src/SFML/Window/Event.hsc" #-}
                   <*> fmap realToFrac ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CFloat)
{-# LINE 162 "src/SFML/Window/Event.hsc" #-}
                17 -> peekByteOff ptr sizeInt >>= return . SFEvtJoystickConnected
                18 -> peekByteOff ptr sizeInt >>= return . SFEvtJoystickDisconnected

    poke ptr evt = return ()