Release 960131
[wine] / windows / keyboard.c
1 /*
2  * Keyboard related functions
3  *
4  * Copyright 1993 Bob Amstadt
5  */
6 #include <string.h>
7 #include "win.h"
8 #include "windows.h"
9
10 extern BOOL MouseButtonsStates[3];
11 extern BOOL AsyncMouseButtonsStates[3];
12 extern BYTE KeyStateTable[256];
13 extern BYTE AsyncKeyStateTable[256];
14
15 /**********************************************************************
16  *              GetKeyState                     [USER.106]
17  */
18 int GetKeyState(int keycode)
19 {
20     switch(keycode) {
21      case VK_LBUTTON:
22         return MouseButtonsStates[0];
23      case VK_MBUTTON:
24         return MouseButtonsStates[1];
25      case VK_RBUTTON:
26         return MouseButtonsStates[2];
27      default:
28         return KeyStateTable[keycode];
29     }
30 }
31
32 /**********************************************************************
33  *              GetKeyboardState                        [USER.222]
34  */
35 void GetKeyboardState(BYTE FAR *lpKeyState)
36 {
37     if (lpKeyState != NULL) {
38         KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0];
39         KeyStateTable[VK_MBUTTON] = MouseButtonsStates[1];
40         KeyStateTable[VK_RBUTTON] = MouseButtonsStates[2];
41         memcpy(lpKeyState, KeyStateTable, 256);
42     }
43 }
44
45 /**********************************************************************
46  *      SetKeyboardState            [USER.223]
47  */
48 void SetKeyboardState(BYTE FAR *lpKeyState)
49 {
50     if (lpKeyState != NULL) {
51         memcpy(KeyStateTable, lpKeyState, 256);
52         MouseButtonsStates[0] = KeyStateTable[VK_LBUTTON];
53         MouseButtonsStates[1] = KeyStateTable[VK_MBUTTON];
54         MouseButtonsStates[2] = KeyStateTable[VK_RBUTTON];
55     }
56 }
57
58 /**********************************************************************
59  *            GetAsyncKeyState        (USER.249)
60  *
61  *      Determine if a key is or was pressed.  retval has high-order 
62  * byte set to 1 if currently pressed, low-order byte 1 if key has
63  * been pressed.
64  *
65  *      This uses the variable AsyncMouseButtonsStates and
66  * AsyncKeyStateTable (set in event.c) which have the mouse button
67  * number or key number (whichever is applicable) set to true if the
68  * mouse or key had been depressed since the last call to 
69  * GetAsyncKeyState.
70  */
71 int GetAsyncKeyState(int nKey)
72 {
73     short retval;       
74
75     switch (nKey) {
76      case VK_LBUTTON:
77         retval = AsyncMouseButtonsStates[0] | 
78         (MouseButtonsStates[0] << 8);
79         break;
80      case VK_MBUTTON:
81         retval = AsyncMouseButtonsStates[1] |
82         (MouseButtonsStates[1] << 8);
83         break;
84      case VK_RBUTTON:
85         retval = AsyncMouseButtonsStates[2] |
86         (MouseButtonsStates[2] << 8);
87         break;
88      default:
89         retval = AsyncKeyStateTable[nKey] | 
90         (KeyStateTable[nKey] << 8);
91         break;
92     }
93
94     memset( AsyncMouseButtonsStates, 0, 3 );  /* all states to false */
95     memset( AsyncKeyStateTable, 0, 256 );
96
97     return retval;
98 }
99