From 3f6a52c007ba3edbb9c9ca058a4e3f1b4e4a242c Mon Sep 17 00:00:00 2001 From: "masayuki%d-toybox.com" Date: Thu, 25 Oct 2007 06:51:10 +0000 Subject: [PATCH] Bug 399740 FAYT (find as you type) fails r=josh, sr=roc, aM9=beltzner git-svn-id: svn://10.0.0.236/trunk@238133 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/cocoa/nsChildView.mm | 44 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/mozilla/widget/src/cocoa/nsChildView.mm b/mozilla/widget/src/cocoa/nsChildView.mm index 0673a3a4663..51db91b574a 100644 --- a/mozilla/widget/src/cocoa/nsChildView.mm +++ b/mozilla/widget/src/cocoa/nsChildView.mm @@ -3161,7 +3161,7 @@ enum kControlKeyCode = 0x3B, kOptionkeyCode = 0x3A, // both left and right option keys kClearKeyCode = 0x47, - + // function keys kF1KeyCode = 0x7A, kF2KeyCode = 0x78, @@ -3234,12 +3234,24 @@ enum }; +static PRBool IsPrintableChar(PRUnichar aChar) +{ + return (aChar >= 0x20 && aChar <= 0x7E) || aChar >= 0xA0; +} + static PRUint32 GetGeckoKeyCodeFromChar(PRUnichar aChar) { // We don't support the key code for non-ASCII characters - if (aChar > 0x7F) + if (aChar > 0x7E) return 0; + if (aChar >= 'a' && aChar <= 'z') // lowercase + return PRUint32(toupper(aChar)); + else if (aChar >= 'A' && aChar <= 'Z') // uppercase + return PRUint32(aChar); + else if (aChar >= '0' && aChar <= '9') + return PRUint32(aChar - '0' + NS_VK_0); + switch (aChar) { case kReturnCharCode: @@ -3265,15 +3277,14 @@ static PRUint32 GetGeckoKeyCodeFromChar(PRUnichar aChar) case '/': return NS_VK_SLASH; case '`': return NS_VK_BACK_QUOTE; case '\t': return NS_VK_TAB; + case '-': return NS_VK_SUBTRACT; + case '+': return NS_VK_ADD; default: - if (aChar >= 'a' && aChar <= 'z') // lowercase - return PRUint32(toupper(aChar)); - else if (aChar >= 'A' && aChar <= 'Z') // uppercase - return PRUint32(aChar); - } - NS_WARNING("GetGeckoKeyCodeFromChar has failed."); - return 0; + if (!IsPrintableChar(aChar)) + NS_WARNING("GetGeckoKeyCodeFromChar has failed."); + return 0; + } } @@ -3593,6 +3604,7 @@ static PRBool IsSpecialGeckoKey(UInt32 macKeyCode) nsKeyEvent geckoEvent(PR_TRUE, NS_KEY_PRESS, mGeckoChild); geckoEvent.time = PR_IntervalNow(); geckoEvent.charCode = bufPtr[0]; // gecko expects OS-translated unicode + geckoEvent.keyCode = 0; geckoEvent.isChar = PR_TRUE; if (mKeyHandled) geckoEvent.flags |= NS_EVENT_FLAG_NO_DEFAULT; @@ -3606,12 +3618,18 @@ static PRBool IsSpecialGeckoKey(UInt32 macKeyCode) ConvertCocoaKeyEventToMacEvent(mCurKeyEvent, macEvent); geckoEvent.nativeMsg = &macEvent; geckoEvent.isShift = ([mCurKeyEvent modifierFlags] & NSShiftKeyMask) != 0; - geckoEvent.keyCode = - ConvertMacToGeckoKeyCode([mCurKeyEvent keyCode], &geckoEvent, - [mCurKeyEvent charactersIgnoringModifiers]); + if (!IsPrintableChar(geckoEvent.charCode)) { + geckoEvent.keyCode = + ConvertMacToGeckoKeyCode([mCurKeyEvent keyCode], &geckoEvent, + [mCurKeyEvent charactersIgnoringModifiers]); + geckoEvent.charCode = 0; + } } else { // Note that insertText is not called only at key pressing. - geckoEvent.keyCode = GetGeckoKeyCodeFromChar(geckoEvent.charCode); + if (!IsPrintableChar(geckoEvent.charCode)) { + geckoEvent.keyCode = GetGeckoKeyCodeFromChar(geckoEvent.charCode); + geckoEvent.charCode = 0; + } } mGeckoChild->DispatchWindowEvent(geckoEvent);