📄 linux.c
字号:
) { ICOM_THIS(JoystickImpl,iface); joy_polldev(This); TRACE("(this=%p,0x%08lx,%p)\n",This,len,ptr); if (len != sizeof(DIJOYSTATE)) { FIXME("len %ld is not sizeof(DIJOYSTATE), unsupported format.\n",len); } memcpy(ptr,&(This->js),len); This->queue_head = 0; This->queue_tail = 0; return 0;}/****************************************************************************** * GetDeviceData : gets buffered input data. */static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags) { ICOM_THIS(JoystickImpl,iface); FIXME("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx),STUB!\n",This,dodsize,*entries,flags); joy_polldev(This); if (flags & DIGDD_PEEK) FIXME("DIGDD_PEEK\n"); if (dod == NULL) { } else { } return 0;}/****************************************************************************** * SetProperty : change input device properties */static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIPROPHEADER ph){ ICOM_THIS(JoystickImpl,iface); FIXME("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph); FIXME("ph.dwSize = %ld, ph.dwHeaderSize =%ld, ph.dwObj = %ld, ph.dwHow= %ld\n",ph->dwSize, ph->dwHeaderSize,ph->dwObj,ph->dwHow); if (!HIWORD(rguid)) { switch ((DWORD)rguid) { case (DWORD) DIPROP_BUFFERSIZE: { LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; FIXME("buffersize = %ld\n",pd->dwData); break; } case (DWORD)DIPROP_RANGE: { LPCDIPROPRANGE pr = (LPCDIPROPRANGE)ph; FIXME("proprange(%ld,%ld)\n",pr->lMin,pr->lMax); This->lMin = pr->lMin; This->lMax = pr->lMax; break; } case (DWORD)DIPROP_DEADZONE: { LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; FIXME("deadzone(%ld)\n",pd->dwData); This->deadzone = pd->dwData; break; } default: FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid)); break; } } return 0;}/****************************************************************************** * SetEventNotification : specifies event to be sent on state change */static HRESULT WINAPI JoystickAImpl_SetEventNotification( LPDIRECTINPUTDEVICE8A iface, HANDLE hnd) { ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); This->hEvent = hnd; return DI_OK;}static HRESULT WINAPI JoystickAImpl_GetCapabilities( LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps){ ICOM_THIS(JoystickImpl,iface); BYTE axes,buttons; int xfd = This->joyfd; TRACE("%p->(%p)\n",iface,lpDIDevCaps); if (xfd==-1) xfd = open(JOYDEV,O_RDONLY); lpDIDevCaps->dwFlags = DIDC_ATTACHED; lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK;#ifdef JSIOCGAXES if (-1==ioctl(xfd,JSIOCGAXES,&axes)) axes = 2; lpDIDevCaps->dwAxes = axes;#endif#ifdef JSIOCGBUTTONS if (-1==ioctl(xfd,JSIOCGAXES,&buttons)) buttons = 2; lpDIDevCaps->dwButtons = buttons;#endif if (xfd!=This->joyfd) close(xfd); return DI_OK;}static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickImpl,iface); TRACE("(),stub!\n"); joy_polldev(This); return DI_OK;}/****************************************************************************** * EnumObjects : enumerate the different buttons and axis... */static HRESULT WINAPI JoystickAImpl_EnumObjects( LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags){ ICOM_THIS(JoystickImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; int xfd = This->joyfd; TRACE("(this=%p,%p,%p,%08lx)\n", This, lpCallback, lpvRef, dwFlags); if (TRACE_ON(dinput)) { TRACE(" - flags = "); _dump_EnumObjects_flags(dwFlags); TRACE("\n"); } /* Only the fields till dwFFMaxForce are relevant */ ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce); /* For the joystick, do as is done in the GetCapabilities function */ if ((dwFlags == DIDFT_ALL) || (dwFlags & DIDFT_AXIS)) { BYTE axes, i;#ifdef JSIOCGAXES if (-1==ioctl(xfd,JSIOCGAXES,&axes)) axes = 2;#endif for (i = 0; i < axes; i++) { switch (i) { case 0: ddoi.guidType = GUID_XAxis; ddoi.dwOfs = DIJOFS_X; break; case 1: ddoi.guidType = GUID_YAxis; ddoi.dwOfs = DIJOFS_Y; break; case 2: ddoi.guidType = GUID_ZAxis; ddoi.dwOfs = DIJOFS_Z; break; default: ddoi.guidType = GUID_Unknown; ddoi.dwOfs = DIJOFS_Z + (i - 2) * sizeof(LONG); } ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << i) << WINE_JOYSTICK_AXIS_BASE) | DIDFT_ABSAXIS; sprintf(ddoi.tszName, "%d-Axis", i); _dump_OBJECTINSTANCEA(&ddoi); if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK; } } if ((dwFlags == DIDFT_ALL) || (dwFlags & DIDFT_BUTTON)) { BYTE buttons, i;#ifdef JSIOCGBUTTONS if (-1==ioctl(xfd,JSIOCGAXES,&buttons)) buttons = 2;#endif /* The DInput SDK says that GUID_Button is only for mouse buttons but well... */ ddoi.guidType = GUID_Button; for (i = 0; i < buttons; i++) { ddoi.dwOfs = DIJOFS_BUTTON(i); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << i) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; sprintf(ddoi.tszName, "%d-Button", i); _dump_OBJECTINSTANCEA(&ddoi); if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK; } } if (xfd!=This->joyfd) close(xfd); return DI_OK;}/****************************************************************************** * EnumObjects : enumerate the different buttons and axis... */static HRESULT WINAPI JoystickWImpl_EnumObjects( LPDIRECTINPUTDEVICE8W iface, LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID lpvRef, DWORD dwFlags){ ICOM_THIS(JoystickImpl,iface); device_enumobjects_AtoWcb_data data; data.lpCallBack = lpCallback; data.lpvRef = lpvRef; return JoystickAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags);}/****************************************************************************** * GetProperty : get input device properties */static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph){ ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,%s,%p): stub!\n", iface, debugstr_guid(rguid), pdiph); if (TRACE_ON(dinput)) _dump_DIPROPHEADER(pdiph); if (!HIWORD(rguid)) { switch ((DWORD)rguid) { case (DWORD) DIPROP_BUFFERSIZE: { LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph; TRACE(" return buffersize = %d\n",This->queue_len); pd->dwData = This->queue_len; break; } case (DWORD) DIPROP_RANGE: { LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph; if ((pdiph->dwHow == DIPH_BYID) && (pdiph->dwObj & DIDFT_ABSAXIS)) { /* The app is querying the current range of the axis : return the lMin and lMax values */ pr->lMin = This->lMin; pr->lMax = This->lMax; } break; } default: FIXME("Unknown type %ld (%s)\n",(DWORD)rguid,debugstr_guid(rguid)); break; } } return DI_OK;}static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt ={ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2AImpl_QueryInterface, IDirectInputDevice2AImpl_AddRef, JoystickAImpl_Release, JoystickAImpl_GetCapabilities, JoystickAImpl_EnumObjects, JoystickAImpl_GetProperty, JoystickAImpl_SetProperty, JoystickAImpl_Acquire, JoystickAImpl_Unacquire, JoystickAImpl_GetDeviceState, JoystickAImpl_GetDeviceData, JoystickAImpl_SetDataFormat, JoystickAImpl_SetEventNotification, IDirectInputDevice2AImpl_SetCooperativeLevel, IDirectInputDevice2AImpl_GetObjectInfo, IDirectInputDevice2AImpl_GetDeviceInfo, IDirectInputDevice2AImpl_RunControlPanel, IDirectInputDevice2AImpl_Initialize, IDirectInputDevice2AImpl_CreateEffect, IDirectInputDevice2AImpl_EnumEffects, IDirectInputDevice2AImpl_GetEffectInfo, IDirectInputDevice2AImpl_GetForceFeedbackState, IDirectInputDevice2AImpl_SendForceFeedbackCommand, IDirectInputDevice2AImpl_EnumCreatedEffectObjects, IDirectInputDevice2AImpl_Escape, JoystickAImpl_Poll, IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, IDirectInputDevice8AImpl_BuildActionMap, IDirectInputDevice8AImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo};#if !defined(__STRICT_ANSI__) && defined(__GNUC__)# define XCAST(fun) (typeof(SysJoystickWvt.fun))#else# define XCAST(fun) (void*)#endifstatic ICOM_VTABLE(IDirectInputDevice8W) SysJoystickWvt ={ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2WImpl_QueryInterface, XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, XCAST(Release)JoystickAImpl_Release, XCAST(GetCapabilities)JoystickAImpl_GetCapabilities, JoystickWImpl_EnumObjects, XCAST(GetProperty)JoystickAImpl_GetProperty, XCAST(SetProperty)JoystickAImpl_SetProperty, XCAST(Acquire)JoystickAImpl_Acquire, XCAST(Unacquire)JoystickAImpl_Unacquire, XCAST(GetDeviceState)JoystickAImpl_GetDeviceState, XCAST(GetDeviceData)JoystickAImpl_GetDeviceData, XCAST(SetDataFormat)JoystickAImpl_SetDataFormat, XCAST(SetEventNotification)JoystickAImpl_SetEventNotification, XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel, IDirectInputDevice2WImpl_GetObjectInfo, IDirectInputDevice2WImpl_GetDeviceInfo, XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, IDirectInputDevice2WImpl_EnumEffects, IDirectInputDevice2WImpl_GetEffectInfo, XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState, XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand, XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects, XCAST(Escape)IDirectInputDevice2AImpl_Escape, XCAST(Poll)JoystickAImpl_Poll, XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7WImpl_EnumEffectsInFile, IDirectInputDevice7WImpl_WriteEffectToFile, IDirectInputDevice8WImpl_BuildActionMap, IDirectInputDevice8WImpl_SetActionMap, IDirectInputDevice8WImpl_GetImageInfo};#undef XCAST#endif /* HAVE_LINUX_22_JOYSTICK_API */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -