#ifndef SYSTEM_EVENTS_H
#define SYSTEM_EVENTS_H TRUE

/*
**  $VER: events.h V1.0
**
**  (C) Copyright 1996-1998 DreamWorld Productions.
**      All Rights Reserved.
**
*/

#ifndef DPKERNEL_H
#include <dpkernel/dpkernel.h>
#endif

/*****************************************************************************
** The Event Node.
*/

#define TAGS_EVENT ((ID_SPCTAGS<<16)|ID_EVENT)

struct EvtEntry {
  struct Event *Event;
  LONG (*Routine)(void);
};

struct Event {
  struct Event *Next;       /* [00] Next event node */
  struct Event *Prev;       /* [04] Previous event node */

  #ifdef _DCC
    LONG (*Routine)(__A0 APTR Reg1, __D0 LONG Reg2);
  #else
   #ifdef __SASC
    __asm LONG (*Routine)(register __a0 APTR Reg1, register __d0 LONG Reg2);
   #else
    LONG (*Routine)(APTR Reg1, LONG Reg2);
   #endif
  #endif

  APTR   Args;              /* [12] Event arguments */
  WORD   Priority;          /* [16] Sets position in the event chain */
  WORD   Number;            /* [18] Event number */
  LONG   Flags;             /* [20] Special flags */
  struct DPTask *Task;      /* [24] Task owner */
};

/* Event Structure Tags */

#define EVA_Routine  (TAPTR|8)
#define EVA_Args     (TAPTR|12)
#define EVA_Priority (TWORD|16)
#define EVA_Number   (TWORD|18)
#define EVA_Flags    (TLONG|20)

/* Event->Flags */

#define EVF_ON        0x00000001  /* Call routine on event (default) */
#define EVF_AFTER     0x00000002  /* Call routine after event */
#define EVF_UNTRACKED 0x00000004  /* Do not track the event node */
#define EVF_GLOBAL    0x00000008  /* Always call if event occurs (default) */
#define EVF_TASK      0x00000010  /* Call if I am the active task */

/* Return flags for Event->Routine() and CallEventList() */

#define EVR_BREAK     0x00000001  /* Do not execute any more events */
#define EVR_FAIL      0x00000002  /* Return immediately (failure) */

/*****************************************************************************
** Available event types.
*/

#define EVTNODE (0L)
#define EVTCALL (0x80000000L)

#define EVT_OnNewTask        (1|EVTNODE)   /* A new task is appearing */
#define EVT_OnRemTask        (2|EVTNODE)   /* An existing task is being removed */
#define EVT_ScreenToFront    (3|EVTNODE)   /* Receives: <Screen> */
#define EVT_ScreenToBack     (4|EVTNODE)   /* Receives: <Screen> */
#define EVT_ScreenDisplayed  (5|EVTNODE)   /* Receives: <Screen> */
#define EVT_ScreenHidden     (6|EVTNODE)   /* Receives: <Screen> */
#define EVT_DiskInsert       (7|EVTNODE)   /* Disk inserted by user */
#define EVT_DiskRemove       (8|EVTNODE)   /* Disk removed by user */
#define EVT_SelfDestruct     (9|EVTNODE)   /* Receives: <Task> */
#define EVT_LowMemory       (10|EVTNODE)   /* Args: <PercentageLeft> */

#define EVT_END          200  /* Maximum amount of events for this version */

#endif /* SYSTEM_EVENTS_H */
