terminal: only support a single intermediate/private character

This commit is contained in:
Daniel Eklöf 2019-07-10 15:03:16 +02:00
parent 43e57e3546
commit 96bd55f7c4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 24 additions and 21 deletions

24
csi.c
View file

@ -255,8 +255,8 @@ csi_as_string(struct terminal *term, uint8_t final)
static char msg[1024]; static char msg[1024];
int c = snprintf(msg, sizeof(msg), "CSI: "); int c = snprintf(msg, sizeof(msg), "CSI: ");
for (size_t i = 0; i < term->vt.intermediates.idx; i++) if (term->vt.private != 0)
c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.intermediates.data[i]); c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private);
for (size_t i = 0; i < term->vt.params.idx; i++){ for (size_t i = 0; i < term->vt.params.idx; i++){
c += snprintf(&msg[c], sizeof(msg) - c, "%d", c += snprintf(&msg[c], sizeof(msg) - c, "%d",
@ -281,7 +281,8 @@ csi_dispatch(struct terminal *term, uint8_t final)
{ {
LOG_DBG("%s", csi_as_string(term, final)); LOG_DBG("%s", csi_as_string(term, final));
if (term->vt.intermediates.idx == 0) { switch (term->vt.private) {
case 0: {
switch (final) { switch (final) {
case 'c': case 'c':
write(term->ptmx, "\033[?6c", 5); write(term->ptmx, "\033[?6c", 5);
@ -577,12 +578,13 @@ csi_dispatch(struct terminal *term, uint8_t final)
default: default:
LOG_ERR("unimplemented: %s", csi_as_string(term, final)); LOG_ERR("unimplemented: %s", csi_as_string(term, final));
abort(); abort();
break;
} }
break; /* private == 0 */
} }
else if (term->vt.intermediates.idx == 1 && case '?': {
term->vt.intermediates.data[0] == '?') {
switch (final) { switch (final) {
case 'h': { case 'h': {
for (size_t i = 0; i < term->vt.params.idx; i++) { for (size_t i = 0; i < term->vt.params.idx; i++) {
@ -761,10 +763,11 @@ csi_dispatch(struct terminal *term, uint8_t final)
LOG_ERR("unimplemented: %s", csi_as_string(term, final)); LOG_ERR("unimplemented: %s", csi_as_string(term, final));
abort(); abort();
} }
break; /* private == '?' */
} }
else if (term->vt.intermediates.idx == 1 && case '>': {
term->vt.intermediates.data[0] == '>') {
switch (final) { switch (final) {
case 'c': { case 'c': {
int param = param_get(term, 0, 0); int param = param_get(term, 0, 0);
@ -784,10 +787,13 @@ csi_dispatch(struct terminal *term, uint8_t final)
LOG_ERR("unimplemented: %s", csi_as_string(term, final)); LOG_ERR("unimplemented: %s", csi_as_string(term, final));
abort(); abort();
} }
break; /* private == '>' */
} }
else { default:
LOG_ERR("unimplemented: %s", csi_as_string(term, final)); LOG_ERR("unimplemented: %s", csi_as_string(term, final));
abort(); abort();
break;
} }
} }

View file

@ -125,10 +125,7 @@ struct vt {
struct vt_param v[16]; struct vt_param v[16];
size_t idx; size_t idx;
} params; } params;
struct { char private;
uint8_t data[2];
size_t idx;
} intermediates;
struct { struct {
uint8_t data[1024]; uint8_t data[1024];
size_t idx; size_t idx;

16
vt.c
View file

@ -573,8 +573,8 @@ esc_as_string(struct terminal *term, uint8_t final)
static char msg[1024]; static char msg[1024];
int c = snprintf(msg, sizeof(msg), "\E"); int c = snprintf(msg, sizeof(msg), "\E");
for (size_t i = 0; i < term->vt.intermediates.idx; i++) if (term->vt.private != 0)
c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.intermediates.data[i]); c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private);
c += snprintf(&msg[c], sizeof(msg) - c, "%c", final); c += snprintf(&msg[c], sizeof(msg) - c, "%c", final);
return msg; return msg;
@ -815,7 +815,7 @@ action(struct terminal *term, enum action _action, uint8_t c)
case ACTION_CLEAR: case ACTION_CLEAR:
memset(&term->vt.params, 0, sizeof(term->vt.params)); memset(&term->vt.params, 0, sizeof(term->vt.params));
term->vt.intermediates.idx = 0; term->vt.private = 0;
term->vt.osc.idx = 0; term->vt.osc.idx = 0;
term->vt.utf8.idx = 0; term->vt.utf8.idx = 0;
break; break;
@ -853,11 +853,11 @@ action(struct terminal *term, enum action _action, uint8_t c)
case ACTION_COLLECT: case ACTION_COLLECT:
LOG_DBG("collect"); LOG_DBG("collect");
term->vt.intermediates.data[term->vt.intermediates.idx++] = c; if (term->vt.private != 0) {
break; LOG_ERR("only one private/intermediate characters supported");
abort();
LOG_ERR("unimplemented: action ESC dispatch"); }
abort(); term->vt.private = c;
break; break;
case ACTION_ESC_DISPATCH: case ACTION_ESC_DISPATCH: