static void joy_polldev(LPDIRECTINPUTDEVICE8A iface) { struct pollfd plfd; struct js_event jse; JoystickImpl *This = impl_from_IDirectInputDevice8A(iface); TRACE("(%p)\n", This); if (This->joyfd==-1) { WARN("no device\n"); return; } while (1) { LONG value; int inst_id = -1; plfd.fd = This->joyfd; plfd.events = POLLIN; if (poll(&plfd,1,0) != 1) return; /* we have one event, so we can read */ if (sizeof(jse)!=read(This->joyfd,&jse,sizeof(jse))) { return; } TRACE("js_event: type 0x%x, number %d, value %d\n", jse.type,jse.number,jse.value); if (jse.type & JS_EVENT_BUTTON) { if (jse.number >= This->generic.devcaps.dwButtons) return; inst_id = DIDFT_MAKEINSTANCE(jse.number) | DIDFT_PSHBUTTON; This->generic.js.rgbButtons[jse.number] = value = jse.value ? 0x80 : 0x00; } else if (jse.type & JS_EVENT_AXIS) { int number = This->generic.axis_map[jse.number]; /* wine format object index */ if (number < 0) return; inst_id = number < 8 ? DIDFT_MAKEINSTANCE(number) | DIDFT_ABSAXIS : DIDFT_MAKEINSTANCE(number - 8) | DIDFT_POV; value = joystick_map_axis(&This->generic.props[id_to_object(This->generic.base.data_format.wine_df, inst_id)], jse.value); TRACE("changing axis %d => %d\n", jse.number, number); switch (number) { case 0: This->generic.js.lX = value; break; case 1: This->generic.js.lY = value; break; case 2: This->generic.js.lZ = value; break; case 3: This->generic.js.lRx = value; break; case 4: This->generic.js.lRy = value; break; case 5: This->generic.js.lRz = value; break; case 6: This->generic.js.rglSlider[0] = value; break; case 7: This->generic.js.rglSlider[1] = value; break; case 8: case 9: case 10: case 11: { int idx = number - 8; if (jse.number % 2) This->povs[idx].y = jse.value; else This->povs[idx].x = jse.value; This->generic.js.rgdwPOV[idx] = value = joystick_map_pov(&This->povs[idx]); break; } default: WARN("axis %d not supported\n", number); } } if (inst_id >= 0) queue_event(iface, inst_id, value, jse.time, This->generic.base.dinput->evsequence++); } }
/* convert wine format offset to user format object index */ static void joy_polldev(JoystickImpl *This) { struct pollfd plfd; struct input_event ie; if (This->joyfd==-1) return; while (1) { LONG value = 0; int inst_id = -1; plfd.fd = This->joyfd; plfd.events = POLLIN; if (poll(&plfd,1,0) != 1) return; /* we have one event, so we can read */ if (sizeof(ie)!=read(This->joyfd,&ie,sizeof(ie))) return; TRACE("input_event: type %d, code %d, value %d\n",ie.type,ie.code,ie.value); switch (ie.type) { case EV_KEY: /* button */ { int btn = This->buttons[ie.code]; TRACE("(%p) %d -> %d\n", This, ie.code, btn); if (btn & 0x80) { btn &= 0x7F; inst_id = DIDFT_MAKEINSTANCE(btn) | DIDFT_PSHBUTTON; This->js.rgbButtons[btn] = value = ie.value ? 0x80 : 0x00; } break; } case EV_ABS: { int axis = This->axes[ie.code]; if (axis==-1) { break; } inst_id = DIDFT_MAKEINSTANCE(axis) | (ie.code < ABS_HAT0X ? DIDFT_ABSAXIS : DIDFT_POV); value = joystick_map_axis(&This->props[id_to_object(This->base.data_format.wine_df, inst_id)], ie.value); switch (ie.code) { case ABS_X: This->js.lX = value; break; case ABS_Y: This->js.lY = value; break; case ABS_Z: This->js.lZ = value; break; case ABS_RX: This->js.lRx = value; break; case ABS_RY: This->js.lRy = value; break; case ABS_RZ: This->js.lRz = value; break; case ABS_THROTTLE: This->js.rglSlider[0] = value; break; case ABS_RUDDER: This->js.rglSlider[1] = value; break; case ABS_HAT0X: case ABS_HAT0Y: case ABS_HAT1X: case ABS_HAT1Y: case ABS_HAT2X: case ABS_HAT2Y: case ABS_HAT3X: case ABS_HAT3Y: { int idx = (ie.code - ABS_HAT0X) / 2; if (ie.code % 2) This->povs[idx].y = ie.value; else This->povs[idx].x = ie.value; This->js.rgdwPOV[idx] = value = joystick_map_pov(&This->povs[idx]); break; } default: FIXME("unhandled joystick axis event (code %d, value %d)\n",ie.code,ie.value); } break; } #ifdef HAVE_STRUCT_FF_EFFECT_DIRECTION case EV_FF_STATUS: This->ff_state = ie.value; break; #endif #ifdef EV_SYN case EV_SYN: /* there is nothing to do */ break; #endif default: FIXME("joystick cannot handle type %d event (code %d)\n",ie.type,ie.code); break; } if (inst_id >= 0) queue_event((LPDIRECTINPUTDEVICE8A)This, id_to_offset(&This->base.data_format, inst_id), value, ie.time.tv_usec, This->base.dinput->evsequence++); } }