Hello all. This is snip of the wine mouse code, the mouse for dinput. I understand a few parts of it. I need to understand everything. I want to understand what I trying to fix first.
I need to know what data is going into this procedure and what is going out. Line by Line what it’s doing. I’m learning mouse slowly. Can someone break this down section by section so I can understand it’s doing. I’m getting overwhelmed trying to make sense of it.
Specificly, what is the number range for GetCursorPos(&pt);
static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam )
{
MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam;
SysMouseImpl* This = impl_from_IDirectInputDevice8A(iface);
int wdata = 0, inst_id = -1, ret;
TRACE("msg %lx @ (%d %d)
", wparam, hook->pt.x, hook->pt.y);
EnterCriticalSection(&This->base.crit);
ret = This->clipped;
switch(wparam) {
case WM_MOUSEMOVE:
{
POINT pt, pt1;
if (This->clipped) pt = This->mapped_center;
else GetCursorPos(&pt);
//mouse patch
pt.x = hook->pt.x - pt.x; // this makes pt.x a relative movement.
This->m_state.lX=This->m_state.lX + (pt.x * 1);// add relative movement to your structure
pt.y = hook->pt.y - pt.y; // this makes pt.y a relative movement.
This->m_state.lY=This->m_state.lY + (pt.y * 1);// add relative movement to your structure
if (This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS)
{
pt1.x = This->m_state.lX;
pt1.y = This->m_state.lY;
} else
pt1 = pt;
if (pt.x)
{
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS;
wdata = pt1.x;
}
if (pt.y)
{
/* Already have X, need to queue it */
if (inst_id != -1)
queue_event(iface, inst_id,
wdata, GetCurrentTime(), This->base.dinput->evsequence);
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS;
wdata = pt1.y;
}
if (pt.x || pt.y)
{
if ((This->warp_override == WARP_FORCE_ON) ||
(This->warp_override != WARP_DISABLE && (This->base.dwCoopLevel & DISCL_EXCLUSIVE)))
This->need_warp = TRUE;
}
break;
}
case WM_MOUSEWHEEL:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS;
This->m_state.lZ += wdata = (short)HIWORD(hook->mouseData);
break;
case WM_LBUTTONDOWN:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 0) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[0] = wdata = 0x80;
break;
case WM_LBUTTONUP:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 0) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[0] = wdata = 0x00;
break;
case WM_RBUTTONDOWN:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 1) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[1] = wdata = 0x80;
break;
case WM_RBUTTONUP:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 1) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[1] = wdata = 0x00;
break;
case WM_MBUTTONDOWN:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[2] = wdata = 0x80;
break;
case WM_MBUTTONUP:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[2] = wdata = 0x00;
break;
case WM_XBUTTONDOWN:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2 + HIWORD(hook->mouseData)) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[2 + HIWORD(hook->mouseData)] = wdata = 0x80;
break;
case WM_XBUTTONUP:
inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2 + HIWORD(hook->mouseData)) | DIDFT_PSHBUTTON;
This->m_state.rgbButtons[2 + HIWORD(hook->mouseData)] = wdata = 0x00;
break;
default:
ret = 0;
}
if (inst_id != -1)
{
_dump_mouse_state(&This->m_state);
queue_event(iface, inst_id,
wdata, GetCurrentTime(), This->base.dinput->evsequence++);
}
LeaveCriticalSection(&This->base.crit);
return ret;
}