فهرست منبع

[Windows] Fix candidate window position with some third party IME engines.

bruvzg 2 سال پیش
والد
کامیت
c1c6ce9001
1فایلهای تغییر یافته به همراه9 افزوده شده و 1 حذف شده
  1. 9 1
      platform/windows/display_server_windows.cpp

+ 9 - 1
platform/windows/display_server_windows.cpp

@@ -1671,9 +1671,11 @@ void DisplayServerWindows::window_set_ime_active(const bool p_active, WindowID p
 	if (p_active) {
 		wd.ime_active = true;
 		ImmAssociateContext(wd.hWnd, wd.im_himc);
+		CreateCaret(wd.hWnd, NULL, 1, 1);
 		window_set_ime_position(wd.im_position, p_window);
 	} else {
 		ImmAssociateContext(wd.hWnd, (HIMC)0);
+		DestroyCaret();
 		wd.ime_active = false;
 	}
 }
@@ -3469,15 +3471,21 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 		case WM_IME_COMPOSITION: {
 			CANDIDATEFORM cf;
 			cf.dwIndex = 0;
-			cf.dwStyle = CFS_EXCLUDE;
+
+			cf.dwStyle = CFS_CANDIDATEPOS;
 			cf.ptCurrentPos.x = windows[window_id].im_position.x;
 			cf.ptCurrentPos.y = windows[window_id].im_position.y;
+			ImmSetCandidateWindow(windows[window_id].im_himc, &cf);
+
+			cf.dwStyle = CFS_EXCLUDE;
 			cf.rcArea.left = windows[window_id].im_position.x;
 			cf.rcArea.right = windows[window_id].im_position.x;
 			cf.rcArea.top = windows[window_id].im_position.y;
 			cf.rcArea.bottom = windows[window_id].im_position.y;
 			ImmSetCandidateWindow(windows[window_id].im_himc, &cf);
+
 			if (windows[window_id].ime_active) {
+				SetCaretPos(windows[window_id].im_position.x, windows[window_id].im_position.y);
 				OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_IME_UPDATE);
 			}
 		} break;