Commit f86cae60 authored by Egmont Koblinger's avatar Egmont Koblinger Committed by Christian Persch

emulation: Implement SCOSC/SCORC

#48
parent b4107da6
......@@ -375,7 +375,8 @@ MODE_FIXED(DECKBUM, 68, ALWAYS_RESET)
*
* References: VT525
*
* Probably not worth implementing.
* Needs to be implemented if DECSLRM is implemented, to resolve a
* conflict between DECSLRM and SCOSC.
*/
MODE_FIXED(DECLRMM, 69, ALWAYS_RESET) /* aka DECVSSM */
......
......@@ -36,6 +36,12 @@ namespace modes {
return get(e##name); \
}
#define MODE_FIXED_ACCESSOR(name,value) \
inline constexpr bool name() const noexcept \
{ \
return value; \
}
template <typename T>
static inline void vte_modes_set_bool(T* modes,
unsigned int shift,
......@@ -159,7 +165,7 @@ public:
}
#define MODE(name,param) MODE_ACCESSOR(name)
#define MODE_FIXED(name,param,value)
#define MODE_FIXED(name,param,value) MODE_FIXED_ACCESSOR(name, e##value == eALWAYS_SET)
#include "modes-ecma.hh"
#undef MODE
#undef MODE_FIXED
......@@ -213,7 +219,7 @@ public:
}
#define MODE(name,param) MODE_ACCESSOR(name)
#define MODE_FIXED(name,param,value)
#define MODE_FIXED(name,param,value) MODE_FIXED_ACCESSOR(name, e##value == eALWAYS_SET)
#include "modes-private.hh"
#undef MODE
#undef MODE_FIXED
......@@ -244,6 +250,7 @@ private:
}; // class Private
#undef MODE_ACCESSOR
#undef MODE_FIXED_ACCESSOR
} // namespace modes
} // namespace terminal
......
......@@ -62,7 +62,7 @@ _VTE_CMD(DECSCUSR) /* set cursor style */
_VTE_CMD(DECSED) /* selective erase in display */
_VTE_CMD(DECSEL) /* selective erase in line */
_VTE_CMD(DECSLPP) /* set lines per page */
_VTE_CMD(DECSLRM) /* set left and right margins */
_VTE_CMD(DECSLRM_OR_SCOSC) /* set left and right margins or SCO save cursor */
_VTE_CMD(DECSR) /* secure reset */
_VTE_CMD(DECST8C) /* set tab at every 8 columns */
_VTE_CMD(DECSTBM) /* set top and bottom margins */
......@@ -101,6 +101,8 @@ _VTE_CMD(RI) /* reverse index */
_VTE_CMD(RIS) /* reset to initial state */
_VTE_CMD(RM_DEC) /* reset mode dec */
_VTE_CMD(RM_ECMA) /* reset mode ecma */
_VTE_CMD(SCORC) /* SCO restore cursor */
_VTE_CMD(SCOSC) /* SCO save cursor */
_VTE_CMD(SD) /* scroll down */
_VTE_CMD(SD_OR_XTERM_IHMT) /* scroll down or xterm initiate highlight mouse tracking */
_VTE_CMD(SGR) /* select graphics rendition */
......@@ -199,6 +201,7 @@ _VTE_NOP(DECSIXEL) /* SIXEL graphics */
_VTE_NOP(DECSKCV) /* set key click volume */
_VTE_NOP(DECSLCK) /* set lock key style */
_VTE_NOP(DECSLE) /* select locator events */
_VTE_NOP(DECSLRM) /* set left and right margins */
_VTE_NOP(DECSMBV) /* set margin bell volume */
_VTE_NOP(DECSMKR) /* select modifier key reporting */
_VTE_NOP(DECSNLS) /* set lines per screen */
......@@ -271,7 +274,6 @@ _VTE_NOP(QUAD) /* quad */
_VTE_NOP(RLOGIN_MML) /* RLogin music macro language */
_VTE_NOP(SACS) /* set additional character separation */
_VTE_NOP(SAPV) /* select alternative presentation variants */
_VTE_NOP(SCORC) /* SCO restore cursor */
_VTE_NOP(SCO) /* select character orientation */
_VTE_NOP(SCP) /* select character path */
_VTE_NOP(SCS) /* set character spacing */
......
......@@ -150,7 +150,7 @@ _VTE_NOQ(DECSCS, CSI, 'r', NONE, 1, MULT ) /* select-co
_VTE_NOQ(DECSMKR, CSI, 'r', NONE, 1, PLUS ) /* select-modifier-key-reporting */
_VTE_NOQ(DECSEST, CSI, 'r', NONE, 1, MINUS ) /* energy saver time */
_VTE_SEQ(DECPCTERM_OR_XTERM_RPM, CSI, 'r', WHAT, 0, NONE ) /* pcterm or xterm restore DEC private mode */
_VTE_SEQ(DECSLRM, CSI, 's', NONE, 0, NONE ) /* set-left-and-right-margins */
_VTE_SEQ(DECSLRM_OR_SCOSC, CSI, 's', NONE, 0, NONE ) /* set left and right margins or SCO save cursor */
_VTE_NOQ(DECSPRTT, CSI, 's', NONE, 1, CASH ) /* select-printer-type */
_VTE_NOQ(DECSFC, CSI, 's', NONE, 1, MULT ) /* select-flow-control */
_VTE_SEQ(XTERM_SPM, CSI, 's', WHAT, 0, NONE ) /* xterm save private mode */
......@@ -159,7 +159,7 @@ _VTE_NOQ(DECSWBV, CSI, 't', NONE, 1, SPACE ) /* set-warni
_VTE_NOQ(DECSRFR, CSI, 't', NONE, 1, DQUOTE ) /* select-refresh-rate */
_VTE_NOQ(DECRARA, CSI, 't', NONE, 1, CASH ) /* reverse-attributes-in-rectangular-area */
_VTE_NOQ(XTERM_STM, CSI, 't', GT, 0, NONE ) /* xterm-set-title-mode */
_VTE_NOQ(SCORC, CSI, 'u', NONE, 0, NONE ) /* SCO restore-cursor */
_VTE_SEQ(SCORC, CSI, 'u', NONE, 0, NONE ) /* SCO restore cursor */
_VTE_NOQ(DECSMBV, CSI, 'u', NONE, 1, SPACE ) /* set-margin-bell-volume */
_VTE_NOQ(DECSTRL, CSI, 'u', NONE, 1, DQUOTE ) /* set-transmit-rate-limit */
_VTE_SEQ(DECRQTSR, CSI, 'u', NONE, 1, CASH ) /* request-terminal-state-report */
......
......@@ -4343,19 +4343,36 @@ Terminal::DECSLRM(vte::parser::Sequence const& seq)
*
* References: VT525
*
* Note: There is a conflict between SCOSC and DECSLRM that both
* have final character 's' (7/3). SCOSC has 0 parameters, and
* DECSLRM has 2 parameters which both have default values, and
* my reading of ECMA-48 § 5.4.2h says that this allows for an
* empty parameter string to represent them.
* FIXMEchpe: Consider implementing this.
*/
}
void
Terminal::DECSLRM_OR_SCOSC(vte::parser::Sequence const& seq)
{
/*
* set left and right margins or SCO restore cursor - DECSLRM or SCOSC
* There is a conflict between SCOSC and DECSLRM that both are
* CSI s (CSI 7/3). SCOSC has 0 parameters, and DECSLRM has 2
* parameters which both have default values, and my reading
* of ECMA-48 § 5.4.2h says that this allows for an empty
* parameter string to represent them.
*
* We could either fudge it by dispatching zero params to SCOSC
* and anything else to DECSLRM, or, since we already implement
* DECSC/DECRC, we can just drop support for the extra SCOSC/SCORC.
* Do the latter.
* While the DEC manuals say that SCOSC/SCORC only operates in
* "SCO Console Mode" (which is entered by DECTME 13), and not in
* "VT mode" (i.e. native mode), we instead distinguish the cases
* by private mode DECLRMM: If DECLRMM is set, dispatch DECSLRM;
* if it's reset, dispatch SCOSC.
*
* FIXMEchpe: Consider implementing this.
* See issue #48.
*/
#ifdef PARSER_INCLUDE_NOP
if (m_modes_private.DECLRMM())
DECSLRM(seq);
else
#endif
SCOSC(seq);
}
void
......@@ -6723,12 +6740,32 @@ void
Terminal::SCORC(vte::parser::Sequence const& seq)
{
/*
* SCORC - SCO restore-cursor
* SCORC - SCO restore cursor
* Works like DECRC, except in that it does not restore the page.
* While this is an obsolete sequence from an obsolete terminal,
* and not used in terminfo, there still are some programmes
* that use it and break when it's not implemented; see issue#48.
*
* References: VT525
*/
restore_cursor();
}
void
Terminal::SCOSC(vte::parser::Sequence const& seq)
{
/*
* SCORC - SCO save cursor
* Works like DECSC, except in that it does not save the page.
* While this is an obsolete sequence from an obsolete terminal,
* and not used in terminfo, there still are some programmes
* that use it and break when it's not implemented; see issue#48.
*
* Not worth implementing, given that we already support DECSC/DECRC.
* References: VT525
*/
save_cursor();
}
void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment