diff options
-rw-r--r-- | src/Editor.cxx | 61 | ||||
-rw-r--r-- | src/Editor.h | 2 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 4 | ||||
-rw-r--r-- | src/ScintillaBase.h | 2 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 28 |
5 files changed, 61 insertions, 36 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index f9afa81a1..44df21c99 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1914,7 +1914,7 @@ void Editor::AddChar(char ch) { AddCharUTF(s, 1); } -void Editor::AddCharUTF(char *s, unsigned int len) { +void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { bool wasSelection = currentPos != anchor; ClearSelection(); if (inOverstrike && !wasSelection) { @@ -1931,37 +1931,42 @@ void Editor::AddCharUTF(char *s, unsigned int len) { ShowCaretAtCurrentPosition(); SetLastXChosen(); - int byte = static_cast<unsigned char>(s[0]); - if ((byte < 0xC0) || (1 == len)) { - // Handles UTF-8 characters between 0x01 and 0x7F and single byte - // characters when not in UTF-8 mode. - // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid - // characters representing themselves. + if (treatAsDBCS) { + NotifyChar((static_cast<unsigned char>(s[0]) << 8) | + static_cast<unsigned char>(s[1])); } else { - // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: - // http://www.cl.cam.ac.uk/~mgk25/unicode.html - // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt - if (byte < 0xE0) { - int byte2 = static_cast<unsigned char>(s[1]); - if ((byte2 & 0xC0) == 0x80) { - // Two-byte-character lead-byte followed by a trail-byte. - byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); - } - // A two-byte-character lead-byte not followed by trail-byte - // represents itself. - } else if (byte < 0xF0) { - int byte2 = static_cast<unsigned char>(s[1]); - int byte3 = static_cast<unsigned char>(s[2]); - if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { - // Three-byte-character lead byte followed by two trail bytes. - byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | - (byte3 & 0x3F)); + int byte = static_cast<unsigned char>(s[0]); + if ((byte < 0xC0) || (1 == len)) { + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. + // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid + // characters representing themselves. + } else { + // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: + // http://www.cl.cam.ac.uk/~mgk25/unicode.html + // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + if (byte < 0xE0) { + int byte2 = static_cast<unsigned char>(s[1]); + if ((byte2 & 0xC0) == 0x80) { + // Two-byte-character lead-byte followed by a trail-byte. + byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); + } + // A two-byte-character lead-byte not followed by trail-byte + // represents itself. + } else if (byte < 0xF0) { + int byte2 = static_cast<unsigned char>(s[1]); + int byte3 = static_cast<unsigned char>(s[2]); + if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { + // Three-byte-character lead byte followed by two trail bytes. + byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | + (byte3 & 0x3F)); + } + // A three-byte-character lead-byte not followed by two trail-bytes + // represents itself. } - // A three-byte-character lead-byte not followed by two trail-bytes - // represents itself. } + NotifyChar(byte); } - NotifyChar(byte); } void Editor::ClearSelection() { diff --git a/src/Editor.h b/src/Editor.h index a9da3f9a1..1e2310513 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -295,7 +295,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void ChangeSize(); void AddChar(char ch); - virtual void AddCharUTF(char *s, unsigned int len); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); void ClearSelection(); void ClearAll(); void ClearDocumentStyle(); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index fe732cabd..6b2bd8553 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -63,10 +63,10 @@ void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) { ct.RefreshColourPalette(pal, want); } -void ScintillaBase::AddCharUTF(char *s, unsigned int len) { +void ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { bool acActiveBeforeCharAdded = ac.Active(); if (!acActiveBeforeCharAdded || !ac.IsFillUpChar(*s)) - Editor::AddCharUTF(s, len); + Editor::AddCharUTF(s, len, treatAsDBCS); if (acActiveBeforeCharAdded) AutoCompleteChanged(s[0]); } diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index 375cc9a74..0c1f6fee9 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -57,7 +57,7 @@ protected: virtual void RefreshColourPalette(Palette &pal, bool want); - virtual void AddCharUTF(char *s, unsigned int len); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); void Command(int cmdId); virtual void CancelModes(); virtual int KeyCommand(unsigned int iMessage); diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index ccf7402a1..1eae2e1e8 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -410,8 +410,10 @@ static BOOL IsNT() { sptr_t ScintillaWin::HandleComposition(uptr_t wParam, sptr_t lParam) { #ifdef __DMC__ + // Digital Mars compiler does not include Imm library return 0; #else + sptr_t ret; if ((lParam & GCS_RESULTSTR) && (IsNT())) { HIMC hIMC = ::ImmGetContext(MainHWND()); if (hIMC) { @@ -436,10 +438,22 @@ sptr_t ScintillaWin::HandleComposition(uptr_t wParam, sptr_t lParam) { } ::ImmReleaseContext(MainHWND(), hIMC); } - return 0; + ret = 0; } else { - return ::DefWindowProc(MainHWND(), WM_IME_COMPOSITION, wParam, lParam); + ret = ::DefWindowProc(MainHWND(), WM_IME_COMPOSITION, wParam, lParam); + } + if ((lParam & GCS_RESULTSTR)) { + HIMC hIMC = ::ImmGetContext(MainHWND()); + Point pos = LocationFromPosition(currentPos); + COMPOSITIONFORM CompForm; + CompForm.dwStyle = CFS_POINT; + CompForm.ptCurrentPos.x = pos.x; + CompForm.ptCurrentPos.y = pos.y; + ::ImmSetCompositionWindow(hIMC, &CompForm); + ::ImmReleaseContext(MainHWND(), hIMC); + DropCaret(); } + return ret; #endif } @@ -1355,6 +1369,7 @@ DropTarget::DropTarget() { */ void ScintillaWin::ImeStartComposition() { #ifndef __DMC__ + // Digital Mars compiler does not include Imm library if (caret.active) { // Move IME Window to current caret position HIMC hIMC = ::ImmGetContext(MainHWND()); @@ -1405,7 +1420,7 @@ void ScintillaWin::ImeEndComposition() { void ScintillaWin::AddCharBytes(char b0, char b1) { int inputCodePage = InputCodePage(); - if (inputCodePage) { + if (inputCodePage && IsUnicodeMode()) { char utfval[4]="\0\0\0"; char ansiChars[3]; ansiChars[0] = b0; @@ -1417,9 +1432,14 @@ void ScintillaWin::AddCharBytes(char b0, char b1) { UTF8FromUCS2(wcs, 1, utfval, len); utfval[len] = '\0'; AddCharUTF(utfval,len); + } else if (b1) { + char dbcsChars[3]; + dbcsChars[0] = b0; + dbcsChars[1] = b1; + dbcsChars[2] = '\0'; + AddCharUTF(dbcsChars, strlen(dbcsChars), true); } else { AddChar(b0); - AddChar(b1); } } |