//////////////////////////////////////////////////////////////////////
//
// Project  : BRender Demo Framework
//            Copyright (c) 1996 Argonaut Technologies Ltd.
//            All rights reserved.
//
// Author   : Steve Williams, October 1996
//
// File     : WINKEY.C
//
// Requires : BRender V1.3
//            Microsoft DirectX 3
//
// Comments : Emulation of DOSKeyTest under Windows.
//
//////////////////////////////////////////////////////////////////////


#include "br_demo.h"
#include <keyboard.h>

#define MAX_KEYS 255 /* All normal keys, + extended 0..9 */


static br_boolean Key_Down[MAX_KEYS];
static br_boolean Key_Press_Waiting[MAX_KEYS];
static br_boolean First_Key_Press_Waiting[MAX_KEYS];



static int VK_To_SC_Table[MAX_KEYS];


void BR_PUBLIC_ENTRY WinKeyBegin()
{
	int i ;
    
	for ( i = 0 ; i < MAX_KEYS ; i ++ )
    {
        Key_Down[i] = BR_FALSE ;
        Key_Press_Waiting[i] = BR_FALSE ;
        First_Key_Press_Waiting[i] = BR_FALSE ;
        VK_To_SC_Table[i]=0;
    }

	VK_To_SC_Table[VK_ESCAPE   ]=SC_ESC            ;
	VK_To_SC_Table['1'         ]=SC_1              ;
	VK_To_SC_Table['2'         ]=SC_2			   ;
	VK_To_SC_Table['3'         ]=SC_3              ;
	VK_To_SC_Table['4'         ]=SC_4              ;
	VK_To_SC_Table['5'         ]=SC_5              ;
	VK_To_SC_Table['6'         ]=SC_6              ;
	VK_To_SC_Table['7'         ]=SC_7              ;
	VK_To_SC_Table['8'         ]=SC_8              ;
	VK_To_SC_Table['9'         ]=SC_9              ;
	VK_To_SC_Table['0'         ]=SC_0              ;
	VK_To_SC_Table[VK_SUBTRACT ]=SC_MINUS          ;
	VK_To_SC_Table[VK_ADD      ]=SC_EQUALS         ;
	VK_To_SC_Table[VK_BACK     ]=SC_BACKSPACE      ;
	VK_To_SC_Table[VK_TAB      ]=SC_TAB            ;
	VK_To_SC_Table['Q'         ]=SC_Q              ;
	VK_To_SC_Table['W'         ]=SC_W              ;
	VK_To_SC_Table['E'         ]=SC_E              ;
	VK_To_SC_Table['R'         ]=SC_R              ;
	VK_To_SC_Table['T'         ]=SC_T              ;
	VK_To_SC_Table['Y'         ]=SC_Y              ;
	VK_To_SC_Table['U'         ]=SC_U              ;
	VK_To_SC_Table['I'         ]=SC_I              ;
	VK_To_SC_Table['O'         ]=SC_O              ;
	VK_To_SC_Table['P'         ]=SC_P              ;
//VK_To_SC_Table[0           ]=SC_LSQUARE        ;
//VK_To_SC_Table[0           ]=SC_RSQUARE        ;
	VK_To_SC_Table[VK_RETURN   ]=SC_ENTER          ;
	VK_To_SC_Table[VK_CONTROL  ]=SC_CTRL           ;
	VK_To_SC_Table['A'         ]=SC_A              ;
	VK_To_SC_Table['S'         ]=SC_S              ;
	VK_To_SC_Table['D'         ]=SC_D              ;
	VK_To_SC_Table['F'         ]=SC_F              ;
	VK_To_SC_Table['G'         ]=SC_G              ;
	VK_To_SC_Table['H'         ]=SC_H              ;
	VK_To_SC_Table['J'         ]=SC_J              ;
	VK_To_SC_Table['K'         ]=SC_K              ;
	VK_To_SC_Table['L'         ]=SC_L              ;
//VK_To_SC_Table[0           ]=SC_SEMI           ;
//VK_To_SC_Table[0           ]=SC_QUOTE          ;
//VK_To_SC_Table[0           ]=SC_BACKQUOTE      ;
	VK_To_SC_Table[VK_LSHIFT   ]=SC_LSHIFT         ;
//VK_To_SC_Table[0           ]=SC_BACKSLASH      ;
	VK_To_SC_Table['Z'         ]=SC_Z              ;
	VK_To_SC_Table['X'         ]=SC_X              ;
	VK_To_SC_Table['C'         ]=SC_C              ;
	VK_To_SC_Table['V'         ]=SC_V              ;
	VK_To_SC_Table['B'         ]=SC_B              ;
	VK_To_SC_Table['N'         ]=SC_N              ;
	VK_To_SC_Table['M'         ]=SC_M              ;
//VK_To_SC_Table[0           ]=SC_COMMA          ;
	VK_To_SC_Table[VK_DECIMAL  ]=SC_DOT            ;
	VK_To_SC_Table[VK_DIVIDE   ]=SC_SLASH          ;
	VK_To_SC_Table[VK_RSHIFT   ]=SC_RSHIFT         ;
	VK_To_SC_Table[VK_MULTIPLY ]=SC_KP_ASTERISK    ;
//VK_To_SC_Table[0           ]=SC_ALT            ;
	VK_To_SC_Table[VK_SPACE    ]=SC_SPACE          ;
//VK_To_SC_Table[0           ]=SC_CAPSLOCK       ;
	VK_To_SC_Table[VK_F1       ]=SC_F1             ;
	VK_To_SC_Table[VK_F2       ]=SC_F2             ;
	VK_To_SC_Table[VK_F3       ]=SC_F3             ;
	VK_To_SC_Table[VK_F4       ]=SC_F4             ;
	VK_To_SC_Table[VK_F5       ]=SC_F5             ;
	VK_To_SC_Table[VK_F6       ]=SC_F6             ;
	VK_To_SC_Table[VK_F7       ]=SC_F7             ;
	VK_To_SC_Table[VK_F8       ]=SC_F8             ;
	VK_To_SC_Table[VK_F9       ]=SC_F9             ;
	VK_To_SC_Table[VK_F10      ]=SC_F10            ;
	VK_To_SC_Table[VK_NUMLOCK  ]=SC_NUMLOCK        ;
//VK_To_SC_Table[0           ]=SC_SCRLOCK        ;
	VK_To_SC_Table[VK_HOME     ]=SC_HOME           ;
	VK_To_SC_Table[VK_PRIOR    ]=SC_PG_UP          ;
//VK_To_SC_Table[0           ]=SC_KP_MINUS       ;
//VK_To_SC_Table[0           ]=SC_KP_5           ;
	VK_To_SC_Table[VK_ADD      ]=SC_KP_PLUS        ;
	VK_To_SC_Table[VK_END      ]=SC_END            ;
	VK_To_SC_Table[VK_NEXT     ]=SC_PG_DOWN        ;
	VK_To_SC_Table[VK_INSERT   ]=SC_INSERT         ;
	VK_To_SC_Table[VK_DELETE   ]=SC_DELETE         ;
	VK_To_SC_Table[VK_UP       ]=SC_C_UP/*+SC_EXTENDED*/  ;
	VK_To_SC_Table[VK_DOWN     ]=SC_C_DOWN/*+SC_EXTENDED*/         ;
	VK_To_SC_Table[VK_LEFT     ]=SC_C_LEFT/*+SC_EXTENDED*/         ;
	VK_To_SC_Table[VK_RIGHT    ]=SC_C_RIGHT/*+SC_EXTENDED*/        ;
	VK_To_SC_Table[VK_NUMPAD8]=SC_C_UP;
	VK_To_SC_Table[VK_NUMPAD4]=SC_C_LEFT;
	VK_To_SC_Table[VK_NUMPAD6]=SC_C_RIGHT;
	VK_To_SC_Table[VK_NUMPAD2]=SC_C_DOWN;
	VK_To_SC_Table[VK_NUMPAD9]=SC_PG_UP;
	VK_To_SC_Table[VK_NUMPAD7]=SC_HOME;
	VK_To_SC_Table[VK_NUMPAD3]=SC_PG_DOWN;
	VK_To_SC_Table[VK_NUMPAD1]=SC_END;
}

int lastkeydown=0;

void BrWinRegisterKeyState( br_uint_16 VKey, br_boolean bDown, br_uint_16 RepeatCount )
{
    int i ;

	if(VKey>MAX_KEYS){
		i=0;
	}else{
		i=VK_To_SC_Table[VKey];
	}

    if ( bDown && !Key_Down[i] )
	{
        First_Key_Press_Waiting[i] = BR_TRUE ;
		lastkeydown=i;
	}

	Key_Down[i] = bDown ;
    Key_Press_Waiting[i] = bDown ;

	if ( !bDown )
	{
	   First_Key_Press_Waiting[i] = BR_FALSE ;
	}
}

int get_key(void)
{
	int i;

	i=lastkeydown;
	lastkeydown=0;
	return i;
}

int hitnow(void)
{

	return lastkeydown;
}

br_boolean BR_PUBLIC_ENTRY WinKeyTest( br_uint_8 ScanCode, br_uint_8 qualifiers, br_uint_8 repeats)
{
	lastkeydown=0;
   if ( repeats == 0 )
   {
        Key_Press_Waiting[ScanCode] = BR_FALSE ;
        return Key_Down[ScanCode] ;
   }
	else if ( repeats == REPT_AUTO_REPT )
   {
        br_boolean bDown = Key_Press_Waiting[ScanCode];

        Key_Press_Waiting[ScanCode] = BR_FALSE ;
        First_Key_Press_Waiting[ScanCode] = BR_FALSE ;

        return bDown ;
   }
   else if ( repeats == REPT_FIRST_DOWN )
	{
        br_boolean bDown = First_Key_Press_Waiting[ScanCode];

        Key_Press_Waiting[ScanCode] = BR_FALSE ;
		First_Key_Press_Waiting[ScanCode] = BR_FALSE ;

        return bDown ;
	}
	else
		BR_ERROR("Unknown repeat type");
		
	return FALSE ;
}

