key_mapping_haiku.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. #include "core/os/keyboard.h"
  32. #include "key_mapping_haiku.h"
  33. struct _HaikuTranslatePair {
  34. unsigned int keysym;
  35. int32 keycode;
  36. };
  37. static _HaikuTranslatePair _mod_to_keycode[] = {
  38. { KEY_SHIFT, B_SHIFT_KEY },
  39. { KEY_ALT, B_COMMAND_KEY },
  40. { KEY_CONTROL, B_CONTROL_KEY },
  41. { KEY_CAPSLOCK, B_CAPS_LOCK },
  42. { KEY_SCROLLLOCK, B_SCROLL_LOCK },
  43. { KEY_NUMLOCK, B_NUM_LOCK },
  44. { KEY_SUPER_L, B_OPTION_KEY },
  45. { KEY_MENU, B_MENU_KEY },
  46. { KEY_SHIFT, B_LEFT_SHIFT_KEY },
  47. { KEY_SHIFT, B_RIGHT_SHIFT_KEY },
  48. { KEY_ALT, B_LEFT_COMMAND_KEY },
  49. { KEY_ALT, B_RIGHT_COMMAND_KEY },
  50. { KEY_CONTROL, B_LEFT_CONTROL_KEY },
  51. { KEY_CONTROL, B_RIGHT_CONTROL_KEY },
  52. { KEY_SUPER_L, B_LEFT_OPTION_KEY },
  53. { KEY_SUPER_R, B_RIGHT_OPTION_KEY },
  54. { KEY_UNKNOWN, 0 }
  55. };
  56. static _HaikuTranslatePair _fn_to_keycode[] = {
  57. { KEY_F1, B_F1_KEY },
  58. { KEY_F2, B_F2_KEY },
  59. { KEY_F3, B_F3_KEY },
  60. { KEY_F4, B_F4_KEY },
  61. { KEY_F5, B_F5_KEY },
  62. { KEY_F6, B_F6_KEY },
  63. { KEY_F7, B_F7_KEY },
  64. { KEY_F8, B_F8_KEY },
  65. { KEY_F9, B_F9_KEY },
  66. { KEY_F10, B_F10_KEY },
  67. { KEY_F11, B_F11_KEY },
  68. { KEY_F12, B_F12_KEY },
  69. //{ KEY_F13, ? },
  70. //{ KEY_F14, ? },
  71. //{ KEY_F15, ? },
  72. //{ KEY_F16, ? },
  73. { KEY_PRINT, B_PRINT_KEY },
  74. { KEY_SCROLLLOCK, B_SCROLL_KEY },
  75. { KEY_PAUSE, B_PAUSE_KEY },
  76. { KEY_UNKNOWN, 0 }
  77. };
  78. static _HaikuTranslatePair _hb_to_keycode[] = {
  79. { KEY_BACKSPACE, B_BACKSPACE },
  80. { KEY_TAB, B_TAB },
  81. { KEY_ENTER, B_RETURN },
  82. { KEY_CAPSLOCK, B_CAPS_LOCK },
  83. { KEY_ESCAPE, B_ESCAPE },
  84. { KEY_SPACE, B_SPACE },
  85. { KEY_PAGEUP, B_PAGE_UP },
  86. { KEY_PAGEDOWN, B_PAGE_DOWN },
  87. { KEY_END, B_END },
  88. { KEY_HOME, B_HOME },
  89. { KEY_LEFT, B_LEFT_ARROW },
  90. { KEY_UP, B_UP_ARROW },
  91. { KEY_RIGHT, B_RIGHT_ARROW },
  92. { KEY_DOWN, B_DOWN_ARROW },
  93. { KEY_PRINT, B_PRINT_KEY },
  94. { KEY_INSERT, B_INSERT },
  95. { KEY_DELETE, B_DELETE },
  96. // { KEY_HELP, ??? },
  97. { KEY_0, (0x30) },
  98. { KEY_1, (0x31) },
  99. { KEY_2, (0x32) },
  100. { KEY_3, (0x33) },
  101. { KEY_4, (0x34) },
  102. { KEY_5, (0x35) },
  103. { KEY_6, (0x36) },
  104. { KEY_7, (0x37) },
  105. { KEY_8, (0x38) },
  106. { KEY_9, (0x39) },
  107. { KEY_A, (0x61) },
  108. { KEY_B, (0x62) },
  109. { KEY_C, (0x63) },
  110. { KEY_D, (0x64) },
  111. { KEY_E, (0x65) },
  112. { KEY_F, (0x66) },
  113. { KEY_G, (0x67) },
  114. { KEY_H, (0x68) },
  115. { KEY_I, (0x69) },
  116. { KEY_J, (0x6A) },
  117. { KEY_K, (0x6B) },
  118. { KEY_L, (0x6C) },
  119. { KEY_M, (0x6D) },
  120. { KEY_N, (0x6E) },
  121. { KEY_O, (0x6F) },
  122. { KEY_P, (0x70) },
  123. { KEY_Q, (0x71) },
  124. { KEY_R, (0x72) },
  125. { KEY_S, (0x73) },
  126. { KEY_T, (0x74) },
  127. { KEY_U, (0x75) },
  128. { KEY_V, (0x76) },
  129. { KEY_W, (0x77) },
  130. { KEY_X, (0x78) },
  131. { KEY_Y, (0x79) },
  132. { KEY_Z, (0x7A) },
  133. /*
  134. { KEY_PLAY, VK_PLAY},// (0xFA)
  135. { KEY_STANDBY,VK_SLEEP },//(0x5F)
  136. { KEY_BACK,VK_BROWSER_BACK},// (0xA6)
  137. { KEY_FORWARD,VK_BROWSER_FORWARD},// (0xA7)
  138. { KEY_REFRESH,VK_BROWSER_REFRESH},// (0xA8)
  139. { KEY_STOP,VK_BROWSER_STOP},// (0xA9)
  140. { KEY_SEARCH,VK_BROWSER_SEARCH},// (0xAA)
  141. { KEY_FAVORITES, VK_BROWSER_FAVORITES},// (0xAB)
  142. { KEY_HOMEPAGE,VK_BROWSER_HOME},// (0xAC)
  143. { KEY_VOLUMEMUTE,VK_VOLUME_MUTE},// (0xAD)
  144. { KEY_VOLUMEDOWN,VK_VOLUME_DOWN},// (0xAE)
  145. { KEY_VOLUMEUP,VK_VOLUME_UP},// (0xAF)
  146. { KEY_MEDIANEXT,VK_MEDIA_NEXT_TRACK},// (0xB0)
  147. { KEY_MEDIAPREVIOUS,VK_MEDIA_PREV_TRACK},// (0xB1)
  148. { KEY_MEDIASTOP,VK_MEDIA_STOP},// (0xB2)
  149. { KEY_LAUNCHMAIL, VK_LAUNCH_MAIL},// (0xB4)
  150. { KEY_LAUNCHMEDIA,VK_LAUNCH_MEDIA_SELECT},// (0xB5)
  151. { KEY_LAUNCH0,VK_LAUNCH_APP1},// (0xB6)
  152. { KEY_LAUNCH1,VK_LAUNCH_APP2},// (0xB7)
  153. */
  154. { KEY_SEMICOLON, 0x3B },
  155. { KEY_EQUAL, 0x3D },
  156. { KEY_COLON, 0x2C },
  157. { KEY_MINUS, 0x2D },
  158. { KEY_PERIOD, 0x2E },
  159. { KEY_SLASH, 0x2F },
  160. { KEY_KP_MULTIPLY, 0x2A },
  161. { KEY_KP_ADD, 0x2B },
  162. { KEY_QUOTELEFT, 0x60 },
  163. { KEY_BRACKETLEFT, 0x5B },
  164. { KEY_BACKSLASH, 0x5C },
  165. { KEY_BRACKETRIGHT, 0x5D },
  166. { KEY_APOSTROPHE, 0x27 },
  167. { KEY_UNKNOWN, 0 }
  168. };
  169. unsigned int KeyMappingHaiku::get_keysym(int32 raw_char, int32 key) {
  170. if (raw_char == B_INSERT && key == 0x64) {
  171. return KEY_KP_0;
  172. }
  173. if (raw_char == B_END && key == 0x58) {
  174. return KEY_KP_1;
  175. }
  176. if (raw_char == B_DOWN_ARROW && key == 0x59) {
  177. return KEY_KP_2;
  178. }
  179. if (raw_char == B_PAGE_DOWN && key == 0x5A) {
  180. return KEY_KP_3;
  181. }
  182. if (raw_char == B_LEFT_ARROW && key == 0x48) {
  183. return KEY_KP_4;
  184. }
  185. if (raw_char == 0x35 && key == 0x49) {
  186. return KEY_KP_5;
  187. }
  188. if (raw_char == B_RIGHT_ARROW && key == 0x4A) {
  189. return KEY_KP_6;
  190. }
  191. if (raw_char == B_HOME && key == 0x37) {
  192. return KEY_KP_7;
  193. }
  194. if (raw_char == B_UP_ARROW && key == 0x38) {
  195. return KEY_KP_8;
  196. }
  197. if (raw_char == B_PAGE_UP && key == 0x39) {
  198. return KEY_KP_9;
  199. }
  200. if (raw_char == 0x2F && key == 0x23) {
  201. return KEY_KP_DIVIDE;
  202. }
  203. if (raw_char == 0x2D && key == 0x25) {
  204. return KEY_KP_SUBTRACT;
  205. }
  206. if (raw_char == B_DELETE && key == 0x65) {
  207. return KEY_KP_PERIOD;
  208. }
  209. if (raw_char == 0x10) {
  210. for (int i = 0; _fn_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
  211. if (_fn_to_keycode[i].keycode == key) {
  212. return _fn_to_keycode[i].keysym;
  213. }
  214. }
  215. return KEY_UNKNOWN;
  216. }
  217. for (int i = 0; _hb_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
  218. if (_hb_to_keycode[i].keycode == raw_char) {
  219. return _hb_to_keycode[i].keysym;
  220. }
  221. }
  222. return KEY_UNKNOWN;
  223. }
  224. unsigned int KeyMappingHaiku::get_modifier_keysym(int32 key) {
  225. for (int i = 0; _mod_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
  226. if ((_mod_to_keycode[i].keycode & key) != 0) {
  227. return _mod_to_keycode[i].keysym;
  228. }
  229. }
  230. return KEY_UNKNOWN;
  231. }