aboutsummaryrefslogtreecommitdiff
path: root/x.c
diff options
context:
space:
mode:
authorProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-07-26 20:57:29 +0100
committerProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-07-26 20:57:29 +0100
commite5d94759bdd8a40cd4761fdbac326cc7e97759cd (patch)
tree5f3a2d42def9c34c453f1fc8fd2708a5104abf11 /x.c
parent5db9f68f1d2ecd48f6a5a0af707a45e63c352faa (diff)
'upgrades, people, upgrades'
Diffstat (limited to 'x.c')
-rwxr-xr-x[-rw-r--r--]x.c414
1 files changed, 37 insertions, 377 deletions
diff --git a/x.c b/x.c
index 0f775ce..3abb6e7 100644..100755
--- a/x.c
+++ b/x.c
@@ -4,8 +4,6 @@
#include <limits.h>
#include <locale.h>
#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
#include <sys/select.h>
#include <time.h>
#include <unistd.h>
@@ -21,7 +19,6 @@ char *argv0;
#include "arg.h"
#include "st.h"
#include "win.h"
-#include "graphics.h"
/* types used in config.h */
typedef struct {
@@ -65,13 +62,6 @@ static void ttysend(const Arg *);
static void chgalpha(const Arg *);
-static void previewimage(const Arg *);
-static void showimageinfo(const Arg *);
-static void togglegrdebug(const Arg *);
-static void dumpgrstate(const Arg *);
-static void unloadimages(const Arg *);
-static void toggleimages(const Arg *);
-
/* config.h for applying patches and the configuration. */
#include "config.h"
@@ -93,7 +83,6 @@ typedef XftGlyphFontSpec GlyphFontSpec;
typedef struct {
int tw, th; /* tty width and height */
int w, h; /* window width and height */
- int hborderpx, vborderpx;
int ch; /* char height */
int cw; /* char width */
int mode; /* window state/mode flags */
@@ -158,8 +147,6 @@ static inline ushort sixd_to_16bit(int);
static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int);
static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int);
static void xdrawglyph(Glyph, int, int);
-static void xdrawimages(Glyph, Line, int x1, int y1, int x2);
-static void xdrawoneimagecell(Glyph, int x, int y);
static void xclear(int, int, int, int);
static int xgeommasktogravity(int);
static int ximopen(Display *);
@@ -236,7 +223,6 @@ static DC dc;
static XWindow xw;
static XSelection xsel;
static TermWindow win;
-static unsigned int mouse_col = 0, mouse_row = 0;
/* Font Ring Cache */
enum {
@@ -350,72 +336,10 @@ ttysend(const Arg *arg)
ttywrite(arg->s, strlen(arg->s), 1);
}
-void
-previewimage(const Arg *arg)
-{
- Glyph g = getglyphat(mouse_col, mouse_row);
- if (g.mode & ATTR_IMAGE) {
- uint32_t image_id = tgetimgid(&g);
- fprintf(stderr, "Clicked on placeholder %u/%u, x=%d, y=%d\n",
- image_id, tgetimgplacementid(&g), tgetimgcol(&g),
- tgetimgrow(&g));
- gr_preview_image(image_id, arg->s);
- }
-}
-
-void
-showimageinfo(const Arg *arg)
-{
- Glyph g = getglyphat(mouse_col, mouse_row);
- if (g.mode & ATTR_IMAGE) {
- uint32_t image_id = tgetimgid(&g);
- fprintf(stderr, "Clicked on placeholder %u/%u, x=%d, y=%d\n",
- image_id, tgetimgplacementid(&g), tgetimgcol(&g),
- tgetimgrow(&g));
- char stcommand[256] = {0};
- size_t len = snprintf(stcommand, sizeof(stcommand), "%s -e less", argv0);
- if (len > sizeof(stcommand) - 1) {
- fprintf(stderr, "Executable name too long: %s\n",
- argv0);
- return;
- }
- gr_show_image_info(image_id, tgetimgplacementid(&g),
- tgetimgcol(&g), tgetimgrow(&g),
- tgetisclassicplaceholder(&g),
- tgetimgdiacriticcount(&g), argv0);
- }
-}
-
-void
-togglegrdebug(const Arg *arg)
-{
- graphics_debug_mode = (graphics_debug_mode + 1) % 3;
- redraw();
-}
-
-void
-dumpgrstate(const Arg *arg)
-{
- gr_dump_state();
-}
-
-void
-unloadimages(const Arg *arg)
-{
- gr_unload_images_to_reduce_ram();
-}
-
-void
-toggleimages(const Arg *arg)
-{
- graphics_display_images = !graphics_display_images;
- redraw();
-}
-
int
evcol(XEvent *e)
{
- int x = e->xbutton.x - win.hborderpx;
+ int x = e->xbutton.x - borderpx;
LIMIT(x, 0, win.tw - 1);
return x / win.cw;
}
@@ -423,7 +347,7 @@ evcol(XEvent *e)
int
evrow(XEvent *e)
{
- int y = e->xbutton.y - win.vborderpx;
+ int y = e->xbutton.y - borderpx;
LIMIT(y, 0, win.th - 1);
return y / win.ch;
}
@@ -536,9 +460,6 @@ mouseaction(XEvent *e, uint release)
/* ignore Button<N>mask for Button<N> - it's set on release */
uint state = e->xbutton.state & ~buttonmask(e->xbutton.button);
- mouse_col = evcol(e);
- mouse_row = evrow(e);
-
for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
if (ms->release == release &&
ms->button == e->xbutton.button &&
@@ -826,9 +747,6 @@ cresize(int width, int height)
col = MAX(1, col);
row = MAX(1, row);
- win.hborderpx = (win.w - col * win.cw) * anysize_halign / 100;
- win.vborderpx = (win.h - row * win.ch) * anysize_valign / 100;
-
tresize(col, row);
xresize(col, row);
ttyresize(win.tw, win.th);
@@ -969,8 +887,8 @@ xhints(void)
sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
sizeh->height = win.h;
sizeh->width = win.w;
- sizeh->height_inc = 1;
- sizeh->width_inc = 1;
+ sizeh->height_inc = win.ch;
+ sizeh->width_inc = win.cw;
sizeh->base_height = 2 * borderpx;
sizeh->base_width = 2 * borderpx;
sizeh->min_height = win.ch + 2 * borderpx;
@@ -1114,8 +1032,7 @@ xloadfonts(const char *fontstr, double fontsize)
FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12);
usedfontsize = 12;
}
- if (defaultfontsize <= 0)
- defaultfontsize = usedfontsize;
+ defaultfontsize = usedfontsize;
}
if (xloadfont(&dc.font, pattern))
@@ -1125,7 +1042,7 @@ xloadfonts(const char *fontstr, double fontsize)
FcPatternGetDouble(dc.font.match->pattern,
FC_PIXEL_SIZE, 0, &fontval);
usedfontsize = fontval;
- if (defaultfontsize <= 0 && fontsize == 0)
+ if (fontsize == 0)
defaultfontsize = fontval;
}
@@ -1273,8 +1190,8 @@ xinit(int cols, int rows)
xloadcols();
/* adjust fixed window geometry */
- win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw;
- win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch;
+ win.w = 2 * borderpx + cols * win.cw;
+ win.h = 2 * borderpx + rows * win.ch;
if (xw.gm & XNegative)
xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
if (xw.gm & YNegative)
@@ -1358,15 +1275,12 @@ xinit(int cols, int rows)
xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0);
if (xsel.xtarget == None)
xsel.xtarget = XA_STRING;
-
- // Initialize the graphics (image display) module.
- gr_init(xw.dpy, xw.vis, xw.cmap);
}
int
xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
{
- float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp;
+ float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp;
ushort mode, prevmode = USHRT_MAX;
Font *font = &dc.font;
int frcflags = FRC_NORMAL;
@@ -1388,11 +1302,6 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
if (mode == ATTR_WDUMMY)
continue;
- /* Draw spaces for image placeholders (images will be drawn
- * separately). */
- if (mode & ATTR_IMAGE)
- rune = ' ';
-
/* Determine font for glyph if different from previous glyph. */
if (prevmode != mode) {
prevmode = mode;
@@ -1500,56 +1409,6 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
return numspecs;
}
-/* Draws a horizontal dashed line of length `w` starting at `(x, y)`. `wavelen`
- * is the length of the dash plus the length of the gap. `fraction` is the
- * fraction of the dash length compared to `wavelen`. */
-static void
-xdrawunderdashed(Draw draw, Color *color, int x, int y, int w,
- int wavelen, float fraction, int thick)
-{
- int dashw = MAX(1, fraction * wavelen);
- for (int i = x - x % wavelen; i < x + w; i += wavelen) {
- int startx = MAX(i, x);
- int endx = MIN(i + dashw, x + w);
- if (startx < endx)
- XftDrawRect(xw.draw, color, startx, y, endx - startx,
- thick);
- }
-}
-
-/* Draws an undercurl. `h` is the total height, including line thickness. */
-static void
-xdrawundercurl(Draw draw, Color *color, int x, int y, int w, int h, int thick)
-{
- XGCValues gcvals = {.foreground = color->pixel,
- .line_width = thick,
- .line_style = LineSolid,
- .cap_style = CapRound};
- GC gc = XCreateGC(xw.dpy, XftDrawDrawable(xw.draw),
- GCForeground | GCLineWidth | GCLineStyle | GCCapStyle,
- &gcvals);
-
- XRectangle clip = {.x = x, .y = y, .width = w, .height = h};
- XSetClipRectangles(xw.dpy, gc, 0, 0, &clip, 1, Unsorted);
-
- int yoffset = thick / 2;
- int segh = MAX(1, h - thick);
- /* Make sure every segment is at a 45 degree angle, otherwise it doesn't
- * look good without antialiasing. */
- int segw = segh;
- int wavelen = MAX(1, segw * 2);
-
- for (int i = x - (x % wavelen); i < x + w; i += wavelen) {
- XPoint points[3] = {{.x = i, .y = y + yoffset},
- {.x = i + segw, .y = y + yoffset + segh},
- {.x = i + wavelen, .y = y + yoffset}};
- XDrawLines(xw.dpy, XftDrawDrawable(xw.draw), gc, points, 3,
- CoordModeOrigin);
- }
-
- XFreeGC(xw.dpy, gc);
-}
-
void
chgalpha(const Arg *arg)
{
@@ -1572,8 +1431,8 @@ void
xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
{
int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1);
- int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch,
- width = charlen * win.cw;
+ int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch,
+ width = charlen * win.cw;
Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
XRenderColor colfg, colbg;
XRectangle r;
@@ -1662,17 +1521,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
/* Intelligent cleaning up of the borders. */
if (x == 0) {
- xclear(0, (y == 0)? 0 : winy, win.hborderpx,
+ xclear(0, (y == 0)? 0 : winy, borderpx,
winy + win.ch +
- ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0));
+ ((winy + win.ch >= borderpx + win.th)? win.h : 0));
}
- if (winx + width >= win.hborderpx + win.tw) {
+ if (winx + width >= borderpx + win.tw) {
xclear(winx + width, (y == 0)? 0 : winy, win.w,
- ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch)));
+ ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch)));
}
if (y == 0)
- xclear(winx, 0, winx + width, win.vborderpx);
- if (winy + win.ch >= win.vborderpx + win.th)
+ xclear(winx, 0, winx + width, borderpx);
+ if (winy + win.ch >= borderpx + win.th)
xclear(winx, winy + win.ch, winx + width, win.h);
/* Clean up the region we want to draw to. */
@@ -1685,68 +1544,18 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
r.width = width;
XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
- /* Decoration color. */
- Color decor;
- uint32_t decorcolor = tgetdecorcolor(&base);
- if (decorcolor == DECOR_DEFAULT_COLOR) {
- decor = *fg;
- } else if (IS_TRUECOL(decorcolor)) {
- colfg.alpha = 0xffff;
- colfg.red = TRUERED(decorcolor);
- colfg.green = TRUEGREEN(decorcolor);
- colfg.blue = TRUEBLUE(decorcolor);
- XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &decor);
- } else {
- decor = dc.col[decorcolor];
- }
- decor.color.alpha = 0xffff;
- decor.pixel |= 0xff << 24;
-
- /* Float thickness, used as a base to compute other values. */
- float fthick = dc.font.height / 18.0;
- /* Integer thickness in pixels. Must not be 0. */
- int thick = MAX(1, roundf(fthick));
- /* The default gap between the baseline and a single underline. */
- int gap = roundf(fthick * 2);
- /* The total thickness of a double underline. */
- int doubleh = thick * 2 + ceilf(fthick * 0.5);
- /* The total thickness of an undercurl. */
- int curlh = thick * 2 + roundf(fthick * 0.75);
-
- /* Render the underline before the glyphs. */
- if (base.mode & ATTR_UNDERLINE) {
- uint32_t style = tgetdecorstyle(&base);
- int liney = winy + dc.font.ascent + gap;
- /* Adjust liney to guarantee that a single underline fits. */
- liney -= MAX(0, liney + thick - (winy + win.ch));
- if (style == UNDERLINE_DOUBLE) {
- liney -= MAX(0, liney + doubleh - (winy + win.ch));
- XftDrawRect(xw.draw, &decor, winx, liney, width, thick);
- XftDrawRect(xw.draw, &decor, winx,
- liney + doubleh - thick, width, thick);
- } else if (style == UNDERLINE_DOTTED) {
- xdrawunderdashed(xw.draw, &decor, winx, liney, width,
- thick * 2, 0.5, thick);
- } else if (style == UNDERLINE_DASHED) {
- int wavelen = MAX(2, win.cw * 0.9);
- xdrawunderdashed(xw.draw, &decor, winx, liney, width,
- wavelen, 0.65, thick);
- } else if (style == UNDERLINE_CURLY) {
- liney -= MAX(0, liney + curlh - (winy + win.ch));
- xdrawundercurl(xw.draw, &decor, winx, liney, width,
- curlh, thick);
- } else {
- XftDrawRect(xw.draw, &decor, winx, liney, width, thick);
- }
- }
-
/* Render the glyphs. */
XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
- /* Render strikethrough. Alway use the fg color. */
+ /* Render underline and strikethrough. */
+ if (base.mode & ATTR_UNDERLINE) {
+ XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1,
+ width, 1);
+ }
+
if (base.mode & ATTR_STRUCK) {
- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3,
- width, thick);
+ XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3,
+ width, 1);
}
/* Reset clip to none. */
@@ -1761,11 +1570,6 @@ xdrawglyph(Glyph g, int x, int y)
numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y);
xdrawglyphfontspecs(&spec, g, numspecs, x, y);
- if (g.mode & ATTR_IMAGE) {
- gr_start_drawing(xw.buf, win.cw, win.ch);
- xdrawoneimagecell(g, x, y);
- gr_finish_drawing(xw.buf);
- }
}
void
@@ -1781,10 +1585,6 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
if (IS_SET(MODE_HIDE))
return;
- // If it's an image, just draw a ballot box for simplicity.
- if (g.mode & ATTR_IMAGE)
- g.u = 0x2610;
-
/*
* Select the right color for the right mode.
*/
@@ -1825,167 +1625,39 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
case 3: /* Blinking Underline */
case 4: /* Steady Underline */
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + cx * win.cw,
- win.vborderpx + (cy + 1) * win.ch - \
+ borderpx + cx * win.cw,
+ borderpx + (cy + 1) * win.ch - \
cursorthickness,
win.cw, cursorthickness);
break;
case 5: /* Blinking bar */
case 6: /* Steady bar */
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + cx * win.cw,
- win.vborderpx + cy * win.ch,
+ borderpx + cx * win.cw,
+ borderpx + cy * win.ch,
cursorthickness, win.ch);
break;
}
} else {
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + cx * win.cw,
- win.vborderpx + cy * win.ch,
+ borderpx + cx * win.cw,
+ borderpx + cy * win.ch,
win.cw - 1, 1);
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + cx * win.cw,
- win.vborderpx + cy * win.ch,
+ borderpx + cx * win.cw,
+ borderpx + cy * win.ch,
1, win.ch - 1);
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + (cx + 1) * win.cw - 1,
- win.vborderpx + cy * win.ch,
+ borderpx + (cx + 1) * win.cw - 1,
+ borderpx + cy * win.ch,
1, win.ch - 1);
XftDrawRect(xw.draw, &drawcol,
- win.hborderpx + cx * win.cw,
- win.vborderpx + (cy + 1) * win.ch - 1,
+ borderpx + cx * win.cw,
+ borderpx + (cy + 1) * win.ch - 1,
win.cw, 1);
}
}
-/* Draw (or queue for drawing) image cells between columns x1 and x2 assuming
- * that they have the same attributes (and thus the same lower 24 bits of the
- * image ID and the same placement ID). */
-void
-xdrawimages(Glyph base, Line line, int x1, int y1, int x2) {
- int y_pix = win.vborderpx + y1 * win.ch;
- uint32_t image_id_24bits = base.fg & 0xFFFFFF;
- uint32_t placement_id = tgetimgplacementid(&base);
- // Columns and rows are 1-based, 0 means unspecified.
- int last_col = 0;
- int last_row = 0;
- int last_start_col = 0;
- int last_start_x = x1;
- // The most significant byte is also 1-base, subtract 1 before use.
- uint32_t last_id_4thbyteplus1 = 0;
- // We may need to inherit row/column/4th byte from the previous cell.
- Glyph *prev = &line[x1 - 1];
- if (x1 > 0 && (prev->mode & ATTR_IMAGE) &&
- (prev->fg & 0xFFFFFF) == image_id_24bits &&
- prev->decor == base.decor) {
- last_row = tgetimgrow(prev);
- last_col = tgetimgcol(prev);
- last_id_4thbyteplus1 = tgetimgid4thbyteplus1(prev);
- last_start_col = last_col + 1;
- }
- for (int x = x1; x < x2; ++x) {
- Glyph *g = &line[x];
- uint32_t cur_row = tgetimgrow(g);
- uint32_t cur_col = tgetimgcol(g);
- uint32_t cur_id_4thbyteplus1 = tgetimgid4thbyteplus1(g);
- uint32_t num_diacritics = tgetimgdiacriticcount(g);
- // If the row is not specified, assume it's the same as the row
- // of the previous cell. Note that `cur_row` may contain a
- // value imputed earlier, which will be preserved if `last_row`
- // is zero (i.e. we don't know the row of the previous cell).
- if (last_row && (num_diacritics == 0 || !cur_row))
- cur_row = last_row;
- // If the column is not specified and the row is the same as the
- // row of the previous cell, then assume that the column is the
- // next one.
- if (last_col && (num_diacritics <= 1 || !cur_col) &&
- cur_row == last_row)
- cur_col = last_col + 1;
- // If the additional id byte is not specified and the
- // coordinates are consecutive, assume the byte is also the
- // same.
- if (last_id_4thbyteplus1 &&
- (num_diacritics <= 2 || !cur_id_4thbyteplus1) &&
- cur_row == last_row && cur_col == last_col + 1)
- cur_id_4thbyteplus1 = last_id_4thbyteplus1;
- // If we couldn't infer row and column, start from the top left
- // corner.
- if (cur_row == 0)
- cur_row = 1;
- if (cur_col == 0)
- cur_col = 1;
- // If this cell breaks a contiguous stripe of image cells, draw
- // that line and start a new one.
- if (cur_col != last_col + 1 || cur_row != last_row ||
- cur_id_4thbyteplus1 != last_id_4thbyteplus1) {
- uint32_t image_id = image_id_24bits;
- if (last_id_4thbyteplus1)
- image_id |= (last_id_4thbyteplus1 - 1) << 24;
- if (last_row != 0) {
- int x_pix =
- win.hborderpx + last_start_x * win.cw;
- gr_append_imagerect(
- xw.buf, image_id, placement_id,
- last_start_col - 1, last_col,
- last_row - 1, last_row, last_start_x,
- y1, x_pix, y_pix, win.cw, win.ch,
- base.mode & ATTR_REVERSE);
- }
- last_start_col = cur_col;
- last_start_x = x;
- }
- last_row = cur_row;
- last_col = cur_col;
- last_id_4thbyteplus1 = cur_id_4thbyteplus1;
- // Populate the missing glyph data to enable inheritance between
- // runs and support the naive implementation of tgetimgid.
- if (!tgetimgrow(g))
- tsetimgrow(g, cur_row);
- // We cannot save this information if there are > 511 cols.
- if (!tgetimgcol(g) && (cur_col & ~0x1ff) == 0)
- tsetimgcol(g, cur_col);
- if (!tgetimgid4thbyteplus1(g))
- tsetimg4thbyteplus1(g, cur_id_4thbyteplus1);
- }
- uint32_t image_id = image_id_24bits;
- if (last_id_4thbyteplus1)
- image_id |= (last_id_4thbyteplus1 - 1) << 24;
- // Draw the last contiguous stripe.
- if (last_row != 0) {
- int x_pix = win.hborderpx + last_start_x * win.cw;
- gr_append_imagerect(xw.buf, image_id, placement_id,
- last_start_col - 1, last_col, last_row - 1,
- last_row, last_start_x, y1, x_pix, y_pix,
- win.cw, win.ch, base.mode & ATTR_REVERSE);
- }
-}
-
-/* Draw just one image cell without inheriting attributes from the left. */
-void xdrawoneimagecell(Glyph g, int x, int y) {
- if (!(g.mode & ATTR_IMAGE))
- return;
- int x_pix = win.hborderpx + x * win.cw;
- int y_pix = win.vborderpx + y * win.ch;
- uint32_t row = tgetimgrow(&g) - 1;
- uint32_t col = tgetimgcol(&g) - 1;
- uint32_t placement_id = tgetimgplacementid(&g);
- uint32_t image_id = tgetimgid(&g);
- gr_append_imagerect(xw.buf, image_id, placement_id, col, col + 1, row,
- row + 1, x, y, x_pix, y_pix, win.cw, win.ch,
- g.mode & ATTR_REVERSE);
-}
-
-/* Prepare for image drawing. */
-void xstartimagedraw(int *dirty, int rows) {
- gr_start_drawing(xw.buf, win.cw, win.ch);
- gr_mark_dirty_animations(dirty, rows);
-}
-
-/* Draw all queued image cells. */
-void xfinishimagedraw() {
- gr_finish_drawing(xw.buf);
-}
-
void
xsetenv(void)
{
@@ -2052,8 +1724,6 @@ xdrawline(Line line, int x1, int y1, int x2)
new.mode ^= ATTR_REVERSE;
if (i > 0 && ATTRCMP(base, new)) {
xdrawglyphfontspecs(specs, base, i, ox, y1);
- if (base.mode & ATTR_IMAGE)
- xdrawimages(base, line, ox, y1, x);
specs += i;
numspecs -= i;
i = 0;
@@ -2066,8 +1736,6 @@ xdrawline(Line line, int x1, int y1, int x2)
}
if (i > 0)
xdrawglyphfontspecs(specs, base, i, ox, y1);
- if (i > 0 && base.mode & ATTR_IMAGE)
- xdrawimages(base, line, ox, y1, x);
}
void
@@ -2292,7 +1960,6 @@ cmessage(XEvent *e)
}
} else if (e->xclient.data.l[0] == xw.wmdeletewin) {
ttyhangup();
- gr_deinit();
exit(0);
}
}
@@ -2343,13 +2010,6 @@ run(void)
if (XPending(xw.dpy))
timeout = 0; /* existing events might not set xfd */
- /* Decrease the timeout if there are active animations. */
- if (graphics_next_redraw_delay != INT_MAX &&
- IS_SET(MODE_VISIBLE))
- timeout = timeout < 0 ? graphics_next_redraw_delay
- : MIN(timeout,
- graphics_next_redraw_delay);
-
seltv.tv_sec = timeout / 1E3;
seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec);
tv = timeout >= 0 ? &seltv : NULL;