/*
 * Keyboard related functions
 *
 * Copyright 1993 Bob Amstadt
 */
#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;
}

