    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.HGL.Internals.Event
    -- Copyright   :  (c) Alastair Reid, 1999-2003
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  internal
    -- Portability :  non-portable (requires concurrency)
    --
    -- Events in a simple graphics library.
    --
    -----------------------------------------------------------------------------

    -- #hide
    module Graphics.HGL.Internals.Event
    	( Event(..)
    	-- , Event(Char,Key,Button,MouseMove,Resize,Closed) -- deriving(Show)
    	-- , char		-- :: Event -> Char
    	-- , keysym		-- :: Event -> Key
    	-- , isDown		-- :: Event -> Bool
    	-- , pt			-- :: Event -> Point
    	-- , isLeft		-- :: Event -> Bool
    	) where

    import Graphics.HGL.Key (Key)
    import Graphics.HGL.Internals.Types (Point)

    -- We probably need a lot more info about the event
    -- but this will do for now.

    ----------------------------------------------------------------
    -- Interface
    ----------------------------------------------------------------

    -- Note: The Char event is for delivering properly translated characters
    -- after a key*press*. At least under X, a single key press might yield
    -- 0, 1 or more characters after translation (see X[mb]LookupString).
    -- The Key event is intended for reporting key up/down events of
    -- *abstract* keys, i.e. KeySyms rather than KeyCodes in X terms.
    -- To make it possible to report such events for arrow keys, function
    -- keys and the like, the Char field needs to be replaced by a field of
    -- a type somewhat isomorphic to KeySym, but valid under Windows too.

    -- | A user interface event.
    --
    -- Notes:
    --
    -- * Programmers should assume that the 'Event' datatype will be
    --   extended in the not-too-distant future and that individual events
    --   may change slightly.  As a minimum, you should add a \"match anything\"
    --   alternative to any function which pattern matches against 'Event's.
    --
    -- * X11 systems typically have three button mice.  Button 1 is used as the
    --   left button, button 3 as the right button and button 2 (the middle
    --   button) is ignored.

    data Event
      = Char
        { char :: Char	-- ^ the character represented by a key combination
        }			-- ^ a properly translated character, sent after
    			-- a key press.
      | Key
        { keysym :: Key	-- ^ representation of the keyboard keys pressed
        , isDown :: Bool	-- ^ if 'True', the key was pressed;
    			-- otherwise it was released
        }			-- ^ occurs when a key was pressed or released.
      | Button
        { pt :: Point	-- ^ the position of the mouse cursor
        , isLeft :: Bool	-- ^ if 'True', it was the left button
        , isDown :: Bool	-- ^ if 'True', the button was pressed;
    			-- otherwise it was released
        }			-- ^ occurs when a mouse button is pressed or released.
      | MouseMove
        { pt :: Point	-- ^ the position of the mouse cursor after the movement
        }			-- ^ occurs when the mouse is moved inside the window.
      | Resize		-- ^ occurs when the window is resized.
      | Closed		-- ^ occurs when the window is closed.
     deriving Show

    ----------------------------------------------------------------
    -- End
    ----------------------------------------------------------------