diff options
Diffstat (limited to 'src/escape.c')
| -rw-r--r-- | src/escape.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/src/escape.c b/src/escape.c index 7956017..da0449a 100644 --- a/src/escape.c +++ b/src/escape.c @@ -20,7 +20,8 @@ static int sgr_color_param(const struct term *t, char *buf, size_t sz, int base, return snprintf(buf, sz, ";%d", i < 8 ? base + i : base + 60 + i - 8); return snprintf(buf, sz, ";%d:5:%d", base + 8, i); } - c = palette_resolve(&t->palette, c); + if (term_color_is_slot(c)) + c = t->palette.colors[c & TERM_COLOR_SLOT_INDEX]; return snprintf(buf, sz, ";%d:2:%d:%d:%d", base + 8, (int)((c >> 16) & 0xff), (int)((c >> 8) & 0xff), (int)(c & 0xff)); } @@ -557,12 +558,6 @@ static int mode_get(const struct term *t, int mode, bool priv) return -1; } -static int mode_status(const struct term *t, int mode, bool priv) -{ - int set = mode_get(t, mode, priv); - return set < 0 ? 0 : set ? 1 : 2; -} - static int cursor_top(const struct term *t) { return t->origin_mode ? t->scroll_top : 0; } static int cursor_bottom(const struct term *t) { return t->origin_mode ? t->scroll_bottom : t->rows - 1; } static int cursor_left(const struct term *t) { return t->origin_mode && t->lr_margin_mode ? t->left_margin : 0; } @@ -585,12 +580,16 @@ static void mode_set(struct term *t, int mode, bool enabled, bool priv) default: break; } if (mode == 5) { - term_sc_set_reverse_video(t, enabled); + if (t->reverse_video != enabled) { + t->reverse_video = enabled; + t->full_gen++; + } } else if (mode == 6) { t->origin_mode = enabled; sc_move(t, 0, enabled ? t->scroll_top : 0); } else if (mode == 7) { - term_sc_set_autowrap(t, enabled); + t->autowrap = enabled; + t->pending_wrap = false; } else if (mode == 1048) { if (enabled) t->saved = term_cursor_save(t); else sc_restore_cursor(t, &t->saved); @@ -685,14 +684,16 @@ static inline TERM_ALWAYS_INLINE void dispatch_csi(struct term *t, const struct case 'L': case 'M': if (csi->prefix || t->cursor_y < t->scroll_top || t->cursor_y > t->scroll_bottom) break; - term_sc_scroll_region(t, t->cursor_y, t->scroll_bottom, csi_count(csi), csi->final == 'L'); + term_screen_scroll_region(t, t->cursor_y, t->scroll_bottom, + csi_count(csi), csi->final == 'L', false); /* IL and DL move the cursor to the left margin (xterm). */ sc_move(t, t->lr_margin_mode ? t->left_margin : 0, t->cursor_y); break; case 'S': case 'T': if (csi->prefix || csi->nparams > 1) break; - term_sc_scroll(t, csi_count(csi), csi->final == 'T'); + term_screen_scroll_region(t, t->scroll_top, t->scroll_bottom, + csi_count(csi), csi->final == 'T', true); break; case 'd': { int64_t r = (int64_t)csi_count(csi) - 1 + cursor_top(t); @@ -845,9 +846,10 @@ static inline TERM_ALWAYS_INLINE void dispatch_csi(struct term *t, const struct sc_move(t, 0, 0); } else if (csi->intermediate == '$' && csi->nparams >= 1) { char reply[32]; + int set = mode_get(t, csi->params[0], csi->prefix == '?'); snprintf(reply, sizeof(reply), "\033[%s%d;%d$y", csi->prefix == '?' ? "?" : "", csi->params[0], - mode_status(t, csi->params[0], csi->prefix == '?')); + set < 0 ? 0 : set ? 1 : 2); send_response(t, reply); } break; @@ -935,7 +937,7 @@ static void dispatch_esc(struct term *t, unsigned char ch) break; case 'M': if (t->cursor_y == t->scroll_top) - term_sc_scroll_region(t, t->scroll_top, t->scroll_bottom, 1, true); + term_screen_scroll_region(t, t->scroll_top, t->scroll_bottom, 1, true, false); else sc_move(t, t->cursor_x, t->cursor_y > 0 ? t->cursor_y - 1 : 0); break; @@ -1029,7 +1031,7 @@ void term_escape_byte(struct term *t, unsigned char ch) term_text_ground(t, ch); } else if (term_osc_room(t) || term_osc_grow(t)) { *term_osc_tail(t) = (char)ch; - term_osc_commit(t, 1); + t->osc_len++; } else { t->str_truncated = true; } @@ -1078,21 +1080,16 @@ void term_escape_byte(struct term *t, unsigned char ch) } } -static inline size_t str_appendable_span(const char *buf, size_t len) -{ - return scan_printable_span(buf, len, 0x80); -} - size_t term_escape_str(struct term *t, const char *buf, size_t len) { if (t->state == ST_IGNORE) { - size_t take = str_appendable_span(buf, len); + size_t take = scan_printable_span(buf, len, 0x80); if (take < len) term_escape_byte(t, (unsigned char)buf[take++]); return take; } int is_osc = t->state == ST_OSC; - size_t take = str_appendable_span(buf, len); + size_t take = scan_printable_span(buf, len, 0x80); if (is_osc) { size_t room = term_osc_room(t); if (take > room && term_osc_grow(t)) @@ -1101,7 +1098,7 @@ size_t term_escape_str(struct term *t, const char *buf, size_t len) if (take > room) take = room; memcpy(term_osc_tail(t), buf, take); - term_osc_commit(t, take); + t->osc_len += (int)take; } else { t->str_truncated = true; } |
