Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
fix a problem that the standard streams are unexpectedly closed
[st.git]
/
st.c
diff --git
a/st.c
b/st.c
index
2d901ab
..
a9338e1
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-51,7
+51,6
@@
enum term_mode {
MODE_ECHO = 1 << 4,
MODE_PRINT = 1 << 5,
MODE_UTF8 = 1 << 6,
MODE_ECHO = 1 << 4,
MODE_PRINT = 1 << 5,
MODE_UTF8 = 1 << 6,
- MODE_SIXEL = 1 << 7,
};
enum cursor_movement {
};
enum cursor_movement {
@@
-78,12
+77,11
@@
enum charset {
enum escape_state {
ESC_START = 1,
ESC_CSI = 2,
enum escape_state {
ESC_START = 1,
ESC_CSI = 2,
- ESC_STR = 4, /* OSC, PM, APC */
+ ESC_STR = 4, /*
DCS,
OSC, PM, APC */
ESC_ALTCHARSET = 8,
ESC_STR_END = 16, /* a final string was encountered */
ESC_TEST = 32, /* Enter in test mode */
ESC_UTF8 = 64,
ESC_ALTCHARSET = 8,
ESC_STR_END = 16, /* a final string was encountered */
ESC_TEST = 32, /* Enter in test mode */
ESC_UTF8 = 64,
- ESC_DCS =128,
};
typedef struct {
};
typedef struct {
@@
-188,18
+186,18
@@
static void tputc(Rune);
static void treset(void);
static void tscrollup(int, int);
static void tscrolldown(int, int);
static void treset(void);
static void tscrollup(int, int);
static void tscrolldown(int, int);
-static void tsetattr(int *, int);
-static void tsetchar(Rune, Glyph *, int, int);
+static void tsetattr(
const
int *, int);
+static void tsetchar(Rune,
const
Glyph *, int, int);
static void tsetdirt(int, int);
static void tsetscroll(int, int);
static void tswapscreen(void);
static void tsetdirt(int, int);
static void tsetscroll(int, int);
static void tswapscreen(void);
-static void tsetmode(int, int, int *, int);
+static void tsetmode(int, int,
const
int *, int);
static int twrite(const char *, int, int);
static void tfulldirt(void);
static void tcontrolcode(uchar );
static void tdectest(char );
static void tdefutf8(char);
static int twrite(const char *, int, int);
static void tfulldirt(void);
static void tcontrolcode(uchar );
static void tdectest(char );
static void tdefutf8(char);
-static int32_t tdefcolor(int *, int *, int);
+static int32_t tdefcolor(
const
int *, int *, int);
static void tdeftran(char);
static void tstrsequence(uchar);
static void tdeftran(char);
static void tstrsequence(uchar);
@@
-228,10
+226,10
@@
static int iofd = 1;
static int cmdfd;
static pid_t pid;
static int cmdfd;
static pid_t pid;
-static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
-static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
-static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
-static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
+static
const
uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
+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};
ssize_t
xwrite(int fd, const char *s, size_t len)
ssize_t
xwrite(int fd, const char *s, size_t len)
@@
-271,12
+269,14
@@
xrealloc(void *p, size_t len)
}
char *
}
char *
-xstrdup(char *s)
+xstrdup(c
onst c
har *s)
{
{
- if ((s = strdup(s)) == NULL)
+ char *p;
+
+ if ((p = strdup(s)) == NULL)
die("strdup: %s\n", strerror(errno));
die("strdup: %s\n", strerror(errno));
- return
s
;
+ return
p
;
}
size_t
}
size_t
@@
-520,7
+520,7
@@
selsnap(int *x, int *y, int direction)
{
int newx, newy, xt, yt;
int delim, prevdelim;
{
int newx, newy, xt, yt;
int delim, prevdelim;
- Glyph *gp, *prevgp;
+
const
Glyph *gp, *prevgp;
switch (sel.snap) {
case SNAP_WORD:
switch (sel.snap) {
case SNAP_WORD:
@@
-593,7
+593,7
@@
getsel(void)
{
char *str, *ptr;
int y, bufsize, lastx, linelen;
{
char *str, *ptr;
int y, bufsize, lastx, linelen;
- Glyph *gp, *last;
+
const
Glyph *gp, *last;
if (sel.ob.x == -1)
return NULL;
if (sel.ob.x == -1)
return NULL;
@@
-760,7
+760,7
@@
stty(char **args)
}
int
}
int
-ttynew(c
har *line, char *cmd,
char *out, char **args)
+ttynew(c
onst char *line, char *cmd, const
char *out, char **args)
{
int m, s;
{
int m, s;
@@
-793,14
+793,15
@@
ttynew(char *line, char *cmd, char *out, char **args)
break;
case 0:
close(iofd);
break;
case 0:
close(iofd);
+ close(m);
setsid(); /* create a new process group */
dup2(s, 0);
dup2(s, 1);
dup2(s, 2);
if (ioctl(s, TIOCSCTTY, NULL) < 0)
die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
setsid(); /* create a new process group */
dup2(s, 0);
dup2(s, 1);
dup2(s, 2);
if (ioctl(s, TIOCSCTTY, NULL) < 0)
die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
- close(s);
-
close(m
);
+ if (s > 2)
+
close(s
);
#ifdef __OpenBSD__
if (pledge("stdio getpw proc exec", NULL) == -1)
die("pledge\n");
#ifdef __OpenBSD__
if (pledge("stdio getpw proc exec", NULL) == -1)
die("pledge\n");
@@
-1188,9
+1189,9
@@
tmoveto(int x, int y)
}
void
}
void
-tsetchar(Rune u, Glyph *attr, int x, int y)
+tsetchar(Rune u,
const
Glyph *attr, int x, int y)
{
{
- static char *vt100_0[62] = { /* 0x41 - 0x7e */
+ static c
onst c
har *vt100_0[62] = { /* 0x41 - 0x7e */
"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
0, 0, 0, 0, 0, 0, 0, 0, /* P - W */
"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
0, 0, 0, 0, 0, 0, 0, 0, /* P - W */
@@
-1302,7
+1303,7
@@
tdeleteline(int n)
}
int32_t
}
int32_t
-tdefcolor(int *attr, int *npar, int l)
+tdefcolor(
const
int *attr, int *npar, int l)
{
int32_t idx = -1;
uint r, g, b;
{
int32_t idx = -1;
uint r, g, b;
@@
-1352,7
+1353,7
@@
tdefcolor(int *attr, int *npar, int l)
}
void
}
void
-tsetattr(int *attr, int l)
+tsetattr(
const
int *attr, int l)
{
int i;
int32_t idx;
{
int i;
int32_t idx;
@@
-1470,9
+1471,9
@@
tsetscroll(int t, int b)
}
void
}
void
-tsetmode(int priv, int set, int *args, int narg)
+tsetmode(int priv, int set,
const
int *args, int narg)
{
{
- int alt
,
*lim;
+ int alt
; const int
*lim;
for (lim = args + narg; args < lim; ++args) {
if (priv) {
for (lim = args + narg; args < lim; ++args) {
if (priv) {
@@
-1855,13
+1856,21
@@
strhandle(void)
case ']': /* OSC -- Operating System Command */
switch (par) {
case 0:
case ']': /* OSC -- Operating System Command */
switch (par) {
case 0:
+ if (narg > 1) {
+ xsettitle(strescseq.args[1]);
+ xseticontitle(strescseq.args[1]);
+ }
+ return;
case 1:
case 1:
+ if (narg > 1)
+ xseticontitle(strescseq.args[1]);
+ return;
case 2:
if (narg > 1)
xsettitle(strescseq.args[1]);
return;
case 52:
case 2:
if (narg > 1)
xsettitle(strescseq.args[1]);
return;
case 52:
- if (narg > 2) {
+ if (narg > 2
&& allowwindowops
) {
dec = base64dec(strescseq.args[2]);
if (dec) {
xsetsel(dec);
dec = base64dec(strescseq.args[2]);
if (dec) {
xsetsel(dec);
@@
-1897,7
+1906,6
@@
strhandle(void)
xsettitle(strescseq.args[0]);
return;
case 'P': /* DCS -- Device Control String */
xsettitle(strescseq.args[0]);
return;
case 'P': /* DCS -- Device Control String */
- term.mode |= ESC_DCS;
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
return;
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
return;
@@
-2015,7
+2023,7
@@
void
tdumpline(int n)
{
char buf[UTF_SIZ];
tdumpline(int n)
{
char buf[UTF_SIZ];
- Glyph *bp, *end;
+
const
Glyph *bp, *end;
bp = &term.line[n][0];
end = &bp[MIN(tlinelen(n), term.col) - 1];
bp = &term.line[n][0];
end = &bp[MIN(tlinelen(n), term.col) - 1];
@@
-2091,12
+2099,9
@@
tdectest(char c)
void
tstrsequence(uchar c)
{
void
tstrsequence(uchar c)
{
- strreset();
-
switch (c) {
case 0x90: /* DCS -- Device Control String */
c = 'P';
switch (c) {
case 0x90: /* DCS -- Device Control String */
c = 'P';
- term.esc |= ESC_DCS;
break;
case 0x9f: /* APC -- Application Program Command */
c = '_';
break;
case 0x9f: /* APC -- Application Program Command */
c = '_';
@@
-2108,6
+2113,7
@@
tstrsequence(uchar c)
c = ']';
break;
}
c = ']';
break;
}
+ strreset();
strescseq.type = c;
term.esc |= ESC_STR;
}
strescseq.type = c;
term.esc |= ESC_STR;
}
@@
-2305,7
+2311,7
@@
tputc(Rune u)
Glyph *gp;
control = ISCONTROL(u);
Glyph *gp;
control = ISCONTROL(u);
- if (u < 127 || !IS_SET(MODE_UTF8
| MODE_SIXEL
)) {
+ if (u < 127 || !IS_SET(MODE_UTF8)) {
c[0] = u;
width = len = 1;
} else {
c[0] = u;
width = len = 1;
} else {
@@
-2326,23
+2332,11
@@
tputc(Rune u)
if (term.esc & ESC_STR) {
if (u == '\a' || u == 030 || u == 032 || u == 033 ||
ISCONTROLC1(u)) {
if (term.esc & ESC_STR) {
if (u == '\a' || u == 030 || u == 032 || u == 033 ||
ISCONTROLC1(u)) {
- term.esc &= ~(ESC_START|ESC_STR|ESC_DCS);
- if (IS_SET(MODE_SIXEL)) {
- /* TODO: render sixel */;
- term.mode &= ~MODE_SIXEL;
- return;
- }
+ term.esc &= ~(ESC_START|ESC_STR);
term.esc |= ESC_STR_END;
goto check_control_code;
}
term.esc |= ESC_STR_END;
goto check_control_code;
}
- if (IS_SET(MODE_SIXEL)) {
- /* TODO: implement sixel mode */
- return;
- }
- if (term.esc&ESC_DCS && strescseq.len == 0 && u == 'q')
- term.mode |= MODE_SIXEL;
-
if (strescseq.len+len >= strescseq.siz) {
/*
* Here is a bug in terminals. If the user never sends
if (strescseq.len+len >= strescseq.siz) {
/*
* Here is a bug in terminals. If the user never sends
@@
-2454,7
+2448,7
@@
twrite(const char *buf, int buflen, int show_ctrl)
int n;
for (n = 0; n < buflen; n += charsize) {
int n;
for (n = 0; n < buflen; n += charsize) {
- if (IS_SET(MODE_UTF8)
&& !IS_SET(MODE_SIXEL)
) {
+ if (IS_SET(MODE_UTF8)) {
/* process a complete utf8 char */
charsize = utf8decode(buf + n, &u, buflen - n);
if (charsize == 0)
/* process a complete utf8 char */
charsize = utf8decode(buf + n, &u, buflen - n);
if (charsize == 0)