From b7d640e7642e1660d28681a66e3257d62708de13 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Fri, 21 Mar 2025 13:26:39 +0000
Subject: [PATCH] Add some additional cursor format variables. From shiro at
 usagi dot io in GitHub issue 4414.

---
 format.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/format.c b/format.c
index 39a4a9a7..db2bcd8a 100644
--- a/format.c
+++ b/format.c
@@ -1119,6 +1119,20 @@ format_cb_cursor_character(struct format_tree *ft)
 	return (value);
 }
 
+/* Callback for cursor_colour. */
+static void *
+format_cb_cursor_colour(struct format_tree *ft)
+{
+	struct window_pane	*wp = ft->wp;
+
+	if (wp == NULL || wp->screen == NULL)
+		return (NULL);
+
+	if (wp->screen->ccolour != -1)
+		return (xstrdup(colour_tostring(wp->screen->ccolour)));
+	return (xstrdup(colour_tostring(wp->screen->default_ccolour)));
+}
+
 /* Callback for mouse_word. */
 static void *
 format_cb_mouse_word(struct format_tree *ft)
@@ -1593,6 +1607,37 @@ format_cb_cursor_flag(struct format_tree *ft)
 	return (NULL);
 }
 
+/* Callback for cursor_shape. */
+static void *
+format_cb_cursor_shape(struct format_tree *ft)
+{
+	if (ft->wp != NULL && ft->wp->screen != NULL) {
+		switch (ft->wp->screen->cstyle) {
+		case SCREEN_CURSOR_BLOCK:
+			return (xstrdup("block"));
+    		case SCREEN_CURSOR_UNDERLINE:
+			return (xstrdup("underline"));
+    		case SCREEN_CURSOR_BAR:
+			return (xstrdup("bar"));
+    		default:
+			return (xstrdup("default"));
+		}
+	}
+	return (NULL);
+}
+
+/* Callback for cursor_very_visible. */
+static void *
+format_cb_cursor_very_visible(struct format_tree *ft)
+{
+	if (ft->wp != NULL && ft->wp->screen != NULL) {
+		if (ft->wp->screen->mode & MODE_CURSOR_VERY_VISIBLE)
+			return (xstrdup("1"));
+		return (xstrdup("0"));
+	}
+	return (NULL);
+}
+
 /* Callback for cursor_x. */
 static void *
 format_cb_cursor_x(struct format_tree *ft)
@@ -1611,6 +1656,18 @@ format_cb_cursor_y(struct format_tree *ft)
 	return (NULL);
 }
 
+/* Callback for cursor_blinking. */
+static void *
+format_cb_cursor_blinking(struct format_tree *ft)
+{
+	if (ft->wp != NULL && ft->wp->screen != NULL) {
+		if (ft->wp->screen->mode & MODE_CURSOR_BLINKING)
+			return (xstrdup("1"));
+		return (xstrdup("0"));
+	}
+	return (NULL);
+}
+
 /* Callback for history_limit. */
 static void *
 format_cb_history_limit(struct format_tree *ft)
@@ -2918,12 +2975,24 @@ static const struct format_table_entry format_table[] = {
 	{ "config_files", FORMAT_TABLE_STRING,
 	  format_cb_config_files
 	},
+	{ "cursor_blinking", FORMAT_TABLE_STRING,
+	  format_cb_cursor_blinking
+	},
 	{ "cursor_character", FORMAT_TABLE_STRING,
 	  format_cb_cursor_character
 	},
+	{ "cursor_colour", FORMAT_TABLE_STRING,
+	  format_cb_cursor_colour
+	},
 	{ "cursor_flag", FORMAT_TABLE_STRING,
 	  format_cb_cursor_flag
 	},
+	{ "cursor_shape", FORMAT_TABLE_STRING,
+	  format_cb_cursor_shape
+	},
+	{ "cursor_very_visible", FORMAT_TABLE_STRING,
+	  format_cb_cursor_very_visible
+	},
 	{ "cursor_x", FORMAT_TABLE_STRING,
 	  format_cb_cursor_x
 	},