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