mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-06 01:40:22 -05:00
Merge branch 'decset-1047-and-1048'
This commit is contained in:
commit
bcf46d9eab
5 changed files with 52 additions and 18 deletions
|
|
@ -36,6 +36,7 @@
|
||||||
(https://codeberg.org/dnkl/foot/issues/244).
|
(https://codeberg.org/dnkl/foot/issues/244).
|
||||||
* Key/mouse binding `select-extend-character-wise`, which forces the
|
* Key/mouse binding `select-extend-character-wise`, which forces the
|
||||||
selection mode to 'character-wise' when extending a selection.
|
selection mode to 'character-wise' when extending a selection.
|
||||||
|
* `DECSET` `47`, `1047` and `1048`.
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
||||||
42
csi.c
42
csi.c
|
|
@ -489,19 +489,31 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case 1048:
|
||||||
|
if (enable)
|
||||||
|
term_save_cursor(term);
|
||||||
|
else
|
||||||
|
term_restore_cursor(term, &term->grid->saved_cursor);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 47:
|
||||||
|
case 1047:
|
||||||
case 1049:
|
case 1049:
|
||||||
if (enable && term->grid != &term->alt) {
|
if (enable && term->grid != &term->alt) {
|
||||||
selection_cancel(term);
|
selection_cancel(term);
|
||||||
|
|
||||||
|
if (param == 1049)
|
||||||
|
term_save_cursor(term);
|
||||||
|
|
||||||
term->grid = &term->alt;
|
term->grid = &term->alt;
|
||||||
|
|
||||||
|
/* Cursor retains its position from the normal grid */
|
||||||
term_cursor_to(
|
term_cursor_to(
|
||||||
term,
|
term,
|
||||||
min(term->grid->cursor.point.row, term->rows - 1),
|
min(term->normal.cursor.point.row, term->rows - 1),
|
||||||
min(term->grid->cursor.point.col, term->cols - 1));
|
min(term->normal.cursor.point.col, term->cols - 1));
|
||||||
|
|
||||||
tll_free(term->alt.scroll_damage);
|
|
||||||
|
|
||||||
|
tll_free(term->normal.scroll_damage);
|
||||||
term_erase(
|
term_erase(
|
||||||
term,
|
term,
|
||||||
&(struct coord){0, 0},
|
&(struct coord){0, 0},
|
||||||
|
|
@ -513,12 +525,13 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
|
||||||
|
|
||||||
term->grid = &term->normal;
|
term->grid = &term->normal;
|
||||||
|
|
||||||
|
/* Cursor retains its position from the alt grid */
|
||||||
term_cursor_to(
|
term_cursor_to(
|
||||||
term,
|
term, min(term->alt.cursor.point.row, term->rows - 1),
|
||||||
min(term->grid->cursor.point.row, term->rows - 1),
|
min(term->alt.cursor.point.col, term->cols - 1));
|
||||||
min(term->grid->cursor.point.col, term->cols - 1));
|
|
||||||
|
|
||||||
tll_free(term->alt.scroll_damage);
|
if (param == 1049)
|
||||||
|
term_restore_cursor(term, &term->grid->saved_cursor);
|
||||||
|
|
||||||
/* Delete all sixel images on the alt screen */
|
/* Delete all sixel images on the alt screen */
|
||||||
tll_foreach(term->alt.sixel_images, it) {
|
tll_foreach(term->alt.sixel_images, it) {
|
||||||
|
|
@ -526,6 +539,7 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
|
||||||
tll_remove(term->alt.sixel_images, it);
|
tll_remove(term->alt.sixel_images, it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tll_free(term->alt.scroll_damage);
|
||||||
term_damage_all(term);
|
term_damage_all(term);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -613,6 +627,7 @@ xtsave(struct terminal *term, unsigned param)
|
||||||
case 12: term->xtsave.cursor_blink = term->cursor_blink.decset; break;
|
case 12: term->xtsave.cursor_blink = term->cursor_blink.decset; break;
|
||||||
case 25: term->xtsave.show_cursor = !term->hide_cursor; break;
|
case 25: term->xtsave.show_cursor = !term->hide_cursor; break;
|
||||||
case 45: term->xtsave.reverse_wrap = term->reverse_wrap; break;
|
case 45: term->xtsave.reverse_wrap = term->reverse_wrap; break;
|
||||||
|
case 47: term->xtsave.alt_screen = term->grid == &term->alt; break;
|
||||||
case 1000: term->xtsave.mouse_click = term->mouse_tracking == MOUSE_CLICK; break;
|
case 1000: term->xtsave.mouse_click = term->mouse_tracking == MOUSE_CLICK; break;
|
||||||
case 1001: break;
|
case 1001: break;
|
||||||
case 1002: term->xtsave.mouse_drag = term->mouse_tracking == MOUSE_DRAG; break;
|
case 1002: term->xtsave.mouse_drag = term->mouse_tracking == MOUSE_DRAG; break;
|
||||||
|
|
@ -626,6 +641,8 @@ xtsave(struct terminal *term, unsigned param)
|
||||||
case 1035: term->xtsave.num_lock_modifier = term->num_lock_modifier; break;
|
case 1035: term->xtsave.num_lock_modifier = term->num_lock_modifier; break;
|
||||||
case 1036: term->xtsave.meta_esc_prefix = term->meta.esc_prefix; break;
|
case 1036: term->xtsave.meta_esc_prefix = term->meta.esc_prefix; break;
|
||||||
case 1042: term->xtsave.bell_action_enabled = term->bell_action_enabled; break;
|
case 1042: term->xtsave.bell_action_enabled = term->bell_action_enabled; break;
|
||||||
|
case 1047: term->xtsave.alt_screen = term->grid == &term->alt; break;
|
||||||
|
case 1048: term_save_cursor(term); break;
|
||||||
case 1049: term->xtsave.alt_screen = term->grid == &term->alt; break;
|
case 1049: term->xtsave.alt_screen = term->grid == &term->alt; break;
|
||||||
case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break;
|
case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break;
|
||||||
case 27127: term->xtsave.modify_escape_key = term->modify_escape_key; break;
|
case 27127: term->xtsave.modify_escape_key = term->modify_escape_key; break;
|
||||||
|
|
@ -648,6 +665,7 @@ xtrestore(struct terminal *term, unsigned param)
|
||||||
case 12: enable = term->xtsave.cursor_blink; break;
|
case 12: enable = term->xtsave.cursor_blink; break;
|
||||||
case 25: enable = term->xtsave.show_cursor; break;
|
case 25: enable = term->xtsave.show_cursor; break;
|
||||||
case 45: enable = term->xtsave.reverse_wrap; break;
|
case 45: enable = term->xtsave.reverse_wrap; break;
|
||||||
|
case 47: enable = term->xtsave.alt_screen; break;
|
||||||
case 1000: enable = term->xtsave.mouse_click; break;
|
case 1000: enable = term->xtsave.mouse_click; break;
|
||||||
case 1001: return;
|
case 1001: return;
|
||||||
case 1002: enable = term->xtsave.mouse_drag; break;
|
case 1002: enable = term->xtsave.mouse_drag; break;
|
||||||
|
|
@ -661,6 +679,8 @@ xtrestore(struct terminal *term, unsigned param)
|
||||||
case 1035: enable = term->xtsave.num_lock_modifier; break;
|
case 1035: enable = term->xtsave.num_lock_modifier; break;
|
||||||
case 1036: enable = term->xtsave.meta_esc_prefix; break;
|
case 1036: enable = term->xtsave.meta_esc_prefix; break;
|
||||||
case 1042: enable = term->xtsave.bell_action_enabled; break;
|
case 1042: enable = term->xtsave.bell_action_enabled; break;
|
||||||
|
case 1047: enable = term->xtsave.alt_screen; break;
|
||||||
|
case 1048: enable = true; break;
|
||||||
case 1049: enable = term->xtsave.alt_screen; break;
|
case 1049: enable = term->xtsave.alt_screen; break;
|
||||||
case 2004: enable = term->xtsave.bracketed_paste; break;
|
case 2004: enable = term->xtsave.bracketed_paste; break;
|
||||||
case 27127: enable = term->xtsave.modify_escape_key; break;
|
case 27127: enable = term->xtsave.modify_escape_key; break;
|
||||||
|
|
@ -1141,15 +1161,11 @@ csi_dispatch(struct terminal *term, uint8_t final)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
term->grid->saved_cursor = term->grid->cursor;
|
term_save_cursor(term);
|
||||||
term->vt.saved_attrs = term->vt.attrs;
|
|
||||||
term->saved_charsets = term->charsets;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'u':
|
case 'u':
|
||||||
term_restore_cursor(term, &term->grid->saved_cursor);
|
term_restore_cursor(term, &term->grid->saved_cursor);
|
||||||
term->vt.attrs = term->vt.saved_attrs;
|
|
||||||
term->charsets = term->saved_charsets;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't': {
|
case 't': {
|
||||||
|
|
|
||||||
12
terminal.c
12
terminal.c
|
|
@ -2254,13 +2254,25 @@ term_reset_view(struct terminal *term)
|
||||||
term_damage_view(term);
|
term_damage_view(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
term_save_cursor(struct terminal *term)
|
||||||
|
{
|
||||||
|
term->grid->saved_cursor = term->grid->cursor;
|
||||||
|
term->vt.saved_attrs = term->vt.attrs;
|
||||||
|
term->saved_charsets = term->charsets;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
term_restore_cursor(struct terminal *term, const struct cursor *cursor)
|
term_restore_cursor(struct terminal *term, const struct cursor *cursor)
|
||||||
{
|
{
|
||||||
int row = min(cursor->point.row, term->rows - 1);
|
int row = min(cursor->point.row, term->rows - 1);
|
||||||
int col = min(cursor->point.col, term->cols - 1);
|
int col = min(cursor->point.col, term->cols - 1);
|
||||||
|
|
||||||
term_cursor_to(term, row, col);
|
term_cursor_to(term, row, col);
|
||||||
term->grid->cursor.lcf = cursor->lcf;
|
term->grid->cursor.lcf = cursor->lcf;
|
||||||
|
|
||||||
|
term->vt.attrs = term->vt.saved_attrs;
|
||||||
|
term->charsets = term->saved_charsets;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,14 @@ struct grid {
|
||||||
int offset;
|
int offset;
|
||||||
int view;
|
int view;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: the cursor (not the *saved* cursor) could most likely be
|
||||||
|
* global state in the term struct.
|
||||||
|
*
|
||||||
|
* However, we have grid specific functions that does not have
|
||||||
|
* access to the owning term struct, but does need access to the
|
||||||
|
* cursor.
|
||||||
|
*/
|
||||||
struct cursor cursor;
|
struct cursor cursor;
|
||||||
struct cursor saved_cursor;
|
struct cursor saved_cursor;
|
||||||
|
|
||||||
|
|
@ -595,6 +603,7 @@ void term_reverse_index(struct terminal *term);
|
||||||
|
|
||||||
void term_arm_blink_timer(struct terminal *term);
|
void term_arm_blink_timer(struct terminal *term);
|
||||||
|
|
||||||
|
void term_save_cursor(struct terminal *term);
|
||||||
void term_restore_cursor(struct terminal *term, const struct cursor *cursor);
|
void term_restore_cursor(struct terminal *term, const struct cursor *cursor);
|
||||||
|
|
||||||
void term_visual_focus_in(struct terminal *term);
|
void term_visual_focus_in(struct terminal *term);
|
||||||
|
|
|
||||||
6
vt.c
6
vt.c
|
|
@ -378,15 +378,11 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
|
||||||
case 0:
|
case 0:
|
||||||
switch (final) {
|
switch (final) {
|
||||||
case '7':
|
case '7':
|
||||||
term->grid->saved_cursor = term->grid->cursor;
|
term_save_cursor(term);
|
||||||
term->vt.saved_attrs = term->vt.attrs;
|
|
||||||
term->saved_charsets = term->charsets;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '8':
|
case '8':
|
||||||
term_restore_cursor(term, &term->grid->saved_cursor);
|
term_restore_cursor(term, &term->grid->saved_cursor);
|
||||||
term->vt.attrs = term->vt.saved_attrs;
|
|
||||||
term->charsets = term->saved_charsets;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue