3 * - By John Hodge (thePowersGang)
8 #include <CConfigInput.hpp>
10 #include <CCompositor.hpp>
12 #include <acess/devices/joystick.h>
14 #include <system_error>
18 CInput::CInput(const ::AxWin::CConfigInput& config, CCompositor& compositor):
19 m_compositor(compositor),
23 m_mouseFD = _SysOpen(config.mouse_device.c_str(), OPENFLAG_READ|OPENFLAG_WRITE);
25 throw ::std::system_error(errno, ::std::system_category());
30 struct mouse_attribute attr;
31 // X : Limit + Position
34 _SysIOCtl(m_mouseFD, JOY_IOCTL_GETSETAXISLIMIT, &attr);
35 attr.Value = m_mouseX;
36 _SysIOCtl(m_mouseFD, JOY_IOCTL_GETSETAXISPOSITION, &attr);
37 // Y: Limit + Position
40 _SysIOCtl(m_mouseFD, JOY_IOCTL_GETSETAXISLIMIT, &attr);
41 attr.Value = m_mouseY;
42 _SysIOCtl(m_mouseFD, JOY_IOCTL_GETSETAXISPOSITION, &attr);
45 int CInput::FillSelect(::fd_set& rfds)
47 FD_SET(m_keyboardFD, &rfds);
49 FD_SET(m_mouseFD, &rfds);
50 return ::std::max(m_keyboardFD, m_mouseFD)+1;
53 void CInput::HandleSelect(::fd_set& rfds)
55 if( FD_ISSET(m_keyboardFD, &rfds) )
58 static uint32_t scancode;
59 #define KEY_CODEPOINT_MASK 0x3FFFFFFF
61 size_t readlen = _SysRead(m_keyboardFD, &codepoint, sizeof(codepoint));
62 if( readlen != sizeof(codepoint) )
65 _SysDebug("Terminal read failed? (%i != %i)", readlen, sizeof(codepoint));
68 // _SysDebug("Keypress 0x%x", codepoint);
70 switch(codepoint & 0xC0000000)
72 case 0x00000000: // Key pressed
73 m_compositor.KeyState(0, scancode, true, codepoint & KEY_CODEPOINT_MASK);
75 case 0x40000000: // Key release
76 m_compositor.KeyState(0, scancode, false, codepoint & KEY_CODEPOINT_MASK);
79 case 0x80000000: // Key refire
80 m_compositor.KeyState(0, scancode, true, codepoint & KEY_CODEPOINT_MASK);
83 case 0xC0000000: // Raw scancode
84 scancode = codepoint & KEY_CODEPOINT_MASK;
89 if( m_mouseFD != -1 && FD_ISSET(m_mouseFD, &rfds) )
91 const int c_n_axies = 4;
92 const int c_n_buttons = 5;
93 struct mouse_axis *axies;
96 char data[sizeof(struct mouse_header) + sizeof(*axies)*c_n_axies + c_n_buttons];
97 struct mouse_header *mouseinfo = (struct mouse_header*)data;
99 _SysSeek(m_mouseFD, 0, SEEK_SET);
100 int len = _SysRead(m_mouseFD, data, sizeof(data));
102 throw ::std::system_error(errno, ::std::system_category());
104 len -= sizeof(*mouseinfo);
106 _SysDebug("Mouse data undersized (%i bytes short on header)", len);
109 if( mouseinfo->NAxies > c_n_axies || mouseinfo->NButtons > c_n_buttons ) {
110 _SysDebug("%i axies, %i buttons above prealloc counts (%i, %i)",
111 mouseinfo->NAxies, mouseinfo->NButtons, c_n_axies, c_n_buttons
115 if( len < sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons ) {
116 _SysDebug("Mouse data undersized (body doesn't fit %i < %i)",
117 len, sizeof(*axies)*mouseinfo->NAxies + mouseinfo->NButtons
123 if( mouseinfo->NAxies < 2 ) {
124 _SysDebug("Mouse data lacks X/Y");
128 axies = (struct mouse_axis*)( mouseinfo + 1 );
129 buttons = (uint8_t*)( axies + mouseinfo->NAxies );
131 // TODO: Use cursor range only to caputre motion (ignore reported position)
132 m_compositor.MouseMove(0,
134 axies[0].CursorPos - m_mouseX, axies[1].CursorPos - m_mouseY
136 m_mouseX = axies[0].CursorPos;
137 m_mouseY = axies[1].CursorPos;
139 for( int i = 0; i < mouseinfo->NButtons; i ++ )
142 int cur = buttons[i] > 128;
143 if( !!(m_mouseBtns & bit) != cur )
145 m_compositor.MouseButton(0, m_mouseX, m_mouseY, (eMouseButton)i, cur);
153 }; // namespace AxWin