tty: vt: split DEC CSI+h/l handling into csi_DEC_hl()

The DEC and ECMA handling of CSI+h/l is needlessly complicated. Split
these two, so that DEC is handled when the state is EPdec ('CSI ?' was
seen) and ECMA is handled in the EPecma state (no '?').

Signed-off-by: "Jiri Slaby (SUSE)" <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20240202065608.14019-5-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jiri Slaby (SUSE) 2024-02-02 07:55:50 +01:00 committed by Greg Kroah-Hartman
parent 69b2c2693a
commit 58d1af9319

View File

@ -1874,6 +1874,59 @@ enum {
CSI_DEC_hl_MOUSE_VT200 = 1000, CSI_DEC_hl_MOUSE_VT200 = 1000,
}; };
/* console_lock is held */
static void csi_DEC_hl(struct vc_data *vc, bool on_off)
{
unsigned int i;
for (i = 0; i <= vc->vc_npar; i++)
switch (vc->vc_par[i]) {
case CSI_DEC_hl_CURSOR_KEYS:
if (on_off)
set_kbd(vc, decckm);
else
clr_kbd(vc, decckm);
break;
case CSI_DEC_hl_132_COLUMNS: /* unimplemented */
#if 0
vc_resize(deccolm ? 132 : 80, vc->vc_rows);
/* this alone does not suffice; some user mode
utility has to change the hardware regs */
#endif
break;
case CSI_DEC_hl_REVERSE_VIDEO:
if (vc->vc_decscnm != on_off) {
vc->vc_decscnm = on_off;
invert_screen(vc, 0, vc->vc_screenbuf_size,
false);
update_attr(vc);
}
break;
case CSI_DEC_hl_ORIGIN_MODE:
vc->vc_decom = on_off;
gotoxay(vc, 0, 0);
break;
case CSI_DEC_hl_AUTOWRAP:
vc->vc_decawm = on_off;
break;
case CSI_DEC_hl_AUTOREPEAT:
if (on_off)
set_kbd(vc, decarm);
else
clr_kbd(vc, decarm);
break;
case CSI_DEC_hl_MOUSE_X10:
vc->vc_report_mouse = on_off ? 1 : 0;
break;
case CSI_DEC_hl_SHOW_CURSOR:
vc->vc_deccm = on_off;
break;
case CSI_DEC_hl_MOUSE_VT200:
vc->vc_report_mouse = on_off ? 2 : 0;
break;
}
}
enum { enum {
CSI_hl_DISPLAY_CTRL = 3, /* handle ansi control chars */ CSI_hl_DISPLAY_CTRL = 3, /* handle ansi control chars */
CSI_hl_INSERT = 4, /* IRM: insert/replace */ CSI_hl_INSERT = 4, /* IRM: insert/replace */
@ -1883,71 +1936,22 @@ enum {
/* console_lock is held */ /* console_lock is held */
static void csi_hl(struct vc_data *vc, bool on_off) static void csi_hl(struct vc_data *vc, bool on_off)
{ {
int i; unsigned int i;
for (i = 0; i <= vc->vc_npar; i++) for (i = 0; i <= vc->vc_npar; i++)
if (vc->vc_priv == EPdec) { switch (vc->vc_par[i]) { /* ANSI modes set/reset */
switch(vc->vc_par[i]) { /* DEC private modes set/reset */ case CSI_hl_DISPLAY_CTRL:
case CSI_DEC_hl_CURSOR_KEYS: vc->vc_disp_ctrl = on_off;
if (on_off) break;
set_kbd(vc, decckm); case CSI_hl_INSERT:
else vc->vc_decim = on_off;
clr_kbd(vc, decckm); break;
break; case CSI_hl_AUTO_NL:
case CSI_DEC_hl_132_COLUMNS: /* unimplemented */ if (on_off)
#if 0 set_kbd(vc, lnm);
vc_resize(deccolm ? 132 : 80, vc->vc_rows); else
/* this alone does not suffice; some user mode clr_kbd(vc, lnm);
utility has to change the hardware regs */ break;
#endif
break;
case CSI_DEC_hl_REVERSE_VIDEO:
if (vc->vc_decscnm != on_off) {
vc->vc_decscnm = on_off;
invert_screen(vc, 0,
vc->vc_screenbuf_size,
false);
update_attr(vc);
}
break;
case CSI_DEC_hl_ORIGIN_MODE:
vc->vc_decom = on_off;
gotoxay(vc, 0, 0);
break;
case CSI_DEC_hl_AUTOWRAP:
vc->vc_decawm = on_off;
break;
case CSI_DEC_hl_AUTOREPEAT:
if (on_off)
set_kbd(vc, decarm);
else
clr_kbd(vc, decarm);
break;
case CSI_DEC_hl_MOUSE_X10:
vc->vc_report_mouse = on_off ? 1 : 0;
break;
case CSI_DEC_hl_SHOW_CURSOR:
vc->vc_deccm = on_off;
break;
case CSI_DEC_hl_MOUSE_VT200:
vc->vc_report_mouse = on_off ? 2 : 0;
break;
}
} else {
switch(vc->vc_par[i]) { /* ANSI modes set/reset */
case CSI_hl_DISPLAY_CTRL:
vc->vc_disp_ctrl = on_off;
break;
case CSI_hl_INSERT:
vc->vc_decim = on_off;
break;
case CSI_hl_AUTO_NL:
if (on_off)
set_kbd(vc, lnm);
else
clr_kbd(vc, lnm);
break;
}
} }
} }
@ -2379,12 +2383,12 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
vc->vc_state = ESnormal; vc->vc_state = ESnormal;
switch(c) { switch(c) {
case 'h': case 'h':
if (vc->vc_priv <= EPdec) if (vc->vc_priv == EPdec)
csi_hl(vc, true); csi_DEC_hl(vc, true);
return; return;
case 'l': case 'l':
if (vc->vc_priv <= EPdec) if (vc->vc_priv == EPdec)
csi_hl(vc, false); csi_DEC_hl(vc, false);
return; return;
case 'c': case 'c':
if (vc->vc_priv == EPdec) { if (vc->vc_priv == EPdec) {
@ -2494,6 +2498,12 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
else if (vc->vc_par[0] == 3) else if (vc->vc_par[0] == 3)
bitmap_zero(vc->vc_tab_stop, VC_TABSTOPS_COUNT); bitmap_zero(vc->vc_tab_stop, VC_TABSTOPS_COUNT);
return; return;
case 'h':
csi_hl(vc, true);
return;
case 'l':
csi_hl(vc, false);
return;
case 'm': case 'm':
csi_m(vc); csi_m(vc);
return; return;