More code moved to the X11 driver (bitmap and palette and misc).
[wine] / windows / keyboard.c
1 /*
2  * KEYBOARD driver
3  *
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
9  *
10  */
11
12 #include <stdlib.h>
13 #include <string.h>
14 #include <ctype.h>
15
16 #include "winuser.h"
17 #include "wine/keyboard16.h"
18 #include "win.h"
19 #include "heap.h"
20 #include "keyboard.h"
21 #include "message.h"
22 #include "debug.h"
23 #include "debugtools.h"
24 #include "struct32.h"
25 #include "winerror.h"
26
27 /**********************************************************************/
28
29 KEYBOARD_DRIVER *KEYBOARD_Driver = NULL;
30
31 static LPKEYBD_EVENT_PROC DefKeybEventProc = NULL;
32 LPBYTE pKeyStateTable = NULL;
33
34 /***********************************************************************
35  *           KEYBOARD_Inquire                   (KEYBOARD.1)
36  */
37 WORD WINAPI KEYBOARD_Inquire(LPKBINFO kbInfo) 
38 {
39   kbInfo->Begin_First_Range = 0;
40   kbInfo->End_First_Range = 0;
41   kbInfo->Begin_Second_Range = 0;
42   kbInfo->End_Second_Range = 0;
43   kbInfo->StateSize = 16; 
44   
45   return sizeof(KBINFO);
46 }
47
48 /***********************************************************************
49  *           KEYBOARD_Enable                    (KEYBOARD.2)
50  */
51 VOID WINAPI KEYBOARD_Enable( LPKEYBD_EVENT_PROC lpKeybEventProc, 
52                              LPBYTE lpKeyState )
53 {
54   static BOOL initDone = FALSE;
55   
56   DefKeybEventProc = lpKeybEventProc;
57   pKeyStateTable = lpKeyState;
58   
59   /* all states to false */
60   memset( lpKeyState, 0, sizeof(lpKeyState) );
61   
62   if (!initDone) KEYBOARD_Driver->pInit();
63   initDone = TRUE;
64 }
65
66 /***********************************************************************
67  *           KEYBOARD_Disable                   (KEYBOARD.3)
68  */
69 VOID WINAPI KEYBOARD_Disable(VOID)
70 {
71   DefKeybEventProc = NULL;
72   pKeyStateTable = NULL;
73 }
74
75 /***********************************************************************
76  *           KEYBOARD_SendEvent
77  */
78 void KEYBOARD_SendEvent( BYTE bVk, BYTE bScan, DWORD dwFlags,
79                          DWORD posX, DWORD posY, DWORD time )
80 {
81   WINE_KEYBDEVENT wke;
82   
83   if ( !DefKeybEventProc ) return;
84   
85   TRACE( event, "(%d,%d,%04lX)\n", bVk, bScan, dwFlags );
86   
87   wke.magic = WINE_KEYBDEVENT_MAGIC;
88   wke.posX  = posX;
89   wke.posY  = posY;
90   wke.time  = time;
91   
92   DefKeybEventProc( bVk, bScan, dwFlags, (DWORD)&wke );
93 }
94
95 /**********************************************************************
96  *           ScreenSwitchEnable      (KEYBOARD.100)
97  */
98 VOID WINAPI ScreenSwitchEnable16(WORD unused)
99 {
100   FIXME(keyboard,"(%04x): stub\n",unused);
101 }
102
103 /**********************************************************************
104  *           OemKeyScan      (KEYBOARD.128)(USER32.401)
105  */
106 DWORD WINAPI OemKeyScan(WORD wOemChar)
107 {
108   TRACE(keyboard,"*OemKeyScan (%d)\n",wOemChar);
109
110   return wOemChar;
111 }
112
113 /**********************************************************************
114  *      VkKeyScan                       [KEYBOARD.129]
115  */
116 /* VkKeyScan translates an ANSI character to a virtual-key and shift code
117  * for the current keyboard.
118  * high-order byte yields :
119  *      0       Unshifted
120  *      1       Shift
121  *      2       Ctrl
122  *      3-5     Shift-key combinations that are not used for characters
123  *      6       Ctrl-Alt
124  *      7       Ctrl-Alt-Shift
125  *      I.e. :  Shift = 1, Ctrl = 2, Alt = 4.
126  * FIXME : works ok except for dead chars :
127  * VkKeyScan '^'(0x5e, 94) ... got keycode 00 ... returning 00
128  * VkKeyScan '`'(0x60, 96) ... got keycode 00 ... returning 00
129  */
130
131 WORD WINAPI VkKeyScan16(CHAR cChar)
132 {
133   return KEYBOARD_Driver->pVkKeyScan(cChar);
134 }
135
136 /******************************************************************************
137  *      GetKeyboardType16      (KEYBOARD.130)
138  */
139 INT16 WINAPI GetKeyboardType16(INT16 nTypeFlag)
140 {
141   TRACE(keyboard,"(%d)\n",nTypeFlag);
142   switch(nTypeFlag)
143     {
144     case 0:      /* Keyboard type */
145       return 4;    /* AT-101 */
146       break;
147     case 1:      /* Keyboard Subtype */
148       return 0;    /* There are no defined subtypes */
149       break;
150     case 2:      /* Number of F-keys */
151       return 12;   /* We're doing an 101 for now, so return 12 F-keys */
152       break;
153     default:     
154       WARN(keyboard, "Unknown type\n");
155       return 0;    /* The book says 0 here, so 0 */
156     }
157 }
158
159 /******************************************************************************
160  *      MapVirtualKey16      (KEYBOARD.131)
161  *
162  * MapVirtualKey translates keycodes from one format to another
163  */
164 UINT16 WINAPI MapVirtualKey16(UINT16 wCode, UINT16 wMapType)
165 {
166   return KEYBOARD_Driver->pMapVirtualKey(wCode,wMapType);
167 }
168
169 /****************************************************************************
170  *      GetKBCodePage16   (KEYBOARD.132)
171  */
172 INT16 WINAPI GetKBCodePage16(void)
173 {
174   TRACE(keyboard,"(void)\n");
175   return 850;
176 }
177
178 /****************************************************************************
179  *      GetKeyNameText16   (KEYBOARD.133)
180  */
181 INT16 WINAPI GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize)
182 {
183   return KEYBOARD_Driver->pGetKeyNameText(lParam, lpBuffer, nSize);
184 }
185
186 /****************************************************************************
187  *      ToAscii   (KEYBOARD.4)
188  *
189  * The ToAscii function translates the specified virtual-key code and keyboard
190  * state to the corresponding Windows character or characters.
191  *
192  * If the specified key is a dead key, the return value is negative. Otherwise,
193  * it is one of the following values:
194  * Value        Meaning
195  * 0    The specified virtual key has no translation for the current state of the keyboard.
196  * 1    One Windows character was copied to the buffer.
197  * 2    Two characters were copied to the buffer. This usually happens when a
198  *      dead-key character (accent or diacritic) stored in the keyboard layout cannot
199  *      be composed with the specified virtual key to form a single character.
200  *
201  * FIXME : should do the above (return 2 for non matching deadchar+char combinations)
202  *
203  */
204 INT16 WINAPI ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState, 
205                        LPVOID lpChar, UINT16 flags) 
206 {
207     return KEYBOARD_Driver->pToAscii(
208         virtKey, scanCode, lpKeyState, lpChar, flags
209     );
210 }
211
212 /***********************************************************************
213  *              KEYBOARD_GetBeepActive
214  */
215 BOOL KEYBOARD_GetBeepActive()
216 {
217   return KEYBOARD_Driver->pGetBeepActive();
218 }
219
220 /***********************************************************************
221  *              KEYBOARD_SetBeepActive
222  */
223 void KEYBOARD_SetBeepActive(BOOL bActivate)
224 {
225   KEYBOARD_Driver->pSetBeepActive(bActivate);
226 }
227
228 /***********************************************************************
229  *              KEYBOARD_Beep
230  */
231 void KEYBOARD_Beep(void)
232 {
233   KEYBOARD_Driver->pBeep();
234 }
235