/****************************************************************************** * GetDeviceState : returns the "state" of the mouse. * * For the moment, only the "standard" return structure (DIMOUSESTATE) is * supported. */ static HRESULT WINAPI SysMouseAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { SysMouseImpl *This = (SysMouseImpl *)iface; if(This->acquired == 0) return DIERR_NOTACQUIRED; EnterCriticalSection(&(This->crit)); TRACE("(this=%p,0x%08lx,%p):\n", This, len, ptr); TRACE("(X: %ld - Y: %ld - Z: %ld L: %02x M: %02x R: %02x)\n", This->m_state.lX, This->m_state.lY, This->m_state.lZ, This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]); /* Copy the current mouse state */ fill_DataFormat(ptr, &(This->m_state), This->wine_df); /* Initialize the buffer when in relative mode */ if (This->absolute == 0) { This->m_state.lX = 0; This->m_state.lY = 0; This->m_state.lZ = 0; } /* Check if we need to do a mouse warping */ if (This->need_warp == WARP_NEEDED && (GetCurrentTime() - This->last_warped > 10)) { dinput_window_check(This); TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); This->last_warped = GetCurrentTime(); #ifdef MOUSE_HACK This->need_warp = WARP_DONE; #else This->need_warp = WARP_STARTED; #endif } LeaveCriticalSection(&(This->crit)); return DI_OK; }
/****************************************************************************** * GetDeviceData : gets buffered input data. */ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags) { SysMouseImpl *This = (SysMouseImpl *)iface; HRESULT res; res = IDirectInputDevice2AImpl_GetDeviceData(iface, dodsize, dod, entries, flags); if (FAILED(res)) return res; /* Check if we need to do a mouse warping */ if (This->need_warp && (GetCurrentTime() - This->last_warped > 10)) { if(!dinput_window_check(This)) return DIERR_GENERIC; TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); This->last_warped = GetCurrentTime(); This->need_warp = FALSE; } return res; }
/****************************************************************************** * GetDeviceState : returns the "state" of the mouse. * * For the moment, only the "standard" return structure (DIMOUSESTATE) is * supported. */ static HRESULT WINAPI SysMouseAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { SysMouseImpl *This = (SysMouseImpl *)iface; if(This->base.acquired == 0) return DIERR_NOTACQUIRED; TRACE("(this=%p,0x%08x,%p):\n", This, len, ptr); _dump_mouse_state(&This->m_state); EnterCriticalSection(&This->base.crit); /* Copy the current mouse state */ fill_DataFormat(ptr, &(This->m_state), &This->base.data_format); /* Initialize the buffer when in relative mode */ if (!(This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS)) { This->m_state.lX = 0; This->m_state.lY = 0; This->m_state.lZ = 0; } LeaveCriticalSection(&This->base.crit); /* Check if we need to do a mouse warping */ if (This->need_warp && (GetCurrentTime() - This->last_warped > 10)) { if(!dinput_window_check(This)) return DIERR_GENERIC; TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); This->last_warped = GetCurrentTime(); This->need_warp = FALSE; } return DI_OK; }
/****************************************************************************** * GetDeviceData : gets buffered input data. */ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags ) { SysMouseImpl *This = (SysMouseImpl *)iface; DWORD len; int nqtail = 0; TRACE("(%p)->(dods=%ld,dod=%p,entries=%p (%ld)%s,fl=0x%08lx%s)\n",This,dodsize,dod, entries, *entries,*entries == INFINITE ? " (INFINITE)" : "", flags, (flags & DIGDD_PEEK) ? " (DIGDD_PEEK)": "" ); if (This->acquired == 0) { WARN(" application tries to get data from an unacquired device !\n"); return DIERR_NOTACQUIRED; } EnterCriticalSection(&(This->crit)); len = ((This->queue_head < This->queue_tail) ? This->queue_len : 0) + (This->queue_head - This->queue_tail); if ((*entries != INFINITE) && (len > *entries)) len = *entries; if (dod == NULL) { *entries = len; if (!(flags & DIGDD_PEEK)) { if (len) TRACE("Application discarding %ld event(s).\n", len); nqtail = This->queue_tail + len; while (nqtail >= This->queue_len) nqtail -= This->queue_len; } else { TRACE("Telling application that %ld event(s) are in the queue.\n", len); } } else { if (dodsize < sizeof(DIDEVICEOBJECTDATA_DX3)) { ERR("Wrong structure size !\n"); LeaveCriticalSection(&(This->crit)); return DIERR_INVALIDPARAM; } if (len) TRACE("Application retrieving %ld event(s):\n", len); *entries = 0; nqtail = This->queue_tail; while (len) { /* Copy the buffered data into the application queue */ TRACE(" - queuing Offs:%2ld Data:%5ld TS:%8ld Seq:%8ld at address %p from queue tail %4d\n", (This->data_queue)->dwOfs, (This->data_queue)->dwData, (This->data_queue)->dwTimeStamp, (This->data_queue)->dwSequence, (char *)dod + *entries * dodsize, nqtail); memcpy((char *)dod + *entries * dodsize, This->data_queue + nqtail, dodsize); /* Advance position */ nqtail++; if (nqtail >= This->queue_len) nqtail -= This->queue_len; (*entries)++; len--; } } if (!(flags & DIGDD_PEEK)) This->queue_tail = nqtail; LeaveCriticalSection(&(This->crit)); /* Check if we need to do a mouse warping */ if (This->need_warp == WARP_NEEDED && (GetCurrentTime() - This->last_warped > 10)) { dinput_window_check(This); TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); This->last_warped = GetCurrentTime(); #ifdef MOUSE_HACK This->need_warp = WARP_DONE; #else This->need_warp = WARP_STARTED; #endif } return DI_OK; }