From 6b6ee676bf68379c64b945014769b911ce40873e Mon Sep 17 00:00:00 2001 From: "bryner%netscape.com" Date: Wed, 28 May 2003 19:06:52 +0000 Subject: [PATCH] Fix up/down arrow keys in menulists by making sure not to reuse nsEvent structs for multiple event dispatches. Bug 206917, r=brade, sr=sfraser. --- widget/src/mac/nsMacEventHandler.cpp | 103 +++++++++++++++------------ 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/widget/src/mac/nsMacEventHandler.cpp b/widget/src/mac/nsMacEventHandler.cpp index 1c5a7e8eb890..760209a74bad 100644 --- a/widget/src/mac/nsMacEventHandler.cpp +++ b/widget/src/mac/nsMacEventHandler.cpp @@ -1174,47 +1174,55 @@ PRBool nsMacEventHandler::HandleKeyEvent(EventRecord& aOSEvent) focusedWidget = mTopLevelWidget; // nsEvent - nsKeyEvent keyEvent; switch (aOSEvent.what) { case keyUp: - InitializeKeyEvent(keyEvent,aOSEvent,focusedWidget,NS_KEY_UP); - result = focusedWidget->DispatchWindowEvent(keyEvent); - break; - - case keyDown: - InitializeKeyEvent(keyEvent,aOSEvent,focusedWidget,NS_KEY_DOWN); - result = focusedWidget->DispatchWindowEvent(keyEvent); - - // get the focused widget again in case something happened to it on the previous event - checkFocusedWidget = gEventDispatchHandler.GetActive(); - if (!checkFocusedWidget) - checkFocusedWidget = mTopLevelWidget; - - // if this isn't the same widget we had before, we should not send a keypress - if (checkFocusedWidget != focusedWidget) - return result; - - InitializeKeyEvent(keyEvent,aOSEvent,focusedWidget,NS_KEY_PRESS); - - // before we dispatch this key, check if it's the contextmenu key. - // If so, send a context menu event instead. - if ( IsContextMenuKey(keyEvent) ) { - nsMouseEvent contextMenuEvent; - ConvertKeyEventToContextMenuEvent(&keyEvent, &contextMenuEvent); - result = focusedWidget->DispatchWindowEvent(contextMenuEvent); - NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); + { + nsKeyEvent keyUpEvent; + InitializeKeyEvent(keyUpEvent, aOSEvent, focusedWidget, NS_KEY_UP); + result = focusedWidget->DispatchWindowEvent(keyUpEvent); + break; } - else { - result = focusedWidget->DispatchWindowEvent(keyEvent); - NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); + + case keyDown: + { + nsKeyEvent keyDownEvent, keyPressEvent; + InitializeKeyEvent(keyDownEvent, aOSEvent, focusedWidget, NS_KEY_DOWN); + result = focusedWidget->DispatchWindowEvent(keyDownEvent); + + // get the focused widget again in case something happened to it on the previous event + checkFocusedWidget = gEventDispatchHandler.GetActive(); + if (!checkFocusedWidget) + checkFocusedWidget = mTopLevelWidget; + + // if this isn't the same widget we had before, we should not send a keypress + if (checkFocusedWidget != focusedWidget) + return result; + + InitializeKeyEvent(keyPressEvent, aOSEvent, focusedWidget, NS_KEY_PRESS); + + // before we dispatch this key, check if it's the contextmenu key. + // If so, send a context menu event instead. + if ( IsContextMenuKey(keyPressEvent) ) { + nsMouseEvent contextMenuEvent; + ConvertKeyEventToContextMenuEvent(&keyPressEvent, &contextMenuEvent); + result = focusedWidget->DispatchWindowEvent(contextMenuEvent); + NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); + } + else { + result = focusedWidget->DispatchWindowEvent(keyPressEvent); + NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); + } + break; + } + + case autoKey: + { + nsKeyEvent keyPressEvent; + InitializeKeyEvent(keyPressEvent, aOSEvent, focusedWidget, NS_KEY_PRESS); + result = focusedWidget->DispatchWindowEvent(keyPressEvent); + break; } - break; - - case autoKey: - InitializeKeyEvent(keyEvent,aOSEvent,focusedWidget,NS_KEY_PRESS); - result = focusedWidget->DispatchWindowEvent(keyEvent); - break; } return result; @@ -1272,14 +1280,14 @@ PRBool nsMacEventHandler::HandleUKeyEvent(PRUnichar* text, long charCount, Event if (!focusedWidget) focusedWidget = mTopLevelWidget; - nsKeyEvent keyEvent; PRBool isCharacter = PR_FALSE; // simulate key down event if this isn't an autoKey event if (aOSEvent.what == keyDown) { - InitializeKeyEvent(keyEvent, aOSEvent, focusedWidget, NS_KEY_DOWN, &isCharacter, PR_FALSE); - result = focusedWidget->DispatchWindowEvent(keyEvent); + nsKeyEvent keyDownEvent; + InitializeKeyEvent(keyDownEvent, aOSEvent, focusedWidget, NS_KEY_DOWN, &isCharacter, PR_FALSE); + result = focusedWidget->DispatchWindowEvent(keyDownEvent); NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent keydown"); // check if focus changed; see also HandleKeyEvent above @@ -1291,7 +1299,8 @@ PRBool nsMacEventHandler::HandleUKeyEvent(PRUnichar* text, long charCount, Event } // simulate key press events - InitializeKeyEvent(keyEvent, aOSEvent, focusedWidget, NS_KEY_PRESS, &isCharacter, PR_FALSE); + nsKeyEvent keyPressEvent; + InitializeKeyEvent(keyPressEvent, aOSEvent, focusedWidget, NS_KEY_PRESS, &isCharacter, PR_FALSE); if (isCharacter) { @@ -1299,31 +1308,31 @@ PRBool nsMacEventHandler::HandleUKeyEvent(PRUnichar* text, long charCount, Event PRInt32 i; for (i = 0; i < charCount; i++) { - keyEvent.charCode = text[i]; + keyPressEvent.charCode = text[i]; // this block of code is triggered when user presses // a combination such as command-shift-M - if (keyEvent.isShift && keyEvent.charCode <= 'z' && keyEvent.charCode >= 'a') - keyEvent.charCode -= 32; + if (keyPressEvent.isShift && keyPressEvent.charCode <= 'z' && keyPressEvent.charCode >= 'a') + keyPressEvent.charCode -= 32; // before we dispatch a key, check if it's the context menu key. // If so, send a context menu event instead. - if ( IsContextMenuKey(keyEvent) ) { + if ( IsContextMenuKey(keyPressEvent) ) { nsMouseEvent contextMenuEvent; - ConvertKeyEventToContextMenuEvent(&keyEvent, &contextMenuEvent); + ConvertKeyEventToContextMenuEvent(&keyPressEvent, &contextMenuEvent); result = focusedWidget->DispatchWindowEvent(contextMenuEvent); NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); } else { // command / shift keys, etc. only send once - result = focusedWidget->DispatchWindowEvent(keyEvent); + result = focusedWidget->DispatchWindowEvent(keyPressEvent); NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); } } } else { // command / shift keys, etc. only send once - result = focusedWidget->DispatchWindowEvent(keyEvent); + result = focusedWidget->DispatchWindowEvent(keyPressEvent); NS_ASSERTION(NS_SUCCEEDED(result), "cannot DispatchWindowEvent"); } return result;