⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linuxinput.c

📁 Wine-20031016
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -