{-# LINE 1 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LINE 2 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
-- -*-haskell-*-


{-# LINE 5 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}

{-# LINE 6 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}

--  GIMP Toolkit (GTK) GDK Serializabled Event
--
--  Author : Andy Stewart, Axel Simon
--
--  Created: 01 Jul 2010
--
--  Copyright (C) 2010 Andy Stewart
--  Copyright (C) 2010 Axel Simon
--
--  This library is free software; you can redistribute it and/or
--  modify it under the terms of the GNU Lesser General Public
--  License as published by the Free Software Foundation; either
--  version 2.1 of the License, or (at your option) any later version.
--
--  This library is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--  Lesser General Public License for more details.
--
-- |
-- Maintainer  : gtk2hs-users\@lists.sourceforge.net
-- Stability   : stable
-- Portability : portable (depends on GHC)
--
module Graphics.UI.Gtk.Gdk.SerializedEvent (
-- * Types                                            
    SerializedEvent (..),
    
-- * Methods    
    serializedEvent,
    deserializeEvent,                   
) where
  
import Control.Monad (liftM)
import Control.Monad.Reader (ask, runReaderT )
import Control.Monad.Trans (liftIO)
import Data.Function    
import Data.Maybe
import Data.Ord
import Graphics.UI.Gtk.Gdk.DrawWindow
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.Keys (KeyVal)
import Graphics.UI.GtkInternals
import System.Glib.FFI
import System.Glib.Flags
    
data SerializedEvent = 
    SerializedEventKey 
    {sEventType      :: Int
    ,sEventSent      :: Bool
    ,sEventState     :: Int
    ,sEventKeyval    :: KeyVal
    ,sEventLength    :: Int
    ,sEventString    :: String
    ,sEventKeycode   :: Word16
    ,sEventGroup     :: Word8}
  | SerializedEventButton
    {sEventType      :: Int
    ,sEventSent      :: Bool
    ,sEventX         :: Double
    ,sEventY         :: Double
    ,sEventState     :: Int
    ,sEventButton    :: Int
    ,sEventXRoot     :: Double
    ,sEventYRoot     :: Double}
    deriving (Show, Read, Eq, Ord)
             
serializedEvent :: EventM t SerializedEvent
serializedEvent = do
  ptr <- ask
  liftIO $ do
    (eType :: Int32) <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 79 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (case eType of
       8           -> peekEventKey      
{-# LINE 81 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       9         -> peekEventKey      
{-# LINE 82 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       4        -> peekEventButton   
{-# LINE 83 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       5       -> peekEventButton   
{-# LINE 84 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       6       -> peekEventButton   
{-# LINE 85 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       7      -> peekEventButton   
{-# LINE 86 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
       ty                               -> error ("serializedEvent: haven't support event type " ++ show ty)) ptr
                  
deserializeEvent :: SerializedEvent -> DrawWindow -> (EventM t a) -> IO a
deserializeEvent event drawWindow fun = do
  let execFun = 
          case fromIntegral $ sEventType event of
            8           -> withEventKey
{-# LINE 93 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            9         -> withEventKey
{-# LINE 94 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            4        -> withEventButton
{-# LINE 95 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            5       -> withEventButton
{-# LINE 96 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            6       -> withEventButton
{-# LINE 97 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            7      -> withEventButton
{-# LINE 98 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
            ty                               -> error ("deserializeEvent: haven't support event type " ++ show ty) 
  execFun drawWindow event $ runReaderT fun
                           
peekEventKey ptr = do
    (typ_         :: Int32)    <- (\hsc_ptr -> peekByteOff hsc_ptr 0)             ptr
{-# LINE 103 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (sent_        :: Int8)           <- (\hsc_ptr -> peekByteOff hsc_ptr 8)       ptr
{-# LINE 104 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (state_       :: Word32)           <- (\hsc_ptr -> peekByteOff hsc_ptr 16)            ptr
{-# LINE 105 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (keyval_      :: Word32)           <- (\hsc_ptr -> peekByteOff hsc_ptr 20)           ptr
{-# LINE 106 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (length_      :: Int32)            <- (\hsc_ptr -> peekByteOff hsc_ptr 24)           ptr
{-# LINE 107 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (string_      :: CString)                      <- (\hsc_ptr -> peekByteOff hsc_ptr 28)           ptr
{-# LINE 108 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (keycode_     :: Word16)         <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 109 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (group_       :: Word8)          <- (\hsc_ptr -> peekByteOff hsc_ptr 34)            ptr
{-# LINE 110 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    return $ SerializedEventKey
                {sEventType        = fromIntegral typ_
                ,sEventSent        = toBool sent_
                ,sEventState       = fromIntegral state_
                ,sEventKeyval      = keyval_
                ,sEventLength      = fromIntegral length_
                ,sEventString      = unsafePerformIO $ peekCString' string_
                ,sEventKeycode     = keycode_
                ,sEventGroup       = group_
                }
    where
      peekCString' :: CString -> IO String
      peekCString' strPtr | strPtr == nullPtr
                              = return ""
			  | otherwise	 
                              = peekCString strPtr
                           
peekEventButton ptr = do
    (typ_         :: Int32)    <- (\hsc_ptr -> peekByteOff hsc_ptr 0)        ptr
{-# LINE 129 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (sent_        :: Int8)           <- (\hsc_ptr -> peekByteOff hsc_ptr 8)  ptr
{-# LINE 130 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (x_           :: Double)         <- (\hsc_ptr -> peekByteOff hsc_ptr 16)           ptr
{-# LINE 131 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (y_           :: Double)         <- (\hsc_ptr -> peekByteOff hsc_ptr 24)           ptr
{-# LINE 132 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (state_       :: Word32)           <- (\hsc_ptr -> peekByteOff hsc_ptr 36)       ptr
{-# LINE 133 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (button_      :: Word32)           <- (\hsc_ptr -> peekByteOff hsc_ptr 40)      ptr
{-# LINE 134 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (xRoot_       :: Double)         <- (\hsc_ptr -> peekByteOff hsc_ptr 48)      ptr
{-# LINE 135 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (yRoot_       :: Double)         <- (\hsc_ptr -> peekByteOff hsc_ptr 56)      ptr
{-# LINE 136 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    return $ SerializedEventButton
                {sEventType        = fromIntegral typ_
                ,sEventSent        = toBool sent_
                ,sEventX           = realToFrac x_
                ,sEventY           = realToFrac y_
                ,sEventState       = fromIntegral state_
                ,sEventButton      = fromIntegral button_
                ,sEventXRoot       = realToFrac xRoot_
                ,sEventYRoot       = realToFrac yRoot_
                }
               
withEventKey window_ (SerializedEventKey
                      {sEventType        = typ_
                      ,sEventSent        = sent_
                      ,sEventState       = state_
                      ,sEventKeyval      = keyval_
                      ,sEventLength      = length_
                      ,sEventString      = string_
                      ,sEventKeycode     = keycode_
                      ,sEventGroup       = group_
                      }) act = 
  withCString string_ $ \str -> 
  allocaBytes 36 $ \ptr -> do
{-# LINE 159 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 0)             ptr ((fromIntegral typ_)        :: Int32)
{-# LINE 160 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    withForeignPtr (unDrawWindow window_) $ \winPtr -> 
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr winPtr
{-# LINE 162 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8)       ptr ((fromBool sent_)           :: Int8)
{-# LINE 163 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12)             ptr ((fromIntegral currentTime) :: Word32)
{-# LINE 164 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 16)            ptr ((fromIntegral state_)      :: Word32)
{-# LINE 165 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 20)           ptr (keyval_                    :: Word32)   
{-# LINE 166 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 24)           ptr ((fromIntegral length_)     :: Int32)
{-# LINE 167 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 28)           ptr str
{-# LINE 168 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr (keycode_                   :: Word16)
{-# LINE 169 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 34)            ptr (group_                     :: Word8)
{-# LINE 170 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    act ptr
    
withEventButton window_ (SerializedEventButton
                         {sEventType        = typ_
                         ,sEventSent        = sent_
                         ,sEventX           = x_
                         ,sEventY           = y_
                         ,sEventState       = state_
                         ,sEventButton      = button_
                         ,sEventXRoot       = xRoot_
                         ,sEventYRoot       = yRoot_
                         }) act = 
  allocaBytes 64 $ \ptr -> do
{-# LINE 183 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 0)             ptr ((fromIntegral typ_)        :: Int32)
{-# LINE 184 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    withForeignPtr (unDrawWindow window_) $ \winPtr -> 
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr winPtr
{-# LINE 186 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8)       ptr ((fromBool sent_)           :: Int8)
{-# LINE 187 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12)             ptr ((fromIntegral currentTime) :: Word32)
{-# LINE 188 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 16)                ptr ((realToFrac x_)            :: Double)
{-# LINE 189 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 24)                ptr ((realToFrac y_)            :: Double)
{-# LINE 190 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 36)            ptr ((fromIntegral state_)      :: Word32)
{-# LINE 191 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 40)           ptr ((fromIntegral button_)     :: Word32)
{-# LINE 192 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 48)           ptr ((realToFrac xRoot_)        :: Double)
{-# LINE 193 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 56)           ptr ((realToFrac yRoot_)        :: Double)
{-# LINE 194 "Graphics/UI/Gtk/Gdk/SerializedEvent.hsc" #-}
    act ptr