xref: /openbsd/usr.bin/tmux/names.c (revision f426771e)
1*f426771eSnicm /* $OpenBSD: names.c,v 1.24 2015/02/05 10:29:43 nicm Exp $ */
2311827fbSnicm 
3311827fbSnicm /*
4311827fbSnicm  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
5311827fbSnicm  *
6311827fbSnicm  * Permission to use, copy, modify, and distribute this software for any
7311827fbSnicm  * purpose with or without fee is hereby granted, provided that the above
8311827fbSnicm  * copyright notice and this permission notice appear in all copies.
9311827fbSnicm  *
10311827fbSnicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11311827fbSnicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12311827fbSnicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13311827fbSnicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14311827fbSnicm  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15311827fbSnicm  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16311827fbSnicm  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17311827fbSnicm  */
18311827fbSnicm 
19311827fbSnicm #include <sys/types.h>
20311827fbSnicm 
21311827fbSnicm #include <ctype.h>
22311827fbSnicm #include <libgen.h>
237d053cf9Snicm #include <stdlib.h>
24311827fbSnicm #include <string.h>
25311827fbSnicm 
26311827fbSnicm #include "tmux.h"
27311827fbSnicm 
2866fd4858Snicm void	 window_name_callback(unused int, unused short, void *);
29311827fbSnicm 
30311827fbSnicm void
3130567b26Snicm queue_window_name(struct window *w)
32311827fbSnicm {
3330567b26Snicm 	struct timeval	tv;
3430567b26Snicm 
3530567b26Snicm 	tv.tv_sec = 0;
3630567b26Snicm 	tv.tv_usec = NAME_INTERVAL * 1000L;
3730567b26Snicm 
38346357b7Snicm 	if (event_initialized(&w->name_timer))
3930567b26Snicm 		evtimer_del(&w->name_timer);
4030567b26Snicm 	evtimer_set(&w->name_timer, window_name_callback, w);
4130567b26Snicm 	evtimer_add(&w->name_timer, &tv);
4230567b26Snicm }
4330567b26Snicm 
4430567b26Snicm void
4530567b26Snicm window_name_callback(unused int fd, unused short events, void *data)
4630567b26Snicm {
4730567b26Snicm 	struct window	*w = data;
48203ea44bSnicm 	char		*name;
49311827fbSnicm 
50a3560846Snicm 	if (w->active == NULL)
51a3560846Snicm 		return;
52a3560846Snicm 
5391e80530Snicm 	if (!options_get_number(&w->options, "automatic-rename")) {
5491e80530Snicm 		if (event_initialized(&w->name_timer))
5591e80530Snicm 			event_del(&w->name_timer);
5691e80530Snicm 		return;
5791e80530Snicm 	}
5891e80530Snicm 	queue_window_name(w);
59b0b8e5bfSnicm 
60203ea44bSnicm 	name = format_window_name(w);
61203ea44bSnicm 	if (strcmp(name, w->name) != 0) {
62203ea44bSnicm 		window_set_name(w, name);
63311827fbSnicm 		server_status_window(w);
64311827fbSnicm 	}
65203ea44bSnicm 	free(name);
66311827fbSnicm }
67311827fbSnicm 
68311827fbSnicm char *
69311827fbSnicm default_window_name(struct window *w)
70311827fbSnicm {
7158034113Snicm 	char    *cmd, *s;
7258034113Snicm 
7358034113Snicm 	cmd = cmd_stringify_argv(w->active->argc, w->active->argv);
7458034113Snicm 	if (cmd != NULL && *cmd != '\0')
7558034113Snicm 		s = parse_window_name(cmd);
7658034113Snicm 	else
7758034113Snicm 		s = parse_window_name(w->active->shell);
7858034113Snicm 	free(cmd);
7958034113Snicm 	return (s);
80311827fbSnicm }
81311827fbSnicm 
82311827fbSnicm char *
83203ea44bSnicm format_window_name(struct window *w)
84203ea44bSnicm {
85203ea44bSnicm 	struct format_tree	*ft;
86203ea44bSnicm 	char			*fmt, *name;
87203ea44bSnicm 
88203ea44bSnicm 	ft = format_create();
89*f426771eSnicm 	format_defaults_window(ft, w);
90*f426771eSnicm 	format_defaults_pane(ft, w->active);
91203ea44bSnicm 
92203ea44bSnicm 	fmt = options_get_string(&w->options, "automatic-rename-format");
93203ea44bSnicm 	name = format_expand(ft, fmt);
94203ea44bSnicm 
95203ea44bSnicm 	format_free(ft);
96203ea44bSnicm 	return (name);
97203ea44bSnicm }
98203ea44bSnicm 
99203ea44bSnicm char *
10066fd4858Snicm parse_window_name(const char *in)
101311827fbSnicm {
10266fd4858Snicm 	char	*copy, *name, *ptr;
103311827fbSnicm 
104311827fbSnicm 	name = copy = xstrdup(in);
10566fd4858Snicm 	if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0)
10666fd4858Snicm 		name = name + (sizeof "exec ") - 1;
107311827fbSnicm 
108203ea44bSnicm 	while (*name == ' ' || *name == '-')
109311827fbSnicm 		name++;
110311827fbSnicm 	if ((ptr = strchr(name, ' ')) != NULL)
111311827fbSnicm 		*ptr = '\0';
112311827fbSnicm 
113311827fbSnicm 	if (*name != '\0') {
114311827fbSnicm 		ptr = name + strlen(name) - 1;
1153619f6a1Sray 		while (ptr > name && !isalnum((u_char)*ptr))
116311827fbSnicm 			*ptr-- = '\0';
117311827fbSnicm 	}
118311827fbSnicm 
119311827fbSnicm 	if (*name == '/')
120311827fbSnicm 		name = basename(name);
121311827fbSnicm 	name = xstrdup(name);
1227d053cf9Snicm 	free(copy);
123311827fbSnicm 	return (name);
124311827fbSnicm }
125