Hi,
I'm no terminal expert, and I'm reluctant to add more code to the
madtty.c source, but I hope these changes will be considered. They
certainly work for me!
The existing ESC ] s (CUPSV) and ESC ] u (CUPRS) are for save/restore
cursor position. I use at least one program that uses ESC 7 (DECSC) and
ESC 8 (DECRC) to save/restore state, both cursor position and character
attributes, so I've implemented them. To do this, I created reusable
functions for save_curs(), restore_curs(), save_attrs(), and
restore_attrs() because they are used more than once now.
I also have some programs that were displaying weird reverse video
backgrounds, only in dvtm. To fix this I added code at the beginning and
end of the interpret_csi_ED() 'erase display' function so that the
display is always erased with A_NORMAL character attributes.
Thanks! --Ross
--- madtty000.c 2010-10-08 12:06:05.000000000 -0400
+++ madtty.c 2010-12-06 18:09:57.000000000 -0500
@@ -104,8 +105,8 @@
/* geometry */
int rows, cols, maxcols;
- unsigned curattrs;
- short curfg, curbg;
+ unsigned curattrs, scurattrs;
+ short curfg, curbg, scurfg, scurbg;
/* scrollback buffer */
struct t_row_t *scroll_buf;
@@ -229,6 +230,33 @@
}
}
+ static void save_curs(madtty_t *t)
+ {
+ t->curs_srow = t->curs_row - t->lines;
+ t->curs_scol = t->curs_col;
+ }
+
+ static void restore_curs(madtty_t *t)
+ {
+ t->curs_row = t->lines + t->curs_srow;
+ t->curs_col = t->curs_scol;
+ clamp_cursor_to_bounds(t);
+ }
+
+ static void save_attrs(madtty_t *t)
+ {
+ t->scurattrs = t->curattrs;
+ t->scurfg = t->curfg;
+ t->scurbg = t->curbg;
+ }
+
+ static void restore_attrs(madtty_t *t)
+ {
+ t->curattrs = t->scurattrs;
+ t->curfg = t->scurfg;
+ t->curbg = t->scurbg;
+ }
+
static void clamp_cursor_to_bounds(madtty_t *t)
{
if (t->curs_row < t->lines) {
@@ -393,6 +421,10 @@
{
t_row_t *row, *start, *end;
+ save_attrs(t);
+ t->curattrs = A_NORMAL;
+ t->curfg = t->curbg = -1;
+
/* decide range */
if (pcount && param[0] == 2) {
start = t->lines;
@@ -412,6 +444,8 @@
for (row = start; row < end; row++) {
t_row_set(row, 0, t->cols, t);
}
+
+ restore_attrs(t);
}
/* interprets a 'move cursor' (CUP) escape sequence */
@@ -687,14 +721,9 @@
case 'r': /* set scrolling region */
interpret_csi_DECSTBM(t, csiparam, param_count); break;
case 's': /* save cursor location */
- t->curs_srow = t->curs_row - t->lines;
- t->curs_scol = t->curs_col;
- break;
+ save_curs(t); break;
case 'u': /* restore cursor location */
- t->curs_row = t->lines + t->curs_srow;
- t->curs_col = t->curs_scol;
- clamp_cursor_to_bounds(t);
- break;
+ restore_curs(t); break;
default:
break;
}
@@ -742,6 +771,18 @@
return;
}
break;
+
+ case '7': /* save cursor and attrs */
+ save_attrs(t);
+ save_curs(t);
+ cancel_escape_sequence(t);
+ return;
+
+ case '8': /* restore cursor and attrs */
+ restore_attrs(t);
+ restore_curs(t);
+ cancel_escape_sequence(t);
+ return;
}
if (t->elen + 1 >= (int)sizeof(t->ebuf)) {
@@ -1224,7 +1265,7 @@
maxfd = sysconf(_SC_OPEN_MAX);
for (fd = 3; fd < maxfd; fd++)
- if (close(fd) == EBADF)
+ if (close(fd) == -1 && errno == EBADF)
break;
while (envp && envp[0]) {