mirror of
https://github.com/tmux/tmux.git
synced 2025-11-04 09:26:05 +00:00
DECRC and DECSC apparently need to preserve origin mode as well, based
on a fix from Marc Reisner.
This commit is contained in:
55
input.c
55
input.c
@@ -81,6 +81,7 @@ struct input_ctx {
|
||||
struct input_cell old_cell;
|
||||
u_int old_cx;
|
||||
u_int old_cy;
|
||||
int old_mode;
|
||||
|
||||
u_char interm_buf[4];
|
||||
size_t interm_len;
|
||||
@@ -755,6 +756,32 @@ input_reset_cell(struct input_ctx *ictx)
|
||||
ictx->old_cy = 0;
|
||||
}
|
||||
|
||||
/* Save screen state. */
|
||||
static void
|
||||
input_save_state(struct input_ctx *ictx)
|
||||
{
|
||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||
struct screen *s = sctx->s;
|
||||
|
||||
memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
|
||||
ictx->old_cx = s->cx;
|
||||
ictx->old_cy = s->cy;
|
||||
ictx->old_mode = s->mode;
|
||||
}
|
||||
|
||||
static void
|
||||
input_restore_state(struct input_ctx *ictx)
|
||||
{
|
||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||
|
||||
memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
|
||||
if (ictx->old_mode & MODE_ORIGIN)
|
||||
screen_write_mode_set(sctx, MODE_ORIGIN);
|
||||
else
|
||||
screen_write_mode_clear(sctx, MODE_ORIGIN);
|
||||
screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy, 0);
|
||||
}
|
||||
|
||||
/* Initialise input parser. */
|
||||
void
|
||||
input_init(struct window_pane *wp)
|
||||
@@ -1222,13 +1249,10 @@ input_esc_dispatch(struct input_ctx *ictx)
|
||||
screen_write_mode_clear(sctx, MODE_KKEYPAD);
|
||||
break;
|
||||
case INPUT_ESC_DECSC:
|
||||
memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
|
||||
ictx->old_cx = s->cx;
|
||||
ictx->old_cy = s->cy;
|
||||
input_save_state(ictx);
|
||||
break;
|
||||
case INPUT_ESC_DECRC:
|
||||
memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
|
||||
screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
|
||||
input_restore_state(ictx);
|
||||
break;
|
||||
case INPUT_ESC_DECALN:
|
||||
screen_write_alignmenttest(sctx);
|
||||
@@ -1315,7 +1339,7 @@ input_csi_dispatch(struct input_ctx *ictx)
|
||||
n = input_get(ictx, 0, 1, 1);
|
||||
m = input_get(ictx, 1, 1, 1);
|
||||
if (n != -1 && m != -1)
|
||||
screen_write_cursormove(sctx, m - 1, n - 1);
|
||||
screen_write_cursormove(sctx, m - 1, n - 1, 1);
|
||||
break;
|
||||
case INPUT_CSI_WINOPS:
|
||||
input_csi_dispatch_winops(ictx);
|
||||
@@ -1447,7 +1471,7 @@ input_csi_dispatch(struct input_ctx *ictx)
|
||||
case INPUT_CSI_HPA:
|
||||
n = input_get(ictx, 0, 1, 1);
|
||||
if (n != -1)
|
||||
screen_write_cursormove(sctx, n - 1, -1);
|
||||
screen_write_cursormove(sctx, n - 1, -1, 1);
|
||||
break;
|
||||
case INPUT_CSI_ICH:
|
||||
n = input_get(ictx, 0, 1, 1);
|
||||
@@ -1472,8 +1496,7 @@ input_csi_dispatch(struct input_ctx *ictx)
|
||||
input_print(ictx);
|
||||
break;
|
||||
case INPUT_CSI_RCP:
|
||||
memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
|
||||
screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
|
||||
input_restore_state(ictx);
|
||||
break;
|
||||
case INPUT_CSI_RM:
|
||||
input_csi_dispatch_rm(ictx);
|
||||
@@ -1482,9 +1505,7 @@ input_csi_dispatch(struct input_ctx *ictx)
|
||||
input_csi_dispatch_rm_private(ictx);
|
||||
break;
|
||||
case INPUT_CSI_SCP:
|
||||
memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
|
||||
ictx->old_cx = s->cx;
|
||||
ictx->old_cy = s->cy;
|
||||
input_save_state(ictx);
|
||||
break;
|
||||
case INPUT_CSI_SGR:
|
||||
input_csi_dispatch_sgr(ictx);
|
||||
@@ -1519,7 +1540,7 @@ input_csi_dispatch(struct input_ctx *ictx)
|
||||
case INPUT_CSI_VPA:
|
||||
n = input_get(ictx, 0, 1, 1);
|
||||
if (n != -1)
|
||||
screen_write_cursormove(sctx, -1, n - 1);
|
||||
screen_write_cursormove(sctx, -1, n - 1, 1);
|
||||
break;
|
||||
case INPUT_CSI_DECSCUSR:
|
||||
n = input_get(ictx, 0, 0, 0);
|
||||
@@ -1572,12 +1593,12 @@ input_csi_dispatch_rm_private(struct input_ctx *ictx)
|
||||
screen_write_mode_clear(sctx, MODE_KCURSOR);
|
||||
break;
|
||||
case 3: /* DECCOLM */
|
||||
screen_write_cursormove(sctx, 0, 0);
|
||||
screen_write_cursormove(sctx, 0, 0, 1);
|
||||
screen_write_clearscreen(sctx, ictx->cell.cell.bg);
|
||||
break;
|
||||
case 6: /* DECOM */
|
||||
screen_write_mode_clear(sctx, MODE_ORIGIN);
|
||||
screen_write_cursormove(sctx, 0, 0);
|
||||
screen_write_cursormove(sctx, 0, 0, 1);
|
||||
break;
|
||||
case 7: /* DECAWM */
|
||||
screen_write_mode_clear(sctx, MODE_WRAP);
|
||||
@@ -1660,12 +1681,12 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
|
||||
screen_write_mode_set(sctx, MODE_KCURSOR);
|
||||
break;
|
||||
case 3: /* DECCOLM */
|
||||
screen_write_cursormove(sctx, 0, 0);
|
||||
screen_write_cursormove(sctx, 0, 0, 1);
|
||||
screen_write_clearscreen(sctx, ictx->cell.cell.bg);
|
||||
break;
|
||||
case 6: /* DECOM */
|
||||
screen_write_mode_set(sctx, MODE_ORIGIN);
|
||||
screen_write_cursormove(sctx, 0, 0);
|
||||
screen_write_cursormove(sctx, 0, 0, 1);
|
||||
break;
|
||||
case 7: /* DECAWM */
|
||||
screen_write_mode_set(sctx, MODE_WRAP);
|
||||
|
||||
Reference in New Issue
Block a user