Compare commits

..

No commits in common. "33db255a2d3be3617eddb0da72b64ec7fd2d774e" and "6c03c605d9f9afba2d4279e66af2c4dc339c56f4" have entirely different histories.

6 changed files with 73 additions and 106 deletions

View File

@ -44,9 +44,6 @@ Personal build of st generated using [st-flexipatch](https://github.com/bakkeby/
- [iso14755](https://st.suckless.org/patches/iso14755/) - [iso14755](https://st.suckless.org/patches/iso14755/)
- pressing the default binding Ctrl+Shift-i will popup dmenu, asking you to enter a unicode codepoint that will be converted to a glyph and then pushed to st - pressing the default binding Ctrl+Shift-i will popup dmenu, asking you to enter a unicode codepoint that will be converted to a glyph and then pushed to st
- [keyboard-select](https://st.suckless.org/patches/keyboard_select/)
- allows you to select text on the terminal using keyboard shortcuts
- [ligatures](https://st.suckless.org/patches/ligatures/) - [ligatures](https://st.suckless.org/patches/ligatures/)
- adds support for drawing ligatures using the Harfbuzz library to transform original text of a single line to a list of glyphs with ligatures included - adds support for drawing ligatures using the Harfbuzz library to transform original text of a single line to a list of glyphs with ligatures included

View File

@ -5,7 +5,7 @@
* *
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
*/ */
static char *font = "JetBrains Mono:pixelsize=13:antialias=true:autohint=true"; static char *font = "JetBrains Mono:pixelsize=12:antialias=true:autohint=true";
#if FONT2_PATCH #if FONT2_PATCH
/* Spare fonts */ /* Spare fonts */
static char *font2[] = { static char *font2[] = {
@ -166,7 +166,7 @@ unsigned int tabspaces = 8;
#if ALPHA_PATCH #if ALPHA_PATCH
/* bg opacity */ /* bg opacity */
float alpha = 0.50; float alpha = 1.0;
#if ALPHA_GRADIENT_PATCH #if ALPHA_GRADIENT_PATCH
float grad_alpha = 0.54; //alpha value that'll change float grad_alpha = 0.54; //alpha value that'll change
float stat_alpha = 0.46; //constant alpha value that'll get added to grad_alpha float stat_alpha = 0.46; //constant alpha value that'll get added to grad_alpha

View File

@ -77,7 +77,7 @@ treflow_moveimages(int oldy, int newy)
void void
treflow(int col, int row) treflow(int col, int row)
{ {
int i, j; int i, j, x, x2;
int oce, nce, bot, scr; int oce, nce, bot, scr;
int ox = 0, oy = -term.histf, nx = 0, ny = -1, len; int ox = 0, oy = -term.histf, nx = 0, ny = -1, len;
int cy = -1; /* proxy for new y coordinate of cursor */ int cy = -1; /* proxy for new y coordinate of cursor */
@ -220,12 +220,13 @@ treflow(int col, int row)
} }
/* expand images into new text cells */ /* expand images into new text cells */
for (im = term.images; im; im = im->next) { for (im = term.images; im; im = next) {
j = MIN(im->x + im->cols, col); next = im->next;
line = TLINE(im->y); if (im->x < col) {
for (i = im->x; i < j; i++) { line = TLINE(im->y);
if (!(line[i].mode & ATTR_SET)) x2 = MIN(im->x + im->cols, col);
line[i].mode |= ATTR_SIXEL; for (x = im->x; x < x2; x++)
line[x].mode |= ATTR_SIXEL;
} }
} }
#endif // SIXEL_PATCH #endif // SIXEL_PATCH

View File

@ -223,7 +223,7 @@
* *
* https://st.suckless.org/patches/keyboard_select/ * https://st.suckless.org/patches/keyboard_select/
*/ */
#define KEYBOARDSELECT_PATCH 1 #define KEYBOARDSELECT_PATCH 0
/* This patch adds support for drawing ligatures using the Harfbuzz library to transform /* This patch adds support for drawing ligatures using the Harfbuzz library to transform
* original text of a single line to a list of glyphs with ligatures included. * original text of a single line to a list of glyphs with ligatures included.

77
st.c
View File

@ -220,9 +220,6 @@ static void tsetattr(const int *, int);
static void tsetchar(Rune, const Glyph *, int, int); static void tsetchar(Rune, const Glyph *, int, int);
static void tsetdirt(int, int); static void tsetdirt(int, int);
static void tsetscroll(int, int); static void tsetscroll(int, int);
#if SIXEL_PATCH
static inline void tsetsixelattr(Line line, int x1, int x2);
#endif // SIXEL_PATCH
static void tswapscreen(void); static void tswapscreen(void);
static void tsetmode(int, int, const int *, int); static void tsetmode(int, int, const int *, int);
static int twrite(const char *, int, int); static int twrite(const char *, int, int);
@ -1152,15 +1149,6 @@ tsetdirtattr(int attr)
} }
} }
#if SIXEL_PATCH
void
tsetsixelattr(Line line, int x1, int x2)
{
for (; x1 <= x2; x1++)
line[x1].mode |= ATTR_SIXEL;
}
#endif // SIXEL_PATCH
void void
tfulldirt(void) tfulldirt(void)
{ {
@ -2604,7 +2592,7 @@ strhandle(void)
}; };
#if SIXEL_PATCH #if SIXEL_PATCH
ImageList *im, *newimages, *next, *tail; ImageList *im, *newimages, *next, *tail;
int i, x1, y1, x2, y2, numimages; int i, x, y, x1, y1, x2, y2, numimages;
int cx, cy; int cx, cy;
Line line; Line line;
#if SCROLLBACK_PATCH || REFLOW_PATCH #if SCROLLBACK_PATCH || REFLOW_PATCH
@ -2748,44 +2736,36 @@ strhandle(void)
} else { } else {
term.images = newimages; term.images = newimages;
} }
#if COLUMNS_PATCH && !REFLOW x2 = MIN(x2, term.col);
x2 = MIN(x2, term.maxcol) - 1; for (i = 0, im = newimages; im; im = next, i++) {
#else next = im->next;
x2 = MIN(x2, term.col) - 1; #if SCROLLBACK_PATCH || REFLOW_PATCH
#endif // COLUMNS_PATCH scr = IS_SET(MODE_ALTSCREEN) ? 0 : term.scr;
if (IS_SET(MODE_SIXEL_SDM)) { #endif // SCROLLBACK_PATCH
/* Sixel display mode: put the sixel in the upper left corner of if (IS_SET(MODE_SIXEL_SDM)) {
* the screen, disable scrolling (the sixel will be truncated if
* it is too long) and do not change the cursor position. */
for (i = 0, im = newimages; im; im = next, i++) {
next = im->next;
if (i >= term.row) { if (i >= term.row) {
delete_image(im); delete_image(im);
continue; continue;
} }
im->y = i + scr; im->y = i + scr;
tsetsixelattr(term.line[i], x1, x2); line = term.line[i];
term.dirty[MIN(im->y, term.row-1)] = 1; } else {
}
} else {
for (i = 0, im = newimages; im; im = next, i++) {
next = im->next;
#if SCROLLBACK_PATCH || REFLOW_PATCH
scr = IS_SET(MODE_ALTSCREEN) ? 0 : term.scr;
#endif // SCROLLBACK_PATCH
im->y = term.c.y + scr; im->y = term.c.y + scr;
tsetsixelattr(term.line[term.c.y], x1, x2); line = term.line[term.c.y];
term.dirty[MIN(im->y, term.row-1)] = 1; }
if (i < numimages-1) { for (x = im->x; x < x2; x++) {
im->next = NULL; line[x].mode |= ATTR_SIXEL;
tnewline(0); }
im->next = next; term.dirty[MIN(im->y, term.row-1)] = 1;
} if (!IS_SET(MODE_SIXEL_SDM) && i < numimages-1) {
im->next = NULL;
tnewline(0);
im->next = next;
} }
/* if mode 8452 is set, sixel scrolling leaves cursor to right of graphic */
if (IS_SET(MODE_SIXEL_CUR_RT))
term.c.x = MIN(term.c.x + newimages->cols, term.col-1);
} }
/* if mode 8452 is set, sixel scrolling leaves cursor to right of graphic */
if (!IS_SET(MODE_SIXEL_SDM) && IS_SET(MODE_SIXEL_CUR_RT))
term.c.x = MIN(term.c.x + newimages->cols, term.col-1);
} }
#endif // SIXEL_PATCH #endif // SIXEL_PATCH
#if SYNC_PATCH #if SYNC_PATCH
@ -3525,7 +3505,7 @@ tresize(int col, int row)
#endif // COLUMNS_PATCH #endif // COLUMNS_PATCH
int *bp; int *bp;
#if SIXEL_PATCH #if SIXEL_PATCH
int x2; int x, x2;
Line line; Line line;
ImageList *im, *next; ImageList *im, *next;
#endif // SIXEL_PATCH #endif // SIXEL_PATCH
@ -3632,7 +3612,8 @@ tresize(int col, int row)
} }
#if SIXEL_PATCH #if SIXEL_PATCH
/* expand images into new text cells */ /* expand images into new text cells to prevent them from being deleted in
* xfinishdraw() that draws the images */
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
for (im = term.images; im; im = next) { for (im = term.images; im; im = next) {
next = im->next; next = im->next;
@ -3657,9 +3638,9 @@ tresize(int col, int row)
} }
line = term.line[im->y]; line = term.line[im->y];
#endif // SCROLLBACK_PATCH #endif // SCROLLBACK_PATCH
x2 = MIN(im->x + im->cols, col) - 1; x2 = MIN(im->x + im->cols, term.col);
if (mincol < col && x2 >= mincol && im->x < col) for (x = im->x; x < x2; x++)
tsetsixelattr(line, MAX(im->x, mincol), x2); line[x].mode |= ATTR_SIXEL;
} }
tswapscreen(); tswapscreen();
} }

78
x.c
View File

@ -3167,14 +3167,9 @@ xfinishdraw(void)
ImageList *im, *next; ImageList *im, *next;
Imlib_Image origin, scaled; Imlib_Image origin, scaled;
XGCValues gcvalues; XGCValues gcvalues;
GC gc = NULL; GC gc;
int width, height; int width, height;
int del, desty, mode, x1, x2, xend; int x, x2, del, destx, desty;
#if ANYSIZE_PATCH
int bw = win.hborderpx, bh = win.vborderpx;
#else
int bw = borderpx, bh = borderpx;
#endif // ANYSIZE_PATCH
Line line; Line line;
#endif // SIXEL_PATCH #endif // SIXEL_PATCH
@ -3265,50 +3260,43 @@ xfinishdraw(void)
} }
} }
/* create GC */ /* clip the image so it does not go over to borders */
if (!gc) { x2 = MIN(im->x + im->cols, term.col);
memset(&gcvalues, 0, sizeof(gcvalues)); width = MIN(width, (x2 - im->x) * win.cw);
gcvalues.graphics_exposures = False;
gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures, &gcvalues); /* delete the image if the text cells behind it have been changed */
#if SCROLLBACK_PATCH || REFLOW_PATCH
line = TLINE(im->y);
#else
line = term.line[im->y];
#endif // SCROLLBACK_PATCH | REFLOW_PATCH
for (del = 0, x = im->x; x < x2; x++) {
if ((del = !(line[x].mode & ATTR_SIXEL)))
break;
}
if (del) {
delete_image(im);
continue;
} }
/* set the clip mask */ /* draw the image */
desty = bh + im->y * win.ch; memset(&gcvalues, 0, sizeof(gcvalues));
gcvalues.graphics_exposures = False;
gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures, &gcvalues);
#if ANYSIZE_PATCH
destx = win.hborderpx + im->x * win.cw;
desty = win.vborderpx + im->y * win.ch;
#else
destx = borderpx + im->x * win.cw;
desty = borderpx + im->y * win.ch;
#endif // ANYSIZE_PATCH
if (im->clipmask) { if (im->clipmask) {
XSetClipMask(xw.dpy, gc, (Drawable)im->clipmask); XSetClipMask(xw.dpy, gc, (Drawable)im->clipmask);
XSetClipOrigin(xw.dpy, gc, bw + im->x * win.cw, desty); XSetClipOrigin(xw.dpy, gc, destx, desty);
} }
XCopyArea(xw.dpy, (Drawable)im->pixmap, xw.buf, gc, 0, 0, width, height, destx, desty);
/* draw only the parts of the image that are not erased */
#if SCROLLBACK_PATCH || REFLOW_PATCH
line = TLINE(im->y) + im->x;
#else
line = term.line[im->y] + im->x;
#endif // SCROLLBACK_PATCH || REFLOW_PATCH
xend = MIN(im->x + im->cols, term.col);
for (del = 1, x1 = im->x; x1 < xend; x1 = x2) {
mode = line->mode & ATTR_SIXEL;
for (x2 = x1 + 1; x2 < xend; x2++) {
if (((++line)->mode & ATTR_SIXEL) != mode)
break;
}
if (mode) {
XCopyArea(xw.dpy, (Drawable)im->pixmap, xw.buf, gc,
(x1 - im->x) * win.cw, 0,
MIN((x2 - x1) * win.cw, width - (x1 - im->x) * win.cw), height,
bw + x1 * win.cw, desty);
del = 0;
}
}
if (im->clipmask)
XSetClipMask(xw.dpy, gc, None);
/* if all the parts are erased, we can delete the entire image */
if (del && im->x + im->cols <= term.col)
delete_image(im);
}
if (gc)
XFreeGC(xw.dpy, gc); XFreeGC(xw.dpy, gc);
}
#endif // SIXEL_PATCH #endif // SIXEL_PATCH
#if !SINGLE_DRAWABLE_BUFFER_PATCH #if !SINGLE_DRAWABLE_BUFFER_PATCH