diff --git a/kitty/core_text.m b/kitty/core_text.m index f8dfe9696..7b374bd95 100644 --- a/kitty/core_text.m +++ b/kitty/core_text.m @@ -192,7 +192,7 @@ create_fallback_face(PyObject *base_face, CPUCell* cell, bool UNUSED bold, bool if (emoji_presentation) new_font = CTFontCreateWithName((CFStringRef)@"AppleColorEmoji", self->scaled_point_sz, NULL); else { char text[256] = {0}; - cell_as_utf8(cell, true, text, ' '); + cell_as_utf8_for_fallback(cell, text); CFStringRef str = CFStringCreateWithCString(NULL, text, kCFStringEncodingUTF8); if (str == NULL) return PyErr_NoMemory(); new_font = find_substitute_face(str, self->ct_font); diff --git a/kitty/fontconfig.c b/kitty/fontconfig.c index 711d40d29..42fc25dab 100644 --- a/kitty/fontconfig.c +++ b/kitty/fontconfig.c @@ -210,7 +210,7 @@ create_fallback_face(PyObject UNUSED *base_face, CPUCell* cell, bool bold, bool if (!emoji_presentation && bold) { AP(FcPatternAddInteger, FC_WEIGHT, FC_WEIGHT_BOLD, "weight"); } if (!emoji_presentation && italic) { AP(FcPatternAddInteger, FC_SLANT, FC_SLANT_ITALIC, "slant"); } if (emoji_presentation) { AP(FcPatternAddBool, FC_COLOR, true, "color"); } - size_t num = cell_as_unicode(cell, true, char_buf, ' '); + size_t num = cell_as_unicode_for_fallback(cell, char_buf); add_charset(pat, num); PyObject *d = _fc_match(pat); if (d) { ans = face_from_descriptor(d, fg); Py_CLEAR(d); } diff --git a/kitty/fonts.c b/kitty/fonts.c index 9cef1e509..97354503e 100644 --- a/kitty/fonts.c +++ b/kitty/fonts.c @@ -545,6 +545,7 @@ START_ALLOW_CASE_RANGE ans = fg->bi_font_idx; break; } if (ans < 0) ans = fg->medium_font_idx; + printf("has_emoji_presentation: %d has_cell_text: %d\n", has_emoji_presentation(cpu_cell, gpu_cell), has_cell_text(fg->fonts + ans, cpu_cell)); if (!has_emoji_presentation(cpu_cell, gpu_cell) && has_cell_text(fg->fonts + ans, cpu_cell)) return ans; return fallback_font(fg, cpu_cell, gpu_cell); } diff --git a/kitty/line.c b/kitty/line.c index 45446849a..eb59a8750 100644 --- a/kitty/line.c +++ b/kitty/line.c @@ -183,6 +183,16 @@ cell_as_unicode(CPUCell *cell, bool include_cc, Py_UCS4 *buf, char_type zero_cha return n; } +size_t +cell_as_unicode_for_fallback(CPUCell *cell, Py_UCS4 *buf) { + size_t n = 1; + buf[0] = cell->ch ? cell->ch : ' '; + for (unsigned i = 0; i < arraysz(cell->cc_idx) && cell->cc_idx[i]; i++) { + if (cell->cc_idx[i] != VS15 && cell->cc_idx[i] != VS16) buf[n++] = codepoint_for_mark(cell->cc_idx[i]); + } + return n; +} + size_t cell_as_utf8(CPUCell *cell, bool include_cc, char *buf, char_type zero_char) { size_t n = encode_utf8(cell->ch ? cell->ch : zero_char, buf); @@ -193,6 +203,19 @@ cell_as_utf8(CPUCell *cell, bool include_cc, char *buf, char_type zero_char) { return n; } +size_t +cell_as_utf8_for_fallback(CPUCell *cell, char *buf) { + size_t n = encode_utf8(cell->ch ? cell->ch : ' ', buf); + for (unsigned i = 0; i < arraysz(cell->cc_idx) && cell->cc_idx[i]; i++) { + if (cell->cc_idx[i] != VS15 && cell->cc_idx[i] != VS16) { + n += encode_utf8(codepoint_for_mark(cell->cc_idx[i]), buf + n); + } + } + buf[n] = 0; + return n; +} + + PyObject* unicode_in_range(Line *self, index_type start, index_type limit, bool include_cc, char leading_char) { diff --git a/kitty/lineops.h b/kitty/lineops.h index dde210062..14f070506 100644 --- a/kitty/lineops.h +++ b/kitty/lineops.h @@ -64,7 +64,9 @@ index_type line_url_end_at(Line *self, index_type x, bool, char_type); index_type line_as_ansi(Line *self, Py_UCS4 *buf, index_type buflen, bool*); unsigned int line_length(Line *self); size_t cell_as_unicode(CPUCell *cell, bool include_cc, Py_UCS4 *buf, char_type); +size_t cell_as_unicode_for_fallback(CPUCell *cell, Py_UCS4 *buf); size_t cell_as_utf8(CPUCell *cell, bool include_cc, char *buf, char_type); +size_t cell_as_utf8_for_fallback(CPUCell *cell, char *buf); PyObject* unicode_in_range(Line *self, index_type start, index_type limit, bool include_cc, char leading_char); PyObject* line_as_unicode(Line *);