1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-18 03:28:07 -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 LPARAM pend_netevent_lParam = 0;
static void enact_pending_netevent(void); static void enact_pending_netevent(void);
static void flash_window(int mode); static void flash_window(int mode);
static void sys_cursor_update(void);
static time_t last_movement = 0; static time_t last_movement = 0;
static int caret_x = -1, caret_y = -1;
#define FONT_NORMAL 0 #define FONT_NORMAL 0
#define FONT_BOLD 1 #define FONT_BOLD 1
#define FONT_UNDERLINE 2 #define FONT_UNDERLINE 2
@ -2039,6 +2042,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
show_mouseptr(1); show_mouseptr(1);
has_focus = FALSE; has_focus = FALSE;
DestroyCaret(); DestroyCaret();
caret_x = caret_y = -1; /* ensure caret is replaced next time */
term_out(); term_out();
term_update(); term_update();
break; break;
@ -2155,6 +2159,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
case WM_FULLSCR_ON_MAX: case WM_FULLSCR_ON_MAX:
fullscr_on_max = TRUE; fullscr_on_max = TRUE;
break; break;
case WM_MOVE:
sys_cursor_update();
break;
case WM_SIZE: case WM_SIZE:
#ifdef RDB_DEBUG_PATCH #ifdef RDB_DEBUG_PATCH
debug((27, "WM_SIZE %s (%d,%d)", debug((27, "WM_SIZE %s (%d,%d)",
@ -2238,6 +2245,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
reset_window(0); reset_window(0);
} }
} }
sys_cursor_update();
return 0; return 0;
case WM_VSCROLL: case WM_VSCROLL:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
@ -2347,6 +2355,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
/* wParam == Font number */ /* wParam == Font number */
/* lParam == Locale */ /* lParam == Locale */
set_input_locale((HKL)lParam); set_input_locale((HKL)lParam);
sys_cursor_update();
break; break;
case WM_IME_NOTIFY: case WM_IME_NOTIFY:
if(wParam == IMN_SETOPENSTATUS) { if(wParam == IMN_SETOPENSTATUS) {
@ -2481,14 +2490,36 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
* have one.) * have one.)
*/ */
void sys_cursor(int x, int y) 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; COMPOSITIONFORM cf;
HIMC hIMC; HIMC hIMC;
if (!has_focus) return; if (!has_focus) return;
SetCaretPos(x * font_width + offset_width, if (caret_x < 0 || caret_y < 0)
y * font_height + offset_height); return;
SetCaretPos(caret_x, caret_y);
/* IMM calls on Win98 and beyond only */ /* IMM calls on Win98 and beyond only */
if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */ 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 */ /* we should have the IMM functions */
hIMC = ImmGetContext(hwnd); hIMC = ImmGetContext(hwnd);
cf.dwStyle = CFS_POINT; cf.dwStyle = CFS_POINT;
cf.ptCurrentPos.x = x * font_width + offset_width; cf.ptCurrentPos.x = caret_x;
cf.ptCurrentPos.y = y * font_height + offset_height; cf.ptCurrentPos.y = caret_y;
ImmSetCompositionWindow(hIMC, &cf); ImmSetCompositionWindow(hIMC, &cf);
ImmReleaseContext(hwnd, hIMC); ImmReleaseContext(hwnd, hIMC);