[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
Re: [MD:7043] Re: r3987 - trunk/src
- X-ml-count: 7073
- Subject: Re: [MD:7043] Re: r3987 - trunk/src
- From: Kyotaro HORIGUCHI <horiguti@xxxxxxxxxxx>
- Date: Mon, 28 Nov 2005 19:57:14 +0900 (JST)
- User-agent: Mew version 4.2.54 on Emacs 22.0 / Mule 5.0 (榊) / Meadow-3.00-dev (菊)
堀口です. フォーカスがあったときにカレットが復帰しないことがある事
象への対処です.
--- mw32fns.c.old 2005-11-28 18:06:31.132750000 +0900
+++ mw32fns.c 2005-11-28 18:05:57.367125000 +0900
@@ -2016,4 +2016,14 @@
mw32_update_frame_alpha (f);
+
+ /* Synchronize caret state */
+ if (CARET_CURSOR_P (XWINDOW (f->selected_window)->phys_cursor_type)
+ && MW32_FRAME_CARET_SHOWN (f))
+ {
+ DestroyCaret ();
+ MW32_FRAME_CARET_STATE (f) = NO_CARET;
+ MW32_FRAME_CARET_BLOCKED (f) = FALSE;
+ PostMessage (hwnd, WM_EMACS_SETCARET, (WPARAM)SHOWN_CARET, (LPARAM)0);
+ }
return 0;
@@ -2027,12 +2037,14 @@
}
- if (f == FRAME_MW32_DISPLAY_INFO (f)->mw32_focus_frame)
+ if (f == FRAME_MW32_DISPLAY_INFO (f)->mw32_focus_frame)
mw32m_new_focus_frame (dpyinfo, NULL);
- /* reset mouse face and help echo. */
+ /* reset mouse face and help echo. */
+ mw32_update_frame_alpha (f);
+
+
PostMessage (hwnd, WM_EMACS_CLEAR_MOUSE_FACE,
(WPARAM) 1, (LPARAM) 0);
- mw32_update_frame_alpha (f);
return 0;
@@ -2552,4 +2564,5 @@
DestroyCaret ();
MW32_FRAME_CARET_STATE (last_cursor_frame) = NO_CARET;
+ MW32_FRAME_CARET_BLOCKED (last_cursor_frame) = FALSE;
}
last_cursor_frame = f;
@@ -2610,38 +2623,46 @@
WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y)
+ w->phys_cursor_height - caret_height;
+ int retry_count = 2; /* Magic number */
- if (caret_spec_changed)
- {
- if (MW32_FRAME_CARET_STATE (f) > NO_CARET)
- {
- DestroyCaret ();
- MW32_FRAME_CARET_STATE (f) = NO_CARET;
- }
- }
-
- if (MW32_FRAME_CARET_STATE (f) == NO_CARET)
- {
- CreateCaret (hwnd,
- MW32_FRAME_CARET_BITMAP (f),
- FRAME_CURSOR_WIDTH (f),
- caret_height);
- MW32_FRAME_CARET_STATE (f) = HIDDEN_CARET;
- MW32_FRAME_CARET_BLOCKED (f) = FALSE;
- last_phys_cursor_height = w->phys_cursor_height;
- last_cursor_width = FRAME_CURSOR_WIDTH (f);
- last_cursor_height = MW32_FRAME_CARET_HEIGHT (f);
- last_bitmap = MW32_FRAME_CARET_BITMAP (f);
- }
-
- SetCaretPos (caret_xpos, caret_ypos);
+ do {
+ if (caret_spec_changed)
+ {
+ if (MW32_FRAME_CARET_STATE (f) > NO_CARET)
+ {
+ DestroyCaret ();
+ MW32_FRAME_CARET_STATE (f) = NO_CARET;
+ /* Caret is immediately re-created, so it should not
+ unblock caret. */
+ }
+ caret_spec_changed = FALSE;
+ }
+
+ if (MW32_FRAME_CARET_STATE (f) == NO_CARET)
+ {
+ CreateCaret (hwnd,
+ MW32_FRAME_CARET_BITMAP (f),
+ FRAME_CURSOR_WIDTH (f),
+ caret_height);
+ MW32_FRAME_CARET_STATE (f) = HIDDEN_CARET;
+ MW32_FRAME_CARET_BLOCKED (f) = FALSE;
+ last_phys_cursor_height = w->phys_cursor_height;
+ last_cursor_width = FRAME_CURSOR_WIDTH (f);
+ last_cursor_height = MW32_FRAME_CARET_HEIGHT (f);
+ last_bitmap = MW32_FRAME_CARET_BITMAP (f);
+ }
+
+ SetCaretPos (caret_xpos, caret_ypos);
- if (MW32_FRAME_CARET_SHOWN (f))
- goto setcaret_end;
- MW32_FRAME_CARET_STATE (f) = SHOWN_CARET;
- if (! MW32_FRAME_CARET_BLOCKED (f))
- {
- if (ShowCaret (hwnd) == 0)
- MW32_FRAME_CARET_STATE (f) = TOBESHOWN_CARET;
- }
+ if (MW32_FRAME_CARET_SHOWN (f))
+ goto setcaret_end;
+ MW32_FRAME_CARET_STATE (f) = SHOWN_CARET;
+ if (! MW32_FRAME_CARET_BLOCKED (f) && ShowCaret (hwnd) == 0)
+ {
+ if (GetLastError () == ERROR_ACCESS_DENIED)
+ caret_spec_changed = TRUE; /* Retry showcaret */
+ else
+ MW32_FRAME_CARET_STATE (f) = TOBESHOWN_CARET;
+ }
+ } while (caret_spec_changed && retry_count-- > 0);
}
else