Added event.c/h and lua binding

* Changed mouse.c to mimic keyboard.c
* Changed boot.lua to use event.poll() instead of mouse/keyboard.poll()
* Removed love.keyboard.poll()
This commit is contained in:
rxi
2016-10-15 17:40:23 +01:00
parent d8210bfc35
commit a5c66d6154
9 changed files with 302 additions and 149 deletions

View File

@@ -11,60 +11,107 @@
#include "luaobj.h"
#include "mouse.h"
mouse_State mouse_state;
#define BUFFER_SIZE 32
#define BUFFER_MASK (BUFFER_SIZE - 1)
int mouse_inited;
int mouse_x, mouse_y;
int mouse_lastX, mouse_lastY;
int mouse_buttonStates[MOUSE_BUTTON_MAX];
struct {
mouse_Event data[BUFFER_SIZE];
int writei, readi;
} mouse_events;
void mouse_init(void) {
union REGS regs = {};
int86(0x33, &regs, &regs);
mouse_state.inited = regs.x.ax ? 1 : 0;
mouse_inited = regs.x.ax ? 1 : 0;
}
void mouse_update(void) {
if (!mouse_state.inited) {
if (!mouse_inited) {
return;
}
/* Update last mouse position */
mouse_state.lastX = mouse_state.x;
mouse_state.lastY = mouse_state.y;
/* Update mouse position */
union REGS regs = {};
regs.x.ax = 3;
int86(0x33, &regs, &regs);
mouse_state.x = regs.x.cx >> 1;
mouse_state.y = regs.x.dx;
mouse_x = regs.x.cx >> 1;
mouse_y = regs.x.dx;
/* Update button states */
int i;
/* Do moved event if mouse moved */
if (mouse_x != mouse_lastX || mouse_y != mouse_lastY) {
mouse_Event e;
e.type = MOUSE_MOVED;
e.x = mouse_x;
e.y = mouse_y;
e.dx = mouse_x - mouse_lastX;
e.dy = mouse_y - mouse_lastY;
mouse_events.data[mouse_events.writei++ & BUFFER_MASK] = e;
}
/* Update last position */
mouse_lastX = mouse_x;
mouse_lastY = mouse_y;
/* Update button states and push pressed/released events */
int i, t;
for (i = 0; i < MOUSE_BUTTON_MAX; i++) {
/* Reset pressed/released */
mouse_state.buttonsPressed[i] = 0;
mouse_state.buttonsReleased[i] = 0;
/* Handle mouse pressed */
memset(&regs, 0, sizeof(regs));
regs.x.ax = 5;
regs.x.bx = i;
int86(0x33, &regs, &regs);
if (regs.x.bx) {
mouse_state.buttonsPressed[i] = 1;
mouse_state.buttonsDown[i] = 1;
}
/* Handle mouse released */
memset(&regs, 0, sizeof(regs));
regs.x.ax = 6;
regs.x.bx = i;
int86(0x33, &regs, &regs);
if (regs.x.bx) {
mouse_state.buttonsReleased[i] = 1;
mouse_state.buttonsDown[i] = 0;
for (t = 0; t < 2; t++) {
memset(&regs, 0, sizeof(regs));
regs.x.ax = 5 + t;
regs.x.bx = i;
int86(0x33, &regs, &regs);
if (regs.x.bx) {
/* Push event */
mouse_Event e;
e.type = t == 0 ? MOUSE_PRESSED : MOUSE_RELEASED;
e.button = i;
e.x = mouse_x;
e.y = mouse_y;
mouse_events.data[mouse_events.writei++ & BUFFER_MASK] = e;
/* Set state */
mouse_buttonStates[i] = t == 0 ? 1 : 0;
}
}
}
}
mouse_State* mouse_getState(void) {
return &mouse_state;
int mouse_poll(mouse_Event *e) {
retry:
/* Event in event buffer? Store and return */
if (mouse_events.readi != mouse_events.writei) {
*e = mouse_events.data[mouse_events.readi++ & BUFFER_MASK];
return 1;
}
/* No events in buffer -- update; return `0` if no new events were pushed by
* the update */
mouse_update();
if (mouse_events.readi != mouse_events.writei) {
goto retry;
}
return 0;
}
int mouse_isDown(int button) {
return mouse_buttonStates[button];
}
int mouse_getX(void) {
return mouse_x;
}
int mouse_getY(void) {
return mouse_y;
}