Release 960506
[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     INT retval;
21
22     switch(keycode) {
23      case VK_LBUTTON:
24         return MouseButtonsStates[0];
25      case VK_MBUTTON:
26         return MouseButtonsStates[1];
27      case VK_RBUTTON:
28         return MouseButtonsStates[2];
29      default:
30         retval = ( (INT)(KeyStateTable[keycode] & 0x80) << 8 ) |
31                    (INT)(KeyStateTable[keycode] & 0x01);
32     }
33
34     return retval;
35 }
36
37 /**********************************************************************
38  *              GetKeyboardState                        [USER.222]
39  */
40 void GetKeyboardState(BYTE *lpKeyState)
41 {
42     if (lpKeyState != NULL) {
43         KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0] >> 8;
44         KeyStateTable[VK_MBUTTON] = MouseButtonsStates[1] >> 8;
45         KeyStateTable[VK_RBUTTON] = MouseButtonsStates[2] >> 8;
46         memcpy(lpKeyState, KeyStateTable, 256);
47     }
48 }
49
50 /**********************************************************************
51  *      SetKeyboardState            [USER.223]
52  */
53 void SetKeyboardState(BYTE *lpKeyState)
54 {
55     if (lpKeyState != NULL) {
56         memcpy(KeyStateTable, lpKeyState, 256);
57         MouseButtonsStates[0] = KeyStateTable[VK_LBUTTON]? 0x8000: 0;
58         MouseButtonsStates[1] = KeyStateTable[VK_MBUTTON]? 0x8000: 0;
59         MouseButtonsStates[2] = KeyStateTable[VK_RBUTTON]? 0x8000: 0;
60     }
61 }
62
63 /**********************************************************************
64  *            GetAsyncKeyState        (USER.249)
65  *
66  *      Determine if a key is or was pressed.  retval has high-order 
67  * byte set to 1 if currently pressed, low-order byte 1 if key has
68  * been pressed.
69  *
70  *      This uses the variable AsyncMouseButtonsStates and
71  * AsyncKeyStateTable (set in event.c) which have the mouse button
72  * number or key number (whichever is applicable) set to true if the
73  * mouse or key had been depressed since the last call to 
74  * GetAsyncKeyState.
75  */
76 int GetAsyncKeyState(int nKey)
77 {
78     short retval;       
79
80     switch (nKey) {
81      case VK_LBUTTON:
82         retval = AsyncMouseButtonsStates[0] | 
83         MouseButtonsStates[0]? 0x0001: 0;
84         break;
85      case VK_MBUTTON:
86         retval = AsyncMouseButtonsStates[1] |
87         MouseButtonsStates[1]? 0x0001: 0;
88         break;
89      case VK_RBUTTON:
90         retval = AsyncMouseButtonsStates[2] |
91         MouseButtonsStates[2]? 0x0001: 0;
92         break;
93      default:
94         retval = AsyncKeyStateTable[nKey] | 
95         (KeyStateTable[nKey] << 8);
96         break;
97     }
98
99     memset( AsyncMouseButtonsStates, 0, 3 );  /* all states to false */
100     memset( AsyncKeyStateTable, 0, 256 );
101
102     return retval;
103 }
104