#ifndef SYSTEM_EVENTS_H
#define SYSTEM_EVENTS_H TRUE

/*
**  $VER: events.h V0.9B
**
**  (C) Copyright 1996-1997 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 */
  __asm LONG (*Routine)(register __a0 APTR Reg1, register __d0 LONG Reg2);
  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_ab            (3|EVTNODE)   /* */
#define EVT_ac            (4|EVTNODE)   /* */
#define EVT_ad            (5|EVTNODE)   /* Args: <TimesPerSecond> */
#define EVT_ae            (6|EVTNODE)   /* Args: <Task> */
#define EVT_af            (7|EVTNODE)   /* Args: <Task> */
#define EVT_Timer         (8|EVTCALL)   /* Args: <MicroSeconds> */
#define EVT_DiskInsert    (9|EVTNODE)   /* Args: <None> */
#define EVT_DiskRemove   (10|EVTNODE)   /* Args: <None> */
#define EVT_SelfDestruct (11|EVTNODE)   /* Args: <Task>   */
#define EVT_OnDisplay    (12|EVTNODE)   /* Args: <Task>   */
#define EVT_Expunge      (13|EVTNODE)   /* Args: <None>   */
#define EVT_LowMemory    (14|EVTNODE)   /* Args: <PercentageLeft> */
#define EVT_PlaySound    (15|EVTCALL)   /* Args: <Task/Object>    */

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

#endif /* SYSTEM_EVENTS_H */
