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