📄 linuxinput.c
字号:
break; case BTN_THUMB: case BTN_B: case BTN_2: GEN_EVENT(DIJOFS_BUTTON(1),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++); This->js.rgbButtons[1] = ie.value?0x80:0x00; break; case BTN_THUMB2: case BTN_C: case BTN_3: GEN_EVENT(DIJOFS_BUTTON(2),ie.value?0x80:0x0,ie.time.tv_usec,(This->dinput->evsequence)++); This->js.rgbButtons[2] = ie.value?0x80:0x00; break; default: FIXME("unhandled joystick axe %x, value %d\n",ie.code,ie.value); break; } break; case EV_ABS: switch (ie.code) { case ABS_X: GEN_EVENT(DIJOFS_X,ie.value,ie.time.tv_usec,(This->dinput->evsequence)++); This->js.lX = map_axis(This,0,ie.value); break; case ABS_Y: GEN_EVENT(DIJOFS_Y,ie.value,ie.time.tv_usec,(This->dinput->evsequence)++); This->js.lY = map_axis(This,1,ie.value); case ABS_Z: GEN_EVENT(DIJOFS_Z,ie.value,ie.time.tv_usec,(This->dinput->evsequence)++); This->js.lZ = map_axis(This,2,ie.value); break; default: FIXME("unhandled joystick axe event (code %d, value %d)\n",ie.code,ie.value); break; } break; default: FIXME("joystick cannot handle type %d event (code %d)\n",ie.type,ie.code); break; } }}/****************************************************************************** * GetDeviceState : returns the "state" of the joystick. * */static HRESULT WINAPI JoystickAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr) { 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); switch (ph->dwObj) { case 0: /* X */ case 4: /* Y */ case 8: /* Z */ case 12: /* Rx */ case 16: /* Ry */ case 20: /* Rz */ This->wantmin[ph->dwObj/4] = pr->lMin; This->wantmax[ph->dwObj/4] = pr->lMax; break; default: FIXME("setting proprange %ld - %ld for dwObj %ld\n",pr->lMin,pr->lMax,ph->dwObj); } break; } case (DWORD)DIPROP_DEADZONE: { LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; FIXME("setting deadzone(%ld)\n",pd->dwData); This->deadz[ph->dwObj/4] = 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); int xfd = This->joyfd; int i,axes,buttons; int wasacquired = 1; TRACE("%p->(%p)\n",iface,lpDIDevCaps); if (xfd==-1) { /* yes, games assume we return something, even if unacquired */ JoystickAImpl_Acquire(iface); xfd = This->joyfd; wasacquired = 0; } lpDIDevCaps->dwFlags = DIDC_ATTACHED; lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK; axes=0; for (i=0;i<ABS_MAX;i++) if (test_bit(This->absbits,i)) axes++; buttons=0; for (i=0;i<KEY_MAX;i++) if (test_bit(This->keybits,i)) buttons++; lpDIDevCaps->dwAxes = axes; lpDIDevCaps->dwButtons = buttons; if (!wasacquired) JoystickAImpl_Unacquire(iface); 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"); } if (xfd == -1) return DIERR_NOTACQUIRED; /* Only the fields till dwFFMaxForce are relevant */ ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce); /* For the joystick, do as is done in the GetCapabilities function */ /* FIXME: needs more items */ if ((dwFlags == DIDFT_ALL) || (dwFlags & DIDFT_AXIS)) { BYTE i; for (i = 0; i < ABS_MAX; i++) { if (!test_bit(This->absbits,i)) continue; switch (i) { case ABS_X: ddoi.guidType = GUID_XAxis; ddoi.dwOfs = DIJOFS_X; break; case ABS_Y: ddoi.guidType = GUID_YAxis; ddoi.dwOfs = DIJOFS_Y; break; case ABS_Z: ddoi.guidType = GUID_ZAxis; ddoi.dwOfs = DIJOFS_Z; break; case ABS_RX: ddoi.guidType = GUID_RxAxis; ddoi.dwOfs = DIJOFS_RX; break; case ABS_RY: ddoi.guidType = GUID_RyAxis; ddoi.dwOfs = DIJOFS_RY; break; case ABS_RZ: ddoi.guidType = GUID_RzAxis; ddoi.dwOfs = DIJOFS_RZ; break; case ABS_THROTTLE: ddoi.guidType = GUID_Slider; ddoi.dwOfs = DIJOFS_SLIDER(0); break; default: FIXME("unhandled abs axis %d, ignoring!\n",i); } ddoi.dwType = DIDFT_MAKEINSTANCE((1<<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)) { int i; /*The DInput SDK says that GUID_Button is only for mouse buttons but well*/ ddoi.guidType = GUID_Button; for (i = 0; i < KEY_MAX; i++) { if (!test_bit(This->keybits,i)) continue; switch (i) { case BTN_TRIGGER: case BTN_A: case BTN_1: ddoi.dwOfs = DIJOFS_BUTTON(0); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 0) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_THUMB: case BTN_B: case BTN_2: ddoi.dwOfs = DIJOFS_BUTTON(1); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 1) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_THUMB2: case BTN_C: case BTN_3: ddoi.dwOfs = DIJOFS_BUTTON(2); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 2) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_TOP: case BTN_X: case BTN_4: ddoi.dwOfs = DIJOFS_BUTTON(3); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 3) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_TOP2: case BTN_Y: case BTN_5: ddoi.dwOfs = DIJOFS_BUTTON(4); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 4) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_PINKIE: case BTN_Z: case BTN_6: ddoi.dwOfs = DIJOFS_BUTTON(5); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 5) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_BASE: case BTN_TL: case BTN_7: ddoi.dwOfs = DIJOFS_BUTTON(6); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 6) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_BASE2: case BTN_TR: case BTN_8: ddoi.dwOfs = DIJOFS_BUTTON(7); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 7) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_BASE3: case BTN_TL2: case BTN_9: ddoi.dwOfs = DIJOFS_BUTTON(8); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 8) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_BASE4: case BTN_TR2: ddoi.dwOfs = DIJOFS_BUTTON(9); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 9) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; case BTN_BASE5: case BTN_SELECT: ddoi.dwOfs = DIJOFS_BUTTON(10); ddoi.dwType = DIDFT_MAKEINSTANCE((0x0001 << 10) << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON; break; } 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;}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 */ FIXME("unimplemented axis range query.\n"); } 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(JoystickWvt.fun))#else# define XCAST(fun) (void*)#endifstatic ICOM_VTABLE(IDirectInputDevice8W) JoystickWvt ={ 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_INPUT_H */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -