1 |
dpavlin |
1 |
/* |
2 |
|
|
* PearPC |
3 |
|
|
* keyboard.cc |
4 |
|
|
* |
5 |
|
|
* Copyright (C) 2004 Stefan Weyergraf |
6 |
|
|
* Copyright (C) 2003,2004 Sebastian Biallas (sb@biallas.net) |
7 |
|
|
* |
8 |
|
|
* This program is free software; you can redistribute it and/or modify |
9 |
|
|
* it under the terms of the GNU General Public License version 2 as |
10 |
|
|
* published by the Free Software Foundation. |
11 |
|
|
* |
12 |
|
|
* This program is distributed in the hope that it will be useful, |
13 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 |
|
|
* GNU General Public License for more details. |
16 |
|
|
* |
17 |
|
|
* You should have received a copy of the GNU General Public License |
18 |
|
|
* along with this program; if not, write to the Free Software |
19 |
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 |
|
|
*/ |
21 |
|
|
|
22 |
|
|
#include "tools/snprintf.h" |
23 |
|
|
#include "keyboard.h" |
24 |
|
|
#include "display.h" |
25 |
|
|
|
26 |
|
|
SystemKeyboard *gKeyboard = NULL; |
27 |
|
|
|
28 |
|
|
static char *key_names[] = { |
29 |
|
|
"A","S","D","F","H","G","Z","X","C","V", |
30 |
|
|
NULL,"B","Q","W","E","R","Y","T","1","2", |
31 |
|
|
"3","4","6","5","=","9","7","-","8","0","]", |
32 |
|
|
"O","U","[","I","P","Return","L","J","'","K", |
33 |
|
|
";","\\",",","/","N","M",".","Tab","Space", |
34 |
|
|
"`", "Backspace",NULL,"Escape","Ctrl","Alt","Shift","Caps-Lock","Right-Alt","Left", |
35 |
|
|
"Right","Down","Up",NULL,NULL,"Keypad-.",NULL,"Keypad-*",NULL,"Keypad-+", |
36 |
|
|
NULL,"Numlock",NULL,NULL,NULL,"Keypad-/","Keypad-Enter",NULL,"Keypad--",NULL, |
37 |
|
|
NULL,NULL,"Keypad-0","Keypad-1","Keypad-2","Keypad-3","Keypad-4","Keypad-5","Keypad-6","Keypad-7", |
38 |
|
|
NULL,"Keypad-8","Keypad-9",NULL,NULL,NULL,"F5","F6","F7","F3", |
39 |
|
|
"F8","F9",NULL,"F11",NULL,"F13",NULL,"Scrolllock",NULL,"F10", |
40 |
|
|
NULL,"F12",NULL,"Pause","Insert","Home","Pageup","Delete","F4","End", |
41 |
|
|
"F2","Pagedown","F1", |
42 |
|
|
}; |
43 |
|
|
|
44 |
|
|
SystemKeyboard::SystemKeyboard() |
45 |
|
|
{ |
46 |
|
|
reset(); |
47 |
|
|
} |
48 |
|
|
|
49 |
|
|
bool SystemKeyboard::handleEvent(const SystemEvent &ev) |
50 |
|
|
{ |
51 |
|
|
if (ev.type != sysevKey) return false; |
52 |
|
|
if (ev.key.keycode == KEY_CONTROL) mCtrl = ev.key.pressed ? KEYCODE_CTRL : 0; |
53 |
|
|
if (ev.key.keycode == KEY_ALT) mLAlt = ev.key.pressed ? KEYCODE_LALT : 0; |
54 |
|
|
if (ev.key.keycode == KEY_ALTGR) mRAlt = ev.key.pressed ? KEYCODE_RALT : 0; |
55 |
|
|
if (ev.key.keycode == KEY_SHIFT) mShift = ev.key.pressed ? KEYCODE_SHIFT : 0; |
56 |
|
|
int keycode = ev.key.keycode | mCtrl | mRAlt | mLAlt | mShift; |
57 |
|
|
if (keycode == keyConfig.key_toggle_mouse_grab) { |
58 |
|
|
if (ev.key.pressed) gDisplay->setMouseGrab(!gDisplay->isMouseGrabbed()); |
59 |
|
|
return true; |
60 |
|
|
} else if (keycode == keyConfig.key_toggle_full_screen) { |
61 |
|
|
if (ev.key.pressed) gDisplay->setFullscreenMode(!gDisplay->mFullscreen); |
62 |
|
|
/* |
63 |
|
|
* Changing fullscreen/windowed mode confuses |
64 |
|
|
* some well-known OS (key release events are dropped). |
65 |
|
|
*/ |
66 |
|
|
reset(); |
67 |
|
|
return true; |
68 |
|
|
} else if (keycode == keyConfig.key_compose_dialog) { |
69 |
|
|
if (ev.key.pressed) gDisplay->composeKeyDialog(); |
70 |
|
|
return true; |
71 |
|
|
} else { |
72 |
|
|
return SystemDevice::handleEvent(ev); |
73 |
|
|
} |
74 |
|
|
} |
75 |
|
|
|
76 |
|
|
void SystemKeyboard::reset() |
77 |
|
|
{ |
78 |
|
|
mCtrl = false; |
79 |
|
|
mLAlt = false; |
80 |
|
|
mRAlt = false; |
81 |
|
|
mShift = false; |
82 |
|
|
} |
83 |
|
|
|
84 |
|
|
bool SystemKeyboard::convertKeycodeToString(String &result, int keycode) |
85 |
|
|
{ |
86 |
|
|
if (!key_names[keycode & 0xff]) return false; |
87 |
|
|
if (keycode & ~(0xff|KEYCODE_CTRL|KEYCODE_LALT|KEYCODE_RALT|KEYCODE_SHIFT)) return false; |
88 |
|
|
result = ""; |
89 |
|
|
if (keycode & KEYCODE_CTRL) { |
90 |
|
|
result += key_names[KEY_CONTROL]; |
91 |
|
|
result += "+"; |
92 |
|
|
} |
93 |
|
|
if (keycode & KEYCODE_LALT) { |
94 |
|
|
result += key_names[KEY_ALT]; |
95 |
|
|
result += "+"; |
96 |
|
|
} |
97 |
|
|
if (keycode & KEYCODE_RALT) { |
98 |
|
|
result += key_names[KEY_ALTGR]; |
99 |
|
|
result += "+"; |
100 |
|
|
} |
101 |
|
|
if (keycode & KEYCODE_SHIFT) { |
102 |
|
|
result += key_names[KEY_SHIFT]; |
103 |
|
|
result += "+"; |
104 |
|
|
} |
105 |
|
|
result += key_names[keycode & 0xff]; |
106 |
|
|
return true; |
107 |
|
|
} |
108 |
|
|
|
109 |
|
|
bool SystemKeyboard::convertStringToKeycode(int &keycode, const String &s) |
110 |
|
|
{ |
111 |
|
|
if (s == "none") { |
112 |
|
|
keycode = 0xff; |
113 |
|
|
return true; |
114 |
|
|
} |
115 |
|
|
String k = s; |
116 |
|
|
bool cont = true; |
117 |
|
|
keycode = 0; |
118 |
|
|
while (cont) { |
119 |
|
|
String key, rem; |
120 |
|
|
cont = k.leftSplit('+', key, rem); |
121 |
|
|
k = rem; |
122 |
|
|
|
123 |
|
|
int found = -1; |
124 |
|
|
for (uint i=0; i < (sizeof key_names / sizeof key_names[0]); i++) { |
125 |
|
|
if (key_names[i] && key == (String)key_names[i]) found = i; |
126 |
|
|
} |
127 |
|
|
switch (found) { |
128 |
|
|
case -1: |
129 |
|
|
ht_printf("%y not found\n", &key); |
130 |
|
|
return false; |
131 |
|
|
case KEY_CONTROL: |
132 |
|
|
if (keycode & KEYCODE_CTRL) return false; |
133 |
|
|
keycode |= KEYCODE_CTRL; |
134 |
|
|
break; |
135 |
|
|
case KEY_ALT: |
136 |
|
|
if (keycode & KEYCODE_LALT) return false; |
137 |
|
|
keycode |= KEYCODE_LALT; |
138 |
|
|
break; |
139 |
|
|
case KEY_ALTGR: |
140 |
|
|
if (keycode & KEYCODE_RALT) return false; |
141 |
|
|
keycode |= KEYCODE_RALT; |
142 |
|
|
break; |
143 |
|
|
case KEY_SHIFT: |
144 |
|
|
if (keycode & KEYCODE_SHIFT) return false; |
145 |
|
|
keycode |= KEYCODE_SHIFT; |
146 |
|
|
break; |
147 |
|
|
default: |
148 |
|
|
if (keycode & 0xff) return false; |
149 |
|
|
keycode |= found; |
150 |
|
|
} |
151 |
|
|
} |
152 |
|
|
return true; |
153 |
|
|
} |
154 |
|
|
|
155 |
|
|
/* FIXME: need proper keymaps */ |
156 |
|
|
static char lchrs[0x7f] = { |
157 |
|
|
'a','s','d','f','h','g','z','x','c','v', |
158 |
|
|
0,'b','q','w','e','r','y','t','1','2', |
159 |
|
|
'3','4','6','5','=','9','7','-','8','0',']', |
160 |
|
|
'o','u','[','i','p',13,'l','j','\'','k', |
161 |
|
|
';','\\',',','/','n','m','.',9,32, |
162 |
|
|
'`',8,0,27,0,0,0,0,0,0, |
163 |
|
|
0,0,0,0,0,'.',0,'*',0,'+', |
164 |
|
|
0,0,0,0,0,'/',13,0,'-',0, |
165 |
|
|
0,0,'0','1','2','3','4','5','6','7', |
166 |
|
|
0,'8','9',0,0,0,0,0,0,0, |
167 |
|
|
0,0,0,0,0,0,0,0,0,0, |
168 |
|
|
0,0,0,0,0,0,0,0,0,0, |
169 |
|
|
0,0,0, |
170 |
|
|
}; |
171 |
|
|
|
172 |
|
|
static char uchrs[0x7f] = { |
173 |
|
|
'A','S','D','F','H','G','Z','X','C','V', |
174 |
|
|
0,'B','Q','W','E','R','Y','T','!','@', |
175 |
|
|
'#','$','^','%','+','(','&','_','*',')','}', |
176 |
|
|
'O','U','{','I','P',13,'L','J','"','K', |
177 |
|
|
':','|','<','?','N','M','>',9,32, |
178 |
|
|
'~',8,0,27,0,0,0,0,0,0, |
179 |
|
|
0,0,0,0,0,'.',0,'*',0,'+', |
180 |
|
|
0,0,0,0,0,'/',13,0,'-',0, |
181 |
|
|
0,0,'0','1','2','3','4','5','6','7', |
182 |
|
|
0,'8','9',0,0,0,0,0,0,0, |
183 |
|
|
0,0,0,0,0,0,0,0,0,0, |
184 |
|
|
0,0,0,0,0,0,0,0,0,0, |
185 |
|
|
0,0,0, |
186 |
|
|
}; |
187 |
|
|
|
188 |
|
|
bool SystemKeyboard::adbKeyToAscii(char &chr, int adbcode) |
189 |
|
|
{ |
190 |
|
|
adbcode &= 0x7f; |
191 |
|
|
|
192 |
|
|
if (mShift) |
193 |
|
|
chr = uchrs[adbcode]; |
194 |
|
|
else |
195 |
|
|
chr = lchrs[adbcode]; |
196 |
|
|
|
197 |
|
|
return chr != 0; |
198 |
|
|
} |
199 |
|
|
|
200 |
|
|
bool SystemKeyboard::setKeyConfig(KeyboardCharacteristics keycon) |
201 |
|
|
{ |
202 |
|
|
keyConfig=keycon; |
203 |
|
|
return true; |
204 |
|
|
} |
205 |
|
|
|
206 |
|
|
KeyboardCharacteristics &SystemKeyboard::getKeyConfig() |
207 |
|
|
{ |
208 |
|
|
return keyConfig; |
209 |
|
|
} |