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) ...@@ -375,7 +375,8 @@ MODE_FIXED(DECKBUM, 68, ALWAYS_RESET)
* *
* References: VT525 * 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 */ MODE_FIXED(DECLRMM, 69, ALWAYS_RESET) /* aka DECVSSM */
......
...@@ -36,6 +36,12 @@ namespace modes { ...@@ -36,6 +36,12 @@ namespace modes {
return get(e##name); \ return get(e##name); \
} }
#define MODE_FIXED_ACCESSOR(name,value) \
inline constexpr bool name() const noexcept \
{ \
return value; \
}
template <typename T> template <typename T>
static inline void vte_modes_set_bool(T* modes, static inline void vte_modes_set_bool(T* modes,
unsigned int shift, unsigned int shift,
...@@ -159,7 +165,7 @@ public: ...@@ -159,7 +165,7 @@ public:
} }
#define MODE(name,param) MODE_ACCESSOR(name) #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" #include "modes-ecma.hh"
#undef MODE #undef MODE
#undef MODE_FIXED #undef MODE_FIXED
...@@ -213,7 +219,7 @@ public: ...@@ -213,7 +219,7 @@ public:
} }
#define MODE(name,param) MODE_ACCESSOR(name) #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" #include "modes-private.hh"
#undef MODE #undef MODE
#undef MODE_FIXED #undef MODE_FIXED
...@@ -244,6 +250,7 @@ private: ...@@ -244,6 +250,7 @@ private:
}; // class Private }; // class Private
#undef MODE_ACCESSOR #undef MODE_ACCESSOR
#undef MODE_FIXED_ACCESSOR
} // namespace modes } // namespace modes
} // namespace terminal } // namespace terminal
......
...@@ -62,7 +62,7 @@ _VTE_CMD(DECSCUSR) /* set cursor style */ ...@@ -62,7 +62,7 @@ _VTE_CMD(DECSCUSR) /* set cursor style */
_VTE_CMD(DECSED) /* selective erase in display */ _VTE_CMD(DECSED) /* selective erase in display */
_VTE_CMD(DECSEL) /* selective erase in line */ _VTE_CMD(DECSEL) /* selective erase in line */
_VTE_CMD(DECSLPP) /* set lines per page */ _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(DECSR) /* secure reset */
_VTE_CMD(DECST8C) /* set tab at every 8 columns */ _VTE_CMD(DECST8C) /* set tab at every 8 columns */
_VTE_CMD(DECSTBM) /* set top and bottom margins */ _VTE_CMD(DECSTBM) /* set top and bottom margins */
...@@ -101,6 +101,8 @@ _VTE_CMD(RI) /* reverse index */ ...@@ -101,6 +101,8 @@ _VTE_CMD(RI) /* reverse index */
_VTE_CMD(RIS) /* reset to initial state */ _VTE_CMD(RIS) /* reset to initial state */
_VTE_CMD(RM_DEC) /* reset mode dec */ _VTE_CMD(RM_DEC) /* reset mode dec */
_VTE_CMD(RM_ECMA) /* reset mode ecma */ _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) /* scroll down */
_VTE_CMD(SD_OR_XTERM_IHMT) /* scroll down or xterm initiate highlight mouse tracking */ _VTE_CMD(SD_OR_XTERM_IHMT) /* scroll down or xterm initiate highlight mouse tracking */
_VTE_CMD(SGR) /* select graphics rendition */ _VTE_CMD(SGR) /* select graphics rendition */
...@@ -199,6 +201,7 @@ _VTE_NOP(DECSIXEL) /* SIXEL graphics */ ...@@ -199,6 +201,7 @@ _VTE_NOP(DECSIXEL) /* SIXEL graphics */
_VTE_NOP(DECSKCV) /* set key click volume */ _VTE_NOP(DECSKCV) /* set key click volume */
_VTE_NOP(DECSLCK) /* set lock key style */ _VTE_NOP(DECSLCK) /* set lock key style */
_VTE_NOP(DECSLE) /* select locator events */ _VTE_NOP(DECSLE) /* select locator events */
_VTE_NOP(DECSLRM) /* set left and right margins */
_VTE_NOP(DECSMBV) /* set margin bell volume */ _VTE_NOP(DECSMBV) /* set margin bell volume */
_VTE_NOP(DECSMKR) /* select modifier key reporting */ _VTE_NOP(DECSMKR) /* select modifier key reporting */
_VTE_NOP(DECSNLS) /* set lines per screen */ _VTE_NOP(DECSNLS) /* set lines per screen */
...@@ -271,7 +274,6 @@ _VTE_NOP(QUAD) /* quad */ ...@@ -271,7 +274,6 @@ _VTE_NOP(QUAD) /* quad */
_VTE_NOP(RLOGIN_MML) /* RLogin music macro language */ _VTE_NOP(RLOGIN_MML) /* RLogin music macro language */
_VTE_NOP(SACS) /* set additional character separation */ _VTE_NOP(SACS) /* set additional character separation */
_VTE_NOP(SAPV) /* select alternative presentation variants */ _VTE_NOP(SAPV) /* select alternative presentation variants */
_VTE_NOP(SCORC) /* SCO restore cursor */
_VTE_NOP(SCO) /* select character orientation */ _VTE_NOP(SCO) /* select character orientation */
_VTE_NOP(SCP) /* select character path */ _VTE_NOP(SCP) /* select character path */
_VTE_NOP(SCS) /* set character spacing */ _VTE_NOP(SCS) /* set character spacing */
......
...@@ -150,7 +150,7 @@ _VTE_NOQ(DECSCS, CSI, 'r', NONE, 1, MULT ) /* select-co ...@@ -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(DECSMKR, CSI, 'r', NONE, 1, PLUS ) /* select-modifier-key-reporting */
_VTE_NOQ(DECSEST, CSI, 'r', NONE, 1, MINUS ) /* energy saver time */ _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(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(DECSPRTT, CSI, 's', NONE, 1, CASH ) /* select-printer-type */
_VTE_NOQ(DECSFC, CSI, 's', NONE, 1, MULT ) /* select-flow-control */ _VTE_NOQ(DECSFC, CSI, 's', NONE, 1, MULT ) /* select-flow-control */
_VTE_SEQ(XTERM_SPM, CSI, 's', WHAT, 0, NONE ) /* xterm save private mode */ _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 ...@@ -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(DECSRFR, CSI, 't', NONE, 1, DQUOTE ) /* select-refresh-rate */
_VTE_NOQ(DECRARA, CSI, 't', NONE, 1, CASH ) /* reverse-attributes-in-rectangular-area */ _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(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(DECSMBV, CSI, 'u', NONE, 1, SPACE ) /* set-margin-bell-volume */
_VTE_NOQ(DECSTRL, CSI, 'u', NONE, 1, DQUOTE ) /* set-transmit-rate-limit */ _VTE_NOQ(DECSTRL, CSI, 'u', NONE, 1, DQUOTE ) /* set-transmit-rate-limit */
_VTE_SEQ(DECRQTSR, CSI, 'u', NONE, 1, CASH ) /* request-terminal-state-report */ _VTE_SEQ(DECRQTSR, CSI, 'u', NONE, 1, CASH ) /* request-terminal-state-report */
......
...@@ -4343,19 +4343,36 @@ Terminal::DECSLRM(vte::parser::Sequence const& seq) ...@@ -4343,19 +4343,36 @@ Terminal::DECSLRM(vte::parser::Sequence const& seq)
* *
* References: VT525 * References: VT525
* *
* Note: There is a conflict between SCOSC and DECSLRM that both * FIXMEchpe: Consider implementing this.
* 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. 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 * While the DEC manuals say that SCOSC/SCORC only operates in
* and anything else to DECSLRM, or, since we already implement * "SCO Console Mode" (which is entered by DECTME 13), and not in
* DECSC/DECRC, we can just drop support for the extra SCOSC/SCORC. * "VT mode" (i.e. native mode), we instead distinguish the cases
* Do the latter. * 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 void
...@@ -6723,12 +6740,32 @@ void ...@@ -6723,12 +6740,32 @@ void
Terminal::SCORC(vte::parser::Sequence const& seq) 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 * 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 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