ATTR_BOLD = 4,
ATTR_GFX = 8,
ATTR_ITALIC = 16,
+ ATTR_BLINK = 32,
};
enum cursor_movement {
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 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;
+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;
sel.mode = 1;
sel.ex = sel.bx = X2COL(e->xbutton.x);
sel.ey = sel.by = Y2ROW(e->xbutton.y);
- draw();
}
}
else {
bufsize = (term.col+1) * (sel.e.y-sel.b.y+1) * UTF_SIZ;
- ptr = str = malloc(bufsize);
+ ptr = str = xmalloc(bufsize);
/* append every set & selected glyph to the selection */
for(y = 0; y < term.row; y++) {
close(s);
cmdfd = m;
signal(SIGCHLD, sigchld);
- if(opt_io && !(fileio = fopen(opt_io, "w"))) {
- fprintf(stderr, "Error opening %s:%s\n",
- opt_io, strerror(errno));
+ if(opt_io) {
+ if(!strcmp(opt_io, "-")) {
+ iofd = STDOUT_FILENO;
+ } else {
+ if((iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0) {
+ fprintf(stderr, "Error opening %s:%s\n",
+ opt_io, strerror(errno));
+ }
+ }
}
}
}
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 = xmalloc(term.row * sizeof(Line));
+ term.alt = xmalloc(term.row * sizeof(Line));
+ term.dirty = xmalloc(term.row * sizeof(*term.dirty));
+ term.tabs = xmalloc(term.col * sizeof(*term.tabs));
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] = xmalloc(term.col * sizeof(Glyph));
+ term.alt [row] = xmalloc(term.col * sizeof(Glyph));
term.dirty[row] = 0;
}
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
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;
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 21:
case 22:
term.c.attr.mode &= ~ATTR_BOLD;
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;
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.fg = attr[i] - 100 + 8;
+ term.c.attr.bg = attr[i] - 100 + 8;
else
fprintf(stderr, "erresc(default): gfx attr %d unknown\n", attr[i]), csidump();
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 */
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) {
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;
}
/* 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 = xrealloc(term.line, row * sizeof(Line));
+ term.alt = xrealloc(term.alt, row * sizeof(Line));
+ term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty));
+ term.tabs = xrealloc(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;
- term.line[i] = realloc(term.line[i], col * sizeof(Glyph));
- term.alt[i] = realloc(term.alt[i], col * sizeof(Glyph));
+ term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph));
+ term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph));
for(x = mincol; x < col; x++) {
term.line[i][x].state = 0;
term.alt[i][x].state = 0;
die("Can't open display\n");
xw.scr = XDefaultScreen(xw.dpy);
+ /* font */
+ initfonts(FONT, BOLDFONT, ITALICFONT);
+
+ /* XXX: Assuming same size for bold font */
+ xw.cw = dc.font.rbearing - dc.font.lbearing;
+ xw.ch = dc.font.ascent + dc.font.descent;
+
+ /* colors */
+ xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
+ xloadcols();
+
/* adjust fixed window geometry */
if(xw.isfixed) {
sw = DisplayWidth(xw.dpy, xw.scr);
xw.fy = 0;
}
- /* font */
- initfonts(FONT, BOLDFONT, ITALICFONT);
-
- /* XXX: Assuming same size for bold font */
- xw.cw = dc.font.rbearing - dc.font.lbearing;
- xw.ch = dc.font.ascent + dc.font.descent;
-
- /* colors */
- xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
- xloadcols();
-
attrs.background_pixel = dc.col[DefaultBG];
attrs.border_pixel = dc.col[DefaultBG];
attrs.bit_gravity = NorthWestGravity;