1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:57:45 +00:00

LibVT: fix SM/RM not respecting private markers

Since we now store intermediate characters separately, the intermediates
should be checked for the presence of the '?' DEC private marker, not
the first parameter.
This commit is contained in:
Daniel Bertalan 2021-05-15 14:58:24 +02:00 committed by Andreas Kling
parent be519022c3
commit e0b6cfec1a
2 changed files with 40 additions and 50 deletions

View file

@ -39,20 +39,10 @@ void Terminal::clear_including_history()
m_client.terminal_history_changed(); m_client.terminal_history_changed();
} }
void Terminal::alter_mode(bool should_set, bool question_param, Parameters params) void Terminal::alter_mode(bool should_set, Parameters params, Intermediates intermediates)
{ {
int mode = 2; if (intermediates.size() > 0 && intermediates[0] == '?') {
if (params.size() > 0) { for (auto mode : params) {
mode = params[0];
}
if (!question_param) {
switch (mode) {
// FIXME: implement *something* for this
default:
dbgln("Terminal::alter_mode: Unimplemented mode {} (set={})", mode, should_set);
break;
}
} else {
switch (mode) { switch (mode) {
case 3: { case 3: {
// 80/132-column mode (DECCOLM) // 80/132-column mode (DECCOLM)
@ -75,26 +65,26 @@ void Terminal::alter_mode(bool should_set, bool question_param, Parameters param
break; break;
} }
} }
} else {
for (auto mode : params) {
switch (mode) {
// FIXME: implement *something* for this
default:
dbgln("Terminal::alter_mode: Unimplemented mode {} (set={})", mode, should_set);
break;
}
}
}
} }
void Terminal::RM(Parameters params) void Terminal::RM(Parameters params, Intermediates intermediates)
{ {
bool question_param = false; alter_mode(true, params, intermediates);
if (params.size() > 0 && params[0] == '?') {
question_param = true;
params = params.slice(1);
}
alter_mode(true, question_param, params);
} }
void Terminal::SM(Parameters params) void Terminal::SM(Parameters params, Intermediates intermediates)
{ {
bool question_param = false; alter_mode(false, params, intermediates);
if (params.size() > 0 && params[0] == '?') {
question_param = true;
params = params.slice(1);
}
alter_mode(false, question_param, params);
} }
void Terminal::SGR(Parameters params) void Terminal::SGR(Parameters params)
@ -804,10 +794,10 @@ void Terminal::execute_csi_sequence(Parameters parameters, Intermediates interme
DECSTBM(parameters); DECSTBM(parameters);
break; break;
case 'l': case 'l':
RM(parameters); RM(parameters, intermediates);
break; break;
case 'h': case 'h':
SM(parameters); SM(parameters, intermediates);
break; break;
case 'c': case 'c':
DA(parameters); DA(parameters);

View file

@ -133,7 +133,7 @@ private:
void emit_string(const StringView&); void emit_string(const StringView&);
void alter_mode(bool should_set, bool question_param, Parameters); void alter_mode(bool should_set, Parameters, Intermediates);
// CUU Cursor Up // CUU Cursor Up
void CUU(Parameters); void CUU(Parameters);
@ -169,10 +169,10 @@ private:
void DECSTBM(Parameters); void DECSTBM(Parameters);
// RM Reset Mode // RM Reset Mode
void RM(Parameters); void RM(Parameters, Intermediates);
// SM Set Mode // SM Set Mode
void SM(Parameters); void SM(Parameters, Intermediates);
// DA - Device Attributes // DA - Device Attributes
void DA(Parameters); void DA(Parameters);