@@ -1676,16 +1676,23 @@ private: | |||||
default: | default: | ||||
used = handleKeyUpOrDown(); | 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 | #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 | #else | ||||
const UINT keyChar = MapVirtualKeyW (key, 2); | |||||
const UINT keyChar = MapVirtualKeyW (key, 2); | |||||
#endif | #endif | ||||
used = handleKeyPress ((int) LOWORD (keyChar), 0) || used; | |||||
used = handleKeyPress ((int) LOWORD (keyChar), 0) || used; | |||||
} | |||||
} | } | ||||
break; | break; | ||||
@@ -1699,6 +1706,7 @@ private: | |||||
updateKeyModifiers(); | updateKeyModifiers(); | ||||
juce_wchar textChar = (juce_wchar) key; | juce_wchar textChar = (juce_wchar) key; | ||||
const int virtualScanCode = (flags >> 16) & 0xff; | const int virtualScanCode = (flags >> 16) & 0xff; | ||||
if (key >= '0' && key <= '9') | if (key >= '0' && key <= '9') | ||||
@@ -1723,9 +1731,6 @@ private: | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
if ((currentModifiers & (ModifierKeys::ctrlModifier | ModifierKeys::altModifier)) != 0) | |||||
return false; | |||||
// convert the scan code to an unmodified character code.. | // convert the scan code to an unmodified character code.. | ||||
#if JUCE_ENABLE_WIN98_COMPATIBILITY | #if JUCE_ENABLE_WIN98_COMPATIBILITY | ||||
const UINT virtualKey = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (virtualScanCode, 1) | const UINT virtualKey = wMapVirtualKeyW != 0 ? wMapVirtualKeyW (virtualScanCode, 1) | ||||
@@ -1742,7 +1747,13 @@ private: | |||||
const DWORD converted = wToUnicode (virtualKey, virtualScanCode, keyState, | const DWORD converted = wToUnicode (virtualKey, virtualScanCode, keyState, | ||||
unicodeChar, 32, 0); | unicodeChar, 32, 0); | ||||
if (converted > 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 | #else | ||||
const UINT virtualKey = MapVirtualKeyW (virtualScanCode, 1); | const UINT virtualKey = MapVirtualKeyW (virtualScanCode, 1); | ||||
@@ -1755,7 +1766,13 @@ private: | |||||
const DWORD converted = ToUnicode (virtualKey, virtualScanCode, keyState, | const DWORD converted = ToUnicode (virtualKey, virtualScanCode, keyState, | ||||
unicodeChar, 32, 0); | unicodeChar, 32, 0); | ||||
if (converted > 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 | #endif | ||||
@@ -1763,6 +1780,10 @@ private: | |||||
if (keyChar != 0) | if (keyChar != 0) | ||||
key = (int) keyChar; | 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); | return handleKeyPress (key, textChar); | ||||
@@ -1825,40 +1825,32 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
int newPos; | |||||
if (isMultiLine() && key.isKeyCode (KeyPress::upKey)) | if (isMultiLine() && key.isKeyCode (KeyPress::upKey)) | ||||
{ | |||||
moveCursorTo (indexAtPosition (cursorX, cursorY - 1), | |||||
key.getModifiers().isShiftDown()); | |||||
} | |||||
newPos = indexAtPosition (cursorX, cursorY - 1); | |||||
else if (moveInWholeWordSteps) | else if (moveInWholeWordSteps) | ||||
{ | |||||
moveCursorTo (findWordBreakBefore (getCaretPosition()), | |||||
key.getModifiers().isShiftDown()); | |||||
} | |||||
newPos = findWordBreakBefore (getCaretPosition()); | |||||
else | else | ||||
{ | |||||
moveCursorTo (getCaretPosition() - 1, key.getModifiers().isShiftDown()); | |||||
} | |||||
newPos = getCaretPosition() - 1; | |||||
moveCursorTo (newPos, key.getModifiers().isShiftDown()); | |||||
} | } | ||||
else if (key.isKeyCode (KeyPress::rightKey) | else if (key.isKeyCode (KeyPress::rightKey) | ||||
|| key.isKeyCode (KeyPress::downKey)) | || key.isKeyCode (KeyPress::downKey)) | ||||
{ | { | ||||
newTransaction(); | 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) | else if (moveInWholeWordSteps) | ||||
{ | |||||
moveCursorTo (findWordBreakAfter (getCaretPosition()), | |||||
key.getModifiers().isShiftDown()); | |||||
} | |||||
newPos = findWordBreakAfter (getCaretPosition()); | |||||
else | else | ||||
{ | |||||
moveCursorTo (getCaretPosition() + 1, key.getModifiers().isShiftDown()); | |||||
} | |||||
newPos = getCaretPosition() + 1; | |||||
moveCursorTo (newPos, key.getModifiers().isShiftDown()); | |||||
} | } | ||||
else if (key.isKeyCode (KeyPress::pageDownKey) && isMultiLine()) | else if (key.isKeyCode (KeyPress::pageDownKey) && isMultiLine()) | ||||
{ | { | ||||
@@ -1957,15 +1949,12 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||||
} | } | ||||
else if (key == KeyPress::returnKey) | 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)) | else if (key.isKeyCode (KeyPress::escapeKey)) | ||||
{ | { | ||||
@@ -1973,12 +1962,10 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||||
moveCursorTo (getCaretPosition(), false); | moveCursorTo (getCaretPosition(), false); | ||||
escapePressed(); | 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(); | lastTransactionTime = Time::getApproximateMillisecondCounter(); | ||||
} | } | ||||
@@ -152,6 +152,7 @@ bool Font::operator!= (const Font& other) const throw() | |||||
void Font::setTypefaceName (const String& faceName) throw() | void Font::setTypefaceName (const String& faceName) throw() | ||||
{ | { | ||||
typefaceName = faceName; | typefaceName = faceName; | ||||
typeface = 0; | |||||
ascent = 0; | ascent = 0; | ||||
} | } | ||||