4 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
28 void window_name_callback(unused
int, unused
short, void *);
29 char *parse_window_name(const char *);
32 queue_window_name(struct window
*w
)
37 tv
.tv_usec
= NAME_INTERVAL
* 1000L;
39 evtimer_del(&w
->name_timer
);
40 evtimer_set(&w
->name_timer
, window_name_callback
, w
);
41 evtimer_add(&w
->name_timer
, &tv
);
46 window_name_callback(unused
int fd
, unused
short events
, void *data
)
48 struct window
*w
= data
;
51 queue_window_name(w
); /* XXX even if the option is off? */
52 if (!options_get_number(&w
->options
, "automatic-rename"))
55 if (w
->active
->screen
!= &w
->active
->base
)
58 name
= get_proc_name(w
->active
->fd
, w
->active
->tty
);
60 wname
= default_window_name(w
);
63 * If tmux is using the default command, it will be a login
64 * shell and argv[0] may have a - prefix. Remove this if it is
67 if (w
->active
->cmd
!= NULL
&& *w
->active
->cmd
== '\0' &&
68 name
!= NULL
&& name
[0] == '-' && name
[1] != '\0')
69 wname
= parse_window_name(name
+ 1);
71 wname
= parse_window_name(name
);
75 if (w
->active
->fd
== -1) {
76 xasprintf(&name
, "%s[dead]", wname
);
81 if (strcmp(wname
, w
->name
) == 0)
86 server_status_window(w
);
91 default_window_name(struct window
*w
)
93 if (w
->active
->screen
!= &w
->active
->base
)
94 return (xstrdup("[tmux]"));
95 if (w
->active
->cmd
!= NULL
&& *w
->active
->cmd
!= '\0')
96 return (parse_window_name(w
->active
->cmd
));
97 return (parse_window_name(w
->active
->shell
));
101 parse_window_name(const char *in
)
103 char *copy
, *name
, *ptr
;
105 name
= copy
= xstrdup(in
);
106 if (strncmp(name
, "exec ", (sizeof "exec ") - 1) == 0)
107 name
= name
+ (sizeof "exec ") - 1;
111 if ((ptr
= strchr(name
, ' ')) != NULL
)
115 ptr
= name
+ strlen(name
) - 1;
116 while (ptr
> name
&& !isalnum((u_char
)*ptr
))
121 name
= basename(name
);
122 name
= xstrdup(name
);