2016-09-24 10:41:12 +01:00
|
|
|
/**
|
|
|
|
|
* Copyright (c) 2016 rxi
|
|
|
|
|
*
|
|
|
|
|
* This library is free software; you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the MIT license. See LICENSE for details.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <dos.h>
|
|
|
|
|
#include "luaobj.h"
|
|
|
|
|
#include "mouse.h"
|
|
|
|
|
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_State mouse_state;
|
2016-09-24 10:41:12 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
void mouse_init(void) {
|
|
|
|
|
union REGS regs = {};
|
|
|
|
|
int86(0x33, ®s, ®s);
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.inited = regs.x.ax ? 1 : 0;
|
2016-09-24 10:41:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void mouse_update(void) {
|
2016-10-15 15:52:16 +01:00
|
|
|
if (!mouse_state.inited) {
|
2016-09-24 10:41:12 +01:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update last mouse position */
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.lastX = mouse_state.x;
|
|
|
|
|
mouse_state.lastY = mouse_state.y;
|
2016-09-24 10:41:12 +01:00
|
|
|
|
|
|
|
|
/* Update mouse position */
|
|
|
|
|
union REGS regs = {};
|
|
|
|
|
regs.x.ax = 3;
|
|
|
|
|
int86(0x33, ®s, ®s);
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.x = regs.x.cx >> 1;
|
|
|
|
|
mouse_state.y = regs.x.dx;
|
2016-09-24 10:41:12 +01:00
|
|
|
|
|
|
|
|
/* Update button states */
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < MOUSE_BUTTON_MAX; i++) {
|
|
|
|
|
/* Reset pressed/released */
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.buttonsPressed[i] = 0;
|
|
|
|
|
mouse_state.buttonsReleased[i] = 0;
|
2016-09-24 10:41:12 +01:00
|
|
|
/* Handle mouse pressed */
|
|
|
|
|
memset(®s, 0, sizeof(regs));
|
|
|
|
|
regs.x.ax = 5;
|
|
|
|
|
regs.x.bx = i;
|
|
|
|
|
int86(0x33, ®s, ®s);
|
|
|
|
|
if (regs.x.bx) {
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.buttonsPressed[i] = 1;
|
|
|
|
|
mouse_state.buttonsDown[i] = 1;
|
2016-09-24 10:41:12 +01:00
|
|
|
}
|
|
|
|
|
/* Handle mouse released */
|
|
|
|
|
memset(®s, 0, sizeof(regs));
|
|
|
|
|
regs.x.ax = 6;
|
|
|
|
|
regs.x.bx = i;
|
|
|
|
|
int86(0x33, ®s, ®s);
|
|
|
|
|
if (regs.x.bx) {
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_state.buttonsReleased[i] = 1;
|
|
|
|
|
mouse_state.buttonsDown[i] = 0;
|
2016-09-24 10:41:12 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-10-15 15:52:16 +01:00
|
|
|
mouse_State* mouse_getState(void) {
|
|
|
|
|
return &mouse_state;
|
2016-09-24 10:41:12 +01:00
|
|
|
}
|