mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
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:
parent
69b2c2693a
commit
58d1af9319
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user