diff options
| -rw-r--r-- | win32/ScintillaWin.cxx | 51 | 
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_; | 
