diff --git a/build/win32/platform_specific_code/juce_win32_Windowing.cpp b/build/win32/platform_specific_code/juce_win32_Windowing.cpp index 658e9922aa..bb086992b6 100644 --- a/build/win32/platform_specific_code/juce_win32_Windowing.cpp +++ b/build/win32/platform_specific_code/juce_win32_Windowing.cpp @@ -1676,16 +1676,23 @@ private: default: used = handleKeyUpOrDown(); - if ((currentModifiers & (ModifierKeys::ctrlModifier | ModifierKeys::altModifier)) != 0) { + MSG msg; + + if (! PeekMessage (&msg, hwnd, WM_CHAR, WM_DEADCHAR, PM_NOREMOVE)) + { + // if there isn't a WM_CHAR or WM_DEADCHAR message pending, we need to + // manually generate the key-press event that matches this key-down. + #if JUCE_ENABLE_WIN98_COMPATIBILITY - const UINT keyChar = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (key, 2) - : MapVirtualKey (key, 2); + const UINT keyChar = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (key, 2) + : MapVirtualKey (key, 2); #else - const UINT keyChar = MapVirtualKeyW (key, 2); + const UINT keyChar = MapVirtualKeyW (key, 2); #endif - used = handleKeyPress ((int) LOWORD (keyChar), 0) || used; + used = handleKeyPress ((int) LOWORD (keyChar), 0) || used; + } } break; @@ -1699,6 +1706,7 @@ private: updateKeyModifiers(); juce_wchar textChar = (juce_wchar) key; + const int virtualScanCode = (flags >> 16) & 0xff; if (key >= '0' && key <= '9') @@ -1723,9 +1731,6 @@ private: } else { - if ((currentModifiers & (ModifierKeys::ctrlModifier | ModifierKeys::altModifier)) != 0) - return false; - // convert the scan code to an unmodified character code.. #if JUCE_ENABLE_WIN98_COMPATIBILITY const UINT virtualKey = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (virtualScanCode, 1) @@ -1742,7 +1747,13 @@ private: const DWORD converted = wToUnicode (virtualKey, virtualScanCode, keyState, unicodeChar, 32, 0); if (converted > 0) - textChar = unicodeChar[0]; + { + // ahem.. can't actually remember why this section of code was originall here, + // so if you see this assertion, please let me know what you were doing at + // the time! + jassert (textChar == unicodeChar[0]); + // textChar = unicodeChar[0]; + } } #else const UINT virtualKey = MapVirtualKeyW (virtualScanCode, 1); @@ -1755,7 +1766,13 @@ private: const DWORD converted = ToUnicode (virtualKey, virtualScanCode, keyState, unicodeChar, 32, 0); if (converted > 0) - textChar = unicodeChar[0]; + { + // ahem.. can't actually remember why this section of code was originall here, + // so if you see this assertion, please let me know what you were doing at + // the time! + jassert (textChar == unicodeChar[0]); +// textChar = unicodeChar[0]; + } } #endif @@ -1763,6 +1780,10 @@ private: if (keyChar != 0) key = (int) keyChar; + + // avoid sending junk text characters for some control-key combinations + if (textChar < ' ' && (currentModifiers & (ModifierKeys::ctrlModifier | ModifierKeys::altModifier)) != 0) + textChar = 0; } return handleKeyPress (key, textChar); diff --git a/src/juce_appframework/gui/components/controls/juce_TextEditor.cpp b/src/juce_appframework/gui/components/controls/juce_TextEditor.cpp index 329888869c..af20a2ee84 100644 --- a/src/juce_appframework/gui/components/controls/juce_TextEditor.cpp +++ b/src/juce_appframework/gui/components/controls/juce_TextEditor.cpp @@ -1825,40 +1825,32 @@ bool TextEditor::keyPressed (const KeyPress& key) { newTransaction(); + int newPos; + if (isMultiLine() && key.isKeyCode (KeyPress::upKey)) - { - moveCursorTo (indexAtPosition (cursorX, cursorY - 1), - key.getModifiers().isShiftDown()); - } + newPos = indexAtPosition (cursorX, cursorY - 1); else if (moveInWholeWordSteps) - { - moveCursorTo (findWordBreakBefore (getCaretPosition()), - key.getModifiers().isShiftDown()); - } + newPos = findWordBreakBefore (getCaretPosition()); else - { - moveCursorTo (getCaretPosition() - 1, key.getModifiers().isShiftDown()); - } + newPos = getCaretPosition() - 1; + + moveCursorTo (newPos, key.getModifiers().isShiftDown()); } else if (key.isKeyCode (KeyPress::rightKey) || key.isKeyCode (KeyPress::downKey)) { newTransaction(); - if (key.isKeyCode (KeyPress::downKey) && isMultiLine()) - { - moveCursorTo (indexAtPosition (cursorX, cursorY + cursorHeight + 1), - key.getModifiers().isShiftDown()); - } + int newPos; + + if (isMultiLine() && key.isKeyCode (KeyPress::downKey)) + newPos = indexAtPosition (cursorX, cursorY + cursorHeight + 1); else if (moveInWholeWordSteps) - { - moveCursorTo (findWordBreakAfter (getCaretPosition()), - key.getModifiers().isShiftDown()); - } + newPos = findWordBreakAfter (getCaretPosition()); else - { - moveCursorTo (getCaretPosition() + 1, key.getModifiers().isShiftDown()); - } + newPos = getCaretPosition() + 1; + + moveCursorTo (newPos, key.getModifiers().isShiftDown()); } else if (key.isKeyCode (KeyPress::pageDownKey) && isMultiLine()) { @@ -1957,15 +1949,12 @@ bool TextEditor::keyPressed (const KeyPress& key) } else if (key == KeyPress::returnKey) { - if (! isReadOnly()) - { - newTransaction(); + newTransaction(); - if (returnKeyStartsNewLine) - insertTextAtCursor (T("\n")); - else - returnPressed(); - } + if (returnKeyStartsNewLine) + insertTextAtCursor (T("\n")); + else + returnPressed(); } else if (key.isKeyCode (KeyPress::escapeKey)) { @@ -1973,12 +1962,10 @@ bool TextEditor::keyPressed (const KeyPress& key) moveCursorTo (getCaretPosition(), false); escapePressed(); } - else if (key.getTextCharacter() != 0 - && (! isReadOnly()) - && (tabKeyUsed || ! key.isKeyCode (KeyPress::tabKey))) + else if (key.getTextCharacter() >= ' ' + || (tabKeyUsed && (key.getTextCharacter() == '\t'))) { - if (! isReadOnly()) - insertTextAtCursor (String::charToString (key.getTextCharacter())); + insertTextAtCursor (String::charToString (key.getTextCharacter())); lastTransactionTime = Time::getApproximateMillisecondCounter(); } diff --git a/src/juce_appframework/gui/graphics/fonts/juce_Font.cpp b/src/juce_appframework/gui/graphics/fonts/juce_Font.cpp index a55c95a931..91c649c934 100644 --- a/src/juce_appframework/gui/graphics/fonts/juce_Font.cpp +++ b/src/juce_appframework/gui/graphics/fonts/juce_Font.cpp @@ -152,6 +152,7 @@ bool Font::operator!= (const Font& other) const throw() void Font::setTypefaceName (const String& faceName) throw() { typefaceName = faceName; + typeface = 0; ascent = 0; }