summaryrefslogtreecommitdiff
path: root/src/video
diff options
context:
space:
mode:
Diffstat (limited to 'src/video')
-rw-r--r--src/video/win32_v.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp
index a0da4b06f..f7394ba99 100644
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -21,6 +21,7 @@
#include "../texteff.hpp"
#include "../thread/thread.h"
#include "../progress.h"
+#include "../window_gui.h"
#include "../window_func.h"
#include "win32_v.h"
#include <windows.h>
@@ -500,6 +501,28 @@ static LRESULT HandleCharMsg(uint keycode, WChar charcode)
}
#if !defined(WINCE) || _WIN32_WCE >= 0x400
+/** Set position of the composition window to the caret position. */
+static void SetCompositionPos(HWND hwnd)
+{
+ HIMC hIMC = ImmGetContext(hwnd);
+ if (hIMC != NULL) {
+ COMPOSITIONFORM cf;
+ cf.dwStyle = CFS_POINT;
+
+ if (EditBoxInGlobalFocus()) {
+ /* Get caret position. */
+ Point pt = _focused_window->GetCaretPosition();
+ cf.ptCurrentPos.x = _focused_window->left + pt.x;
+ cf.ptCurrentPos.y = _focused_window->top + pt.y;
+ } else {
+ cf.ptCurrentPos.x = 0;
+ cf.ptCurrentPos.y = 0;
+ }
+ ImmSetCompositionWindow(hIMC, &cf);
+ }
+ ImmReleaseContext(hwnd, hIMC);
+}
+
/** Handle WM_IME_COMPOSITION messages. */
static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
@@ -515,6 +538,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam)
/* Transmit text to windowing system. */
if (len > 0) HandleTextInput(FS2OTTD(str));
+ SetCompositionPos(hwnd);
/* Don't pass the result string on to the default window proc. */
lParam &= ~(GCS_RESULTSTR | GCS_RESULTCLAUSE | GCS_RESULTREADCLAUSE | GCS_RESULTREADSTR);
@@ -535,6 +559,7 @@ static void CancelIMEComposition(HWND hwnd)
#else
+static void SetCompositionPos(HWND hwnd) {}
static void CancelIMEComposition(HWND hwnd) {}
#endif /* !defined(WINCE) || _WIN32_WCE >= 0x400 */
@@ -548,6 +573,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
switch (msg) {
case WM_CREATE:
SetTimer(hwnd, TID_POLLMOUSE, MOUSE_POLL_DELAY, (TIMERPROC)TrackMouseTimerProc);
+ SetCompositionPos(hwnd);
break;
case WM_ENTERSIZEMOVE:
@@ -674,6 +700,10 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
}
#if !defined(WINCE) || _WIN32_WCE >= 0x400
+ case WM_IME_STARTCOMPOSITION:
+ SetCompositionPos(hwnd);
+ break;
+
case WM_IME_COMPOSITION:
return HandleIMEComposition(hwnd, wParam, lParam);
@@ -861,6 +891,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
case WM_SETFOCUS:
_wnd.has_focus = true;
+ SetCompositionPos(hwnd);
break;
case WM_KILLFOCUS:
@@ -1220,4 +1251,5 @@ bool VideoDriver_Win32::AfterBlitterChange()
void VideoDriver_Win32::EditBoxLostFocus()
{
CancelIMEComposition(_wnd.main_wnd);
+ SetCompositionPos(_wnd.main_wnd);
}