http://bugs.winehq.org/show_bug.cgi?id=19226
--- Comment #6 from Austin English austinenglish@gmail.com 2010-03-16 00:42:19 --- Created an attachment (id=26832) --> (http://bugs.winehq.org/attachment.cgi?id=26832) braid email
I emailed the Braid author and got a bit more info. I've attached the email, since it's got code, but here's the important comments: What the heck, I looked at it now. The code has a few layers to it, but....
In Braid, the Shift key during gameplay (for rewind) only cares if Direct Input says it is being held down.
The Shift key on the puzzle screen actually looks for a key-down event. So I would say the problem is that for some reason a key-down event is not happening in directinput for the shift key.
Here's the code that generates app-level key-down events in Braid. dik_table[] is just an array that translates DirectInput key constants into app-level key constants: ... So for some reason the event is not appearing or else DI_DOWN_FLAG is not set.
The code that sets whether a key is being held down or not does not go through this same routine.. it uses GetDeviceState every frame, for maximum robustness...
So I would guess that GetDeviceState is doing the right thing in Wine, but GetDeviceData from the keyboard is not.