Fixed: Whitespace being striped from the end of IME strings incorrectly + Regression with SDL_SetTextInputRect (#4752) * Fixed: Whitespace being striped from the end of IME strings incorrectly * Fixed: Google IME Candidate Window not placing correctly * Why are PostBuild events stored in the vcxproj and not a user file? * Revert SDL.vcxproj properly... * Remove whitespace as per code review * Fix Werror=declaration-after-statement error in code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
diff --git a/src/video/windows/SDL_windowskeyboard.c b/src/video/windows/SDL_windowskeyboard.c
index c5b1db2..b8f1053 100644
--- a/src/video/windows/SDL_windowskeyboard.c
+++ b/src/video/windows/SDL_windowskeyboard.c
@@ -246,13 +246,20 @@ WIN_SetTextInputRect(_THIS, SDL_Rect *rect)
himc = ImmGetContext(videodata->ime_hwnd_current);
if (himc)
{
- CANDIDATEFORM cf;
- cf.dwIndex = 0;
- cf.dwStyle = CFS_POINT;
- cf.ptCurrentPos.x = videodata->ime_rect.x;
- cf.ptCurrentPos.y = videodata->ime_rect.y;
-
- ImmSetCandidateWindow(himc, &cf);
+ COMPOSITIONFORM cof;
+ CANDIDATEFORM caf;
+
+ cof.dwStyle = CFS_FORCE_POSITION;
+ cof.ptCurrentPos.x = videodata->ime_rect.x;
+ cof.ptCurrentPos.y = videodata->ime_rect.y;
+ ImmSetCompositionWindow(himc, &cof);
+
+ caf.dwIndex = 0;
+ caf.dwStyle = CFS_CANDIDATEPOS;
+ caf.ptCurrentPos.x = videodata->ime_rect.x;
+ caf.ptCurrentPos.y = videodata->ime_rect.y;
+ ImmSetCandidateWindow(himc, &caf);
+
ImmReleaseContext(videodata->ime_hwnd_current, himc);
}
}
@@ -748,13 +755,16 @@ IME_GetCompositionString(SDL_VideoData *videodata, HIMC himc, DWORD string)
length /= sizeof(videodata->ime_composition[0]);
videodata->ime_cursor = LOWORD(ImmGetCompositionStringW(himc, GCS_CURSORPOS, 0, 0));
- if (videodata->ime_cursor < SDL_arraysize(videodata->ime_composition) && videodata->ime_composition[videodata->ime_cursor] == 0x3000) {
+ if (videodata->ime_cursor > 0 &&
+ videodata->ime_cursor < SDL_arraysize(videodata->ime_composition) &&
+ videodata->ime_composition[videodata->ime_cursor] == 0x3000) {
int i;
for (i = videodata->ime_cursor + 1; i < length; ++i)
videodata->ime_composition[i - 1] = videodata->ime_composition[i];
--length;
}
+
videodata->ime_composition[length] = 0;
}