From 71ef28fb45dab9b29e41ae7cb00928cb57682220 Mon Sep 17 00:00:00 2001 From: rxi Date: Sun, 25 Sep 2016 21:12:09 +0100 Subject: [PATCH] Added love.keyboard.setKeyRepeat(), disabled key repeat by default --- src/keyboard.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index da43d6c..cbab64b 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -21,6 +21,7 @@ enum { KEY_UP, KEY_DOWN }; typedef struct { unsigned char type, code, isrepeat; } KeyEvent; +volatile int keyboard_allowKeyRepeat = 0; volatile char keyboard_keyStates[KEYBOARD_KEY_MAX]; volatile struct { @@ -46,22 +47,25 @@ void keyboard_handler() { /* Key up */ code &= ~(1 << 7); code |= extended; + keyboard_keyStates[code] = 0; e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK]; e->code = code; e->type = KEY_UP; e->isrepeat = 0; keyboard_events.writei++; - keyboard_keyStates[code] = 0; } else { /* Key down */ + int isrepeat = keyboard_keyStates[code]; code |= extended; - e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK]; - e->code = code; - e->type = KEY_DOWN; - e->isrepeat = keyboard_keyStates[code]; - keyboard_events.writei++; - keyboard_keyStates[code] = 1; + if (!isrepeat || keyboard_allowKeyRepeat) { + keyboard_keyStates[code] = 1; + e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK]; + e->code = code; + e->type = KEY_DOWN; + e->isrepeat = keyboard_keyStates[code]; + keyboard_events.writei++; + } } 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 n = lua_gettop(L); int res = 0; @@ -292,8 +302,9 @@ int l_keyboard_poll(lua_State *L) { int luaopen_keyboard(lua_State *L) { luaL_Reg reg[] = { - { "poll", l_keyboard_poll }, - { "isDown", l_keyboard_isDown }, + { "poll", l_keyboard_poll }, + { "setKeyRepeat", l_keyboard_setKeyRepeat }, + { "isDown", l_keyboard_isDown }, { 0, 0 }, }; luaL_newlib(L, reg);