I have played IMR_DOCUMENTFEED.
IME : win32 japanese ime, google japanes ime
Editor : Em editor, Sakura editor, ms word 2016, firefox
I implemented it into scintilla and compared them.
but I can not tell any diffenence.
Here I just leave my implentation,
for Anyone interested in to test.
------------------- source from now on --------------------
LRESULT ScintillaWin::ImeOnDocumentFeed(LPARAM lParam) {
// Limit feed within one line without eol.
// Look around: lineStart |<-- |compStart| - caret - compEnd| -->| lineEnd.
const int curPos = CurrentPosition();
const Sci::Line curLine = pdoc->SciLineFromPosition(curPos);
const Sci::Position lineStart = pdoc->LineStart(curLine);
const Sci::Position lineEnd = pdoc->LineEnd(curLine);
const int codePage = CodePageOfDocument();
const std::wstring rcFeed = StringDecode(RangeText(lineStart, lineEnd), codePage);
const int rcFeedLen = static_cast<int>(rcFeed.length()) * sizeof(wchar_t);
const int rcSize = sizeof(RECONVERTSTRING) + rcFeedLen + sizeof(wchar_t);
RECONVERTSTRING *rc = static_cast<RECONVERTSTRING *>(PtrFromSPtr(lParam));
if (!rc)
return rcSize;
wchar_t *rcFeedStart = reinterpret_cast<wchar_t*>(rc + 1);
memcpy(rcFeedStart, &rcFeed[0], rcFeedLen);
IMContext imc(MainHWND());
if (!imc.hIMC)
return 0;
int compStrLen = imc.GetCompositionString(GCS_COMPSTR).size();
int imeCaretPos = imc.GetImeCaretPos();
Sci::Position compStart = pdoc->GetRelativePositionUTF16(curPos, -imeCaretPos);
int compStrOffset = pdoc->CountUTF16(lineStart, compStart);
// Fill in reconvert structure.
// Let Ime to decide what the target is.
rc->dwVersion = 0; //constant
rc->dwStrLen = static_cast<DWORD>(rcFeed.length());
rc->dwStrOffset = sizeof(RECONVERTSTRING); //constant
rc->dwCompStrLen = static_cast<DWORD>(compStrLen);
rc->dwCompStrOffset = static_cast<DWORD>(compStrOffset) * sizeof(wchar_t);
rc->dwTargetStrLen = rc->dwCompStrLen;
rc->dwTargetStrOffset = rc->dwCompStrOffset;
return rcSize;
}