mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:33:27 +00:00
Try to reduce the UTF-8 mess.
Get rid of passing around u_char[4]s and define a struct utf8_data which has character data, size (sequence length) and width. Move UTF-8 character collection into two functions utf8_open/utf8_append in utf8.c which fill in this struct and use these functions from input.c and the various functions in screen-write.c. Space for rather more data than is necessary for one UTF-8 sequence is in the utf8_data struct because screen_write_copy is still nasty and needs to reinject the character (after combining) into screen_write_cell.
This commit is contained in:
29
tmux.h
29
tmux.h
@ -477,6 +477,23 @@ struct mode_key_table {
|
||||
#define MODE_KKEYPAD 0x8
|
||||
#define MODE_MOUSE 0x10
|
||||
|
||||
/*
|
||||
* A single UTF-8 character.
|
||||
*
|
||||
* The data member in this must be UTF8_SIZE to allow screen_write_copy to
|
||||
* reinject stored UTF-8 data back into screen_write_cell after combining (ugh
|
||||
* XXX XXX).
|
||||
*/
|
||||
#define UTF8_SIZE 9
|
||||
struct utf8_data {
|
||||
u_char data[UTF8_SIZE];
|
||||
|
||||
size_t have;
|
||||
size_t size;
|
||||
|
||||
u_int width;
|
||||
};
|
||||
|
||||
/* Grid output. */
|
||||
#if defined(DEBUG) && \
|
||||
((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
||||
@ -516,7 +533,6 @@ struct grid_cell {
|
||||
} __packed;
|
||||
|
||||
/* Grid cell UTF-8 data. Used instead of data in grid_cell for UTF-8 cells. */
|
||||
#define UTF8_SIZE 9
|
||||
struct grid_utf8 {
|
||||
u_char width;
|
||||
u_char data[UTF8_SIZE];
|
||||
@ -672,9 +688,7 @@ struct input_ctx {
|
||||
#define STRING_APPLICATION 1
|
||||
#define STRING_NAME 2
|
||||
|
||||
u_char utf8_buf[4];
|
||||
u_int utf8_len;
|
||||
u_int utf8_off;
|
||||
struct utf8_data utf8data;
|
||||
|
||||
u_char intermediate;
|
||||
void *(*state)(u_char, struct input_ctx *);
|
||||
@ -1682,8 +1696,8 @@ void screen_write_kkeypadmode(struct screen_write_ctx *, int);
|
||||
void screen_write_clearendofscreen(struct screen_write_ctx *);
|
||||
void screen_write_clearstartofscreen(struct screen_write_ctx *);
|
||||
void screen_write_clearscreen(struct screen_write_ctx *);
|
||||
void screen_write_cell(
|
||||
struct screen_write_ctx *, const struct grid_cell *, u_char *);
|
||||
void screen_write_cell(struct screen_write_ctx *,
|
||||
const struct grid_cell *, const struct utf8_data *);
|
||||
|
||||
/* screen-redraw.c */
|
||||
void screen_redraw_screen(struct client *, int);
|
||||
@ -1838,7 +1852,8 @@ void session_group_synchronize1(struct session *, struct session *);
|
||||
|
||||
/* utf8.c */
|
||||
void utf8_build(void);
|
||||
int utf8_width(const u_char *);
|
||||
int utf8_open(struct utf8_data *, u_char);
|
||||
int utf8_append(struct utf8_data *, u_char);
|
||||
|
||||
/* procname.c */
|
||||
char *get_proc_name(int, char *);
|
||||
|
Reference in New Issue
Block a user