add dirty flag for lines
This commit is contained in:
		
							parent
							
								
									907cb8bfa6
								
							
						
					
					
						commit
						0dbf9c8c12
					
				
							
								
								
									
										43
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								st.c
									
									
									
									
									
								
							| @ -111,6 +111,7 @@ typedef struct { | |||||||
| 	int col;	/* nb col */ | 	int col;	/* nb col */ | ||||||
| 	Line* line;	/* screen */ | 	Line* line;	/* screen */ | ||||||
| 	Line* alt;	/* alternate screen */ | 	Line* alt;	/* alternate screen */ | ||||||
|  | 	char* dirty; /* dirtyness of lines */ | ||||||
| 	TCursor c;	/* cursor */ | 	TCursor c;	/* cursor */ | ||||||
| 	int top;	/* top    scroll limit */ | 	int top;	/* top    scroll limit */ | ||||||
| 	int bot;	/* bottom scroll limit */ | 	int bot;	/* bottom scroll limit */ | ||||||
| @ -203,6 +204,7 @@ static void tsetattr(int*, int); | |||||||
| static void tsetchar(char*); | static void tsetchar(char*); | ||||||
| static void tsetscroll(int, int); | static void tsetscroll(int, int); | ||||||
| static void tswapscreen(void); | static void tswapscreen(void); | ||||||
|  | static void tfulldirt(void); | ||||||
| 
 | 
 | ||||||
| static void ttynew(void); | static void ttynew(void); | ||||||
| static void ttyread(void); | static void ttyread(void); | ||||||
| @ -748,6 +750,14 @@ ttyresize(int x, int y) { | |||||||
| 		fprintf(stderr, "Couldn't set window size: %s\n", SERRNO); | 		fprintf(stderr, "Couldn't set window size: %s\n", SERRNO); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | tfulldirt(void) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	for(i = 0; i < term.row; i++) | ||||||
|  | 		term.dirty[i] = 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| tcursor(int mode) { | tcursor(int mode) { | ||||||
| 	static TCursor c; | 	static TCursor c; | ||||||
| @ -777,9 +787,12 @@ tnew(int col, int row) { | |||||||
| 	term.row = row, term.col = col; | 	term.row = row, term.col = col; | ||||||
| 	term.line = malloc(term.row * sizeof(Line)); | 	term.line = malloc(term.row * sizeof(Line)); | ||||||
| 	term.alt  = malloc(term.row * sizeof(Line)); | 	term.alt  = malloc(term.row * sizeof(Line)); | ||||||
|  | 	term.dirty = malloc(term.row * sizeof(*term.dirty)); | ||||||
|  | 
 | ||||||
| 	for(row = 0; row < term.row; row++) { | 	for(row = 0; row < term.row; row++) { | ||||||
| 		term.line[row] = malloc(term.col * sizeof(Glyph)); | 		term.line[row] = malloc(term.col * sizeof(Glyph)); | ||||||
| 		term.alt [row] = malloc(term.col * sizeof(Glyph)); | 		term.alt [row] = malloc(term.col * sizeof(Glyph)); | ||||||
|  | 		term.dirty[row] = 0; | ||||||
| 	} | 	} | ||||||
| 	/* setup screen */ | 	/* setup screen */ | ||||||
| 	treset(); | 	treset(); | ||||||
| @ -791,6 +804,7 @@ tswapscreen(void) { | |||||||
| 	term.line = term.alt; | 	term.line = term.alt; | ||||||
| 	term.alt = tmp; | 	term.alt = tmp; | ||||||
| 	term.mode ^= MODE_ALTSCREEN; | 	term.mode ^= MODE_ALTSCREEN; | ||||||
|  | 	tfulldirt(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -806,6 +820,9 @@ tscrolldown(int orig, int n) { | |||||||
| 		temp = term.line[i]; | 		temp = term.line[i]; | ||||||
| 		term.line[i] = term.line[i-n]; | 		term.line[i] = term.line[i-n]; | ||||||
| 		term.line[i-n] = temp; | 		term.line[i-n] = temp; | ||||||
|  | 
 | ||||||
|  | 		term.dirty[i] = 1; | ||||||
|  | 		term.dirty[i-n] = 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	selscroll(orig, n); | 	selscroll(orig, n); | ||||||
| @ -823,6 +840,9 @@ tscrollup(int orig, int n) { | |||||||
| 		 temp = term.line[i]; | 		 temp = term.line[i]; | ||||||
| 		 term.line[i] = term.line[i+n]; | 		 term.line[i] = term.line[i+n]; | ||||||
| 		 term.line[i+n] = temp; | 		 term.line[i+n] = temp; | ||||||
|  | 
 | ||||||
|  | 		 term.dirty[i] = 1; | ||||||
|  | 		 term.dirty[i+n] = 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	selscroll(orig, -n); | 	selscroll(orig, -n); | ||||||
| @ -896,6 +916,7 @@ tmoveto(int x, int y) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| tsetchar(char *c) { | tsetchar(char *c) { | ||||||
|  | 	term.dirty[term.c.y] = 1; | ||||||
| 	term.line[term.c.y][term.c.x] = term.c.attr; | 	term.line[term.c.y][term.c.x] = term.c.attr; | ||||||
| 	memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); | 	memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); | ||||||
| 	term.line[term.c.y][term.c.x].state |= GLYPH_SET; | 	term.line[term.c.y][term.c.x].state |= GLYPH_SET; | ||||||
| @ -915,9 +936,11 @@ tclearregion(int x1, int y1, int x2, int y2) { | |||||||
| 	LIMIT(y1, 0, term.row-1); | 	LIMIT(y1, 0, term.row-1); | ||||||
| 	LIMIT(y2, 0, term.row-1); | 	LIMIT(y2, 0, term.row-1); | ||||||
| 
 | 
 | ||||||
| 	for(y = y1; y <= y2; y++) | 	for(y = y1; y <= y2; y++) { | ||||||
|  | 		term.dirty[y] = 1; | ||||||
| 		for(x = x1; x <= x2; x++) | 		for(x = x1; x <= x2; x++) | ||||||
| 			term.line[y][x].state = 0; | 			term.line[y][x].state = 0; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -926,6 +949,8 @@ tdeletechar(int n) { | |||||||
| 	int dst = term.c.x; | 	int dst = term.c.x; | ||||||
| 	int size = term.col - src; | 	int size = term.col - src; | ||||||
| 	 | 	 | ||||||
|  | 	term.dirty[term.c.y] = 1; | ||||||
|  | 
 | ||||||
| 	if(src >= term.col) { | 	if(src >= term.col) { | ||||||
| 		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); | 		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); | ||||||
| 		return; | 		return; | ||||||
| @ -940,6 +965,8 @@ tinsertblank(int n) { | |||||||
| 	int dst = src + n; | 	int dst = src + n; | ||||||
| 	int size = term.col - dst; | 	int size = term.col - dst; | ||||||
| 
 | 
 | ||||||
|  | 	term.dirty[term.c.y] = 1; | ||||||
|  | 
 | ||||||
| 	if(dst >= term.col) { | 	if(dst >= term.col) { | ||||||
| 		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); | 		tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); | ||||||
| 		return; | 		return; | ||||||
| @ -1411,7 +1438,8 @@ tputc(char *c) { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey)) sel.bx = -1; | 		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey)) | ||||||
|  | 			sel.bx = -1; | ||||||
| 		switch(ascii) { | 		switch(ascii) { | ||||||
| 		case '\t': | 		case '\t': | ||||||
| 			tputtab(); | 			tputtab(); | ||||||
| @ -1479,9 +1507,11 @@ tresize(int col, int row) { | |||||||
| 	/* resize to new height */ | 	/* resize to new height */ | ||||||
| 	term.line = realloc(term.line, row * sizeof(Line)); | 	term.line = realloc(term.line, row * sizeof(Line)); | ||||||
| 	term.alt  = realloc(term.alt,  row * sizeof(Line)); | 	term.alt  = realloc(term.alt,  row * sizeof(Line)); | ||||||
|  | 	term.dirty = realloc(term.dirty, row * sizeof(*term.dirty)); | ||||||
| 
 | 
 | ||||||
| 	/* resize each row to new width, zero-pad if needed */ | 	/* resize each row to new width, zero-pad if needed */ | ||||||
| 	for(i = 0; i < minrow; i++) { | 	for(i = 0; i < minrow; i++) { | ||||||
|  | 		term.dirty[i] = 1; | ||||||
| 		term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); | 		term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); | ||||||
| 		term.alt[i]  = realloc(term.alt[i],  col * sizeof(Glyph)); | 		term.alt[i]  = realloc(term.alt[i],  col * sizeof(Glyph)); | ||||||
| 		for(x = mincol; x < col; x++) { | 		for(x = mincol; x < col; x++) { | ||||||
| @ -1492,6 +1522,7 @@ tresize(int col, int row) { | |||||||
| 
 | 
 | ||||||
| 	/* allocate any new rows */ | 	/* allocate any new rows */ | ||||||
| 	for(/* i == minrow */; i < row; i++) { | 	for(/* i == minrow */; i < row; i++) { | ||||||
|  | 		term.dirty[i] = 1; | ||||||
| 		term.line[i] = calloc(col, sizeof(Glyph)); | 		term.line[i] = calloc(col, sizeof(Glyph)); | ||||||
| 		term.alt [i] = calloc(col, sizeof(Glyph)); | 		term.alt [i] = calloc(col, sizeof(Glyph)); | ||||||
| 	} | 	} | ||||||
| @ -1502,6 +1533,7 @@ tresize(int col, int row) { | |||||||
| 	tmoveto(term.c.x, term.c.y); | 	tmoveto(term.c.x, term.c.y); | ||||||
| 	/* reset scrolling region */ | 	/* reset scrolling region */ | ||||||
| 	tsetscroll(0, row-1); | 	tsetscroll(0, row-1); | ||||||
|  | 
 | ||||||
| 	return (slide > 0); | 	return (slide > 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1792,8 +1824,11 @@ drawregion(int x1, int y1, int x2, int y2) { | |||||||
| 	if(!(xw.state & WIN_VISIBLE)) | 	if(!(xw.state & WIN_VISIBLE)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	xclear(x1, y1, x2-1, y2-1); |  | ||||||
| 	for(y = y1; y < y2; y++) { | 	for(y = y1; y < y2; y++) { | ||||||
|  | 		if(!term.dirty[y]) | ||||||
|  | 			continue; | ||||||
|  | 		xclear(0, y, term.col, y); | ||||||
|  | 		term.dirty[y] = 0; | ||||||
| 		base = term.line[y][0]; | 		base = term.line[y][0]; | ||||||
| 		ic = ib = ox = 0; | 		ic = ib = ox = 0; | ||||||
| 		for(x = x1; x < x2; x++) { | 		for(x = x1; x < x2; x++) { | ||||||
| @ -1801,7 +1836,7 @@ drawregion(int x1, int y1, int x2, int y2) { | |||||||
| 			if(sel.bx != -1 && *(new.c) && selected(x, y)) | 			if(sel.bx != -1 && *(new.c) && selected(x, y)) | ||||||
| 				new.mode ^= ATTR_REVERSE; | 				new.mode ^= ATTR_REVERSE; | ||||||
| 			if(ib > 0 && (!(new.state & GLYPH_SET) || ATTRCMP(base, new) || | 			if(ib > 0 && (!(new.state & GLYPH_SET) || ATTRCMP(base, new) || | ||||||
| 					ib >= DRAW_BUF_SIZ-UTF_SIZ)) { | 						  ib >= DRAW_BUF_SIZ-UTF_SIZ)) { | ||||||
| 				xdraws(buf, base, ox, y, ic, ib); | 				xdraws(buf, base, ox, y, ic, ib); | ||||||
| 				ic = ib = 0; | 				ic = ib = 0; | ||||||
| 			} | 			} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user