tadded support for the "magic margin", changed c.hide to c.state, changed xcurs… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 7d88cf88d05c5f5fffbe096da9fac79d7d8957f9 | |
parent 1f6e7b84c6131612cb8cb7751a2b373af9957c6d | |
Author: Aurélien Aptel <[email protected]> | |
Date: Mon, 30 Aug 2010 01:35:37 +0200 | |
added support for the "magic margin", changed c.hide to c.state, changed xcurso… | |
parameter and fixed the cursor position after setting a scrolling region. | |
Diffstat: | |
M st.c | 50 +++++++++++++++++------------… | |
1 file changed, 28 insertions(+), 22 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -46,8 +46,9 @@ | |
/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ | |
enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=… | |
-enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, CURSOR_HIDE = 1, | |
- CURSOR_DRAW = 0, CURSOR_SAVE, CURSOR_LOAD }; | |
+enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, | |
+ CURSOR_SAVE, CURSOR_LOAD }; | |
+enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; | |
enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; | |
enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4 }; | |
enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; | |
t@@ -67,7 +68,7 @@ typedef struct { | |
Glyph attr; /* current char attributes */ | |
int x; | |
int y; | |
- char hide; | |
+ char state; | |
} TCursor; | |
/* CSI Escape sequence structs */ | |
t@@ -164,7 +165,7 @@ 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 xcursor(void); | |
static void xinit(void); | |
static void xloadcols(void); | |
t@@ -329,7 +330,7 @@ treset(void) { | |
.mode = ATTR_NULL, | |
.fg = DefaultFG, | |
.bg = DefaultBG | |
- }, .x = 0, .y = 0, .hide = 0}; | |
+ }, .x = 0, .y = 0, .state = CURSOR_DEFAULT}; | |
term.top = 0, term.bot = term.row - 1; | |
term.mode = MODE_WRAP; | |
t@@ -414,8 +415,11 @@ csiparse(void) { | |
void | |
tmoveto(int x, int y) { | |
- term.c.x = x < 0 ? 0 : x >= term.col ? term.col-1 : x; | |
- term.c.y = y < 0 ? 0 : y >= term.row ? term.row-1 : y; | |
+ LIMIT(x, 0, term.col-1); | |
+ LIMIT(y, 0, term.row-1); | |
+ term.c.state &= ~CURSOR_WRAPNEXT; | |
+ term.c.x = x; | |
+ term.c.y = y; | |
} | |
void | |
t@@ -711,7 +715,7 @@ csihandle(void) { | |
case 12: /* att610 -- Stop blinking cursor (IGNORED) */ | |
break; | |
case 25: | |
- term.c.hide = CURSOR_HIDE; | |
+ term.c.state |= CURSOR_HIDE; | |
break; | |
case 1048: /* XXX: no alt. screen to erase/save */ | |
case 1049: | |
t@@ -760,7 +764,7 @@ csihandle(void) { | |
case 12: /* att610 -- Start blinking cursor (IGNORED) … | |
break; | |
case 25: | |
- term.c.hide = CURSOR_DRAW; | |
+ term.c.state &= ~CURSOR_HIDE; | |
break; | |
case 1048: | |
case 1049: /* XXX: no alt. screen to erase/save */ | |
t@@ -788,6 +792,7 @@ csihandle(void) { | |
DEFAULT(escseq.arg[0], 1); | |
DEFAULT(escseq.arg[1], term.row); | |
tsetscroll(escseq.arg[0]-1, escseq.arg[1]-1); | |
+ tmoveto(0, 0); | |
} | |
break; | |
case 's': /* DECSC -- Save cursor position (ANSI.SYS) */ | |
t@@ -932,11 +937,13 @@ tputc(char c) { | |
term.esc = ESC_START; | |
break; | |
default: | |
+ if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT) | |
+ tnewline(); | |
tsetchar(c); | |
- if(term.c.x+1 < term.col) { | |
+ if(term.c.x+1 < term.col) | |
tmoveto(term.c.x+1, term.c.y); | |
- } else if(IS_SET(MODE_WRAP)) | |
- tnewline(); | |
+ else | |
+ term.c.state |= CURSOR_WRAPNEXT; | |
break; | |
} | |
} | |
t@@ -974,13 +981,12 @@ tresize(int col, int row) { | |
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); | |
- LIMIT(term.top, 0, row-1); | |
- LIMIT(term.bot, 0, row-1); | |
- | |
- term.bot = row-1; | |
+ /* update terminal size */ | |
term.col = col, term.row = row; | |
+ /* make use of the LIMIT in tmoveto */ | |
+ tmoveto(term.c.x, term.c.y); | |
+ /* reset scrolling region */ | |
+ tsetscroll(0, row-1); | |
} | |
void | |
t@@ -1112,7 +1118,7 @@ xdraws(char *s, Glyph base, int x, int y, int len) { | |
} | |
void | |
-xcursor(int mode) { | |
+xcursor(void) { | |
static int oldx = 0; | |
static int oldy = 0; | |
Glyph g = {' ', ATTR_NULL, DefaultBG, DefaultCS, 0}; | |
t@@ -1130,7 +1136,7 @@ xcursor(int mode) { | |
xclear(oldx, oldy, oldx, oldy); | |
/* draw the new one */ | |
- if(mode == CURSOR_DRAW) { | |
+ if(!(term.c.state & CURSOR_HIDE)) { | |
xdraws(&g.c, g, term.c.x, term.c.y, 1); | |
oldx = term.c.x, oldy = term.c.y; | |
} | |
t@@ -1157,7 +1163,7 @@ draw(int dummy) { | |
if(term.line[y][x].state & GLYPH_SET) | |
xdrawc(x, y, term.line[y][x]); | |
- xcursor(term.c.hide); | |
+ xcursor(); | |
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDE… | |
XFlush(xw.dis); | |
} | |
t@@ -1193,7 +1199,7 @@ draw(int redraw_all) { | |
if(i > 0) | |
xdraws(buf, base, ox, y, i); | |
} | |
- xcursor(term.c.hide); | |
+ xcursor(); | |
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDE… | |
XFlush(xw.dis); | |
} |