Added love.keyboard.setKeyRepeat(), disabled key repeat by default

This commit is contained in:
rxi
2016-09-25 21:12:09 +01:00
parent 76a3cb0b61
commit 71ef28fb45

View File

@@ -21,6 +21,7 @@ enum { KEY_UP, KEY_DOWN };
typedef struct { unsigned char type, code, isrepeat; } KeyEvent; typedef struct { unsigned char type, code, isrepeat; } KeyEvent;
volatile int keyboard_allowKeyRepeat = 0;
volatile char keyboard_keyStates[KEYBOARD_KEY_MAX]; volatile char keyboard_keyStates[KEYBOARD_KEY_MAX];
volatile struct { volatile struct {
@@ -46,22 +47,25 @@ void keyboard_handler() {
/* Key up */ /* Key up */
code &= ~(1 << 7); code &= ~(1 << 7);
code |= extended; code |= extended;
keyboard_keyStates[code] = 0;
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK]; e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
e->code = code; e->code = code;
e->type = KEY_UP; e->type = KEY_UP;
e->isrepeat = 0; e->isrepeat = 0;
keyboard_events.writei++; keyboard_events.writei++;
keyboard_keyStates[code] = 0;
} else { } else {
/* Key down */ /* Key down */
int isrepeat = keyboard_keyStates[code];
code |= extended; code |= extended;
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK]; if (!isrepeat || keyboard_allowKeyRepeat) {
e->code = code; keyboard_keyStates[code] = 1;
e->type = KEY_DOWN; e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
e->isrepeat = keyboard_keyStates[code]; e->code = code;
keyboard_events.writei++; e->type = KEY_DOWN;
keyboard_keyStates[code] = 1; e->isrepeat = keyboard_keyStates[code];
keyboard_events.writei++;
}
} }
extended = 0x0; extended = 0x0;
} }
@@ -227,6 +231,12 @@ const char *scancodeMap[] = {
}; };
int l_keyboard_setKeyRepeat(lua_State *L) {
keyboard_allowKeyRepeat = lua_toboolean(L, 1);
return 0;
}
int l_keyboard_isDown(lua_State *L) { int l_keyboard_isDown(lua_State *L) {
int n = lua_gettop(L); int n = lua_gettop(L);
int res = 0; int res = 0;
@@ -292,8 +302,9 @@ int l_keyboard_poll(lua_State *L) {
int luaopen_keyboard(lua_State *L) { int luaopen_keyboard(lua_State *L) {
luaL_Reg reg[] = { luaL_Reg reg[] = {
{ "poll", l_keyboard_poll }, { "poll", l_keyboard_poll },
{ "isDown", l_keyboard_isDown }, { "setKeyRepeat", l_keyboard_setKeyRepeat },
{ "isDown", l_keyboard_isDown },
{ 0, 0 }, { 0, 0 },
}; };
luaL_newlib(L, reg); luaL_newlib(L, reg);