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
show_mouseptr(1);
has_focus = FALSE;
DestroyCaret();
+ caret_x = caret_y = -1; /* ensure caret is replaced next time */
term_out();
term_update();
break;
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)",
reset_window(0);
}
}
+ sys_cursor_update();
return 0;
case WM_VSCROLL:
switch (LOWORD(wParam)) {
/* wParam == Font number */
/* lParam == Locale */
set_input_locale((HKL)lParam);
+ sys_cursor_update();
break;
case WM_IME_NOTIFY:
if(wParam == IMN_SETOPENSTATUS) {
* 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 */
/* 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);