2 ** Copyright 2002, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
8 using namespace os::gui
;
10 #include "InputServer.h"
11 #include "KeyboardDevice.h"
13 #include <newos/key_event.h>
16 const char unshifted_keymap
[] = {
17 0, 0, 0, 0, 0, 0, 0, 0,
18 0, 0, 0, 0, 0, 0, 0, 0,
19 0, 0, 0, 0, 0, 0, 0, 0,
20 0, 0, 0, 0, 0, 0, 0, 0,
21 ' ', '!', '"', '#', '$', '%', '&', '\'',
22 '(', ')', '*', '+', ',', '-', '.', '/',
23 '0', '1', '2', '3', '4', '5', '6', '7',
24 '8', '9', ':', ';', '<', '=', '>', '?',
25 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
26 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
27 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
28 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
29 '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
30 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
31 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
32 'x', 'y', 'z', '{', '|', '}', '~', 0
35 const char caps_keymap
[] = {
36 0, 0, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0,
39 0, 0, 0, 0, 0, 0, 0, 0,
40 ' ', '!', '"', '#', '$', '%', '&', '\'',
41 '(', ')', '*', '+', ',', '-', '.', '/',
42 '0', '1', '2', '3', '4', '5', '6', '7',
43 '8', '9', ':', ';', '<', '=', '>', '?',
44 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
45 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
46 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
47 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
48 '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
49 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
50 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
51 'X', 'Y', 'Z', '{', '|', '}', '~', 0
54 const char shifted_keymap
[] = {
55 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0,
57 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 0, 0, 0, 0, 0, 0,
59 ' ', '!', '"', '#', '$', '%', '&', '"',
60 '(', ')', '*', '+', '<', '_', '>', '?',
61 ')', '!', '@', '#', '$', '%', '^', '&',
62 '*', '(', ':', ':', '<', '+', '>', '?',
63 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
64 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
65 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
66 'X', 'Y', 'Z', '{', '|', '}', '^', '_',
67 '~', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
68 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
69 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
70 'X', 'Y', 'Z', '{', '|', '}', '~', 0
73 const char shifted_caps_keymap
[] = {
74 0, 0, 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0, 0, 0,
78 ' ', '!', '"', '#', '$', '%', '&', '"',
79 '(', ')', '*', '+', '<', '_', '>', '?',
80 ')', '!', '@', '#', '$', '%', '^', '&',
81 '*', '(', ':', ':', '<', '+', '>', '?',
82 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
83 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
84 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
85 'X', 'Y', 'Z', '{', '|', '}', '^', '_',
86 '~', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
87 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
88 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
89 'x', 'y', 'z', '{', '|', '}', '~', 0
93 int process_key_events(_key_event
&kevent
, Event
&event
)
95 static bool shift
= false;
96 static bool caps
= false;
97 static bool ctrl
= false;
98 static bool alt
= false;
99 static bool win
= false;
100 static bool menu
= false;
103 // deal with the common case first
104 if(kevent
.keycode
< KEY_NONE
) {
109 keymap
= shifted_caps_keymap
;
111 keymap
= shifted_keymap
;
114 keymap
= caps_keymap
;
116 keymap
= unshifted_keymap
;
119 c
= keymap
[kevent
.keycode
];
126 event
.key
= kevent
.keycode
; /* let the target figure this out */
127 switch(kevent
.keycode
) {
133 if(kevent
.modifiers
& KEY_MODIFIER_DOWN
)
140 if(kevent
.modifiers
& KEY_MODIFIER_DOWN
)
147 if(kevent
.modifiers
& KEY_MODIFIER_DOWN
)
154 if(kevent
.modifiers
& KEY_MODIFIER_DOWN
)
160 if(kevent
.modifiers
& KEY_MODIFIER_DOWN
)
168 event
.what
= (kevent
.modifiers
& KEY_MODIFIER_DOWN
) ? EVT_KEY_DOWN
: EVT_KEY_UP
;
169 event
.modifiers
= (kevent
.modifiers
& KEY_MODIFIER_DOWN
) ? EVT_MOD_KEYDOWN
: EVT_MOD_KEYUP
;
170 event
.modifiers
|= shift
? EVT_MOD_SHIFT
: 0;
171 event
.modifiers
|= ctrl
? EVT_MOD_CTRL
: 0;
172 event
.modifiers
|= alt
? EVT_MOD_ALT
: 0;
173 event
.modifiers
|= win
? EVT_MOD_WIN
: 0;
174 event
.modifiers
|= menu
? EVT_MOD_MENU
: 0;
178 KeyboardDevice::KeyboardDevice(int fd
, InputServer
*srv
)
179 : InputDevice(fd
, srv
),
185 KeyboardDevice::~KeyboardDevice()
189 int KeyboardDevice::_Run()
196 len
= read(mFd
, &kevent
, sizeof(kevent
));
200 if(process_key_events(kevent
, event
) < 0)
203 mSrv
->PostEvent(event
);