mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
csi: implement DECSET/DECRST/DECRQM 2027 - grapheme cluster processing
This implements private mode 2027 - grapheme cluster processing, as
defined in the "Terminal Unicode Core"[1] specification.
Internally, we just flip the already existing option "grapheme
shaping". Since it's now runtime changeable, we need a copy of it in
the terminal struct, rather than referencing the conf object.
[1]: 13fc5a8993/spec/terminal-unicode-core.tex (L50-L53)
This commit is contained in:
parent
8a5f2915e9
commit
4eef001d58
7 changed files with 21 additions and 1 deletions
|
|
@ -58,6 +58,8 @@
|
|||
* New key binding: `select-quote`. This key binding selects text
|
||||
between quote characters, and falls back to selecting the entire
|
||||
row ([#1364][1364]).
|
||||
* Support for DECSET/DECRST/DECRQM 2027 (_Grapheme cluster
|
||||
processing_).
|
||||
|
||||
[1077]: https://codeberg.org/dnkl/foot/issues/1077
|
||||
[1364]: https://codeberg.org/dnkl/foot/issues/1364
|
||||
|
|
|
|||
7
csi.c
7
csi.c
|
|
@ -491,6 +491,10 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
|
|||
term_disable_app_sync_updates(term);
|
||||
break;
|
||||
|
||||
case 2027:
|
||||
term->grapheme_shaping = enable;
|
||||
break;
|
||||
|
||||
case 8452:
|
||||
term->sixel.cursor_right_of_graphics = enable;
|
||||
break;
|
||||
|
|
@ -572,6 +576,7 @@ decrqm(const struct terminal *term, unsigned param)
|
|||
case 1070: return decrpm(term->sixel.use_private_palette);
|
||||
case 2004: return decrpm(term->bracketed_paste);
|
||||
case 2026: return decrpm(term->render.app_sync_updates.enabled);
|
||||
case 2027: return decrpm(term->grapheme_shaping);
|
||||
case 8452: return decrpm(term->sixel.cursor_right_of_graphics);
|
||||
case 737769: return decrpm(term_ime_is_enabled(term));
|
||||
}
|
||||
|
|
@ -614,6 +619,7 @@ xtsave(struct terminal *term, unsigned param)
|
|||
case 1070: term->xtsave.sixel_private_palette = term->sixel.use_private_palette; break;
|
||||
case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break;
|
||||
case 2026: term->xtsave.app_sync_updates = term->render.app_sync_updates.enabled; break;
|
||||
case 2027: term->xtsave.grapheme_shaping = term->grapheme_shaping; break;
|
||||
case 8452: term->xtsave.sixel_cursor_right_of_graphics = term->sixel.cursor_right_of_graphics; break;
|
||||
case 737769: term->xtsave.ime = term_ime_is_enabled(term); break;
|
||||
}
|
||||
|
|
@ -655,6 +661,7 @@ xtrestore(struct terminal *term, unsigned param)
|
|||
case 1070: enable = term->xtsave.sixel_private_palette; break;
|
||||
case 2004: enable = term->xtsave.bracketed_paste; break;
|
||||
case 2026: enable = term->xtsave.app_sync_updates; break;
|
||||
case 2027: enable = term->xtsave.grapheme_shaping; break;
|
||||
case 8452: enable = term->xtsave.sixel_cursor_right_of_graphics; break;
|
||||
case 737769: enable = term->xtsave.ime; break;
|
||||
|
||||
|
|
|
|||
|
|
@ -328,6 +328,9 @@ that corresponds to one of the following modes:
|
|||
| 2026
|
||||
: terminal-wg
|
||||
: Application synchronized updates mode
|
||||
| 2027
|
||||
: contour
|
||||
: Grapheme cluster processing
|
||||
| 8452
|
||||
: xterm
|
||||
: Position cursor to the right of sixels, instead of on the next line
|
||||
|
|
|
|||
|
|
@ -1307,6 +1307,8 @@ any of these options.
|
|||
- foot must have been compiled with utf8proc support
|
||||
- fcft must have been compiled with HarfBuzz support
|
||||
|
||||
This option can also be set runtime with DECSET/DECRST 2027.
|
||||
|
||||
See also: *grapheme-width-method*.
|
||||
|
||||
Default: _yes_
|
||||
|
|
|
|||
|
|
@ -1253,6 +1253,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
|
|||
},
|
||||
.foot_exe = xstrdup(foot_exe),
|
||||
.cwd = xstrdup(cwd),
|
||||
.grapheme_shaping = conf->tweak.grapheme_shaping,
|
||||
#if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED
|
||||
.ime_enabled = true,
|
||||
#endif
|
||||
|
|
@ -1903,6 +1904,8 @@ term_reset(struct terminal *term, bool hard)
|
|||
tll_remove(term->alt.sixel_images, it);
|
||||
}
|
||||
|
||||
term->grapheme_shaping = term->conf->tweak.grapheme_shaping;
|
||||
|
||||
#if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED
|
||||
term_ime_enable(term);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -469,6 +469,7 @@ struct terminal {
|
|||
bool alt_screen:1;
|
||||
bool ime:1;
|
||||
bool app_sync_updates:1;
|
||||
bool grapheme_shaping:1;
|
||||
|
||||
bool sixel_display_mode:1;
|
||||
bool sixel_private_palette:1;
|
||||
|
|
@ -718,6 +719,8 @@ struct terminal {
|
|||
|
||||
char *foot_exe;
|
||||
char *cwd;
|
||||
|
||||
bool grapheme_shaping;
|
||||
};
|
||||
|
||||
struct config;
|
||||
|
|
|
|||
2
vt.c
2
vt.c
|
|
@ -657,7 +657,7 @@ static void
|
|||
action_utf8_print(struct terminal *term, char32_t wc)
|
||||
{
|
||||
int width = c32width(wc);
|
||||
const bool grapheme_clustering = term->conf->tweak.grapheme_shaping;
|
||||
const bool grapheme_clustering = term->grapheme_shaping;
|
||||
|
||||
#if !defined(FOOT_GRAPHEME_CLUSTERING)
|
||||
xassert(!grapheme_clustering);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue