X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Finput.c;h=29ef0047e74ad22be0709655ff264e5add346e12;hb=2238e69eea50d2274553926f3f294822c1972ff0;hp=9660dd05ea83a2fc3d3cf67b3e37d48554393b06;hpb=70a143a9de252ddc4f148866b0a93e28904073e5;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/input.c b/Usermode/Applications/axwin3_src/WM/input.c index 9660dd05..29ef0047 100644 --- a/Usermode/Applications/axwin3_src/WM/input.c +++ b/Usermode/Applications/axwin3_src/WM/input.c @@ -8,6 +8,7 @@ #include #include #include +#include // TODO: Move out to a common header typedef struct @@ -21,7 +22,7 @@ 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; @@ -36,45 +37,46 @@ int Input_Init(void) tNumValue num_value; // Open mouse for RW - giMouseFD = open(gsMouseDevice, 3); + giMouseFD = _SysOpen(gsMouseDevice, 3); // Set mouse limits // TODO: Update these if the screen resolution changes num_value.Num = 0; num_value.Value = giScreenWidth; - ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value); + _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value); num_value.Value = giScreenWidth/2; giInput_MouseX = giScreenWidth/2; - ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value); + _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value); num_value.Num = 1; num_value.Value = giScreenHeight; - ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value); + _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value); num_value.Value = giScreenHeight/2; giInput_MouseY = giScreenHeight/2; - ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value); + _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value); return 0; } 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 = _SysRead(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); @@ -99,6 +101,8 @@ void Input_HandleSelect(fd_set *set) if(FD_ISSET(giMouseFD, set)) { + const int c_n_axies = 4; + const int c_n_buttons = 5; int i; struct sMouseAxis { int16_t MinValue; @@ -111,17 +115,29 @@ void Input_HandleSelect(fd_set *set) 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)); + _SysSeek(giMouseFD, 0, SEEK_SET); + i = _SysRead(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 ) @@ -133,7 +149,7 @@ void Input_HandleSelect(fd_set *set) // Handle movement Video_SetCursorPos( axies[0].CursorPos, axies[1].CursorPos ); - _SysDebug("Mouse to %i,%i", axies[0].CursorPos, axies[1].CursorPos); +// _SysDebug("Mouse to %i,%i", axies[0].CursorPos, axies[1].CursorPos); WM_Input_MouseMoved( giInput_MouseX, giInput_MouseY,