Add a format to show if there are unseen changes while in a mode, from
authornicm <nicm@openbsd.org>
Mon, 27 Mar 2023 08:47:57 +0000 (08:47 +0000)
committernicm <nicm@openbsd.org>
Mon, 27 Mar 2023 08:47:57 +0000 (08:47 +0000)
Dan Aloni in GitHub issue 3498.

usr.bin/tmux/format.c
usr.bin/tmux/input.c
usr.bin/tmux/tmux.1
usr.bin/tmux/tmux.h
usr.bin/tmux/window.c

index d2e187d..223441a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: format.c,v 1.311 2023/02/07 10:21:01 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.312 2023/03/27 08:47:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1885,6 +1885,18 @@ format_cb_pane_input_off(struct format_tree *ft)
        return (NULL);
 }
 
+/* Callback for pane_unseen_changes. */
+static void *
+format_cb_pane_unseen_changes(struct format_tree *ft)
+{
+       if (ft->wp != NULL) {
+               if (ft->wp->flags & PANE_UNSEENCHANGES)
+                       return (xstrdup("1"));
+               return (xstrdup("0"));
+       }
+       return (NULL);
+}
+
 /* Callback for pane_last. */
 static void *
 format_cb_pane_last(struct format_tree *ft)
@@ -2953,6 +2965,9 @@ static const struct format_table_entry format_table[] = {
        { "pane_tty", FORMAT_TABLE_STRING,
          format_cb_pane_tty
        },
+       { "pane_unseen_changes", FORMAT_TABLE_STRING,
+         format_cb_pane_unseen_changes
+       },
        { "pane_width", FORMAT_TABLE_STRING,
          format_cb_pane_width
        },
index 6ca2f08..64b32ff 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: input.c,v 1.213 2023/01/03 11:43:24 nicm Exp $ */
+/* $OpenBSD: input.c,v 1.214 2023/03/27 08:47:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -971,6 +971,10 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
        window_update_activity(wp->window);
        wp->flags |= PANE_CHANGED;
 
+       /* Flag new input while in a mode. */
+       if (!TAILQ_EMPTY(&wp->modes))
+               wp->flags |= PANE_UNSEENCHANGES;
+
        /* NULL wp if there is a mode set as don't want to update the tty. */
        if (TAILQ_EMPTY(&wp->modes))
                screen_write_start_pane(sctx, wp, &wp->base);
index b580b42..2db9aaf 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.916 2023/02/07 10:21:01 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.917 2023/03/27 08:47:57 nicm Exp $
 .\"
 .\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
 .\"
@@ -14,7 +14,7 @@
 .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: February 7 2023 $
+.Dd $Mdocdate: March 27 2023 $
 .Dt TMUX 1
 .Os
 .Sh NAME
@@ -5257,6 +5257,7 @@ The following variables are available, where appropriate:
 .It Li "pane_title" Ta "#T" Ta "Title of pane (can be set by application)"
 .It Li "pane_top" Ta "" Ta "Top of pane"
 .It Li "pane_tty" Ta "" Ta "Pseudo terminal of pane"
+.It Li "pane_unseen_changes" Ta "" Ta "1 if there were changes in pane while in mode"
 .It Li "pane_width" Ta "" Ta "Width of pane"
 .It Li "pid" Ta "" Ta "Server PID"
 .It Li "rectangle_toggle" Ta "" Ta "1 if rectangle selection is activated"
index 12f61fc..f750737 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1194 2023/02/05 21:15:33 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1195 2023/03/27 08:47:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1045,6 +1045,7 @@ struct window_pane {
 #define PANE_STATUSDRAWN 0x400
 #define PANE_EMPTY 0x800
 #define PANE_STYLECHANGED 0x1000
+#define PANE_UNSEENCHANGES 0x2000
 
        int              argc;
        char           **argv;
index 4903ca5..5e02fc2 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.284 2023/01/08 22:17:04 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.285 2023/03/27 08:47:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1120,6 +1120,7 @@ window_pane_reset_mode(struct window_pane *wp)
 
        next = TAILQ_FIRST(&wp->modes);
        if (next == NULL) {
+               wp->flags &= ~PANE_UNSEENCHANGES;
                log_debug("%s: no next mode", __func__);
                wp->screen = &wp->base;
        } else {