2 * Acess2 GUI (AxWin) Version 3
3 * - By John Hodge (thePowersGang)
13 // TODO: Move out to a common header
19 #define JOY_IOCTL_GETSETAXISLIMIT 6
20 #define JOY_IOCTL_GETSETAXISPOSITION 7
23 extern void Video_SetCursorPos(short X, short Y);
24 const char *gsMouseDevice;
25 extern int giTerminalFD_Input;
26 extern int giScreenWidth;
27 extern int giScreenHeight;
31 int giInput_MouseButtonState;
32 int giInput_MouseX, giInput_MouseY;
40 giMouseFD = _SysOpen(gsMouseDevice, 3);
43 // TODO: Update these if the screen resolution changes
44 num_value.Num = 0; num_value.Value = giScreenWidth;
45 _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
46 num_value.Value = giScreenWidth/2;
47 giInput_MouseX = giScreenWidth/2;
48 _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
50 num_value.Num = 1; num_value.Value = giScreenHeight;
51 _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
52 num_value.Value = giScreenHeight/2;
53 giInput_MouseY = giScreenHeight/2;
54 _SysIOCtl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
59 void Input_FillSelect(int *nfds, fd_set *set)
61 if(*nfds < giTerminalFD_Input) *nfds = giTerminalFD_Input;
62 if(*nfds < giMouseFD) *nfds = giMouseFD;
63 FD_SET(giTerminalFD_Input, set);
64 FD_SET(giMouseFD, set);
67 void Input_HandleSelect(fd_set *set)
69 if(FD_ISSET(giTerminalFD_Input, set))
72 static uint32_t scancode;
73 #define KEY_CODEPOINT_MASK 0x3FFFFFFF
75 size_t readlen = _SysRead(giTerminalFD_Input, &codepoint, sizeof(codepoint));
76 if( readlen != sizeof(codepoint) )
79 _SysDebug("Terminal read failed? (%i != %i)", readlen, sizeof(codepoint));
82 // _SysDebug("Keypress 0x%x", codepoint);
84 switch(codepoint & 0xC0000000)
86 case 0x00000000: // Key pressed
87 WM_Input_KeyDown(codepoint & KEY_CODEPOINT_MASK, scancode);
88 case 0x80000000: // Key release
89 WM_Input_KeyFire(codepoint & KEY_CODEPOINT_MASK, scancode);
92 case 0x40000000: // Key refire
93 WM_Input_KeyUp(codepoint & KEY_CODEPOINT_MASK, scancode);
96 case 0xC0000000: // Raw scancode
97 scancode = codepoint & KEY_CODEPOINT_MASK;
102 if(FD_ISSET(giMouseFD, set))
104 const int c_n_axies = 4;
105 const int c_n_buttons = 5;
118 char data[sizeof(*mouseinfo) + sizeof(*axies)*c_n_axies + c_n_buttons];
120 mouseinfo = (void*)data;
122 _SysSeek(giMouseFD, 0, SEEK_SET);
123 i = _SysRead(giMouseFD, data, sizeof(data));
124 i -= sizeof(*mouseinfo);
126 _SysDebug("Mouse data undersized (no header)");
129 if( mouseinfo->NAxies > c_n_axies || mouseinfo->NButtons > c_n_buttons ) {
130 _SysDebug("%i axies, %i buttons above prealloc counts (%i, %i)",
131 mouseinfo->NAxies, mouseinfo->NButtons, c_n_axies, c_n_buttons
135 if( i < sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons ) {
136 _SysDebug("Mouse data undersized (body doesn't fit %i < %i)",
137 i, sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons
143 if( mouseinfo->NAxies < 2 )
146 axies = (void*)( mouseinfo + 1 );
147 buttons = (void*)( axies + mouseinfo->NAxies );
150 Video_SetCursorPos( axies[0].CursorPos, axies[1].CursorPos );
152 // _SysDebug("Mouse to %i,%i", axies[0].CursorPos, axies[1].CursorPos);
155 giInput_MouseX, giInput_MouseY,
156 axies[0].CursorPos, axies[1].CursorPos
158 giInput_MouseX = axies[0].CursorPos;
159 giInput_MouseY = axies[1].CursorPos;
161 for( i = 0; i < mouseinfo->NButtons; i ++ )
164 int cur = buttons[i] > 128;
166 if( !!(giInput_MouseButtonState & bit) != cur )
168 WM_Input_MouseButton(giInput_MouseX, giInput_MouseY, i, cur);
170 giInput_MouseButtonState ^= bit;