version 1.21, 2013/03/25 15:59:57 |
version 1.22, 2013/10/10 11:56:50 |
|
|
#include <libgen.h> |
#include <libgen.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
void window_name_callback(unused int, unused short, void *); |
void window_name_callback(unused int, unused short, void *); |
char *parse_window_name(const char *); |
|
|
|
void |
void |
queue_window_name(struct window *w) |
queue_window_name(struct window *w) |
|
|
window_name_callback(unused int fd, unused short events, void *data) |
window_name_callback(unused int fd, unused short events, void *data) |
{ |
{ |
struct window *w = data; |
struct window *w = data; |
char *name, *wname; |
char *name; |
|
|
if (w->active == NULL) |
if (w->active == NULL) |
return; |
return; |
|
|
} |
} |
queue_window_name(w); |
queue_window_name(w); |
|
|
if (w->active->screen != &w->active->base) |
name = format_window_name(w); |
name = NULL; |
if (strcmp(name, w->name) != 0) { |
else |
window_set_name(w, name); |
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); |
|
server_status_window(w); |
server_status_window(w); |
} |
} |
free(wname); |
free(name); |
} |
} |
|
|
char * |
char * |
default_window_name(struct window *w) |
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') |
if (w->active->cmd != NULL && *w->active->cmd != '\0') |
return (parse_window_name(w->active->cmd)); |
return (parse_window_name(w->active->cmd)); |
return (parse_window_name(w->active->shell)); |
return (parse_window_name(w->active->shell)); |
} |
} |
|
|
char * |
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) |
parse_window_name(const char *in) |
{ |
{ |
char *copy, *name, *ptr; |
char *copy, *name, *ptr; |
|
|
if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0) |
if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0) |
name = name + (sizeof "exec ") - 1; |
name = name + (sizeof "exec ") - 1; |
|
|
while (*name == ' ') |
while (*name == ' ' || *name == '-') |
name++; |
name++; |
if ((ptr = strchr(name, ' ')) != NULL) |
if ((ptr = strchr(name, ' ')) != NULL) |
*ptr = '\0'; |
*ptr = '\0'; |