tRemoving the xclearborders() hack. St now cleans up the parts of the border, -… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 0cc7ee5e737c9df5a41a4bca708e583117830085 | |
parent 4eddf19fdc2f3845c927291b99d3faefe73f98f3 | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sat, 6 Oct 2012 13:43:01 +0200 | |
Removing the xclearborders() hack. St now cleans up the parts of the border, | |
if something needs to be drawn close to it. | |
Diffstat: | |
M st.c | 59 ++++++++++++++++-------------… | |
1 file changed, 31 insertions(+), 28 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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; | |
t@@ -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 | |
t@@ -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… | |
- term.line[sel.ey][sel.bx-1].c[0] != … | |
+ term.line[sel.ey][sel.bx-1].c[… | |
sel.bx--; | |
} | |
sel.b.x = sel.bx; | |
while(sel.ex < term.col-1 && term.line[sel.ey]… | |
- term.line[sel.ey][sel.ex+1].c[0] != … | |
+ term.line[sel.ey][sel.ex+1].c[… | |
sel.ex++; | |
} | |
sel.e.x = sel.ex; | |
t@@ -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); | |
t@@ -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)); | |
t@@ -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.ro… | |
if((set && !IS_SET(MODE_ALTSCREEN)) || | |
- (!set && IS_SET(MODE_ALTSCREEN))) { | |
- tswapscreen(); | |
+ (!set && IS_SET(MODE_ALTSCREEN… | |
+ tswapscreen(); | |
} | |
if(*args != 1049) | |
break; | |
t@@ -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 */ | |
t@@ -2091,18 +2094,6 @@ xclear(int x1, int y1, int x2, int y2) { | |
} | |
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}; | |
XWMHints wm = {.flags = InputHint, .input = 1}; | |
t@@ -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], | |
t@@ -2328,6 +2319,20 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, … | |
&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); | |
t@@ -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 */ | |
t@@ -2598,7 +2602,6 @@ resize(XEvent *e) { | |
tresize(col, row); | |
xresize(col, row); | |
- xclearborders(); | |
ttyresize(); | |
} | |