aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Editor.cxx61
-rw-r--r--src/Editor.h2
-rw-r--r--src/ScintillaBase.cxx4
-rw-r--r--src/ScintillaBase.h2
-rw-r--r--win32/ScintillaWin.cxx28
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);
}
}