Parcourir la source

Removing the xclearborders() hack. St now cleans up the parts of the border,

if something needs to be drawn close to it.
Christoph Lohmann il y a 12 ans
Parent
commit
0cc7ee5e73
1 fichiers modifiés avec 31 ajouts et 28 suppressions
  1. 31 28
      st.c

+ 31 - 28
st.c

@@ -224,7 +224,9 @@ typedef struct {
 	int mode;
 	int bx, by;
 	int ex, ey;
-	struct {int x, y;} b, e;
+	struct {
+		int x, y;
+	} b, e;
 	char *clip;
 	Atom xtarget;
 	bool alt;
@@ -587,10 +589,10 @@ selected(int x, int y) {
 		return BETWEEN(x, bx, ex);
 	}
 
-	return ((sel.b.y < y&&y < sel.e.y)
-			|| (y==sel.e.y && x<=sel.e.x))
-			|| (y==sel.b.y && x>=sel.b.x
-					&& (x<=sel.e.x || sel.b.y!=sel.e.y));
+	return ((sel.b.y < y && y < sel.e.y)
+			|| (y == sel.e.y && x <= sel.e.x))
+			|| (y == sel.b.y && x >= sel.b.x
+				&& (x <= sel.e.x || sel.b.y != sel.e.y));
 }
 
 void
@@ -803,12 +805,12 @@ brelease(XEvent *e) {
 				/* 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] != ' ') {
+						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] != ' ') {
+						term.line[sel.ey][sel.ex+1].c[0] != ' ') {
 					sel.ex++;
 				}
 				sel.e.x = sel.ex;
@@ -1031,7 +1033,8 @@ treset(void) {
 	memset(term.tabs, 0, term.col * sizeof(*term.tabs));
 	for(i = TAB; i < term.col; i += TAB)
 		term.tabs[i] = 1;
-	term.top = 0, term.bot = term.row - 1;
+	term.top = 0;
+	term.bot = term.row - 1;
 	term.mode = MODE_WRAP;
 
 	tclearregion(0, 0, term.col-1, term.row-1);
@@ -1040,7 +1043,8 @@ treset(void) {
 void
 tnew(int col, int row) {
 	/* set screen size */
-	term.row = row, term.col = col;
+	term.row = row;
+	term.col = col;
 	term.line = xmalloc(term.row * sizeof(Line));
 	term.alt  = xmalloc(term.row * sizeof(Line));
 	term.dirty = xmalloc(term.row * sizeof(*term.dirty));
@@ -1437,8 +1441,8 @@ tsetmode(bool priv, bool set, int *args, int narg) {
 				if(IS_SET(MODE_ALTSCREEN))
 					tclearregion(0, 0, term.col-1, term.row-1);
 				if((set && !IS_SET(MODE_ALTSCREEN)) ||
-				    (!set && IS_SET(MODE_ALTSCREEN))) {
-					    tswapscreen();
+						(!set && IS_SET(MODE_ALTSCREEN))) {
+					tswapscreen();
 				}
 				if(*args != 1049)
 					break;
@@ -1909,7 +1913,6 @@ tputc(char *c, int len) {
 			case 'c': /* RIS -- Reset to inital state */
 				treset();
 				term.esc = 0;
-				xclearborders();
 				xresettitle();
 				break;
 			case '=': /* DECPAM -- Application keypad */
@@ -2090,18 +2093,6 @@ xclear(int x1, int y1, int x2, int y2) {
 			x1, y1, x2-x1, y2-y1);
 }
 
-void
-xclearborders(void) {
-	/* top and left border */
-	xclear(0, 0, BORDER, xw.h);
-	xclear(0, 0, xw.w, BORDER);
-
-	/* lower and right border */
-	xclear(BORDER, xw.th - 1, xw.w, xw.h);
-	/* Will just draw what hasn't been drawn by the previous call. */
-	xclear(xw.tw - 1, BORDER, xw.w, xw.h - xw.th - 2);
-}
-
 void
 xhints(void) {
 	XClassHint class = {opt_class ? opt_class : TNAME, TNAME};
@@ -2264,8 +2255,8 @@ xinit(void) {
 
 void
 xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
-	int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch,
-	    width = charlen*xw.cw;
+	int winx = BORDER + x * xw.cw, winy = BORDER + y * xw.ch,
+	    width = charlen * xw.cw;
 	Font *font = &dc.font;
 	XGlyphInfo extents;
 	XftColor *fg = &dc.xft_col[base.fg], *bg = &dc.xft_col[base.bg],
@@ -2328,6 +2319,20 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
 			&extents);
 	width = extents.xOff;
 
+	/* Intelligent cleaning up of the borders. */
+	if(x == 0) {
+		xclear(0, (y == 0)? 0 : winy, BORDER,
+			winy + xw.ch + (y == term.row-1)? xw.h : 0);
+	}
+	if(x + charlen >= term.col-1) {
+		xclear(winx + width, (y == 0)? 0 : winy, xw.w,
+			winy + xw.ch + (y == term.row-1)? xw.h : 0);
+	}
+	if(y == 0)
+		xclear(winx, 0, winx + width, BORDER);
+	if(y == term.row-1)
+		xclear(winx, winy + xw.ch, winx + width, xw.h);
+
 	XftDrawRect(xw.xft_draw, bg, winx, winy, width, xw.ch);
 	XftDrawStringUtf8(xw.xft_draw, fg, font->xft_set, winx,
 			winy + font->ascent, (FcChar8 *)s, bytelen);
@@ -2382,7 +2387,6 @@ void
 redraw(void) {
 	struct timespec tv = {0, REDRAW_TIMEOUT * 1000};
 
-	xclearborders();
 	tfulldirt();
 	draw();
 	XSync(xw.dpy, False); /* necessary for a good tput flash */
@@ -2598,7 +2602,6 @@ resize(XEvent *e) {
 
 	tresize(col, row);
 	xresize(col, row);
-	xclearborders();
 	ttyresize();
 }