config: add tweak.grapheme-width-method=max

‘max’ is a new value for ‘tweak.grapheme-width-method’. When enabled,
the width of a grapheme cluster is that of the cluster’s widest
codepoint.
This commit is contained in:
Daniel Eklöf 2021-11-22 23:02:25 +01:00
parent caec64cbda
commit c1c0f11821
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 18 additions and 3 deletions

View file

@ -35,7 +35,12 @@
## Unreleased
### Added
* New value, `max`, for `[tweak].grapheme-width-method`.
### Changed
### Deprecated
### Removed

View file

@ -2248,7 +2248,7 @@ parse_section_tweak(struct context *ctx)
return value_to_enum(
ctx,
(const char *[]){"wcswidth", "double-width", NULL},
(const char *[]){"wcswidth", "double-width", "max", NULL},
(int *)&conf->tweak.grapheme_width_method);
}

View file

@ -256,7 +256,11 @@ struct config {
enum fcft_scaling_filter fcft_filter;
bool overflowing_glyphs;
bool grapheme_shaping;
enum {GRAPHEME_WIDTH_WCSWIDTH, GRAPHEME_WIDTH_DOUBLE} grapheme_width_method;
enum {
GRAPHEME_WIDTH_WCSWIDTH,
GRAPHEME_WIDTH_DOUBLE,
GRAPHEME_WIDTH_MAX,
} grapheme_width_method;
bool render_timer_osd;
bool render_timer_log;
bool damage_whole_window;

View file

@ -1093,7 +1093,7 @@ any of these options.
*grapheme-width-method*
Selects which method to use when calculating the width
(i.e. number of columns) of a grapheme cluster. One of
*double-width* and *wcswidth*.
*wcswidth*, *double-width* and *max*.
*wcswidth* simply adds together the individual width of all
codepoints making up the cluster.
@ -1104,6 +1104,8 @@ any of these options.
internally to calculate the width. This results in cursor
de-synchronization issues.
*max* uses the width of the largest codepoint in the cluster.
Default: _wcswidth_
*font-monospace-warn*

4
vt.c
View file

@ -792,6 +792,10 @@ action_utf8_print(struct terminal *term, wchar_t wc)
composed != NULL ? composed->width : base_width;
switch (term->conf->tweak.grapheme_width_method) {
case GRAPHEME_WIDTH_MAX:
new_cc->width = max(grapheme_width, width);
break;
case GRAPHEME_WIDTH_DOUBLE:
if (unlikely(wc == 0xfe0f))
width = 2;