summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2022-03-24 12:01:11 +0000
committerThomas Adam <thomas@xteddy.org>2022-03-24 12:01:11 +0000
commit5e491e79475425ca58316eac30a76038756a6499 (patch)
treec7e4318f1574fddb1541f3b75d9e09d58c2f37db
parent964deae422e4127a64f60fa3b54e2bf47b8e074c (diff)
parent792d13af49f2550a9a8d11b0099528628957a1a0 (diff)
Merge branch 'obsd-master' into master
-rw-r--r--server-client.c25
-rw-r--r--tmux.17
-rw-r--r--tmux.h3
-rw-r--r--tty-features.c13
-rw-r--r--tty-term.c1
-rw-r--r--tty.c12
6 files changed, 60 insertions, 1 deletions
diff --git a/server-client.c b/server-client.c
index 3b888d01..2350a982 100644
--- a/server-client.c
+++ b/server-client.c
@@ -40,6 +40,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 *);
@@ -2600,8 +2601,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);
}
@@ -2647,6 +2650,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)
diff --git a/tmux.1 b/tmux.1
index abaeb49c..3503242c 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3627,6 +3627,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
@@ -6394,6 +6396,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
diff --git a/tmux.h b/tmux.h
index e23ad3a1..370c7773 100644
--- a/tmux.h
+++ b/tmux.h
@@ -540,6 +540,7 @@ enum tty_code_code {
TTYC_SMULX,
TTYC_SMXX,
TTYC_SS,
+ TTYC_SWD,
TTYC_SYNC,
TTYC_TC,
TTYC_TSL,
@@ -1709,6 +1710,7 @@ struct client {
struct format_job_tree *jobs;
char *title;
+ char *path;
const char *cwd;
char *term_name;
@@ -2259,6 +2261,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 *);
diff --git a/tty-features.c b/tty-features.c
index 3aca2520..4d83a465 100644
--- a/tty-features.c
+++ b/tty-features.c
@@ -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,
diff --git a/tty-term.c b/tty-term.c
index 8e07da05..fdf0c4fa 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -277,6 +277,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" },
diff --git a/tty.c b/tty.c
index 40735ceb..ea10e61e 100644
--- a/tty.c
+++ b/tty.c
@@ -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)
{