tMove win-agnostic parts of draw/drawregion to st.c - st - [fork] customized bu… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5 | |
parent 05c66cb37d9ff278a3e0c45682c4b5e7945deb42 | |
Author: Devin J. Pohly <[email protected]> | |
Date: Sat, 24 Feb 2018 14:53:23 -0600 | |
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 <[email protected]> | |
Diffstat: | |
M st.c | 25 +++++++++++++++++++++++++ | |
M st.h | 1 + | |
M win.h | 7 ++++--- | |
M x.c | 79 ++++++++++++++---------------… | |
4 files changed, 65 insertions(+), 47 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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); | |
t@@ -2527,6 +2529,29 @@ resettitle(void) | |
} | |
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) | |
{ | |
tfulldirt(); | |
diff --git a/st.h b/st.h | |
t@@ -131,6 +131,7 @@ typedef union { | |
void die(const char *, ...); | |
void redraw(void); | |
+void draw(void); | |
void iso14755(const Arg *); | |
void printscreen(const Arg *); | |
diff --git a/win.h b/win.h | |
t@@ -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 *); | |
t@@ -36,3 +36,4 @@ int xsetcursor(int); | |
void xsetmode(int, unsigned int); | |
void xsetpointermotion(int); | |
void xsetsel(char *); | |
+int xstartdraw(void); | |
diff --git a/x.c b/x.c | |
t@@ -129,7 +129,6 @@ static int xmakeglyphfontspecs(XftGlyphFontSpec *, const G… | |
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); | |
t@@ -1512,59 +1511,51 @@ 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; | |
+ XftGlyphFontSpec *specs = xw.specbuf; | |
- if (!(IS_SET(MODE_VISIBLE))) | |
- return; | |
- | |
- for (y = y1; y < y2; y++) { | |
- if (!term.dirty[y]) | |
+ numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); | |
+ i = ox = 0; | |
+ for (x = x1; x < x2 && i < numspecs; x++) { | |
+ new = line[x]; | |
+ if (new.mode == ATTR_WDUMMY) | |
continue; | |
- | |
- term.dirty[y] = 0; | |
- | |
- specs = xw.specbuf; | |
- numspecs = xmakeglyphfontspecs(specs, &term.line[y][x1], x2 - … | |
- | |
- i = ox = 0; | |
- for (x = x1; x < x2 && i < numspecs; x++) { | |
- new = term.line[y][x]; | |
- if (new.mode == ATTR_WDUMMY) | |
- continue; | |
- if (selected(x, y)) | |
- new.mode ^= ATTR_REVERSE; | |
- if (i > 0 && ATTRCMP(base, new)) { | |
- xdrawglyphfontspecs(specs, base, i, ox, y); | |
- specs += i; | |
- numspecs -= i; | |
- i = 0; | |
- } | |
- if (i == 0) { | |
- ox = x; | |
- base = new; | |
- } | |
- i++; | |
+ if (selected(x, y1)) | |
+ new.mode ^= ATTR_REVERSE; | |
+ if (i > 0 && ATTRCMP(base, new)) { | |
+ xdrawglyphfontspecs(specs, base, i, ox, y1); | |
+ specs += i; | |
+ numspecs -= i; | |
+ i = 0; | |
+ } | |
+ if (i == 0) { | |
+ ox = x; | |
+ base = new; | |
} | |
- if (i > 0) | |
- xdrawglyphfontspecs(specs, base, i, ox, y); | |
+ i++; | |
} | |
- xdrawcursor(); | |
+ if (i > 0) | |
+ 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 |