浏览代码

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

if something needs to be drawn close to it.
Christoph Lohmann 12 年之前
父节点
当前提交
0cc7ee5e73
共有 1 个文件被更改,包括 31 次插入28 次删除
  1. 31 28
      st.c

+ 31 - 28
st.c

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