From b02a4a3a76e0a52f7cf787dc4b3478d9bf72715b Mon Sep 17 00:00:00 2001
From: shiro <shiro@usagi.io>
Date: Fri, 14 Mar 2025 08:32:49 +0900
Subject: [PATCH] Expose additional formatting variables

---
 format.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tmux.1   |  4 ++++
 2 files changed, 64 insertions(+)

diff --git a/format.c b/format.c
index 9ce56104..e8c51c15 100644
--- a/format.c
+++ b/format.c
@@ -1119,6 +1119,17 @@ format_cb_cursor_character(struct format_tree *ft)
 	return (value);
 }
 
+/* Callback for cursor_colour. */
+static void *format_cb_cursor_colour(struct format_tree *ft) {
+	if (ft->wp != NULL && ft->wp->screen != NULL) {
+		if(ft->wp->screen->ccolour != -1) {
+			return (xstrdup(colour_tostring(ft->wp->screen->ccolour)));
+		}
+		return (xstrdup(colour_tostring(ft->wp->screen->default_ccolour)));
+	}
+	return (NULL);
+}
+
 /* Callback for mouse_word. */
 static void *
 format_cb_mouse_word(struct format_tree *ft)
@@ -1593,6 +1604,33 @@ 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 +1649,16 @@ 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)
@@ -2922,12 +2970,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
 	},
diff --git a/tmux.1 b/tmux.1
index 483e3987..00392040 100644
--- a/tmux.1
+++ b/tmux.1
@@ -5944,6 +5944,7 @@ The following variables are available, where appropriate:
 .It Li "command_list_name" Ta "" Ta "Command name if listing commands"
 .It Li "command_list_usage" Ta "" Ta "Command usage if listing commands"
 .It Li "config_files" Ta "" Ta "List of configuration files loaded"
+.It Li "cursor_blinking" Ta "" Ta "1 if the cursor is blinking"
 .It Li "copy_cursor_hyperlink" Ta "" Ta "Hyperlink under cursor in copy mode"
 .It Li "copy_cursor_line" Ta "" Ta "Line the cursor is on in copy mode"
 .It Li "copy_cursor_word" Ta "" Ta "Word under cursor in copy mode"
@@ -5951,7 +5952,10 @@ The following variables are available, where appropriate:
 .It Li "copy_cursor_y" Ta "" Ta "Cursor Y position in copy mode"
 .It Li "current_file" Ta "" Ta "Current configuration file"
 .It Li "cursor_character" Ta "" Ta "Character at cursor in pane"
+.It Li "cursor_colour" Ta "" Ta "Cursor colour in pane"
 .It Li "cursor_flag" Ta "" Ta "Pane cursor flag"
+.It Li "cursor_shape" Ta "" Ta "Cursor shape in pane"
+.It Li "cursor_very_visible" Ta "" Ta "1 if the cursor is in very visible mode"
 .It Li "cursor_x" Ta "" Ta "Cursor X position in pane"
 .It Li "cursor_y" Ta "" Ta "Cursor Y position in pane"
 .It Li "history_bytes" Ta "" Ta "Number of bytes in window history"