summaryrefslogtreecommitdiffstats
path: root/names.c
diff options
context:
space:
mode:
authornicm <nicm>2013-10-10 11:56:50 +0000
committernicm <nicm>2013-10-10 11:56:50 +0000
commitfd1750af490f837405eb688ed82b3f8b18d29e26 (patch)
treec6846d489cf795cf1fc3e9a298c9da03f6e7767d /names.c
parent2bf2f5d58ee060068e915873a191a1d0d6e5c18f (diff)
Add automatic-rename-format option allowing automatic rename to use
something other than pane_current_command.
Diffstat (limited to 'names.c')
-rw-r--r--names.c58
1 files changed, 23 insertions, 35 deletions
diff --git a/names.c b/names.c
index 76dec82c..cfdaff83 100644
--- a/names.c
+++ b/names.c
@@ -22,12 +22,10 @@
#include <libgen.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include "tmux.h"
void window_name_callback(unused int, unused short, void *);
-char *parse_window_name(const char *);
void
queue_window_name(struct window *w)
@@ -47,7 +45,7 @@ void
window_name_callback(unused int fd, unused short events, void *data)
{
struct window *w = data;
- char *name, *wname;
+ char *name;
if (w->active == NULL)
return;
@@ -59,50 +57,40 @@ window_name_callback(unused int fd, unused short events, void *data)
}
queue_window_name(w);
- if (w->active->screen != &w->active->base)
- name = NULL;
- else
- name = get_proc_name(w->active->fd, w->active->tty);
- if (name == NULL)
- wname = default_window_name(w);
- else {
- /*
- * If tmux is using the default command, it will be a login
- * shell and argv[0] may have a - prefix. Remove this if it is
- * present. Ick.
- */
- if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
- name != NULL && name[0] == '-' && name[1] != '\0')
- wname = parse_window_name(name + 1);
- else
- wname = parse_window_name(name);
- free(name);
- }
-
- if (w->active->fd == -1) {
- xasprintf(&name, "%s[dead]", wname);
- free(wname);
- wname = name;
- }
-
- if (strcmp(wname, w->name)) {
- window_set_name(w, wname);
+ name = format_window_name(w);
+ if (strcmp(name, w->name) != 0) {
+ window_set_name(w, name);
server_status_window(w);
}
- free(wname);
+ free(name);
}
char *
default_window_name(struct window *w)
{
- if (w->active->screen != &w->active->base)
- return (xstrdup("[tmux]"));
if (w->active->cmd != NULL && *w->active->cmd != '\0')
return (parse_window_name(w->active->cmd));
return (parse_window_name(w->active->shell));
}
char *
+format_window_name(struct window *w)
+{
+ struct format_tree *ft;
+ char *fmt, *name;
+
+ ft = format_create();
+ format_window(ft, w);
+ format_window_pane(ft, w->active);
+
+ fmt = options_get_string(&w->options, "automatic-rename-format");
+ name = format_expand(ft, fmt);
+
+ format_free(ft);
+ return (name);
+}
+
+char *
parse_window_name(const char *in)
{
char *copy, *name, *ptr;
@@ -111,7 +99,7 @@ parse_window_name(const char *in)
if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0)
name = name + (sizeof "exec ") - 1;
- while (*name == ' ')
+ while (*name == ' ' || *name == '-')
name++;
if ((ptr = strchr(name, ' ')) != NULL)
*ptr = '\0';