* src/window.h (struct window): Add 'cursor_type' slot.
(wset_cursor_type): New inline function.
* src/xdisp.c (get_window_cursor_type): Consult 'cursor_type'.
* src/window.c (make_window): Initialize 'cursor_type' to t.
(Fset_window_cursor_type, Fwindow_cursor_type): New functions.
(syms_of_window): List their symbols.
* doc/lispref/windows.texi (Window Point): Document them.
* doc/lispref/frames.texi (Cursor Parameters): Mention
new 'set-window-cursor-type'.
* etc/NEWS: Announce new functions. (Bug#70622)
(cherry picked from commit
3b890bf2bd2fec54433f35d61e30542b3dadb612)
@end table
@vindex cursor-type
-The @code{cursor-type} frame parameter may be overridden by the
-variables @code{cursor-type} and
-@code{cursor-in-non-selected-windows}:
+The @code{cursor-type} frame parameter may be overridden by
+@code{set-window-cursor-type} (@pxref{Window Point}), and by the
+variables @code{cursor-type} and @code{cursor-in-non-selected-windows}:
@defopt cursor-type
This buffer-local variable controls how the cursor looks in a selected
so @code{window-point} will stay behind text inserted there.
@end defvar
+@defun set-window-cursor-type window type
+This function sets the cursor shape for @var{window}. This setting
+takes precedence over the @code{cursor-type} variable, and @var{type}
+has the same format as the value of that variable. @xref{Cursor
+Parameters}. If @var{window} is @code{nil}, it means to set the cursor
+type for the selected window.
+
+The initial value for new windows is @code{t}, which says to respect the
+buffer-local value of @code{cursor-type}. The value set by this
+function persists across buffers shown in @var{window}, so
+@code{set-window-buffer} does not reset it. @xref{Buffers and Windows}.
+@end defun
+
+@defun window-cursor-type &optional window
+This function returns the cursor type of @var{window}, defaulting to the
+selected window.
+@end defun
+
@node Window Start and End
@section The Window Start and End Positions
@cindex window start position
'window-state-put' to restore positions of window points
according to the context stored in a window parameter.
++++
+*** New functions 'set-window-cursor-type' and 'window-cursor-type'.
+'set-window-cursor-type' sets a per-window cursor type, and
+'window-cursor-type' queries this setting for a given window. Windows
+are always created with a 'window-cursor-type' of t, which means to
+consult the variable 'cursor-type' as before.
+
** Tab Bars and Tab Lines
---
wset_old_pointm (w, Fmake_marker ());
wset_vertical_scroll_bar_type (w, Qt);
wset_horizontal_scroll_bar_type (w, Qt);
+ wset_cursor_type (w, Qt);
/* These Lisp fields are marked specially so they're not set to nil by
allocate_window. */
wset_prev_buffers (w, Qnil);
w->fringes_persistent ? Qt : Qnil);
}
+DEFUN ("set-window-cursor-type", Fset_window_cursor_type,
+ Sset_window_cursor_type, 2, 2, 0,
+ doc: /* Set the `cursor-type' of WINDOW to TYPE.
+
+This setting takes precedence over the variable `cursor-type', and TYPE
+has the same format as the value of that variable. The initial value
+for new windows is t, which says to respect the buffer-local value of
+`cursor-type'.
+
+WINDOW nil means use the selected window. This setting persists across
+buffers shown in WINDOW, so `set-window-buffer' does not reset it. */)
+ (Lisp_Object window, Lisp_Object type)
+{
+ struct window *w = decode_live_window (window);
+
+ if (!(NILP (type)
+ || EQ (type, Qt)
+ || EQ (type, Qbox)
+ || EQ (type, Qhollow)
+ || EQ (type, Qbar)
+ || EQ (type, Qhbar)
+ || (CONSP (type)
+ && (EQ (XCAR (type), Qbox)
+ || EQ (XCAR (type), Qbar)
+ || EQ (XCAR (type), Qhbar))
+ && INTEGERP (XCDR (type)))))
+ error ("Invalid cursor type");
+
+ wset_cursor_type (w, type);
+
+ /* Redisplay with updated cursor type. */
+ wset_redisplay (w);
+
+ return type;
+}
+
+/* FIXME: Add a way to get the _effective_ cursor type, possibly by
+ extending this function with an additional optional argument. */
+DEFUN ("window-cursor-type", Fwindow_cursor_type, Swindow_cursor_type,
+ 0, 1, 0,
+ doc: /* Return the `cursor-type' of WINDOW.
+WINDOW must be a live window and defaults to the selected one. */)
+ (Lisp_Object window)
+{
+ return decode_live_window (window)->cursor_type;
+}
\f
/***********************************************************************
defsubr (&Swindow_parameters);
defsubr (&Swindow_parameter);
defsubr (&Sset_window_parameter);
+ defsubr (&Swindow_cursor_type);
+ defsubr (&Sset_window_cursor_type);
}
/* An alist with parameters. */
Lisp_Object window_parameters;
+ /* `cursor-type' to use in this window. */
+ Lisp_Object cursor_type;
+
/* The help echo text for this window. Qnil if there's none. */
Lisp_Object mode_line_help_echo;
w->horizontal_scroll_bar_type = val;
}
+INLINE void
+wset_cursor_type (struct window *w, Lisp_Object val)
+{
+ w->cursor_type = val;
+}
+
INLINE void
wset_prev_buffers (struct window *w, Lisp_Object val)
{
{
if (w == XWINDOW (echo_area_window))
{
- if (EQ (BVAR (b, cursor_type), Qt) || NILP (BVAR (b, cursor_type)))
+ if (!EQ (Qt, w->cursor_type))
+ return get_specified_cursor_type (w->cursor_type, width);
+ else if (EQ (BVAR (b, cursor_type), Qt) || NILP (BVAR (b, cursor_type)))
{
*width = FRAME_CURSOR_WIDTH (f);
return FRAME_DESIRED_CURSOR (f);
non_selected = true;
}
- /* Never display a cursor in a window in which cursor-type is nil. */
- if (NILP (BVAR (b, cursor_type)))
- return NO_CURSOR;
-
- /* Get the normal cursor type for this window. */
- if (EQ (BVAR (b, cursor_type), Qt))
+ if (!EQ (Qt, w->cursor_type))
+ cursor_type = get_specified_cursor_type (w->cursor_type, width);
+ else
{
- cursor_type = FRAME_DESIRED_CURSOR (f);
- *width = FRAME_CURSOR_WIDTH (f);
+ /* Never display a cursor in a window in which cursor-type is nil. */
+ if (NILP (BVAR (b, cursor_type)))
+ return NO_CURSOR;
+
+ /* Get the normal cursor type for this window. */
+ if (EQ (BVAR (b, cursor_type), Qt))
+ {
+ cursor_type = FRAME_DESIRED_CURSOR (f);
+ *width = FRAME_CURSOR_WIDTH (f);
+ }
+ else
+ cursor_type = get_specified_cursor_type (BVAR (b, cursor_type), width);
}
- else
- cursor_type = get_specified_cursor_type (BVAR (b, cursor_type), width);
/* Use cursor-in-non-selected-windows instead
for non-selected window or frame. */