#ifndef INPUTS_H
#define INPUTS_H
/**************************************************************************
 *
 * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
 *
 * $Id: inputs.h,v 1.1 1999/04/28 18:56:13 meh Exp meh $
 *
 * $Log: inputs.h,v $
 * Revision 1.1  1999/04/28 18:56:13  meh
 * Initial revision
 *
 *
 *************************************************************************/

#include <macros.h>

#define IKEY_RAW    0x1000
#define IKEY_RAWMASK  0x7f
#define IKEY_NONE   0x2000

#define IKEY_TAB       (IKEY_RAW|0x42)
#define IKEY_CONTROL   (IKEY_RAW|0x63)
#define IKEY_LALT      (IKEY_RAW|0x64)
#define IKEY_RALT      (IKEY_RAW|0x65)
#define IKEY_UP        (IKEY_RAW|0x4c)
#define IKEY_DOWN      (IKEY_RAW|0x4d)
#define IKEY_LEFT      (IKEY_RAW|0x4f)
#define IKEY_RIGHT     (IKEY_RAW|0x4e)
#define IKEY_1         (IKEY_RAW|0x01)
#define IKEY_2         (IKEY_RAW|0x02)
#define IKEY_3         (IKEY_RAW|0x03)
#define IKEY_P         (IKEY_RAW|0x19)
#define IKEY_F1        (IKEY_RAW|0x50)
#define IKEY_F2        (IKEY_RAW|0x51)
#define IKEY_F3        (IKEY_RAW|0x52)
#define IKEY_F4        (IKEY_RAW|0x53)
#define IKEY_F5        (IKEY_RAW|0x54)
#define IKEY_F6        (IKEY_RAW|0x55)
#define IKEY_F7        (IKEY_RAW|0x56)
#define IKEY_F8        (IKEY_RAW|0x57)
#define IKEY_F9        (IKEY_RAW|0x58)
#define IKEY_F10       (IKEY_RAW|0x59)
#define IKEY_ESC       (IKEY_RAW|0x45)
#define IKEY_BACKSPACE (IKEY_RAW|0x41)
#define IKEY_ENTER     (IKEY_RAW|0x44)
#define IKEY_LSHIFT    (IKEY_RAW|0x60)
#define IKEY_RSHIFT    (IKEY_RAW|0x61)
#define IKEY_CAPSLOCK  (IKEY_RAW|0x62)
#define IKEY_MINUS_PAD (IKEY_RAW|0x4a)
#define IKEY_5_PAD     (IKEY_RAW|0x2e)
#define IKEY_PLUS_PAD  (IKEY_RAW|0x5e)
#define IKEY_DEL       (IKEY_RAW|0x46)

struct IKeyMap
{
  ULONG Code;
  ULONG Key;
};

struct IPort
{
  LONG Type;

  BYTE Red;
  BYTE Blue;
  BYTE Green;
  BYTE Yellow;
  BYTE Forward;
  BYTE Reverse;
  BYTE Play;

  union
  {
    struct
    {
      BYTE  Left;
      BYTE  Right;
      BYTE  Up;
      BYTE  Down;
    } Joystick;
    struct
    {
      LONG  PrevX;
      LONG  PrevY;
      LONG  MouseX;
      LONG  MouseY;
    } Mouse;
  } Move;

#ifdef INPUTS_PRIVATE
  LONG  RealRed;

  ULONG AutoFireTime;
  ULONG BlueEmuTime;

  struct MsgPort *MsgPort;

  struct IOStdReq    *PortRequest;
  struct timerequest *TimerRequest;

  LONG PortRequestActive;
  LONG TimerRequestActive;

  struct InputEvent InputEvent;

  struct GamePortTrigger OldTrigger;
  UBYTE OldType;

  BYTE Enabled;
#endif
};

struct Inputs
{
  ULONG        SignalMask;
  struct IPort *Ports[2];
  BYTE         *Keys;

#ifdef INPUTS_PRIVATE
  struct Library  *LowLevelBase;
  struct Window   *Window;
  struct Hook     *RefreshHook;
  struct Hook     *MenuHook;
  struct Hook     *IDCMPHook;
  UBYTE           RawKeys[128];
  struct IOStdReq InputRequest;

  BYTE      Enabled;
#endif
};

#define IPT_NONE     0
#define IPT_JOYSTICK 1
#define IPT_JOYPAD   2
#define IPT_MOUSE    3

#define IA_Port1          (TAG_USER)
#define IA_Port2          (TAG_USER+1)
#define IA_KeyMap         (TAG_USER+2)
#define IA_P1AutoFireRate (TAG_USER+3)
#define IA_P2AutoFireRate (TAG_USER+4)
#define IA_P1BlueEmuTime  (TAG_USER+5)
#define IA_P2BlueEmuTime  (TAG_USER+6)
#define IA_Window         (TAG_USER+7)
#define IA_RefreshHook    (TAG_USER+8)
#define IA_MenuHook       (TAG_USER+9)
#define IA_UseTicks       (TAG_USER+10)
#define IA_IDCMPHook      (TAG_USER+11)

struct Inputs *AllocInputs(Tag tags,...);
void FreeInputs(struct Inputs *inputs);
void IEnable(struct Inputs *inputs);
void IDisable(struct Inputs *inputs);
void IUpdate(struct Inputs *inputs);

#endif
