aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <unknown>2001-05-20 07:10:12 +0000
committernyamatongwe <unknown>2001-05-20 07:10:12 +0000
commit9fc5e4bed535bca4b42fdb04c6ae88015d7ee3d2 (patch)
treecdfd5876b7752d637f2ef00a62e3f817146f5885
parentcf6c6c517abe6f91cb4e22585ee3c9061da1d0e8 (diff)
downloadscintilla-mirror-9fc5e4bed535bca4b42fdb04c6ae88015d7ee3d2.tar.gz
Support for IME input of Asian languages on W2K.
-rw-r--r--win32/ScintillaWin.cxx51
1 files changed, 39 insertions, 12 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index 2ab5db13c..ffd804e2d 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -168,6 +168,7 @@ class ScintillaWin :
virtual void StartDrag();
sptr_t WndPaint(unsigned long wParam);
+ sptr_t HandleComposition(uptr_t wParam, sptr_t lParam);
virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
virtual void SetTicking(bool on);
@@ -406,6 +407,43 @@ LRESULT ScintillaWin::WndPaint(unsigned long wParam) {
return 0l;
}
+static BOOL IsNT() {
+ OSVERSIONINFO osv = {sizeof(OSVERSIONINFO),0,0,0,0,""};
+ ::GetVersionEx(&osv);
+ return osv.dwPlatformId == VER_PLATFORM_WIN32_NT;
+}
+
+sptr_t ScintillaWin::HandleComposition(uptr_t wParam, sptr_t lParam) {
+ if ((lParam & GCS_RESULTSTR) && (IsNT())) {
+ HIMC hIMC = ::ImmGetContext(wMain.GetID());
+ if (hIMC) {
+ const int maxLenInputIME = 200;
+ wchar_t wcs[maxLenInputIME];
+ LONG bytes = ::ImmGetCompositionStringW(hIMC,
+ GCS_RESULTSTR, wcs, (maxLenInputIME-1)*2);
+ int wides = bytes / 2;
+ if (IsUnicodeMode()) {
+ char utfval[maxLenInputIME * 3];
+ unsigned int len = UTF8Length(wcs, wides);
+ UTF8FromUCS2(wcs, wides, utfval, len);
+ utfval[len] = '\0';
+ AddCharUTF(utfval, len);
+ } else {
+ char dbcsval[maxLenInputIME * 2];
+ int size = ::WideCharToMultiByte(InputCodePage(),
+ 0, wcs, wides, dbcsval, sizeof(dbcsval) - 1, 0, 0);
+ for (int i=0; i<size; i++) {
+ AddChar(dbcsval[i]);
+ }
+ }
+ ::ImmReleaseContext(wMain.GetID(), hIMC);
+ }
+ return 0;
+ } else {
+ return ::DefWindowProc(wMain.GetID(), WM_IME_COMPOSITION, wParam, lParam);
+ }
+}
+
sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
//Platform::DebugPrintf("S M:%x WP:%x L:%x\n", iMessage, wParam, lParam);
switch (iMessage) {
@@ -609,10 +647,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
return ::DefWindowProc(wMain.GetID(), iMessage, wParam, lParam);
case WM_IME_COMPOSITION:
- if (lParam & GCS_RESULTSTR) {
- //Platform::DebugPrintf("Result\n");
- }
- return ::DefWindowProc(wMain.GetID(), iMessage, wParam, lParam);
+ return HandleComposition(wParam, lParam);
case WM_IME_CHAR: {
AddCharBytes(HIBYTE(wParam), LOBYTE(wParam));
@@ -1623,14 +1658,6 @@ bool ScintillaWin::IsUnicodeMode() const {
const char scintillaClassName[] = "Scintilla";
-#if 0
-static BOOL IsNT() {
- OSVERSIONINFO osv = {sizeof(OSVERSIONINFO),0,0,0,0,""};
- ::GetVersionEx(&osv);
- return osv.dwPlatformId == VER_PLATFORM_WIN32_NT;
-}
-#endif
-
void ScintillaWin::Register(HINSTANCE hInstance_) {
hInstance = hInstance_;