lovr-keyboard.lua 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. local ffi = require 'ffi'
  2. local C = ffi.os == 'Windows' and ffi.load('glfw3') or ffi.C
  3. ffi.cdef [[
  4. typedef struct GLFWwindow GLFWwindow;
  5. typedef void(*GLFWkeyfun)(GLFWwindow*, int, int, int, int);
  6. GLFWwindow* glfwGetCurrentContext(void);
  7. int glfwGetKey(GLFWwindow* window, int key);
  8. GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback);
  9. ]]
  10. local window = C.glfwGetCurrentContext()
  11. local keymap = {
  12. ['space'] = 32,
  13. ['\''] = 39,
  14. [','] = 44,
  15. ['-'] = 45,
  16. ['.'] = 46,
  17. ['/'] = 47,
  18. ['0'] = 48,
  19. ['1'] = 49,
  20. ['2'] = 50,
  21. ['3'] = 51,
  22. ['4'] = 52,
  23. ['5'] = 53,
  24. ['6'] = 54,
  25. ['7'] = 55,
  26. ['8'] = 56,
  27. ['9'] = 57,
  28. [';'] = 59,
  29. ['='] = 61,
  30. ['a'] = 65,
  31. ['b'] = 66,
  32. ['c'] = 67,
  33. ['d'] = 68,
  34. ['e'] = 69,
  35. ['f'] = 70,
  36. ['g'] = 71,
  37. ['h'] = 72,
  38. ['i'] = 73,
  39. ['j'] = 74,
  40. ['k'] = 75,
  41. ['l'] = 76,
  42. ['m'] = 77,
  43. ['n'] = 78,
  44. ['o'] = 79,
  45. ['p'] = 80,
  46. ['q'] = 81,
  47. ['r'] = 82,
  48. ['s'] = 83,
  49. ['t'] = 84,
  50. ['u'] = 85,
  51. ['v'] = 86,
  52. ['w'] = 87,
  53. ['x'] = 88,
  54. ['y'] = 89,
  55. ['z'] = 90,
  56. ['['] = 91,
  57. ['\\'] = 92,
  58. [']'] = 93,
  59. ['`'] = 96,
  60. ['escape'] = 256,
  61. ['return'] = 257,
  62. ['enter'] = 257,
  63. ['tab'] = 258,
  64. ['backspace'] = 259,
  65. ['insert'] = 260,
  66. ['delete'] = 261,
  67. ['right'] = 262,
  68. ['left'] = 263,
  69. ['down'] = 264,
  70. ['up'] = 265,
  71. ['pageup'] = 266,
  72. ['pagedown'] = 267,
  73. ['home'] = 268,
  74. ['end'] = 269,
  75. ['capslock'] = 280,
  76. ['scrolllock'] = 281,
  77. ['numlock'] = 282,
  78. ['printscreen'] = 283,
  79. ['pause'] = 284,
  80. ['f1'] = 290,
  81. ['f2'] = 291,
  82. ['f3'] = 292,
  83. ['f4'] = 293,
  84. ['f5'] = 294,
  85. ['f6'] = 295,
  86. ['f7'] = 296,
  87. ['f8'] = 297,
  88. ['f9'] = 298,
  89. ['f10'] = 299,
  90. ['f11'] = 300,
  91. ['f12'] = 301,
  92. ['kp0'] = 320,
  93. ['kp1'] = 321,
  94. ['kp2'] = 322,
  95. ['kp3'] = 323,
  96. ['kp4'] = 324,
  97. ['kp5'] = 325,
  98. ['kp6'] = 326,
  99. ['kp7'] = 327,
  100. ['kp8'] = 328,
  101. ['kp9'] = 329,
  102. ['kp.'] = 330,
  103. ['kp/'] = 331,
  104. ['kp*'] = 332,
  105. ['kp-'] = 333,
  106. ['kp+'] = 334,
  107. ['kpenter'] = 335,
  108. ['kp='] = 336,
  109. ['lshift'] = 340,
  110. ['lctrl'] = 341,
  111. ['lalt'] = 342,
  112. ['lgui'] = 343,
  113. ['rshift'] = 344,
  114. ['rctrl'] = 345,
  115. ['ralt'] = 346,
  116. ['rgui'] = 347,
  117. ['menu'] = 348
  118. }
  119. for k, v in pairs(keymap) do
  120. keymap[v] = k
  121. end
  122. local keyboard = {}
  123. function keyboard.isDown(key, ...)
  124. if not key then return false end
  125. local keycode = keymap[key]
  126. assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key)
  127. return C.glfwGetKey(window, keycode) == 1 or keyboard.isDown(...)
  128. end
  129. C.glfwSetKeyCallback(window, function(window, key, scancode, action, mods)
  130. if action ~= 2 and keymap[key] then
  131. lovr.event.push(action > 0 and 'keypressed' or 'keyreleased', keymap[key])
  132. end
  133. end)
  134. return keyboard