Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.