From d2f157c7418e2762316e5471f819ec1e5c49e93c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 13 Aug 2010 22:43:30 +0200 Subject: [PATCH 01/16] renamed a function. --- st.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/st.c b/st.c index 5715f0f..deddb0d 100644 --- a/st.c +++ b/st.c @@ -157,6 +157,7 @@ static void ttywrite(const char *, size_t); static void xclear(int, int, int, int); static void xcursor(int); static void xinit(void); +static void xloadcols(void); static void expose(XEvent *); static char* kmap(KeySym); @@ -1035,7 +1036,7 @@ tresize(int col, int row) { } void -tloadcols(void) { +xloadcols(void) { int i, r, g, b; XColor color; Colormap cmap = DefaultColormap(xw.dis, xw.scr); @@ -1115,7 +1116,7 @@ xinit(void) { xw.ch = dc.font->ascent + dc.font->descent; /* colors */ - tloadcols(); + xloadcols(); term.c.attr.fg = DefaultFG; term.c.attr.bg = DefaultBG; -- 1.7.10.4 From ce3f4fc647be3ab28f934db9365445a56ebd85bf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 19 Aug 2010 12:46:54 +0200 Subject: [PATCH 02/16] fixed backspace problem, updated terminfo entry and moved TNAME in config.h. --- Makefile | 1 - config.h | 3 ++- st.c | 6 ++---- st.info | 9 ++++++++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 14da7a5..9ec8d21 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,6 @@ install: all @cp -f st ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/st @tic st.info - @tic st-256color.info uninstall: @echo removing executable file from ${DESTDIR}${PREFIX}/bin diff --git a/config.h b/config.h index aee8057..c3c4e41 100644 --- a/config.h +++ b/config.h @@ -1,5 +1,5 @@ #define TAB 8 - +#define TNAME "st-256color" #define FONT "6x13" #define BOLDFONT FONT"bold" #define BORDER 2 @@ -33,6 +33,7 @@ static const char *colorname[] = { /* special keys */ static Key key[] = { + { XK_BackSpace, "\177" }, { XK_Delete, "\033[3~" }, { XK_Home, "\033[1~" }, { XK_End, "\033[4~" }, diff --git a/st.c b/st.c index deddb0d..f8d2257 100644 --- a/st.c +++ b/st.c @@ -20,8 +20,6 @@ #include #include -#define TNAME "st-256color" - /* Arbitrary sizes */ #define ESC_TITLE_SIZ 256 #define ESC_BUF_SIZ 256 @@ -107,8 +105,6 @@ typedef struct { char s[ESC_BUF_SIZ]; } Key; -#include "config.h" - /* Drawing Context */ typedef struct { unsigned long col[256]; @@ -117,6 +113,8 @@ typedef struct { GC gc; } DC; +#include "config.h" + static void die(const char *errstr, ...); static void draw(int); static void execsh(void); diff --git a/st.info b/st.info index 1cf6344..b2669dd 100644 --- a/st.info +++ b/st.info @@ -30,7 +30,7 @@ st| simpleterm, il1=\E[L, ind=^J, invis=\E[8m, - kbs=^H, + kbs=\177, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, @@ -52,3 +52,10 @@ st| simpleterm, smso=\E[7m, smul=\E[4m, tbc=\E[2g, + +st-256color| simpleterm with 256 colors, + colors#256, +# Nicked from xterm-256color + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, + use=st, -- 1.7.10.4 From a7922bd1d94ace6d14e40a27820e217cd6c4e632 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Sun, 22 Aug 2010 19:46:46 +0200 Subject: [PATCH 03/16] added F1-12 key, fixed DCH and ICH. --- config.h | 12 ++++++++++++ st.c | 8 ++++---- st.info | 12 ++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/config.h b/config.h index c3c4e41..bb490ab 100644 --- a/config.h +++ b/config.h @@ -39,6 +39,18 @@ static Key key[] = { { XK_End, "\033[4~" }, { XK_Prior, "\033[5~" }, { XK_Next, "\033[6~" }, + { XK_F1, "\033OP" }, + { XK_F2, "\033OQ" }, + { XK_F3, "\033OR" }, + { XK_F4, "\033OS" }, + { XK_F5, "\033[15~" }, + { XK_F6, "\033[17~" }, + { XK_F7, "\033[18~" }, + { XK_F8, "\033[19~" }, + { XK_F9, "\033[20~" }, + { XK_F10, "\033[21~" }, + { XK_F11, "\033[23~" }, + { XK_F12, "\033[24~" }, }; static char gfx[] = { diff --git a/st.c b/st.c index f8d2257..6e34f1e 100644 --- a/st.c +++ b/st.c @@ -497,21 +497,21 @@ tdeletechar(int n) { return; } memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src], size * sizeof(Glyph)); - tclearregion(term.col-size, term.c.y, term.col-1, term.c.y); + tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); } void tinsertblank(int n) { int src = term.c.x; int dst = src + n; - int size = term.col - n - src; + int size = term.col - dst; if(dst >= term.col) { tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); return; } memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src], size * sizeof(Glyph)); - tclearregion(src, term.c.y, dst, term.c.y); + tclearregion(src, term.c.y, dst - 1, term.c.y); } void @@ -1173,7 +1173,7 @@ xcursor(int mode) { if(term.line[term.c.y][term.c.x].state & GLYPH_SET) g.c = term.line[term.c.y][term.c.x].c; - + /* remove the old cursor */ if(term.line[oldy][oldx].state & GLYPH_SET) xdraws(&term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, oldy, 1); diff --git a/st.info b/st.info index b2669dd..2cc645b 100644 --- a/st.info +++ b/st.info @@ -37,6 +37,18 @@ st| simpleterm, kcuu1=\E[A, kdch1=\E[3~, kend=\E[4~, + kf1=\EOP, + kf2=\EOQ, + kf3=\EOR, + kf4=\EOS, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, khome=\E[1~, knp=\E[6~, kpp=\E[5~, -- 1.7.10.4 From b09401b96b640a796d11774664c49031cee3245a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 21:32:34 +0200 Subject: [PATCH 04/16] fix \b and clean \t. --- st.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/st.c b/st.c index 6e34f1e..2e0ef70 100644 --- a/st.c +++ b/st.c @@ -443,11 +443,6 @@ tmovecursor(int dir) { break; case CURSOR_LEFT: xf--; - if(term.mode & MODE_WRAP && xf < 0) { - xf = term.col-1, yf--; - if(yf < term.top) - yf = term.top, xf = 0; - } break; case CURSOR_RIGHT: xf++; -- 1.7.10.4 From 44226483fb0a3d6270970399d8a91abb2d16146b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 21:33:53 +0200 Subject: [PATCH 05/16] update function prototypes. --- st.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/st.c b/st.c index 2e0ef70..04ff1b9 100644 --- a/st.c +++ b/st.c @@ -136,6 +136,7 @@ static void tinsertblankline(int); static void tmoveto(int, int); static void tnew(int, int); static void tnewline(void); +static void tputtab(void); static void tputc(char); static void tputs(char*, int); static void treset(void); @@ -152,6 +153,9 @@ static void ttyread(void); static void ttyresize(int, int); static void ttywrite(const char *, size_t); +static void xbell(void); +static void xdraws(char *, Glyph, int, int, int); +static void xhints(void); static void xclear(int, int, int, int); static void xcursor(int); static void xinit(void); -- 1.7.10.4 From 5c93f399c564f3475ffa4d3b3314a06db533e410 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 21:34:37 +0200 Subject: [PATCH 06/16] clean \t. --- st.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/st.c b/st.c index 04ff1b9..bef3039 100644 --- a/st.c +++ b/st.c @@ -861,12 +861,7 @@ csireset(void) { void tputtab(void) { int space = TAB - term.c.x % TAB; - - if(term.c.x + space >= term.col) - space--; - - for(; space > 0; space--) - tmovecursor(CURSOR_RIGHT); + tmoveto(term.c.x + space, term.c.y); } void -- 1.7.10.4 From e8c13ebe8001a7870a70b698d8b8fa80b7c90fd3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 21:36:21 +0200 Subject: [PATCH 07/16] close master/slave pty in the shell process. --- st.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/st.c b/st.c index bef3039..e288902 100644 --- a/st.c +++ b/st.c @@ -247,7 +247,7 @@ ttynew(void) { if((m = posix_openpt(O_RDWR | O_NOCTTY)) < 0) die("openpt failed: %s\n", SERRNO); if(grantpt(m) < 0) - die("grandpt failed: %s\n", SERRNO); + die("grantpt failed: %s\n", SERRNO); if(unlockpt(m) < 0) die("unlockpt failed: %s\n", SERRNO); if(!(pts = ptsname(m))) @@ -265,7 +265,9 @@ ttynew(void) { dup2(s, STDOUT_FILENO); dup2(s, STDERR_FILENO); if(ioctl(s, TIOCSCTTY, NULL) < 0) - die("ioctl TTIOCSTTY failed: %s\n", SERRNO); + die("ioctl TIOCSCTTY failed: %s\n", SERRNO); + close(s); + close(m); execsh(); break; default: -- 1.7.10.4 From 4db3df312ada9d92564d5580fb4e67f7704efff8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 21:37:12 +0200 Subject: [PATCH 08/16] faster resizing. --- st.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/st.c b/st.c index e288902..f44db79 100644 --- a/st.c +++ b/st.c @@ -1001,23 +1001,21 @@ tputs(char *s, int len) { void tresize(int col, int row) { int i; - Line *line; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); if(col < 1 || row < 1) return; - /* alloc */ - line = calloc(row, sizeof(Line)); - for(i = 0 ; i < row; i++) - line[i] = calloc(col, sizeof(Glyph)); - /* copy */ - for(i = 0 ; i < minrow; i++) - memcpy(line[i], term.line[i], mincol * sizeof(Glyph)); - /* free */ - for(i = 0; i < term.row; i++) + + for(i = row; i < term.row; i++) free(term.line[i]); - free(term.line); + term.line = realloc(term.line, row * sizeof(Line)); + for(i = 0; i < minrow; i++) { + term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); + memset(term.line[i] + mincol, 0, (col - mincol) * sizeof(Glyph)); + } + for(/* i == minrow */; i < row; i++) + term.line[i] = calloc(col, sizeof(Glyph)); LIMIT(term.c.x, 0, col-1); LIMIT(term.c.y, 0, row-1); @@ -1025,7 +1023,6 @@ tresize(int col, int row) { LIMIT(term.bot, 0, row-1); term.bot = row-1; - term.line = line; term.col = col, term.row = row; } -- 1.7.10.4 From 5d611cd5476b56884077120bc2a6ba9727fcdd2c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Thu, 26 Aug 2010 23:43:08 +0200 Subject: [PATCH 09/16] added macro to test flags, removed tmovecursor(). --- st.c | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/st.c b/st.c index f44db79..8b0e510 100644 --- a/st.c +++ b/st.c @@ -34,6 +34,7 @@ #define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg) +#define IS_SET(flag) (term.mode & flag) /* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=8 }; @@ -128,7 +129,7 @@ static void csireset(void); static void tclearregion(int, int, int, int); static void tcursor(int); -static void tmovecursor(int); +static void twrapcursor(void); static void tdeletechar(int); static void tdeleteline(int); static void tinsertblank(int); @@ -437,29 +438,13 @@ tmoveto(int x, int y) { } void -tmovecursor(int dir) { - int xf = term.c.x, yf = term.c.y; - - switch(dir) { - case CURSOR_UP: - yf--; - break; - case CURSOR_DOWN: - yf++; - break; - case CURSOR_LEFT: - xf--; - break; - case CURSOR_RIGHT: - xf++; - if(term.mode & MODE_WRAP && xf >= term.col) { - xf = 0, yf++; - if(yf > term.bot) - yf = term.bot, tscroll(); - } - break; - } - tmoveto(xf, yf); +twrapcursor(void) { + int y = term.c.y+1; + if(y > term.bot) { + tmoveto(0, term.bot); + tscroll(); + } else + tmoveto(0, y); } void @@ -969,7 +954,7 @@ tputc(char c) { tputtab(); break; case '\b': - tmovecursor(CURSOR_LEFT); + tmoveto(term.c.x-1, term.c.y); break; case '\r': tmoveto(0, term.c.y); @@ -986,7 +971,10 @@ tputc(char c) { break; default: tsetchar(c); - tmovecursor(CURSOR_RIGHT); + if(term.c.x+1 < term.col) { + tmoveto(term.c.x+1, term.c.y); + } else if(IS_SET(MODE_WRAP)) + twrapcursor(); break; } } @@ -1282,7 +1270,7 @@ kpress(XEvent *ev) { case XK_Down: case XK_Left: case XK_Right: - sprintf(buf, "\033%c%c", term.mode & MODE_APPKEYPAD ? 'O' : '[', "DACB"[ksym - XK_Left]); + sprintf(buf, "\033%c%c", IS_SET(MODE_APPKEYPAD) ? 'O' : '[', "DACB"[ksym - XK_Left]); ttywrite(buf, 3); break; case XK_Insert: -- 1.7.10.4 From 42b2912e2151f02e181bd014ce1610f7e03a7d07 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 27 Aug 2010 00:05:50 +0200 Subject: [PATCH 10/16] cleaned some spaces. --- st.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/st.c b/st.c index 8b0e510..9667dbd 100644 --- a/st.c +++ b/st.c @@ -440,11 +440,11 @@ tmoveto(int x, int y) { void twrapcursor(void) { int y = term.c.y+1; - if(y > term.bot) { - tmoveto(0, term.bot); - tscroll(); - } else - tmoveto(0, y); + if(y > term.bot) { + tmoveto(0, term.bot); + tscroll(); + } else + tmoveto(0, y); } void @@ -971,10 +971,10 @@ tputc(char c) { break; default: tsetchar(c); - if(term.c.x+1 < term.col) { - tmoveto(term.c.x+1, term.c.y); - } else if(IS_SET(MODE_WRAP)) - twrapcursor(); + if(term.c.x+1 < term.col) { + tmoveto(term.c.x+1, term.c.y); + } else if(IS_SET(MODE_WRAP)) + twrapcursor(); break; } } -- 1.7.10.4 From fbb66da9a9ef3c12c1e8dee7433d003b85d70e9c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 27 Aug 2010 00:28:27 +0200 Subject: [PATCH 11/16] merged tcursorwrap() with tnewline(), added few comments and updated copyright. --- st.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/st.c b/st.c index 9667dbd..ebe896c 100644 --- a/st.c +++ b/st.c @@ -129,7 +129,6 @@ static void csireset(void); static void tclearregion(int, int, int, int); static void tcursor(int); -static void twrapcursor(void); static void tdeletechar(int); static void tdeleteline(int); static void tinsertblank(int); @@ -337,7 +336,8 @@ treset(void) { } void -tnew(int col, int row) { /* screen size */ +tnew(int col, int row) { + /* screen size */ term.row = row, term.col = col; term.top = 0, term.bot = term.row - 1; /* mode */ @@ -438,16 +438,6 @@ tmoveto(int x, int y) { } void -twrapcursor(void) { - int y = term.c.y+1; - if(y > term.bot) { - tmoveto(0, term.bot); - tscroll(); - } else - tmoveto(0, y); -} - -void tsetchar(char c) { term.line[term.c.y][term.c.x] = term.c.attr; term.line[term.c.y][term.c.x].c = c; @@ -974,7 +964,7 @@ tputc(char c) { if(term.c.x+1 < term.col) { tmoveto(term.c.x+1, term.c.y); } else if(IS_SET(MODE_WRAP)) - twrapcursor(); + tnewline(); break; } } @@ -995,13 +985,20 @@ tresize(int col, int row) { if(col < 1 || row < 1) return; + /* free uneeded rows */ for(i = row; i < term.row; i++) free(term.line[i]); + + /* resize to new height */ term.line = realloc(term.line, row * sizeof(Line)); + + /* resize each row to new width, zero-pad if needed */ for(i = 0; i < minrow; i++) { term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); memset(term.line[i] + mincol, 0, (col - mincol) * sizeof(Glyph)); } + + /* allocate any new rows */ for(/* i == minrow */; i < row; i++) term.line[i] = calloc(col, sizeof(Glyph)); @@ -1337,7 +1334,7 @@ run(void) { int main(int argc, char *argv[]) { if(argc == 2 && !strncmp("-v", argv[1], 3)) - die("st-" VERSION ", © 2009 st engineers\n"); + die("st-" VERSION ", (c) 2010 st engineers\n"); else if(argc != 1) die("usage: st [-v]\n"); setlocale(LC_CTYPE, ""); -- 1.7.10.4 From a1018e0e9e52f29fe220a6af85a237a1a02a732c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 27 Aug 2010 00:58:28 +0200 Subject: [PATCH 12/16] fixed potential bug in IS_SET(). --- st.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/st.c b/st.c index ebe896c..8dfd4a7 100644 --- a/st.c +++ b/st.c @@ -34,7 +34,7 @@ #define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg) -#define IS_SET(flag) (term.mode & flag) +#define IS_SET(flag) (term.mode & (flag)) /* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=8 }; -- 1.7.10.4 From c56332857145d1c6741d4f6c1bbc87dcc6c6ab97 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Fri, 27 Aug 2010 13:53:27 +0200 Subject: [PATCH 13/16] removed XINERAMA from config.mk and fixed a segfault when st is started without a display. (thx Hiltjo Posthuma) --- config.mk | 8 ++------ st.c | 5 ++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/config.mk b/config.mk index 62eb48f..2827e98 100644 --- a/config.mk +++ b/config.mk @@ -10,16 +10,12 @@ MANPREFIX = ${PREFIX}/share/man X11INC = /usr/X11R6/include X11LIB = /usr/X11R6/lib -# Xinerama, comment if you don't want it -#XINERAMALIBS = -L${X11LIB} -lXinerama -#XINERAMAFLAGS = -DXINERAMA - # includes and libs INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 # flags -CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +CPPFLAGS = -DVERSION=\"${VERSION}\" CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} LDFLAGS = -s ${LIBS} diff --git a/st.c b/st.c index 8dfd4a7..623ca29 100644 --- a/st.c +++ b/st.c @@ -1078,10 +1078,9 @@ xhints(void) void xinit(void) { - xw.dis = XOpenDisplay(NULL); - xw.scr = XDefaultScreen(xw.dis); - if(!xw.dis) + if(!(xw.dis = XOpenDisplay(NULL))) die("Can't open display\n"); + xw.scr = XDefaultScreen(xw.dis); /* font */ if(!(dc.font = XLoadQueryFont(xw.dis, FONT)) || !(dc.bfont = XLoadQueryFont(xw.dis, BOLDFONT))) -- 1.7.10.4 From 6db6980e27bdde6f2d444dd3cdd7a46985fa84fc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Sat, 28 Aug 2010 03:18:22 +0200 Subject: [PATCH 14/16] st now runs on Linux, OpenBSD and FreeBSD. --- Makefile | 5 +++-- config.mk | 13 +++++++------ st.c | 27 ++++++++++++++------------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index 9ec8d21..ef3bf09 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ all: options st options: @echo st build options: + @echo "SYSTEM = ${SYSTEM}" @echo "CFLAGS = ${CFLAGS}" @echo "LDFLAGS = ${LDFLAGS}" @echo "CC = ${CC}" @@ -31,7 +32,7 @@ clean: dist: clean @echo creating dist tarball @mkdir -p st-${VERSION} - @cp -R LICENSE Makefile README config.mk st.h ${SRC} st-${VERSION} + @cp -R LICENSE Makefile README config.mk config.h st.info ${SRC} st-${VERSION} @tar -cf st-${VERSION}.tar st-${VERSION} @gzip st-${VERSION}.tar @rm -rf st-${VERSION} @@ -41,7 +42,7 @@ install: all @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f st ${DESTDIR}${PREFIX}/bin @chmod 755 ${DESTDIR}${PREFIX}/bin/st - @tic st.info + @tic -s st.info uninstall: @echo removing executable file from ${DESTDIR}${PREFIX}/bin diff --git a/config.mk b/config.mk index 2827e98..216e7df 100644 --- a/config.mk +++ b/config.mk @@ -12,16 +12,17 @@ X11LIB = /usr/X11R6/lib # includes and libs INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil + +# uncomment your system # +#SYSTEM = -DLINUX +#SYSTEM = -DOPENBSD +#SYSTEM = -DFREEBSD # flags -CPPFLAGS = -DVERSION=\"${VERSION}\" +CPPFLAGS = -DVERSION=\"${VERSION}\" ${SYSTEM} CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} LDFLAGS = -s ${LIBS} -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - # compiler and linker CC = cc diff --git a/st.c b/st.c index 623ca29..9ca032f 100644 --- a/st.c +++ b/st.c @@ -20,6 +20,14 @@ #include #include +#if defined(LINUX) + #include +#elif defined(OPENBSD) + #include +#elif defined(FREEBSD) + #include +#endif + /* Arbitrary sizes */ #define ESC_TITLE_SIZ 256 #define ESC_BUF_SIZ 256 @@ -242,19 +250,12 @@ sigchld(int a) { void ttynew(void) { int m, s; - char *pts; - - if((m = posix_openpt(O_RDWR | O_NOCTTY)) < 0) - die("openpt failed: %s\n", SERRNO); - if(grantpt(m) < 0) - die("grantpt failed: %s\n", SERRNO); - if(unlockpt(m) < 0) - die("unlockpt failed: %s\n", SERRNO); - if(!(pts = ptsname(m))) - die("ptsname failed: %s\n", SERRNO); - if((s = open(pts, O_RDWR | O_NOCTTY)) < 0) - die("Couldn't open slave: %s\n", SERRNO); - fcntl(s, F_SETFL, O_NDELAY); + + /* seems to work fine on linux, openbsd and freebsd */ + struct winsize w = {term.row, term.col, 0, 0}; + if(openpty(&m, &s, NULL, NULL, &w) < 0) + die("openpty failed: %s\n", SERRNO); + switch(pid = fork()) { case -1: die("fork failed\n"); -- 1.7.10.4 From c186c8ef9a995616384c425c5568b6913676b252 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Sun, 29 Aug 2010 12:27:59 +0200 Subject: [PATCH 15/16] merged tscroll() with tscrollup(). --- st.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/st.c b/st.c index 9ca032f..eabc0c5 100644 --- a/st.c +++ b/st.c @@ -149,7 +149,6 @@ static void tputc(char); static void tputs(char*, int); static void treset(void); static void tresize(int, int); -static void tscroll(void); static void tscrollup(int); static void tscrolldown(int); static void tsetattr(int*, int); @@ -355,18 +354,6 @@ tnew(int col, int row) { term.line[row] = calloc(term.col, sizeof(Glyph)); } -/* TODO: Replace with scrollup/scolldown */ -void -tscroll(void) { - Line temp = term.line[term.top]; - int i; - - for(i = term.top; i < term.bot; i++) - term.line[i] = term.line[i+1]; - memset(temp, 0, sizeof(Glyph) * term.col); - term.line[term.bot] = temp; -} - void tscrolldown (int n) { int i; @@ -404,7 +391,7 @@ void tnewline(void) { int y = term.c.y + 1; if(y > term.bot) - tscroll(), y = term.bot; + tscrollup(1), y = term.bot; tmoveto(0, y); } -- 1.7.10.4 From 2181040594ae63f2821899caba0bef34257a6c2b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aur=C3=A9lien=20Aptel?= Date: Sun, 29 Aug 2010 18:55:15 +0200 Subject: [PATCH 16/16] moved term.hidec in term.c for consistency, put back delay in xbell() along with duration in config.h, factored some code in tnew()/treset() and cleaned some code. --- config.h | 1 + st.c | 48 ++++++++++++++++++++---------------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/config.h b/config.h index bb490ab..53795c6 100644 --- a/config.h +++ b/config.h @@ -30,6 +30,7 @@ static const char *colorname[] = { #define DefaultBG 0 #define DefaultCS 1 #define BellCol DefaultFG +#define BellTime 30000 /* microseconds */ /* special keys */ static Key key[] = { diff --git a/st.c b/st.c index eabc0c5..9b77a0b 100644 --- a/st.c +++ b/st.c @@ -67,6 +67,7 @@ typedef struct { Glyph attr; /* current char attributes */ int x; int y; + char hide; } TCursor; /* CSI Escape sequence structs */ @@ -86,7 +87,6 @@ typedef struct { int col; /* nb col */ Line* line; /* screen */ TCursor c; /* cursor */ - char hidec; int top; /* top scroll limit */ int bot; /* bottom scroll limit */ int mode; /* terminal mode flags */ @@ -221,17 +221,16 @@ die(const char *errstr, ...) { void execsh(void) { char *args[3] = {getenv("SHELL"), "-i", NULL}; - DEFAULT(args[0], "/bin/sh"); /* default shell if getenv() failed */ + DEFAULT(args[0], "/bin/sh"); /* if getenv() failed */ putenv("TERM=" TNAME); execvp(args[0], args); } void -xbell(void) { /* visual bell */ - XRectangle r = { BORDER, BORDER, xw.bufw, xw.bufh }; +xbell(void) { XSetForeground(xw.dis, dc.gc, dc.col[BellCol]); - XFillRectangles(xw.dis, xw.win, dc.gc, &r, 1); - /* usleep(30000); */ + XFillRectangle(xw.dis, xw.win, dc.gc, BORDER, BORDER, xw.bufw, xw.bufh); + usleep(BellTime); draw(SCREEN_REDRAW); } @@ -325,11 +324,12 @@ tcursor(int mode) { void treset(void) { - term.c.attr.mode = ATTR_NULL; - term.c.attr.fg = DefaultFG; - term.c.attr.bg = DefaultBG; - term.c.x = term.c.y = 0; - term.hidec = 0; + term.c = (TCursor){{ + .mode = ATTR_NULL, + .fg = DefaultFG, + .bg = DefaultBG + }, .x = 0, .y = 0, .hide = 0}; + term.top = 0, term.bot = term.row - 1; term.mode = MODE_WRAP; tclearregion(0, 0, term.col-1, term.row-1); @@ -337,21 +337,13 @@ treset(void) { void tnew(int col, int row) { - /* screen size */ + /* set screen size */ term.row = row, term.col = col; - term.top = 0, term.bot = term.row - 1; - /* mode */ - term.mode = MODE_WRAP; - /* cursor */ - term.c.attr.mode = ATTR_NULL; - term.c.attr.fg = DefaultFG; - term.c.attr.bg = DefaultBG; - term.c.x = term.c.y = 0; - term.hidec = 0; - /* allocate screen */ - term.line = calloc(term.row, sizeof(Line)); + term.line = malloc(term.row * sizeof(Line)); for(row = 0 ; row < term.row; row++) - term.line[row] = calloc(term.col, sizeof(Glyph)); + term.line[row] = malloc(term.col * sizeof(Glyph)); + /* setup screen */ + treset(); } void @@ -718,7 +710,7 @@ csihandle(void) { case 12: /* att610 -- Stop blinking cursor (IGNORED) */ break; case 25: - term.hidec = 1; + term.c.hide = 1; break; case 1048: /* XXX: no alt. screen to erase/save */ case 1049: @@ -767,7 +759,7 @@ csihandle(void) { case 12: /* att610 -- Start blinking cursor (IGNORED) */ break; case 25: - term.hidec = 0; + term.c.hide = 0; break; case 1048: case 1049: /* XXX: no alt. screen to erase/save */ @@ -1173,7 +1165,7 @@ draw(int dummy) { if(term.line[y][x].state & GLYPH_SET) xdrawc(x, y, term.line[y][x]); - if(!term.hidec) + if(!term.c.hide) xcursor(CURSOR_DRAW); XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); XFlush(xw.dis); @@ -1206,7 +1198,7 @@ draw(int redraw_all) { } xdraws(buf, base, ox, y, i); } - xcursor(term.hidec ? CURSOR_HIDE : CURSOR_DRAW); + xcursor(term.c.hide ? CURSOR_HIDE : CURSOR_DRAW); XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); XFlush(xw.dis); } -- 1.7.10.4