mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
fcft: adapt to API changes in fcft-3.x
Fcft no longer uses wchar_t, but plain uint32_t to represent codepoints. Since we do a fair amount of string operations in foot, it still makes sense to use something that actually _is_ a string (or character), rather than an array of uint32_t. For this reason, we switch out all wchar_t usage in foot to char32_t. We also verify, at compile-time, that char32_t used UTF-32 (which is what fcft expects). Unfortunately, there are no string functions for char32_t. To avoid having to re-implement all wcs*() functions, we add a small wrapper layer of c32*() functions. These wrapper functions take char32_t arguments, but then simply call the corresponding wcs*() function. For this to work, wcs*() must _also_ be UTF-32 compatible. We can check for the presence of the __STDC_ISO_10646__ macro. If set, wchar_t is at least 4 bytes and its internal representation is UTF-32. FreeBSD does *not* define this macro, because its internal wchar_t representation depends on the current locale. It _does_ use UTF-32 _if_ the current locale is UTF-8. Since foot enforces UTF-8, we simply need to check if __FreeBSD__ is defined. Other fcft API changes: * fcft_glyph_rasterize() -> fcft_codepoint_rasterize() * font.space_advance has been removed * ‘tags’ have been removed from fcft_grapheme_rasterize() * ‘fcft_log_init()’ removed * ‘fcft_init()’ and ‘fcft_fini()’ must be explicitly called
This commit is contained in:
parent
2be8c39044
commit
e0227266ca
32 changed files with 962 additions and 385 deletions
18
selection.c
18
selection.c
|
|
@ -5,7 +5,6 @@
|
|||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include <sys/epoll.h>
|
||||
#include <sys/timerfd.h>
|
||||
|
|
@ -15,6 +14,7 @@
|
|||
#include "log.h"
|
||||
|
||||
#include "async.h"
|
||||
#include "char32.h"
|
||||
#include "commands.h"
|
||||
#include "config.h"
|
||||
#include "extract.h"
|
||||
|
|
@ -235,7 +235,7 @@ selection_find_word_boundary_left(struct terminal *term, struct coord *pos,
|
|||
bool spaces_only)
|
||||
{
|
||||
const struct row *r = grid_row_in_view(term->grid, pos->row);
|
||||
wchar_t c = r->cells[pos->col].wc;
|
||||
char32_t c = r->cells[pos->col].wc;
|
||||
|
||||
while (c >= CELL_SPACER) {
|
||||
xassert(pos->col > 0);
|
||||
|
|
@ -248,7 +248,7 @@ selection_find_word_boundary_left(struct terminal *term, struct coord *pos,
|
|||
if (c >= CELL_COMB_CHARS_LO && c <= CELL_COMB_CHARS_HI)
|
||||
c = composed_lookup(term->composed, c - CELL_COMB_CHARS_LO)->chars[0];
|
||||
|
||||
bool initial_is_space = c == 0 || iswspace(c);
|
||||
bool initial_is_space = c == 0 || isc32space(c);
|
||||
bool initial_is_delim =
|
||||
!initial_is_space && !isword(c, spaces_only, term->conf->word_delimiters);
|
||||
bool initial_is_word =
|
||||
|
|
@ -285,7 +285,7 @@ selection_find_word_boundary_left(struct terminal *term, struct coord *pos,
|
|||
if (c >= CELL_COMB_CHARS_LO && c <= CELL_COMB_CHARS_HI)
|
||||
c = composed_lookup(term->composed, c - CELL_COMB_CHARS_LO)->chars[0];
|
||||
|
||||
bool is_space = c == 0 || iswspace(c);
|
||||
bool is_space = c == 0 || isc32space(c);
|
||||
bool is_delim =
|
||||
!is_space && !isword(c, spaces_only, term->conf->word_delimiters);
|
||||
bool is_word =
|
||||
|
|
@ -308,7 +308,7 @@ selection_find_word_boundary_right(struct terminal *term, struct coord *pos,
|
|||
bool spaces_only)
|
||||
{
|
||||
const struct row *r = grid_row_in_view(term->grid, pos->row);
|
||||
wchar_t c = r->cells[pos->col].wc;
|
||||
char32_t c = r->cells[pos->col].wc;
|
||||
|
||||
while (c >= CELL_SPACER) {
|
||||
xassert(pos->col > 0);
|
||||
|
|
@ -321,7 +321,7 @@ selection_find_word_boundary_right(struct terminal *term, struct coord *pos,
|
|||
if (c >= CELL_COMB_CHARS_LO && c <= CELL_COMB_CHARS_HI)
|
||||
c = composed_lookup(term->composed, c - CELL_COMB_CHARS_LO)->chars[0];
|
||||
|
||||
bool initial_is_space = c == 0 || iswspace(c);
|
||||
bool initial_is_space = c == 0 || isc32space(c);
|
||||
bool initial_is_delim =
|
||||
!initial_is_space && !isword(c, spaces_only, term->conf->word_delimiters);
|
||||
bool initial_is_word =
|
||||
|
|
@ -360,7 +360,7 @@ selection_find_word_boundary_right(struct terminal *term, struct coord *pos,
|
|||
if (c >= CELL_COMB_CHARS_LO && c <= CELL_COMB_CHARS_HI)
|
||||
c = composed_lookup(term->composed, c - CELL_COMB_CHARS_LO)->chars[0];
|
||||
|
||||
bool is_space = c == 0 || iswspace(c);
|
||||
bool is_space = c == 0 || isc32space(c);
|
||||
bool is_delim =
|
||||
!is_space && !isword(c, spaces_only, term->conf->word_delimiters);
|
||||
bool is_word =
|
||||
|
|
@ -668,7 +668,7 @@ set_pivot_point_for_block_and_char_wise(struct terminal *term,
|
|||
bool keep_going = true;
|
||||
while (keep_going) {
|
||||
const struct row *row = term->grid->rows[pivot_end->row & (term->grid->num_rows - 1)];
|
||||
const wchar_t wc = row->cells[pivot_end->col].wc;
|
||||
const char32_t wc = row->cells[pivot_end->col].wc;
|
||||
|
||||
keep_going = wc >= CELL_SPACER;
|
||||
|
||||
|
|
@ -684,7 +684,7 @@ set_pivot_point_for_block_and_char_wise(struct terminal *term,
|
|||
bool keep_going = true;
|
||||
while (keep_going) {
|
||||
const struct row *row = term->grid->rows[pivot_start->row & (term->grid->num_rows - 1)];
|
||||
const wchar_t wc = pivot_start->col < term->cols - 1
|
||||
const char32_t wc = pivot_start->col < term->cols - 1
|
||||
? row->cells[pivot_start->col + 1].wc : 0;
|
||||
|
||||
keep_going = wc >= CELL_SPACER;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue