1 /*************************************************************************/
2 /*  key_mapping_haiku.cpp                                                */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 #include <InterfaceDefs.h>
31 
32 #include "key_mapping_haiku.h"
33 #include "os/keyboard.h"
34 
35 struct _HaikuTranslatePair {
36 	unsigned int keysym;
37 	int32 keycode;
38 };
39 
40 static _HaikuTranslatePair _mod_to_keycode[] = {
41 	{ KEY_SHIFT, B_SHIFT_KEY },
42 	{ KEY_ALT, B_COMMAND_KEY },
43 	{ KEY_CONTROL, B_CONTROL_KEY },
44 	{ KEY_CAPSLOCK, B_CAPS_LOCK },
45 	{ KEY_SCROLLLOCK, B_SCROLL_LOCK },
46 	{ KEY_NUMLOCK, B_NUM_LOCK },
47 	{ KEY_SUPER_L, B_OPTION_KEY },
48 	{ KEY_MENU, B_MENU_KEY },
49 	{ KEY_SHIFT, B_LEFT_SHIFT_KEY },
50 	{ KEY_SHIFT, B_RIGHT_SHIFT_KEY },
51 	{ KEY_ALT, B_LEFT_COMMAND_KEY },
52 	{ KEY_ALT, B_RIGHT_COMMAND_KEY },
53 	{ KEY_CONTROL, B_LEFT_CONTROL_KEY },
54 	{ KEY_CONTROL, B_RIGHT_CONTROL_KEY },
55 	{ KEY_SUPER_L, B_LEFT_OPTION_KEY },
56 	{ KEY_SUPER_R, B_RIGHT_OPTION_KEY },
57 	{ KEY_UNKNOWN, 0 }
58 };
59 
60 static _HaikuTranslatePair _fn_to_keycode[] = {
61 	{ KEY_F1, B_F1_KEY },
62 	{ KEY_F2, B_F2_KEY },
63 	{ KEY_F3, B_F3_KEY },
64 	{ KEY_F4, B_F4_KEY },
65 	{ KEY_F5, B_F5_KEY },
66 	{ KEY_F6, B_F6_KEY },
67 	{ KEY_F7, B_F7_KEY },
68 	{ KEY_F8, B_F8_KEY },
69 	{ KEY_F9, B_F9_KEY },
70 	{ KEY_F10, B_F10_KEY },
71 	{ KEY_F11, B_F11_KEY },
72 	{ KEY_F12, B_F12_KEY },
73 	//{ KEY_F13, ? },
74 	//{ KEY_F14, ? },
75 	//{ KEY_F15, ? },
76 	//{ KEY_F16, ? },
77 	{ KEY_PRINT, B_PRINT_KEY },
78 	{ KEY_SCROLLLOCK, B_SCROLL_KEY },
79 	{ KEY_PAUSE, B_PAUSE_KEY },
80 	{ KEY_UNKNOWN, 0 }
81 };
82 
83 static _HaikuTranslatePair _hb_to_keycode[] = {
84 	{ KEY_BACKSPACE, B_BACKSPACE },
85 	{ KEY_TAB, B_TAB },
86 	{ KEY_RETURN, B_RETURN },
87 	{ KEY_CAPSLOCK, B_CAPS_LOCK },
88 	{ KEY_ESCAPE, B_ESCAPE },
89 	{ KEY_SPACE, B_SPACE },
90 	{ KEY_PAGEUP, B_PAGE_UP },
91 	{ KEY_PAGEDOWN, B_PAGE_DOWN },
92 	{ KEY_END, B_END },
93 	{ KEY_HOME, B_HOME },
94 	{ KEY_LEFT, B_LEFT_ARROW },
95 	{ KEY_UP, B_UP_ARROW },
96 	{ KEY_RIGHT, B_RIGHT_ARROW },
97 	{ KEY_DOWN, B_DOWN_ARROW },
98 	{ KEY_PRINT, B_PRINT_KEY },
99 	{ KEY_INSERT, B_INSERT },
100 	{ KEY_DELETE, B_DELETE },
101 	// { KEY_HELP, ??? },
102 
103 	{ KEY_0, (0x30) },
104 	{ KEY_1, (0x31) },
105 	{ KEY_2, (0x32) },
106 	{ KEY_3, (0x33) },
107 	{ KEY_4, (0x34) },
108 	{ KEY_5, (0x35) },
109 	{ KEY_6, (0x36) },
110 	{ KEY_7, (0x37) },
111 	{ KEY_8, (0x38) },
112 	{ KEY_9, (0x39) },
113 	{ KEY_A, (0x61) },
114 	{ KEY_B, (0x62) },
115 	{ KEY_C, (0x63) },
116 	{ KEY_D, (0x64) },
117 	{ KEY_E, (0x65) },
118 	{ KEY_F, (0x66) },
119 	{ KEY_G, (0x67) },
120 	{ KEY_H, (0x68) },
121 	{ KEY_I, (0x69) },
122 	{ KEY_J, (0x6A) },
123 	{ KEY_K, (0x6B) },
124 	{ KEY_L, (0x6C) },
125 	{ KEY_M, (0x6D) },
126 	{ KEY_N, (0x6E) },
127 	{ KEY_O, (0x6F) },
128 	{ KEY_P, (0x70) },
129 	{ KEY_Q, (0x71) },
130 	{ KEY_R, (0x72) },
131 	{ KEY_S, (0x73) },
132 	{ KEY_T, (0x74) },
133 	{ KEY_U, (0x75) },
134 	{ KEY_V, (0x76) },
135 	{ KEY_W, (0x77) },
136 	{ KEY_X, (0x78) },
137 	{ KEY_Y, (0x79) },
138 	{ KEY_Z, (0x7A) },
139 
140 	/*
141 { KEY_PLAY, VK_PLAY},// (0xFA)
142 { KEY_STANDBY,VK_SLEEP },//(0x5F)
143 { KEY_BACK,VK_BROWSER_BACK},// (0xA6)
144 { KEY_FORWARD,VK_BROWSER_FORWARD},// (0xA7)
145 { KEY_REFRESH,VK_BROWSER_REFRESH},// (0xA8)
146 { KEY_STOP,VK_BROWSER_STOP},// (0xA9)
147 { KEY_SEARCH,VK_BROWSER_SEARCH},// (0xAA)
148 { KEY_FAVORITES, VK_BROWSER_FAVORITES},// (0xAB)
149 { KEY_HOMEPAGE,VK_BROWSER_HOME},// (0xAC)
150 { KEY_VOLUMEMUTE,VK_VOLUME_MUTE},// (0xAD)
151 { KEY_VOLUMEDOWN,VK_VOLUME_DOWN},// (0xAE)
152 { KEY_VOLUMEUP,VK_VOLUME_UP},// (0xAF)
153 { KEY_MEDIANEXT,VK_MEDIA_NEXT_TRACK},// (0xB0)
154 { KEY_MEDIAPREVIOUS,VK_MEDIA_PREV_TRACK},// (0xB1)
155 { KEY_MEDIASTOP,VK_MEDIA_STOP},// (0xB2)
156 { KEY_LAUNCHMAIL, VK_LAUNCH_MAIL},// (0xB4)
157 { KEY_LAUNCHMEDIA,VK_LAUNCH_MEDIA_SELECT},// (0xB5)
158 { KEY_LAUNCH0,VK_LAUNCH_APP1},// (0xB6)
159 { KEY_LAUNCH1,VK_LAUNCH_APP2},// (0xB7)
160 */
161 
162 	{ KEY_SEMICOLON, 0x3B },
163 	{ KEY_EQUAL, 0x3D },
164 	{ KEY_COLON, 0x2C },
165 	{ KEY_MINUS, 0x2D },
166 	{ KEY_PERIOD, 0x2E },
167 	{ KEY_SLASH, 0x2F },
168 	{ KEY_KP_MULTIPLY, 0x2A },
169 	{ KEY_KP_ADD, 0x2B },
170 
171 	{ KEY_QUOTELEFT, 0x60 },
172 	{ KEY_BRACKETLEFT, 0x5B },
173 	{ KEY_BACKSLASH, 0x5C },
174 	{ KEY_BRACKETRIGHT, 0x5D },
175 	{ KEY_APOSTROPHE, 0x27 },
176 
177 	{ KEY_UNKNOWN, 0 }
178 };
179 
get_keysym(int32 raw_char,int32 key)180 unsigned int KeyMappingHaiku::get_keysym(int32 raw_char, int32 key) {
181 	if (raw_char == B_INSERT && key == 0x64) {
182 		return KEY_KP_0;
183 	}
184 	if (raw_char == B_END && key == 0x58) {
185 		return KEY_KP_1;
186 	}
187 	if (raw_char == B_DOWN_ARROW && key == 0x59) {
188 		return KEY_KP_2;
189 	}
190 	if (raw_char == B_PAGE_DOWN && key == 0x5A) {
191 		return KEY_KP_3;
192 	}
193 	if (raw_char == B_LEFT_ARROW && key == 0x48) {
194 		return KEY_KP_4;
195 	}
196 	if (raw_char == 0x35 && key == 0x49) {
197 		return KEY_KP_5;
198 	}
199 	if (raw_char == B_RIGHT_ARROW && key == 0x4A) {
200 		return KEY_KP_6;
201 	}
202 	if (raw_char == B_HOME && key == 0x37) {
203 		return KEY_KP_7;
204 	}
205 	if (raw_char == B_UP_ARROW && key == 0x38) {
206 		return KEY_KP_8;
207 	}
208 	if (raw_char == B_PAGE_UP && key == 0x39) {
209 		return KEY_KP_9;
210 	}
211 	if (raw_char == 0x2F && key == 0x23) {
212 		return KEY_KP_DIVIDE;
213 	}
214 	if (raw_char == 0x2D && key == 0x25) {
215 		return KEY_KP_SUBTRACT;
216 	}
217 	if (raw_char == B_DELETE && key == 0x65) {
218 		return KEY_KP_PERIOD;
219 	}
220 
221 	if (raw_char == 0x10) {
222 		for (int i = 0; _fn_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
223 			if (_fn_to_keycode[i].keycode == key) {
224 				return _fn_to_keycode[i].keysym;
225 			}
226 		}
227 
228 		return KEY_UNKNOWN;
229 	}
230 
231 	for (int i = 0; _hb_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
232 		if (_hb_to_keycode[i].keycode == raw_char) {
233 			return _hb_to_keycode[i].keysym;
234 		}
235 	}
236 
237 	return KEY_UNKNOWN;
238 }
239 
get_modifier_keysym(int32 key)240 unsigned int KeyMappingHaiku::get_modifier_keysym(int32 key) {
241 	for (int i = 0; _mod_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
242 		if ((_mod_to_keycode[i].keycode & key) != 0) {
243 			return _mod_to_keycode[i].keysym;
244 		}
245 	}
246 
247 	return KEY_UNKNOWN;
248 }
249