# HG changeset patch # User Jason Rumney # Date 1011568409 0 # Node ID 40d08b8571ec746659aa364f9ae79a413e3a89b1 # Parent c1af6a7f3dd4270ac4b7db12cdb16b181a57c8db (w32_visible_system_caret_hwnd): New static variable. (w32_wnd_proc) : Set it. : Arrange for system caret to be visible if the user requests it. Use system default width when creating. : Handle new messages. diff -r c1af6a7f3dd4 -r 40d08b8571ec src/w32fns.c --- a/src/w32fns.c Sun Jan 20 23:11:52 2002 +0000 +++ b/src/w32fns.c Sun Jan 20 23:13:29 2002 +0000 @@ -315,10 +315,13 @@ extern Lisp_Object Vw32_recognize_altgr; extern HWND w32_system_caret_hwnd; -extern int w32_system_caret_width; + extern int w32_system_caret_height; extern int w32_system_caret_x; extern int w32_system_caret_y; +extern int w32_use_visible_system_caret; + +HWND w32_visible_system_caret_hwnd; /* Error if we are not connected to MS-Windows. */ @@ -4878,6 +4881,7 @@ { DestroyCaret (); w32_system_caret_hwnd = NULL; + w32_visible_system_caret_hwnd = NULL; } case WM_MOVE: case WM_SIZE: @@ -5023,19 +5027,46 @@ DragAcceptFiles ((HWND) wParam, FALSE); return DestroyWindow ((HWND) wParam); + case WM_EMACS_HIDE_CARET: + return HideCaret (hwnd); + + case WM_EMACS_SHOW_CARET: + return ShowCaret (hwnd); + case WM_EMACS_DESTROY_CARET: w32_system_caret_hwnd = NULL; + w32_visible_system_caret_hwnd = NULL; return DestroyCaret (); case WM_EMACS_TRACK_CARET: /* If there is currently no system caret, create one. */ if (w32_system_caret_hwnd == NULL) { + /* Use the default caret width, and avoid changing it + unneccesarily, as it confuses screen reader software. */ w32_system_caret_hwnd = hwnd; - CreateCaret (hwnd, NULL, w32_system_caret_width, + CreateCaret (hwnd, NULL, 0, w32_system_caret_height); } - return SetCaretPos (w32_system_caret_x, w32_system_caret_y); + + if (!SetCaretPos (w32_system_caret_x, w32_system_caret_y)) + return 0; + /* Ensure visible caret gets turned on when requested. */ + else if (w32_use_visible_system_caret + && w32_visible_system_caret_hwnd != hwnd) + { + w32_visible_system_caret_hwnd = hwnd; + return ShowCaret (hwnd); + } + /* Ensure visible caret gets turned off when requested. */ + else if (!w32_use_visible_system_caret + && w32_visible_system_caret_hwnd) + { + w32_visible_system_caret_hwnd = NULL; + return HideCaret (hwnd); + } + else + return 1; case WM_EMACS_TRACKPOPUPMENU: {