module SFML.Window.Event
(
SFEvent(..)
)
where
import SFML.Window.Joystick
import SFML.Window.Keyboard
import SFML.Window.Mouse
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable
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
{ delta :: Int
, 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
}
sizeInt = (4)
sizeChar = (1)
instance Storable SFEvent where
sizeOf _ = (24)
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 -> do
w <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt
h <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt
return $ SFEvtResized (fromIntegral w) (fromIntegral h)
2 -> return SFEvtLostFocus
3 -> return SFEvtGainedFocus
4 -> peekCAString (plusPtr ptr sizeInt) >>= return . SFEvtTextEntered
5 -> do
code <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
alt <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
ctrl <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt
shift <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO CInt
sys <- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr :: IO CInt
return $ SFEvtKeyPressed code (toEnum . fromIntegral $ alt) (toEnum . fromIntegral $ ctrl)
(toEnum . fromIntegral $ shift) (toEnum . fromIntegral $ sys)
6 -> do
code <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
alt <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
ctrl <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt
shift <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO CInt
sys <- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr :: IO CInt
return $ SFEvtKeyReleased code (toEnum . fromIntegral $ alt) (toEnum . fromIntegral $ ctrl)
(toEnum . fromIntegral $ shift) (toEnum . fromIntegral $ sys)
7 -> do
delta <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CInt
x <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
y <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt
return $ SFEvtMouseWheelMoved (fromIntegral delta) (fromIntegral x) (fromIntegral y)
8 -> do
button <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
x <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
y <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt
return $ SFEvtMouseButtonPressed button (fromIntegral x) (fromIntegral y)
9 -> do
button <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
x <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
y <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CInt
return $ SFEvtMouseButtonReleased button (fromIntegral x) (fromIntegral y)
10 -> do
x <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CInt
y <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CInt
return $ SFEvtMouseMoved (fromIntegral x) (fromIntegral y)
11 -> return SFEvtMouseEntered
12 -> return SFEvtMouseLeft
13 -> do
j <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt
bt <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt
return $ SFEvtJoystickButtonPressed (fromIntegral j) (fromIntegral bt)
14 -> do
j <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt
bt <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr :: IO CUInt
return $ SFEvtJoystickButtonReleased (fromIntegral j) (fromIntegral bt)
15 -> do
j <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr :: IO CUInt
axis <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
pos <- fmap realToFrac ((\hsc_ptr -> peekByteOff hsc_ptr 12) ptr :: IO CFloat)
return $ SFEvtJoystickMoved (fromIntegral j) axis pos
16 -> peekByteOff ptr sizeInt >>= return . SFEvtJoystickConnected
17 -> peekByteOff ptr sizeInt >>= return . SFEvtJoystickDisconnected
poke ptr evt = return ()