| /* |
| * KEYBOARD driver |
| * |
| * Copyright 1993 Bob Amstadt |
| * Copyright 1996 Albrecht Kleine |
| * Copyright 1997 David Faure |
| * Copyright 1998 Morten Welinder |
| * Copyright 1998 Ulrich Weigand |
| * |
| */ |
| |
| #include "config.h" |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| #include "windows.h" |
| #include "win.h" |
| #include "gdi.h" |
| #include "heap.h" |
| #include "keyboard.h" |
| #include "message.h" |
| #include "debug.h" |
| #include "debugtools.h" |
| #include "struct32.h" |
| #include "winerror.h" |
| |
| static LPKEYBD_EVENT_PROC DefKeybEventProc = NULL; |
| LPBYTE pKeyStateTable = NULL; |
| |
| #ifndef X_DISPLAY_MISSING |
| extern KEYBOARD_DRIVER X11DRV_KEYBOARD_Driver; |
| #else /* X_DISPLAY_MISSING */ |
| extern KEYBOARD_DRIVER TTYDRV_KEYBOARD_Driver; |
| #endif /* X_DISPLAY_MISSING */ |
| |
| /*********************************************************************** |
| * KEYBOARD_GetDriver |
| */ |
| KEYBOARD_DRIVER *KEYBOARD_GetDriver() |
| { |
| #ifndef X_DISPLAY_MISSING |
| return &X11DRV_KEYBOARD_Driver; |
| #else /* X_DISPLAY_MISSING */ |
| return &TTYDRV_KEYBOARD_Driver; |
| #endif /* X_DISPLAY_MISSING */ |
| } |
| |
| /*********************************************************************** |
| * KEYBOARD_Inquire (KEYBOARD.1) |
| */ |
| WORD WINAPI KEYBOARD_Inquire(LPKBINFO kbInfo) |
| { |
| kbInfo->Begin_First_Range = 0; |
| kbInfo->End_First_Range = 0; |
| kbInfo->Begin_Second_Range = 0; |
| kbInfo->End_Second_Range = 0; |
| kbInfo->StateSize = 16; |
| |
| return sizeof(KBINFO); |
| } |
| |
| /*********************************************************************** |
| * KEYBOARD_Enable (KEYBOARD.2) |
| */ |
| VOID WINAPI KEYBOARD_Enable( LPKEYBD_EVENT_PROC lpKeybEventProc, |
| LPBYTE lpKeyState ) |
| { |
| static BOOL32 initDone = FALSE; |
| |
| DefKeybEventProc = lpKeybEventProc; |
| pKeyStateTable = lpKeyState; |
| |
| /* all states to false */ |
| memset( lpKeyState, 0, sizeof(lpKeyState) ); |
| |
| if (!initDone) KEYBOARD_GetDriver()->pInit(); |
| initDone = TRUE; |
| } |
| |
| /*********************************************************************** |
| * KEYBOARD_Disable (KEYBOARD.3) |
| */ |
| VOID WINAPI KEYBOARD_Disable(VOID) |
| { |
| DefKeybEventProc = NULL; |
| pKeyStateTable = NULL; |
| } |
| |
| /*********************************************************************** |
| * KEYBOARD_SendEvent |
| */ |
| void KEYBOARD_SendEvent( BYTE bVk, BYTE bScan, DWORD dwFlags, |
| DWORD posX, DWORD posY, DWORD time ) |
| { |
| WINE_KEYBDEVENT wke; |
| |
| if ( !DefKeybEventProc ) return; |
| |
| TRACE( event, "(%d,%d,%04lX)\n", bVk, bScan, dwFlags ); |
| |
| wke.magic = WINE_KEYBDEVENT_MAGIC; |
| wke.posX = posX; |
| wke.posY = posY; |
| wke.time = time; |
| |
| DefKeybEventProc( bVk, bScan, dwFlags, (DWORD)&wke ); |
| } |
| |
| /********************************************************************** |
| * ScreenSwitchEnable (KEYBOARD.100) |
| */ |
| VOID WINAPI ScreenSwitchEnable(WORD unused) |
| { |
| FIXME(keyboard,"(%04x): stub\n",unused); |
| } |
| |
| /********************************************************************** |
| * OemKeyScan (KEYBOARD.128)(USER32.401) |
| */ |
| DWORD WINAPI OemKeyScan(WORD wOemChar) |
| { |
| TRACE(keyboard,"*OemKeyScan (%d)\n",wOemChar); |
| |
| return wOemChar; |
| } |
| |
| /********************************************************************** |
| * VkKeyScan [KEYBOARD.129] |
| */ |
| /* VkKeyScan translates an ANSI character to a virtual-key and shift code |
| * for the current keyboard. |
| * high-order byte yields : |
| * 0 Unshifted |
| * 1 Shift |
| * 2 Ctrl |
| * 3-5 Shift-key combinations that are not used for characters |
| * 6 Ctrl-Alt |
| * 7 Ctrl-Alt-Shift |
| * I.e. : Shift = 1, Ctrl = 2, Alt = 4. |
| * FIXME : works ok except for dead chars : |
| * VkKeyScan '^'(0x5e, 94) ... got keycode 00 ... returning 00 |
| * VkKeyScan '`'(0x60, 96) ... got keycode 00 ... returning 00 |
| */ |
| |
| WORD WINAPI VkKeyScan16(CHAR cChar) |
| { |
| return KEYBOARD_GetDriver()->pVkKeyScan(cChar); |
| } |
| |
| /****************************************************************************** |
| * GetKeyboardType16 (KEYBOARD.130) |
| */ |
| INT16 WINAPI GetKeyboardType16(INT16 nTypeFlag) |
| { |
| TRACE(keyboard,"(%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: |
| WARN(keyboard, "Unknown type\n"); |
| return 0; /* The book says 0 here, so 0 */ |
| } |
| } |
| |
| /****************************************************************************** |
| * MapVirtualKey16 (KEYBOARD.131) |
| * |
| * MapVirtualKey translates keycodes from one format to another |
| */ |
| UINT16 WINAPI MapVirtualKey16(UINT16 wCode, UINT16 wMapType) |
| { |
| return KEYBOARD_GetDriver()->pMapVirtualKey(wCode,wMapType); |
| } |
| |
| /**************************************************************************** |
| * GetKBCodePage16 (KEYBOARD.132) |
| */ |
| INT16 WINAPI GetKBCodePage16(void) |
| { |
| TRACE(keyboard,"(void)\n"); |
| return 850; |
| } |
| |
| /**************************************************************************** |
| * GetKeyNameText16 (KEYBOARD.133) |
| */ |
| INT16 WINAPI GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize) |
| { |
| return KEYBOARD_GetDriver()->pGetKeyNameText(lParam, lpBuffer, nSize); |
| } |
| |
| /**************************************************************************** |
| * ToAscii (KEYBOARD.4) |
| * |
| * The ToAscii function translates the specified virtual-key code and keyboard |
| * state to the corresponding Windows character or characters. |
| * |
| * If the specified key is a dead key, the return value is negative. Otherwise, |
| * it is one of the following values: |
| * Value Meaning |
| * 0 The specified virtual key has no translation for the current state of the keyboard. |
| * 1 One Windows character was copied to the buffer. |
| * 2 Two characters were copied to the buffer. This usually happens when a |
| * dead-key character (accent or diacritic) stored in the keyboard layout cannot |
| * be composed with the specified virtual key to form a single character. |
| * |
| * FIXME : should do the above (return 2 for non matching deadchar+char combinations) |
| * |
| */ |
| INT16 WINAPI ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState, |
| LPVOID lpChar, UINT16 flags) |
| { |
| return KEYBOARD_GetDriver()->pToAscii( |
| virtKey, scanCode, lpKeyState, lpChar, flags |
| ); |
| } |
| |