1 Commits

Author SHA1 Message Date
30dfe46914 Added anysize v.2022-07-18 patch 2023-06-27 21:57:35 +02:00
4 changed files with 56 additions and 128 deletions

View File

@ -56,12 +56,6 @@ int allowwindowops = 0;
static double minlatency = 8;
static double maxlatency = 33;
/*
* Synchronized-Update timeout in ms
* https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec
*/
static uint su_timeout = 200;
/*
* blinking timeout (set to 0 to disable blinking) for the terminal blinking
* attribute.
@ -105,24 +99,32 @@ float alpha = 0.8;
/* Terminal colors (16 first used in escape sequence) */
static const char *colorname[] = {
/* 8 normal colors */
[0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */
[1] = "#cc241d", /* red */
[2] = "#98971a", /* green */
[3] = "#d79921", /* yellow */
[4] = "#458588", /* blue */
[5] = "#b16286", /* magenta */
[6] = "#689d6a", /* cyan */
[7] = "#a89984", /* white */
"black",
"red3",
"green3",
"yellow3",
"blue2",
"magenta3",
"cyan3",
"gray90",
/* 8 bright colors */
[8] = "#928374", /* black */
[9] = "#fb4934", /* red */
[10] = "#b8bb26", /* green */
[11] = "#fabd2f", /* yellow */
[12] = "#83a598", /* blue */
[13] = "#d3869b", /* magenta */
[14] = "#8ec07c", /* cyan */
[15] = "#ebdbb2", /* white */
"gray50",
"red",
"green",
"yellow",
"#5c5cff",
"magenta",
"cyan",
"white",
[255] = 0,
/* more colors can be added after 255 to use with DefaultXX */
"#cccccc",
"#555555",
"gray90", /* default foreground colour */
"black", /* default background colour */
};
@ -130,9 +132,9 @@ static const char *colorname[] = {
* Default colors (colorname index)
* foreground, background, cursor, reverse cursor
*/
unsigned int defaultfg = 15;
unsigned int defaultbg = 0;
unsigned int defaultcs = 15;
unsigned int defaultfg = 258;
unsigned int defaultbg = 259;
unsigned int defaultcs = 256;
static unsigned int defaultrcs = 257;
/*

82
st.c
View File

@ -42,8 +42,6 @@
#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
#define ISDELIM(u) (u && wcschr(worddelimiters, u))
#define STRESCARGREST(n) ((n) == 0 ? strescseq.buf : strescseq.argp[(n)-1] + 1)
#define STRESCARGJUST(n) (*(strescseq.argp[n]) = '\0', STRESCARGREST(n))
enum term_mode {
MODE_WRAP = 1 << 0,
@ -150,7 +148,7 @@ typedef struct {
char *buf; /* allocated raw string */
size_t siz; /* allocation size */
size_t len; /* raw string length */
char *argp[STR_ARG_SIZ]; /* pointers to the end of nth argument */
char *args[STR_ARG_SIZ];
int narg; /* nb of args */
} STREscape;
@ -234,33 +232,6 @@ static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
#include <time.h>
static int su = 0;
struct timespec sutv;
static void
tsync_begin()
{
clock_gettime(CLOCK_MONOTONIC, &sutv);
su = 1;
}
static void
tsync_end()
{
su = 0;
}
int
tinsync(uint timeout)
{
struct timespec now;
if (su && !clock_gettime(CLOCK_MONOTONIC, &now)
&& TIMEDIFF(now, sutv) >= timeout)
su = 0;
return su;
}
ssize_t
xwrite(int fd, const char *s, size_t len)
{
@ -843,9 +814,6 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
return cmdfd;
}
static int twrite_aborted = 0;
int ttyread_pending() { return twrite_aborted; }
size_t
ttyread(void)
{
@ -854,7 +822,7 @@ ttyread(void)
int ret, written;
/* append read bytes to unprocessed bytes */
ret = twrite_aborted ? 1 : read(cmdfd, buf+buflen, LEN(buf)-buflen);
ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);
switch (ret) {
case 0:
@ -862,7 +830,7 @@ ttyread(void)
case -1:
die("couldn't read from shell: %s\n", strerror(errno));
default:
buflen += twrite_aborted ? 0 : ret;
buflen += ret;
written = twrite(buf, buflen, 0);
buflen -= written;
/* keep any incomplete UTF-8 byte sequence for the next call */
@ -1022,7 +990,6 @@ tsetdirtattr(int attr)
void
tfulldirt(void)
{
tsync_end();
tsetdirt(0, term.row-1);
}
@ -1912,30 +1879,29 @@ strhandle(void)
};
term.esc &= ~(ESC_STR_END|ESC_STR);
strescseq.buf[strescseq.len] = '\0';
strparse();
par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0;
switch (strescseq.type) {
case ']': /* OSC -- Operating System Command */
strparse();
par = (narg = strescseq.narg) ? atoi(STRESCARGJUST(0)) : 0;
switch (par) {
case 0:
if (narg > 1) {
xsettitle(STRESCARGREST(1));
xseticontitle(STRESCARGREST(1));
xsettitle(strescseq.args[1]);
xseticontitle(strescseq.args[1]);
}
return;
case 1:
if (narg > 1)
xseticontitle(STRESCARGREST(1));
xseticontitle(strescseq.args[1]);
return;
case 2:
if (narg > 1)
xsettitle(STRESCARGREST(1));
xsettitle(strescseq.args[1]);
return;
case 52:
if (narg > 2 && allowwindowops) {
dec = base64dec(STRESCARGJUST(2));
dec = base64dec(strescseq.args[2]);
if (dec) {
xsetsel(dec);
xclipcopy();
@ -1949,7 +1915,7 @@ strhandle(void)
case 12:
if (narg < 2)
break;
p = STRESCARGREST(1);
p = strescseq.args[1];
if ((j = par - 10) < 0 || j >= LEN(osc_table))
break; /* shouldn't be possible */
@ -1965,10 +1931,10 @@ strhandle(void)
case 4: /* color set */
if (narg < 3)
break;
p = STRESCARGJUST(2);
p = strescseq.args[2];
/* FALLTHROUGH */
case 104: /* color reset */
j = (narg > 1) ? atoi(STRESCARGJUST(1)) : -1;
j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
if (p && !strcmp(p, "?")) {
osc_color_response(j, 0, 1);
@ -1990,15 +1956,9 @@ strhandle(void)
}
break;
case 'k': /* old title set compatibility */
xsettitle(strescseq.buf);
xsettitle(strescseq.args[0]);
return;
case 'P': /* DCS -- Device Control String */
/* https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec */
if (strstr(strescseq.buf, "=1s") == strescseq.buf)
tsync_begin(); /* BSU */
else if (strstr(strescseq.buf, "=2s") == strescseq.buf)
tsync_end(); /* ESU */
return;
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
return;
@ -2015,17 +1975,18 @@ strparse(void)
char *p = strescseq.buf;
strescseq.narg = 0;
strescseq.buf[strescseq.len] = '\0';
if (*p == '\0')
return;
while (strescseq.narg < STR_ARG_SIZ) {
strescseq.args[strescseq.narg++] = p;
while ((c = *p) != ';' && c != '\0')
p++;
strescseq.argp[strescseq.narg++] = p;
++p;
if (c == '\0')
return;
p++;
*p++ = '\0';
}
}
@ -2546,9 +2507,6 @@ twrite(const char *buf, int buflen, int show_ctrl)
Rune u;
int n;
int su0 = su;
twrite_aborted = 0;
for (n = 0; n < buflen; n += charsize) {
if (IS_SET(MODE_UTF8)) {
/* process a complete utf8 char */
@ -2559,10 +2517,6 @@ twrite(const char *buf, int buflen, int show_ctrl)
u = buf[n] & 0xFF;
charsize = 1;
}
if (su0 && !su) {
twrite_aborted = 1;
break; // ESU - allow rendering before a new BSU
}
if (show_ctrl && ISCONTROL(u)) {
if (u & 0x80) {
u &= 0x7f;

View File

@ -191,7 +191,6 @@ st-mono| simpleterm monocolor,
Ms=\E]52;%p1%s;%p2%s\007,
Se=\E[2 q,
Ss=\E[%p1%d q,
Sync=\EP=%p1%ds\E\\,
st| simpleterm,
use=st-mono,

49
x.c
View File

@ -689,8 +689,6 @@ setsel(char *str, Time t)
XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
selclear();
xclipcopy();
}
void
@ -714,9 +712,7 @@ brelease(XEvent *e)
if (mouseaction(e, 1))
return;
if (btn == Button3)
selpaste(NULL);
else if (btn == Button1)
if (btn == Button1)
mousesel(e, 1);
}
@ -1437,6 +1433,10 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
bg = &dc.col[base.bg];
}
/* Change basic system colors [0-7] to bright system colors [8-15] */
if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7))
fg = &dc.col[base.fg + 8];
if (IS_SET(MODE_REVERSE)) {
if (fg == &dc.col[defaultfg]) {
fg = &dc.col[defaultbg];
@ -1541,7 +1541,6 @@ void
xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
{
Color drawcol;
XRenderColor colbg;
/* remove the old cursor */
if (selected(ox, oy))
@ -1570,21 +1569,11 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
if (selected(cx, cy)) {
g.fg = defaultfg;
g.bg = defaultrcs;
} else if (!(og.mode & ATTR_REVERSE)) {
unsigned long col = g.bg;
g.bg = g.fg;
g.fg = col;
}
if (IS_TRUECOL(g.bg)) {
colbg.alpha = 0xffff;
colbg.red = TRUERED(g.bg);
colbg.green = TRUEGREEN(g.bg);
colbg.blue = TRUEBLUE(g.bg);
XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &drawcol);
} else {
drawcol = dc.col[g.bg];
g.fg = defaultbg;
g.bg = defaultcs;
}
drawcol = dc.col[g.bg];
}
/* draw the new one */
@ -1943,9 +1932,6 @@ resize(XEvent *e)
cresize(e->xconfigure.width, e->xconfigure.height);
}
int tinsync(uint);
int ttyread_pending();
void
run(void)
{
@ -1980,7 +1966,7 @@ run(void)
FD_SET(ttyfd, &rfd);
FD_SET(xfd, &rfd);
if (XPending(xw.dpy) || ttyread_pending())
if (XPending(xw.dpy))
timeout = 0; /* existing events might not set xfd */
seltv.tv_sec = timeout / 1E3;
@ -1994,8 +1980,7 @@ run(void)
}
clock_gettime(CLOCK_MONOTONIC, &now);
int ttyin = FD_ISSET(ttyfd, &rfd) || ttyread_pending();
if (ttyin)
if (FD_ISSET(ttyfd, &rfd))
ttyread();
xev = 0;
@ -2019,7 +2004,7 @@ run(void)
* maximum latency intervals during `cat huge.txt`, and perfect
* sync with periodic updates from animations/key-repeats/etc.
*/
if (ttyin || xev) {
if (FD_ISSET(ttyfd, &rfd) || xev) {
if (!drawing) {
trigger = now;
drawing = 1;
@ -2030,18 +2015,6 @@ run(void)
continue; /* we have time, try to find idle */
}
if (tinsync(su_timeout)) {
/*
* on synchronized-update draw-suspension: don't reset
* drawing so that we draw ASAP once we can (just after
* ESU). it won't be too soon because we already can
* draw now but we skip. we set timeout > 0 to draw on
* SU-timeout even without new content.
*/
timeout = minlatency;
continue;
}
/* idle detected or maxlatency exhausted -> draw */
timeout = -1;
if (blinktimeout && tattrset(ATTR_BLINK)) {