From 2d15f5985930f493d6df7f58399639ae64057c4a Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 20 Jan 2009 19:35:03 +0000 Subject: Try to change the window title to match the command running it in. This is done by reading argv[0] from the process group leader of the group that owns the tty (tcgetpgrp()). This can't be done portably so some OS-dependent code is introduced (ugh); OpenBSD, FreeBSD and Linux are supported at the moment. A new window flag, automatic-rename, is available: if this is set to off, the window name is not changed. Specifying a name with the new-window, new-session or rename-window commands will automatically set this flag to off for the window in question. To disable it entirely set the option to off globally (setw -g automatic-rename off). --- window.c | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) (limited to 'window.c') diff --git a/window.c b/window.c index 9289a727..154f908f 100644 --- a/window.c +++ b/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.59 2009-01-18 18:31:45 nicm Exp $ */ +/* $Id: window.c,v 1.60 2009-01-20 19:35:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -205,42 +205,19 @@ window_create(const char *name, const char *cmd, { struct window *w; u_int i; - char *ptr, *copy; w = xmalloc(sizeof *w); w->flags = 0; TAILQ_INIT(&w->panes); w->active = NULL; + w->pgrp = -1; w->sx = sx; w->sy = sy; options_init(&w->options, &global_window_options); - if (name == NULL) { - /* XXX */ - if (strncmp(cmd, "exec ", (sizeof "exec ") - 1) == 0) - copy = xstrdup(cmd + (sizeof "exec ") - 1); - else - copy = xstrdup(cmd); - if ((ptr = strchr(copy, ' ')) != NULL) { - if (ptr != copy && ptr[-1] != '\\') - *ptr = '\0'; - else { - while ((ptr = strchr(ptr + 1, ' ')) != NULL) { - if (ptr[-1] != '\\') { - *ptr = '\0'; - break; - } - } - } - } - w->name = xstrdup(xbasename(copy)); - xfree(copy); - } else - w->name = xstrdup(name); - for (i = 0; i < ARRAY_LENGTH(&windows); i++) { if (ARRAY_ITEM(&windows, i) == NULL) { ARRAY_SET(&windows, i, w); @@ -256,6 +233,12 @@ window_create(const char *name, const char *cmd, return (NULL); } w->active = TAILQ_FIRST(&w->panes); + + if (name != NULL) { + w->name = xstrdup(name); + options_set_number(&w->options, "automatic-rename", 0); + } else + w->name = default_window_name(w); return (w); } @@ -548,6 +531,7 @@ window_pane_spawn(struct window_pane *wp, struct winsize ws; int mode; const char **envq; + struct timeval tv; if (wp->fd != -1) close(wp->fd); @@ -566,6 +550,13 @@ window_pane_spawn(struct window_pane *wp, ws.ws_col = screen_size_x(&wp->base); ws.ws_row = screen_size_y(&wp->base); + wp->window->pgrp = -1; + if (gettimeofday(&wp->window->name_timer, NULL) != 0) + fatal("gettimeofday"); + tv.tv_sec = 0; + tv.tv_usec = NAME_INTERVAL * 1000L; + timeradd(&wp->window->name_timer, &tv, &wp->window->name_timer); + switch (forkpty(&wp->fd, NULL, NULL, &ws)) { case -1: return (1); -- cgit