/*
 * Keyboard related functions
 *
 * Copyright 1993 Bob Amstadt
 */

static char Copyright[] = "Copyright  Bob Amstadt, 1993";

#include <string.h>
#include "win.h"
#include "windows.h"

extern BOOL MouseButtonsStates[3];
extern BOOL AsyncMouseButtonsStates[3];
extern BYTE KeyStateTable[256];
extern BYTE AsyncKeyStateTable[256];

/**********************************************************************
 *		GetKeyState			[USER.106]
 */
int GetKeyState(int keycode)
{
	switch(keycode) {
		case VK_LBUTTON:
		    return MouseButtonsStates[0];
		case VK_MBUTTON:
		    return MouseButtonsStates[1];
		case VK_RBUTTON:
		    return MouseButtonsStates[2];
		default:
		    return KeyStateTable[keycode];
		}
}

/**********************************************************************
 *		GetKeyboardState			[USER.222]
 */
void GetKeyboardState(BYTE FAR *lpKeyState)
{
    if (lpKeyState != NULL) {
	KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0];
	KeyStateTable[VK_MBUTTON] = MouseButtonsStates[1];
	KeyStateTable[VK_RBUTTON] = MouseButtonsStates[2];
	memcpy(lpKeyState, KeyStateTable, 256);
    }
}

/**********************************************************************
 *            GetAsyncKeyState        (USER.249)
 *
 *	Determine if a key is or was pressed.  retval has high-order 
 * byte set to 1 if currently pressed, low-order byte 1 if key has
 * been pressed.
 *
 *	This uses the variable AsyncMouseButtonsStates and
 * AsyncKeyStateTable (set in event.c) which have the mouse button
 * number or key number (whichever is applicable) set to true if the
 * mouse or key had been depressed since the last call to 
 * GetAsyncKeyState.
 */
int GetAsyncKeyState(int nKey)
{
	short 	retval;	

	switch (nKey) {

           case VK_LBUTTON:
		retval = AsyncMouseButtonsStates[0] | 
                              (MouseButtonsStates[0] << 8);
		break;
           case VK_MBUTTON:
                retval = AsyncMouseButtonsStates[1] |
                              (MouseButtonsStates[1] << 8);
		break;
           case VK_RBUTTON:
                retval = AsyncMouseButtonsStates[2] |
                              (MouseButtonsStates[2] << 8);
		break;
           default:
                retval = AsyncKeyStateTable[nKey] | 
		              (KeyStateTable[nKey] << 8);
		break;
        }

	bzero(AsyncMouseButtonsStates, 3);	/* all states to false */
	bzero(AsyncKeyStateTable, 256);

	return retval;
}

