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 tdeftran(char);
 | 
				
			||||||
static void tstrsequence(uchar);
 | 
					static void tstrsequence(uchar);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawregion(int, int, int, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void selscroll(int, int);
 | 
					static void selscroll(int, int);
 | 
				
			||||||
static void selsnap(int *, int *, int);
 | 
					static void selsnap(int *, int *, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2526,6 +2528,29 @@ resettitle(void)
 | 
				
			||||||
	xsettitle(NULL);
 | 
						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
 | 
					void
 | 
				
			||||||
redraw(void)
 | 
					redraw(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								st.h
								
								
								
								
							
							
						
						
									
										1
									
								
								st.h
								
								
								
								
							| 
						 | 
					@ -131,6 +131,7 @@ typedef union {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void die(const char *, ...);
 | 
					void die(const char *, ...);
 | 
				
			||||||
void redraw(void);
 | 
					void redraw(void);
 | 
				
			||||||
 | 
					void draw(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void iso14755(const Arg *);
 | 
					void iso14755(const Arg *);
 | 
				
			||||||
void printscreen(const Arg *);
 | 
					void printscreen(const Arg *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								win.h
								
								
								
								
							
							
						
						
									
										7
									
								
								win.h
								
								
								
								
							| 
						 | 
					@ -23,12 +23,12 @@ enum win_mode {
 | 
				
			||||||
	                  |MODE_MOUSEMANY,
 | 
						                  |MODE_MOUSEMANY,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void draw(void);
 | 
					 | 
				
			||||||
void drawregion(int, int, int, int);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void xbell(void);
 | 
					void xbell(void);
 | 
				
			||||||
void xclipcopy(void);
 | 
					void xclipcopy(void);
 | 
				
			||||||
 | 
					void xdrawcursor(void);
 | 
				
			||||||
 | 
					void xdrawline(Line, int, int, int);
 | 
				
			||||||
void xhints(void);
 | 
					void xhints(void);
 | 
				
			||||||
 | 
					void xfinishdraw(void);
 | 
				
			||||||
void xloadcols(void);
 | 
					void xloadcols(void);
 | 
				
			||||||
int xsetcolorname(int, const char *);
 | 
					int xsetcolorname(int, const char *);
 | 
				
			||||||
void xsettitle(char *);
 | 
					void xsettitle(char *);
 | 
				
			||||||
| 
						 | 
					@ -36,3 +36,4 @@ int xsetcursor(int);
 | 
				
			||||||
void xsetmode(int, unsigned int);
 | 
					void xsetmode(int, unsigned int);
 | 
				
			||||||
void xsetpointermotion(int);
 | 
					void xsetpointermotion(int);
 | 
				
			||||||
void xsetsel(char *);
 | 
					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 xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int);
 | 
				
			||||||
static void xdrawglyph(Glyph, int, int);
 | 
					static void xdrawglyph(Glyph, int, int);
 | 
				
			||||||
static void xclear(int, int, int, int);
 | 
					static void xclear(int, int, int, int);
 | 
				
			||||||
static void xdrawcursor(void);
 | 
					 | 
				
			||||||
static int xgeommasktogravity(int);
 | 
					static int xgeommasktogravity(int);
 | 
				
			||||||
static void xinit(void);
 | 
					static void xinit(void);
 | 
				
			||||||
static void cresize(int, int);
 | 
					static void cresize(int, int);
 | 
				
			||||||
| 
						 | 
					@ -1512,45 +1511,29 @@ xsettitle(char *p)
 | 
				
			||||||
	XFree(prop.value);
 | 
						XFree(prop.value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					int
 | 
				
			||||||
draw(void)
 | 
					xstartdraw(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	drawregion(0, 0, term.col, term.row);
 | 
						return IS_SET(MODE_VISIBLE);
 | 
				
			||||||
	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
 | 
					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;
 | 
						Glyph base, new;
 | 
				
			||||||
	XftGlyphFontSpec *specs;
 | 
						XftGlyphFontSpec *specs = xw.specbuf;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	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);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1);
 | 
				
			||||||
	i = ox = 0;
 | 
						i = ox = 0;
 | 
				
			||||||
	for (x = x1; x < x2 && i < numspecs; x++) {
 | 
						for (x = x1; x < x2 && i < numspecs; x++) {
 | 
				
			||||||
			new = term.line[y][x];
 | 
							new = line[x];
 | 
				
			||||||
		if (new.mode == ATTR_WDUMMY)
 | 
							if (new.mode == ATTR_WDUMMY)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
			if (selected(x, y))
 | 
							if (selected(x, y1))
 | 
				
			||||||
			new.mode ^= ATTR_REVERSE;
 | 
								new.mode ^= ATTR_REVERSE;
 | 
				
			||||||
		if (i > 0 && ATTRCMP(base, new)) {
 | 
							if (i > 0 && ATTRCMP(base, new)) {
 | 
				
			||||||
				xdrawglyphfontspecs(specs, base, i, ox, y);
 | 
								xdrawglyphfontspecs(specs, base, i, ox, y1);
 | 
				
			||||||
			specs += i;
 | 
								specs += i;
 | 
				
			||||||
			numspecs -= i;
 | 
								numspecs -= i;
 | 
				
			||||||
			i = 0;
 | 
								i = 0;
 | 
				
			||||||
| 
						 | 
					@ -1562,9 +1545,17 @@ drawregion(int x1, int y1, int x2, int y2)
 | 
				
			||||||
		i++;
 | 
							i++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (i > 0)
 | 
						if (i > 0)
 | 
				
			||||||
			xdrawglyphfontspecs(specs, base, i, ox, y);
 | 
							xdrawglyphfontspecs(specs, base, i, ox, y1);
 | 
				
			||||||
	}
 | 
					}
 | 
				
			||||||
	xdrawcursor();
 | 
					
 | 
				
			||||||
 | 
					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
 | 
					void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue