[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:7043] Re: r3987 - trunk/src



堀口です. フォーカスがあったときにカレットが復帰しないことがある事
象への対処です.

--- 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