Got rid of redundant Glyph state.
Now, newly allocated Glyphs are set to spaces and current cursor colors with tclearregion() routine. Signed-off-by: Christoph Lohmann <20h@r-36.net>
This commit is contained in:
		
							parent
							
								
									3ae0299064
								
							
						
					
					
						commit
						b7e6a5c825
					
				
							
								
								
									
										79
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								st.c
									
									
									
									
									
								
							| @ -98,11 +98,6 @@ enum cursor_state { | ||||
| 	CURSOR_ORIGIN	= 2 | ||||
| }; | ||||
| 
 | ||||
| enum glyph_state { | ||||
| 	GLYPH_SET   = 1, | ||||
| 	GLYPH_DIRTY = 2 | ||||
| }; | ||||
| 
 | ||||
| enum term_mode { | ||||
| 	MODE_WRAP	 = 1, | ||||
| 	MODE_INSERT      = 2, | ||||
| @ -154,7 +149,6 @@ typedef struct { | ||||
| 	uchar mode;  /* attribute flags */ | ||||
| 	ushort fg;   /* foreground  */ | ||||
| 	ushort bg;   /* background  */ | ||||
| 	uchar state; /* state flags    */ | ||||
| } Glyph; | ||||
| 
 | ||||
| typedef Glyph *Line; | ||||
| @ -757,7 +751,7 @@ bpress(XEvent *e) { | ||||
| 
 | ||||
| void | ||||
| selcopy(void) { | ||||
| 	char *str, *ptr, *p; | ||||
| 	char *str, *ptr; | ||||
| 	int x, y, bufsize, isselected = 0, size; | ||||
| 	Glyph *gp, *last; | ||||
| 
 | ||||
| @ -773,8 +767,8 @@ selcopy(void) { | ||||
| 			gp = &term.line[y][0]; | ||||
| 			last = gp + term.col; | ||||
| 
 | ||||
| 			while(--last >= gp && !((last->state & GLYPH_SET) && \ | ||||
| 						selected(last - gp, y) && strcmp(last->c, " ") != 0)) | ||||
| 			while(--last >= gp && !(selected(last - gp, y) && \ | ||||
| 						strcmp(last->c, " ") != 0)) | ||||
| 				/* nothing */; | ||||
| 
 | ||||
| 			for(x = 0; gp <= last; x++, ++gp) { | ||||
| @ -784,9 +778,8 @@ selcopy(void) { | ||||
| 					isselected = 1; | ||||
| 				} | ||||
| 
 | ||||
| 				p = (gp->state & GLYPH_SET) ? gp->c : " "; | ||||
| 				size = utf8size(p); | ||||
| 				memcpy(ptr, p, size); | ||||
| 				size = utf8size(gp->c); | ||||
| 				memcpy(ptr, gp->c, size); | ||||
| 				ptr += size; | ||||
| 			} | ||||
| 
 | ||||
| @ -943,13 +936,11 @@ brelease(XEvent *e) { | ||||
| 			} else if(TIMEDIFF(now, sel.tclick1) <= doubleclicktimeout) { | ||||
| 				/* double click to select word */ | ||||
| 				sel.bx = sel.ex; | ||||
| 				while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].state & GLYPH_SET && | ||||
| 						term.line[sel.ey][sel.bx-1].c[0] != ' ') { | ||||
| 				while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].c[0] != ' ') { | ||||
| 					sel.bx--; | ||||
| 				} | ||||
| 				sel.b.x = sel.bx; | ||||
| 				while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].state & GLYPH_SET && | ||||
| 						term.line[sel.ey][sel.ex+1].c[0] != ' ') { | ||||
| 				while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].c[0] != ' ') { | ||||
| 					sel.ex++; | ||||
| 				} | ||||
| 				sel.e.x = sel.ex; | ||||
| @ -1373,7 +1364,6 @@ tsetchar(char *c, Glyph *attr, int x, int y) { | ||||
| 	term.dirty[y] = 1; | ||||
| 	term.line[y][x] = *attr; | ||||
| 	memcpy(term.line[y][x].c, c, UTF_SIZ); | ||||
| 	term.line[y][x].state |= GLYPH_SET; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| @ -1395,7 +1385,6 @@ tclearregion(int x1, int y1, int x2, int y2) { | ||||
| 		for(x = x1; x <= x2; x++) { | ||||
| 			term.line[y][x] = term.c.attr; | ||||
| 			memcpy(term.line[y][x].c, " ", 2); | ||||
| 			term.line[y][x].state |= GLYPH_SET; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -2263,11 +2252,12 @@ tputc(char *c, int len) { | ||||
| 
 | ||||
| int | ||||
| tresize(int col, int row) { | ||||
| 	int i, x; | ||||
| 	int i; | ||||
| 	int minrow = MIN(row, term.row); | ||||
| 	int mincol = MIN(col, term.col); | ||||
| 	int slide = term.c.y - row + 1; | ||||
| 	bool *bp; | ||||
| 	Line *orig; | ||||
| 
 | ||||
| 	if(col < 1 || row < 1) | ||||
| 		return 0; | ||||
| @ -2303,10 +2293,6 @@ tresize(int col, int row) { | ||||
| 		term.dirty[i] = 1; | ||||
| 		term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); | ||||
| 		term.alt[i]  = xrealloc(term.alt[i],  col * sizeof(Glyph)); | ||||
| 		for(x = mincol; x < col; x++) { | ||||
| 			term.line[i][x].state = 0; | ||||
| 			term.alt[i][x].state = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* allocate any new rows */ | ||||
| @ -2331,6 +2317,17 @@ tresize(int col, int row) { | ||||
| 	tsetscroll(0, row-1); | ||||
| 	/* make use of the LIMIT in tmoveto */ | ||||
| 	tmoveto(term.c.x, term.c.y); | ||||
| 	/* Clearing both screens */ | ||||
| 	orig = term.line; | ||||
| 	do {	 | ||||
| 		if(mincol < col && 0 < minrow) { | ||||
| 			tclearregion(mincol, 0, col - 1, minrow - 1); | ||||
| 		} | ||||
| 		if(0 < col && minrow < row) { | ||||
| 			tclearregion(0, minrow, col - 1, row - 1); | ||||
| 		} | ||||
| 		tswapscreen(); | ||||
| 	} while(orig != term.line); | ||||
| 
 | ||||
| 	return (slide > 0); | ||||
| } | ||||
| @ -2932,22 +2929,17 @@ void | ||||
| xdrawcursor(void) { | ||||
| 	static int oldx = 0, oldy = 0; | ||||
| 	int sl; | ||||
| 	Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs, 0}; | ||||
| 	Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs}; | ||||
| 
 | ||||
| 	LIMIT(oldx, 0, term.col-1); | ||||
| 	LIMIT(oldy, 0, term.row-1); | ||||
| 
 | ||||
| 	if(term.line[term.c.y][term.c.x].state & GLYPH_SET) | ||||
| 		memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | ||||
| 	memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | ||||
| 
 | ||||
| 	/* remove the old cursor */ | ||||
| 	if(term.line[oldy][oldx].state & GLYPH_SET) { | ||||
| 		sl = utf8size(term.line[oldy][oldx].c); | ||||
| 		xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | ||||
| 				oldy, 1, sl); | ||||
| 	} else { | ||||
| 		xtermclear(oldx, oldy, oldx, oldy); | ||||
| 	} | ||||
| 	sl = utf8size(term.line[oldy][oldx].c); | ||||
| 	xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | ||||
| 			oldy, 1, sl); | ||||
| 
 | ||||
| 	/* draw the new one */ | ||||
| 	if(!(IS_SET(MODE_HIDE))) { | ||||
| @ -3045,23 +3037,20 @@ drawregion(int x1, int y1, int x2, int y2) { | ||||
| 			new = term.line[y][x]; | ||||
| 			if(ena_sel && *(new.c) && selected(x, y)) | ||||
| 				new.mode ^= ATTR_REVERSE; | ||||
| 			if(ib > 0 && (!(new.state & GLYPH_SET) | ||||
| 					|| ATTRCMP(base, new) | ||||
| 			if(ib > 0 && (ATTRCMP(base, new) | ||||
| 					|| ib >= DRAW_BUF_SIZ-UTF_SIZ)) { | ||||
| 				xdraws(buf, base, ox, y, ic, ib); | ||||
| 				ic = ib = 0; | ||||
| 			} | ||||
| 			if(new.state & GLYPH_SET) { | ||||
| 				if(ib == 0) { | ||||
| 					ox = x; | ||||
| 					base = new; | ||||
| 				} | ||||
| 
 | ||||
| 				sl = utf8size(new.c); | ||||
| 				memcpy(buf+ib, new.c, sl); | ||||
| 				ib += sl; | ||||
| 				++ic; | ||||
| 			if(ib == 0) { | ||||
| 				ox = x; | ||||
| 				base = new; | ||||
| 			} | ||||
| 
 | ||||
| 			sl = utf8size(new.c); | ||||
| 			memcpy(buf+ib, new.c, sl); | ||||
| 			ib += sl; | ||||
| 			++ic; | ||||
| 		} | ||||
| 		if(ib > 0) | ||||
| 			xdraws(buf, base, ox, y, ic, ib); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user