1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-10 07:38:06 -05:00

This should fix the busy-wait problem with the IME.

[originally from svn r1512]
This commit is contained in:
Simon Tatham 2001-12-20 14:18:01 +00:00
parent e822f2b204
commit 0fa9d708f7

View File

@ -104,9 +104,12 @@ static WPARAM pend_netevent_wParam = 0;
static LPARAM pend_netevent_lParam = 0;
static void enact_pending_netevent(void);
static void flash_window(int mode);
static void sys_cursor_update(void);
static time_t last_movement = 0;
static int caret_x = -1, caret_y = -1;
#define FONT_NORMAL 0
#define FONT_BOLD 1
#define FONT_UNDERLINE 2
@ -2039,6 +2042,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
show_mouseptr(1);
has_focus = FALSE;
DestroyCaret();
caret_x = caret_y = -1; /* ensure caret is replaced next time */
term_out();
term_update();
break;
@ -2155,6 +2159,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
case WM_FULLSCR_ON_MAX:
fullscr_on_max = TRUE;
break;
case WM_MOVE:
sys_cursor_update();
break;
case WM_SIZE:
#ifdef RDB_DEBUG_PATCH
debug((27, "WM_SIZE %s (%d,%d)",
@ -2238,6 +2245,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
reset_window(0);
}
}
sys_cursor_update();
return 0;
case WM_VSCROLL:
switch (LOWORD(wParam)) {
@ -2347,6 +2355,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
/* wParam == Font number */
/* lParam == Locale */
set_input_locale((HKL)lParam);
sys_cursor_update();
break;
case WM_IME_NOTIFY:
if(wParam == IMN_SETOPENSTATUS) {
@ -2481,14 +2490,36 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
* have one.)
*/
void sys_cursor(int x, int y)
{
int cx, cy;
if (!has_focus) return;
/*
* Avoid gratuitously re-updating the cursor position and IMM
* window if there's no actual change required.
*/
cx = x * font_width + offset_width;
cy = y * font_height + offset_height;
if (cx == caret_x && cy == caret_y)
return;
caret_x = cx;
caret_y = cy;
sys_cursor_update();
}
static void sys_cursor_update(void)
{
COMPOSITIONFORM cf;
HIMC hIMC;
if (!has_focus) return;
SetCaretPos(x * font_width + offset_width,
y * font_height + offset_height);
if (caret_x < 0 || caret_y < 0)
return;
SetCaretPos(caret_x, caret_y);
/* IMM calls on Win98 and beyond only */
if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */
@ -2499,8 +2530,8 @@ void sys_cursor(int x, int y)
/* we should have the IMM functions */
hIMC = ImmGetContext(hwnd);
cf.dwStyle = CFS_POINT;
cf.ptCurrentPos.x = x * font_width + offset_width;
cf.ptCurrentPos.y = y * font_height + offset_height;
cf.ptCurrentPos.x = caret_x;
cf.ptCurrentPos.y = caret_y;
ImmSetCompositionWindow(hIMC, &cf);
ImmReleaseContext(hwnd, hIMC);