#ifndef __INC_POS_DEVICE_IEVENT_H
#define __INC_POS_DEVICE_IEVENT_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>IEvent.h<<   22 Jan 1997    14:34:02 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_LIST_H
#include <pExec/List.h>
#endif
#ifndef __INC_POS_DEVICE_TIMER_H
#include <pDevice/Timer.h>
#endif
#ifndef __INC_POS_PLAYER_RECT_H
#include <pLayer/Rect.h>
#endif



enum pOS_InputEventClass
{
  IECLASS_NULL          =0x00, /* A NOP input event */
  IECLASS_RAWKEY        =0x01, /* A raw keycode from the keyboard device */
  IECLASS_RAWMOUSE      =0x02, /* The raw mouse report from the game port device */
  IECLASS_EVENT         =0x03, /* A private console event */
  IECLASS_POINTERPOS    =0x04, /* A Pointer Position report */
  IECLASS_TIMER         =0x06, /* A timer event */
  IECLASS_GADGETDOWN    =0x07, /* select button pressed down over a Gadget (address in ie_EventAddress) */
  IECLASS_GADGETUP      =0x08, /* select button released over the same Gadget (address in ie_EventAddress) */
  IECLASS_GADGETABORT   =0x09, /* (address in ie_EventAddress) */
  IECLASS_MENULIST      =0x0A, /* this is a Menu Number transmission (Menu number is in ie_Code) */
  IECLASS_CLOSEWINDOW   =0x0B, /* User has selected the active Window's Close Gadget */
  IECLASS_SIZEWINDOW    =0x0C, /* this Window has a new size */
  IECLASS_REFRESHWINDOW =0x0D, /* the Window pointed to by ie_EventAddress needs to be refreshed */
  IECLASS_UPDATEGADGET  =0x0E, /* Gadget wurde verändert (prop) (address in ie_EventAddress) */
  IECLASS_DISKREMOVED   =0x0F, /* the disk has been removed */
  IECLASS_DISKINSERTED  =0x10, /* the disk has been inserted */
  IECLASS_ACTIVEWINDOW  =0x11, /* the window is about to be been made active */
  IECLASS_INACTIVEWINDOW=0x12, /* the window is about to be made inactive */

  IECLASS_HELP          =0x14, /* Help */
  IECLASS_CHANGEWINDOW  =0x15, /* the Window has been modified with move, size, zoom, or change */
  IECLASS_DRAGKEY       =0x16, /* */
  IECLASS_DROP          =0x17, /* */

  IECLASS_MAX           =0x17  /* the last class */
};


enum pOS_InputEventSubClass
{
  IESUBCLASS_COMPATIBLE=0x00, /* IECLASS_NEWPOINTERPOS */
  IESUBCLASS_PIXEL     =0x01, /* ie_EventAddress points to struct IEPointerPixel */
  IESUBCLASS_TABLET    =0x02, /* ie_EventAddress points to struct IEPointerTablet */
  IESUBCLASS_NEWTABLET =0x03  /* ie_EventAddress points to struct IENewTablet */
};


enum pOS_InputEventCode
{
/*  IECLASS_RAWKEY */
  IECODE_UP_PREFIX         =0x80,
  IECODE_KEY_CODE_FIRST    =0x00,
  IECODE_KEY_CODE_LAST     =0x77,
  IECODE_COMM_CODE_FIRST   =0x78,
  IECODE_COMM_CODE_LAST    =0x7F,

/*  IECLASS_ANSI */
  IECODE_C0_FIRST          =0x00,
  IECODE_C0_LAST           =0x1F,
  IECODE_ASCII_FIRST       =0x20,
  IECODE_ASCII_LAST        =0x7E,
  IECODE_ASCII_DEL         =0x7F,
  IECODE_C1_FIRST          =0x80,
  IECODE_C1_LAST           =0x9F,
  IECODE_LATIN1_FIRST      =0xA0,
  IECODE_LATIN1_LAST       =0xFF,

/*  IECLASS_RAWMOUSE */
  IECODE_LBUTTON           =0x68,  /* also uses IECODE_UP_PREFIX */
  IECODE_RBUTTON           =0x69,
  IECODE_MBUTTON           =0x6A,
  IECODE_NOBUTTON          =0xFF,

/* IECLASS_SIZEWINDOW, IECLASS_CHANGEWINDOW */
  IECODE_ADDWIDTH          =0x0001,
  IECODE_SUBWIDTH          =0x0002,
  IECODE_ADDHEIGHT         =0x0004,
  IECODE_SUBHEIGHT         =0x0008,
  IECODE_ADDLEFT           =0x0010,
  IECODE_SUBLEFT           =0x0020,
  IECODE_ADDTOP            =0x0040,
  IECODE_SUBTOP            =0x0080,

/* IECODE_DROP */
  IECODE_DROP_FIRST        =0x00, /* Message für Drop erzeugen */
  IECODE_DROP_WORK         =0x01, /* Drop-Message bearbeiten */
  IECODE_DROP_ABORT        =0x02, /* Drop-Message wurde nicht bearbeitet */
  IECODE_DROP_REPLYWORK    =0x03  /* Message nach pOS_ReplyMsg bearbeiten */
};


enum pOS_InputEventGdUpCode /** GadgetUpdate, GadgetUp, GadgetDown, GadgetAbort */
{
  /* wird gefilter =>             +     */

  IEGUCODE_Mask=0xff,
  IEGUCODE_Unknown =0,          /*   0 Unbekannt, kann nicht eingeteilt werden */
  IEGUCODE_Start,               /*   1 Prozeß, Vorgang, Ablauf,... wird gestartet */
  IEGUCODE_Stop,                /*     Prozeß, Vorgang, Ablauf,... wurde gestoppt */
  IEGUCODE_End,                 /*     Prozeß, Vorgang, Ablauf,... wurde beendet */
  IEGUCODE_Select,              /*     Der Selektzustand hat sich verändert */
  IEGUCODE_Scroll,              /*+  5 Grafikinhalt wurde verschoben */
  IEGUCODE_Ok,                  /*     Bestätigung */
  IEGUCODE_Cancel,              /*     Widerruft, Abbruch */
  IEGUCODE_Error,               /*     Fehler  */
  IEGUCODE_Notify,              /*     Auslöser ist ICLMTH_Notify */
  IEGUCODE_UpSelect,            /*+ 10 Der Selektzustand hat sich verändert (Update auf IEGUCODE_Select) */
  IEGUCODE_Alternate,           /*     Allegmeine Veränderung, (Eingabe in StrGad) */
  IEGUCODE_Drop,                /*     Eingabe erfolgte per Drag&Drop */
  IEGUCODE_Active,              /*     Gadget wurde aktiviert (Fokus auf Gadget) */
  IEGUCODE_Inactive,            /*     Gadget gibt Fokus ab */
  IEGUCODE_Drag,                /*  15  */
  IEGUCODE_MAX
};





enum pOS_InputEventQualifier
{
  IEQUALIFIER_LSHIFT            =0x0001,
  IEQUALIFIER_RSHIFT            =0x0002,
  IEQUALIFIER_CAPSLOCK          =0x0004,
  IEQUALIFIER_CONTROL           =0x0008,
  IEQUALIFIER_LALT              =0x0010,
  IEQUALIFIER_RALT              =0x0020,
  IEQUALIFIER_LCOMMAND          =0x0040,
  IEQUALIFIER_RCOMMAND          =0x0080,
  IEQUALIFIER_NUMERICPAD        =0x0100,
  IEQUALIFIER_REPEAT            =0x0200,
  IEQUALIFIER_INTERRUPT         =0x0400,
  IEQUALIFIER_MULTIBROADCAST    =0x0800,
  IEQUALIFIER_MIDBUTTON         =0x1000,
  IEQUALIFIER_RBUTTON           =0x2000,
  IEQUALIFIER_LEFTBUTTON        =0x4000,
  IEQUALIFIER_RELATIVEMOUSE     =0x8000,

  IEQUALIFIERB_LSHIFT           =0,
  IEQUALIFIERB_RSHIFT           =1,
  IEQUALIFIERB_CAPSLOCK         =2,
  IEQUALIFIERB_CONTROL          =3,
  IEQUALIFIERB_LALT             =4,
  IEQUALIFIERB_RALT             =5,
  IEQUALIFIERB_LCOMMAND         =6,
  IEQUALIFIERB_RCOMMAND         =7,
  IEQUALIFIERB_NUMERICPAD       =8,
  IEQUALIFIERB_REPEAT           =9,
  IEQUALIFIERB_INTERRUPT        =10,
  IEQUALIFIERB_MULTIBROADCAST   =11,
  IEQUALIFIERB_MIDBUTTON        =12,
  IEQUALIFIERB_RBUTTON          =13,
  IEQUALIFIERB_LEFTBUTTON       =14,
  IEQUALIFIERB_RELATIVEMOUSE    =15
};


/*----------------------------------
-----------------------------------*/
struct pOS_IEPointerPixel
{
  struct pOS_Screen *iepp_Screen;
  struct pOS_Point   iepp_Position;
};


/*----------------------------------
-----------------------------------*/
struct pOS_IEPointerTablet
{
  struct pOS_Point iept_Range;
  struct pOS_Point iept_Value;
  SWORD            iept_Pressure; /* -128 => 127 (unused, set to 0) */
};



/*----------------------------------
-----------------------------------*/
struct pOS_IENewTablet
{
  struct pOS_Callback *ient_CallBack;
  UWORD ient_ScaledX, ient_ScaledY;
  UWORD ient_ScaledXFraction, ient_ScaledYFraction;
  ULONG ient_TabletX, ient_TabletY;
  ULONG ient_RangeX, ient_RangeY;
  const struct pOS_TagItem *ient_TagList;
};



/*----------------------------------
  ie_Class==IECLASS_DROP
  (struct pOS_IEDragDrop*)ie->ie_EventAddress
-----------------------------------*/
struct pOS_IEDragDrop
{
  struct {
    struct pOS_Screen  *iedd_Screen;
    struct pOS_Window  *iedd_Window;
    struct pOS_Gadget  *iedd_Gadget;
    struct pOS_Point    iedd_Mouse;
    struct pOS_TimeVal  iedd_Time;

    UBYTE iedd_Reserved1[8];

  } iedd_Src, iedd_Dst;  /* Source, Destination */

  const struct pOS_DropAttribute *iedd_DropAtt;
        struct pOS_DataType      *iedd_Object;
        struct pOS_Point          iedd_Offset;

};


/*----------------------------------
-----------------------------------*/
struct pOS_InputEvent
{
  struct pOS_InputEvent *ie_NextEvent;   /* the chronologically next event */
  UBYTE                  ie_Class;       /* the input event class */
  UBYTE                  ie_SubClass;    /* optional subclass of the class */
  ULONG                  ie_Code;        /* the input event code */
  UWORD                  ie_Qualifier;   /* qualifiers in effect for the event*/
  UBYTE                  ie_Reserved1[8];
  union {
    UBYTE   ie_Reserved2[8];
    struct {
      UWORD ie_x;               /* the pointer position for the event*/
      UWORD ie_y;
    } ie_xy;
    APTR    ie_addr;            /* the event address */
    ULONG   ie_deadKey;         /* DeadKey pack */
    struct {
      UBYTE ie_prev1DownCode;   /* previous down keys for dead */
      UBYTE ie_prev1DownQual;   /*   key translation: the ie_Code */
      UBYTE ie_prev2DownCode;   /*   & low byte of ie_Qualifier for */
      UBYTE ie_prev2DownQual;   /*   last & second last down keys */
    } ie_dead;
  } ie_position;

  struct pOS_TimeVal ie_TimeStamp;  /* the system tick at the event */
  ULONG              ie_Data;

  UBYTE ie_Reserved3[8];
};


#define ie_DeadKey              ie_position.ie_deadKey

#ifndef ie_X
 #define ie_X                    ie_position.ie_xy.ie_x
 #define ie_Y                    ie_position.ie_xy.ie_y
 #define ie_EventAddress         ie_position.ie_addr
 #define ie_Prev1DownCode        ie_position.ie_dead.ie_prev1DownCode
 #define ie_Prev1DownQual        ie_position.ie_dead.ie_prev1DownQual
 #define ie_Prev2DownCode        ie_position.ie_dead.ie_prev2DownCode
 #define ie_Prev2DownQual        ie_position.ie_dead.ie_prev2DownQual
#endif

#endif
