xref: /minix3/external/bsd/tmux/dist/names.c (revision eda6f5931d42c77e1480347b1fc3eef2f8d33806)
1*eda6f593SDavid van Moolenbroek /* $Id: names.c,v 1.1.1.2 2011/08/17 18:40:05 jmmv Exp $ */
2*eda6f593SDavid van Moolenbroek 
3*eda6f593SDavid van Moolenbroek /*
4*eda6f593SDavid van Moolenbroek  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
5*eda6f593SDavid van Moolenbroek  *
6*eda6f593SDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
7*eda6f593SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*eda6f593SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*eda6f593SDavid van Moolenbroek  *
10*eda6f593SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*eda6f593SDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*eda6f593SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*eda6f593SDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*eda6f593SDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15*eda6f593SDavid van Moolenbroek  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16*eda6f593SDavid van Moolenbroek  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*eda6f593SDavid van Moolenbroek  */
18*eda6f593SDavid van Moolenbroek 
19*eda6f593SDavid van Moolenbroek #include <sys/types.h>
20*eda6f593SDavid van Moolenbroek 
21*eda6f593SDavid van Moolenbroek #include <ctype.h>
22*eda6f593SDavid van Moolenbroek #include <libgen.h>
23*eda6f593SDavid van Moolenbroek #include <string.h>
24*eda6f593SDavid van Moolenbroek #include <unistd.h>
25*eda6f593SDavid van Moolenbroek 
26*eda6f593SDavid van Moolenbroek #include "tmux.h"
27*eda6f593SDavid van Moolenbroek 
28*eda6f593SDavid van Moolenbroek void	 window_name_callback(unused int, unused short, void *);
29*eda6f593SDavid van Moolenbroek char	*parse_window_name(const char *);
30*eda6f593SDavid van Moolenbroek 
31*eda6f593SDavid van Moolenbroek void
32*eda6f593SDavid van Moolenbroek queue_window_name(struct window *w)
33*eda6f593SDavid van Moolenbroek {
34*eda6f593SDavid van Moolenbroek 	struct timeval	tv;
35*eda6f593SDavid van Moolenbroek 
36*eda6f593SDavid van Moolenbroek 	tv.tv_sec = 0;
37*eda6f593SDavid van Moolenbroek 	tv.tv_usec = NAME_INTERVAL * 1000L;
38*eda6f593SDavid van Moolenbroek 
39*eda6f593SDavid van Moolenbroek 	evtimer_del(&w->name_timer);
40*eda6f593SDavid van Moolenbroek 	evtimer_set(&w->name_timer, window_name_callback, w);
41*eda6f593SDavid van Moolenbroek 	evtimer_add(&w->name_timer, &tv);
42*eda6f593SDavid van Moolenbroek }
43*eda6f593SDavid van Moolenbroek 
44*eda6f593SDavid van Moolenbroek /* ARGSUSED */
45*eda6f593SDavid van Moolenbroek void
46*eda6f593SDavid van Moolenbroek window_name_callback(unused int fd, unused short events, void *data)
47*eda6f593SDavid van Moolenbroek {
48*eda6f593SDavid van Moolenbroek 	struct window	*w = data;
49*eda6f593SDavid van Moolenbroek 	char		*name, *wname;
50*eda6f593SDavid van Moolenbroek 
51*eda6f593SDavid van Moolenbroek 	queue_window_name(w);	/* XXX even if the option is off? */
52*eda6f593SDavid van Moolenbroek 	if (!options_get_number(&w->options, "automatic-rename"))
53*eda6f593SDavid van Moolenbroek 		return;
54*eda6f593SDavid van Moolenbroek 
55*eda6f593SDavid van Moolenbroek 	if (w->active->screen != &w->active->base)
56*eda6f593SDavid van Moolenbroek 		name = NULL;
57*eda6f593SDavid van Moolenbroek 	else
58*eda6f593SDavid van Moolenbroek 		name = osdep_get_name(w->active->fd, w->active->tty);
59*eda6f593SDavid van Moolenbroek 	if (name == NULL)
60*eda6f593SDavid van Moolenbroek 		wname = default_window_name(w);
61*eda6f593SDavid van Moolenbroek 	else {
62*eda6f593SDavid van Moolenbroek 		/*
63*eda6f593SDavid van Moolenbroek 		 * If tmux is using the default command, it will be a login
64*eda6f593SDavid van Moolenbroek 		 * shell and argv[0] may have a - prefix. Remove this if it is
65*eda6f593SDavid van Moolenbroek 		 * present. Ick.
66*eda6f593SDavid van Moolenbroek 		 */
67*eda6f593SDavid van Moolenbroek 		if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
68*eda6f593SDavid van Moolenbroek 		    name != NULL && name[0] == '-' && name[1] != '\0')
69*eda6f593SDavid van Moolenbroek 			wname = parse_window_name(name + 1);
70*eda6f593SDavid van Moolenbroek 		else
71*eda6f593SDavid van Moolenbroek 				wname = parse_window_name(name);
72*eda6f593SDavid van Moolenbroek 		xfree(name);
73*eda6f593SDavid van Moolenbroek 	}
74*eda6f593SDavid van Moolenbroek 
75*eda6f593SDavid van Moolenbroek 	if (w->active->fd == -1) {
76*eda6f593SDavid van Moolenbroek 		xasprintf(&name, "%s[dead]", wname);
77*eda6f593SDavid van Moolenbroek 		xfree(wname);
78*eda6f593SDavid van Moolenbroek 		wname = name;
79*eda6f593SDavid van Moolenbroek 	}
80*eda6f593SDavid van Moolenbroek 
81*eda6f593SDavid van Moolenbroek 	if (strcmp(wname, w->name) == 0)
82*eda6f593SDavid van Moolenbroek 		xfree(wname);
83*eda6f593SDavid van Moolenbroek 	else {
84*eda6f593SDavid van Moolenbroek 		xfree(w->name);
85*eda6f593SDavid van Moolenbroek 		w->name = wname;
86*eda6f593SDavid van Moolenbroek 		server_status_window(w);
87*eda6f593SDavid van Moolenbroek 	}
88*eda6f593SDavid van Moolenbroek }
89*eda6f593SDavid van Moolenbroek 
90*eda6f593SDavid van Moolenbroek char *
91*eda6f593SDavid van Moolenbroek default_window_name(struct window *w)
92*eda6f593SDavid van Moolenbroek {
93*eda6f593SDavid van Moolenbroek 	if (w->active->screen != &w->active->base)
94*eda6f593SDavid van Moolenbroek 		return (xstrdup("[tmux]"));
95*eda6f593SDavid van Moolenbroek 	if (w->active->cmd != NULL && *w->active->cmd != '\0')
96*eda6f593SDavid van Moolenbroek 		return (parse_window_name(w->active->cmd));
97*eda6f593SDavid van Moolenbroek 	return (parse_window_name(w->active->shell));
98*eda6f593SDavid van Moolenbroek }
99*eda6f593SDavid van Moolenbroek 
100*eda6f593SDavid van Moolenbroek char *
101*eda6f593SDavid van Moolenbroek parse_window_name(const char *in)
102*eda6f593SDavid van Moolenbroek {
103*eda6f593SDavid van Moolenbroek 	char	*copy, *name, *ptr;
104*eda6f593SDavid van Moolenbroek 
105*eda6f593SDavid van Moolenbroek 	name = copy = xstrdup(in);
106*eda6f593SDavid van Moolenbroek 	if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0)
107*eda6f593SDavid van Moolenbroek 		name = name + (sizeof "exec ") - 1;
108*eda6f593SDavid van Moolenbroek 
109*eda6f593SDavid van Moolenbroek 	while (*name == ' ')
110*eda6f593SDavid van Moolenbroek 		name++;
111*eda6f593SDavid van Moolenbroek 	if ((ptr = strchr(name, ' ')) != NULL)
112*eda6f593SDavid van Moolenbroek 		*ptr = '\0';
113*eda6f593SDavid van Moolenbroek 
114*eda6f593SDavid van Moolenbroek 	if (*name != '\0') {
115*eda6f593SDavid van Moolenbroek 		ptr = name + strlen(name) - 1;
116*eda6f593SDavid van Moolenbroek 		while (ptr > name && !isalnum((u_char)*ptr))
117*eda6f593SDavid van Moolenbroek 			*ptr-- = '\0';
118*eda6f593SDavid van Moolenbroek 	}
119*eda6f593SDavid van Moolenbroek 
120*eda6f593SDavid van Moolenbroek 	if (*name == '/')
121*eda6f593SDavid van Moolenbroek 		name = basename(name);
122*eda6f593SDavid van Moolenbroek 	name = xstrdup(name);
123*eda6f593SDavid van Moolenbroek 	xfree(copy);
124*eda6f593SDavid van Moolenbroek 	return (name);
125*eda6f593SDavid van Moolenbroek }
126