diff options
| -rw-r--r-- | win32/ScintillaWin.cxx | 61 | 
1 files changed, 36 insertions, 25 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index f536482a1..0482c1e67 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -1000,6 +1000,39 @@ void ScintillaWin::ToggleHanja() {  	}  } +static unsigned int GetImeCaretPos(HIMC hIMC) { +	return ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, NULL, 0); +} + +static std::vector<BYTE> GetImeAttributes(HIMC hIMC) { +	int attrLen = ::ImmGetCompositionStringW(hIMC, GCS_COMPATTR, NULL, 0); +	std::vector<BYTE> attr(attrLen, 0); +	::ImmGetCompositionStringW(hIMC, GCS_COMPATTR, &attr[0], static_cast<DWORD>(attr.size())); +	return attr; +} + +static std::vector<int> MapImeIndicators(std::vector<BYTE> inputStyle) { +	std::vector<int> imeIndicator(inputStyle.size(), SC_INDICATOR_UNKNOWN); +	for (size_t i = 0; i < inputStyle.size(); i++) { +		switch (static_cast<int>(inputStyle.at(i))) { +		case ATTR_INPUT: +			imeIndicator[i] = SC_INDICATOR_INPUT; +			break; +		case ATTR_TARGET_NOTCONVERTED: +		case ATTR_TARGET_CONVERTED: +			imeIndicator[i] = SC_INDICATOR_TARGET; +			break; +		case ATTR_CONVERTED: +			imeIndicator[i] = SC_INDICATOR_CONVERTED; +			break; +		default: +			imeIndicator[i] = SC_INDICATOR_UNKNOWN; +			break; +		} +	} +	return imeIndicator; +} +  sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) {  	// Copy & paste by johnsonj with a lot of helps of Neil.  	// Great thanks for my foreruners, jiniya and BLUEnLIVE. @@ -1035,16 +1068,7 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) {  		pdoc->TentativeStart(); // TentativeActive from now on. -		// Get attribute information from composition string. -		BYTE compAttr[maxLenInputIME] = { 0 }; -		unsigned int imeCursorPos = 0; - -		if (lParam & GCS_COMPATTR) { -			ImmGetCompositionStringW(imc.hIMC, GCS_COMPATTR, compAttr, sizeof(compAttr)); -		} -		if (lParam & GCS_CURSORPOS) { -			imeCursorPos = ImmGetCompositionStringW(imc.hIMC, GCS_CURSORPOS, NULL, 0); -		} +		std::vector<int> imeIndicator = MapImeIndicators(GetImeAttributes(imc.hIMC));  		// Display character by character.  		int numBytes = 0; @@ -1074,26 +1098,13 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) {  			numBytes += oneCharLen;  			imeCharPos[i + ucWidth] = numBytes; -			// Draw an indicator on the character. -			int indicator = SC_INDICATOR_UNKNOWN; -			switch ((int)compAttr[i]) { -			case ATTR_INPUT: -				indicator = SC_INDICATOR_INPUT; -				break; -			case ATTR_TARGET_NOTCONVERTED: -			case ATTR_TARGET_CONVERTED: -				indicator = SC_INDICATOR_TARGET; -				break; -			case ATTR_CONVERTED: -				indicator = SC_INDICATOR_CONVERTED; -				break; -			} -			DrawImeIndicator(indicator, oneCharLen); +			DrawImeIndicator(imeIndicator[i], oneCharLen);  			i += ucWidth;  		}  		recordingMacro = tmpRecordingMacro;  		// Move IME caret position. +		unsigned int imeCursorPos = GetImeCaretPos(imc.hIMC);  		MoveImeCarets(-imeCharPos[wcsLen] + imeCharPos[imeCursorPos]);  		if (KoreanIME()) {  			view.imeCaretBlockOverride = true;  | 
