Add a capability for OSC 7 and use it similarly to how the title is set
authornicm <nicm@openbsd.org>
Thu, 24 Mar 2022 09:05:57 +0000 (09:05 +0000)
committernicm <nicm@openbsd.org>
Thu, 24 Mar 2022 09:05:57 +0000 (09:05 +0000)
(and controlled by the same set-titles option). GitHub issue 3127.

usr.bin/tmux/server-client.c
usr.bin/tmux/tmux.1
usr.bin/tmux/tmux.h
usr.bin/tmux/tty-features.c
usr.bin/tmux/tty-term.c
usr.bin/tmux/tty.c

index a3279a4..44a957c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.392 2022/03/08 12:01:19 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.393 2022/03/24 09:05:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -43,6 +43,7 @@ static void   server_client_check_exit(struct client *);
 static void    server_client_check_redraw(struct client *);
 static void    server_client_check_modes(struct client *);
 static void    server_client_set_title(struct client *);
+static void    server_client_set_path(struct client *);
 static void    server_client_reset_state(struct client *);
 static int     server_client_assume_paste(struct session *);
 static void    server_client_update_latest(struct client *);
@@ -2603,8 +2604,10 @@ server_client_check_redraw(struct client *c)
        }
 
        if (c->flags & CLIENT_ALLREDRAWFLAGS) {
-               if (options_get_number(s->options, "set-titles"))
+               if (options_get_number(s->options, "set-titles")) {
                        server_client_set_title(c);
+                       server_client_set_path(c);
+               }
                screen_redraw_screen(c);
        }
 
@@ -2650,6 +2653,26 @@ server_client_set_title(struct client *c)
        format_free(ft);
 }
 
+/* Set client path. */
+static void
+server_client_set_path(struct client *c)
+{
+       struct session  *s = c->session;
+       const char      *path;
+
+       if (s->curw == NULL)
+               return;
+       if (s->curw->window->active->base.path == NULL)
+               path = "";
+       else
+               path = s->curw->window->active->base.path;
+       if (c->path == NULL || strcmp(path, c->path) != 0) {
+               free(c->path);
+               c->path = xstrdup(path);
+               tty_set_path(&c->tty, c->path);
+       }
+}
+
 /* Dispatch message from client. */
 static void
 server_client_dispatch(struct imsg *imsg, void *arg)
index 5a2a50e..52f4aaf 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.884 2022/03/17 11:35:37 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.885 2022/03/24 09:05: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: March 17 2022 $
+.Dd $Mdocdate: March 24 2022 $
 .Dt TMUX 1
 .Os
 .Sh NAME
@@ -3624,6 +3624,8 @@ Supports DECSLRM margins.
 Supports
 .Xr xterm 1
 mouse sequences.
+.It osc7
+Supports the OSC 7 working directory extension.
 .It overline
 Supports the overline SGR attribute.
 .It rectfill
@@ -6391,6 +6393,11 @@ $ printf '\e033[4 q'
 If
 .Em Se
 is not set, \&Ss with argument 0 will be used to reset the cursor style instead.
+.It Em \&Swd
+Set the opening sequence for the working directory notification.
+The sequence is terminated using the standard
+.Em fsl
+capability.
 .It Em \&Sync
 Start (parameter is 1) or end (parameter is 2) a synchronized update.
 .It Em \&Tc
index be87e87..8095c3a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1165 2022/03/16 17:00:17 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1166 2022/03/24 09:05:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -539,6 +539,7 @@ enum tty_code_code {
        TTYC_SMULX,
        TTYC_SMXX,
        TTYC_SS,
+       TTYC_SWD,
        TTYC_SYNC,
        TTYC_TC,
        TTYC_TSL,
@@ -1708,6 +1709,7 @@ struct client {
        struct format_job_tree  *jobs;
 
        char                    *title;
+       char                    *path;
        const char              *cwd;
 
        char                    *term_name;
@@ -2258,6 +2260,7 @@ void      tty_start_tty(struct tty *);
 void   tty_send_requests(struct tty *);
 void   tty_stop_tty(struct tty *);
 void   tty_set_title(struct tty *, const char *);
+void   tty_set_path(struct tty *, const char *);
 void   tty_update_mode(struct tty *, int, struct screen *);
 void   tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int,
            u_int, u_int, const struct grid_cell *, struct colour_palette *);
index 6cf94ff..514dd87 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty-features.c,v 1.21 2021/12/21 14:57:28 nicm Exp $ */
+/* $OpenBSD: tty-features.c,v 1.22 2022/03/24 09:05:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2020 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -53,6 +53,18 @@ static const struct tty_feature tty_feature_title = {
        0
 };
 
+/* Terminal has OSC 7 working directory. */
+static const char *tty_feature_osc7_capabilities[] = {
+       "Swd=\\E]7;",
+       "fsl=\\a",
+       NULL
+};
+static const struct tty_feature tty_feature_osc7 = {
+       "osc7",
+       tty_feature_osc7_capabilities,
+       0
+};
+
 /* Terminal has mouse support. */
 static const char *tty_feature_mouse_capabilities[] = {
        "kmous=\\E[M",
@@ -249,6 +261,7 @@ static const struct tty_feature *tty_features[] = {
        &tty_feature_focus,
        &tty_feature_margins,
        &tty_feature_mouse,
+       &tty_feature_osc7,
        &tty_feature_overline,
        &tty_feature_rectfill,
        &tty_feature_rgb,
index b105008..36e3f2b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty-term.c,v 1.91 2021/08/25 07:37:20 nicm Exp $ */
+/* $OpenBSD: tty-term.c,v 1.92 2022/03/24 09:05:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -274,6 +274,7 @@ static const struct tty_term_code_entry tty_term_codes[] = {
        [TTYC_SMUL] = { TTYCODE_STRING, "smul" },
        [TTYC_SMXX] =  { TTYCODE_STRING, "smxx" },
        [TTYC_SS] = { TTYCODE_STRING, "Ss" },
+       [TTYC_SWD] = { TTYCODE_STRING, "Swd" },
        [TTYC_SYNC] = { TTYCODE_STRING, "Sync" },
        [TTYC_TC] = { TTYCODE_FLAG, "Tc" },
        [TTYC_TSL] = { TTYCODE_STRING, "tsl" },
index da7bd19..15c6095 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.417 2022/03/08 12:01:19 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.418 2022/03/24 09:05:57 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -655,6 +655,18 @@ tty_set_title(struct tty *tty, const char *title)
        tty_putcode(tty, TTYC_FSL);
 }
 
+void
+tty_set_path(struct tty *tty, const char *title)
+{
+       if (!tty_term_has(tty->term, TTYC_SWD) ||
+           !tty_term_has(tty->term, TTYC_FSL))
+               return;
+
+       tty_putcode(tty, TTYC_SWD);
+       tty_puts(tty, title);
+       tty_putcode(tty, TTYC_FSL);
+}
+
 static void
 tty_force_cursor_colour(struct tty *tty, int c)
 {