diff src/xfns.c @ 47058:9e33c7ce6379

(x_set_cursor_type): Set FRAME_BLINK_OFF_CURSOR and FRAME_BLINK_OFF_CURSOR_WIDTH using defaults and Vblink_cursor_alist. (Vblink_cursor_alist): New variable. (syms_of_xfns): Initialize and defvar it. (x_specified_cursor_type): Recognize Qbox for filled box. Exceptions are hollow boxes. (Qbox, Qhollow): New variables. (syms_of_xfns): Initialize and staticpro them.
author Richard M. Stallman <rms@gnu.org>
date Tue, 27 Aug 2002 18:45:01 +0000
parents 0baf57bc9d62
children 527c24dbb2b1
line wrap: on
line diff
--- a/src/xfns.c	Tue Aug 27 18:42:48 2002 +0000
+++ b/src/xfns.c	Tue Aug 27 18:45:01 2002 +0000
@@ -183,9 +183,12 @@
 
 Lisp_Object Vx_pixel_size_width_font_regexp;
 
+/* How to blink the cursor off.  */
+Lisp_Object Vblink_cursor_alist;
+
 Lisp_Object Qauto_raise;
 Lisp_Object Qauto_lower;
-Lisp_Object Qbar, Qhbar;
+Lisp_Object Qbar, Qhbar, Qbox, Qhollow;
 Lisp_Object Qborder_color;
 Lisp_Object Qborder_width;
 Lisp_Object Qbox;
@@ -1873,11 +1876,13 @@
     }
   else if (NILP (arg))
     type = NO_CURSOR;
+  else if (EQ (arg, Qbox))
+    type = FILLED_BOX_CURSOR;
   else
-    /* Treat anything unknown as "box cursor".
+    /* Treat anything unknown as "hollow box cursor".
        It was bad to signal an error; people have trouble fixing
        .Xdefaults with Emacs, when it has something bad in it.  */
-    type = FILLED_BOX_CURSOR;
+    type = HOLLOW_BOX_CURSOR;
 
   return type;
 }
@@ -1888,12 +1893,33 @@
      Lisp_Object arg, oldval;
 {
   int width;
+  Lisp_Object tem;
   
   FRAME_DESIRED_CURSOR (f) = x_specified_cursor_type (arg, &width);
   f->output_data.x->cursor_width = width;
 
   /* Make sure the cursor gets redrawn.  */
   cursor_type_changed = 1;
+
+  /* By default, set up the blink-off state depending on the on-state.  */
+
+  if (FRAME_DESIRED_CURSOR (f) == FILLED_BOX_CURSOR)
+    FRAME_BLINK_OFF_CURSOR (f) = HOLLOW_BOX_CURSOR;
+  else if (FRAME_DESIRED_CURSOR (f) == BAR_CURSOR && FRAME_CURSOR_WIDTH (f) > 1)
+    {
+      FRAME_BLINK_OFF_CURSOR (f) = BAR_CURSOR;
+      FRAME_BLINK_OFF_CURSOR_WIDTH (f) = 1;
+    }
+  else
+    FRAME_BLINK_OFF_CURSOR (f) = NO_CURSOR;
+
+  tem = Fassoc (arg, Vblink_cursor_alist);
+  if (!NILP (tem))
+    {
+      FRAME_BLINK_OFF_CURSOR (f)
+	= x_specified_cursor_type (XCDR (tem), &width);
+      f->output_data.x->blink_off_cursor_width = width;
+    }
 }
 
 void
@@ -11844,6 +11870,10 @@
   staticpro (&Qbar);
   Qhbar = intern ("hbar");
   staticpro (&Qhbar);
+  Qbox = intern ("box");
+  staticpro (&Qbox);
+  Qhollow = intern ("hollow");
+  staticpro (&Qhollow);
   Qborder_color = intern ("border-color");
   staticpro (&Qborder_color);
   Qborder_width = intern ("border-width");
@@ -11954,6 +11984,14 @@
 
   init_x_parm_symbols ();
 
+  DEFVAR_LISP ("blink-cursor-alist", &Vblink_cursor_alist,
+    doc: /* Alist specifying how to blink the cursor off.
+Each element has the form (ON-STATE . OFF-STATE).  Whenever the
+`cursor-type' frame-parameter or variable equals ON-STATE,
+comparing using `equal', Emacs uses OFF-STATE to specify
+how to blink it off.  */);
+  Vblink_cursor_alist = Qnil;
+
   DEFVAR_BOOL ("cross-disabled-images", &cross_disabled_images,
     doc: /* Non-nil means always draw a cross over disabled images.
 Disabled images are those having an `:conversion disabled' property.