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


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

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

--  GIMP Toolkit (GTK) GDK Events
--
--  Author : Axel Simon
--
--  Created: 27 April 2001
--
--  Copyright (C) 2001-2005 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   : deprecated
-- Portability : portable (depends on GHC)
--
-- Definiton of a record that contains event information. Deprecated in
-- favor of 'Graphics.UI.Gtk.Gdk.EventM' and not exported by Gtk.hs.
--
module Graphics.UI.Gtk.Gdk.Events (
  Modifier(..),		-- a mask of control keys
  TimeStamp,
  currentTime,

  -- | Deprecated way of conveying event information.
  Event(..),		-- information in event callbacks from Gdk
  EventButton,
  EventScroll,
  EventMotion,
  EventExpose,
  EventKey,
  EventConfigure,
  EventCrossing,
  EventFocus,
  EventProperty,
  EventProximity,
  EventVisibility,
  EventWindowState,
  EventGrabBroken,

  marshExposeRect,

  -- selector functions
  marshalEvent,		-- convert a pointer to an event data structure
  -- used data structures
  VisibilityState(..),
  CrossingMode(..),
  NotifyType(..),
  WindowState(..),
  ScrollDirection(..),
  MouseButton(..),
  Click(..),
  Rectangle(..)
  ) where

import System.IO.Unsafe (unsafeInterleaveIO)
import System.Glib.FFI
import System.Glib.Flags
import System.Glib.GObject ( makeNewGObject )
import Graphics.UI.Gtk.Gdk.Keys		(KeyVal, keyvalToChar, keyvalName)
import Graphics.UI.Gtk.Gdk.Region       (Region, makeNewRegion)
import Graphics.UI.Gtk.Gdk.Enums	(Modifier(..),
                                         VisibilityState(..),
					 CrossingMode(..),
					 NotifyType(..),
					 WindowState(..),
					 ScrollDirection(..))
import Graphics.UI.Gtk.General.Enums	(MouseButton(..), Click(..))
import Graphics.UI.Gtk.General.Structs	(Rectangle(..))
import Graphics.UI.Gtk.Types ( DrawWindow, mkDrawWindow )

import Data.Bits ((.|.), (.&.), testBit, shiftL, shiftR)
import Data.Maybe (catMaybes)


-- | The time (in milliseconds) when an event happened. This is used mostly
-- for ordering events and responses to events.
--
type TimeStamp = Word32
-- TODO: make this a newtype

-- | Represents the current time, and can be used anywhere a time is expected.
currentTime :: TimeStamp
currentTime = 0
{-# LINE 98 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}

-- Note on Event:
-- * 'Event' can communicate a small array of data to another widget. This
--   functionality is not bound as it can be done easier in Haskell.
--
-- * EventDND is not implemented as registering a DND source or sink
--   should be easier and sufficient for everything.
--
-- * EventProperty is not bound since it involves Atoms and its hard to see
--   how a Haskell application should extract the data. It should be possible
--   to connect directly to 'propertyChanged' signals. If there is a need
--   to monitor a property for which there is no signal we could add
--   a trigger for just that property.
--
-- * EventSelection - I don\'t quite see how this works, so not bound.
--
-- * NoExpose - seems pointless: you copy from a drawable and this signal
--   tells you that it was up-to-date without redrawing. Maybe I'm missing
--   something.
--
-- * EventSetting informs about a change in setting that are shared among
--   several applications. They are probably not relevant to user defined
--   widgets. Anyway they don\'t make sense before GtkSettings isn\'t bound.
--
-- * Property is a TODO. These come from RC files which are useful for
--   custom widgets.

-- | An event that contains information on a button press.
type EventButton = Event

-- | An event that contains information on scrolling.
type EventScroll = Event

-- | An event that contains information on the movement of the mouse pointer.
type EventMotion = Event

-- | An area of the 'DrawWindow' needs redrawing.
type EventExpose = Event

-- | An event that contains information about a key press.
type EventKey = Event

-- | An event that contains the new size of a window.
type EventConfigure = Event

-- | Generated when the pointer enters or leaves a window.
type EventCrossing = Event

-- | An event that informs about a change of the input focus.
type EventFocus = Event

-- | An event that indicates a property of the window changed.
type EventProperty = Event

-- | An event that indicates that the pen of a graphics table is touching or
--   not touching the tablet.
type EventProximity = Event

-- | Parts of the window have been exposed or obscured.
type EventVisibility = Event

-- | The window state has changed.
type EventWindowState = Event

-- | A grab has been broken by unusual means.
type EventGrabBroken = Event

-- | Events that are delivered to a widget.
--
-- * Any given signal only emits one of these variants as described
--   in 'Graphics.UI.Gtk.Abstract.Widget.Widget'.
--   Many events share common attributes:
--
--   * The 'eventSent' attribute is @True@ if the event was not created by the
--      user but by another application.
--
--   * The 'eventTime' attribute contains a time in milliseconds when the event
--      happened.
--
--   * The 'eventX' and 'eventY' attributes contain the coordinates relative
--      to the 'Graphics.UI.Gtk.Abstract.Gdk.DrawWindow' associated with this
--      widget. The values can contain sub-pixel information if the input
--      device is a graphics tablet or the like.
--
--   * The 'eventModifier' attribute denotes what modifier key was pressed
--      during the event.
--
data Event =
  -- | An event that is not in one of the more specific categories below. This
  -- includes delete, destroy, map and unmap events. These events
  -- have no extra information associated with them.
  Event { eventSent :: Bool }
  -- | The expose event.
  --
  -- * A region of widget that receives this event needs to be redrawn.
  --   This event is the result of revealing part or all of a window
  --   or by the application calling functions like
  --   'Graphics.UI.Gtk.Abstract.Widget.widgetQueueDrawArea'.
  --
  | Expose {
    eventSent	:: Bool,
    -- | A bounding box denoting what needs to be updated. For a more
    -- detailed information on the area that needs redrawing, use the
    -- next field.
    eventArea	:: Rectangle,
    -- | A set of horizontal stripes that denote the invalid area.
    eventRegion      :: Region,

    -- | The number of contiguous 'Expose' events following this
    --   one. The only use for this is \"exposure compression\", i.e. 
    --   handling all contiguous 'Expose' events in one go, though Gdk
    --   performs some exposure compression so this is not normally needed.
    eventCount	:: Int }
  -- | Mouse motion.
  --
  -- * Captures the movement of the mouse cursor while it is within the area
  --   of the widget.
  --
  | Motion {
    eventSent	:: Bool,
    eventTime	:: TimeStamp,
    eventX,eventY	:: Double,
    eventModifier 	:: [Modifier],
    -- | Indicate if this event is only a hint of the motion.
    --
    -- * If the 'Graphics.UI.Gtk.Abstract.Widget.PointerMotionHintMask'
    --  is set with 'Data.Array.MArray.widgetAddEvents' then
    --   mouse positions are only generated each time
    --  'Graphics.UI.Gtk.Gdk.DrawWindow.drawWindowGetPointer'
    --   is called. In this case 'eventIsHint' is set to @True@.
    --
    eventIsHint	:: Bool,
    eventXRoot,
    eventYRoot	:: Double } 
  -- | A mouse button was pressed or released.
  --
  -- * This event is triggered if the mouse button was pressed or released
  --   while the mouse cursor was within the region of the widget.
  --
  | Button {
    eventSent	:: Bool,
    -- | The kind of button press, see 'Click'. Note that double clicks will
    --   trigger this event with 'eventClick' set to 'SingleClick',
    --   'ReleaseClick',
    --   'SingleClick', 'DoubleClick', 'ReleaseClick'. Triple clicks will
    --   produce this sequence followed by 'SingleClick', 'DoubleClick',
    --   'TripleClick', 'ReleaseClick'.
    eventClick	:: Click,
    -- | The time of the event in milliseconds.
    eventTime	:: TimeStamp,
    eventX,eventY	:: Double,
    eventModifier	:: [Modifier],
    -- | The button that was pressed.
    eventButton	:: MouseButton,
    -- | The coordinates of the click relative to the screen origin.
    eventXRoot,
    eventYRoot	:: Double }
  -- | A key was pressed while the widget had the input focus.
  --
  -- * If the widget has the current input focus (see
  --   'Graphics.UI.Gtk.Abstract.Widget.widgetSetCanFocus')
  --   it will receive key pressed events. Certain key combinations are of
  --   no interest to a normal widget like Alt-F to access the file menu.
  --   For all these keys, the handler must return @False@ to indicate that
  --   the key stroke should be propagated to the parent widget. At the
  --   top-level widget, keyboard shortcuts like Alt-F are turned into the
  --   corresponding signals.
  --
  | Key {
    -- | This flag is set if the key was released. This flag makes it possible
    --   to connect the same handler to
    --  'Graphics.UI.Gtk.Abstract.Widget.onKeyPress' and
    --  'Graphics.UI.Gtk.Abstract.Widget.onKeyRelease'.
    eventRelease	:: Bool,
    eventSent	:: Bool,
    eventTime	:: TimeStamp,
    eventModifier	:: [Modifier],
    -- | This flag is @True@ if Caps Lock is on while this key was pressed.
    eventWithCapsLock   :: Bool,
    -- | This flag is @True@ if Number Lock is on while this key was pressed.
    eventWithNumLock    :: Bool,
    -- | This flag is @True@ if Scroll Lock is on while this key was pressed.
    eventWithScrollLock :: Bool,
    -- | A number representing the key that was pressed or released. A more convenient
    --   interface is provided by the next two fields.
    eventKeyVal :: KeyVal,
    -- | A string representing the key that was pressed or released.
    --
    -- * This string contains a description of the key rather than what
    --   should appear on screen. For example, pressing "1" on the keypad
    --   results in "KP_1". Of particular interest are "F1" till "F12",
    --   for a complete list refer to \"<gdk/gdkkeysyms.h>\" where all
    --   possible values are defined. The corresponding strings are the
    --   constants without the GDK_ prefix.
    eventKeyName	:: String,
    -- | A character matching the key that was pressed.
    --
    -- * This entry can be used to build up a whole input string.
    --   The character is @Nothing@ if the key does not correspond to a simple
    --   unicode character.
    --
    eventKeyChar     :: Maybe Char }
  -- | Mouse cursor crossing event.
  --
  -- * This event indicates that the mouse cursor is hovering over this
  --   widget. It is used to set a widget into the pre-focus state where
  --   some GUI elements like buttons on a toolbar change their appearance.
  --
  | Crossing {
    eventSent	:: Bool,
    eventTime	:: TimeStamp,
    eventX,eventY	:: Double,
    eventXRoot,
    eventYRoot	:: Double,
    -- | This flag is false if the widget was entered, it is true when the
    --   widget the mouse cursor left the widget.
    eventLeaves :: Bool,
    -- | Kind of enter\/leave event.
    --
    -- * The mouse cursor might enter this widget because it grabs the mouse
    --   cursor for e.g. a modal dialog box.
    --
    eventCrossingMode	:: CrossingMode,
    -- | Information on from what level of the widget hierarchy the mouse
    --   cursor came.
    --
    -- * See 'NotifyType'.
    --
    eventNotifyType	:: NotifyType,
    eventModifier	:: [Modifier]}
  -- | Gaining or loosing input focus.
  --
  | Focus {
    eventSent	:: Bool,
    -- | This flag is @True@ if the widget receives the focus and @False@ if
    -- it just lost the input focus.
    eventInFocus	:: Bool}
  -- | The widget\'s size has changed.
  --
  -- * In response to this event the application can allocate resources that
  --   are specific to the size of the widget. It is emitted when the widget
  --   is shown the first time and on every resize.
  --
  | Configure {
    eventSent	:: Bool,
    -- | Position within the parent window.
    eventXParent	:: Int,
    -- | Position within the parent window.
    eventYParent	:: Int,
    eventWidth	:: Int,
    eventHeight	:: Int}
  -- | Change of visibility of a widget.
  | Visibility {
    eventSent	:: Bool,
    -- | Denote what portions of the widget is visible.
    eventVisible	:: VisibilityState }
  -- | Wheel movement of the mouse.
  --
  -- * This action denotes that the content of the widget should be scrolled.
  --   The event is triggered by the movement of the mouse wheel. Surrounding
  --   scroll bars are independant of this signal. Most mice do not have
  --   buttons for horizontal scrolling, hence 'eventDirection' will usually not
  --   contain 'ScrollLeft' and 'ScrollRight'. Mice with additional
  --   buttons may not work on X since only five buttons are supported
  --   (the three main buttons and two for the wheel).
  --
  -- * The handler of this signal should update the scroll bars that
  --   surround this widget which in turn tell this widget to update.
  --
  | Scroll {
    eventSent	:: Bool,
    eventTime	:: TimeStamp,
    eventX,eventY	:: Double,
    eventDirection	:: ScrollDirection,
    eventXRoot,
    eventYRoot	:: Double}
  -- | Indicate how the appearance of this window has changed.
  | WindowState {
    eventSent	:: Bool,
    -- | The mask indicates which flags have changed.
    eventWindowMask	:: [WindowState],
    -- | The state indicates the current state of the window.
    eventWindowState	:: [WindowState]} 
  -- | The state of the pen of a graphics tablet pen or touchscreen device.
  | Proximity {
    eventSent	:: Bool,
    eventTime	:: TimeStamp,
    -- | Whether the stylus has moved in or out of contact with the tablet.
    eventInContact     :: Bool
  } deriving Show

marshalEvent :: Ptr Event -> IO Event
marshalEvent ptr = do
  (eType::Int32) <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 392 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (case eType of
    0         -> marshAny
{-# LINE 394 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    1        -> marshAny
{-# LINE 395 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    2		-> marshExpose
{-# LINE 396 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    3	-> marshMotion
{-# LINE 397 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    4	-> marshButton SingleClick
{-# LINE 398 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    5  -> marshButton DoubleClick
{-# LINE 399 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    6	-> marshButton TripleClick
{-# LINE 400 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    7	-> marshButton ReleaseClick
{-# LINE 401 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    8	-> marshKey False
{-# LINE 402 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    9	-> marshKey True
{-# LINE 403 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    10	-> marshCrossing False
{-# LINE 404 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    11	-> marshCrossing True
{-# LINE 405 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    12	-> marshFocus
{-# LINE 406 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    13	-> marshConfigure
{-# LINE 407 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    14            -> marshAny
{-# LINE 408 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    15          -> marshAny    
{-# LINE 409 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
--    #{const GDK_PROPERTY_NOTIFY}-> marshProperty
    20   -> marshProximity True
{-# LINE 411 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    21	-> marshProximity False
{-# LINE 412 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    29-> marshVisibility
{-# LINE 413 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    31		-> marshScroll
{-# LINE 414 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    32	-> marshWindowState
{-# LINE 415 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    code			-> \_ -> fail $
      "marshalEvent: unhandled event type " ++ show code ++
      "\nplease report this as a bug to gtk2hs-devel@lists.sourceforge.net"
    ) ptr

marshAny ptr = do
  (sent   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 422 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return Event {
    eventSent = toBool sent
  }

marshExpose ptr = do
  (2::Int32) <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 428 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 429 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (area_   ::Rectangle)		<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 430 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (reg_   :: Ptr Region)	<- (\hsc_ptr -> peekByteOff hsc_ptr 28) ptr
{-# LINE 431 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  reg_ <- gdk_region_copy reg_
  region_ <- makeNewRegion reg_
  (count_  ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 434 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Expose {
    eventSent   = toBool sent_,
    eventArea   = area_,
    eventRegion = region_,
    eventCount  = fromIntegral count_}

foreign import ccall "gdk_region_copy"
  gdk_region_copy :: Ptr Region -> IO (Ptr Region)

marshExposeRect :: Ptr Event -> IO Rectangle
marshExposeRect ptr = do
  (2::Int32) <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 446 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (area_   ::Rectangle)		<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 447 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return area_

marshMotion ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 451 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 452 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (x_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 453 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (y_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 454 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (modif_  ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 455 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (isHint_ ::Int16)	<- (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 456 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (xRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 48) ptr
{-# LINE 457 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (yRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr
{-# LINE 458 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Motion {
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_,
    eventX	   = realToFrac x_,
    eventY	   = realToFrac y_,
    eventModifier  = (toFlags . fromIntegral) modif_,
    eventIsHint = toBool isHint_,
    eventXRoot  = realToFrac xRoot_,
    eventYRoot  = realToFrac yRoot_}

marshButton but ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 470 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 471 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (x_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 472 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (y_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 473 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (modif_  ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 474 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (button_ ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 475 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (xRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 48) ptr
{-# LINE 476 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (yRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr
{-# LINE 477 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Button {
    eventClick  = but,
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_,
    eventX	   = realToFrac x_,
    eventY	   = realToFrac y_,
    eventModifier  = (toFlags . fromIntegral) modif_,
    eventButton = (toEnum.fromIntegral) button_,
    eventXRoot  = realToFrac xRoot_,
    eventYRoot  = realToFrac yRoot_}


marshKey up ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 491 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 492 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (modif_  ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 493 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (keyval_ ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 494 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  
  (length_ ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 496 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  keyChar <- keyvalToChar keyval_
  keyName <- unsafeInterleaveIO $ keyvalName keyval_
  return $ Key {
    eventRelease = up,
    eventSent = toBool sent_,
    eventTime   = fromIntegral time_,
    eventModifier  = (toFlags . fromIntegral) modif_,
    eventWithCapsLock = (modif_ .&. 2)/=0,
{-# LINE 504 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    eventWithNumLock = (modif_ .&. 16)/=0,
{-# LINE 505 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    eventWithScrollLock = (modif_ .&. 32)/=0,
{-# LINE 506 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
    eventKeyVal = keyval_,
    eventKeyName = keyName,
    eventKeyChar = keyChar }

marshCrossing leave ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 512 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 513 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (x_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 514 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (y_	   ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 28) ptr
{-# LINE 515 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (modif_  ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 64) ptr
{-# LINE 516 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (xRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 517 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (yRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 44) ptr
{-# LINE 518 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (cMode_  ::Word32) 
{-# LINE 519 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
				<- (\hsc_ptr -> peekByteOff hsc_ptr 52) ptr
{-# LINE 520 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (nType_  ::Word32)
{-# LINE 521 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
				<- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr  
{-# LINE 522 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (modif_  ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 64) ptr
{-# LINE 523 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Crossing {
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_,
    eventX	   = realToFrac x_,
    eventY	   = realToFrac y_,
    eventXRoot  = realToFrac xRoot_,
    eventYRoot  = realToFrac yRoot_,
    eventLeaves = leave,
    eventCrossingMode  = (toEnum.fromIntegral) cMode_,
    eventNotifyType    = (toEnum.fromIntegral) nType_,
    eventModifier      = (toFlags . fromIntegral) modif_}


marshFocus ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 538 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (inFocus_::Int16)	<- (\hsc_ptr -> peekByteOff hsc_ptr 10) ptr
{-# LINE 539 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Focus {
    eventSent   = toBool sent_,
    eventInFocus= toBool inFocus_}

marshConfigure ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 545 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (xPar_   ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 546 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (yPar_   ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 547 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (width_  ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 548 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (height_ ::Int32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 549 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Configure {
    eventSent   = toBool sent_,
    eventXParent   = fromIntegral xPar_,
    eventYParent   = fromIntegral yPar_,
    eventWidth  = fromIntegral width_,
    eventHeight = fromIntegral height_}

{-
marshProperty ptr = do
  (sent_   ::#gtk2hs_type gint8)	<- #{peek GdkEventProperty, send_event} ptr
  (time_   ::#gtk2hs_type guint32)	<- #{peek GdkEventProperty, time} ptr
  return $ Property {
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_}
-}

marshProximity contact ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 567 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 568 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Proximity {
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_,
    eventInContact = contact}

marshVisibility ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 575 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (state_  ::Word32)
{-# LINE 576 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
				<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 577 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Visibility {
    eventSent   = toBool sent_,
    eventVisible= (toEnum.fromIntegral) state_}

marshScroll ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 583 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (time_   ::Word32)	<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 584 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (x_	  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 585 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (y_	  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 586 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (direc_  ::Word32)
{-# LINE 587 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
				<- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 588 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (xRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 44) ptr
{-# LINE 589 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (yRoot_  ::Double)	<- (\hsc_ptr -> peekByteOff hsc_ptr 52) ptr
{-# LINE 590 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ Scroll {
    eventSent   = toBool sent_,
    eventTime   = fromIntegral time_,
    eventX	   = realToFrac x_,
    eventY	   = realToFrac y_,
    eventDirection  = (toEnum.fromIntegral) direc_,
    eventXRoot  = realToFrac xRoot_,
    eventYRoot  = realToFrac yRoot_}


marshWindowState ptr = do
  (sent_   ::Int8)	<- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 602 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (wMask_  ::Word32)
{-# LINE 603 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
			<- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 604 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  (wState_ ::Word32)
{-# LINE 605 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
			<- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 606 "Graphics/UI/Gtk/Gdk/Events.hsc" #-}
  return $ WindowState {
    eventSent   = toBool sent_,
    eventWindowMask  = (toFlags.fromIntegral) wMask_,
    eventWindowState = (toFlags.fromIntegral) wState_}