blob: f8f5abc2ac335baac39a85b3c345937045c537aa [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
Ulrich Weigandd1b919c1998-11-08 12:19:23 +00002 * KEYBOARD driver
Alexandre Julliard401710d1993-09-04 10:09:32 +00003 *
4 * Copyright 1993 Bob Amstadt
Alexandre Julliardb1bac321996-12-15 19:45:59 +00005 * Copyright 1996 Albrecht Kleine
Alexandre Julliard01d63461997-01-20 19:43:45 +00006 * Copyright 1997 David Faure
Alexandre Julliarda845b881998-06-01 10:44:35 +00007 * Copyright 1998 Morten Welinder
Ulrich Weigandd1b919c1998-11-08 12:19:23 +00008 * Copyright 1998 Ulrich Weigand
Alexandre Julliard01d63461997-01-20 19:43:45 +00009 *
Alexandre Julliard401710d1993-09-04 10:09:32 +000010 */
Alexandre Julliard21979011997-03-05 08:22:35 +000011
Alexandre Julliard01d63461997-01-20 19:43:45 +000012#include <stdlib.h>
Alexandre Julliardaca05781994-10-17 18:12:41 +000013#include <string.h>
Alexandre Julliard01d63461997-01-20 19:43:45 +000014#include <ctype.h>
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +000015
Jeremy Whited3e22d92000-02-10 19:03:02 +000016#include "windef.h"
François Gouget44a18222000-12-19 04:53:20 +000017#include "winbase.h"
Jeremy Whited3e22d92000-02-10 19:03:02 +000018#include "wingdi.h"
Marcus Meissner61afa331999-02-22 10:16:00 +000019#include "winuser.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000020#include "win.h"
Alexandre Julliard28c3a1b2000-03-20 18:21:19 +000021#include "user.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000022#include "message.h"
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000023#include "callback.h"
24#include "builtin16.h"
Alexandre Julliard54c27111998-03-29 19:44:57 +000025#include "debugtools.h"
Alexandre Julliard54c27111998-03-29 19:44:57 +000026#include "winerror.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000027
Alexandre Julliard07d0c312000-10-26 21:50:59 +000028DEFAULT_DEBUG_CHANNEL(keyboard);
Alexandre Julliard4b626182001-10-17 17:50:02 +000029
30#include "pshpack1.h"
31typedef struct _KBINFO
32{
33 BYTE Begin_First_Range;
34 BYTE End_First_Range;
35 BYTE Begin_Second_Range;
36 BYTE End_Second_Range;
37 WORD StateSize;
38} KBINFO, *LPKBINFO;
39#include "poppack.h"
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000040
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +000041/**********************************************************************/
42
Alexandre Julliard4b626182001-10-17 17:50:02 +000043typedef VOID CALLBACK (*LPKEYBD_EVENT_PROC)(BYTE,BYTE,DWORD,DWORD);
44
45static LPKEYBD_EVENT_PROC DefKeybEventProc;
46static LPBYTE pKeyStateTable;
47
48/***********************************************************************
49 * KEYBOARD_CallKeybdEventProc
50 */
51static VOID WINAPI KEYBOARD_CallKeybdEventProc( FARPROC16 proc,
52 BYTE bVk, BYTE bScan,
53 DWORD dwFlags, DWORD dwExtraInfo )
54{
55 CONTEXT86 context;
56
57 memset( &context, 0, sizeof(context) );
58 context.SegCs = SELECTOROF( proc );
59 context.Eip = OFFSETOF( proc );
60 context.Eax = bVk | ((dwFlags & KEYEVENTF_KEYUP)? 0x8000 : 0);
61 context.Ebx = bScan | ((dwFlags & KEYEVENTF_EXTENDEDKEY) ? 0x100 : 0);
62 context.Esi = LOWORD( dwExtraInfo );
63 context.Edi = HIWORD( dwExtraInfo );
64
65 wine_call_to_16_regs_short( &context, 0 );
66}
Alexandre Julliardda0cfb31996-12-01 17:17:47 +000067
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000068/***********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +000069 * Inquire (KEYBOARD.1)
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000070 */
71WORD WINAPI KEYBOARD_Inquire(LPKBINFO kbInfo)
72{
Patrik Stridvalle35d6361998-12-07 09:13:40 +000073 kbInfo->Begin_First_Range = 0;
74 kbInfo->End_First_Range = 0;
75 kbInfo->Begin_Second_Range = 0;
76 kbInfo->End_Second_Range = 0;
77 kbInfo->StateSize = 16;
78
79 return sizeof(KBINFO);
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000080}
81
82/***********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +000083 * Enable (KEYBOARD.2)
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000084 */
Alexandre Julliard4b626182001-10-17 17:50:02 +000085VOID WINAPI KEYBOARD_Enable( FARPROC16 proc, LPBYTE lpKeyState )
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000086{
Alexandre Julliard4b626182001-10-17 17:50:02 +000087 if (DefKeybEventProc) THUNK_Free( (FARPROC)DefKeybEventProc );
88 DefKeybEventProc = (LPKEYBD_EVENT_PROC)THUNK_Alloc( proc, (RELAY)KEYBOARD_CallKeybdEventProc );
89 pKeyStateTable = lpKeyState;
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000090
Alexandre Julliard4b626182001-10-17 17:50:02 +000091 memset( lpKeyState, 0, 256 ); /* all states to false */
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000092}
93
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000094/***********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +000095 * Disable (KEYBOARD.3)
Ulrich Weigandd1b919c1998-11-08 12:19:23 +000096 */
97VOID WINAPI KEYBOARD_Disable(VOID)
98{
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000099 THUNK_Free( (FARPROC)DefKeybEventProc );
100
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000101 DefKeybEventProc = NULL;
102 pKeyStateTable = NULL;
Ulrich Weigandd1b919c1998-11-08 12:19:23 +0000103}
104
Ulrich Weigandd1b919c1998-11-08 12:19:23 +0000105
Alexandre Julliard401710d1993-09-04 10:09:32 +0000106/**********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000107 * SetSpeed (KEYBOARD.7)
Alexandre Julliard4220b291999-07-11 17:20:01 +0000108 */
109WORD WINAPI SetSpeed16(WORD unused)
110{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +0000111 FIXME("(%04x): stub\n", unused);
Alexandre Julliard4220b291999-07-11 17:20:01 +0000112 return 0xffff;
113}
114
115/**********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000116 * ScreenSwitchEnable (KEYBOARD.100)
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000117 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000118VOID WINAPI ScreenSwitchEnable16(WORD unused)
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000119{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +0000120 FIXME("(%04x): stub\n", unused);
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000121}
122
123/**********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000124 * OemKeyScan (KEYBOARD.128)
125 * OemKeyScan (USER32.@)
Alexandre Julliard349a9531997-02-02 19:01:52 +0000126 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000127DWORD WINAPI OemKeyScan(WORD wOemChar)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000128{
Andreas Mohre15badb2001-10-21 15:18:15 +0000129 TRACE("(%d)\n", wOemChar);
Alexandre Julliard01d63461997-01-20 19:43:45 +0000130
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000131 return wOemChar;
Alexandre Julliard01d63461997-01-20 19:43:45 +0000132}
133
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000134/**********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000135 * VkKeyScan (KEYBOARD.129)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000136 */
Ulrich Weigandd1b919c1998-11-08 12:19:23 +0000137WORD WINAPI VkKeyScan16(CHAR cChar)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000138{
Alexandre Julliard4b626182001-10-17 17:50:02 +0000139 return VkKeyScanA( cChar );
Alexandre Julliard01d63461997-01-20 19:43:45 +0000140}
141
Alexandre Julliard349a9531997-02-02 19:01:52 +0000142/******************************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000143 * GetKeyboardType (KEYBOARD.130)
Alexandre Julliard349a9531997-02-02 19:01:52 +0000144 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000145INT16 WINAPI GetKeyboardType16(INT16 nTypeFlag)
Alexandre Julliard349a9531997-02-02 19:01:52 +0000146{
Alexandre Julliard4b626182001-10-17 17:50:02 +0000147 return GetKeyboardType( nTypeFlag );
Alexandre Julliard01d63461997-01-20 19:43:45 +0000148}
149
Alexandre Julliard349a9531997-02-02 19:01:52 +0000150/******************************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000151 * MapVirtualKey (KEYBOARD.131)
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000152 *
Alexandre Julliard349a9531997-02-02 19:01:52 +0000153 * MapVirtualKey translates keycodes from one format to another
154 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000155UINT16 WINAPI MapVirtualKey16(UINT16 wCode, UINT16 wMapType)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000156{
Alexandre Julliard4b626182001-10-17 17:50:02 +0000157 return MapVirtualKeyA(wCode,wMapType);
Alexandre Julliard01d63461997-01-20 19:43:45 +0000158}
159
Alexandre Julliard349a9531997-02-02 19:01:52 +0000160/****************************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000161 * GetKBCodePage (KEYBOARD.132)
Alexandre Julliard349a9531997-02-02 19:01:52 +0000162 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000163INT16 WINAPI GetKBCodePage16(void)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000164{
Dmitry Timoshkov97d5abc2000-12-29 19:47:53 +0000165 return GetKBCodePage();
Alexandre Julliard01d63461997-01-20 19:43:45 +0000166}
167
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000168/****************************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000169 * GetKeyNameText (KEYBOARD.133)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000170 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000171INT16 WINAPI GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000172{
Alexandre Julliard4b626182001-10-17 17:50:02 +0000173 return GetKeyNameTextA( lParam, lpBuffer, nSize );
Alexandre Julliard01d63461997-01-20 19:43:45 +0000174}
175
Alexandre Julliard349a9531997-02-02 19:01:52 +0000176/****************************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000177 * ToAscii (KEYBOARD.4)
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000178 *
179 * The ToAscii function translates the specified virtual-key code and keyboard
180 * state to the corresponding Windows character or characters.
181 *
182 * If the specified key is a dead key, the return value is negative. Otherwise,
183 * it is one of the following values:
184 * Value Meaning
185 * 0 The specified virtual key has no translation for the current state of the keyboard.
186 * 1 One Windows character was copied to the buffer.
187 * 2 Two characters were copied to the buffer. This usually happens when a
188 * dead-key character (accent or diacritic) stored in the keyboard layout cannot
189 * be composed with the specified virtual key to form a single character.
190 *
191 * FIXME : should do the above (return 2 for non matching deadchar+char combinations)
192 *
Alexandre Julliard349a9531997-02-02 19:01:52 +0000193 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000194INT16 WINAPI ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState,
195 LPVOID lpChar, UINT16 flags)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000196{
Dmitry Timoshkov8a316342000-10-25 21:34:31 +0000197 return ToAscii( virtKey, scanCode, lpKeyState, lpChar, flags );
Alexandre Julliard01d63461997-01-20 19:43:45 +0000198}
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000199
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +0000200/***********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000201 * MessageBeep (USER.104)
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +0000202 */
Alexandre Julliard946a4442000-07-30 13:50:27 +0000203void WINAPI MessageBeep16( UINT16 i )
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +0000204{
Alexandre Julliard946a4442000-07-30 13:50:27 +0000205 MessageBeep( i );
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +0000206}
207
Alexandre Julliard946a4442000-07-30 13:50:27 +0000208/***********************************************************************
Patrik Stridvall2ece70e2000-12-22 01:38:01 +0000209 * MessageBeep (USER32.@)
Alexandre Julliard946a4442000-07-30 13:50:27 +0000210 */
211BOOL WINAPI MessageBeep( UINT i )
212{
Alexandre Julliardc6a835a2001-05-05 00:49:15 +0000213 BOOL active = TRUE;
214 SystemParametersInfoA( SPI_GETBEEP, 0, &active, FALSE );
215 if (active) USER_Driver.pBeep();
Alexandre Julliard946a4442000-07-30 13:50:27 +0000216 return TRUE;
217}