#include <common.h>
#include <acess/sys.h>
#include <wm_input.h>
+#include <stddef.h>
// TODO: Move out to a common header
typedef struct
// === IMPORTS ===
extern void Video_SetCursorPos(short X, short Y);
const char *gsMouseDevice;
-extern int giTerminalFD;
+extern int giTerminalFD_Input;
extern int giScreenWidth;
extern int giScreenHeight;
void Input_FillSelect(int *nfds, fd_set *set)
{
- if(*nfds < giTerminalFD) *nfds = giTerminalFD;
+ if(*nfds < giTerminalFD_Input) *nfds = giTerminalFD_Input;
if(*nfds < giMouseFD) *nfds = giMouseFD;
- FD_SET(giTerminalFD, set);
+ FD_SET(giTerminalFD_Input, set);
FD_SET(giMouseFD, set);
}
void Input_HandleSelect(fd_set *set)
{
- if(FD_ISSET(giTerminalFD, set))
+ if(FD_ISSET(giTerminalFD_Input, set))
{
uint32_t codepoint;
static uint32_t scancode;
#define KEY_CODEPOINT_MASK 0x3FFFFFFF
- if( read(giTerminalFD, &codepoint, sizeof(codepoint)) != sizeof(codepoint) )
+ size_t readlen = read(giTerminalFD_Input, &codepoint, sizeof(codepoint));
+ if( readlen != sizeof(codepoint) )
{
// oops, error
- _SysDebug("Terminal read failed?");
+ _SysDebug("Terminal read failed? (%i != %i)", readlen, sizeof(codepoint));
}
// _SysDebug("Keypress 0x%x", codepoint);
if(FD_ISSET(giMouseFD, set))
{
+ const int c_n_axies = 4;
+ const int c_n_buttons = 5;
int i;
struct sMouseAxis {
int16_t MinValue;
uint16_t NAxies;
uint16_t NButtons;
} *mouseinfo;
- char data[sizeof(*mouseinfo) + sizeof(*axies)*3 + 5];
+ char data[sizeof(*mouseinfo) + sizeof(*axies)*c_n_axies + c_n_buttons];
mouseinfo = (void*)data;
seek(giMouseFD, 0, SEEK_SET);
i = read(giMouseFD, data, sizeof(data));
i -= sizeof(*mouseinfo);
- if( i < 0 )
+ if( i < 0 ) {
+ _SysDebug("Mouse data undersized (no header)");
return ;
- if( i < sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons )
+ }
+ if( mouseinfo->NAxies > c_n_axies || mouseinfo->NButtons > c_n_buttons ) {
+ _SysDebug("%i axies, %i buttons above prealloc counts (%i, %i)",
+ mouseinfo->NAxies, mouseinfo->NButtons, c_n_axies, c_n_buttons
+ );
+ return ;
+ }
+ if( i < sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons ) {
+ _SysDebug("Mouse data undersized (body doesn't fit %i < %i)",
+ i, sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons
+ );
return ;
+ }
// What? No X/Y?
if( mouseinfo->NAxies < 2 )
// Handle movement
Video_SetCursorPos( axies[0].CursorPos, axies[1].CursorPos );
+// _SysDebug("Mouse to %i,%i", axies[0].CursorPos, axies[1].CursorPos);
+
WM_Input_MouseMoved(
giInput_MouseX, giInput_MouseY,
axies[0].CursorPos, axies[1].CursorPos