Move win-agnostic parts of draw/drawregion to st.c
Introduces three functions to encapsulate X-specific behavior: * xdrawline: draws a portion of a single line (used by drawregion) * xbegindraw: called to prepare for drawing (will be useful for e.g. Wayland) and returns true if drawing should happen * xfinishdraw: called to finish drawing (used by draw) Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
This commit is contained in:
		
							parent
							
								
									05c66cb37d
								
							
						
					
					
						commit
						88d8293fb4
					
				
							
								
								
									
										25
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								st.c
									
									
									
									
									
								
							| @ -166,6 +166,8 @@ static int32_t tdefcolor(int *, int *, int); | ||||
| static void tdeftran(char); | ||||
| static void tstrsequence(uchar); | ||||
| 
 | ||||
| static void drawregion(int, int, int, int); | ||||
| 
 | ||||
| static void selscroll(int, int); | ||||
| static void selsnap(int *, int *, int); | ||||
| 
 | ||||
| @ -2526,6 +2528,29 @@ resettitle(void) | ||||
| 	xsettitle(NULL); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| drawregion(int x1, int y1, int x2, int y2) | ||||
| { | ||||
| 	int y; | ||||
| 	for (y = y1; y < y2; y++) { | ||||
| 		if (!term.dirty[y]) | ||||
| 			continue; | ||||
| 
 | ||||
| 		term.dirty[y] = 0; | ||||
| 		xdrawline(term.line[y], x1, y, x2); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void | ||||
| draw(void) | ||||
| { | ||||
| 	if (!xstartdraw()) | ||||
| 		return; | ||||
| 	drawregion(0, 0, term.col, term.row); | ||||
| 	xdrawcursor(); | ||||
| 	xfinishdraw(); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| redraw(void) | ||||
| { | ||||
|  | ||||
							
								
								
									
										1
									
								
								st.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								st.h
									
									
									
									
									
								
							| @ -131,6 +131,7 @@ typedef union { | ||||
| 
 | ||||
| void die(const char *, ...); | ||||
| void redraw(void); | ||||
| void draw(void); | ||||
| 
 | ||||
| void iso14755(const Arg *); | ||||
| void printscreen(const Arg *); | ||||
|  | ||||
							
								
								
									
										7
									
								
								win.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								win.h
									
									
									
									
									
								
							| @ -23,12 +23,12 @@ enum win_mode { | ||||
| 	                  |MODE_MOUSEMANY, | ||||
| }; | ||||
| 
 | ||||
| void draw(void); | ||||
| void drawregion(int, int, int, int); | ||||
| 
 | ||||
| void xbell(void); | ||||
| void xclipcopy(void); | ||||
| void xdrawcursor(void); | ||||
| void xdrawline(Line, int, int, int); | ||||
| void xhints(void); | ||||
| void xfinishdraw(void); | ||||
| void xloadcols(void); | ||||
| int xsetcolorname(int, const char *); | ||||
| void xsettitle(char *); | ||||
| @ -36,3 +36,4 @@ int xsetcursor(int); | ||||
| void xsetmode(int, unsigned int); | ||||
| void xsetpointermotion(int); | ||||
| void xsetsel(char *); | ||||
| int xstartdraw(void); | ||||
|  | ||||
							
								
								
									
										51
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								x.c
									
									
									
									
									
								
							| @ -129,7 +129,6 @@ static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int) | ||||
| static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); | ||||
| static void xdrawglyph(Glyph, int, int); | ||||
| static void xclear(int, int, int, int); | ||||
| static void xdrawcursor(void); | ||||
| static int xgeommasktogravity(int); | ||||
| static void xinit(void); | ||||
| static void cresize(int, int); | ||||
| @ -1512,45 +1511,29 @@ xsettitle(char *p) | ||||
| 	XFree(prop.value); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| draw(void) | ||||
| int | ||||
| xstartdraw(void) | ||||
| { | ||||
| 	drawregion(0, 0, term.col, term.row); | ||||
| 	XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, | ||||
| 			win.h, 0, 0); | ||||
| 	XSetForeground(xw.dpy, dc.gc, | ||||
| 			dc.col[IS_SET(MODE_REVERSE)? | ||||
| 				defaultfg : defaultbg].pixel); | ||||
| 	return IS_SET(MODE_VISIBLE); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| drawregion(int x1, int y1, int x2, int y2) | ||||
| xdrawline(Line line, int x1, int y1, int x2) | ||||
| { | ||||
| 	int i, x, y, ox, numspecs; | ||||
| 	int i, x, ox, numspecs; | ||||
| 	Glyph base, new; | ||||
| 	XftGlyphFontSpec *specs; | ||||
| 
 | ||||
| 	if (!(IS_SET(MODE_VISIBLE))) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (y = y1; y < y2; y++) { | ||||
| 		if (!term.dirty[y]) | ||||
| 			continue; | ||||
| 
 | ||||
| 		term.dirty[y] = 0; | ||||
| 
 | ||||
| 		specs = xw.specbuf; | ||||
| 		numspecs = xmakeglyphfontspecs(specs, &term.line[y][x1], x2 - x1, x1, y); | ||||
| 	XftGlyphFontSpec *specs = xw.specbuf; | ||||
| 
 | ||||
| 	numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); | ||||
| 	i = ox = 0; | ||||
| 	for (x = x1; x < x2 && i < numspecs; x++) { | ||||
| 			new = term.line[y][x]; | ||||
| 		new = line[x]; | ||||
| 		if (new.mode == ATTR_WDUMMY) | ||||
| 			continue; | ||||
| 			if (selected(x, y)) | ||||
| 		if (selected(x, y1)) | ||||
| 			new.mode ^= ATTR_REVERSE; | ||||
| 		if (i > 0 && ATTRCMP(base, new)) { | ||||
| 				xdrawglyphfontspecs(specs, base, i, ox, y); | ||||
| 			xdrawglyphfontspecs(specs, base, i, ox, y1); | ||||
| 			specs += i; | ||||
| 			numspecs -= i; | ||||
| 			i = 0; | ||||
| @ -1562,9 +1545,17 @@ drawregion(int x1, int y1, int x2, int y2) | ||||
| 		i++; | ||||
| 	} | ||||
| 	if (i > 0) | ||||
| 			xdrawglyphfontspecs(specs, base, i, ox, y); | ||||
| 	} | ||||
| 	xdrawcursor(); | ||||
| 		xdrawglyphfontspecs(specs, base, i, ox, y1); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| xfinishdraw(void) | ||||
| { | ||||
| 	XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, | ||||
| 			win.h, 0, 0); | ||||
| 	XSetForeground(xw.dpy, dc.gc, | ||||
| 			dc.col[IS_SET(MODE_REVERSE)? | ||||
| 				defaultfg : defaultbg].pixel); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Devin J. Pohly
						Devin J. Pohly