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


import Foreign.C.Types
import Foreign.Ptr
import Foreign.Storable


-- | Key codes.
data KeyCode
    = KeyA          -- ^ The A key
    | KeyB          -- ^ The B key
    | KeyC          -- ^ The C key
    | KeyD          -- ^ The D key
    | KeyE          -- ^ The E key
    | KeyF          -- ^ The F key
    | KeyG          -- ^ The G key
    | KeyH          -- ^ The H key
    | KeyI          -- ^ The I key
    | KeyJ          -- ^ The J key
    | KeyK          -- ^ The K key
    | KeyL          -- ^ The L key
    | KeyM          -- ^ The M key
    | KeyN          -- ^ The N key
    | KeyO          -- ^ The O key
    | KeyP          -- ^ The P key
    | KeyQ          -- ^ The Q key
    | KeyR          -- ^ The R key
    | KeyS          -- ^ The S key
    | KeyT          -- ^ The T key
    | KeyU          -- ^ The U key
    | KeyV          -- ^ The V key
    | KeyW          -- ^ The W key
    | KeyX          -- ^ The X key
    | KeyY          -- ^ The Y key
    | KeyZ          -- ^ The Z key
    | KeyNum0       -- ^ The 0 key
    | KeyNum1       -- ^ The 1 key
    | KeyNum2       -- ^ The 2 key
    | KeyNum3       -- ^ The 3 key
    | KeyNum4       -- ^ The 4 key
    | KeyNum5       -- ^ The 5 key
    | KeyNum6       -- ^ The 6 key
    | KeyNum7       -- ^ The 7 key
    | KeyNum8       -- ^ The 8 key
    | KeyNum9       -- ^ The 9 key
    | KeyEscape     -- ^ The Escape key
    | KeyLControl   -- ^ The left Control key
    | KeyLShift     -- ^ The left Shift key
    | KeyLAlt       -- ^ The left Alt key
    | KeyLSystem    -- ^ The left OS specific key: window (Windows and Linux), apple (MacOS X), ...
    | KeyRControl   -- ^ The right Control key
    | KeyRShift     -- ^ The right Shift key
    | KeyRAlt       -- ^ The right Alt key
    | KeyRSystem    -- ^ The right OS specific key: window (Windows and Linux), apple (MacOS X), ...
    | KeyMenu       -- ^ The Menu key
    | KeyLBracket   -- ^ The [ key
    | KeyRBracket   -- ^ The ] key
    | KeySemiColon  -- ^ The ; key
    | KeyComma      -- ^ The , key
    | KeyPeriod     -- ^ The . key
    | KeyQuote      -- ^ The ' key
    | KeySlash      -- ^ The / key
    | KeyBackSlash  -- ^ The \ key
    | KeyTilde      -- ^ The ~ key
    | KeyEqual      -- ^ The = key
    | KeyDash       -- ^ The - key
    | KeySpace      -- ^ The Space key
    | KeyReturn     -- ^ The Return key
    | KeyBack       -- ^ The Backspace key
    | KeyTab        -- ^ The Tabulation key
    | KeyPageUp     -- ^ The Page up key
    | KeyPageDown   -- ^ The Page down key
    | KeyEnd        -- ^ The End key
    | KeyHome       -- ^ The Home key
    | KeyInsert     -- ^ The Insert key
    | KeyDelete     -- ^ The Delete key
    | KeyAdd        -- ^ +
    | KeySubtract   -- ^ -
    | KeyMultiply   -- ^ *
    | KeyDivide     -- ^ /
    | KeyLeft       -- ^ Left arrow
    | KeyRight      -- ^ Right arrow
    | KeyUp         -- ^ Up arrow
    | KeyDown       -- ^ Down arrow
    | KeyNumpad0    -- ^ The numpad 0 key
    | KeyNumpad1    -- ^ The numpad 1 key
    | KeyNumpad2    -- ^ The numpad 2 key
    | KeyNumpad3    -- ^ The numpad 3 key
    | KeyNumpad4    -- ^ The numpad 4 key
    | KeyNumpad5    -- ^ The numpad 5 key
    | KeyNumpad6    -- ^ The numpad 6 key
    | KeyNumpad7    -- ^ The numpad 7 key
    | KeyNumpad8    -- ^ The numpad 8 key
    | KeyNumpad9    -- ^ The numpad 9 key
    | KeyF1         -- ^ The F1 key
    | KeyF2         -- ^ The F2 key
    | KeyF3         -- ^ The F3 key
    | KeyF4         -- ^ The F4 key
    | KeyF5         -- ^ The F5 key
    | KeyF6         -- ^ The F6 key
    | KeyF7         -- ^ The F7 key
    | KeyF8         -- ^ The F8 key
    | KeyF9         -- ^ The F8 key
    | KeyF10        -- ^ The F10 key
    | KeyF11        -- ^ The F11 key
    | KeyF12        -- ^ The F12 key
    | KeyF13        -- ^ The F13 key
    | KeyF14        -- ^ The F14 key
    | KeyF15        -- ^ The F15 key
    | KeyPause      -- ^ The Pause key
    | Undefined     -- ^ Undefined key
    deriving (Eq, Enum, Bounded, Show)


sizeInt = (4)
{-# LINE 123 "src/SFML/Window/Keyboard.hsc" #-}


instance Storable KeyCode where
    sizeOf _ = sizeInt
    alignment _ = alignment (undefined :: CInt)
    
    peek ptr = peek (castPtr ptr :: Ptr CInt) >>= return . toEnum . checkUndef . fromIntegral
    poke ptr bt = poke (castPtr ptr :: Ptr CInt) (fromIntegral . fromEnum $ bt)


checkUndef = min (fromEnum Undefined) . (\k -> if k < 0 then (fromEnum Undefined) else k)


-- | Check if a key is pressed
isKeyPressed :: KeyCode -> IO Bool
isKeyPressed k = sfKeyboard_isKeyPressed (fromEnum k) >>= return . (/=0)


foreign import ccall unsafe "sfKeyboard_isKeyPressed"
    sfKeyboard_isKeyPressed :: Int -> IO CChar

--CSFML_WINDOW_API sfBool sfKeyboard_isKeyPressed(sfKeyCode key);