/****************************************************************************** * GetDeviceInfo : get information about a device's identity */ HRESULT WINAPI JoystickWGenericImpl_GetDeviceInfo( LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW pdidi) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p,%p)\n", iface, pdidi); if ((pdidi->dwSize != sizeof(DIDEVICEINSTANCE_DX3W)) && (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW))) { WARN("invalid parameter: pdidi->dwSize = %d\n", pdidi->dwSize); return DIERR_INVALIDPARAM; } /* Return joystick */ pdidi->guidInstance = This->guidInstance; pdidi->guidProduct = This->guidProduct; /* we only support traditional joysticks for now */ pdidi->dwDevType = This->devcaps.dwDevType; MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, pdidi->tszInstanceName, MAX_PATH); MultiByteToWideChar(CP_ACP, 0, This->name, -1, pdidi->tszProductName, MAX_PATH); if (pdidi->dwSize > sizeof(DIDEVICEINSTANCE_DX3W)) { pdidi->guidFFDriver = GUID_NULL; pdidi->wUsagePage = 0; pdidi->wUsage = 0; } return DI_OK; }
static HRESULT WINAPI SysKeyboardWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p)->(%d,%p)\n", This, len, ptr); if (!This->base.acquired) return DIERR_NOTACQUIRED; if (len != This->base.data_format.user_df->dwDataSize ) return DIERR_INVALIDPARAM; EnterCriticalSection(&This->base.crit); if (TRACE_ON(dinput)) { int i; for (i = 0; i < WINE_DINPUT_KEYBOARD_MAX_KEYS; i++) { if (This->DInputKeyState[i] != 0x00) TRACE(" - %02X: %02x\n", i, This->DInputKeyState[i]); } } fill_DataFormat(ptr, len, This->DInputKeyState, &This->base.data_format); LeaveCriticalSection(&This->base.crit); return DI_OK; }
/****************************************************************************** * Acquire : gets exclusive control of the joystick */ static HRESULT WINAPI JoystickLinuxWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; TRACE("(%p)\n",This); res = IDirectInputDevice2WImpl_Acquire(iface); if (res != DI_OK) return res; /* open the joystick device */ if (This->joyfd==-1) { TRACE("opening joystick device %s\n", This->joydev->device); This->joyfd = open(This->joydev->device, O_RDONLY); if (This->joyfd==-1) { ERR("open(%s) failed: %s\n", This->joydev->device, strerror(errno)); IDirectInputDevice2WImpl_Unacquire(iface); return DIERR_NOTFOUND; } } return DI_OK; }
/****************************************************************************** * GetProperty : Retrieves information about the input device. */ static HRESULT WINAPI SysKeyboardWImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p) %s,%p\n", iface, debugstr_guid(rguid), pdiph); _dump_DIPROPHEADER(pdiph); if (!IS_DIPROP(rguid)) return DI_OK; switch (LOWORD(rguid)) { case (DWORD_PTR)DIPROP_KEYNAME: { HRESULT hr; LPDIPROPSTRING ps = (LPDIPROPSTRING)pdiph; DIDEVICEOBJECTINSTANCEW didoi; if (pdiph->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM; didoi.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW); hr = SysKeyboardWImpl_GetObjectInfo(iface, &didoi, ps->diph.dwObj, ps->diph.dwHow); if (hr == DI_OK) memcpy(ps->wsz, didoi.tszName, sizeof(ps->wsz)); return hr; } default: return IDirectInputDevice2AImpl_GetProperty( IDirectInputDevice8A_from_impl(This), rguid, pdiph ); } return DI_OK; }
static HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); int i, has_actions = 0; FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags); for (i=0; i < lpdiaf->dwNumActions; i++) { if ((lpdiaf->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK) { DWORD obj_id = semantic_to_obj_id(&This->base, lpdiaf->rgoAction[i].dwSemantic); lpdiaf->rgoAction[i].dwObjID = obj_id; lpdiaf->rgoAction[i].guidInstance = This->base.guid; lpdiaf->rgoAction[i].dwHow = DIAH_DEFAULT; has_actions = 1; } else if (!(dwFlags & DIDBAM_PRESERVE)) { /* we must clear action data belonging to other devices */ memset(&lpdiaf->rgoAction[i].guidInstance, 0, sizeof(GUID)); lpdiaf->rgoAction[i].dwHow = DIAH_UNMAPPED; } } if (!has_actions) return DI_NOEFFECT; return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags); }
HRESULT WINAPI JoystickWGenericImpl_GetCapabilities(LPDIRECTINPUTDEVICE8W iface, LPDIDEVCAPS lpDIDevCaps) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); int size; TRACE("%p->(%p)\n",iface,lpDIDevCaps); if (lpDIDevCaps == NULL) { WARN("invalid pointer\n"); return E_POINTER; } size = lpDIDevCaps->dwSize; if (!(size == sizeof(DIDEVCAPS) || size == sizeof(DIDEVCAPS_DX3))) { WARN("invalid parameter\n"); return DIERR_INVALIDPARAM; } CopyMemory(lpDIDevCaps, &This->devcaps, size); lpDIDevCaps->dwSize = size; if (TRACE_ON(dinput)) _dump_DIDEVCAPS(lpDIDevCaps); return DI_OK; }
/****************************************************************************** * GetProperty : get input device properties */ static HRESULT WINAPI JoystickLinuxWImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(this=%p,%s,%p)\n", iface, debugstr_guid(rguid), pdiph); _dump_DIPROPHEADER(pdiph); if (!IS_DIPROP(rguid)) return DI_OK; switch (LOWORD(rguid)) { case (DWORD_PTR) DIPROP_JOYSTICKID: { LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph; pd->dwData = get_joystick_index(&This->generic.base.guid); TRACE("DIPROP_JOYSTICKID(%d)\n", pd->dwData); break; } default: return JoystickWGenericImpl_GetProperty(iface, rguid, pdiph); } return DI_OK; }
/****************************************************************************** * GetCapabilities : get the device capabilities */ static HRESULT WINAPI SysMouseWImpl_GetCapabilities(LPDIRECTINPUTDEVICE8W iface, LPDIDEVCAPS lpDIDevCaps) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); DIDEVCAPS devcaps; TRACE("(this=%p,%p)\n",This,lpDIDevCaps); if ((lpDIDevCaps->dwSize != sizeof(DIDEVCAPS)) && (lpDIDevCaps->dwSize != sizeof(DIDEVCAPS_DX3))) { WARN("invalid parameter\n"); return DIERR_INVALIDPARAM; } devcaps.dwSize = lpDIDevCaps->dwSize; devcaps.dwFlags = DIDC_ATTACHED | DIDC_EMULATED; if (This->base.dinput->dwVersion >= 0x0800) devcaps.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8); else devcaps.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8); devcaps.dwAxes = 3; devcaps.dwButtons = 8; devcaps.dwPOVs = 0; devcaps.dwFFSamplePeriod = 0; devcaps.dwFFMinTimeResolution = 0; devcaps.dwFirmwareRevision = 100; devcaps.dwHardwareRevision = 100; devcaps.dwFFDriverVersion = 0; memcpy(lpDIDevCaps, &devcaps, lpDIDevCaps->dwSize); return DI_OK; }
/****************************************************************************** * GetDeviceState : returns the "state" of the mouse. * * For the moment, only the "standard" return structure (DIMOUSESTATE) is * supported. */ static HRESULT WINAPI SysMouseWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); if(This->base.acquired == 0) return DIERR_NOTACQUIRED; #ifndef __REACTOS__ __wine_check_for_events( QS_ALLINPUT ); #endif 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, len, &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); warp_check( This, FALSE ); return DI_OK; }
/****************************************************************************** * Unacquire : frees the mouse */ static HRESULT WINAPI SysMouseWImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; TRACE("(this=%p)\n",This); if ((res = IDirectInputDevice2WImpl_Unacquire(iface)) != DI_OK) return res; if (This->base.dwCoopLevel & DISCL_EXCLUSIVE) { ClipCursor(NULL); ShowCursor(TRUE); /* show cursor */ This->clipped = FALSE; } /* And put the mouse cursor back where it was at acquire time */ if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON) { TRACE("warping mouse back to %s\n", wine_dbgstr_point(&This->org_coords)); SetCursorPos(This->org_coords.x, This->org_coords.y); } return DI_OK; }
/****************************************************************************** * GetCapabilities : get the device capabilities */ static HRESULT WINAPI SysKeyboardWImpl_GetCapabilities(LPDIRECTINPUTDEVICE8W iface, LPDIDEVCAPS lpDIDevCaps) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); DIDEVCAPS devcaps; TRACE("(this=%p,%p)\n",This,lpDIDevCaps); if ((lpDIDevCaps->dwSize != sizeof(DIDEVCAPS)) && (lpDIDevCaps->dwSize != sizeof(DIDEVCAPS_DX3))) { WARN("invalid parameter\n"); return DIERR_INVALIDPARAM; } devcaps.dwSize = lpDIDevCaps->dwSize; devcaps.dwFlags = DIDC_ATTACHED; if (This->base.dinput->dwVersion >= 0x0800) devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8); else devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); devcaps.dwAxes = 0; devcaps.dwButtons = This->base.data_format.wine_df->dwNumObjs; devcaps.dwPOVs = 0; devcaps.dwFFSamplePeriod = 0; devcaps.dwFFMinTimeResolution = 0; devcaps.dwFirmwareRevision = 100; devcaps.dwHardwareRevision = 100; devcaps.dwFFDriverVersion = 0; memcpy(lpDIDevCaps, &devcaps, lpDIDevCaps->dwSize); return DI_OK; }
/****************************************************************************** * GetDeviceData : gets buffered input data. */ static HRESULT WINAPI SysMouseWImpl_GetDeviceData(LPDIRECTINPUTDEVICE8W iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; res = IDirectInputDevice2WImpl_GetDeviceData(iface, dodsize, dod, entries, flags); if (SUCCEEDED(res)) warp_check( This, FALSE ); return res; }
/****************************************************************************** * GetProperty : get input device properties */ HRESULT WINAPI JoystickWGenericImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p,%s,%p)\n", iface, debugstr_guid(rguid), pdiph); if (TRACE_ON(dinput)) _dump_DIPROPHEADER(pdiph); if (IS_DIPROP(rguid)) { switch (LOWORD(rguid)) { case (DWORD_PTR) DIPROP_RANGE: { LPDIPROPRANGE pr = (LPDIPROPRANGE)pdiph; int obj = find_property(&This->base.data_format, pdiph); /* The app is querying the current range of the axis * return the lMin and lMax values */ if (obj >= 0) { pr->lMin = This->props[obj].lMin; pr->lMax = This->props[obj].lMax; TRACE("range(%d, %d) obj=%d\n", pr->lMin, pr->lMax, obj); return DI_OK; } break; } case (DWORD_PTR) DIPROP_DEADZONE: { LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph; int obj = find_property(&This->base.data_format, pdiph); if (obj >= 0) { pd->dwData = This->props[obj].lDeadZone; TRACE("deadzone(%d) obj=%d\n", pd->dwData, obj); return DI_OK; } break; } case (DWORD_PTR) DIPROP_SATURATION: { LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph; int obj = find_property(&This->base.data_format, pdiph); if (obj >= 0) { pd->dwData = This->props[obj].lSaturation; TRACE("saturation(%d) obj=%d\n", pd->dwData, obj); return DI_OK; } break; } default: return IDirectInputDevice2WImpl_GetProperty(iface, rguid, pdiph); } } return DI_OK; }
static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); DIDATAFORMAT data_format; DIOBJECTDATAFORMAT *obj_df = NULL; int i, action = 0, num_actions = 0; if (This->base.acquired) return DIERR_ACQUIRED; data_format.dwSize = sizeof(data_format); data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT); data_format.dwFlags = DIDF_ABSAXIS; data_format.dwDataSize = lpdiaf->dwDataSize; /* count the actions */ for (i=0; i < lpdiaf->dwNumActions; i++) if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance)) num_actions++; if (num_actions == 0) return DI_NOEFFECT; This->base.num_actions = num_actions; /* Construct the dataformat and actionmap */ obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions); data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df; data_format.dwNumObjs = num_actions; This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions); for (i = 0; i < lpdiaf->dwNumActions; i++) { if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance)) { int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID); memcpy(&obj_df[action], &c_dfDIKeyboard.rgodf[instance], c_dfDIKeyboard.dwObjSize); This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData; This->base.action_map[action].offset = action; obj_df[action].dwOfs = action; action++; } } IDirectInputDevice8_SetDataFormat(iface, &data_format); HeapFree(GetProcessHeap(), 0, obj_df); return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags); }
HRESULT WINAPI JoystickWGenericImpl_Poll(LPDIRECTINPUTDEVICE8W iface) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p)\n",This); if (!This->base.acquired) { WARN("not acquired\n"); return DIERR_NOTACQUIRED; } This->joy_polldev(IDirectInputDevice8A_from_impl(This)); return DI_OK; }
static HRESULT WINAPI SysKeyboardWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW pdidi) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(this=%p,%p)\n", This, pdidi); if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW)) { WARN(" dinput3 not supported yet...\n"); return DI_OK; } fill_keyboard_dideviceinstanceW(pdidi, This->base.dinput->dwVersion); return DI_OK; }
static HRESULT WINAPI JoystickLinuxWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW ddi) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p) %p\n", This, ddi); if (ddi == NULL) return E_POINTER; if ((ddi->dwSize != sizeof(DIDEVICEINSTANCE_DX3W)) && (ddi->dwSize != sizeof(DIDEVICEINSTANCEW))) return DIERR_INVALIDPARAM; fill_joystick_dideviceinstanceW( ddi, This->generic.base.dinput->dwVersion, get_joystick_index(&This->generic.base.guid) ); return DI_OK; }
static HRESULT WINAPI SysKeyboardWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; TRACE("(%p)\n", This); res = IDirectInputDevice2WImpl_Acquire(iface); if (res == DI_OK) { TRACE("clearing keystate\n"); memset(This->DInputKeyState, 0, sizeof(This->DInputKeyState)); } return res; }
static HRESULT WINAPI JoystickWImpl_SetProperty(IDirectInputDevice8W *iface, const GUID *prop, const DIPROPHEADER *header) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("%p %s %p\n", This, debugstr_guid(prop), header); switch(LOWORD(prop)) { case (DWORD_PTR)DIPROP_AUTOCENTER: return osx_set_autocenter(This, (const DIPROPDWORD *)header); case (DWORD_PTR)DIPROP_FFGAIN: return osx_set_ffgain(This, (const DIPROPDWORD *)header); } return JoystickWGenericImpl_SetProperty(iface, prop, header); }
/****************************************************************************** * Acquire : gets exclusive control of the mouse */ static HRESULT WINAPI SysMouseWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); POINT point; HRESULT res; TRACE("(this=%p)\n",This); if ((res = IDirectInputDevice2WImpl_Acquire(iface)) != DI_OK) return res; /* Init the mouse state */ GetCursorPos( &point ); if (This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS) { This->m_state.lX = point.x; This->m_state.lY = point.y; } else { This->m_state.lX = 0; This->m_state.lY = 0; This->org_coords = point; } This->m_state.lZ = 0; This->m_state.rgbButtons[0] = GetKeyState(VK_LBUTTON) & 0x80; This->m_state.rgbButtons[1] = GetKeyState(VK_RBUTTON) & 0x80; This->m_state.rgbButtons[2] = GetKeyState(VK_MBUTTON) & 0x80; if (This->base.dwCoopLevel & DISCL_EXCLUSIVE) { ShowCursor(FALSE); /* hide cursor */ warp_check( This, TRUE ); } else if (This->warp_override == WARP_FORCE_ON) { /* Need a window to warp mouse in. */ if (!This->base.win) This->base.win = GetDesktopWindow(); warp_check( This, TRUE ); } else if (This->clipped) { ClipCursor( NULL ); This->clipped = FALSE; } return DI_OK; }
/****************************************************************************** * GetDeviceState : returns the "state" of the joystick. * */ HRESULT WINAPI JoystickWGenericImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p,0x%08x,%p)\n", This, len, ptr); if (!This->base.acquired) { WARN("not acquired\n"); return DIERR_NOTACQUIRED; } /* update joystick state */ This->joy_polldev(IDirectInputDevice8A_from_impl(This)); /* convert and copy data to user supplied buffer */ fill_DataFormat(ptr, len, &This->js, &This->base.data_format); return DI_OK; }
static HRESULT WINAPI JoystickWImpl_SendForceFeedbackCommand(IDirectInputDevice8W *iface, DWORD flags) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT hr; TRACE("%p 0x%x\n", This, flags); if(!This->ff) return DI_NOEFFECT; hr = osx_to_win32_hresult(FFDeviceSendForceFeedbackCommand(This->ff, flags)); if(FAILED(hr)) { WARN("FFDeviceSendForceFeedbackCommand failed: %08x\n", hr); return hr; } return S_OK; }
static HRESULT WINAPI JoystickWImpl_CreateEffect(IDirectInputDevice8W *iface, const GUID *type, const DIEFFECT *params, IDirectInputEffect **out, IUnknown *outer) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); EffectImpl *effect; HRESULT hr; TRACE("%p %s %p %p %p\n", iface, debugstr_guid(type), params, out, outer); dump_DIEFFECT(params, type, 0); if(!This->ff) { TRACE("No force feedback support\n"); *out = NULL; return S_OK; } if(outer) WARN("aggregation not implemented\n"); effect = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This)); effect->IDirectInputEffect_iface.lpVtbl = &EffectVtbl; effect->ref = 1; effect->guid = *type; effect->device = This; /* Mac's FFEFFECT and Win's DIEFFECT are binary identical. */ hr = osx_to_win32_hresult(FFDeviceCreateEffect(This->ff, effect_win_to_mac(type), (FFEFFECT*)params, &effect->effect)); if(FAILED(hr)) { WARN("FFDeviceCreateEffect failed: %08x\n", hr); HeapFree(GetProcessHeap(), 0, effect); return hr; } list_add_tail(&This->effects, &effect->entry); *out = &effect->IDirectInputEffect_iface; TRACE("allocated effect: %p\n", effect); return S_OK; }
/****************************************************************************** * GetProperty : get input device properties */ static HRESULT WINAPI SysMouseWImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph) { SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface); TRACE("(%p) %s,%p\n", This, debugstr_guid(rguid), pdiph); _dump_DIPROPHEADER(pdiph); if (IS_DIPROP(rguid)) { switch (LOWORD(rguid)) { case (DWORD_PTR) DIPROP_GRANULARITY: { LPDIPROPDWORD pr = (LPDIPROPDWORD) pdiph; /* We'll just assume that the app asks about the Z axis */ pr->dwData = WHEEL_DELTA; break; } case (DWORD_PTR) DIPROP_RANGE: { LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph; if ((pdiph->dwHow == DIPH_BYID) && ((pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS)) || (pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS)))) { /* Querying the range of either the X or the Y axis. As I do not know the range, do as if the range were unrestricted...*/ pr->lMin = DIPROPRANGE_NOMIN; pr->lMax = DIPROPRANGE_NOMAX; } break; } default: return IDirectInputDevice2WImpl_GetProperty(iface, rguid, pdiph); } } return DI_OK; }
/****************************************************************************** * Unacquire : frees the joystick */ static HRESULT WINAPI JoystickLinuxWImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; TRACE("(%p)\n",This); res = IDirectInputDevice2WImpl_Unacquire(iface); if (res != DI_OK) return res; if (This->joyfd!=-1) { TRACE("closing joystick device\n"); close(This->joyfd); This->joyfd = -1; return DI_OK; } return DI_NOEFFECT; }
/****************************************************************************** * SetProperty : change input device properties */ HRESULT WINAPI JoystickWGenericImpl_SetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPCDIPROPHEADER ph) { JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface); DWORD i; TRACE("(%p,%s,%p)\n",This,debugstr_guid(rguid),ph); if (ph == NULL) { WARN("invalid parameter: ph == NULL\n"); return DIERR_INVALIDPARAM; } if (TRACE_ON(dinput)) _dump_DIPROPHEADER(ph); if (IS_DIPROP(rguid)) { switch (LOWORD(rguid)) { case (DWORD_PTR)DIPROP_RANGE: { LPCDIPROPRANGE pr = (LPCDIPROPRANGE)ph; if (ph->dwHow == DIPH_DEVICE) { TRACE("proprange(%d,%d) all\n", pr->lMin, pr->lMax); for (i = 0; i < This->base.data_format.wine_df->dwNumObjs; i++) { This->props[i].lMin = pr->lMin; This->props[i].lMax = pr->lMax; } } else { int obj = find_property(&This->base.data_format, ph); TRACE("proprange(%d,%d) obj=%d\n", pr->lMin, pr->lMax, obj); if (obj >= 0) { This->props[obj].lMin = pr->lMin; This->props[obj].lMax = pr->lMax; return DI_OK; } } break; } case (DWORD_PTR)DIPROP_DEADZONE: { LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; if (ph->dwHow == DIPH_DEVICE) { TRACE("deadzone(%d) all\n", pd->dwData); for (i = 0; i < This->base.data_format.wine_df->dwNumObjs; i++) This->props[i].lDeadZone = pd->dwData; } else { int obj = find_property(&This->base.data_format, ph); TRACE("deadzone(%d) obj=%d\n", pd->dwData, obj); if (obj >= 0) { This->props[obj].lDeadZone = pd->dwData; return DI_OK; } } break; } case (DWORD_PTR)DIPROP_SATURATION: { LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; if (ph->dwHow == DIPH_DEVICE) { TRACE("saturation(%d) all\n", pd->dwData); for (i = 0; i < This->base.data_format.wine_df->dwNumObjs; i++) This->props[i].lSaturation = pd->dwData; } else { int obj = find_property(&This->base.data_format, ph); TRACE("saturation(%d) obj=%d\n", pd->dwData, obj); if (obj >= 0) { This->props[obj].lSaturation = pd->dwData; return DI_OK; } } break; } default: return IDirectInputDevice2WImpl_SetProperty(iface, rguid, ph); } } return DI_OK; }