|
|
@ -56,7 +56,7 @@ typedef struct { |
|
|
|
typedef Glyph* Line; |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
Glyph attr; /* current char attributes */ |
|
|
|
Glyph attr; /* current char attributes */ |
|
|
|
int x; |
|
|
|
int y; |
|
|
|
} TCursor; |
|
|
@ -65,24 +65,24 @@ typedef struct { |
|
|
|
/* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */ |
|
|
|
typedef struct { |
|
|
|
char buf[ESC_BUF_SIZ]; /* raw string */ |
|
|
|
int len; /* raw string length */ |
|
|
|
int len; /* raw string length */ |
|
|
|
char priv; |
|
|
|
int arg[ESC_ARG_SIZ]; |
|
|
|
int narg; /* nb of args */ |
|
|
|
int narg; /* nb of args */ |
|
|
|
char mode; |
|
|
|
} CSIEscape; |
|
|
|
|
|
|
|
/* Internal representation of the screen */ |
|
|
|
typedef struct { |
|
|
|
int row; /* nb row */ |
|
|
|
int col; /* nb col */ |
|
|
|
int row; /* nb row */ |
|
|
|
int col; /* nb col */ |
|
|
|
Line* line; /* screen */ |
|
|
|
TCursor c; /* cursor */ |
|
|
|
TCursor c; /* cursor */ |
|
|
|
char hidec; |
|
|
|
int top; /* top scroll limit */ |
|
|
|
int bot; /* bottom scroll limit */ |
|
|
|
int mode; /* terminal mode flags */ |
|
|
|
int esc; /* escape state flags */ |
|
|
|
int top; /* top scroll limit */ |
|
|
|
int bot; /* bottom scroll limit */ |
|
|
|
int mode; /* terminal mode flags */ |
|
|
|
int esc; /* escape state flags */ |
|
|
|
char title[ESC_TITLE_SIZ]; |
|
|
|
int titlelen; |
|
|
|
} Term; |
|
|
@ -93,8 +93,10 @@ typedef struct { |
|
|
|
Window win; |
|
|
|
Pixmap buf; |
|
|
|
int scr; |
|
|
|
int w; /* window width */ |
|
|
|
int h; /* window height */ |
|
|
|
int w; /* window width */ |
|
|
|
int h; /* window height */ |
|
|
|
int bufw; /* pixmap width */ |
|
|
|
int bufh; /* pixmap height */ |
|
|
|
int ch; /* char height */ |
|
|
|
int cw; /* char width */ |
|
|
|
} XWindow; |
|
|
@ -216,7 +218,7 @@ execsh(void) { |
|
|
|
|
|
|
|
void |
|
|
|
xbell(void) { /* visual bell */ |
|
|
|
XRectangle r = { BORDER, BORDER, xw.w, xw.h }; |
|
|
|
XRectangle r = { BORDER, BORDER, xw.bufw, xw.bufh }; |
|
|
|
XSetForeground(xw.dis, dc.gc, dc.col[BellCol]); |
|
|
|
XFillRectangles(xw.dis, xw.win, dc.gc, &r, 1); |
|
|
|
/* usleep(30000); */ |
|
|
@ -367,7 +369,7 @@ tscrolldown (int n) { |
|
|
|
|
|
|
|
for(i = 0; i < n; i++) |
|
|
|
memset(term.line[term.bot-i], 0, term.col*sizeof(Glyph)); |
|
|
|
|
|
|
|
|
|
|
|
for(i = term.bot; i >= term.top+n; i--) { |
|
|
|
temp = term.line[i]; |
|
|
|
term.line[i] = term.line[i-n]; |
|
|
@ -582,7 +584,7 @@ tsetattr(int *attr, int l) { |
|
|
|
term.c.attr.mode |= ATTR_REVERSE; |
|
|
|
break; |
|
|
|
case 22: |
|
|
|
term.c.attr.mode &= ~ATTR_BOLD; |
|
|
|
term.c.attr.mode &= ~ATTR_BOLD; |
|
|
|
break; |
|
|
|
case 24: |
|
|
|
term.c.attr.mode &= ~ATTR_UNDERLINE; |
|
|
@ -665,7 +667,7 @@ csihandle(void) { |
|
|
|
case 'G': /* CHA -- Move to <col> */ |
|
|
|
case '`': /* XXX: HPA -- same? */ |
|
|
|
DEFAULT(escseq.arg[0], 1); |
|
|
|
tmoveto(escseq.arg[0]-1, term.c.y); |
|
|
|
tmoveto(escseq.arg[0]-1, term.c.y); |
|
|
|
break; |
|
|
|
case 'H': /* CUP -- Move to <row> <col> */ |
|
|
|
case 'f': /* XXX: HVP -- same? */ |
|
|
@ -1026,12 +1028,23 @@ xclear(int x1, int y1, int x2, int y2) { |
|
|
|
(x2-x1+1) * xw.cw, (y2-y1+1) * xw.ch); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
xhints(void) |
|
|
|
{ |
|
|
|
XClassHint chint = {TNAME, TNAME}; |
|
|
|
XWMHints wmhint = {.flags = InputHint, .input = 1}; |
|
|
|
XSizeHints shint = { |
|
|
|
.flags = PSize | PResizeInc, |
|
|
|
.height = xw.h, /* XXX: doesn't seem to work, see run() */ |
|
|
|
.width = xw.w, |
|
|
|
.height_inc = xw.ch, |
|
|
|
.width_inc = xw.cw, |
|
|
|
}; |
|
|
|
XSetWMProperties(xw.dis, xw.win, NULL, NULL, NULL, 0, &shint, &wmhint, &chint); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
xinit(void) { |
|
|
|
XClassHint chint; |
|
|
|
XWMHints wmhint; |
|
|
|
XSizeHints shint; |
|
|
|
char *args[] = {NULL}; |
|
|
|
int i; |
|
|
|
|
|
|
|
xw.dis = XOpenDisplay(NULL); |
|
|
@ -1055,27 +1068,21 @@ xinit(void) { |
|
|
|
term.c.attr.bg = DefaultBG; |
|
|
|
term.c.attr.mode = ATTR_NULL; |
|
|
|
/* windows */ |
|
|
|
xw.h = term.row * xw.ch; |
|
|
|
xw.w = term.col * xw.cw; |
|
|
|
xw.h = term.row * xw.ch + 2*BORDER; |
|
|
|
xw.w = term.col * xw.cw + 2*BORDER; |
|
|
|
xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, |
|
|
|
xw.w + 2*BORDER, xw.h + 2*BORDER, 0, |
|
|
|
xw.w, xw.h, 0, |
|
|
|
dc.col[DefaultBG], |
|
|
|
dc.col[DefaultBG]); |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.w, xw.h, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
xw.bufw = xw.w - 2*BORDER; |
|
|
|
xw.bufh = xw.h - 2*BORDER; |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
/* gc */ |
|
|
|
dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); |
|
|
|
XMapWindow(xw.dis, xw.win); |
|
|
|
/* wm stuff */ |
|
|
|
chint.res_name = TNAME, chint.res_class = TNAME; |
|
|
|
wmhint.input = 1, wmhint.flags = InputHint; |
|
|
|
shint.height_inc = xw.ch, shint.width_inc = xw.cw; |
|
|
|
shint.height = xw.h + 2*BORDER, shint.width = xw.w + 2*BORDER; |
|
|
|
shint.flags = PSize | PResizeInc; |
|
|
|
XSetWMProperties(xw.dis, xw.win, NULL, NULL, &args[0], 0, &shint, &wmhint, &chint); |
|
|
|
xhints(); |
|
|
|
XStoreName(xw.dis, xw.win, TNAME); |
|
|
|
XFillRectangle(xw.dis, xw.buf, dc.gc, 0, 0, xw.w, xw.h); |
|
|
|
XSync(xw.dis, 0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
@ -1152,7 +1159,7 @@ draw_(int dummy) { |
|
|
|
|
|
|
|
if(!term.hidec) |
|
|
|
xcursor(CURSOR_DRAW); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.w, xw.h, BORDER, BORDER); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); |
|
|
|
XFlush(xw.dis); |
|
|
|
} |
|
|
|
#endif |
|
|
@ -1181,7 +1188,7 @@ draw(int redraw_all) { |
|
|
|
xdraws(buf, base, ox, y, i); |
|
|
|
} |
|
|
|
xcursor(term.hidec ? CURSOR_HIDE : CURSOR_DRAW); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.w, xw.h, BORDER, BORDER); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); |
|
|
|
XFlush(xw.dis); |
|
|
|
} |
|
|
|
|
|
|
@ -1209,7 +1216,7 @@ kpress(XEvent *ev) { |
|
|
|
int meta; |
|
|
|
int shift; |
|
|
|
|
|
|
|
meta = e->state & Mod1Mask; |
|
|
|
meta = e->state & Mod1Mask; |
|
|
|
shift = e->state & ShiftMask; |
|
|
|
len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); |
|
|
|
|
|
|
@ -1242,18 +1249,21 @@ kpress(XEvent *ev) { |
|
|
|
void |
|
|
|
resize(XEvent *e) { |
|
|
|
int col, row; |
|
|
|
col = e->xconfigure.width / xw.cw; |
|
|
|
row = e->xconfigure.height / xw.ch; |
|
|
|
|
|
|
|
if(term.col != col || term.row != row) { |
|
|
|
tresize(col, row); |
|
|
|
ttyresize(col, row); |
|
|
|
xw.w = e->xconfigure.width; |
|
|
|
xw.h = e->xconfigure.height; |
|
|
|
XFreePixmap(xw.dis, xw.buf); |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.w, xw.h, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
if(e->xconfigure.width == xw.w && e->xconfigure.height == xw.h) |
|
|
|
return; |
|
|
|
|
|
|
|
xw.w = e->xconfigure.width; |
|
|
|
xw.h = e->xconfigure.height; |
|
|
|
xw.bufw = xw.w - 2*BORDER; |
|
|
|
xw.bufh = xw.h - 2*BORDER; |
|
|
|
col = xw.bufw / xw.cw; |
|
|
|
row = xw.bufh / xw.ch; |
|
|
|
tresize(col, row); |
|
|
|
ttyresize(col, row); |
|
|
|
XFreePixmap(xw.dis, xw.buf); |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
@ -1264,7 +1274,7 @@ run(void) { |
|
|
|
|
|
|
|
running = 1; |
|
|
|
XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask); |
|
|
|
XResizeWindow(xw.dis, xw.win, xw.w+2*BORDER, xw.h+2*BORDER); /* fix resize bug in wmii (?) */ |
|
|
|
XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in wmii (?) */ |
|
|
|
|
|
|
|
while(running) { |
|
|
|
FD_ZERO(&rfd); |
|
|
|