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:
parent
e822f2b204
commit
0fa9d708f7
41
window.c
41
window.c
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user