diff options
author | nicm <nicm> | 2020-05-25 09:32:10 +0000 |
---|---|---|
committer | nicm <nicm> | 2020-05-25 09:32:10 +0000 |
commit | 3a5219c6d0c1a85ac3cf7a6b938f724650001a4d (patch) | |
tree | 87ac834df4315372c6e569fd0fbd95e8d23d9d68 /tmux.h | |
parent | 14a9fd58d56211f9ee1ee9347d135fc00e03d4bd (diff) | |
download | rtmux-3a5219c6d0c1a85ac3cf7a6b938f724650001a4d.tar.gz rtmux-3a5219c6d0c1a85ac3cf7a6b938f724650001a4d.tar.bz2 rtmux-3a5219c6d0c1a85ac3cf7a6b938f724650001a4d.zip |
Instead of storing all UTF-8 characters in the extended cell which means
that 14 bytes are wasted for each character in the BMP, only store
characters of three bytes or less in the cell itself and store others
(outside the BMP or with combining characters) in a separate global
tree. Can reduce grid memory use for heavy Unicode users by around 30%.
Diffstat (limited to 'tmux.h')
-rw-r--r-- | tmux.h | 31 |
1 files changed, 23 insertions, 8 deletions
@@ -597,11 +597,11 @@ struct msg_write_close { #define MOTION_MOUSE_MODES (MODE_MOUSE_BUTTON|MODE_MOUSE_ALL) /* - * A single UTF-8 character. UTF8_SIZE must be big enough to hold - * combining characters as well, currently at most five (of three - * bytes) are supported. -*/ -#define UTF8_SIZE 18 + * A single UTF-8 character. UTF8_SIZE must be big enough to hold combining + * characters as well. It can't be more than 32 bytes without changes to how + * big characters are stored. + */ +#define UTF8_SIZE 21 struct utf8_data { u_char data[UTF8_SIZE]; @@ -609,7 +609,7 @@ struct utf8_data { u_char size; u_char width; /* 0xff if invalid */ -} __packed; +}; enum utf8_state { UTF8_MORE, UTF8_DONE, @@ -663,13 +663,25 @@ enum utf8_state { /* Grid cell data. */ struct grid_cell { - struct utf8_data data; /* 21 bytes */ + struct utf8_data data; + u_short attr; + u_char flags; + int fg; + int bg; + int us; +}; + +/* Grid extended cell entry. */ +struct grid_extd_entry { + uint32_t data; u_short attr; u_char flags; int fg; int bg; int us; } __packed; + +/* Grid cell entry. */ struct grid_cell_entry { u_char flags; union { @@ -690,7 +702,7 @@ struct grid_line { struct grid_cell_entry *celldata; u_int extdsize; - struct grid_cell *extddata; + struct grid_extd_entry *extddata; int flags; } __packed; @@ -2877,6 +2889,9 @@ u_int session_group_attached_count(struct session_group *); void session_renumber_windows(struct session *); /* utf8.c */ +uint32_t utf8_set_big(char, u_int); +uint32_t utf8_map_big(const struct utf8_data *); +void utf8_get_big(uint32_t, struct utf8_data *); void utf8_set(struct utf8_data *, u_char); void utf8_copy(struct utf8_data *, const struct utf8_data *); enum utf8_state utf8_open(struct utf8_data *, u_char); |