http://bugs.winehq.org/show_bug.cgi?id=7609
------- Additional Comments From vladimirkadlec@gmail.com 2007-04-03 21:16 ------- To be precise, the problem is in function X11DRV_KeyEvent, line 1370. The patch changes: if (xic) to the if (xic && event->type == KeyPress) I agree that this is correct. The previous incorrect call of XmbLookupString has a side effect, that (e.g. for left shift) sets status=1 and keysym=0 on KeyRelease. Because of keysym=0 the code reaches EVENT_event_to_vkey call (line 1424).
The patch disables this side effect, so e.g. on left shift KeyRelease the keysym is 0xfe0a (ISO_Prev_Group) and it's ignored by condition on 1377. When I add a hack to this condition (&& keysym != XK_ISO_Prev_Group), then the left shift works.
I also overlooked this: warn:keyboard:X11DRV_KEYBOARD_DetectLayout 8 keysyms per keycode not supported, set to 4 warn:keyboard:X11DRV_InitKeyboard vkey 0010 is being used by more than one keycode
Both shifts have keycodes 0x32, which are converted to virtKey=0010. Maybe, this is the problem?
I remember exactly the same problem (reporting XK_ISO_Prev_Group on shifts, and shifts "instantly" pressed) several years ago with console in moreQuakeWorld linux client. I reported it to the author and it was fixed. But it's more than 5 years, so I don't remember the details.