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