Xinqi Bao's Git
projects
/
st.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
Importing the patch of Roberto Vargas to inherit signal handlers.
[st.git]
/
st.c
diff --git
a/st.c
b/st.c
index
15d22ac
..
c2ee3e2
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-77,6
+77,7
@@
enum glyph_attribute {
ATTR_BOLD = 4,
ATTR_GFX = 8,
ATTR_ITALIC = 16,
ATTR_BOLD = 4,
ATTR_GFX = 8,
ATTR_ITALIC = 16,
+ ATTR_BLINK = 32,
};
enum cursor_movement {
};
enum cursor_movement {
@@
-295,6
+296,7
@@
static void xcopy(void);
static void xdrawcursor(void);
static void xinit(void);
static void xloadcols(void);
static void xdrawcursor(void);
static void xinit(void);
static void xloadcols(void);
+static void xresettitle(void);
static void xseturgency(int);
static void xsetsel(char*);
static void xresize(int, int);
static void xseturgency(int);
static void xsetsel(char*);
static void xresize(int, int);
@@
-325,6
+327,9
@@
static int utf8encode(long *, char *);
static int utf8size(char *);
static int isfullutf8(char *, int);
static int utf8size(char *);
static int isfullutf8(char *, int);
+static void *xmalloc(size_t);
+static void *xrealloc(void *, size_t);
+
static void (*handler[LASTEvent])(XEvent *) = {
[KeyPress] = kpress,
[ClientMessage] = cmessage,
static void (*handler[LASTEvent])(XEvent *) = {
[KeyPress] = kpress,
[ClientMessage] = cmessage,
@@
-351,13
+356,28
@@
static STREscape strescseq;
static int cmdfd;
static pid_t pid;
static Selection sel;
static int cmdfd;
static pid_t pid;
static Selection sel;
-static
FILE *fileio
;
+static
int iofd = -1
;
static char **opt_cmd = NULL;
static char *opt_io = NULL;
static char *opt_title = NULL;
static char *opt_embed = NULL;
static char *opt_class = NULL;
static char **opt_cmd = NULL;
static char *opt_io = NULL;
static char *opt_title = NULL;
static char *opt_embed = NULL;
static char *opt_class = NULL;
+void *
+xmalloc(size_t len) {
+ void *p = malloc(len);
+ if(!p)
+ die("Out of memory");
+ return p;
+}
+
+void *
+xrealloc(void *p, size_t len) {
+ if((p = realloc(p, len)) == NULL)
+ die("Out of memory");
+ return p;
+}
+
int
utf8decode(char *s, long *u) {
uchar c;
int
utf8decode(char *s, long *u) {
uchar c;
@@
-564,7
+584,7
@@
selcopy(void) {
else {
bufsize = (term.col+1) * (sel.e.y-sel.b.y+1) * UTF_SIZ;
else {
bufsize = (term.col+1) * (sel.e.y-sel.b.y+1) * UTF_SIZ;
- ptr = str = malloc(bufsize);
+ ptr = str =
x
malloc(bufsize);
/* append every set & selected glyph to the selection */
for(y = 0; y < term.row; y++) {
/* append every set & selected glyph to the selection */
for(y = 0; y < term.row; y++) {
@@
-754,6
+774,13
@@
execsh(void) {
unsetenv("LINES");
unsetenv("TERMCAP");
unsetenv("LINES");
unsetenv("TERMCAP");
+ signal(SIGCHLD, SIG_DFL);
+ signal(SIGHUP, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
+ signal(SIGTERM, SIG_DFL);
+ signal(SIGALRM, SIG_DFL);
+
DEFAULT(envshell, SHELL);
putenv("TERM="TNAME);
args = opt_cmd ? opt_cmd : (char*[]){envshell, "-i", NULL};
DEFAULT(envshell, SHELL);
putenv("TERM="TNAME);
args = opt_cmd ? opt_cmd : (char*[]){envshell, "-i", NULL};
@@
-802,9
+829,9
@@
ttynew(void) {
signal(SIGCHLD, sigchld);
if(opt_io) {
if(!strcmp(opt_io, "-")) {
signal(SIGCHLD, sigchld);
if(opt_io) {
if(!strcmp(opt_io, "-")) {
-
fileio = stdout
;
+
iofd = STDOUT_FILENO
;
} else {
} else {
- if(
!(fileio = fopen(opt_io, "w"))
) {
+ if(
(iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0
) {
fprintf(stderr, "Error opening %s:%s\n",
opt_io, strerror(errno));
}
fprintf(stderr, "Error opening %s:%s\n",
opt_io, strerror(errno));
}
@@
-917,14
+944,14
@@
void
tnew(int col, int row) {
/* set screen size */
term.row = row, term.col = col;
tnew(int col, int row) {
/* set screen size */
term.row = row, term.col = col;
- term.line = malloc(term.row * sizeof(Line));
- term.alt = malloc(term.row * sizeof(Line));
- term.dirty = malloc(term.row * sizeof(*term.dirty));
- term.tabs = malloc(term.col * sizeof(*term.tabs));
+ term.line =
x
malloc(term.row * sizeof(Line));
+ term.alt =
x
malloc(term.row * sizeof(Line));
+ term.dirty =
x
malloc(term.row * sizeof(*term.dirty));
+ term.tabs =
x
malloc(term.col * sizeof(*term.tabs));
for(row = 0; row < term.row; row++) {
for(row = 0; row < term.row; row++) {
- term.line[row] = malloc(term.col * sizeof(Glyph));
- term.alt [row] = malloc(term.col * sizeof(Glyph));
+ term.line[row] =
x
malloc(term.col * sizeof(Glyph));
+ term.alt [row] =
x
malloc(term.col * sizeof(Glyph));
term.dirty[row] = 0;
}
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
term.dirty[row] = 0;
}
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
@@
-1133,7
+1160,7
@@
tsetattr(int *attr, int l) {
switch(attr[i]) {
case 0:
term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \
switch(attr[i]) {
case 0:
term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \
- | ATTR_ITALIC);
+ | ATTR_ITALIC
| ATTR_BLINK
);
term.c.attr.fg = DefaultFG;
term.c.attr.bg = DefaultBG;
break;
term.c.attr.fg = DefaultFG;
term.c.attr.bg = DefaultBG;
break;
@@
-1146,9
+1173,13
@@
tsetattr(int *attr, int l) {
case 4:
term.c.attr.mode |= ATTR_UNDERLINE;
break;
case 4:
term.c.attr.mode |= ATTR_UNDERLINE;
break;
+ case 5:
+ term.c.attr.mode |= ATTR_BLINK;
+ break;
case 7:
term.c.attr.mode |= ATTR_REVERSE;
break;
case 7:
term.c.attr.mode |= ATTR_REVERSE;
break;
+ case 21:
case 22:
term.c.attr.mode &= ~ATTR_BOLD;
break;
case 22:
term.c.attr.mode &= ~ATTR_BOLD;
break;
@@
-1158,6
+1189,9
@@
tsetattr(int *attr, int l) {
case 24:
term.c.attr.mode &= ~ATTR_UNDERLINE;
break;
case 24:
term.c.attr.mode &= ~ATTR_UNDERLINE;
break;
+ case 25:
+ term.c.attr.mode &= ~ATTR_BLINK;
+ break;
case 27:
term.c.attr.mode &= ~ATTR_REVERSE;
break;
case 27:
term.c.attr.mode &= ~ATTR_REVERSE;
break;
@@
-1197,7
+1231,7
@@
tsetattr(int *attr, int l) {
else if(BETWEEN(attr[i], 90, 97))
term.c.attr.fg = attr[i] - 90 + 8;
else if(BETWEEN(attr[i], 100, 107))
else if(BETWEEN(attr[i], 90, 97))
term.c.attr.fg = attr[i] - 90 + 8;
else if(BETWEEN(attr[i], 100, 107))
- term.c.attr.
f
g = attr[i] - 100 + 8;
+ term.c.attr.
b
g = attr[i] - 100 + 8;
else
fprintf(stderr, "erresc(default): gfx attr %d unknown\n", attr[i]), csidump();
break;
else
fprintf(stderr, "erresc(default): gfx attr %d unknown\n", attr[i]), csidump();
break;
@@
-1509,6
+1543,9
@@
strhandle(void) {
break;
}
break;
break;
}
break;
+ case 'k': /* old title set compatibility */
+ XStoreName(xw.dpy, xw.win, strescseq.buf);
+ break;
case 'P': /* DSC -- Device Control String */
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
case 'P': /* DSC -- Device Control String */
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
@@
-1571,10
+1608,8
@@
void
tputc(char *c) {
char ascii = *c;
tputc(char *c) {
char ascii = *c;
- if(fileio) {
- putc(ascii, fileio);
- fflush(fileio);
- }
+ if(iofd != -1)
+ write(iofd, c, 1);
if(term.esc & ESC_START) {
if(term.esc & ESC_CSI) {
if(term.esc & ESC_START) {
if(term.esc & ESC_CSI) {
@@
-1624,6
+1659,7
@@
tputc(char *c) {
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
case ']': /* OSC -- Operating System Command */
case '_': /* APC -- Application Program Command */
case '^': /* PM -- Privacy Message */
case ']': /* OSC -- Operating System Command */
+ case 'k': /* old title set compatibility */
strreset();
strescseq.type = ascii;
term.esc |= ESC_STR;
strreset();
strescseq.type = ascii;
term.esc |= ESC_STR;
@@
-1656,6
+1692,7
@@
tputc(char *c) {
case 'c': /* RIS -- Reset to inital state */
treset();
term.esc = 0;
case 'c': /* RIS -- Reset to inital state */
treset();
term.esc = 0;
+ xresettitle();
break;
case '=': /* DECPAM -- Application keypad */
term.mode |= MODE_APPKEYPAD;
break;
case '=': /* DECPAM -- Application keypad */
term.mode |= MODE_APPKEYPAD;
@@
-1750,16
+1787,16
@@
tresize(int col, int row) {
}
/* resize to new height */
}
/* resize to new height */
- term.line = realloc(term.line, row * sizeof(Line));
- term.alt = realloc(term.alt, row * sizeof(Line));
- term.dirty = realloc(term.dirty, row * sizeof(*term.dirty));
- term.tabs = realloc(term.tabs, col * sizeof(*term.tabs));
+ term.line =
x
realloc(term.line, row * sizeof(Line));
+ term.alt =
x
realloc(term.alt, row * sizeof(Line));
+ term.dirty =
x
realloc(term.dirty, row * sizeof(*term.dirty));
+ term.tabs =
x
realloc(term.tabs, col * sizeof(*term.tabs));
/* resize each row to new width, zero-pad if needed */
for(i = 0; i < minrow; i++) {
term.dirty[i] = 1;
/* resize each row to new width, zero-pad if needed */
for(i = 0; i < minrow; i++) {
term.dirty[i] = 1;
- term.line[i] = realloc(term.line[i], col * sizeof(Glyph));
- term.alt[i] = realloc(term.alt[i], col * sizeof(Glyph));
+ term.line[i] =
x
realloc(term.line[i], col * sizeof(Glyph));
+ term.alt[i] =
x
realloc(term.alt[i], col * sizeof(Glyph));
for(x = mincol; x < col; x++) {
term.line[i][x].state = 0;
term.alt[i][x].state = 0;
for(x = mincol; x < col; x++) {
term.line[i][x].state = 0;
term.alt[i][x].state = 0;
@@
-1998,7
+2035,7
@@
xinit(void) {
xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
-
XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st"
);
+
xresettitle(
);
XMapWindow(xw.dpy, xw.win);
xhints();
XSync(xw.dpy, 0);
XMapWindow(xw.dpy, xw.win);
xhints();
XSync(xw.dpy, 0);
@@
-2094,6
+2131,11
@@
xdrawcursor(void) {
xcopy();
}
xcopy();
}
+void
+xresettitle(void) {
+ XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");
+}
+
void
redraw(void) {
struct timespec tv = {0, REDRAW_TIMEOUT * 1000};
void
redraw(void) {
struct timespec tv = {0, REDRAW_TIMEOUT * 1000};