mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Sync OpenBSD patchset 211:
Add a terminal-overrides session option allowing individual terminfo(5) entries to be overridden. The 88col/256col checks are now moved into the default setting and out of the code. Also remove a couple of old workarounds for xterm and rxvt which are no longer necessary (tmux can emulate them if missing).
This commit is contained in:
		
							
								
								
									
										101
									
								
								tty-term.c
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								tty-term.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tty-term.c,v 1.24 2009-08-09 12:06:25 tcunha Exp $ */
 | 
			
		||||
/* $Id: tty-term.c,v 1.25 2009-08-09 15:26:24 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -19,12 +19,15 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <curses.h>
 | 
			
		||||
#include <fnmatch.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <term.h>
 | 
			
		||||
#include <vis.h>
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
void	 tty_term_quirks(struct tty_term *);
 | 
			
		||||
void	 tty_term_override(struct tty_term *, const char *);
 | 
			
		||||
char	*tty_term_strip(const char *);
 | 
			
		||||
 | 
			
		||||
struct tty_terms tty_terms = SLIST_HEAD_INITIALIZER(tty_terms);
 | 
			
		||||
@@ -140,27 +143,87 @@ tty_term_strip(const char *s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
tty_term_quirks(struct tty_term *term)
 | 
			
		||||
tty_term_override(struct tty_term *term, const char *overrides)
 | 
			
		||||
{
 | 
			
		||||
	if (strncmp(term->name, "rxvt", 4) == 0) {
 | 
			
		||||
		/* rxvt supports dch1 but some termcap files do not have it. */
 | 
			
		||||
		if (!tty_term_has(term, TTYC_DCH1)) {
 | 
			
		||||
			term->codes[TTYC_DCH1].type = TTYCODE_STRING;
 | 
			
		||||
			term->codes[TTYC_DCH1].value.string = xstrdup("\033[P");
 | 
			
		||||
	struct tty_term_code_entry	*ent;
 | 
			
		||||
	struct tty_code			*code;
 | 
			
		||||
	char				*termnext, *termstr, *entnext, *entstr;
 | 
			
		||||
	char				*s, *ptr, *val;
 | 
			
		||||
	const char			*errstr;
 | 
			
		||||
	u_int				 i;
 | 
			
		||||
	int				 n, removeflag;
 | 
			
		||||
 | 
			
		||||
	s = xstrdup(overrides);
 | 
			
		||||
 | 
			
		||||
	termnext = s;
 | 
			
		||||
	while ((termstr = strsep(&termnext, ",")) != NULL) {
 | 
			
		||||
		entnext = termstr;
 | 
			
		||||
		
 | 
			
		||||
		entstr = strsep(&entnext, ":");
 | 
			
		||||
		if (entstr == NULL || entnext == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (fnmatch(entstr, term->name, 0) != 0)
 | 
			
		||||
			continue;
 | 
			
		||||
		while ((entstr = strsep(&entnext, ":")) != NULL) {
 | 
			
		||||
			if (*entstr == '\0')
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			val = NULL;
 | 
			
		||||
			removeflag = 0;
 | 
			
		||||
 			if ((ptr = strchr(entstr, '=')) != NULL) {
 | 
			
		||||
				*ptr++ = '\0';
 | 
			
		||||
				val = xstrdup(ptr);
 | 
			
		||||
				if (strunvis(val, ptr) == NULL) {
 | 
			
		||||
					xfree(val);
 | 
			
		||||
					val = xstrdup(ptr);
 | 
			
		||||
				}
 | 
			
		||||
			} else if (entstr[strlen(entstr) - 1] == '@') {
 | 
			
		||||
				entstr[strlen(entstr) - 1] = '\0';
 | 
			
		||||
				removeflag = 1;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for (i = 0; i < NTTYCODE; i++) {
 | 
			
		||||
				ent = &tty_term_codes[i];
 | 
			
		||||
				if (strcmp(entstr, ent->name) != 0)
 | 
			
		||||
					continue;
 | 
			
		||||
				code = &term->codes[ent->code];
 | 
			
		||||
 | 
			
		||||
				if (removeflag) {
 | 
			
		||||
					code->type = TTYCODE_NONE;
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				switch (ent->type) {
 | 
			
		||||
				case TTYCODE_NONE:
 | 
			
		||||
					break;
 | 
			
		||||
				case TTYCODE_STRING:
 | 
			
		||||
					xfree(code->value.string);
 | 
			
		||||
					code->value.string = xstrdup(val);
 | 
			
		||||
					code->type = ent->type;
 | 
			
		||||
					break;
 | 
			
		||||
				case TTYCODE_NUMBER:
 | 
			
		||||
					n = strtonum(val, 0, INT_MAX, &errstr);
 | 
			
		||||
					if (errstr != NULL)
 | 
			
		||||
						break;
 | 
			
		||||
					code->value.number = n;
 | 
			
		||||
					code->type = ent->type;
 | 
			
		||||
					break;
 | 
			
		||||
				case TTYCODE_FLAG:
 | 
			
		||||
					code->value.flag = 1;
 | 
			
		||||
					code->type = ent->type;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (val != NULL)
 | 
			
		||||
				xfree(val);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (strncmp(term->name, "xterm", 5) == 0) {
 | 
			
		||||
		/* xterm supports ich1 but some termcaps omit it. */
 | 
			
		||||
		if (!tty_term_has(term, TTYC_ICH1)) {
 | 
			
		||||
			term->codes[TTYC_ICH1].type = TTYCODE_STRING;
 | 
			
		||||
			term->codes[TTYC_ICH1].value.string = xstrdup("\033[@");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	xfree(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct tty_term *
 | 
			
		||||
tty_term_find(char *name, int fd, char **cause)
 | 
			
		||||
tty_term_find(char *name, int fd, const char *overrides, char **cause)
 | 
			
		||||
{
 | 
			
		||||
	struct tty_term			*term;
 | 
			
		||||
	struct tty_term_code_entry	*ent;
 | 
			
		||||
@@ -235,7 +298,7 @@ tty_term_find(char *name, int fd, char **cause)
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	tty_term_quirks(term);
 | 
			
		||||
	tty_term_override(term, overrides);
 | 
			
		||||
 | 
			
		||||
	/* Delete curses data. */
 | 
			
		||||
	del_curterm(cur_term);
 | 
			
		||||
@@ -297,12 +360,8 @@ tty_term_find(char *name, int fd, char **cause)
 | 
			
		||||
	 */
 | 
			
		||||
	if (tty_term_number(term, TTYC_COLORS) == 256)
 | 
			
		||||
		term->flags |= TERM_256COLOURS;
 | 
			
		||||
	if (strstr(name, "256col") != NULL) /* XXX HACK */
 | 
			
		||||
		term->flags |= TERM_256COLOURS;
 | 
			
		||||
	if (tty_term_number(term, TTYC_COLORS) == 88)
 | 
			
		||||
		term->flags |= TERM_88COLOURS;
 | 
			
		||||
	if (strstr(name, "88col") != NULL) /* XXX HACK */
 | 
			
		||||
		term->flags |= TERM_88COLOURS;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Terminals without xenl (eat newline glitch) wrap at at $COLUMNS - 1
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user