mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Update to be more readable and hopefully lose memory problems.
This commit is contained in:
		
							
								
								
									
										6
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								CHANGES
									
									
									
									
									
								
							@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					27 August 2007
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Change screen.c to work more logically and hopefully fix heap corruption.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
09 July 2007
 | 
					09 July 2007
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Initial import to CVS. Basic functions are working, albeit with a couple of 
 | 
					* Initial import to CVS. Basic functions are working, albeit with a couple of 
 | 
				
			||||||
@@ -8,5 +12,5 @@
 | 
				
			|||||||
  (including mutt, emacs). No status bar yet and no key remapping or other
 | 
					  (including mutt, emacs). No status bar yet and no key remapping or other
 | 
				
			||||||
  customisation.
 | 
					  customisation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$Id: CHANGES,v 1.2 2007-07-10 10:21:58 nicm Exp $
 | 
					$Id: CHANGES,v 1.3 2007-08-27 09:53:38 nicm Exp $
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										97
									
								
								screen.c
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								screen.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: screen.c,v 1.4 2007-08-27 08:15:39 nicm Exp $ */
 | 
					/* $Id: screen.c,v 1.5 2007-08-27 09:53:38 nicm Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Virtual screen and basic ANSI terminal emulator.
 | 
					 * Virtual screen and basic ANSI terminal emulator.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * XXX Most of this file sucks. There be memory corruption somewhere here.
 | 
					 * XXX Much of this file sucks.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t	 screen_store_attributes(struct buffer *, u_char);
 | 
					size_t	 screen_store_attributes(struct buffer *, u_char);
 | 
				
			||||||
@@ -88,7 +88,7 @@ screen_create(struct screen *s, u_int sx, u_int sy)
 | 
				
			|||||||
	s->grid_data = xmalloc(sy * (sizeof *s->grid_data));
 | 
						s->grid_data = xmalloc(sy * (sizeof *s->grid_data));
 | 
				
			||||||
	s->grid_attr = xmalloc(sy * (sizeof *s->grid_attr));
 | 
						s->grid_attr = xmalloc(sy * (sizeof *s->grid_attr));
 | 
				
			||||||
	s->grid_colr = xmalloc(sy * (sizeof *s->grid_colr));
 | 
						s->grid_colr = xmalloc(sy * (sizeof *s->grid_colr));
 | 
				
			||||||
	screen_make_lines(s, 0, screen_last_y(s));
 | 
						screen_make_lines(s, 0, sy);
 | 
				
			||||||
	screen_fill_screen(s, SCREEN_DEFDATA, 0, SCREEN_DEFCOLR);
 | 
						screen_fill_screen(s, SCREEN_DEFDATA, 0, SCREEN_DEFCOLR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -304,16 +304,16 @@ screen_store_colours(struct buffer *b, u_char colr)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Make a range of lines. */
 | 
					/* Make a range of lines. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
screen_make_lines(struct screen *s, u_int uy, u_int ly)
 | 
					screen_make_lines(struct screen *s, u_int py, u_int ny)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_int	i;
 | 
						u_int	i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_debug("making lines %u:%u", uy, ly);
 | 
						log_debug("making lines %u,%u", py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
 | 
						if (py > screen_last_y(s) || py + ny - 1 > screen_last_y(s))
 | 
				
			||||||
		fatalx("bad range");
 | 
							fatalx("bad range");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for (i = uy; i <= ly; i++) {
 | 
						for (i = py; i < py + ny; i++) {
 | 
				
			||||||
		s->grid_data[i] = xmalloc(s->sx);
 | 
							s->grid_data[i] = xmalloc(s->sx);
 | 
				
			||||||
		s->grid_attr[i] = xmalloc(s->sx);
 | 
							s->grid_attr[i] = xmalloc(s->sx);
 | 
				
			||||||
		s->grid_colr[i] = xmalloc(s->sx);
 | 
							s->grid_colr[i] = xmalloc(s->sx);
 | 
				
			||||||
@@ -322,65 +322,56 @@ screen_make_lines(struct screen *s, u_int uy, u_int ly)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Free a range of lines. */
 | 
					/* Free a range of lines. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
screen_free_lines(struct screen *s, u_int uy, u_int ly)
 | 
					screen_free_lines(struct screen *s, u_int py, u_int ny)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_int	i;
 | 
						u_int	i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_debug("freeing lines %u:%u", uy, ly);
 | 
						log_debug("freeing lines %u,%u", py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
 | 
						if (py > screen_last_y(s) || py + ny - 1 > screen_last_y(s))
 | 
				
			||||||
		fatalx("bad range");
 | 
							fatalx("bad range");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = uy; i <= ly; i++) {
 | 
						for (i = py; i < py + ny; i++) {
 | 
				
			||||||
		xfree(s->grid_data[i]);
 | 
							xfree(s->grid_data[i]);
 | 
				
			||||||
		s->grid_data[i] = (u_char *) 0xffffffff;
 | 
					 | 
				
			||||||
		xfree(s->grid_attr[i]);
 | 
							xfree(s->grid_attr[i]);
 | 
				
			||||||
		s->grid_attr[i] = (u_char *) 0xffffffff;
 | 
					 | 
				
			||||||
		xfree(s->grid_colr[i]);
 | 
							xfree(s->grid_colr[i]);
 | 
				
			||||||
		s->grid_colr[i] = (u_char *) 0xffffffff;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Move a range of lines. */
 | 
					/* Move a range of lines. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
screen_move_lines(struct screen *s, u_int dy, u_int uy, u_int ly)
 | 
					screen_move_lines(struct screen *s, u_int dy, u_int py, u_int ny)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_int	ny;
 | 
						log_debug("moving lines %u,%u to %u", py, ny, dy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_debug("moving lines %u:%u to %u", uy, ly, dy);
 | 
						if (py > screen_last_y(s) || py + ny - 1 > screen_last_y(s))
 | 
				
			||||||
 | 
					 | 
				
			||||||
	ny = (ly - uy) + 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
 | 
					 | 
				
			||||||
		fatalx("bad range");
 | 
							fatalx("bad range");
 | 
				
			||||||
	if (dy > screen_last_y(s))
 | 
						if (dy > screen_last_y(s) || dy == py)
 | 
				
			||||||
		fatalx("bad destination");
 | 
							fatalx("bad destination");
 | 
				
			||||||
	if (dy + ny - 1 > screen_last_y(s))
 | 
						if (dy + ny - 1 > screen_last_y(s))
 | 
				
			||||||
		fatalx("bad size");
 | 
							fatalx("bad size");
 | 
				
			||||||
	if (dy == uy)
 | 
					 | 
				
			||||||
		fatalx("null move");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memmove(
 | 
						memmove(
 | 
				
			||||||
	    &s->grid_data[dy], &s->grid_data[uy], ny * (sizeof *s->grid_data));
 | 
						    &s->grid_data[dy], &s->grid_data[py], ny * (sizeof *s->grid_data));
 | 
				
			||||||
	memmove(
 | 
						memmove(
 | 
				
			||||||
	    &s->grid_attr[dy], &s->grid_attr[uy], ny * (sizeof *s->grid_attr));
 | 
						    &s->grid_attr[dy], &s->grid_attr[py], ny * (sizeof *s->grid_attr));
 | 
				
			||||||
	memmove(
 | 
						memmove(
 | 
				
			||||||
	    &s->grid_colr[dy], &s->grid_colr[uy], ny * (sizeof *s->grid_colr));
 | 
						    &s->grid_colr[dy], &s->grid_colr[py], ny * (sizeof *s->grid_colr));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Fill a range of lines. */
 | 
					/* Fill a range of lines. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
screen_fill_lines(
 | 
					screen_fill_lines(
 | 
				
			||||||
    struct screen *s, u_int uy, u_int ly, u_char data, u_char attr, u_char colr)
 | 
					    struct screen *s, u_int py, u_int ny, u_char data, u_char attr, u_char colr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_int	i;
 | 
						u_int	i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_debug("filling lines %u:%u", uy, ly);
 | 
						log_debug("filling lines %u,%u", py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
 | 
						if (py > screen_last_y(s) || py + ny - 1 > screen_last_y(s))
 | 
				
			||||||
		fatalx("bad range");
 | 
							fatalx("bad range");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = uy; i <= ly; i++)
 | 
						for (i = py; i < py + ny; i++)
 | 
				
			||||||
		screen_fill_line(s, i, data, attr, colr);
 | 
							screen_fill_line(s, i, data, attr, colr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -763,13 +754,28 @@ screen_insert_lines(struct screen *s, u_int py, u_int ny)
 | 
				
			|||||||
		ny = screen_last_y(s) - py;
 | 
							ny = screen_last_y(s) - py;
 | 
				
			||||||
	log_debug("inserting lines: %u,%u", py, ny);
 | 
						log_debug("inserting lines: %u,%u", py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_free_lines(s, (screen_last_y(s) - ny) + 1, screen_last_y(s));
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Insert range of ny lines at py:
 | 
				
			||||||
 | 
						 *	- Free ny lines from end of screen.
 | 
				
			||||||
 | 
						 *	- Move from py to end of screen - ny to py + ny.
 | 
				
			||||||
 | 
						 *	- Create ny lines at py.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * Example: insert 2 lines at 4.
 | 
				
			||||||
 | 
						 *	sy = 10, py = 4, ny = 2
 | 
				
			||||||
 | 
						 *	screen_free_lines(s, 8, 2);	- delete lines 8,9
 | 
				
			||||||
 | 
						 *	screen_move_lines(s, 6, 4, 4);	- move 4,5,6,7 to 6,7,8,9
 | 
				
			||||||
 | 
						 *	screen_make_lines(s, 4, 2);	- make lines 4,5
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen_free_lines(s, s->sy - ny, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (py != screen_last_y(s))
 | 
						if (py != screen_last_y(s))
 | 
				
			||||||
		screen_move_lines(s, py + ny, py, screen_last_y(s) - ny);
 | 
							screen_move_lines(s, py + ny, py, s->sy - py - ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen_make_lines(s, py, ny);
 | 
				
			||||||
	screen_fill_lines(
 | 
						screen_fill_lines(
 | 
				
			||||||
	    s, py, py + ny - 1, SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
 | 
						    s, py, ny, SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Delete lines. */
 | 
					/* Delete lines. */
 | 
				
			||||||
@@ -783,14 +789,27 @@ screen_delete_lines(struct screen *s, u_int py, u_int ny)
 | 
				
			|||||||
		ny = screen_last_y(s) - py;
 | 
							ny = screen_last_y(s) - py;
 | 
				
			||||||
	log_debug("deleting lines: %u,%u", py, ny);
 | 
						log_debug("deleting lines: %u,%u", py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_free_lines(s, py, py + ny - 1);
 | 
						/*
 | 
				
			||||||
 | 
						 * Delete range of ny lines at py:
 | 
				
			||||||
 | 
						 * 	- Free ny lines at py.
 | 
				
			||||||
 | 
						 *	- Move from py + ny to end of screen to py.
 | 
				
			||||||
 | 
						 *	- Free and recreate last ny lines.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * Example: delete lines 3,4.
 | 
				
			||||||
 | 
						 *	sy = 10, py = 3, ny = 2
 | 
				
			||||||
 | 
						 *	screen_free_lines(s, 3, 2);	- delete lines 3,4
 | 
				
			||||||
 | 
						 *	screen_move_lines(s, 3, 5, 5);	- move 5,6,7,8,9 to 3
 | 
				
			||||||
 | 
						 *	screen_make_lines(s, 8, 2);	- make lines 8,9
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						screen_free_lines(s, py, ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (py != screen_last_y(s))
 | 
						if (py != screen_last_y(s))
 | 
				
			||||||
		screen_move_lines(s, py, py + ny, screen_last_y(s));
 | 
							screen_move_lines(s, py, py + ny, s->sy - py - ny);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_make_lines(s, (screen_last_y(s) - ny) + 1, screen_last_y(s));
 | 
						screen_make_lines(s, s->sy - ny, ny);
 | 
				
			||||||
	screen_fill_lines(s, (screen_last_y(s) - ny) + 1,
 | 
						screen_fill_lines(
 | 
				
			||||||
	    screen_last_y(s), SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
 | 
						    s, s->sy - ny, ny, SCREEN_DEFDATA, SCREEN_DEFATTR, SCREEN_DEFCOLR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Insert characters. */
 | 
					/* Insert characters. */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: session.c,v 1.2 2007-07-25 23:13:18 nicm Exp $ */
 | 
					/* $Id: session.c,v 1.3 2007-08-27 09:53:38 nicm Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -19,6 +19,7 @@
 | 
				
			|||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tmux.h"
 | 
					#include "tmux.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user