Vincent & list, On Tue, Nov 24, 2009 at 05:26, Vincent Povirk <madewokherd+8cd9@xxxxxxxxx> wrote: > > I don't have an Xbox 360 controller myself, so I haven't looked at > this in much detail. > > Microsoft has a reference for xinput at > http://msdn.microsoft.com/en-us/library/ee416996(VS.85).aspx. From > what I can remember, the API itself is very simple and shouldn't > require a detailed understanding of other parts of Wine. > > The generic joystick support is in dinput. According to > http://msdn.microsoft.com/en-us/library/ee417014(VS.85).aspx, dinput > doesn't support some features that are in xinput. Since we don't like > to add new features to a windows dll, I don't think xinput should use > dinput. Also, I worry that you might not get a consistent button > mapping between operating systems, and that you may need to use some > more direct interface to be sure you get it right. But I could be > wrong. > > As far as I know, no one is working on this, so by all means go for it. Thanks for the tips. After a closer inspection it seems I was wrong, and actually the IDirectInput implementation needs to be extended. Namely EnumDevicesBySemantics and SetActionMap. See below for details. With some initial difficulty I hacked together an implementation of EnumDevicesBySemantics that passes the first joystick (first device in the GAMECTRL category, as a test) and now the game is moving forward with a calls to IDirectInput::SetActionMap on those devices. After that the game is playable, but unfortunately there is no joystick support, yet. The input loop polls all devices ad infinitum with IDirectInputDevice::GetDeviceData. So every two messages listing the length of the keyboard and mouse event, there is a copy of the following messages: trace:dinput:IDirectInputDevice2AImpl_SetCooperativeLevel (0x213418) 0x50024,0x0000000a trace:dinput:_dump_cooperativelevel_DI cooperative level : DISCL_BACKGROUND DISCL_NONEXCLUSIVE trace:dinput:JoystickAImpl_Acquire (this=0x213418) trace:dinput:IDirectInputDevice2AImpl_Acquire no user data format warn:dinput:JoystickAImpl_Acquire Failed to acquire: 80070057 According to Wine's code and to the MSDN, Acquire cannot succeed without a call to SetActionMap or SetDataFormat. The latter is implemented, but is only used for setting up the mouse and the keyboard; the former is an empty stub, which means the setup required by Acquire never happens. Has anybody looked into a proper implementation of EnumDevicesBySemantics and SetActionMap? Both seem to rely in the "action mapping constants," which at first look seem kinda scary. I know little to nothing about DInput, but for mice and keyboards the initialization seems over after SetDataFormat, so I expect SetActionMap is the last step for joysticks and game pads (there are a couple extra calls common to all devices which seem fully implemented).