#ifndef INPUTS_H
#define INPUTS_H
/**************************************************************************
 *
 * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
 *
 * $Id$
 *
 * $Log$
 *
 *************************************************************************/

#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
