aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorjohnsonj <devnull@localhost>2016-01-09 20:32:13 +1100
committerjohnsonj <devnull@localhost>2016-01-09 20:32:13 +1100
commit4002e7bd46331b23984a3bf4f436534abd11dc22 (patch)
tree16974340151cc5e02707f542001beb5fc239a4ef
parent6a9e8073585400f4dbed2b057448b1b26e810224 (diff)
downloadscintilla-mirror-4002e7bd46331b23984a3bf4f436534abd11dc22.tar.gz
Factored out mapping IME state to indicators and finding caret position.
-rw-r--r--win32/ScintillaWin.cxx61
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;