Added love.keyboard.setKeyRepeat(), disabled key repeat by default
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user