Mercurial > emacs
changeset 42865:40d08b8571ec
(w32_visible_system_caret_hwnd): New static variable.
(w32_wnd_proc) <WM_KILL_FOCUS, WM_EMACS_DESTROY_CARET>: Set it.
<WM_EMACS_TRACK_CARET>: Arrange for system caret to be visible if
the user requests it. Use system default width when creating.
<WM_EMACS_HIDE_CARET, WM_EMACS_SHOW_CARET>: Handle new messages.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 20 Jan 2002 23:13:29 +0000 |
parents | c1af6a7f3dd4 |
children | 03dd2df2b595 |
files | src/w32fns.c |
diffstat | 1 files changed, 34 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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: {