4 * Copyright 1993 Bob Amstadt
5 * Copyright 1996 Albrecht Kleine
6 * Copyright 1997 David Faure
7 * Copyright 1998 Morten Welinder
8 * Copyright 1998 Ulrich Weigand
24 #include "builtin16.h"
25 #include "debugtools.h"
28 DEFAULT_DEBUG_CHANNEL(keyboard);
31 typedef struct _KBINFO
33 BYTE Begin_First_Range;
35 BYTE Begin_Second_Range;
36 BYTE End_Second_Range;
41 /**********************************************************************/
43 typedef VOID CALLBACK (*LPKEYBD_EVENT_PROC)(BYTE,BYTE,DWORD,DWORD);
45 static LPKEYBD_EVENT_PROC DefKeybEventProc;
46 static LPBYTE pKeyStateTable;
48 /***********************************************************************
49 * KEYBOARD_CallKeybdEventProc
51 static VOID WINAPI KEYBOARD_CallKeybdEventProc( FARPROC16 proc,
53 DWORD dwFlags, DWORD dwExtraInfo )
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 );
65 wine_call_to_16_regs_short( &context, 0 );
68 /***********************************************************************
69 * Inquire (KEYBOARD.1)
71 WORD WINAPI KEYBOARD_Inquire(LPKBINFO kbInfo)
73 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;
79 return sizeof(KBINFO);
82 /***********************************************************************
85 VOID WINAPI KEYBOARD_Enable( FARPROC16 proc, LPBYTE lpKeyState )
87 if (DefKeybEventProc) THUNK_Free( (FARPROC)DefKeybEventProc );
88 DefKeybEventProc = (LPKEYBD_EVENT_PROC)THUNK_Alloc( proc, (RELAY)KEYBOARD_CallKeybdEventProc );
89 pKeyStateTable = lpKeyState;
91 memset( lpKeyState, 0, 256 ); /* all states to false */
94 /***********************************************************************
95 * Disable (KEYBOARD.3)
97 VOID WINAPI KEYBOARD_Disable(VOID)
99 THUNK_Free( (FARPROC)DefKeybEventProc );
101 DefKeybEventProc = NULL;
102 pKeyStateTable = NULL;
106 /**********************************************************************
107 * SetSpeed (KEYBOARD.7)
109 WORD WINAPI SetSpeed16(WORD unused)
111 FIXME("(%04x): stub\n", unused);
115 /**********************************************************************
116 * ScreenSwitchEnable (KEYBOARD.100)
118 VOID WINAPI ScreenSwitchEnable16(WORD unused)
120 FIXME("(%04x): stub\n", unused);
123 /**********************************************************************
124 * OemKeyScan (KEYBOARD.128)
125 * OemKeyScan (USER32.@)
127 DWORD WINAPI OemKeyScan(WORD wOemChar)
129 TRACE("(%d)\n", wOemChar);
134 /**********************************************************************
135 * VkKeyScan (KEYBOARD.129)
137 WORD WINAPI VkKeyScan16(CHAR cChar)
139 return VkKeyScanA( cChar );
142 /******************************************************************************
143 * GetKeyboardType (KEYBOARD.130)
145 INT16 WINAPI GetKeyboardType16(INT16 nTypeFlag)
147 return GetKeyboardType( nTypeFlag );
150 /******************************************************************************
151 * MapVirtualKey (KEYBOARD.131)
153 * MapVirtualKey translates keycodes from one format to another
155 UINT16 WINAPI MapVirtualKey16(UINT16 wCode, UINT16 wMapType)
157 return MapVirtualKeyA(wCode,wMapType);
160 /****************************************************************************
161 * GetKBCodePage (KEYBOARD.132)
163 INT16 WINAPI GetKBCodePage16(void)
165 return GetKBCodePage();
168 /****************************************************************************
169 * GetKeyNameText (KEYBOARD.133)
171 INT16 WINAPI GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize)
173 return GetKeyNameTextA( lParam, lpBuffer, nSize );
176 /****************************************************************************
177 * ToAscii (KEYBOARD.4)
179 * The ToAscii function translates the specified virtual-key code and keyboard
180 * state to the corresponding Windows character or characters.
182 * If the specified key is a dead key, the return value is negative. Otherwise,
183 * it is one of the following values:
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.
191 * FIXME : should do the above (return 2 for non matching deadchar+char combinations)
194 INT16 WINAPI ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState,
195 LPVOID lpChar, UINT16 flags)
197 return ToAscii( virtKey, scanCode, lpKeyState, lpChar, flags );
200 /***********************************************************************
201 * MessageBeep (USER.104)
203 void WINAPI MessageBeep16( UINT16 i )
208 /***********************************************************************
209 * MessageBeep (USER32.@)
211 BOOL WINAPI MessageBeep( UINT i )
214 SystemParametersInfoA( SPI_GETBEEP, 0, &active, FALSE );
215 if (active) USER_Driver.pBeep();