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