blob: 8f8c31b26252c88256f73d55d2aca859a44c22a8 [file] [log] [blame]
/*
static char RCSId[] = "$Id: keyboard.c,v 1.2 1993/09/13 18:52:02 scott Exp $";
static char Copyright[] = "Copyright Scott A. Laird, Erik Bos 1993, 1994";
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "windows.h"
#include "keyboard.h"
#include "stddebug.h"
/* #define DEBUG_KEYBOARD */
#include "debug.h"
int ToAscii(WORD wVirtKey, WORD wScanCode, LPSTR lpKeyState,
LPVOID lpChar, WORD wFlags)
{
int i;
dprintf_keyboard(stddeb,"ToAscii (%d,%d)\n",wVirtKey, wScanCode);
/* FIXME: codepage is broken */
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].virtualkey == wVirtKey)
{
dprintf_keyboard(stddeb,"\t\tchar = %s\n", KeyTable[i].name);
if( isprint(KeyTable[i].ASCII) || isspace(KeyTable[i].ASCII) )
{
*(BYTE*)lpChar = KeyTable[i].ASCII;
*(((BYTE*)lpChar) + 1) = 0;
if( isalpha( *(BYTE*)lpChar ) )
if( (lpKeyState[VK_CAPITAL]<0 && !lpKeyState[VK_SHIFT]) ||
(!lpKeyState[VK_CAPITAL] && lpKeyState[VK_SHIFT]<0) )
*(BYTE*)lpChar = toupper( *(BYTE*)lpChar );
else
*(BYTE*)lpChar = tolower( *(BYTE*)lpChar );
return 1;
}
}
*(BYTE*)lpChar = 0;
return 0;
}
DWORD OemKeyScan(WORD wOemChar)
{
dprintf_keyboard(stddeb,"*OemKeyScan (%d)\n",wOemChar);
return wOemChar;
}
/* VkKeyScan translates an ANSI character to a virtual-key and shift code
* for the current keyboard. */
WORD VkKeyScan(WORD cChar)
{
int i;
dprintf_keyboard(stddeb,"VkKeyScan (%d)\n",cChar);
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].ASCII == cChar)
return KeyTable[i].virtualkey;
return -1;
}
int GetKeyboardType(int nTypeFlag)
{
dprintf_keyboard(stddeb,"GetKeyboardType(%d)\n",nTypeFlag);
switch(nTypeFlag)
{
case 0: /* Keyboard type */
return 4; /* AT-101 */
break;
case 1: /* Keyboard Subtype */
return 0; /* There are no defined subtypes */
break;
case 2: /* Number of F-keys */
return 12; /* We're doing an 101 for now, so return 12 F-keys */
break;
default:
fprintf(stderr, "Unknown type on GetKeyboardType\n");
return 0; /* The book says 0 here, so 0 */
}
}
/* MapVirtualKey translates keycodes from one format to another. */
WORD MapVirtualKey(WORD wCode, WORD wMapType)
{
int i;
switch(wMapType) {
case 0:
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].virtualkey == wCode)
return KeyTable[i].scancode;
return 0;
case 1:
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].scancode == wCode)
return KeyTable[i].virtualkey;
return 0;
case 2:
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].virtualkey == wCode)
return KeyTable[i].ASCII;
return 0;
default:
fprintf(stderr, "MapVirtualKey: unknown wMapType!\n");
return 0;
}
return 0;
}
int GetKbCodePage(void)
{
dprintf_keyboard(stddeb,"GetKbCodePage()\n");
return 850;
}
int GetKeyNameText(LONG lParam, LPSTR lpBuffer, int nSize)
{
int i;
dprintf_keyboard(stddeb,"GetKeyNameText(%ld,<ptr>,%d)\n",lParam,nSize);
lParam >>= 16;
lParam &= 0xff;
for (i = 0 ; i != KeyTableSize ; i++)
if (KeyTable[i].scancode == lParam) {
lstrcpyn(lpBuffer, KeyTable[i].name, nSize);
return strlen(lpBuffer);
}
*lpBuffer = 0;
return 0;
}