wm_key or wm_ syskey message fix.
Rein Klazes
rklazes at xs4all.nl
Fri Oct 24 10:42:48 CDT 2003
Hi,
The following fixes a crash in Agent newsreader.
ALT-key down and then ALT-up generates a WM_SYSKEYUP message.
ALT-key down, followed by a normal key, then the ALT-up will generate a
WM_KEYUP message instead.
Wine got this and lots of other keystroke combinations wrong.
The following has been tested with all combinations of ALT+X,
ALT+SHIFT+X, ALT+CONTROL+X and SHIFT+CONTROL+X keyevent combinations (X
is the key 'X') to conform with Win2000. Test to be sumbmitted
separately.
Changelog:
windows : input.c
Correct the logic that decides whether a WM_SYSKEYUP/DOWN or a
WM_KEYUP/DOWN message is to be sent.
Rein.
--
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- wine/windows/input.c 2003-09-06 13:49:15.000000000 +0200
+++ mywine/windows/input.c 2003-10-24 16:41:35.000000000 +0200
@@ -55,6 +55,8 @@
BYTE InputKeyStateTable[256];
BYTE AsyncKeyStateTable[256];
+BYTE TrackSysKey = 0; /* determine whether ALT key up will cause a WM_SYSKEYUP
+ or a WM_KEYUP message */
/* Storage for the USER-maintained mouse positions */
static DWORD PosX, PosY;
@@ -152,14 +154,21 @@
/* it's '1' under windows, when a dialog box appears
* and you press one of the underlined keys - DF*/
+ /* note that there is a test for all this */
if (ki->dwFlags & KEYEVENTF_KEYUP )
{
- BOOL sysKey = (InputKeyStateTable[VK_MENU] & 0x80) &&
- !(InputKeyStateTable[VK_CONTROL] & 0x80);
+ message = WM_KEYUP;
+ if( (InputKeyStateTable[VK_MENU] & 0x80) && (
+ (ki->wVk == VK_MENU) || (ki->wVk == VK_CONTROL) ||
+ !(InputKeyStateTable[VK_CONTROL] & 0x80))) {
+ if( TrackSysKey == VK_MENU || /* <ALT>-down/<ALT>-up sequence */
+ (ki->wVk != VK_MENU)) /* <ALT>-down...<something else>-up */
+ message = WM_SYSKEYUP;
+ TrackSysKey = 0;
+ }
InputKeyStateTable[ki->wVk] &= ~0x80;
keylp.lp1.previous = 1;
keylp.lp1.transition = 1;
- message = sysKey ? WM_SYSKEYUP : WM_KEYUP;
}
else
{
@@ -169,8 +178,12 @@
InputKeyStateTable[ki->wVk] |= 0x80;
AsyncKeyStateTable[ki->wVk] |= 0x80;
- message = (InputKeyStateTable[VK_MENU] & 0x80) && !(InputKeyStateTable[VK_CONTROL] & 0x80)
- ? WM_SYSKEYDOWN : WM_KEYDOWN;
+ message = WM_KEYDOWN;
+ if( (InputKeyStateTable[VK_MENU] & 0x80) &&
+ !(InputKeyStateTable[VK_CONTROL] & 0x80)) {
+ message = WM_SYSKEYDOWN;
+ TrackSysKey = ki->wVk;
+ }
}
keylp.lp1.context = (InputKeyStateTable[VK_MENU] & 0x80) != 0; /* 1 if alt */
More information about the wine-patches
mailing list