mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:47: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:
parent
be519022c3
commit
e0b6cfec1a
2 changed files with 40 additions and 50 deletions
|
@ -39,62 +39,52 @@ 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];
|
switch (mode) {
|
||||||
}
|
case 3: {
|
||||||
if (!question_param) {
|
// 80/132-column mode (DECCOLM)
|
||||||
switch (mode) {
|
unsigned new_columns = should_set ? 80 : 132;
|
||||||
// FIXME: implement *something* for this
|
dbgln_if(TERMINAL_DEBUG, "Setting {}-column mode", new_columns);
|
||||||
default:
|
set_size(new_columns, rows());
|
||||||
dbgln("Terminal::alter_mode: Unimplemented mode {} (set={})", mode, should_set);
|
clear();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case 25:
|
||||||
|
// Hide cursor command, but doesn't need to be run (for now, because
|
||||||
|
// we don't do inverse control codes anyways)
|
||||||
|
if (should_set)
|
||||||
|
dbgln("Terminal: Hide Cursor escapecode received. Not needed: ignored.");
|
||||||
|
else
|
||||||
|
dbgln("Terminal: Show Cursor escapecode received. Not needed: ignored.");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dbgln("Terminal::alter_mode: Unimplemented private mode {}", mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (mode) {
|
for (auto mode : params) {
|
||||||
case 3: {
|
switch (mode) {
|
||||||
// 80/132-column mode (DECCOLM)
|
// FIXME: implement *something* for this
|
||||||
unsigned new_columns = should_set ? 80 : 132;
|
default:
|
||||||
dbgln_if(TERMINAL_DEBUG, "Setting {}-column mode", new_columns);
|
dbgln("Terminal::alter_mode: Unimplemented mode {} (set={})", mode, should_set);
|
||||||
set_size(new_columns, rows());
|
break;
|
||||||
clear();
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 25:
|
|
||||||
// Hide cursor command, but doesn't need to be run (for now, because
|
|
||||||
// we don't do inverse control codes anyways)
|
|
||||||
if (should_set)
|
|
||||||
dbgln("Terminal: Hide Cursor escapecode received. Not needed: ignored.");
|
|
||||||
else
|
|
||||||
dbgln("Terminal: Show Cursor escapecode received. Not needed: ignored.");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dbgln("Terminal::alter_mode: Unimplemented private mode {}", mode);
|
|
||||||
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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue