diff src/redisplay-msw.c @ 239:41f2f0e326e9 r20-5b18

Import from CVS: tag r20-5b18
author cvs
date Mon, 13 Aug 2007 10:15:48 +0200
parents 0e522484dd2a
children 51092a27c943
line wrap: on
line diff
--- a/src/redisplay-msw.c	Mon Aug 13 10:15:04 2007 +0200
+++ b/src/redisplay-msw.c	Mon Aug 13 10:15:48 2007 +0200
@@ -311,7 +311,6 @@
   struct face_cachel *cachel;
   Lisp_Object font = Qnil;
   int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
-  HBRUSH brush;
   HDC hdc = FRAME_MSWINDOWS_DC (f);
   int real_char_p = (rb->type == RUNE_CHAR && rb->object.chr.ch != '\n');
   char *p_char = NULL;
@@ -321,10 +320,9 @@
 		xpos + width,
 		dl->ypos + dl->descent - dl->clip};
 
-#if 0	/* XXX FIXME: Whar about the bar_cursor? */
-  Lisp_Object bar_cursor_value = symbol_value_in_buffer (Qbar_cursor,
-							 WINDOW_BUFFER (w));
-#endif
+  Lisp_Object bar = symbol_value_in_buffer (Qbar_cursor,
+					    WINDOW_BUFFER (w));
+  int bar_p = !NILP (bar);
 
   if (real_char_p)
     {
@@ -335,37 +333,53 @@
       font = FACE_CACHEL_FONT (cachel, Vcharset_ascii);
     }
 
-  
-  if (focus && real_char_p)
+  if ((focus || bar_p) && real_char_p)
     {
       p_char = (char*) &rb->object.chr.ch;
       n_char = 1;
     }
 
+  /* Use cursor fg/bg for block cursor, or character fg/bg for the bar.
+     Output nothing at eol if bar cursor */
   cachel = WINDOW_FACE_CACHEL (w,
-		get_builtin_face_cache_index (w, Vtext_cursor_face));
+		   (bar_p
+		   ? rb->findex
+		   : get_builtin_face_cache_index (w, Vtext_cursor_face)));
   mswindows_update_gc (hdc, font, cachel->foreground,
 		       cachel->background, Qnil, Qnil);
   ExtTextOut (FRAME_MSWINDOWS_DC (f), xpos, dl->ypos, ETO_OPAQUE,
 	      &rect, p_char, n_char, NULL);
 
-  if (focus)
-    return;
-
-  InflateRect (&rect, -1, -1);
-
-  if (real_char_p)
+  if (focus && bar_p)
+    {
+      rect.right = rect.left + (EQ (bar, Qt) ? 1 : 2);
+      cachel = WINDOW_FACE_CACHEL (w,
+		 get_builtin_face_cache_index (w, Vtext_cursor_face));
+      mswindows_update_gc (hdc, Qnil, Qnil,
+			   cachel->background, Qnil, Qnil);
+      ExtTextOut (FRAME_MSWINDOWS_DC (f), xpos, dl->ypos, ETO_OPAQUE,
+		  &rect, NULL, 0, NULL);
+    }
+  else if (!focus)
     {
-      p_char = (char*) &rb->object.chr.ch;
-      n_char = 1;
-    }
+      /* Now have real character drawn in its own color. We defalte
+	 the rectangle so character cell will be bounded by the
+	 previously drawn cursor shape */
+      InflateRect (&rect, -1, -1);
 
-  cachel = WINDOW_FACE_CACHEL (w, (real_char_p ? rb->findex
-				   : get_builtin_face_cache_index (w, Vdefault_face)));
-  mswindows_update_gc (hdc, Qnil, cachel->foreground,
-		       cachel->background, Qnil, Qnil);
-  ExtTextOut (FRAME_MSWINDOWS_DC (f), xpos, dl->ypos, ETO_OPAQUE | ETO_CLIPPED,
-	      &rect, p_char, n_char, NULL);
+      if (real_char_p)
+	{
+	  p_char = (char*) &rb->object.chr.ch;
+	  n_char = 1;
+	}
+
+      cachel = WINDOW_FACE_CACHEL (w, (real_char_p ? rb->findex
+				       : get_builtin_face_cache_index (w, Vdefault_face)));
+      mswindows_update_gc (hdc, Qnil, cachel->foreground,
+			   cachel->background, Qnil, Qnil);
+      ExtTextOut (FRAME_MSWINDOWS_DC (f), xpos, dl->ypos, ETO_OPAQUE | ETO_CLIPPED,
+		  &rect, p_char, n_char, NULL);
+    }
 }
 
 
@@ -481,8 +495,8 @@
  * to by PRC, and paints only the intersection
  */
 static void
-mswindows_redisplay_deadbox_maybe (CONST struct window *w,
-					      CONST RECT* prc)
+mswindows_redisplay_deadbox_maybe (struct window *w,
+				   CONST RECT* prc)
 {
   int sbh = window_scrollbar_height (w);
   int sbw = window_scrollbar_width (w);
@@ -658,24 +672,24 @@
 		dl->ypos - dl->ascent - shadow_width,
 		WINDOW_MODELINE_RIGHT (w),
 		dl->ypos + dl->descent + shadow_width};
-
+  UINT edge;
 
   color = WINDOW_FACE_CACHEL_BACKGROUND (w, MODELINE_INDEX);
   mswindows_update_gc(FRAME_MSWINDOWS_DC(f), Qnil, Qnil, color, Qnil, Qnil);
 
-#if 0	/* XXX Eh? */
-  if (shadow_width < 0)
-    {
-      GC temp;
+  if (XINT (w->modeline_shadow_thickness) < 0)
+    shadow_width = -shadow_width;
 
-      temp = top_shadow_gc;
-      top_shadow_gc = bottom_shadow_gc;
-      bottom_shadow_gc = temp;
-    }
-#endif
-
-  DrawEdge (FRAME_MSWINDOWS_DC(f), &rect, shadow_width==1 ? BDR_RAISEDINNER :
-					  EDGE_RAISED, BF_RECT);
+  if (shadow_width < -1)
+    edge = EDGE_SUNKEN;
+  else if (shadow_width < 0)
+    edge = BDR_SUNKENINNER;
+  else if (shadow_width == 1)
+    edge = BDR_RAISEDINNER;
+  else
+    edge = EDGE_RAISED;
+    
+  DrawEdge (FRAME_MSWINDOWS_DC(f), &rect, edge, BF_RECT);
 }
 
 
@@ -741,10 +755,15 @@
 mswindows_flash (struct device *d)
 {
   struct frame *f = device_selected_frame (d);
+  RECT rc;
 
-  /* XXX FIXME: Do something more visible here, maybe involving a timer */
-  FlashWindow (FRAME_MSWINDOWS_HANDLE (f), TRUE);
-  FlashWindow (FRAME_MSWINDOWS_HANDLE (f), FALSE);
+  GetClientRect (FRAME_MSWINDOWS_HANDLE (f), &rc);
+  InvertRect (FRAME_MSWINDOWS_DC (f), &rc);
+  GdiFlush ();
+  Sleep (25);
+  InvertRect (FRAME_MSWINDOWS_DC (f), &rc);
+
+  return 1;
 }
 
 static void
@@ -982,7 +1001,6 @@
   struct frame *f = XFRAME (w->frame);
   Lisp_Object color;
   RECT rect;
-  HBRUSH brush;
   int shadow_width = MODELINE_SHADOW_THICKNESS (w);
 
   /* We don't use the normal gutter measurements here because the