mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Be more clever about picking window name.
This commit is contained in:
		
							
								
								
									
										3
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								CHANGES
									
									
									
									
									
								
							@@ -1,5 +1,6 @@
 | 
			
		||||
26 January 2009
 | 
			
		||||
 | 
			
		||||
* Be more clever about picking the right process to create the window name.
 | 
			
		||||
* Don't balls up the terminal on UTF-8 combined characters. Don't support them
 | 
			
		||||
  properly either - they are just discarded for the moment.
 | 
			
		||||
 | 
			
		||||
@@ -1013,7 +1014,7 @@
 | 
			
		||||
  (including mutt, emacs). No status bar yet and no key remapping or other
 | 
			
		||||
  customisation.
 | 
			
		||||
 | 
			
		||||
$Id: CHANGES,v 1.235 2009-01-26 20:57:42 nicm Exp $
 | 
			
		||||
$Id: CHANGES,v 1.236 2009-01-26 22:57:18 nicm Exp $
 | 
			
		||||
 | 
			
		||||
 LocalWords:  showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
 | 
			
		||||
 LocalWords:  rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								names.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								names.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: names.c,v 1.1 2009-01-20 19:35:03 nicm Exp $ */
 | 
			
		||||
/* $Id: names.c,v 1.2 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -31,8 +31,7 @@ set_window_names(void)
 | 
			
		||||
{
 | 
			
		||||
	struct window	*w;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
	pid_t		 pgrp;
 | 
			
		||||
	char		*name;
 | 
			
		||||
	char		*name, *wname;
 | 
			
		||||
	struct timeval	 tv, tv2;
 | 
			
		||||
	
 | 
			
		||||
	if (gettimeofday(&tv, NULL) != 0)
 | 
			
		||||
@@ -53,21 +52,20 @@ set_window_names(void)
 | 
			
		||||
		timeradd(&w->name_timer, &tv2, &w->name_timer);	
 | 
			
		||||
 | 
			
		||||
		if (w->active->screen != &w->active->base)
 | 
			
		||||
			pgrp = -1;
 | 
			
		||||
		else if ((pgrp = tcgetpgrp(w->active->fd)) == w->pgrp)
 | 
			
		||||
			continue;
 | 
			
		||||
		w->pgrp = pgrp;
 | 
			
		||||
 | 
			
		||||
		name = get_argv0(pgrp);
 | 
			
		||||
		if (pgrp == -1 || name == NULL)
 | 
			
		||||
			name = default_window_name(w);
 | 
			
		||||
			name = NULL;
 | 
			
		||||
		else
 | 
			
		||||
			name = parse_window_name(name);
 | 
			
		||||
		if (strcmp(name, w->name) == 0)
 | 
			
		||||
			name = get_argv0(w->active->fd, w->active->tty);
 | 
			
		||||
		if (name == NULL)
 | 
			
		||||
			wname = default_window_name(w);
 | 
			
		||||
		else {
 | 
			
		||||
			wname = parse_window_name(name);
 | 
			
		||||
			xfree(name);
 | 
			
		||||
		}
 | 
			
		||||
		if (strcmp(wname, w->name) == 0)
 | 
			
		||||
			xfree(wname);
 | 
			
		||||
		else {
 | 
			
		||||
			xfree(w->name);
 | 
			
		||||
			w->name = name;
 | 
			
		||||
			w->name = wname;
 | 
			
		||||
			server_status_window(w);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: osdep-darwin.c,v 1.1 2009-01-20 22:17:53 nicm Exp $ */
 | 
			
		||||
/* $Id: osdep-darwin.c,v 1.2 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
char	*get_argv0(pid_t);
 | 
			
		||||
char	*get_argv0(int, char *);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XXX This actually returns the executable path, not the process's argv[0].
 | 
			
		||||
@@ -32,13 +32,15 @@ char	*get_argv0(pid_t);
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_argv0(pid_t pgrp)
 | 
			
		||||
get_argv0(int fd, __attribute__ ((unused)) char *tty)
 | 
			
		||||
{
 | 
			
		||||
	int	mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 };
 | 
			
		||||
        size_t	size;
 | 
			
		||||
	struct kinfo_proc kp;
 | 
			
		||||
	
 | 
			
		||||
	mib[3] = pgrp;
 | 
			
		||||
	if ((mib[3] = tcgetpgrp(fd)) == -1)
 | 
			
		||||
		return (NULL)
 | 
			
		||||
 | 
			
		||||
	size = sizeof kp;
 | 
			
		||||
	if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1 ||
 | 
			
		||||
	    kp.kp_proc.p_comm[0] == '\0')
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: osdep-freebsd.c,v 1.2 2009-01-20 22:17:53 nicm Exp $ */
 | 
			
		||||
/* $Id: osdep-freebsd.c,v 1.3 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -19,7 +19,10 @@
 | 
			
		||||
#ifdef __FreeBSD__
 | 
			
		||||
 | 
			
		||||
#include <sys/param.h>
 | 
			
		||||
#include <sys/proc.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/sysctl.h>
 | 
			
		||||
#include <sys/user.h>
 | 
			
		||||
 | 
			
		||||
#include <err.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
@@ -28,19 +31,80 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
char	*get_argv0(pid_t);
 | 
			
		||||
char	*get_argv0(int, char *);
 | 
			
		||||
char	*get_proc_argv0(pid_t);
 | 
			
		||||
 | 
			
		||||
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_argv0(pid_t pgrp)
 | 
			
		||||
get_argv0(__attribute__ ((unused)) int fd, char *tty)
 | 
			
		||||
{
 | 
			
		||||
	int		 mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_TTY, 0 };
 | 
			
		||||
	struct stat	 sb;
 | 
			
		||||
	size_t		 len;
 | 
			
		||||
	struct kinfo_proc *buf, *newbuf, *p, *bestp;
 | 
			
		||||
	char		*procname;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	buf = NULL;
 | 
			
		||||
 | 
			
		||||
	if (stat(tty, &sb) == -1)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	mib[3] = sb.st_rdev;
 | 
			
		||||
 | 
			
		||||
retry:
 | 
			
		||||
	if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	len = (len * 5) / 4;
 | 
			
		||||
 | 
			
		||||
	if ((newbuf = realloc(buf, len)) == NULL) {
 | 
			
		||||
		free(buf);
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
	buf = newbuf;
 | 
			
		||||
 | 
			
		||||
	if (sysctl(mib, nitems(mib), buf, &len, NULL, 0) == -1) {
 | 
			
		||||
		if (errno == ENOMEM)
 | 
			
		||||
			goto retry;
 | 
			
		||||
		free(buf);
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bestp = NULL;
 | 
			
		||||
	for (i = 0; i < len / sizeof (struct kinfo_proc); i++) {
 | 
			
		||||
		p = &buf[i];
 | 
			
		||||
		if (bestp == NULL)
 | 
			
		||||
			bestp = p;
 | 
			
		||||
 | 
			
		||||
		if (p->ki_stat != SRUN && p->ki_stat != SIDL)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (p->ki_estcpu < bestp->ki_estcpu)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (p->ki_slptime > bestp->ki_slptime)
 | 
			
		||||
			continue;
 | 
			
		||||
		bestp = p;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	procname = get_proc_argv0(bestp->ki_pid);
 | 
			
		||||
	if (procname == NULL || *procname == '\0') {
 | 
			
		||||
		free(procname);
 | 
			
		||||
		procname = strdup(bestp->ki_comm);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(buf);
 | 
			
		||||
	return (procname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_proc_argv0(pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
	int	mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, 0 };
 | 
			
		||||
        size_t	size;
 | 
			
		||||
	char   *args, *args2, *procname;
 | 
			
		||||
 | 
			
		||||
	mib[3] = pid;
 | 
			
		||||
	procname = NULL;
 | 
			
		||||
 | 
			
		||||
	mib[3] = pgrp;
 | 
			
		||||
 | 
			
		||||
	args = NULL;
 | 
			
		||||
	size = 128;
 | 
			
		||||
	while (size < SIZE_MAX / 2) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: osdep-linux.c,v 1.1 2009-01-20 19:35:03 nicm Exp $ */
 | 
			
		||||
/* $Id: osdep-linux.c,v 1.2 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -27,16 +27,23 @@
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_argv0(pid_t pgrp)
 | 
			
		||||
get_argv0(int fd, unused char *tty)
 | 
			
		||||
{
 | 
			
		||||
	FILE	*f;
 | 
			
		||||
	char	*path, *buf;
 | 
			
		||||
	size_t	 len;
 | 
			
		||||
	int	 ch;
 | 
			
		||||
	pid_t	 pgrp;
 | 
			
		||||
 | 
			
		||||
	if ((pgrp = tcgetpgrp(fd)) == -1)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
 | 
			
		||||
	xasprintf(&path, "/proc/%lld/cmdline", (long long) pgrp);
 | 
			
		||||
	if ((f = fopen(path, "r")) == NULL)
 | 
			
		||||
	if ((f = fopen(path, "r")) == NULL) {
 | 
			
		||||
		xfree(path);
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
	xfree(path);
 | 
			
		||||
 | 
			
		||||
	len = 0;
 | 
			
		||||
	buf = NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: osdep-openbsd.c,v 1.2 2009-01-20 22:17:53 nicm Exp $ */
 | 
			
		||||
/* $Id: osdep-openbsd.c,v 1.3 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/param.h>
 | 
			
		||||
#include <sys/sysctl.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
#include <err.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
@@ -27,10 +28,73 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
char	*get_argv0(pid_t);
 | 
			
		||||
char	*get_argv0(int, char *);
 | 
			
		||||
char	*get_proc_argv0(pid_t);
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_argv0(pid_t pgrp)
 | 
			
		||||
get_argv0(__attribute__ ((unused)) int fd, char *tty)
 | 
			
		||||
{
 | 
			
		||||
	int		 mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_TTY, 0 };
 | 
			
		||||
	struct stat	 sb;
 | 
			
		||||
	size_t		 len;
 | 
			
		||||
	struct kinfo_proc *buf, *newbuf;
 | 
			
		||||
	struct proc	*p, *bestp;
 | 
			
		||||
	char		*procname;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	buf = NULL;
 | 
			
		||||
 | 
			
		||||
	if (stat(tty, &sb) == -1)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	mib[3] = sb.st_rdev;
 | 
			
		||||
 | 
			
		||||
retry:
 | 
			
		||||
	if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	len = (len * 5) / 4;
 | 
			
		||||
 | 
			
		||||
	if ((newbuf = realloc(buf, len)) == NULL) {
 | 
			
		||||
		free(buf);
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
	buf = newbuf;
 | 
			
		||||
 | 
			
		||||
	if (sysctl(mib, nitems(mib), buf, &len, NULL, 0) == -1) {
 | 
			
		||||
		if (errno == ENOMEM)
 | 
			
		||||
			goto retry;
 | 
			
		||||
		free(buf);
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bestp = NULL;
 | 
			
		||||
	for (i = 0; i < len / sizeof (struct kinfo_proc); i++) {
 | 
			
		||||
		p = &buf[i].kp_proc;
 | 
			
		||||
		if (bestp == NULL)
 | 
			
		||||
			bestp = p;
 | 
			
		||||
 | 
			
		||||
		if (p->p_stat != SRUN &&
 | 
			
		||||
		    p->p_stat != SIDL &&
 | 
			
		||||
		    p->p_stat != SONPROC)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (p->p_estcpu < bestp->p_estcpu)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (p->p_slptime > bestp->p_slptime)
 | 
			
		||||
			continue;
 | 
			
		||||
		bestp = p;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	procname = get_proc_argv0(bestp->p_pid);
 | 
			
		||||
	if (procname == NULL || *procname == '\0') {
 | 
			
		||||
		free(procname);
 | 
			
		||||
		procname = strdup(bestp->p_comm);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(buf);
 | 
			
		||||
	return (procname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *
 | 
			
		||||
get_proc_argv0(pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
	int	mib[4] = { CTL_KERN, KERN_PROC_ARGS, 0, KERN_PROC_ARGV };
 | 
			
		||||
        size_t	size;
 | 
			
		||||
@@ -38,7 +102,7 @@ get_argv0(pid_t pgrp)
 | 
			
		||||
 | 
			
		||||
	procname = NULL;
 | 
			
		||||
 | 
			
		||||
	mib[2] = pgrp;
 | 
			
		||||
	mib[2] = pid;
 | 
			
		||||
 | 
			
		||||
	args = NULL;
 | 
			
		||||
	size = 128;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tmux.h,v 1.250 2009-01-25 19:00:10 tcunha Exp $ */
 | 
			
		||||
/* $Id: tmux.h,v 1.251 2009-01-26 22:57:19 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -140,7 +140,7 @@ extern const char    *__progname;
 | 
			
		||||
#define printflike4 __attribute__ ((format (printf, 4, 5)))
 | 
			
		||||
 | 
			
		||||
/* Number of items in array. */
 | 
			
		||||
#define nitems(_a)  (sizeof((_a)) / sizeof((_a)[0]))
 | 
			
		||||
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
 | 
			
		||||
 | 
			
		||||
/* Buffer macros. */
 | 
			
		||||
#define BUFFER_USED(b) ((b)->size)
 | 
			
		||||
@@ -592,6 +592,7 @@ struct window_pane {
 | 
			
		||||
	char		*cwd;
 | 
			
		||||
 | 
			
		||||
	int		 fd;
 | 
			
		||||
	char		 tty[TTY_NAME_MAX];
 | 
			
		||||
	struct buffer	*in;
 | 
			
		||||
	struct buffer	*out;
 | 
			
		||||
 | 
			
		||||
@@ -1503,7 +1504,7 @@ int	utf8_width(u_int);
 | 
			
		||||
char   *section_string(char *, size_t, size_t, size_t);
 | 
			
		||||
 | 
			
		||||
/* osdep-*.c */
 | 
			
		||||
char   *get_argv0(pid_t);
 | 
			
		||||
char   *get_argv0(int, char *);
 | 
			
		||||
 | 
			
		||||
/* buffer.c */
 | 
			
		||||
struct buffer 	*buffer_create(size_t);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								window.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: window.c,v 1.62 2009-01-23 16:59:14 nicm Exp $ */
 | 
			
		||||
/* $Id: window.c,v 1.63 2009-01-26 22:57:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -569,7 +569,7 @@ window_pane_spawn(struct window_pane *wp,
 | 
			
		||||
	tv.tv_usec = NAME_INTERVAL * 1000L;
 | 
			
		||||
	timeradd(&wp->window->name_timer, &tv, &wp->window->name_timer);
 | 
			
		||||
 | 
			
		||||
 	switch (forkpty(&wp->fd, NULL, NULL, &ws)) {
 | 
			
		||||
 	switch (forkpty(&wp->fd, wp->tty, NULL, &ws)) {
 | 
			
		||||
	case -1:
 | 
			
		||||
		wp->fd = -1;
 | 
			
		||||
		xasprintf(cause, "%s: %s", cmd, strerror(errno));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user